An ordered set of steps that collapse into editable summaries as they are completed, ending in one explicit commit.
[WIP image]
| # | Required | Element | Description |
|---|---|---|---|
| 1 | Flow | The ordered list of steps, stacked with a gap between them. It tracks which step is open and numbers the rest. | |
| 2 | Step | One decision, drawn as its own Panel card. Exactly one step in the flow is open at a time. | |
| 3 | Header row | The marker, the title and the summary across the top of the card. On a step that is already done the whole row is the way back into it. | |
| 4 | Marker | The small coin at the leading edge of the header row. It shows the step number, a check once the step is done, or a caution glyph when the step needs another look. | |
| 5 | Label | The step title, level with its marker. A step the flow has not reached yet reads a shade lighter. | |
| 6 | Summary | A one-line record of what was chosen, stacked under the title once the step has values and is not the open one. | |
| 7 | Edit affordance | The link-styled text at the trailing edge of the header row, naming what activating the row does. It reads Review while the step needs re-confirming. | |
| 8 | Body | The inputs for the step, lined up under the title rather than the marker. Only the open step has one. | |
| 9 | Footer | The bottom of the open step, under a divider that runs the width of the body. Any secondary actions the feature adds come first, then the action that moves the flow on, all sitting at the leading edge. |
A setup flow walks someone through an ordered set of decisions that ends in one explicit commit — send, create, run, publish. Every step is on the same surface: the open step is expanded, the ones behind it have collapsed into one-line summaries of what was chosen, and the ones ahead are numbered and inert.
Reach for it when all of these hold:
Do not use one when:
A flow with unsaved input should guard the way out. Closing the surface it sits on opens a ConfirmationModal: a critical confirm labelled Discard, and a cancel labelled Keep editing. A flow that nobody has typed in closes silently — a confirmation there is noise, and noise trains people to dismiss the next one without reading it.
This belongs to whatever holds the flow, not to the flow itself. The flow tracks which step is open; it does not know whether the surface around it may go away.
The distinction is dependence. If the steps could be filled in any order without anything changing, the flow is imposing a sequence that is not really there.
Order the steps so each one only asks for what the ones before it have made answerable. A step that could just as well come first is a sign the flow is really a form.
The same dependence works in reverse: editing a finished step leaves the steps after it intact unless the change genuinely breaks their values. Resetting the rest of the flow because someone corrected a name throws away work that was never in question.
The last step is a read-only review of every decision above it, and the commit is the only primary action on it. It never collapses and it has no summary, because it is not a decision — it is the moment of deciding to go ahead.
Two to five steps, including the review. Fewer than two is a form wearing a flow's clothes. More than five turns a configuration into an errand, and the collapsed summaries stop fitting on one screen — which is the whole reason for the shape.
Length is the other half of the same rule: if a step needs its own scrollbar, it is doing too much and should be split. If two steps are always answered together, merge them.
A step shows its summary whenever it is not the open one and has values to show, so give a step its summary once it holds real values and not before. A summary on a step nobody has reached yet promises an answer that has not been given.
Hold the step until its required inputs are valid. The review at the end is a restatement of what was chosen, not a second chance to catch what a step should have caught, and an invalid step that advances puts its error out of sight behind a summary.
A flow holds two kinds of step. Every flow has one of each: several standard steps, then a single final one.
A decision. It collapses to its summary once it is done, keeps a way back into it, and its footer moves the flow on to the next step.
The review. It has no summary, cannot be collapsed, and offers no way to reopen it, because there is nothing after it to reopen it from. Its footer holds the commit.
The marker carries a step's status as color and glyph. A step that has not been reached and the step that is open both show their number; a finished step shows a check; a step that needs another look shows a caution glyph.
| Status | Glyph | Fill | Ring | Glyph color |
|---|---|---|---|---|
| Upcoming | Number | surface-base | border-base | text-subtle |
| Active | Number | surface-invert | None | text-on-invert |
| Complete | Check | surface-success | None | text-on-success |
| Invalidated | Caution | surface-caution | None | text-on-caution |
| Disabled | Whatever its status shows | surface-base-disabled | border-minimal on an unreached step | text-base-disabled |
Only the upcoming marker has a ring: it sits on the page's own surface, so the ring is the only thing that draws it. Every status the flow has reached is a solid filled coin, which is what separates the steps that have been answered from the ones still ahead.
A disabled step flattens its marker into the disabled palette whatever status it holds, and changes nothing else — its title and summary stay at full strength, because the disabled palette is not legible enough for text that has to be read. See Disabled steps for the contrast that rules out.
Markers are decorative. The number repeats the ordering the list already has, and the status is carried by the label, the summary, and the presence of the body beside it — so nothing is lost when the marker is not perceived. See Markers for how that is expressed.
Every step is a card, and the flow is those cards stacked with a gap between them. There is no rail or connector joining one step to the next: the order comes from reading down the stack, and the numbers in the markers say where each step sits.
Inside the card, the marker leads a header row that also carries the title and, under it, the summary. The body of the open step lines up with the title rather than the marker, so the inputs sit in one column with the words that introduce them. A step the flow has not reached yet reads a shade lighter in the title, which is what makes the answered steps and the open one stand out from the ones still ahead.
A step's status comes from the flow, not from the step itself: the open step is active, a step the flow has recorded as done is complete, and everything else is upcoming.
A step the flow has not reached. It is numbered, muted, and inert — there is no way to jump ahead into it, because the decisions it depends on have not been made.
The open step. Its body is expanded, its footer is visible, and it is the only step in the flow that can be filled in.
A step the flow has recorded as done. It has collapsed to a one-line record of what was chosen, and its header row is the way back into it.
A step that was finished until an edit above it broke its values. The marker turns to caution, the summary says what changed, and the affordance now reads Review.
A step that is unavailable in this flow. It keeps its place in the sequence so the numbering still makes sense, but the flow steps over it on the way to the next one and it offers no way back into it. Only the marker dims — the words stay readable, so the summary can say why.
Moving the flow on collapses the open step into its summary, opens the next one, and moves focus to the new step's title, so a keyboard or screen reader user lands on the step they now have to fill in rather than back at the top of the flow. A step that is unavailable is stepped straight over on the way.
A flow that has only just appeared does not take focus — arriving on a screen is not the same as being moved along by it. That holds however the first step was settled, including a flow that works out where to open a moment after it renders.
A finished step is reopened by its header row. The whole row is the target — the marker, the title, the summary, and the Edit affordance at its trailing edge — so the affordance names what activating the row does rather than being a small target of its own. Reopening a step happens in place, without unwinding the steps after it: reopening the second of five does not throw away the third, fourth, and fifth; the flow returns to that step and the rest of the configuration stays as it was.
The feature can intercept a reopen — to warn first, or to route somewhere else — and can leave the step closed if it needs to.
Only the feature knows what an edit breaks, so invalidation is something it declares rather than something the flow works out. Use it sparingly and precisely:
Step titles are short verb phrases in sentence case, parallel in form across the flow, describing the decision rather than the subject.
Mark inputs that can be skipped with a trailing "(optional)" on the field label, the same as anywhere else — a step whose inputs are all optional still has to say so, because a collapsed step with no summary otherwise looks unanswered.
A summary is the values that were chosen, not a description of what the step was for. Someone scanning a finished flow is reading their own answers back.
Keep a summary to one line. If the step made more decisions than fit, summarize the ones that would change someone's mind about reopening it and let the step itself hold the rest.
The action on the final step names the outcome: Create export, Send for previews, Publish campaign. Finish and Done describe the flow rather than what it does, and a flow is not what anyone came for.
The steps before it all move the flow on, so they all say Continue. Numbering them — Continue to step 3 — repeats what the markers already show.