NewPower Apps · canvas componentNavigation and layout✓ Tested in StudioMIT License
Breadcrumbs
A trail from a table of keys and labels: every level but the current one a real button named with its level, long trails folded behind Show all; OnNavigate with the key and level, GoUp for a Back button, CurrentLabel for the title; light and dark, the current level in a tinted pill that pops in.
- Name in Studio
- lcsBreadcrumbs
- Version
- 0.1.0
- Properties
- 10 inputs · 6 outputs · 1 event · 3 actions
Variations
As it is when you paste it, with every input at its default.
CurrentLabel: Tasks · ParentKey: "atlas" · Count: 4 · IsCollapsed: false
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.
lcsBreadcrumbs_1.OnNavigate = Set(varPath, FirstN(varPath, Level)); Notify("Go to " & Label & " (level " & Level & ")")
btnBack.OnSelect = lcsBreadcrumbs_1.GoUp()
lblTitle.Text = lcsBreadcrumbs_1.CurrentLabel
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
- In Power Apps Studio, open Settings > Updates and check that Modern controls and themes and Enhanced component properties are on.
- Open the Components tab in the tree view and select New component.
- Select an empty part of Studio, so the new component isn't selected.
- Copy the YAML on this page and press Ctrl+V.
lcsBreadcrumbsappears with all its properties. - On a screen, insert it from Insert > Custom >
lcsBreadcrumbs.
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 November 2, 2026
- Version 0.1.0
Properties (20)
Read from the component's own YAML, so they always match what you paste.
| Property | Kind | Type | Default |
|---|---|---|---|
ItemsThe trail, root first, as a table with Key and Label columns, such as Table({Key: "home", Label: "Home"}, {Key: "orders", Label: "Orders"}). The last row is the current level. | Input | Table | Table({Key: "home", Label: "Home"}, {Key: "projects", Label: "Projects"}, {Key: "atlas", Label: "Atlas rollout"}, {Key: "tasks", Label: "Tasks"}) |
MaxVisibleHow many levels show before the middle collapses behind a Show all button: the first level, then the last ones. 0 never collapses. At most 8 levels show at a time, so a longer trail always collapses. | Input | Number | 4 |
MaxLevelWidthThe widest a level can be. Each level is as wide as its label; a longer label is cut, and the full label stays in its tooltip and its accessible name. | Input | Number | 220 |
SeparatorTextText between levels, such as / or ›. Empty draws a chevron. | Input | Text | "" |
ShowHomeIconShows a home icon before the first level's label. | Input | Boolean | false |
CurrentIsLinkLets the current level be selected too, such as to reload it. Off, it's text and screen readers hear current page. | Input | Boolean | false |
SizeThe text size of the levels. | Input | Number | 14 |
AccentColorYour brand colour, for the levels you can select, the current level's tinted pill and the focus ring. | Input | Color | RGBA(15, 108, 189, 1) |
ThemeLight, or Dark for a dark screen. | Input | Text | "Light" |
MotionThe current level's pill pops in when the trail changes. None plays for people who've asked their device for reduced motion. | Input | Boolean | true |
| Property | Kind | Type | Default |
|---|---|---|---|
CurrentKeyThe current level's Key: the last row of Items. | Output | Text | — |
CurrentLabelThe current level's Label, for a screen title. | Output | Text | — |
ParentKeyThe level above the current one, by Key; empty at the root. GoUp goes there. | Output | Text | — |
CountHow many levels the trail has. | Output | Number | — |
IsCollapsedTrue while the middle of a long trail is hidden behind Show all. | Output | Boolean | — |
TrailThe levels as shown, root first, with the Show all button where the trail is collapsed: Pos, Key, Label, IsEllipsis, IsCurrent, and each level's X and Width. | Output | Table | — |
| Property | Kind | Type | Default |
|---|---|---|---|
OnNavigate(Key, Label, Level)Runs in your app when a level is selected, with its key, label and position. Shorten your trail to that level and navigate there.
| Event | — | false |
| Property | Kind | Type | Default |
|---|---|---|---|
GoUp()Runs OnNavigate for the level above the current one, for a Back button. Does nothing at the root. | Action | — | — |
ShowAll()Shows every level of a collapsed trail, as the Show all button does. | Action | — | — |
Collapse()Hides the middle of a long trail again. The trail also collapses when the component is reset. | Action | — | — |
Guide
Use lcsBreadcrumbs wherever people go more than one level deep: a project, then its phase, then a task; a folder tree; a category, then a product. Canvas apps have no breadcrumb control, and the usual substitute is a label with the path in it, which can't be selected, isn't announced as navigation, and grows past the screen's edge on the fifth level. This component is the trail done properly:
- Levels from a table of
KeyandLabel, root first; the last row is where the person is now; - Every level but the current one is a real button, named "Projects, level 2 of 4" for a screen reader; the current level reads "current page";
- Long trails collapse: past
MaxVisiblelevels, the middle folds behind a "…" button that reads "Show all 6 levels"; OnNavigate(Key, Label, Level)when a level is selected,GoUp()for a Back button,CurrentLabelandParentKeyfor the rest of the screen;- A chevron between levels, or any text you give
SeparatorText; an optional home icon; your accent colour on the levels you can select.
The examples call it bcPath on a screen that shows one project's tasks.
Keep the trail in a variable your screens extend and shorten:
// Screen.OnVisible, arriving at a project's tasks
Set(varPath, Table({Key: "home", Label: "Home"}, {Key: "projects", Label: "Projects"}, {Key: varProject.ID, Label: varProject.Name}, {Key: "tasks", Label: "Tasks"}))
// bcPath.Items
varPath
Go to the level that was selected, and cut the trail there:
// bcPath.OnNavigate
Set(varPath, FirstN(varPath, Level));
Switch(
Level,
1, Navigate(scrHome),
2, Navigate(scrProjects),
3, Navigate(scrProject, ScreenTransition.None, {ID: Key})
)
A Back button that goes one level up, and the screen's title from the trail:
// btnBack.OnSelect
bcPath.GoUp()
// lblTitle.Text
bcPath.CurrentLabel
Show every level of a long trail from a link elsewhere on the screen:
// lnkShowAll.OnSelect
bcPath.ShowAll()
- Columns.
Itemswants exactlyKeyandLabel. From a Dataverse table, build the rows withShowColumnsandRenameColumns, or write them out as in Use it, which is usually clearer because each level comes from a different screen. - A parent lookup. A self-referencing table (a category with a parent category) gives you the trail by walking up:
LookUp(Categories, Category = varCurrent.'Parent category'.Category)for the parent, and again for the grandparent. Power Fx has no loop, so write the walk for the depth your data has (three or four levels is the usual limit of good design anyway), and give each row the record's GUID as itsKey. - Keys for
Navigate. Put the record's GUID inKeysoOnNavigatecan open the record's screen withLookUpand no second query for the name.
- The trail is a group named "Breadcrumb". Each level you can select is a button whose name is its label plus "level n of N"; the current level is text that reads "current page", unless
CurrentIsLinkmakes it selectable too. The Show all button reads how many levels it reveals. - Tab moves between the levels; Enter and Space select one. Separators and the home icon are decorative and skipped.
- The current level sits in a tinted pill and is bold as well as a different colour, and it's named "current page", so state is never colour alone.
- With
Motionon, the current level's pill pops in when the trail changes, in under a third of a second. None plays for people who've asked their device for reduced motion, andMotionoff shows it at once.
- Each level is as wide as its label, worked out from its length and
Size(Power Apps can't measure text), so a label with many wide or narrow letters can sit a little loose or tight.MaxLevelWidthcaps a level: a longer label is cut, and the full label stays in the tooltip and the accessible name. SetWidthto hold the levels you show. - At most eight levels show at a time; a longer trail always folds its middle behind Show all.
- Collapsing keeps the first level and the last
MaxVisible - 1; the hidden levels come back with Show all,ShowAll(), or when the trail shortens belowMaxVisible. A reset collapses it again. - The component doesn't navigate by itself:
OnNavigatetells your app which level was chosen, and your app shortens the trail and changes screen, so the trail is always what your app says it is.
- 0.1.0: first version: levels from a table, buttons named with their level, Show all for long trails, chevron or text separators, the home icon,
OnNavigate,GoUp,ShowAll,Collapse, the outputs, light and dark, the current level's pill.
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
No comments yet. Share how you used it, or ask something.
Sign in to comment or reply. Comments show under a display name you choose, never your email.