Curved Frame CarouselA fixed frame masks a drifting photo deck.

PremiumBlocksStudio homepageAgency landing pagePhoto showcase

Add to your projectPremium block

One command adds this component to your project.

1

Run the following command. New project? Run npx shadcn@latest init first to set up Tailwind and path aliases.

npx shadcn@latest add @aicanvas/••••••••••••
2

For dark mode, add the dark class to your <html> element:

Optional
<html class="dark">

Install with AI Canvas MCP

With AI Canvas MCP, your AI knows every component we ship. Ask for one inside Claude Code, Codex, or Cursor and it installs the component you pick. Works with any AI Canvas account, free or premium.

Props

Every prop this component accepts. Any other prop is forwarded to the underlying element.

PropTypeDefaultDescription
items{src: string, alt: string, caption: string, focus?: number}[]DEFAULT_ITEMSPanels on the endless track, in order; each needs an image URL, alt text and a caption, plus an optional focus from 0 to 1 marking where in the image the subject sits vertically.
eyebrowstring'Portfolio'Small uppercase kicker above the title, also used as the carousel label for screen readers.
titlestring'Things we made on purpose'Heading shown inside the frame's top band.
subtitlestring'Made with intent and a stubborn sense of proportion. Classical bones, modern finish, nothing decorative.'Supporting line under the title, hidden on stages narrower than 480px.
hintstring''Optional input hint under the readout row; empty by default, and hidden on stages narrower than 480px when set.
ctaPrimary{label: string, href?: string, onClick?: () => void}nullOptional filled call to action under the subtitle; renders a link when href is given and a button otherwise. Off by default.
ctaSecondary{label: string, href?: string, onClick?: () => void}{label: 'Start a project'}Outlined call to action. Sits beside ctaPrimary when both are set and is dropped on stages under 400px in that case; when it is the only action it always renders. Pass null for none.
autoDriftbooleantrueWhether the track drifts on its own while idle.
driftSpeednumber26Idle drift speed in pixels per second.
panelAspectnumber2Width divided by height of the panel crop visible in the middle of the frame; raise it for a wider, shorter centre band.
edgeSlotRationumber0.78Visible slot height at each stage edge, as a fraction of stage height. Lower it for a shallower curve, raise it toward 1 for a deeper one.
flareRationumber0.28Horizontal run of the flare per side, as a fraction of stage width. This is the strongest lever on the frame's character: low leaves a straight band with rounded corners, high turns the whole frame into one continuous sweep.
flareTensionnumber0.72Character of the flare, as the bezier handle length over the run. Low turns early and bluntly, high hugs the straight line and the edge and puts the turn in the middle. 0.35 blunt, 0.5523 exact quarter ellipse, 0.72 squircle, 0.85 very taut.
edgeRotationnumber24Maximum edge foreshortening in degrees; 18 is barely there, 32 is the ceiling before panels read as folded paper.
onIndexChange(index: number, item: object) => void-Called with the index and item whenever a new panel becomes the one nearest the slot centre.
classNamestring-Extra classes merged onto the outermost root element.

About Curved Frame Carousel

Curved Frame Carousel is a full-bleed hero band where a fixed frame with flared, curving edges masks an endless track of photos drifting quietly behind it. Flick it, throw it with a drag, nudge it with a sideways scroll, or step through with the arrow keys, and the deck carries on with momentum while every panel that reaches the flare hinges away in perspective as though the wall itself were bending. A caption and an index counter sit beneath the frame and update as each photo takes the centre slot. Motion drives the track and the per-panel transforms, Tailwind covers the chrome, and a per-image focal point keeps subjects in view at every width. Swap in your own photos, headline, and call to action for a studio homepage or an agency landing page.

Built with

MotionTailwind CSS

Frequently asked questions

Is Curved Frame Carousel free to use?
Curved Frame Carousel is a Premium AI Canvas block. Premium unlocks the full source code, the full remix prompt, and one-command installs for every Premium component, block, and template.
How do I install Curved Frame Carousel?
Premium unlocks one-command installs: run the shadcn CLI with your AI Canvas token, or connect the AI Canvas MCP server and ask your AI editor to install it for you. Premium also unlocks the full remix prompt in the Remix panel.
What is Curved Frame Carousel built with?
Curved Frame Carousel is built with React and TypeScript, using Motion and Tailwind CSS. It ships with both light and dark styling.
Where would I use Curved Frame Carousel?
Common uses include Studio homepage, Agency landing page, and Photo showcase. Like every AI Canvas block, it is self-contained and drops into any React project.
Can I remix Curved Frame Carousel with AI?
Yes. Open "Remix with AI" on this page to read the setup and the constants Curved Frame Carousel is built from. The engine, the markup and the notes on how it works are part of Premium. For the exact block, install it with the one-command CLI.

Featured in collections

More like this