Button
TypeButton. Advances, checks out, or links out. action next validates every input on the screen (errors show inline) then goes on; checkout opens payment for the selected plan (needs a PlanSelector on the same step); url opens a link; scroll jumps within the screen without validating. Busy/disabled with a spinner while next or checkout is in flight. sticky (default) pins it to the bottom bar. Label <=24 chars. disabledUntil gates it on answers; appearance box tokens style the button itself.
Example
Example
Loader
TypeLoader. Shows timed progress, then advances. Runs once per mount over durationMs; the checklist ticks off with the percentage and results appear per line. autoAdvance goes on at 100% (after any step hook answers), so the step needs no Button. An optional mid-way question pauses progress until answered. Exposed as a progressbar. Checklist rows may reveal a right-side value (text, pill or badge) in theme tones; legacy result/resultBadge still work. question.display “sheet” asks in a modal bottom sheet that must be answered.
Example
Example
Popup
TypePopup. Opens a delayed offer or reminder. Modal bottom sheet that opens delayMs after the step shows (once); closes on scrim, close icon, Escape or dismissLabel, with focus trapped and restored. The primary button closes it, then goes next or opens url. Sends popup_view once. Never put essential info only here.
Example
Example
Analytics milestone
TypeAnalyticsMilestone. Invisible scroll marker for long screens. Fires milestone_view once when this exact position first enters the viewport; Amplitude exposes props.name as the event type. Use for report reveals, deep paywall sections and other persuasion milestones that are not separate steps.
Example
Example