Ordered steps. Each is { label, render, isValid? }. render(values, set) draws the step body; isValid(values) gates Next (omit for an always-passable step like Review).
onFinish *
(values: T) => void
n/a
Fired when Finish is pressed on the last step. Receives the accumulated values.
label
string
n/a
Accessible name for the flow region (e.g. 'Create session'); also drives the header eyebrow.
current
number
n/a
Controlled active step index. Omit to let the Wizard own its step state internally.
onStepChange
(index: number) => void
n/a
Notified on every Back / Next / indicator-jump. Pair with current for a controlled flow.
allowJumpBack
boolean
true
When true, completed discs in the indicator are clickable to jump back. Forward jumps are never allowed (gating).
finishing
boolean
false
Holds the Finish button with a spinner + aria-busy while the create call is in flight.
Parameter
Type
Default
Description
steps *
List<NockerlWizardStep>
n/a
NockerlWizardStep(label, content, isValid = { true }). content is a @Composable (values, set) -> Unit body; isValid gates the footer Next.
onFinish *
(T) -> Unit
n/a
Invoked from the last step’s Finish with the accumulated values.
label
String
""
Content description for the flow + the header eyebrow text.
current
Int?
null
Controlled active step. Null = the wizard hoists its own rememberSaveable step state.
onStepChange
((Int) -> Unit)?
null
Called on Back / Next / jump-back. Pair with current to control the flow.
allowJumpBack
Boolean
true
Completed stepper discs become clickable (ripple) to return to an earlier step.
finishing
Boolean
false
Shows a spinner in Finish and blocks re-press while the create call runs.
modifier
Modifier
Modifier
Outer modifier. Pass Modifier.fillMaxWidth() for a full-width flow card.
SwiftUI exposes the flow as a NockerlWizard view built from a @ViewBuilder of
NockerlWizardSteps; the active index is internal unless bound. State styling
reads from NockerlTheme (accent, success, surface highlight, divider).
Style
Type
Default
Description
steps (builder) *
@WizardBuilder
n/a
NockerlWizardStep(_:isValid:content:): a label, an optional isValid predicate that gates Next, and the step’s content view.
onFinish *
(T) -> Void
n/a
Closure fired from the last step’s Finish with the bound values.
values *
Binding<T>
n/a
The accumulated flow values; each step reads/writes through this binding.
label
String
""
Accessibility label for the flow + the header eyebrow.
current
Binding<Int>?
nil
Optional binding to control the active step; nil = internal @State.
allowJumpBack
Bool
true
Completed stops in the indicator become tappable to step back.
finishing
Bool
false
Drives the Finish spinner + disabled state while creating.
Cross-platform drift (tracked for reconciliation)
The Wizard is the guided flow, not the indicator:
Wizard vs Stepper: the Wizard is the whole flow. It
renders the step indicator plus each step’s content plus the
Back / Next / Finish footer plus validation gating. The Stepper is only the
discs + connectors the Wizard shows at the top; a Wizard uses a Stepper.
This page documents an intended API. The canonical “Create session” flow is a
single page: web SessionCreationForm and Android SessionCreationSheet (one
bottom sheet, not paged), with Voice’s OnboardingView as a status checklist
rather than a Back/Next flow. The demo therefore reproduces those real fields
(Name → harness → Provider → Model), while the paged container above is designed
from the laws + Stepper + Form-layout vocabulary. The note at the foot of this page
carries per-platform status.
Step content is the Form layout vocabulary
(recessed wells, required *, inline errors); the Wizard adds only the
orchestration (indicator + navigation + gating + review).