Branching Stepper
A copy-paste steppers & wizards component in pure HTML & CSS. Zero dependencies, framework-agnostic, MIT-licensed.
Steppers & WizardsHTMLCSSany framework
1
2a
2b
Business account selected — routed to compliance check
Copy into your project
HTML
<div class="nuda-st2-branch-path">
<div class="nuda-st2-branch-path__node is-done">1</div>
<div class="nuda-st2-branch-path__fork">
<span class="nuda-st2-branch-path__arm nuda-st2-branch-path__arm--up is-active"></span>
<span class="nuda-st2-branch-path__arm nuda-st2-branch-path__arm--down"></span>
</div>
<div class="nuda-st2-branch-path__branches">
<div class="nuda-st2-branch-path__node is-active" aria-current="step">2a</div>
<div class="nuda-st2-branch-path__node is-future">2b</div>
</div>
<p class="nuda-st2-branch-path__caption">Business account selected — routed to compliance check</p>
</div>CSS
.nuda-st2-branch-path {
display: flex;
flex-direction: column;
align-items: center;
gap: 2px;
width: 100%;
max-width: 280px;
font-size: 11px;
}
.nuda-st2-branch-path__node {
display: inline-flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
border-radius: 50%;
background: rgba(255,255,255,.05);
border: 1px solid rgba(255,255,255,.12);
color: #a0a0a8;
font-size: 11px;
font-weight: 700;
}
.nuda-st2-branch-path__node.is-done {
background: #e4ff54;
border-color: #e4ff54;
color: #09090b;
}
.nuda-st2-branch-path__node.is-active {
background: rgba(228,255,84,.1);
border-color: #e4ff54;
color: #e4ff54;
}
.nuda-st2-branch-path__node.is-future {
color: #63636e;
opacity: .5;
}
.nuda-st2-branch-path__fork {
position: relative;
width: 60px;
height: 26px;
}
.nuda-st2-branch-path__arm {
position: absolute;
left: 50%;
top: 0;
width: 2px;
height: 100%;
background: rgba(255,255,255,.08);
transform-origin: top;
transform: scaleY(0);
}
.nuda-st2-branch-path__arm--up {
transform: translateX(-16px) rotate(-28deg) scaleY(0);
}
.nuda-st2-branch-path__arm--down {
transform: translateX(16px) rotate(28deg) scaleY(0);
}
.nuda-st2-branch-path__arm.is-active {
background: #e4ff54;
animation: _nuda-st2branchpath-draw .5s cubic-bezier(.16,1,.3,1) .1s forwards;
}
.nuda-st2-branch-path__arm--up.is-active {
animation-name: _nuda-st2branchpath-drawup;
}
.nuda-st2-branch-path__branches {
display: flex;
gap: 34px;
}
.nuda-st2-branch-path__caption {
margin: 10px 0 0;
color: #a0a0a8;
text-align: center;
}
@keyframes _nuda-st2branchpath-draw {
to {
transform: translateX(16px) rotate(28deg) scaleY(1);
}
}
@keyframes _nuda-st2branchpath-drawup {
to {
transform: translateX(-16px) rotate(-28deg) scaleY(1);
}
}
@media (prefers-reduced-motion:reduce) {
.nuda-st2-branch-path__arm.is-active {
animation: none;
transform: translateX(-16px) rotate(-28deg) scaleY(1);
}
.nuda-st2-branch-path__arm--down.is-active {
transform: translateX(16px) rotate(28deg) scaleY(1);
}
}
How to use Branching Stepper
Paste the HTML where you need it and the CSS into a global stylesheet (or a <style> tag). Every class is prefixed nuda- so it never collides with Tailwind or your own styles. Tweak the CSS custom properties to match your design system.
Works in React, Vue, Svelte, Astro, Next.js, Nuxt, Laravel Blade, Django, Rails — or a single .html file. No npm install, no build step.