NewPower Apps · canvas componentNavigation and layout✓ Tested in StudioMIT License
Stepper
The steps of a form or wizard, with progress, a check before each step that stops people skipping what's required, Back and Next, and a step to go to. Or a project's stages and an approval chain in the standard status colours. Horizontal or vertical.
As it is when you paste it, with every input at its default.
Screen1
Step 1 of 4
Your details
Name and team
Formulas on this screen
Set the same ones in Studio to try it the same way; there, each Notify shows its event in a banner, which this preview leaves out so nothing covers the component. The instance names are the ones Studio gives the first copy on a screen.
A web replica that behaves as the component does in Power Apps. In Studio it uses Microsoft's controls, which can look slightly different.
Add it in five steps
1In Power Apps Studio, open Settings > Updates and check that Modern controls and themes and Enhanced component properties are on.
2Open the Components tab in the tree view and select New component.
3Select an empty part of Studio, so the new component isn't selected.
4Copy the YAML on this page and press Ctrl+V. lcsStepper appears with all its properties.
5On a screen, insert it from Insert > Custom > lcsStepper.
What it needs
No premium licence: standard controls, no connectors
Modern controls and themes: on
Enhanced component properties: on
Tested in Power Apps Studio 3.26094.9 on October 17, 2026
Version 0.3.1
Properties (34)
Read from the component's own YAML, so they always match what you paste.
Inputs
Property
Kind
Type
Default
Steps
The steps, in order: Title and Description.
Input
Table
Table(
{Title: "Your details", Description: "Name and team"},
{Title: "What you need", Description: "Items and dates"},
{Title: "Approver", Description: "Who signs it off"},
{Title: "Review", Description: "Check and submit"}
)
Type
Steps: a form or wizard in your colour. Project: project stages in the standard status colours, finished blue, the current stage green, amber or red for its Health, the rest grey. Approval: an approval chain, approved steps green, the current one amber, red when Health is Red.
Input
Text
"Steps"
Health
Project and Approval: the current stage's health. Green (on track), Amber (at risk) or Red (off track; in Approval, rejected).
Input
Text
"Green"
StatusText
Project and Approval: the words on the status pill. Leave it empty for On track, At risk, Off track or Complete; in Approval, Waiting for approval, Rejected or Approved.
Input
Text
""
DefaultStep
The step shown when the screen loads, from 1. In Project and Approval, one more than the number of steps shows them all finished.
Input
Number
1
Orientation
Horizontal, or Vertical for a narrow screen or a side panel.
Input
Text
"Horizontal"
ShowDescriptions
Shows each step's Description under its title.
Input
Boolean
true
ShowButtons
Shows Back and Next. Turn it off to use your own buttons with Back() and Next().
Input
Boolean
true
AllowJumpBack
Lets the user select an earlier step to go back to it.
Input
Boolean
true
BackText
The Back button's label.
Input
Text
"Back"
NextText
The Next button's label.
Input
Text
"Next"
FinishText
The Next button's label on the last step.
Input
Text
"Submit"
BlockedText
What it says when CanLeaveStep returns false.
Input
Text
"Complete this step to continue."
StepText
The progress line and each step's name for screen readers. {n} is the step and {total} the count.
Input
Text
"Step {n} of {total}"
DoneText
What screen readers add to a finished step.
Input
Text
"completed"
CurrentText
What screen readers add to the step the user is on.
Input
Text
"current step"
Look
Standard, or Premium: a card with a soft shadow, rounder corners, thicker lines, the current step's title in your colour and a thicker progress bar.
Input
Text
"Standard"
AccentColor
Your brand colour, for finished and current steps and the Next button.
Input
Color
RGBA(15, 108, 189, 1)
Theme
Light, or Dark for a dark screen.
Input
Text
"Light"
Motion
Plays short animations when the step changes: the current step's halo pops and a ring ripples out of it four times, then stays as a solid ring; a step you've just finished draws its check, and the progress bar slides to its new length. All of it ends within five seconds. None plays for people who've asked their device for reduced motion.
Input
Boolean
true
Outputs
Property
Kind
Type
Default
CurrentStep
The step the user is on, from 1. Show each step's content when this is its number.
Output
Number
—
StepCount
How many steps there are.
Output
Number
—
CurrentTitle
The title of the step the user is on.
Output
Text
—
IsFirst
True on the first step.
Output
Boolean
—
IsLast
True on the last step.
Output
Boolean
—
Progress
How far through, from 0 to 1: the steps finished out of all of them.
Output
Number
—
Status
Project and Approval: the status pill's words, such as At risk.
Output
Text
—
Input functions
Property
Kind
Type
Default
CanLeaveStep(Step)
Your check before the user moves on. Receives the step number and returns true when it's complete.
Step (Number): The step the user wants to leave.
InputFunction
Boolean
true
Events
Property
Kind
Type
Default
OnStepChange(NewStep, OldStep)
Runs when the user moves to another step, with Next, Back or an earlier step.
NewStep (Number): The step now shown.
OldStep (Number): The step the user left.
Event
—
false
OnFinish()
Runs when the user selects Next on the last step and CanLeaveStep allows it. Submit here.
Event
—
false
Actions
Property
Kind
Type
Default
GoToStep(StepNumber)
Shows a step. Going forward stops at the first step that CanLeaveStep doesn't allow.
StepNumber (Number): The step to show.
Action
—
—
Next()
Moves to the next step if CanLeaveStep allows it, as the Next button does (without finishing).
Action
—
—
Back()
Moves to the step before.
Action
—
—
Reset()
Goes back to DefaultStep and clears the blocked message.
Action
—
—
Guide
Use lcsStepper for a form split into steps: a request, an onboarding, a checklist. Or, with Type, to show where something is: a project's stage, an approval chain, a sales deal, an order. A plain row of labels shows where you are, but it doesn't stop anyone moving on with a step half done. This component:
Shows the steps and progress on a clean card: finished steps get a ✓ in your colour, the current one a solid circle with a soft halo, and the lines between them fill as you go. Under a divider, "Step 2 of 4" with a progress bar. Horizontal, or vertical for a narrow screen or side panel. Look"Premium" gives a card with a soft shadow, rounder corners, thicker lines, the current title in your colour and a thicker bar.
Checks before moving on. Write your own CanLeaveStep(Step) check: return false and Next stays on the step and says what's wrong ("Complete this step to continue."). GoToStep() stops at the first step that isn't complete, so no step is skipped.
Has Back and Next built in, with your own labels ("Submit" on the last step), or uses your buttons through Back() and Next().
Tracks a project or an approval with Type"Project" or "Approval", in the standard status colours, with a pill that says the status in words (see "Project stages, approvals and other trackers").
Lets people go back by selecting an earlier step.
Tells your app what happened: OnStepChange(NewStep, OldStep) and OnFinish().
Outputs the step, its title, whether it's the first or last, and the progress from 0 to 1.
The examples call it stpRequest on your screen.
Your steps:
powerfx
// stpRequest.Steps
Table(
{ Title: "Your details", Description: "Name and team" },
{ Title: "What you need", Description: "Items and dates" },
{ Title: "Approver", Description: "Who signs it off" },
{ Title: "Review", Description: "Check and submit" }
)
Show each step's content in its own container, below the stepper:
Set Type to show where something is rather than walk someone through a form. There's no official colour code for project phases; the colours follow the RAG status code most teams already report with, with blue for complete (BRAG):
Type
Finished
Current
To come
"Steps" (default)
Your colour, with ✓
Your colour
Grey
"Project"
Blue, with ✓
From Health: "Green" on track, "Amber" at risk, "Red" off track
Grey
"Approval"
Green, with ✓
Amber, waiting; red with ✕ when Health is "Red" (rejected)
Grey
A pill beside the progress names the current stage and its status, so it changes at each stage: "Execution · At risk", "Waiting on Finance", "Rejected at Finance". Put your own words in StatusText, and read the words from the Status output. Set DefaultStep one past the last step to show every step finished ("Complete", or "Approved").
powerfx
// stpProject.Type
"Project"
// stpProject.Steps
Table(
{ Title: "Initiation", Description: "Charter and sponsor" },
{ Title: "Planning", Description: "Scope, time, budget" },
{ Title: "Execution", Description: "Build and deliver" },
{ Title: "Monitoring", Description: "Track and control" },
{ Title: "Closure", Description: "Hand over, lessons" }
)
// stpProject.DefaultStep (the stage number in your data)
LookUp(Projects, ID = varProjectID).StageNumber
// stpProject.Health ("Green", "Amber" or "Red" in your data)
LookUp(Projects, ID = varProjectID).RAG
// stpProject.StepText
"Stage {n} of {total}"
To only show the stage, set ShowButtons and AllowJumpBack to false.
More uses, each a preset on this page:
An approval chain: Submitted, Manager, Finance, Director, with Type"Approval" and the times in Description.
A sales pipeline: Qualify, Develop, Propose, Close, with Type"Project" and the deal's health.
Order or delivery tracking: Placed, Packed, Shipped, Out for delivery, Delivered, with your own words in StatusText ("Arriving today").
Hiring, onboarding or a service ticket (New, In progress, Resolved, Closed): the same, with your stages.
Keep where someone stopped in a Whole number column, and open the request there:
powerfx
// stpRequest.DefaultStep
Coalesce(gblRequest.'Last Step', 1)
// stpRequest.OnStepChange: save it as they go
Patch(Requests, gblRequest, { 'Last Step': NewStep })
Take the steps from a choice column's values, so they follow its labels. Text gives a choice's label:
Each step says its title, its place and its state ("Approver, Step 3 of 4, current step"). Finished steps are buttons you can select to go back; later steps can't be selected.
Finished steps show a ✓ as well as the colour, and the current step a thicker ring and a bold title, so colour is never the only signal.
The message when a step isn't complete is shown in text, beside the buttons.
In "Project" and "Approval", the status is in words on the pill and in what screen readers hear ("Execution, Stage 3 of 5, current step, At risk"), and a rejected step shows ✕. On amber, the number is dark so it stays readable.
All the words are inputs, including what screen readers hear (StepText, DoneText, CurrentText), for your language.
The current step has a halo and a solid ring in its colour, so you can always see where you are.
With Motion on (the default), each change of step plays short animations: the current step's halo pops, a ring ripples out of it four times and then stays as the solid ring, a step you've just finished draws its ✓, and the progress bar slides to its new length. All of it ends within five seconds, so nothing keeps moving (WCAG 2.2.2). None plays for people who've asked their device for reduced motion, and Motion set to false shows each change at once.
Horizontal steps share the component's width. Keep titles short, or use Orientation"Vertical" when there are more than five steps or the screen is narrow.
Your content goes outside the component, in containers that show for each step.
The actions (GoToStep, Next, Back) don't run OnStepChange, because your app called them and already knows. Only the user's own selections run it.
CanLeaveStep runs for every step GoToStep passes, so keep it quick (no data calls in it).
Type and Health take the exact words shown: "Amber", not "amber".
The status colours are the standard ones and don't change; AccentColor still colours the focus ring and Next.
0.3.1: the guide's example reads a text input's Text, as Microsoft documents it (it said Value); the YAML is unchanged, so there's nothing new to paste-test.
0.3.0: the current step keeps a solid ring in its colour. With Motion, a ring ripples out of its halo four times after each change of step and then stays as that ring, all within five seconds; with Motion off or reduced motion, the ring is simply there.
0.2.0: motion when the step changes: the current step's halo pops with a ripple, a just-finished step draws its ✓, and the progress bar slides (skipped for reduced motion); a Motion input turns it off. With Motion off, it's exactly 0.1.0.
0.1.0: first version: horizontal and vertical, the CanLeaveStep check, Back and Next with a blocked message, going back to an earlier step, OnStepChange and OnFinish, and the GoToStep, Next, Back and Reset actions; Type"Project" and "Approval" with Health, StatusText and the Status output.
Did it work for you?
No ratings yet.Nobody has said it worked in their app yet.
Sign in to rate it or to say it worked in your app.
Comments
LowCodeStacks teamPinned
Welcome! Worth knowing: CanLeaveStep runs for every step GoToStep passes, so keep it quick, with no data calls in it.
Is yours a form wizard, project stages or an approval chain? Tell us how many steps you have and whether horizontal or vertical works better for you.