Skip to content

StepContent — spec

Synthesized from MUI StepContent. The body region under a vertical-orientation Step. Renders the step's actual form / instruction / control panel. Only used with <Stepper orientation="vertical">.

When to use

  • Vertical-orientation steppers (each step has expanded body content).
  • Mobile onboarding flows where steps stack vertically.
  • For horizontal steppers, render content separately below the stepper.

API

<Stepper activeStep={step} orientation="vertical">
  <Step>
    <StepLabel>이메일 입력</StepLabel>
    <StepContent>
      <TextField fullWidth label="이메일" />
      <Stack direction="row" gap={1} sx={{ mt: 2 }}>
        <Button onClick={handleNext} variant="contained">다음</Button>
      </Stack>
    </StepContent>
  </Step>
</Stepper>
Prop Type Default Description
children ReactNode Step body content
transitionDuration number \| 'auto' 'auto' Collapse animation
TransitionComponent Component Collapse Custom transition
TransitionProps TransitionProps Pass-through

States

State Visual
Active step Content expanded
Inactive step Content collapsed (animated)

Tokens consumed

--space-md                  /* horizontal padding */
--space-md-y                /* vertical padding */
--motion-duration-auto
--step-connector-line       /* left vertical rule */

Accessibility

  • Hidden content is aria-hidden when collapsed.
  • Focus moves into the active step's content automatically when activeStep changes.
  • For long step content with internal scrolling, the parent step should handle scroll-into-view.

Edge cases

  • Form validation per step — show errors inline AND prevent progression to next step. Keep current StepContent expanded until valid.
  • Long content (10+ form fields) — that's a multi-screen flow, not a vertical stepper. Switch to a separate page per step.
  • Mobile narrow viewport — vertical orientation works well; ensure step labels and content fit at 320px.

Code example

function VerticalOnboarding() {
  const [step, setStep] = useState(0);
  const totalSteps = 3;

  return (
    <Stepper activeStep={step} orientation="vertical">
      <Step>
        <StepLabel>기본 정보</StepLabel>
        <StepContent>
          <Stack gap={2}>
            <TextField label="이름" />
            <TextField label="이메일" />
            <Stack direction="row" gap={1}>
              <Button onClick={() => setStep(1)} variant="contained">
                다음
              </Button>
            </Stack>
          </Stack>
        </StepContent>
      </Step>
      <Step>
        <StepLabel>비밀번호</StepLabel>
        <StepContent>
          <TextField fullWidth label="비밀번호" type="password" />
          <Stack direction="row" gap={1} sx={{ mt: 2 }}>
            <Button onClick={() => setStep(0)}>이전</Button>
            <Button onClick={() => setStep(2)} variant="contained">다음</Button>
          </Stack>
        </StepContent>
      </Step>
      <Step>
        <StepLabel>완료</StepLabel>
        <StepContent>
          <Typography>가입이 완료됐어요.</Typography>
          <Button variant="contained" sx={{ mt: 2 }}>시작하기</Button>
        </StepContent>
      </Step>
    </Stepper>
  );
}

Don't

  • Don't use with horizontal stepper — content won't render.
  • Don't omit Back/Next buttons — users need explicit progression controls.

References

Cross-reference