Carousel
A composable card carousel with horizontal scroll, keyboard and button navigation.
Item 1 of 4
"use client";
import { Palette, Plus, Shield, Users, Zap } from "lucide-react";
import { Button } from "@/components/ui/button/button";
import { Card, CardDescription, CardIcon, CardTitle } from "@/components/ui/card/card";
import { Carousel } from "@/components/ui/carousel/carousel";
import styles from "./carousel-demo.module.css";
export default function CarouselDemo() {
const features = [
{
id: "performance",
icon: <Zap className={styles.icon} strokeWidth={1.5} />,
title: "Performance",
description: "Instant loading and millisecond response times for optimal user experience.",
},
{
id: "security",
icon: <Shield className={styles.icon} strokeWidth={1.5} />,
title: "Security",
description: "Bank-level encryption keeps your data protected and compliant.",
},
{
id: "customization",
icon: <Palette className={styles.icon} strokeWidth={1.5} />,
title: "Customize",
description: "Tailor every aspect to match your brand with flexible theming and configuration options.",
},
{
id: "collaboration",
icon: <Users className={styles.icon} strokeWidth={1.5} />,
title: "Collaboration",
description: "Work together seamlessly with real-time collaboration tools.",
},
];
return (
<Carousel.Root align="start" className={styles.carouselRoot} gap={8} totalItems={features.length} variant="inset">
<Carousel.Viewport>
<Carousel.Content>
{features.map((feature, index) => (
<Carousel.Item index={index} key={feature.id}>
<Card className={styles.card}>
<div className={styles.iconSection}>
<CardIcon className={styles.icon}>{feature.icon}</CardIcon>
</div>
<div className={styles.cardContent}>
<div className={styles.contentText}>
<CardTitle className={styles.cardTitle}>{feature.title}</CardTitle>
<CardDescription>{feature.description}</CardDescription>
</div>
<Button className={`${styles.button} hit-area-extend`} size="icon" variant="outline">
<Plus strokeWidth={1.5} />
</Button>
</div>
</Card>
</Carousel.Item>
))}
</Carousel.Content>
</Carousel.Viewport>
<Carousel.Navigation>
<Carousel.Previous />
<Carousel.Next />
</Carousel.Navigation>
</Carousel.Root>
);
}
npx shadcn@latest add @roiui/carouselnpx shadcn@latest add @roiui/carousel-tailwindanatomy
import { Carousel } from "@/components/ui/carousel";
<Carousel.Bleed>
<Carousel.Root totalItems={3} gap={16} variant="inset" align="center">
<Carousel.Viewport>
<Carousel.Content>
<Carousel.Item index={0}>
<div>Item 1</div>
</Carousel.Item>
<Carousel.Item index={1}>
<div>Item 2</div>
</Carousel.Item>
<Carousel.Item index={2}>
<div>Item 3</div>
</Carousel.Item>
</Carousel.Content>
</Carousel.Viewport>
<Carousel.Navigation />
</Carousel.Root>
</Carousel.Bleed>
The main carousel component that manages state and provides context.
Component props
Prop
Type
Default
Name
totalItemsDescription
Total number of items in the carousel
Type
numberDefault
-
Name
gapDescription
Gap between carousel items in pixels
Type
numberDefault
16Name
variantDescription
Carousel variant. Use 'inset' to align with parent container bounds
Type
"default" | "inset"Default
"default"Name
alignDescription
Alignment of carousel content
Type
"start" | "center"Default
"start"Name
indexDescription
Controlled index value
Type
numberDefault
-
Name
defaultIndexDescription
Default index for uncontrolled mode
Type
numberDefault
0Name
onIndexChangeDescription
Callback when index changes
Type
functionDefault
-
Name
classNameDescription
Additional CSS classes to apply to the carousel container
Type
stringDefault
-
Wrapper that extends carousel to full viewport width.
Component props
Prop
Type
Default
Name
classNameDescription
Additional CSS classes to apply to the bleed container
Type
stringDefault
-
Scrollable viewport container with hidden scrollbars.
Component props
Prop
Type
Default
Name
classNameDescription
Additional CSS classes to apply to the viewport
Type
stringDefault
-
Flex container for horizontal layout with pseudo elements for spacing.
Component props
Prop
Type
Default
Name
classNameDescription
Additional CSS classes to apply to the content container
Type
stringDefault
-
Component props
Prop
Type
Default
Name
indexDescription
The index of the item in the carousel
Type
numberDefault
-
Name
classNameDescription
Additional CSS classes to apply to the item
Type
stringDefault
-
Container for navigation buttons with default Previous/Next rendering.
Component props
Prop
Type
Default
Name
classNameDescription
Additional CSS classes to apply to the navigation container
Type
stringDefault
-
Name
childrenDescription
Custom navigation buttons (defaults to Previous and Next)
Type
ReactNodeDefault
-
Previous button that auto-disables at start.
Component props
Prop
Type
Default
Name
classNameDescription
Additional CSS classes to apply to the previous button
Type
stringDefault
-
Name
childrenDescription
Custom content for the previous button (defaults to left arrow icon)
Type
ReactNodeDefault
-
Next button that auto-disables at end.
Component props
Prop
Type
Default
Name
classNameDescription
Additional CSS classes to apply to the next button
Type
stringDefault
-
Name
childrenDescription
Custom content for the next button (defaults to right arrow icon)
Type
ReactNodeDefault
-
Dot indicators for each item (hidden when only one item).
Component props
Prop
Type
Default
Name
classNameDescription
Additional CSS classes to apply to the indicators container
Type
stringDefault
-