Onboarding Stepper Patterns
Completed Step
A static completed-step readback shows completed Account setup, current Invite team, remaining 2 steps, and Progress readback status.
Program
Completed-step readback makes progress understandable without a storage-backed checklist or onboarding service.
completed_step_readback.html
Visuals: captured from real browser rendering
<section class="completed-step" aria-labelledby="completed-step-title"><h2 id="completed-step-title">Completed step readback</h2><ol class="progress-list" aria-label="Static completed step readback"><li>Account setup complete</li><li aria-current="step">Invite team current</li><li>Finish later</li></ol><dl>
<div><dt>Completed</dt><dd>Account setup</dd></div>
<div><dt>Current</dt><dd>Invite team</dd></div><div><dt>Remaining</dt><dd>2 steps</dd></div>
<div><dt>Status</dt><dd><span class="badge">Progress readback</span></dd></div></dl>
<p class="check">Learner check: completed, current, and remaining steps are readable without a live progress service.</p>
<p class="note">Static completed-step readback only; no framework, stepper engine, click handler, keyboard handler, route change, account setup service, progress save, storage, cookie, API, network, script, event listener, form submit, input, textarea, contenteditable, timer, analytics, object URL, download, service worker, account/session behavior, live onboarding progress, live navigation, or live submission runs.</p></section>
<style>
.completed-step { display: grid; gap: 10px; max-width: 38rem; border: 1px solid #1d4ed8; padding: 12px; background: #eff6ff; }
.progress-list { display: grid; gap: 6px; max-width: 280px; margin: 0; padding-left: 1.4rem; }
.progress-list li { border-radius: 6px; background: #dbeafe; padding: 8px; }
.progress-list li[aria-current] { outline: 2px solid #1d4ed8; font-weight: 700; }
.completed-step dl { display: grid; gap: 8px; margin: 0; }
.completed-step dl div { display: grid; grid-template-columns: 8rem 1fr; gap: 8px; }
.completed-step dt { color: #475569; }
.completed-step dd, .check, .note { margin: 0; }
.badge { border-radius: 999px; background: #dbeafe; padding: 2px 8px; }
.note { color: #475569; }
</style>
Label the completed-step source.

The section is labelled by its visible heading. Show the progress-list affordance.

The ordered list provides a visual progress affordance. Show completed-step event context.

The completed row names the step as pinned readback, not saved state. Show pinned remaining-step state.

The remaining count is static pinned progress. Render progress-readback status.

The status badge is the rendered consequence of the pinned progress rows. Check completed-step readback.

Static markup, visual affordance, event context, progress state, rendered status, and no live service.
step flow
step(1) labels the static source, step(2) shows the visual progress-list affordance, step(3) shows the user-event readback, step(4) shows the pinned progress state, step(5) shows the rendered consequence, and step(6) checks learner readback with honesty.
progress readback
The section heading names the completed step readback surface.
progress rows
Completed, Current, Remaining, and Status values are exact pinned data.
no live service
The lesson should not imply frameworks, stepper engines, click handlers, keyboard handlers, route changes, account setup services, progress saves, storage, cookies, APIs, networks, scripts, event listeners, form submits, inputs, textareas, contenteditable surfaces, timers, analytics, object URLs, downloads, service workers, account/session behavior, live onboarding progress, live navigation, or live submissions.