Manzil

StepProgress

A progress bar with steps for React. Controlled via value.

Basic

Pass an ordered list of labels and the current step index.

Create
Configure
Review
Launch
<StepProgress
  steps={["Create", "Configure", "Review", "Launch"]}
  value={1}
/>

Value

The current step index (0-based). Fill width follows a front-loaded curve so early steps already read as progress.

Create
Configure
Review
Launch
<StepProgress
  steps={["Create", "Configure", "Review", "Launch"]}
  value={2}
/>

Size

Three sizes for different layouts.

Create
Configure
Review
Launch
<StepProgress
  steps={steps}
  value={1}
  size="md"
/>

Labels

Step labels are on by default. Hide them for a compact bar.

Create
Configure
Review
Launch
<StepProgress steps={steps} value={1} />

Shimmer

Soft sweep on the fill while progress remains. Always off on the final step. Control the sweep direction with shimmerAngle.

Create
Configure
Review
Launch
<StepProgress steps={steps} value={1} />

Gradient

Override the fill with gradientColors and gradientAngle. Colors are spaced evenly unless you pass stops with positions.

Create
Configure
Review
Launch
<StepProgress steps={steps} value={1} />

Shimmer band

Control leading / highlight / trailing widths. Pass shimmerBands for a different band on each segment.

Create
Configure
Review
Launch
<StepProgress steps={steps} value={1} />

Statuses

Override node icons with statuses. Fill still follows value.

Create
Configure
Review
Launch
<StepProgress
  steps={steps}
  value={0}
  statuses={["upcoming","upcoming","upcoming","upcoming"]}
  progressStops={[0, 36, 54, 100]}
/>

Interactive Steps

Pass onStepClick to turn step markers into accessible buttons with keyboard navigation (Enter / Space).

Click any step node to jump directly:
Create
Configure
Review
Launch
<StepProgress
  steps={steps}
  value={1}
  onStepClick={(index) => setStep(index)}
/>

useStepProgress Hook

Manage stepper state effortlessly with the built-in React hook.

Create
Configure
Review
Launch
const { props, next, prev, isFirst, isLast } = useStepProgress({
  steps: ['Create', 'Configure', 'Review', 'Launch'],
  initialStep: 1,
})

return (
  <>
    <StepProgress {...props} />
    <button onClick={prev} disabled={isFirst}>Back</button>
    <button onClick={next} disabled={isLast}>Next</button>
  </>
)

Custom Icons

Override complete and ongoing icons using the icons slot prop.

Create
Configure
Review
Launch
<StepProgress
  steps={steps}
  value={2}
  icons={{
    complete: <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3"><path d="M20 6L9 17l-5-5"/></svg>,
    ongoing: <span style={{ fontSize: "11px", fontWeight: "bold" }}>●</span>,
  }}
/>

API Reference

Minimal surface. Good defaults. Override only when you need to.

PropTypeDefault
steps
string[]
—
value
number
—
size
"sm" | "md" | "lg"
"md"
showLabels
boolean
true
showShimmer
boolean
true
gradientColors
string[]
navy → ice
gradientAngle
number
90
shimmerAngle
number
75
shimmerDuration
number
1.7
shimmerBand
ShimmerBand
balanced
shimmerBands
ShimmerBand[]
—
statuses
StepStatus[]
from value
icons
StepProgressIcons
—
classNames
StepProgressClassnames
—
onStepClick
(index: number) => void
—
store
StepProgressStore
—
progressStops
number[]
curve
unstyled
boolean
false
dir
"ltr" | "rtl" | "auto"
"ltr"
disabled
boolean
false
className
string
—
aria-label
string
"Progress"
aria-valuetext
string | function
dynamic