Skip to main content

Steps

Overview​

The Steps component provides a multi-step progress indicator for wizard flows, checkout processes, or any multi-step workflow.

It supports horizontal and vertical layouts, customizable markers, and clickable navigation.


Import​

import { Steps } from '@allxsmith/bestax-bulma';

Usage​

Basic Steps​

A simple step indicator showing progress through a flow.

<Steps
  value={1}
  items={[{ label: 'Account' }, { label: 'Profile' }, { label: 'Complete' }]}
/>


Clickable Steps​

Steps that allow navigation by clicking.

function example() {
  const [step, setStep] = useState(1);
  return (
    <Block>
      <Steps
        value={step}
        items={[
          { label: 'Account', clickable: true },
          { label: 'Profile', clickable: true },
          { label: 'Review', clickable: true },
          { label: 'Complete', clickable: true },
        ]}
        onStepClick={setStep}
        color="primary"
      />
      <Paragraph mt="4">Current step: {step + 1}</Paragraph>
    </Block>
  );
}


Color Variants​

Steps with different color variants.

<Block display="flex" flexDirection="column" gap="5">
  <Steps
    value={1}
    color="primary"
    items={[{ label: 'Step 1' }, { label: 'Step 2' }, { label: 'Step 3' }]}
  />
  <Steps
    value={1}
    color="success"
    items={[{ label: 'Step 1' }, { label: 'Step 2' }, { label: 'Step 3' }]}
  />
  <Steps
    value={1}
    color="info"
    items={[{ label: 'Step 1' }, { label: 'Step 2' }, { label: 'Step 3' }]}
  />
  <Steps
    value={1}
    color="warning"
    items={[{ label: 'Step 1' }, { label: 'Step 2' }, { label: 'Step 3' }]}
  />
  <Steps
    value={1}
    color="danger"
    items={[{ label: 'Step 1' }, { label: 'Step 2' }, { label: 'Step 3' }]}
  />
</Block>


Size Variants​

Steps with different size variants.

<Block display="flex" flexDirection="column" gap="5">
  <Steps
    value={1}
    size="small"
    items={[{ label: 'Step 1' }, { label: 'Step 2' }, { label: 'Step 3' }]}
  />
  <Steps
    value={1}
    items={[{ label: 'Step 1' }, { label: 'Step 2' }, { label: 'Step 3' }]}
  />
  <Steps
    value={1}
    size="medium"
    items={[{ label: 'Step 1' }, { label: 'Step 2' }, { label: 'Step 3' }]}
  />
  <Steps
    value={1}
    size="large"
    items={[{ label: 'Step 1' }, { label: 'Step 2' }, { label: 'Step 3' }]}
  />
</Block>


With Icons​

Steps with custom icons in markers.

<Steps
  value={1}
  color="info"
  items={[
    { label: 'Cart', icon: <Icon name="shopping-cart" variant="solid" /> },
    { label: 'Shipping', icon: <Icon name="truck" variant="solid" /> },
    { label: 'Payment', icon: <Icon name="credit-card" variant="solid" /> },
    { label: 'Done', icon: <Icon name="check" variant="solid" /> },
  ]}
/>


Vertical Layout​

Steps in vertical orientation.

<Steps
  value={1}
  vertical
  color="primary"
  items={[
    { label: 'Create Account' },
    { label: 'Set Up Profile' },
    { label: 'Choose Plan' },
    { label: 'Start Using' },
  ]}
/>


Rounded Markers​

Steps with rounded (circular) markers.

<Steps
  value={2}
  rounded
  color="success"
  items={[
    { label: 'Order Placed' },
    { label: 'Processing' },
    { label: 'Shipped' },
    { label: 'Delivered' },
  ]}
/>


Checkout Flow Example​

A complete checkout flow with navigation buttons.

function example() {
  const [step, setStep] = useState(0);
  const steps = ['Cart', 'Shipping', 'Payment', 'Confirm'];

  return (
    <Block>
      <Steps
        value={step}
        items={steps.map((label, i) => ({ label, clickable: i <= step }))}
        onStepClick={s => s <= step && setStep(s)}
        color="primary"
      />
      <Box mt="4" p="4">
        <Title size="5">{steps[step]}</Title>
        <Paragraph>Content for the {steps[step]} step goes here.</Paragraph>
      </Box>
      <Buttons mt="4">
        <Button
          onClick={() => setStep(Math.max(0, step - 1))}
          disabled={step === 0}
        >
          Previous
        </Button>
        <Button
          color="primary"
          onClick={() => setStep(Math.min(3, step + 1))}
          disabled={step === 3}
        >
          {step === 2 ? 'Place Order' : 'Next'}
        </Button>
      </Buttons>
    </Block>
  );
}


Compound (dot-notation) usage​

Step is also available as Steps.Step, so steps can be declared as children from the single Steps import — an alternative to the items prop.

<Steps value={1}>
  <Steps.Step label="Account" />
  <Steps.Step label="Profile" />
  <Steps.Step label="Complete" />
</Steps>


Accessibility​

  • Steps use aria-current="step" on the active step
  • Clickable steps are keyboard navigable with proper focus indicators
  • Use descriptive labels for each step
  • The step markers show completion state with checkmarks

  • Progress - For linear progress indication

Additional Resources​

Pro Tip

Use the onStepClick callback with clickable: true on items to allow users to navigate back to previous steps.


Props​

PropTypeDefaultDescription
valuenumber0Current active step (0-indexed).
itemsStepItemProps[]—Array of step items.
size'small' | 'medium' | 'large'—Size of the steps.
color'primary' | 'link' | 'info' | 'success' | 'warning' | 'danger'—Color variant.
hasMarkerbooleantrueShow step markers. Default: true.
animatedbooleantrueEnable animations. Default: true.
roundedbooleantrueUse rounded markers. Default: true.
verticalbooleanfalseVertical layout.
labelPosition'bottom' | 'right' | 'left''bottom'Position of labels.
mobileMode'minimal' | 'compact' | 'right'—Mobile display mode.
showStepNumbersbooleantrueDisplays step numbers in the markers. Show step numbers in markers. Default: true.
hasNavigationbooleanfalseShows previous/next navigation buttons. Render built-in prev/next buttons.
prevLabelstring—Label for the previous button. Custom prev button text (default 'Previous').
nextLabelstring—Label for the next button. Custom next button text (default 'Next').
onPrev() => void—Callback when previous button is clicked. Custom prev button callback.
onNext() => void—Callback when next button is clicked. Custom next button callback.
onStepClick(step: number) => void—Callback when a step is clicked.
childrenReact.ReactNode—Step children (alternative to items).
classNamestring—Additional CSS classes.
...All standard <div> attributes and Bulma helper props—See Helper Props

Subcomponents:

  • Steps.Step: Individual Step component for use inside Steps.

Steps.Step​

PropTypeDefaultDescription
isActivebooleanfalseWhether this step is active
isCompletedbooleanfalseWhether this step is completed
labelReact.ReactNode—Step label/title
iconReact.ReactNode—Icon for the step marker
clickablebooleanfalseWhether this step is clickable
onClick() => void—Click handler
stepNumbernumber—Step number to display in marker (1-indexed)
completedIconReact.ReactNode'✓'Icon shown when the step is completed. Custom icon for completed state. Set to null to show step number instead of checkmark.
classNamestring—Additional CSS classes.
childrenReact.ReactNode—Content rendered inside the component.
...All standard <li> attributes and Bulma helper props—See Helper Props

StepItemProps​

PropTypeDefaultDescription
labelReact.ReactNode—Step label/title.
iconReact.ReactNode—Icon for the step marker.
clickablebooleanfalseWhether this step is clickable.
completedIconReact.ReactNode'✓'Icon shown when the step is completed.
classNamestring—Additional class for this step.

CSS & Sass Variables​

Steps registers these variables on its own .steps element. Override them there (or via className) — a value set on an ancestor is only inherited, and loses to the component-level declaration. See Theme.

CSS VariableSass VariableDefault
--bulma-steps-marker-size$steps-marker-size2rem
--bulma-steps-marker-size-small$steps-marker-size-small1.5rem
--bulma-steps-marker-size-medium$steps-marker-size-medium2.5rem
--bulma-steps-marker-size-large$steps-marker-size-large3rem
--bulma-steps-divider-height$steps-divider-height0.2em
--bulma-steps-default-color$steps-default-colorvar(--bulma-grey-light)
--bulma-steps-marker-background$steps-marker-backgroundvar(--bulma-scheme-main)
--bulma-steps-marker-font-size$steps-marker-font-sizevar(--bulma-size-small)
--bulma-steps-marker-font-weight$steps-marker-font-weightvar(--bulma-weight-bold)
--bulma-steps-title-size$steps-title-sizevar(--bulma-size-small)
--bulma-steps-title-weight$steps-title-weightvar(--bulma-weight-medium)
--bulma-steps-title-color$steps-title-colorvar(--bulma-text-weak)
--bulma-steps-title-active-color$steps-title-active-colorvar(--bulma-text-strong)
--bulma-steps-title-active-weight$steps-title-active-weightvar(--bulma-weight-semibold)
--bulma-steps-content-margin-top$steps-content-margin-top0.5rem
--bulma-steps-vertical-padding$steps-vertical-padding1.5rem
--bulma-steps-vertical-content-margin-left$steps-vertical-content-margin-left1rem
--bulma-steps-animation-duration$steps-animation-duration0.3s
--bulma-steps-navigation-margin-top$steps-navigation-margin-top1rem