Desktop optimized

Please maximize your browser window or use a larger screen to explore the component library.

Go to home

Concave Carousel

A high-performance, physics-based infinite carousel. Items mathematically scale down as they reach the edges, creating a 3D "concave" curved visual effect using strictly 2D DOM manipulation for maximum FPS.

Last Modified:Aug 17, 2026

Install

CLI

concave-carousel
$pnpm dlx shadcn@latest add https://ui.satisium.com/r/concave-carousel.json

Or install a specific demo variant:

concave-carousel-demo
$pnpm dlx shadcn@latest add https://ui.satisium.com/r/concave-carousel-demo.json

Manual

1. Install Dependencies

Dependencies
$pnpm add gsap @gsap/react clsx tailwind-merge

2. Add Source Code

Props

PropTypeDefaultDescription
itemsConcaveCarouselItem[]RequiredArray of image objects to display. Automatically duplicated to ensure an infinite loop.
visibleItemsnumber3Mobile-first default for visible items.
maxHeightnumber250Mobile-first default for the center item's max height in pixels.
minHeightnumber100Mobile-first default for the outer items' min height in pixels.
breakpointsRecord<number, CarouselBreakpoint>undefinedTailwind-style min-width breakpoints for responsive sizing. e.g., { 640: { visibleItems: 5 } }
autoMovebooleanfalseWhether the carousel should move automatically.
autoMoveType"continuous" | "step""continuous"The type of auto-movement.
autoMoveSpeednumber0.01The velocity of the continuous auto-scroll.
stepIntervalnumber3000The delay (in ms) between steps if autoMoveType is "step".
stepDurationnumber1The duration (in seconds) of the snapping animation.
scrollMultipliernumber0.003How aggressively the carousel responds to drag velocity.
frictionnumber0.95The physics friction applied to drag momentum.