Skip to content

Step Sequence

Numbered steps that take turns, with the media beside them cross-fading.

From the Findit template — see it in context
Open living room with a long grey sofa

Installation

$ npx shadcn@latest add https://framebrick.co/r/step-sequence.json

Usage

import { StepSequence } from "@/components/ui/step-sequence";

<StepSequence
  label="How it works"
  steps={[
    { value: "brief", title: "Tell us what you need", description: "…", media: <Image src={brief} alt="" fill /> },
    { value: "tour", title: "Tour the shortlist", description: "…", media: <Image src={tour} alt="" fill /> },
  ]}
/>

Props

PropTypeDefaultDescription
steps{ value, title, description?, media? }[]—The steps, in order. `media` fills the panel beside them.
labelstring—Accessible name of the sequence.
valuestring—Active step (controlled).
defaultValuestringfirst stepStep that starts active (uncontrolled).
onValueChange(value: string) => void—Called when another step becomes active.
intervalnumber5000Milliseconds a step stays active; 0 turns the rotation off.
  • The steps are a tab list: arrow keys, Home and End move between them, and the media is their panel. The tabs are the list's own children — wrapping them in <li> breaks the pattern.
  • An inactive step sits at 70%, not Framer's 50%, which dropped its text to 2.1-3.7:1 in every theme. Its description carries its own darker tone, because the row's 70% multiplies whatever colour it has.
  • The rotation pauses while the pointer is over it or something inside has focus, so a step cannot change mid-sentence.
  • With reduced motion it does not rotate at all — a timer is neither a transform nor a size animation, so MotionConfig would not stop it.

AI prompt

Paste into v0, Lovable, Bolt or Claude to rebuild this component in your own project.

Create a React + Tailwind CSS + Motion (motion/react) component called StepSequence.
- Two columns from 1024px up (stacked below): on the left numbered steps ("01." in a 32px column with a 2px rule
  running to the next step, title font-medium, description text-sm text-muted-foreground); on the right a rounded-lg
  panel holding one media element per step, absolutely stacked.
- The active step is at opacity 1, the others at 0.5; the active media is at opacity 1, the others at 0.
  Both animate with a spring (bounce 0, duration 0.4s).
- Every `interval` ms (default 5000) the next step becomes active, wrapping around; clicking a step activates it at once.
- Controlled (value + onValueChange) or uncontrolled (defaultValue, first step by default).
- Accessibility: role tablist with aria-orientation vertical, each step a role tab with aria-selected and a roving
  tabIndex, arrow keys / Home / End move and select, the media panel is role tabpanel with aria-labelledby.
- Pause the rotation while the pointer is over the component or focus is inside it, and do not rotate at all when
  useReducedMotion() is true.

Be the first to know

Get new templates and components first

One short email when we release a template or a free component. No spam — unsubscribe anytime.

We use your email only for Framebrick updates. Privacy policy