Skip to content
WingoUI
ComponentsTemplatesDocsPricingAI agentsBlogChangelogContact
Components
Buttons & Actions
ButtonButton GroupCopy ButtonDelete ButtonTheme ToggleToggleToggle Group
Inputs
Avatar UploadCalendarCheckboxColor PickerComboboxCountry SelectCron PickerCurrency InputDate PickerDate Range PickerDate Time PickerDuration PickerEmail InputEmoji PickerFile UploadFilter BuilderInputInput GroupListboxMasked InputMention InputMonth PickerMulti SelectNumber InputOTP InputPassword InputPhone InputRadio GroupRatingSearch InputSegmented ControlSelectSignature PadSliderSwitchTag InputTextareaTime PickerTimezone SelectTree Select
Forms
Address InputBooking WidgetCSV ImportFieldForm WizardInline EditInvoice line itemsRich Text EditorSchema Builder
Navigation
Back To TopBounce SidebarBreadcrumbCommand MenuGlobal SearchGooey NavHook SidebarNav MenuNav TabsPaginationProximity SidebarScroll ProgressSidebarStepsTable Of ContentsTabsTopbarUser MenuWorkspace Switcher
Overlays
Alert DialogContext MenuDialogDrawerDropdown MenuFamily DrawerHover CardPopoverShare DialogSheetShortcuts DialogTooltipTour
Feedback
AlertBannerCookie ConsentEmoji ReactionEmpty StateNotification BellNotification CenterProgressRoute ProgressSetup ChecklistSkeletonSpinnerToast
Data Display
Approval FlowAvatarBadgeCalendar ViewCode BlockComment ThreadContact cardCountdownDescription ListDiff ViewerFile ListFile managerFolderGanttJSON ViewerKbdLog ViewerMarkdownPresenceSchedulerTagTimelineTree View
Tables & Lists
Audit LogData TableDeal PipelineEditable GridKanbanListMembers tablePermissions MatrixTableTask ListVirtual List
Charts & Stats
Animated CounterArea chartBar chartDonut chartFunnel chartGaugeGitHub ActivityHeatmap calendarLeaderboardLine chartRadar chartRadial barSparklineStat CardTrackerTrend badge
Layout
AccordionApp ShellCardCollapsibleDetail LayoutEntity HeaderPage HeaderScroll AreaSeparatorSettings LayoutSplit ViewToolbar
Media
Audio PlayerCarouselCSV ViewerDOCX EditorDOCX ViewerExcel ViewerFile SystemImage compareImage CropperImage GalleryImage LightboxLocation MapPDF ViewerPowerPoint ViewerQR CodeStep PlayerVideo Player
AI Kit
Agent Status CardChat MessageChat ThreadChat WidgetConversation ListFluid OrbGrid RevealMatrix OrbModel PickerPrompt InputReasoning IndicatorRule BuilderSuggestion ChipsTool Call TimelineUsage MeterVoice InputWorkflow Canvas
Text & Effects
Background PatternGravity LettersMarqueeTerminalText AnimateText Rotate
Mobile
Action SheetBottom Tab BarFABHaptic ButtonHero HeaderInstall PromptLarge Title HeaderNotification BannerOnboarding CarouselPicker WheelPull To RefreshSlide To ConfirmSticky CTA BarSwipe DeckSwipeable Tabs
Commerce
Cart drawerCategory pickerCheckout stepsCoupon inputFavorite buttonFilter panelListing cardListing gridOrder trackerPricePrice rangePricing tableProduct galleryQuantity stepperReviewsSeller card
Marketing Sections
App Download SectionBlog Cards SectionCTA SectionFAQ SectionFeature GridFeature ShowcaseHero SectionIntegrations SectionLogo CloudMarketing FooterMarketing HeaderMarketing SectionNewsletter SectionPricing SectionStats SectionSteps SectionTeam SectionTestimonials SectionTimeline SectionVideo Section
Blocks
Admin Dashboard PageAdmin ShellAI Chat PageAPI Keys PageAutomation Builder PageCheckout PageCRM Contact PageCRM Pipeline PageError PagesInbox PageInvoice PageKPI DashboardListing Detail PageLogin PageMarketplace Home PageMarketplace Search PageMarketplace ShellMobile App HomeOnboarding FlowOrder History PagePost Listing WizardPricing PageProfile PageRegister PageSettings PageUsers Admin Page
Templates
About PageAcademy PageAccessibility PageAffiliate PageAgency PageAI Product PageAppointment Booking PageBlog PageBlog Post PageBug Bounty PageCareers PageChangelog PageCommunity PageCompare PageContact PageCustomer Story PageCustomers PageDemo Booking PageDevelopers PageDocs Home PageDownload PageEnterprise PageEvents PageExperts PageFAQ PageFeature PageGlossary PageHelp Article PageHelp Center PageHome Services PageImpact PageIntegration Detail PageIntegrations PageJob Detail PageLanding PageLaunch PageLegal PageManifesto PagePortfolio PagePress PageProduct Tour PagePromo PageReal Estate PageReferral PageResearch Report PageRestaurant PageRoadmap PageROI Calculator PageSecurity PageSolutions PageStartups PageStatus PageStorefront PageSwitch PageTemplate Gallery PageTravel PageWaitlist PageYear in Review Page
Hooks & Utilities
AI ChatChart kitCommerceDate utilsFile exportFile typesFiltersForm validationHapticsInvoicingMotion presetsNavigationNumber formatRelative timeRomanian locationsSpreadsheetText matchTonesUIProvideruseClipboarduseConsentuseControllableStateuseCooldownuseDebounceuseKeyboardInsetuseLocaleuseLongPressuseMediaControlsuseMediaQueryuseOverflowItemsusePersistedStateuseScrollEdgesuseScrollStateuseSelectionuseShortcutuseStickToBottom
GalleryTheme

Media

Step Player

Media

Step Player React component for Tailwind CSS v4

QR CodeVideo Player
Live props
Content
steps4
playLabel
pauseLabel
replayLabel
positionLabel
stepLabel
Appearance
size48px
controlPosition
showControl
trackColor
fillColor
pendingColor
iconColor
Behavior
duration4000ms
loop
seekable
State
defaultValue0
defaultPlaying
Code
import { StepPlayer } from "@/components/ui/step-player"

<StepPlayer />
  1. Home
  2. Components
  3. Media
  4. Step Player
Free

Step Player React component for Tailwind CSS v4

v1.0.1·Updated in 1.2.1

A React stories progress bar: an iOS-style stepped track with a play, pause and replay button, whose active step fills as it plays.

Press play to start the sequence. The current step stretches into a bar and fills as it runs, then shrinks to a filled dot when it hands off to the next one. Press again to pause mid-fill; the play icon splits into the pause bars as it goes. At the end it fades into a replay arrow. With seekable on, tap any step to jump to it and keep playing; the dots keep a finger-sized tap target and a visible focus ring for keyboard users.

Step Player is a free React component in the React media components category, written in TypeScript for React 19 and Tailwind CSS v4. It installs as source with npx wingo-ui@latest add step-player, together with UIProvider and the npm packages flubber and motion.

Add to a project

Requirements: React 19 and Tailwind CSS v4, in Next.js (App Router or Pages), Vite or React Router. Installation guide · Next.js setup · Vite setup

npx wingo-ui@latest add step-player

Usage

Import StepPlayer from @/components/ui/step-player.

"use client"

import { useState } from "react"
import { StepPlayer } from "@/components/ui/step-player"

export function Demo() {
  return <StepPlayer steps={5} duration={3000} />
}

// drive your own carousel off the index
const slides = ["Welcome", "Invite your team", "Ship it"]

export function Carousel() {
  const [index, setIndex] = useState(0)

  return (
    <div className="grid gap-4">
      <p className="text-lg font-medium">{slides[index]}</p>
      <StepPlayer steps={slides.length} value={index} onValueChange={setIndex} loop />
    </div>
  )
}

Props

  • stepsdefault 4
    number | StepPlayerStep[]

    How many steps to show. Pass an array of { duration?, label? } to give each one its own duration or accessible label.

  • sizedefault 48
    number

    Height of the track and button in pixels (minimum 12). Every other dimension is a fixed ratio of it, so the dots, bar, gaps, padding, icon, and tap targets all scale from this one number.

  • controlPositiondefault "right"
    "left" | "right"

    Which side of the track the button sits on.

  • showControldefault true
    boolean

    Shows the round play button. Turn it off for a track on its own and drive it with the playing prop.

  • trackColordefault ""
    string

    Any CSS color for the pill track and the round control. Empty uses #F4F4F9 light, #262626 dark.

  • fillColordefault ""
    string

    Any CSS color for finished steps and the running fill. Empty uses #3C3C43 light, #EBEBF5 dark.

  • pendingColordefault ""
    string

    Any CSS color for the steps still to come.

  • iconColordefault ""
    string

    Any CSS color for the play, pause and replay glyph and the focus outline. Empty uses #868593.

  • durationdefault 4000
    number

    Milliseconds each step runs for. A per-step duration overrides it; 0 stops the timer so you can drive the index yourself.

  • loopdefault false
    boolean

    Wraps back to the first step instead of stopping. The replay button never appears when this is on.

  • seekabledefault false
    boolean

    Lets a step be clicked to jump to it (and starts playing from there). The dots keep a finger-sized tap target at every size.

  • playLabeldefault "Play"
    string

    Accessible name of the control while paused.

  • pauseLabeldefault "Pause"
    string

    Accessible name of the control while playing.

  • replayLabeldefault "Replay"
    string

    Accessible name of the control after the last step.

  • positionLabeldefault "Step {index} of {count}"
    string

    Accessible name of the track; {index} and {count} fill in.

  • stepLabeldefault "Step {index}"
    string

    Accessible name of each seek target when seekable and a step has no label; {index} fills in.

  • defaultValuedefault 0
    number

    Step to start on when uncontrolled. Clamped to the last step.

  • defaultPlayingdefault false
    boolean

    Whether the sequence starts running on mount when uncontrolled.

  • value
    number

    Active step index, for controlled use. Leave it out and the component tracks its own index.

  • onValueChange
    (value: number) => void

    Fires when the step advances, wraps, or is clicked. Also fires on replay.

  • playing
    boolean

    Play state, for controlled use. Leave it out to let the button drive it.

  • onPlayingChange
    (playing: boolean) => void

    Fires when the button is pressed, when a step is clicked, and when the last step ends without loop.

  • onComplete
    () => void

    Fires when the last step finishes, on every pass when looping.

  • className
    string

    Extra classes merged onto the root element (data-slot="step-player"). It sizes itself from the size prop, so give it a width only if you want the track wider than its content. Other div props are spread onto it too.

Parts

  • StepPlayerStep

    type

    One entry of steps when it is an array: { duration?, label? }. duration (ms) overrides the player's for that step, label names its seek target.

Examples

Onboarding stories

Controlled with value and onValueChange, so the slide follows the player; seekable lets a tap jump to any step.

Steps with their own length

An array of steps sets each duration and names each seek target; loop starts over at the end.

Over a photo

Light track, fill and icon colors with the control on the left, like a story viewer.

Dependencies

flubbermotionui-config

Files

  • components/ui/step-player.tsx

FAQ

Is the React Step Player component free?

Yes. The source is free and needs no account: copy it from the Code tab or install it with the CLI.

How do I install Step Player?

Run npx wingo-ui@latest add step-player. It also adds the Wingo UI item it builds on (UIProvider) and the npm packages flubber and motion. With shadcn, run npx shadcn@latest add https://wingo-ui.com/r/step-player.json.

See also

StepsProgressOnboarding CarouselCarouselVideo Player

More React media components

QR CodePowerPoint ViewerImage LightboxImage CropperLocation MapAudio Player
All 17 React media components
PreviousQR CodeNext Video Player

Step 1 of 4