Power Apps Bible — Consolidated Database
Every reference document in this repo, concatenated onto one page in reading order, so any future session — human or AI — can fetch this single URL and have the entire accumulated Power Apps knowledge base for this project family, instead of guessing which of 16 separate files to check. Each section is tagged with its source filename — edit that file directly, then re-run the consolidation build to republish this page.
Contents (in order below)
- Overview & Entry Point
powerapps-bible.md - Known Bad Patterns
known-bad-patterns.md - Verified Control Reference
verified-control-reference.md - Control Defaults (Fresh-Control Lab)
powerapps-control-defaults.md - External Research: ChatGPT Property Matrix (context + precedence rule)
external-research-notes.md - ChatGPT Control Property Matrix (2026-07-05, docs-derived, unverified)
external/powerapps_canvas_control_bible_v0_1.md - Live Build Lessons
live-build-lessons.md - Real Build Quirks
real-build-quirks.md - UI Patterns
ui-patterns.md - Power Fx Patterns
powerfx-patterns.md - SharePoint & Office365Users
sharepoint-office365users.md - YAML Validation Checklist
yaml-validation-checklist.md - Builder System
builder-system.md - Project Repo Workflow
project-repo-workflow.md - Guide Authoring Rules
guide-authoring-rules.md - Output Format
output-format.md - Future Guide Template
future-guide-template.md - Reference Pack README
README.md
Overview & Entry Point
PowerApps Bible
Last checked: 2026-06-20
This is the entry point for the local Power Apps knowledge base.
Layers
- Microsoft source mirror under
.sources/ powerapps-docspower-platform- Not published to GitHub Pages.
-
Updated with
tools/update-msdocs.sh. -
Search index under
.cache/powerapps-bible.sqlite - Built with
python3 tools/index-msdocs.py --rebuild. -
Queried with
python3 tools/index-msdocs.py "Combo box ItemDisplayText". -
Curated local reference pack under
reference/ - Human-friendly rules.
- Real build quirks from the Training Tracker app.
- Lab-derived fresh-control defaults from the live Power Apps editor.
- Corrections discovered while building future guides.
-
external/powerappsui/— pre-built copy-paste component YAML (MIT-licensed, from powerappsui.com) plus original condensed notes per component. Check here before building a data table, KPI cards, sidebar, stepper, etc. from scratch. -
Audit tooling under
tools/ - Blocks known bad guide patterns before publishing.
Non-Negotiable Accuracy Rule
Do not write guide instructions from memory when the property, connector field, or formula behavior is risky. Search the local Microsoft docs mirror and the curated reference pack first. If the answer is not present, verify with current Microsoft Learn or live Power Apps behavior, then add the result to the curated reference pack.
Reference Pack Reading Order
For building a new app from scratch:
1. builder-system.md — requirements gathering, naming conventions, YAML generation rules, Patch templates, publishing workflow
2. real-build-quirks.md — live editor confirmed quirks
3. live-build-lessons.md — lessons from Training Tracker GitHub issues (bugs diagnosed and fixed in production)
4. ui-patterns.md — reusable YAML patterns (panels, tab nav, error borders, pill galleries, status colours)
5. verified-control-reference.md — exact property lists per control
6. external/powerappsui/README.md — pre-built component library (data table, KPI cards, charts, sidebar, stepper, dialog, etc.) — check before hand-building a UI pattern this already covers
7. powerfx-patterns.md — formula reference
8. known-bad-patterns.md — patterns that must never appear
9. sharepoint-office365users.md — SharePoint list and connector patterns
Real Build Quirks To Preserve
- SharePoint list names with spaces must be wrapped in single quotes, for example
'TT Personnel'. - Layer order matters: background/card/panel/gallery-row controls must sit behind the controls they support.
- Temporary red-line formula errors must be called out when a later control, collection, or variable resolves them.
- Property tables should distinguish required changes from default/safety-check values.
- Use
powerapps-control-defaults.mdbefore adding visual/default property lists to guide rows. - Sort order must use full enum names, for example
SortOrder.Ascending, not bareAscending. - Modern Combo box hint text uses
InputTextPlaceholder, notPlaceholder. - Modern Combo box display text must be explicit with
ItemDisplayText. - In the Training Tracker day-filtering formulas, preserve the exact working day-unit spelling from the live editor. If the app accepted
"Days"and rejected bareDays, do not normalize it away. - Modern Toggle state is handled with
Checkedin this guide family. - Office365Users connector casing differs by operation. Preserve the exact field casing used by the verified operation.
Common Searches
python3 tools/index-msdocs.py "Combo box ItemDisplayText"
python3 tools/index-msdocs.py "Text input Placeholder"
python3 tools/index-msdocs.py "SortOrder.Ascending"
python3 tools/index-msdocs.py "Office365Users SearchUserV2"
python3 tools/index-msdocs.py "DateDiff TimeUnit Days"
python3 tools/index-msdocs.py "Patch SharePoint choice Value"
python3 tools/index-msdocs.py "ModernCombobox fresh-control defaults"
Start Here For Quirks
Read real-build-quirks.md before changing formulas or control rows in Training Tracker.
Refresh Lab Defaults
If the user exports a new untouched defaults lab, copy it into .sources/default-lab/ and run:
python3 tools/generate-control-defaults.py
python3 tools/index-msdocs.py --rebuild
Known Bad Patterns
Known Bad Patterns
Last checked: 2026-07-08
These are mistakes that must not reappear in this guide family.
Read this before generalizing any entry below into "avoid this whole control." Every entry here documents ONE specific broken property or pattern on a control, not a blanket verdict on the control itself. A control having one confirmed bug is not evidence that a different symptom on that same control shares the same root cause. Before recommending a full control swap because "this control is already known to be broken," re-check that the specific property causing the current symptom is the same one named in the entry — if it isn't, diagnose the new symptom fresh, don't reach for the existing fix. (This rule exists because a full ModernDatePicker swap got recommended for a one-character Format string bug, off the back of an entry below about a completely unrelated SelectedDate bug on the same control — see feedback_minimal_fix_before_destructive in memory.)
Blacklisted Controls — Do Not Use, In Any Project
Copilot answer (preview)modern control. User directive 2026-07-05: do not propose, verify, or insert this control anywhere, in any Power Apps project across this whole family — not a "low priority, verify later" item, an outright blacklist. Reason given: likely government/organisational cost or licensing tier attached to AI/Copilot features at work. Do not suggest it as an option even when a feature genuinely sounds like a good fit for it.Headermodern control (ModernHeader). Verified 2026-07-05 against Microsoft's own docs: "Unsupported capabilities: Customization of colors, App navigation." It only exposesTitle/Logo/IsProfilePictureVisible— no way to add custom action buttons (Save/Close/Delete etc.) or nav links. Cannot replace a hand-built action-bar top bar. Don't propose it for that purpose again.Cardmodern control (ModernCard@1.0.0). Verified 2026-07-05: fixed, non-composable template (Title/Subtitle/Description/Image+ a singleOnSelectfor the whole card). Does not support layering independent action buttons (edit/delete icons, "Open in App") on top of a full-card click target — the pattern every link/dashboard card in this app family actually needs. Don't propose it as a replacement for hand-built card patterns.ModernTabList(TabListCanvas) / Tabs modern control. User directive 2026-07-06: blacklisted, do not use in any project. Confirmed broken even by Microsoft's own standard — pasting Microsoft's own published example markup for this control straight from their docs into the browser editor throws errors, it's not a Policy Tracker-specific formula mistake. Don't propose it as a segmented-tab/filter replacement for hand-built tab rows.
Control Properties
-
GroupContainer@1.5.0(bothManualLayoutandAutoLayoutvariants) hasDropShadowON by default when the property is left unset. Not a visible/obvious default — you have to explicitly writeDropShadow: =DropShadow.Noneon every single container to turn it off, or every card/row/panel in a whole screen gets an unwanted shadow. Confirmed the hard way on Policy TrackerViewItem_1: every container across the whole screen had a stray drop shadow because this was never set, and it had to be manually stripped from each one after the fact. Always setDropShadow: =DropShadow.Noneexplicitly on everyGroupContainerunless a shadow is actually wanted for that specific one (e.g. a modal card popping over a dimmed background) — never rely on the unset/default state being "no shadow." -
Modern Combo box with
Placeholder. UseInputTextPlaceholder. - Modern Combo box with record-shaped
Itemsand no explicitItemDisplayText. Use the field that exists inItems, for exampleThisItem.DisplayNamefor Office365Users search rows. ModernComboboxdropdown panel renders as an empty/"ghost" outline with no list content — after ruling out every formula-level cause. Confirmed on Policy TrackerViewItem_1'scmb_Owner1: the three invalid properties documented above (FontWeight: ="",Appearance.FilledLighter,AllowExternalSelectedItems) were fixed,DefaultSelectedItemscorrectly pre-selected a real value, and theItemsformula (Office365Users.SearchUserV2({...isSearchTermRequired: false...}).value) already matched every commonly-documented working pattern — yet the dropdown list still opened empty and typing did nothing. This is a Microsoft-acknowledged platform limitation, not a fixable formula bug: on an official Power Platform community thread about a Modern dropdown-family control going blank, a Microsoft employee's own reply states verbatim: "Modern controls are not that stable, it displays blank dropdown menu from time to time." Do not keep iterating on ModernCombobox formulas/properties once the above are ruled out — revert to the ClassicComboBox@0.0.51control instead. That control is not visually "classic-ugly" by default — it supportsBorderRadius(rounded corners) andAppearance: ='ComboboxCanvas.Appearance'.FilledLighter, so it can be styled to match a modern design without the ModernCombobox instability. It needsComboBoxDataField@1.5.0children (set via the Data/"Edit fields" panel, not hand-typed) to define which fields — e.g.DisplayName,Mail— are searchable/displayed, whichModernComboboxdoesn't require (ItemDisplayTextreplaces that need on the Modern version). 2026-07-05.ModernCombobox(ComboboxCanvas) completely unresponsive — can't type in the search box, dropdown arrow does nothing, looks present but dead. Checked against Microsoft's current official docs property-by-property (not a guess) and found three invalid values causing it:FontWeight: =""(onlyFontWeight.Bold/Semibold/Normal/Lighterare valid — bare""isn't a real enum value and can stop the control initializing at all),Appearance: =Appearance.FilledLighter(not a real enum member — onlyAppearance.Filled,Appearance.FilledDarker,Appearance.Outlineexist), andAllowExternalSelectedItems(not a documented property of this control at all). Fix: deleteFontWeightandAllowExternalSelectedItemsentirely (or setFontWeightto a real enum value), and changeAppearancetoAppearance.Filledor.FilledDarker. Also confirmed while investigating: this control's oldTriggerOutputproperty was renamed toDelayOutputin a recent Microsoft update (TriggerOutput = "FocusOut"→DelayOutput = true) — if a paste still hasTriggerOutput, that's stale, not the unresponsiveness cause itself. Policy TrackerViewItem_1'scmb_Owner1, 2026-07-05.- Modern Text input with
HintText. UsePlaceholder. - Modern Toggle read as
.Value. Use.Checked. - Modern Toggle caption set with
Text. UseLabel. - Modern Toggle initial state set with
Defaultin this guide family. UseChecked. - Multi-select Combo box preselection with
Default. UseDefaultSelectedItems. - Modern Dropdown with table-shaped
Itemsbut no explicitItemDisplayText. ModernDropdown.Defaultbuilt as a hand-constructedWith({_v: ...}, {Value: _v})literal record — no visible pre-selection on load, even with a real matching value and no PA2108 error. This is the documented fix for the Value/Value1 collision (see the entry below), and it avoids the paste-time error, but the resulting bare{Value: "..."}record apparently isn't always recognized as "the selected item" by the control at render time — the dropdown just shows blank/placeholder despite a legitimate underlying value. Confirmed: Policy TrackerViewItem_1'sradApproval1("Approved For Release By") showed empty on a record that genuinely had an approver set. Fix: useLookUp(Items, Value = targetValue)instead of constructing the record by hand — e.g.Default: =LookUp(Choices('List'.'Field'), Value = Coalesce(varRecord.'Field'.Value, "fallback")). This returns the actual matching row object fromItems, guaranteeing structural equality rather than a look-alike literal. 2026-07-05.- Escalates to a hard paste-time error (not just a silent blank), specifically when
Itemsis a manually-built collection from an inline scalar array (e.g.ClearCollect(colOptions, ["A", "B", "C"]), done to dodge the Value/Value1 duplicate-literal collision — see the entry below). In that case a hand-constructedDefault: ={Value: "A"}or a raw source field passed straight through (Default: =ThisItem.ChoiceField, or even.ChoiceField.Value) both throw "invalid formula, expected a value compatible with Items" at paste time, and anyOnSelecthandler reading.Selected.Valuefrom that broken dropdown then throws a second, confusing downstream error (Patchfailing with "incompatible type... expects a text type, and you're using an error type") — the second error is just the broken dropdown'sSelectedpropagating as an error type into whatever consumes it, not a separate bug. The array-literal's column type isn't structurally identical to a hand-built record even though both look like{Value: Text}— same underlying cause as the blank-on-load symptom above, just a stricter failure. Fix is the same trick, applied on both sides:Default: =LookUp(colOptions, Value = ThisItem.ChoiceField.Value)(or= "A"for a fixed default) — always deriveDefaultfrom a row pulled out of the exact same collectionItemspoints at, never a value passed straight from the data source and never a hand-typed record literal, even whenItemsitself is just a local collection you built. Confirmed live: Branch Contact GroupsscrManageGroups,drpEditThursdayBatch/drpNewThursdayBatchagainstcolThursdayBatchOptions, 2026-07-24. - Modern Dropdown
Defaultset as a plain string. Must be a record:{Value: “...”}. A plain string causes the dropdown to appear blank on load. - Any property copied from a similar control without checking that control's Microsoft Learn page.
SizeonToggle@1.1.5. Toggle does not expose font-size. Confirmed PA2108 in live editor 2026-06-20.FontWeightonModernButton@1.0.0. Modern Button does not expose FontWeight. Confirmed by cross-check against user's working Screens.txt (which uses BasePaletteColor, Color, Size but never FontWeight) 2026-06-20.- Radius properties (
RadiusTopLeft,RadiusTopRight,RadiusBottomLeft,RadiusBottomRight) onLabel@2.5.1ORRectangle@2.3.0— neither exposes them. Confirmed PA2108 twice: Label 2026-06-23, and again on both Label and Rectangle 2026-07-04 (Policy Tracker Main_1 issue #7 — repeated the exact same mistake the Bible already documented, on nine separate controls in one file, because the file wasn't re-checked before writing). Verified alternatives, both confirmed real:Classic/Button@2.2.0(DisplayMode: =DisplayMode.View,Text: ="", radius on the button itself — the original documented fix, best for pure shapes/dots with no text) orModernText@1.0.0(supportsRadiusTopLeftetc. natively per Microsoft's modern-control docs, and already used live in this exact app'sMain.yamlfor pill-style badges — best when the element is text-bearing, e.g. a coloured pill label). Before writing ANY new screen YAML with rounded corners on something that looks like a Label or Rectangle, grep this exact rule first — don't re-derive it from scratch or guess. - Light or pastel
BasePaletteColoronModernButton. Fluent 2 overrides it with a dark fill. Use dark, saturated colours only. - Conditional
BasePaletteColoronModernButton(e.g.If(varTab="X", lightColour, darkColour)). The light state always renders dark. Use Classic Button for any conditional colour states. Coloroverride on aModernButtonto compensate for a wrongBasePaletteColor. Pick a darker seed instead.- Trying to match an exact brand hex on a
ModernButton. Work with Fluent 2 — pick the closest dark seed and let the framework derive the final shade. Text: =(bare, nothing after the equals) in YAML. Must beText: =””.- Bare
PropName: =(nothing after the equals) is not unique toText— it breaks the same way on ANY property, and it recurs on third-party/external component YAML, not just hand-authored screens. Confirmed 2026-07-25 auditing 23 components pasted from powerappsui.com: 13 of 23 files had at least one bareDefault: =on a component'sPropertyKind: Eventcustom-property definition (e.g.OnBarClick,OnSave,OnRowSelect), 2 files had a bareOnSelect: =on an actualGallery@2.15.0control instance, and several had bareLayoutMaxHeight/LayoutMaxWidth/Height/Widthon real controls. A generic YAML parser (PyYAML) chokes on all of these withcould not determine a constructor for the tag 'tag:yaml.org,2002:value'— a bare=is YAML 1.1's reserved "default value" tag, not a normal scalar — so this is a genuine syntax defect, not just a Power Apps quirk, and it will very likely fail paste in Studio the same wayText: =does. Before trusting any pasted-in component YAML (from a library, a doc site, an export, anything not hand-typed against this Bible), grep it for: =\s*$(property name, colon, equals, then nothing) across every property, not justText. Fix depends on the property: EventDefault→=false(inert placeholder, Events don't need a meaningful default); a real behavior formula likeOnSelecton a control instance →=false(no-op) or the actual intended formula if recoverable; a sizing property (Width/Height/LayoutMaxWidth/LayoutMaxHeight) → check whetherAlignInContainer: =AlignInContainer.StretchorAutoHeight: =truealready governs that axis (if so, just delete the bare property, it's redundant) — otherwise DO NOT guess a pixel number; deleting the property (letting the axis go uncapped/unset) is safer than fabricating a value, since omission is normally a valid, common state for these properties elsewhere in the same file. Full detail:external/powerappsui/README.mdand each affected component's own "Bible Audit" section. LayoutOverflowYon a ManualLayout GroupContainer causes PA2108 (“Unknown property 'LayoutOverflowY' for control type 'GroupContainer@1.5.0' and variant 'ManualLayout'”).LayoutOverflowYis only valid onVariant: AutoLayoutcontainers. If you need a scrollable region in a ManualLayout screen, wrap the scrollable content in an inner AutoLayout GroupContainer withLayoutDirection: VerticalandLayoutOverflowY: =LayoutOverflow.Scroll. Confirmed: ViewItem V2.1 conForm (495,13).- Any YAML property value that contains
:(colon-space) must use a|-block scalar. If a formula like=UpdateContext({locFoo: true})is written inline, YAML parses the{locFoo: true}as a mapping and throwsYamlInvalidSyntax: While scanning a plain scalar value, found invalid mapping. This applies to any inline formula containing{key: value}, record literals, or any colon-space sequence. Always use|-for these. Confirmed: ViewItem V2.1,OnSelect: =UpdateContext({locDisplayDeletePopUp: true})at (363,66). HtmlText(and any non-event-handler property) with inline CSS or other:in the string literal.|-is NOT allowed onHtmlText(PA1001) — so the|-rule above cannot apply. Instead, wrap the entire YAML value in single quotes and escape any literal single quotes inside by doubling them (''). Example:HtmlText: '="<div style=""border: 1px solid red;"">..."'where a'Open Sans'font reference becomes''Open Sans''. The YAML parser then treats the content as a quoted scalar and never sees the:as a mapping separator. Confirmed: ViewItem V3.5,HtmlTextwith CSS properties (border: 1px,padding: 14px,font-family: 'Open Sans') at (1205,56).%QUALIFIED_DATACARD_FIELD_VALUE.ID%in a Form cardDefault. This is a broken placeholder — replace with the actual field expression, e.g.ThisItem.DateCompleted.- YAML properties on a control generated from the guide's intent without running an audit against
verified-control-reference.md. Always audit before publishing. FillPortions: =1(or any value >0) on a fixed-height container inside aVariant: AutoLayoutparent — the "Flexible height" toggle in the property panel. A child withFillPortions > 0grows to claim a share of the parent's remaining main-axis space, ignoring its ownHeightproperty entirely — this is the AutoLayout equivalent of CSS flex-grow, not a hint. Confirmed: Policy TrackerViewItem_1—conTopBar1,conWarningBar1,conCompactStepper1and other fixed-height (64/64/44px) containers rendered many times taller than authored because "Flexible height" was ticked (FillPortions: =1) instead of off (FillPortions: =0). Symptom: a ManualLayout or AutoLayout container with an explicitHeightrenders drastically oversized when placed inside a verticalAutoLayoutstack, while sibling containers with actualFillPortions: =1correctly expand to fill remaining space. Fix: setFillPortions: =0(or omit the property, if0is the default in this control version) on every container that must hold to its authored fixedHeight; reserveFillPortions: =1+ only for the one container genuinely meant to stretch and fill the leftover space (e.g. a scrollable body region below a fixed header). Do not confuse this withAlignInContainer: Stretch— that only affects cross-axis sizing (width, in a vertical layout) and was tried first as a fix here; it didn't address the actual bug, which was the main-axis (height)FillPortionssetting. CheckFillPortionsbeforeAlignInContainerwhen a container renders the wrong height in an AutoLayout stack. 2026-07-05.
Power Fx
ScreenTransition.Back. UseBack()or a validScreenTransitionenum.- Strict
= falsechecks on SharePoint Yes/No fields inside filters can exclude blank/unticked rows. Confirmed live on Policy TrackerNewsletterPack, 2026-08-13: two newsletter items had the right Thursday date, real ACOS approval, andPublished = false, but did not entercolNewsletterPackbecause the consultation Yes/No field failed the strict check'External consultation required' = false. The business rule was still correct — consultation-ticked items must stay out — but the formula needed to treat blank as unticked. UseCoalesce('External consultation required', false) = falsefor SharePoint Yes/No gates where blank should count as false. Do not "fix" this by removing the gate unless the user explicitly changes the business rule. - Relying on
Navigate()ordering to prevent one-frame UI flashes while clearing old-screen state. Confirmed live on Policy TrackerViewItem, 2026-08-13: movingNavigate(Main, ...)beforeSet(varSelectPolicy, "Empty")inbtnClose1.OnSelectdid not stop the amber 10-day warning banner flashing, because Power Apps can still evaluate the old screen while statements afterNavigate()run. Fix: add an explicit close/navigation guard such asvarClosingViewItem; set ittruebefore clearing state or navigating on every close/discard path; add!Coalesce(varClosingViewItem, false)to any warning/header visibility formulas that must stay stable during exit; reset the guard in the destination/opening screen'sOnVisible. Do not treat statement order aroundNavigate()as a visual synchronization guarantee. - Immediate
Navigate(...)guard inside a screen's ownOnVisible. Confirmed on Training TrackerscrAdminDash, 2026-07-29:If(!varIsAdmin, Navigate(scrMyTraining, ScreenTransition.None));inscrAdminDash.OnVisibleproduced Studio's error thatNavigatecannot be used there because it would automatically always navigate away from the screen. Fix: remove the immediateOnVisiblenavigation line and guard the entry point instead, for example make the Admin button visible only whenvarIsAdminis true. If a fallback redirect is still needed, use a delayed pattern only after testing in the live editor. Set(varName, Blank())as the only or first-encountered assignment for a global variable. ThrowsNo type found for variable 'varName'. Ensure that it is Set to a non-Blank value somewhere in the app— even if the same variable genuinely is set to a real typed value elsewhere (e.g.Set(varName, someTextExpression)). Power Fx's type inference isn't reliably finding the typed assignment first. Fix: replaceBlank()with a properly-typed empty value that matches the real assignment —""for Text, notBlank(), at every call site for that variable (reset/clear points, not just the first one). Confirmed: Policy TrackerViewItem_1'svarLinkDisplayNamePrefill(also set tovarFileName, a Text value, elsewhere) — 6 separateSet(..., Blank())call sites all needed changing toSet(..., ""). 2026-07-05.Char(n)wherenis outside 1–255. Power Fx'sChar()maps to the legacy single-byte/ANSI range only — it is NOT a full-UnicodeString.fromCharCodeequivalent, despite looking like one. Throws the runtime errorThe first argument to the 'Char' function must be between 1 and 255.for any codepoint above that, including extremely common ones like•(U+2022 = 8226),◦(U+9702... actually U+25E6 = 9702 decimal), and→(U+2192 = 8594). Confirmed live on Policy TrackerNewsletterPack's Thursday Batch email buttons, 2026-08-15 —Char(8226)/Char(9702)/Char(8594)used for bullet/arrow characters in an HTML email body all threw this error at click time (Layer A/payaml-validatedoes NOT catch this — it's a runtime-only error, not a paste-time syntax error). Fix: for any character above codepoint 255, embed the literal Unicode character directly in the Power Fx string literal instead of callingChar()— string literals support raw Unicode natively, no function needed ("Westminster → Resource Centre"not"Westminster " & Char(8594) & " Resource Centre").Char()is only appropriate for genuine low-range control/ASCII characters likeChar(10)(linefeed).- Editing a formula in Studio does not re-run it.
OnVisible,App.OnStart, and similar lifecycle formulas only execute when their trigger condition actually happens (screen navigation, app start) — pasting a corrected formula over an old one does not retroactively re-execute it or rebuild any variables it sets. If a bug lived insideOnVisibleand got fixed, any variable thatOnVisibleset is still holding the OLD broken value until the screen is genuinely revisited (navigate away and back) or — safest — a full Preview restart (Esc out, Play again). Confirmed recurring pattern: Branch Contact Groups'varIsMaintainer(2026-07-24) and Policy TrackerNewsletterPack'svarNewsletterBodyLead/varNewsletterBodyStatic(2026-08-15, theChar()fix above) both produced "I pasted the fix but I'm still getting the same error" reports that were actually stale session state, not a bad fix. When a user reports a fix "not working" right after pasting it, ask whether they did a full Preview restart before assuming the fix itself is wrong — especially for anything living inOnVisible/OnStartor a Refresh-button formula that duplicates it. - Bare
AscendingorDescending. UseSortOrder.AscendingorSortOrder.Descending. - Bare
Days,Months,Yearsetc. orTimeUnit.Daysas the unit argument toDateAdd/DateDiff. Always use quoted strings:”Days”,”Months”,”Years”. Confirmed broken in live builds (Training Tracker + Policy Tracker + Branch Contact Groups — recurred here despite already being documented, so double-check this specific rule every timeDateDiff/DateAddis written, not just on first use). - Schema-less
[]where Power Apps must infer collection shape. AddColumns(table, "ColumnName", formula)with a quoted string for the new column name argument. The column name must be a bare identifier:AddColumns(table, ColumnName, formula). This rule applies only to the column name — other string arguments in the same formula (e.g."Days"inDateAdd) remain quoted as normal. Confirmed in Overview build. The same rule applies toGroupBy(table, "ColName", "GroupColName")— both column-name arguments must be bare identifiers too (GroupBy(table, ColName, GroupColName)). Confirmed broken in Branch Contact Groups (colPeoplebuild, Thursday-batch grouping) — quoting them didn't error at paste time, it silently produced a table without the expected field names, breaking every downstream reference with "Name isn't recognized"/"Email isn't recognized" style errors far from the actual bug. 2026-07-23.LookUp(table, condition1, condition2)with more than one comma-separated condition. UnlikeFilter,LookUp's signature isLookUp(Table, Formula, [ResultColumnOrReducerFormula])— a second comma-separated argument is NOT ANDed with the first, it's evaluated as the ResultColumn/reducer formula for the matched row. If that second argument is itself a boolean comparison (e.g.Lower(Email) = Lower(varEmail)),LookUpreturns a Boolean, not the matched record — silently, with no error at theLookUpcall site itself. The error only surfaces later, at every place the caller tries to treat the result as a record (.Titleon it throws "The dot operator cannot be used on Boolean values"; passing it toRemove()/Patch()throws "cannot use a non-record value in this context" / "incompatible type"). Fix: combine all conditions into one predicate with&&—LookUp(table, condition1 && condition2). Confirmed in Branch Contact GroupsscrManagePeopleSave-changes handler (existingvariable). 2026-07-23.- Gallery row index formulas. Use
ThisItem.ItemIndex— it shifts when the gallery filters or sorts. ThisItem.IDinside collection-backed galleries unless the collection explicitly containsID.Switch()/If()used inside aFilter()'s predicate against a SharePoint data source — silently breaks delegation and gives wrong/inconsistent results, even though the identical set of conditions works fine whenSwitchinstead picks between whole separateFilter()calls. This app's ownHeaderGallery.Itemsalready does it the safe way (Switch(varSelectedState, "Current", Sort(...Filter('Policy Proof Tracker', conditionA)...), "Future", Sort(...Filter(..., conditionB)...), ...)— one plain-booleanFilterper branch,Switchonly ever chooses which whole expression to run). A per-chip live-count formula instead putSwitch(varSelectedState, "Current", condA, "Future", condB, ...) && ownerCond && typeCondas the single predicate passed to oneFilter()call — same conditions, wrong shape. Confirmed live on Policy TrackerMain: chip counts summed to 25 with the "Issues" tab selected, while that tab's own real item count was 0, which is only possible if the count formula wasn't actually gating on the tab at all. Fix: never nestSwitch/Ifinside a singleFilter's predicate against a delegable data source — expand it inline as(state = "X" && condA) || (state = "Y" && condB) || ...instead, matching the shape every other workingFilterin this app already uses. 2026-07-06.- Nested formulas that rely on ambiguous
ThisItem; capture the row withWithor useAsaliases. - Referencing an outer
AddColumnsrow identifier (e.g.ValuefromSequence) inside a nestedFilterpredicate. InsideFilter(innerTable, predicate), the predicate is evaluated withinnerTable's row scope. IfinnerTabledoesn't have aValuecolumn the identifier falls through, but if there's any ambiguity PowerApps resolves it to blank — makingDateAdd(varBase, (Value-1)*7, "Days")evaluate to the same date for every row. Always useWithto capture outer-scope identifiers before entering the Filter:With({weekDate: DateAdd(varBase, (Value-1)*7, "Days")}, Filter(innerTable, DateField = weekDate)). Confirmed: all 4 Overview columns showed identical data becauseValueinside the nested Filter was blank, computing the same date for all 4 columns. 2026-06-25. - A nested Gallery's
Itemsproperty cannot evaluate the outer gallery'sThisItem. TheItemsformula of a child gallery is evaluated at screen scope, not template scope — soThisItem.ColumningalWeekItems.Itemsis always blank regardless of whether the gallery is inside a GroupContainer or a direct child. Labels and other non-gallery controls DO correctly resolveThisItemin their properties. The correct pattern: pre-compute the inner data as a column in the outer gallery'sItemsformula usingAddColumns, then set the inner gallery'sItems = ThisItem.PreComputedColumn. This is the same pattern asgalHeaders → ThisItem.GroupedItemsin Main.yaml. Always collect the source data into a local collection first (ClearCollect(colName, Filter(...))) so theFilterinsideAddColumnsruns client-side. Confirmed: all four failure modes tested in Policy Tracker Overview 2026-06-24/25. - Bare
DisplayMode=View. UseDisplayMode=DisplayMode.Viewor set the property value toDisplayMode.View. DisplayMode: =DisplayMode.Viewon aClassic/Buttonthat also has a realOnSelect— no paste-time error, no visual clue, the tap just silently does nothing. Per Microsoft's own docs, View mode means the control "cannot... otherwise interact with it" — for a Button that disables the click entirely, not just its hover/pressed styling. This app family has a long-standing convention of settingDisplayMode.Viewon invisible/decorative Buttons used as tap-target overlays or coloured backgrounds (to suppress the default blue hover/press flash) — that's fine and correct for controls with noOnSelect(recCardFrame,recHeader,recCreatePanelBg, etc.), but it silently kills the control for the ones that DO haveOnSelect. Confirmed live 2026-07-24 on Branch Contact Groups:recResultTap(GAL search result row — user reported "clicking on it does nothing"), plus 3 more found by grepping the same pattern before the user hit them one at a time:recCheckBox(scrSendEmail),recPersonRowFrame(scrManagePeople), andrecLightboxBackdropon all three screens (click-outside-to-close). Fix: never combineDisplayMode: =DisplayMode.ViewwithOnSelecton the same Button — just omit theDisplayModeline entirely;Fill/HoverFill/PressedFillalone already give full control over the visual appearance without disabling the tap. Before shipping any new invisible-overlay-button pattern, grep the screen forDisplayMode.ViewandOnSelectboth appearing on the same control — this is exactly the kind of bug that hides for a long time because it never throws an error and the control still renders correctly, it just doesn't respond to the one interaction that matters.- Correction, 2026-07-24 same incident,
recResultTap/recRowFrame: a follow-up scrub can still miss one if theOnSelectwas added to the control after the original scrub ran (which is exactly what happened here —recRowFramehad noOnSelectat scrub time, so the grep for "View + OnSelect" didn't catch it;OnSelectwas added in a later pass without re-checking for a leftoverDisplayMode.View). Whenever adding a newOnSelectto an existing control, always check/remove any pre-existingDisplayMode.Viewon it in the same edit — don't treat "add OnSelect" and "remove stale DisplayMode" as two separate, independently-forgettable steps. - A lightbox's backdrop/panel Buttons declared AFTER their own content controls in the children list — the panel's opaque Fill renders in front of everything, so the lightbox appears completely empty (just the title and close icon, if those happen to be declared even later than the panel). Z-order in this app's YAML is simple list order — later children render in front of earlier ones — so a lightbox's
recLightboxBackdrop/recLightboxPanelmust be declared BEFORE all of that lightbox's content controls, not after. Confirmed live 2026-07-24 on Branch Contact GroupsscrManagePeople: the backdrop/panel/title/close block sat near the very end of the children list (after Add Person, Edit Person, and Purge fields), so every one of those fields was hidden behind the opaque white panel — only the title and close icon (declared even later, so in front of the panel too) were visible. This was a pre-existing bug from before that day's changes, not introduced by whatever was being added at the time — it simply hadn't been exercised/noticed yet.scrManageGroupsandscrSendEmailalready had the correct order (backdrop/panel/title/close declared first, all content after) from the start, which is why they never showed this symptom. When building or auditing any lightbox, check thatrecLightboxBackdrop/recLightboxPanelare the FIRST children declared for that lightbox, not the last — an empty-looking lightbox (title/close visible, everything else blank) is the exact signature of this bug. - A row's click-catcher Button sitting in front of its own text Labels, with a real (non-transparent)
HoverFillset for a hover highlight — the text visibly disappears on hover, replaced by a solid-coloured rectangle. If a Button needs to both catch clicks (so it must sit in front of overlapping Labels, per the entry below) and show a hover highlight, combining both jobs into one control is a trap: its opaqueHoverFillrenders on top of the Labels the instant the mouse moves over it, since it's in front of them. This isn't a colour-contrast problem — the text isn't just hard to read, it's fully covered. Confirmed live 2026-07-24 on Branch Contact Groups:recResultTap(GAL search result row, scrManageGroups) hadHoverFill: =RGBA(233,241,246,1)and sat afterlblResultName/lblResultEmailin the children list (i.e. in front of them) — hovering any result row made its name and email vanish completely under the pale blue rectangle. Fix: split hover-highlight and click-catching into two separate controls — a decorative highlight rectangle at the very back (DisplayMode.View, noOnSelect, itsHoverFillis the real highlight colour) sitting behind the Labels, and a separate, fully transparent click-catcher (HoverFill: =Self.Fill, i.e. never visually changes) sitting in front of the Labels holding the realOnSelect. This is the same "background → labels → transparent click-catcher → distinct-action controls" ordering already established for click-passthrough — just add the highlight rectangle as a fourth layer at the very back, before everything else. - A background click-target Button under overlapping Labels — clicks only register on the blank margins, not on the visible text itself. Once a full-size background Button has a working
OnSelect(see entry above), any Label layered on top of it for visible text (name, meta line, notes, etc.) still blocks the tap from reaching it — a control fully occupies its own space for hit-testing regardless of whether it has its ownOnSelect, so Labels do not let clicks pass through to whatever's behind them. Don't fix this by duplicating the sameOnSelectonto every overlapping Label — fragile, easy to miss one (tried and explicitly rejected by the user on Branch Contact Groups 2026-07-24: "I can't believe there's no smart way around this"). Correct fix: add ONE separate, fully transparent Button (Fill: =RGBA(0,0,0,0),BorderThickness: =0, no text) positioned in front of the Labels but behind any small control that needs its own distinct action (a checkbox, an icon) — transparent, so nothing is visually hidden; in front of the Labels, so it catches every tap regardless of where the text sits; behind the small distinct-action controls, so they keep working independently. Z-order in this app family's YAML is simple ordering — later children render in front of earlier ones — so the required order is: decorative background → Labels → transparent click-catcher → any small distinct-action controls last. Confirmed live: Branch Contact GroupsrecRowClickCatcher(scrSendEmail, sits in front ofrecRowFrame/labels, behindrecCheckBox/icoViewMembers/icoViewHistory) andrecPersonRowClickCatcher(scrManagePeople, no other distinct-action controls in that row so it's simply frontmost). \xB7or any\xescape sequence in Power Apps strings. UseChar(decimal)instead. Middle dot isChar(183).IsOdd()— does not exist in Power Apps. UseMod(value, 2) = 1.SortByColumnson a SharePoint Choice field. UseSort(..., Field.Value, SortOrder.Ascending)to unwrap the Choice record.”value” in MultiChoiceFieldfor multi-select Choice filtering. UseCountIf(MultiChoiceField, Value = “value”) > 0.Launch(url)withoutLaunchTarget.New— reuses current tab. UseLaunch(url, {}, LaunchTarget.New).ScrollTo(gallery, item)in screenOnVisibleor any behavior formula.ScrollTois not universally supported in canvas apps — confirmed "unknown or unsupported function" in live build (Policy Tracker). Remove it entirely; restore scroll position via Navigate to the screen instead, or accept the gallery always resets to the top.SortByColumns(AddColumns(table, "SortKey", formula), "SortKey", ...)pattern inside a nested gallery'sItemsproperty (wheretable = ThisItem.GroupedItems). The dynamically added column is not reliably resolved bySortByColumnsin this context — confirmed error "column 'SortKey' does not exist" (Policy Tracker). UseSort(ThisItem.GroupedItems, formula, SortOrder.Ascending)instead, referencing fields directly by bare name inside the formula.- Referencing a SharePoint field in YAML that has not been confirmed to exist in the list. Before using any field name in card/form YAML, verify it is in the live SP list. Confirmed error when
Status.Valuewas used but the SP list only hadPublished(boolean) — Policy Tracker. ForAll(cmbControl.SelectedItems As T, {Value: T.Value})for patching multi-select Choice. PreferForAll(cmbControl.SelectedItems, {Value: Value})— the alias form can cause type mismatches.- Assuming
Default/DefaultSelectedItemsre-evaluates reactively when the source variable changes after the control already exists. It doesn't — confirmed via Microsoft's ownReset()function docs and multiple community threads: these properties are read once, at control creation, to seed the initial value. If a screen setsvarSelectedRecord(or similar) inOnVisibleand expects an already-rendered dropdown/combobox/checkbox to pick it up, it won't — the control was created before (or in the same tick as) the variable being set, so it captured whatever value existed at that moment (often blank). Fix: explicitlyReset(controlName)for every Default-driven input, at the very end ofOnVisible, after all the data-loading Sets/ClearCollects have run. This applies toModernDropdown.Default,ComboBox.DefaultSelectedItems,Classic/CheckBox.Default,DatePicker.SelectedDatewhen treated as an initial value, etc. — not just Modern controls. Confirmed: Policy TrackerViewItem_1—drpDocType1,radApproval1,cmb_Owner1all showed blank/unselected on a record with real data, even after fixing theDefaultformula itself (see theLookUpentry above) — the formula was correct, the control just never re-read it. 2026-07-05. - Same root cause, different shape — it also happens INSIDE a Gallery, per-row, not just for a single shared control. A Gallery can recycle its child control instances across an
Itemsrefresh (e.g.ClearCollect) rather than fully destroying and recreating them, especially when the row count doesn't change — so a checkbox'sDefaultbound toThisItem.Picked(or similar) can silently keep showing whatever it captured the FIRST time that row-instance was created, even though the underlying collection now has genuinely differentPickedvalues for a newly-selected record. Symptom: the checklist visually renders correctly (right group names, right count) but nothing is ever ticked, no matter what the real membership data says — easy to misdiagnose as "the box is too small, the ticked ones are scrolled out of view" (a wrong theory tried first here) since the visible SYMPTOM looks identical to a scroll-visibility problem. Confirmed live 2026-07-24, Branch Contact GroupsscrManagePeoplechkGroupMember/colPersonGroupPicks— persisted even after enlarging the checklist from 180px to 320px, which is what disproved the scroll theory and pointed at this instead.- First attempted fix, also wrong, and worth recording because it produces a distinctive visible error banner:
Reset(controlName)called from OUTSIDE the gallery that control lives in. This is not legal Power Fx — a gallery template's child controls can only beReset()from within a formula written inside that same gallery template, never from a button/OnSelect elsewhere on the screen. The runtime error is exactly this text: "The Reset function can only be used with a resettable control. Controls within a Form or Gallery control can only be reset from within the same form or gallery template." If you see that banner, the immediate cause is always aReset()targeting a gallery-child control from the wrong scope — remove it, don't try to relocate it into a different outside caller, it can't legally be called from anywhere outside that gallery. - Real, confirmed fix: convert the checkbox from
Classic/CheckBox@2.1.0(one-shotDefault) toCheckBox@0.0.30, the Modern Checkbox, usingCheckedinstead ofDefault.Checkedis genuinely reactive — it re-evaluates on every render, the same way any other Modern-control formula-bound property does (Visible,Text,BasePaletteColor, etc. all already behave this way elsewhere in this app family) — so it correctly reflects the collection's currentPickedvalue for whichever record is now selected, with noReset()of any kind needed anywhere. This sidesteps the whole "does Default re-read" question entirely rather than fighting it. Confirmed live 2026-07-24 same incident,chkGroupMember/chkAddPersonGroup.
- First attempted fix, also wrong, and worth recording because it produces a distinctive visible error banner:
- EXCEPTION — do not call
Reset()onModernCombobox. Microsoft's own changelog for this control states: "Reset() includes SearchText: The Reset() function now clears both the selection and the search text." For this control specifically,Reset()was changed to also blank the selection — it does not just restoreDefaultSelectedItemsthe wayReset()does for every other control. Confirmed: Policy TrackerViewItem_1'scmb_Owner1had a correctly-computedDefaultSelectedItems(set earlier in the sameOnVisible, in the right order) that was then immediately wiped back to blank by the screen's ownReset(cmb_Owner1);call, applying the general advice above. Fix: skipReset()forModernComboboxcontrols entirely — ifDefaultSelectedItemsis set before the control is created (i.e., earlier in the sameOnVisible/before first render), it doesn't need aReset()nudge the wayDefault-driven controls do. 2026-07-05. - Notify-first validation pattern (checking fields then calling Notify before running Patch). Use Set-error-vars-then-If-guard pattern instead.
- Calling
Reset(Self)inside a control's ownOnChange, when that control's value property is itself bound to a live formula (e.g.DatePicker.SelectedDate: =varSelectedRecord.Field).Reset()forces the control to re-run its bound formula immediately — which just puts back the old/blank value, silently destroying whatever the user just picked. This was being used as an ad-hoc validation trick ("if the picked date isn't a Thursday, reset it") but it fires on every non-matching pick, not just invalid saves, so it reads as "the field randomly clears itself" rather than a deterministic rule. Confirmed on Policy TrackerViewItem'sdpkPublishDate1: any non-Thursday click silently reverted tovarSelectedRelease.'Planned Publish Date'. Fix: neverReset(Self)for input validation on a formula-bound value control. JustNotify()the warning (the invalid value stays visible/selected) and enforce the real rule at Save time instead, e.g. gate the Save button's validation onWeekday(control.SelectedDate, StartOfWeek.Monday) <> 4so a bad value blocks the save rather than getting silently erased before the user even reaches Save. 2026-07-06. Set()on a global variable from insideForAll— Studio now blocks this outright: "This function cannot be invoked within ForAll." This is a real, current Power Apps platform restriction, not a formula mistake —ForAlliterations aren't guaranteed to execute in strict sequence, so Microsoft disallows mutating global state from inside the loop to avoid race conditions. This most often shows up in an accumulator pattern, e.g. counting failures from a per-rowIfErrorinside a bulkForAll(Patch(...))loop:IfError(Patch(...), Set(varFailCount, varFailCount + 1))errors on theSet(...)line specifically. Fix:Collect()into a fresh collection instead —Collectwrites are still allowed insideForAll, each iteration just appends its own row independently, so there's no ordering dependency. Then set the variable ONCE, fromCountRows(collection), after theForAllhas finished (this is fine, it's no longer inside the loop):Clear(colFailures); ForAll( source As Row, IfError( Patch(...), Collect(colFailures, {ID: Row.ID}) ) ); Set(varFailCount, CountRows(colFailures));Confirmed live: Policy TrackerMain.yaml'sPublishAllBtn.OnSelect— the original per-rowSet(varPublishFailCount, varPublishFailCount + 1)inside theForAll/IfErrorthrew this exact error on paste into Studio. 2026-07-22.- Follow-on error after applying the
Collect()fix above:IfError(Patch(...), Collect(...))throws "Invalid argument type (Table). Expecting a Record value instead."Patch(...)returns a Record (the patched row);Collect(...)returns the whole Table it just collected into.IfError's two branches (the normal-path value and the error fallback) must resolve to the same type, and Record vs Table doesn't unify. Fix: end both branches with; true, so each side evaluates to a plain Boolean instead of its natural Patch/Collect return value — a statement chain's type is just whatever its last statement evaluates to, so appending; truesidesteps the mismatch entirely without changing behavior:IfError( Patch(...); true, Collect(colFailures, {ID: Row.ID}); true )Confirmed live: samePublishAllBtn.OnSelect, immediately after theSet-in-ForAllfix above, same session, 2026-07-22. When pairingIfError's success/fallback branches, always check that both sides' final function call returns the same type (or force it with; true) — don't assume any two working single-purpose calls (aPatchhere, aCollect/Remove/etc. there) are automatically compatible asIfErrorsiblings. &cannot concatenate two tables — it's the text/scalar concatenation operator only (accepts Text/Number/Date/Time/DateTimeNoTimeZone/DateTime/Boolean/ViewValue/Dynamic — that exact list is what the error names).Table({...}) & existingCollectionthrows "Invalid argument type. Expecting one of the following: Text, Number, Date, ..." because Power Fx is trying to coerce both tables down to a scalar for&, not concatenating them as tables. To prepend/append a record to an existing collection, don't try to build the combined table in one formula — mutate the collection itself:ClearCollect(coll, {newRow})thenCollect(coll, ForAll(source, {...}))(or justCollect(coll, {newRow})if not rebuilding from scratch). Confirmed on Policy TrackerMain, trying to inject a synthetic "All types" chip row ahead ofcolChoiceColorsfor a type-filter gallery. 2026-07-06.- In the browser editor's manual Insert-panel workflow (not YAML paste),
LayoutDirectionandLayoutGapare not settable via the property formula bar at all, even though both are completely valid, workingGroupContainer@1.5.0YAML properties (confirmed throughout this app's exported YAML —DashboardContainer,ScreenContainer1, etc. all use them). The Insert panel exposes three distinct container choices — Container (blank/ManualLayout), Horizontal container, Vertical container (both AutoLayout) — and picking one fixes the direction permanently at creation time; there is no property in the formula-bar "add property" list to change it afterward. Gap between children is set via a dedicated Gap stepper control in the properties pane (next to the alignment icons), not a formula. Every other AutoLayout property (Fill,Height,Width, padding,DropShadow) is a normal formula-bar property — only direction and gap are insert-time/UI-only. When writing a guide for someone building manually in the browser (as opposed to a YAML paste), say "insert a Horizontal/Vertical container" and "set Gap via the properties pane stepper" — never "set LayoutDirection/LayoutGap via formula." Confirmed by direct user correction on Policy TrackerMain, 2026-07-06. - The confirmed real YAML property name for "wrap children to a new row" on a
Variant: AutoLayoutGroupContainer@1.5.0isLayoutWrap(boolean, e.g.LayoutWrap: =true) — this is settable via the formula bar, unlikeLayoutDirection/LayoutGapabove. Confirmed live in Policy TrackerMain'sTypeFilterBarexport. Don't hedge this one as "check the properties pane" the wayLayoutDirection/Gapneed to be —LayoutWrapis a normal property. - Manual
X/Yproperties on a control whose immediate parent isVariant: AutoLayoutare unreliable/likely ignored — AutoLayout positions children by flow order (plus padding/gap/alignment), not by coordinates. Confirmed the hard way: a guide gave explicitYvalues forTitleinsideContainer5(anAutoLayoutLayoutDirection.Horizontalcontainer), and the user's real, working, live-tested build leftTitle.Ycompletely unchanged from its pre-AutoLayout value — changing it had no visible effect, exactly as it would if the property were being ignored. Only give manual X/Y instructions for controls whose direct parent isVariant: ManualLayout. For a control inside anAutoLayoutparent, describe the change in terms of order/alignment/padding/gap instead, or explicitly flag "this parent is AutoLayout, X/Y may not apply — verify live." Policy TrackerMain,ReleaseGallerycard thinning, 2026-07-07. - A screen-level equivalent was suspected but NOT confirmed in one build (see the
Scale to fitentry below, which turned out to be the actual cause that time) — don't assume a screen has an "Auto layout" toggle without seeing it live. Some Studio versions/app types have no such screen-level setting at all; the Properties panel for a screen may only expose Fill/BackgroundImage/LoadingSpinner/Height with nothing resembling a layout-mode toggle. If a screen's controls all bunch together regardless of their authoredYvalues AND regardless ofScreen.Height, checkScale to fit(App settings → Display) before concluding it's an AutoLayout screen. - App setting
Scale to fit(App settings → Display, ON by default in most templates) proportionally shrinks an entire screen's rendered content to match the actual device viewport, regardless of that screen's ownHeight/Widthproperty. This means increasing a screen'sHeightto make it scroll does nothing ifScale to fitis on — the runtime just scales the whole layout down harder to keep cramming it into the same fixed frame, so controls with very different authoredYvalues (e.g. Y=750 vs Y=1470) end up rendered close together, visually indistinguishable from an overlap/AutoLayout bug. Symptom: making a screen taller has zero effect on spacing — everything stays visually bunched at whatever size, "it doesn't matter how big I make it." That's the tell it'sScale to fit, not AutoLayout and not a too-short-canvas problem. Fix: App settings → Display → turn offScale to fit(andLock aspect ratioif present) — only then does increasing a screen'sHeightbeyond the device viewport make it genuinely scroll instead of scale. Suspected (not yet live-confirmed) in Branch Contact GroupsscrManageGroups— the "Manage Members" panel (12+ controls, authored Y=750 to Y=1514) stayed bunched together after raisingScreen.Heightalone; ruled out a screen-level AutoLayout toggle first since the user's Properties panel had no such option. Update this entry to CONFIRMED once the user verifiesScale to fitwas actually the fix. 2026-07-23.
Power Automate
- A "Power Apps (V2)" trigger input passed as Text (or any wrong type) when the downstream action's field expects a different type — the dynamic content picker on that field silently shows "No dynamic content available," with no error, indistinguishable from a genuinely broken/stuck picker. Confirmed against Microsoft's own troubleshooting docs, not guessed: the dynamic content picker filters its suggestion list by matching the target field's data type — a Number-typed field (e.g.
Idon any SharePointUpdate item/Get attachments/Delete attachment/Add attachmentaction) will not list a Text-typed trigger input at all, even though the value genuinely exists and other Text-typed fields in the same action show it fine. Source: Dynamic content picker missing dynamic content from previous steps, "Cause 2: Data Type Mismatch". Before building any flow that writes to a SharePoint list, check the real column type of every field you intend to target with a trigger input — SharePoint's own numeric ID (used for everyIdfield) is always a Number, and any other column defined as a Number/Choice/Yes-No column in that specific list needs a matching-typed trigger input, not a default Text one. Going the other direction (Number value into a genuinely Text-typed SharePoint column) is fine and does not hit this filter — SharePoint's connector coerces it automatically. Confirmed live: Training TrackerTT - Save Certificateflow, 2026-07-30 — bothRecordID(targets everyIdfield) andCourseID(targetsTT TrainingRecords.CourseID, itself a Number column) were originally specified as Text, and both silently failed to appear as dynamic content on their Number-typed target fields until switched to Number inputs. - An unsaved Power Automate flow loses all trigger inputs on a browser refresh (F5). There is no autosave/draft-restore for a flow that has never been saved once — if you hit a wall partway through building the trigger and refresh to try to unstick the editor, you lose every input added so far and must re-add them from scratch. If a flow won't save because a downstream required field has no value yet, do not refresh to try to fix it — fill the required field with any placeholder value first (see "SharePoint list with required columns forces every Update item to resupply them" below, if that's the actual cause), get the flow to save once, then go back and fix the value properly.
- A SharePoint list with required columns forces every
Update itemaction to resupply a value for those columns, even ones you have no intention of changing. If a list's schema marks a column as required (e.g.PersonEmail,CourseID,CourseNameonTT TrainingRecords), theUpdate itemconnector action shows a red asterisk and refuses to save the flow until every required column has something in it — not just the columns you actually want to update. Fix: re-supply the existing/unchanged value from whatever the flow already has available (e.g. the same trigger input that carried it in), rather than leaving it blank or inventing a new value. This does not change the stored data, it just satisfies the connector's validation. Confirmed live: Training TrackerTT - Save Certificateflow, 2026-07-30. - A
Respond to a PowerApp or flowaction cannot be nested inside anApply to each(foreach) loop — Power Automate blocks this outright at save time withInvalidWorkflowRunAction: ... type 'Response' ... could not be nested under an action of type 'foreach'. There is no setting to allow it; the Respond action is only valid as a top-level (or Condition-branch-level) action, never inside a loop. This also meansInitialize variableactions have their own placement rule: they can only run at the very top level of the flow (directly after the trigger), never inside a Condition or loop either. Fix for "fetch one file from inside a loop, then respond with it": initialize the needed variables (e.g.varFileName,varFileContentBase64) at the top level before any Condition; inside the loop, useSet variableto populate them (an action from inside a loop is otherwise an array once outside the loop, so a variable is the standard way to pull a single value back out); then place the actualRespond to a PowerApp or flowaction after the loop ends, reading from the variables instead of from loop-scoped dynamic content. Confirmed live: Training TrackerTT - Get Certificateflow, 2026-07-31 — the original guide draft placed Respond directly inside theApply to eachoverGet attachments, which failed to save with exactly this error. -
A flow cannot have two separate
Respond to a PowerApp or flowactions at all — not even one per Condition branch with identically-named/typed outputs. This is the deeper, easy-to-miss cause behind a specific, maddening symptom: the app's formula bar (e.g.varResult.someField) only ever autocompletes a subset of the fields actually configured on the Respond action(s) — commonly just the fields that happen to be identical across every branch — with no error, no warning, and the missing fields behaving as if they don't exist even though the flow designer visibly shows them configured correctly on both Respond actions. This survives everything that looks like it should fix a caching problem — removing/re-adding the flow as a data source (repeatedly), fully closing and reopening the app, correcting field name casing, even copying the entire flow to a brand-new name via "Save As" (the copy inherits the exact same broken behaviour, because the two-Respond-action structure itself is the defect, not any cached metadata). Confirmed via a moderator-verified answer on Microsoft's own Power Platform community forum: "You can't have two Respond to Power Apps actions in the same flow." Fix: never use more than oneRespond to a PowerApp or flowaction in a flow, full stop. Where a flow's logic branches (e.g. an authorisation Condition), set plain variables (e.g.varSuccessBoolean,varMessage/varFileName/varFileContentBase64String) inside each branch instead of responding from within it, then place exactly one Respond action after the branches rejoin, reading every output from those variables. Confirmed live: Training TrackerTT - Get Certificateflow, 2026-07-31 — two Respond actions (one per branch of the authorisation Condition), each configured with the same 4 outputs, still left the app only recognisingsuccess/message, across three separate remove/re-add cycles and one full flow duplication, until both Respond actions were removed and replaced with the single-Respond-plus-variables pattern. -
A Power App does not automatically pick up changes made to a flow it already calls — editing and saving an action inside a flow (e.g. fixing a field name in a
Create item/HTTP action's body) has no effect on an app already referencing that flow until the app's own connection to it is refreshed. Confirmed live: a flow was edited and saved (verified via the flow's own run history showing the new action content correctly), yet a Power App calling that flow via'FlowName'.Run(...)kept executing the old, pre-edit logic on every subsequent test — the run history for the Power-App-triggered runs still showed the old field names, not the ones just saved in the designer. Fix: in Power Apps Studio, open the Data panel, find the flow under Connections/Data sources, and refresh (remove-and-re-add, or the panel's own refresh action) that specific flow's reference — this is what forces the app to pick up the latest saved version. Do this after every flow edit that a live app is already calling, not just the first time a flow is added as a data source. Confirmed live: Library & File Plan ManagerCreate Library (App)flow, 2026-08-12 — aCreate_FilePlan_Rowbody fix (renaming a broken SharePoint field) was correctly saved in the flow designer, confirmed via the flow's own Code view, yet a Power App test run still executed the pre-fix version until the app's flow connection was manually refreshed.
Architecture
- Loading collections only in
App.OnStartand not reloading in screenOnVisible. Collections go stale when data is added in a different screen or session. - Using
ClearCollect(colMemberships, 'BM Memberships')as if it loads the whole SharePoint list. It only caches the first client-side page, so later membership rows never reach the app. Confirmed 2026-07-27 on Branch Contact Groups:scrSendEmailshowed0 membersfor groups such as CTC Frimley even though SharePointBM Membershipshad real rows. Counts and recipient generation were reading the incomplete localcolMembershipscollection. Fix for Branch Contact Groups v2.32: buildcolGroupsfirst, then load memberships group-by-group:ClearCollect(colMemberships, Filter('BM Memberships', false)); ForAll(colGroups As grp, Collect(colMemberships, Filter('BM Memberships', GroupName = grp.Title))). This avoids the global row cap because each query only fetches one group's roster. - Not initialising
varViewingForSelfat the top ofOnVisible. If it is blank, a self-view/team-view screen will show nothing. - Hard-coding
Set(varViewingForSelf, true)in a gallery rowOnSelect. This breaks team-member viewing. - Not calling
ResetForm(frmCert)in a form screen'sOnVisible. The form shows stale data on revisit. - Not resetting error border variables (
Set(varErrX, false)) when opening an edit panel. Red borders from a previous failed save linger. - Assuming a field exists in
varCoursebecause it exists in SharePoint. The field only exists invarCourseif theForAllprojection that builtcolMyTrainingincluded it. - A global collection populated with
AddColumns(computing an extra field) in one place, and a plainClearCollect/Filter(without that sameAddColumns) in another. Causes a visible flicker: whichever population runs last wins, and if the plain one runs after the computed one, every row loses the computed field and any UI reading it (e.g. an iconSwitchon the computed column) falls back to its default/error branch — looking like the correct data displayed briefly then "broke". Confirmed: Policy TrackerViewItem_1— the link gallery's file-type icons flickered from correct (PDF/Word/Excel) to a generic fallback icon on load, because the link-modal's "reload after edit" success handler computesFileExtviaAddColumns, but the screen's ownOnVisiblerepopulates the same collection with a plainFilterand noAddColumnsat all. Fix: every population point for a given collection must compute the same derived columns, not just the one call site that happened to need it first. 2026-07-05. - Recurred 2026-07-22 on the exact same collection (
colLinks), a different set of call sites. This time it wasn't a flicker-on-load, it was icons resetting to the generic fallback specifically on Save/Save & Close of the parent item (not the link modal) — the item'sbtnSaveClose1/btnSave1success handlers, plus the nested save-then-open-link-modal branch inbtnAddLinkEmpty1, all didClearCollect(colLinks, Filter(PolicyLinks, PolicyTrackerSource.Id = varSavedRecord.ID))with noAddColumns/FileExt, whileBuildLinksForSource(the one that runs on opening the item) correctly computes it. Closing and reopening the item "fixed" it because that re-ranBuildLinksForSource. Lesson confirmed twice now: whenever a collection's schema depends on a computed column, grep everyClearCollect/Collectcall site for that collection name before trusting any single one of them is complete — this bug has now recurred by adding a brand-new population site (a Save handler) without checking the others, not by editing an existing one. - Using Badge control to render repeating pills. Badge cannot loop over a collection — use Gallery + Classic Button.
YAML File Structure
- Any screen YAML that does not start with
Screens:\n ScreenName:. The pa-yaml-wrap tool and PowerApps Studio paste both require this exact top-level format. Never use- ScreenName:(list item). Always use the dict form:Screens:at col 0, screen name at col 2,Properties:andChildren:at col 4. - Pasting a corrected screen YAML over an existing screen that already has that screen's name. Studio's paste is additive/merge, not a full replace — controls present in the old paste but removed from the new YAML (e.g. a hidden staging control that got deleted as part of a fix) can be left behind on the canvas with their old, now-orphaned bindings still intact, still capable of throwing the old error. When a fix removes or renames a control, tell the user to delete the whole screen and paste fresh into a new blank screen, not paste over the existing one. Suspected cause of a fix "not taking" in Branch Contact Groups even after confirming the source YAML no longer contained the offending control. 2026-07-23.
GroupContainer@1.5.0without aVariant:keyword. Every GroupContainer requiresVariant: ManualLayout(orVariant: AutoLayout) betweenControl:andProperties:. Omitting it causes PA1011 on paste. Confirmed broken in Overview build.LayoutMode: =LayoutMode.ManualLayoutinside a GroupContainer's Properties block. Do not set LayoutMode as a property —Variant: ManualLayoutalready implies it. Including it causes PA2108. Remove the property entirely.Gallery@2.15.0without aVariant:keyword. Every Gallery requiresVariant:betweenControl:andProperties:. UseVariant: Verticalfor vertical galleries,Variant: Horizontalfor horizontal galleries,Variant: VariableHeightfor variable-height galleries. Confirmed PA1011 in Overview build.Layout: =Layout.HorizontalorLayout: =Layout.Verticalinside a Gallery's Properties block. Do not set Layout as a property — the Variant already implies it. PA2108 if present. Same rule as LayoutMode on GroupContainers. Confirmed in Overview build.Image@2.2.0— stale. Always useImage@2.2.3. PA2105 warns it may produce errors.SelectedDateas a settable property onModernDatePicker@x.x.x— do not use, in any version. Confirmed broken on both1.0.0and1.0.1in this environment:PA2108: Unknown property 'SelectedDate', identical error, same lines, after bumping the declared version (see the now-corrected theory below). Microsoft's own docs page listsSelectedDateas a real property of the control family, and it genuinely works as a read (Self.SelectedDateinside the control's ownOnChange, orotherControl.SelectedDatefrom elsewhere) — but it is not a valid key to author in the YAMLProperties:block for this control, at least not in the version(s) tested. Do not attempt a version bump as the fix (already disproven — see below). UseDatePicker@0.0.46instead (a different, non-"Modern"-prefixed control family) — confirmed live and working in Policy Tracker's realViewItem.yaml/ViewItem_1.yaml, which setsSelectedDatesuccessfully on that control tag with a full property set (BorderColor,BorderStyle,BorderThickness,Fill,Font,FontSize,Format,Height,IsEditable,OnChange,SelectedDate,StartOfWeek,Width). It is not Classic-prefixed and renders with the same rounded/modern look as the rest of the app, so it satisfies "no Classic-style sharp corners" without theModernDatePickerschema problems.- Corrected theory (originally recorded here, then disproven): the first hypothesis was that
ModernDatePicker@1.0.0's declared version was simply stale — the same paste'sPA2105warning named1.0.1as current, so the version was bumped to1.0.1expecting that to fix it. It did not; the identicalPA2108error recurred against1.0.1. Lesson: aPA2105version-mismatch warning appearing alongside aPA2108unknown-property error does not mean the version bump will fix the error — they can be two independent issues. Don't assume a version bump resolves a property error without re-testing; if it doesn't, stop iterating on that control and switch to a proven alternative rather than guessing a third property name or version. Policy TrackerViewItem_1, 2026-07-05. - Recurred 2026-07-08, via a different path — manually rebuilding the field in the browser editor's Insert panel, not a YAML paste.
dpkPublishDate1on the realViewItemended up back onModernDatePicker@1.0.1(someone picked "Modern Date picker" from Insert instead of the plain "Date picker"), withDefaultDateinstead ofSelectedDateandFontWeight: =""/Placeholder(neither a real property on the Classic control). Symptom:Format: =Text(Self.SelectedDate, "d mmmm yyyy")rendered as a squashed "2 Jul26 2026" instead of "2 July 2026". - Actual root cause, found by the user directly, not by guesswork —
ModernDatePicker.Formatdoes not support the 4-m"mmmm"token (full month name) the wayDatePicker@0.0.46.Formatdoes. With fourms, the control silently mis-renders instead of erroring — no PA error, no warning, just garbled output ("2 Jul26 2026"). Fix confirmed live: drop to threems,"d mmm yyyy", and the exact sameModernDatePicker@1.0.1control renders correctly ("2 Jul 2026") — no control swap needed at all. This means the SelectedDate-authoring bug earlier in this entry and the Format 4-mbug are two separate, independent problems with this control, not the same root cause — don't assume the whole control is unusable just because one specific property has a known issue; test the actual failing property in isolation (here, just the format string) before reaching for a full control replacement. Getting this wrong meant recommending a disruptive full-control swap (with a guide page and a GitHub issue reply) for a one-character fix. Policy TrackerViewItem, 2026-07-08. DatePicker@0.0.46's two syntax quirks worth remembering if a control swap is ever genuinely needed for a different reason:SelectedDate(notDefaultDate) is the settable property, andStartOfWeektakes a plain quoted string (="Monday"), not theStartOfWeek.MondayenumModernDatePickeruses.TooltiponDatePicker@0.0.46is not a valid YAML property. Confirmed by user paste error on Training TrackerscrCourseDetailDataCardValue1, 2026-07-27:PA2108: Unknown property 'Tooltip' for control type 'DatePicker@0.0.46'. Remove the property; use a nearby label/help text if the date field needs an explanation.-
There is a THIRD date picker control,
Classic/DatePicker@2.6.0, with the OPPOSITE convention fromDatePicker@0.0.46right above it — easy to confuse since both are non-"Modern"-prefixed and both look like the obvious "just use the classic one" choice. OnClassic/DatePicker@2.6.0,DefaultDateis the settable property, andSelectedDateis read-only (used elsewhere, e.g.otherControl.SelectedDate, exactly likeModernDatePicker— not likeDatePicker@0.0.46just above). SettingSelectedDatedirectly in this control's ownProperties:block throwsPA2108: Unknown property 'SelectedDate', confirmed via the real Layer A parser (not guessed) 2026-07-24, Branch Contact GroupsscrManageGroupsdatEditManualDate. This is exactly the trap the top of this file warns about — assumedSelectedDatecarried over from theDatePicker@0.0.46entry two lines up because both are "Classic-ish," shipped it without testing, and it was real, live, reported via GitHub issue. When in doubt between these two, write a tiny isolated test screen and run it throughpayaml-validate's Layer A directly — that's what actually resolved this, not re-reading docs or guessing a third property name. -
Attachments@2.3.0placed directly on a screen, unbound, expecting it to work as a standalone file picker. Microsoft's own control docs state a real limitation: "The upload and delete functionality works only inside a form. The attachment control appears disabled when in Edit mode and not inside a form." A bareAttachments@2.3.0control with noForm@2.4.4parent — the obvious first attempt for "let the user pick a file without writing to a live SharePoint list" — renders but silently refuses add/delete clicks. Confirmed working alternative, already live-audited in this repo's ownreference/external/powerappsui/file-upload.mdcomponent: setItems: =Blank()(not omitted, not a schema-less[]literal —Blank()specifically), give the controlOnAddFilethat doesClear(colStaging); Collect(colStaging, Last(Self.Attachments)); Reset(Self)to capture the picked file into a local collection and immediately empty the control's own internal state, and place a fully transparent click-catcher Button behind the Attachments control (declared earlier inChildren, per normal z-order rules) withOnSelect: =Select(attachmentsControlName)to trigger the native picker from custom-styled "click to select / drag and drop" UI. WithItems: =Blank(), the control is not bound to any real data source, so the "must be inside a form" limitation — which is about persisting SharePoint/Dataverse attachment changes viaSubmitForm— does not apply; the control still firesOnAddFileand exposesSelf.Attachments(Name/Valuefields,Valuebeing the file blob) normally. Read the staged file back out of the local collection (First(colStaging).Name/.Value), e.g. to pass into aFlow.Run(...)call, never from the control's own.Attachmentsafter the fact (it getsReset()on every add). Confirmed live: Training TrackerscrCourseDetailcertificate-upload redesign, 2026-07-30 — first draft used a bare unboundAttachments@2.3.0with no click-catcher, caught against the MS docs mirror before shipping (not live-tested broken), then rebuilt using the provenpowerappsuipattern. -
A data-source action function (e.g.
Office365Users.SearchUserV2(...)) written directly inside a Gallery'sItemsproperty. Unlike a pure formula, an action call sitting in a reactive property gets re-evaluated far more often than "once per keystroke" — any unrelated re-render elsewhere on the screen can re-trigger it, since Power Apps re-runs the whole dependency graph, not just the control that changed. Symptom reported live: a thin loading indicator repeatedly sweeping across the top of the screen ("like PowerApps is constantly trying to update something"), and an open lightbox that felt unstable while search boxes with this pattern were present nearby. Fix: never put a connector/action call directly inItems. Move it to the search textbox'sOnChange, doing an explicitClearCollect(colName, Office365Users.SearchUserV2(...)), and point the gallery'sItemsat that plain collection instead. Same live-as-you-type UX (OnChange still fires on every keystroke), but the connector is only invoked when the text actually changes, not on every unrelated re-render. RememberReset()does not fireOnChange— anywhere the search textbox getsReset()'d (closing a lightbox, after a successful add), also explicitly re-ClearCollectthe results back to empty, or the stale results silently linger. Confirmed pattern in Branch Contact GroupsscrManagePeople(galAddPersonGalResults) andscrManageGroups(galGalResults,galMaintainerGalResults), 2026-07-29 — all three had the connector call directly inItems.
Unverified — Found in Microsoft Docs, Not Yet Empirically Confirmed In This App
Per user directive 2026-07-06 ("don't just search Microsoft documents, Bible is the Bible... if it's not in the Bible, put it in there"): Microsoft Learn is no longer a default first-resort source for this app family — it has already been the direct source of confirmed-wrong claims here (ModernDatePicker.SelectedDate, ModernCombobox instability). Anything below was found via Learn/WebSearch, not by pasting it into the real editor, and must be moved out of this section into the main body (with the app/screen/date it was confirmed on) the first time it's actually verified working live — or deleted if it turns out wrong.
- Horizontal container "Horizontal Overflow" property — likely YAML name
LayoutOverflowX, valueLayoutOverflow.Scroll/LayoutOverflow.Hide. Per Microsoft's Horizontal container control doc page: "Horizontal Overflow - Defines whether the container shows scrollbars or remove content when it is too large to fit. Scroll and Hide." This is presented as a properties-pane UI setting (like Gap/Direction), not necessarily a formula-bar property — same insert-time/UI-only pattern already confirmed forLayoutDirection/LayoutGapon this control family. Parallels the already-confirmedLayoutOverflowY(vertical AutoLayout scroll, in the main Control Properties section above) closely enough to be plausible, but not tested live here. Before relying on this: check the properties pane for an "Overflow" setting near Gap/Direction on the Horizontal container in question.
Guide-Writing
- “Same as above.”
- “Duplicate the previous screen.”
- “Use the same technique.”
- Long inline control paragraphs that hide exact properties.
- Background/card/panel/gallery-row controls without a layer-order note when they can cover other controls.
- Formulas that may temporarily red-line without a reassurance note explaining what later control/collection/variable resolves it.
- Grouping instructions that hide layer-order requirements or fail to list exactly which controls are included/excluded.
- Long property lists that mix actual changes with default values without marking which are defaults.
- Repeating fresh-control defaults from
powerapps-control-defaults.mdas if the user must manually change them. - Repeating
Fill=RGBA(0,0,0,0)on normal Label controls as if it must be manually changed. - Repeating
BorderThickness=0on normal Label controls as if it must be manually changed. - Repeating
SelectMultiple=trueon modern Combo box controls as if it must be manually changed. - Repeating
ItemDisplayText=ThisItem.Valueon modern Combo box simple value tables as if it must be manually changed. - Treating a property omitted from the fresh-control export as a guaranteed literal default value.
- Control rows that say only “see formula below” when the formula can be placed in a collapsed copyable block beside the control.
- Any instruction that depends on visual guessing rather than exact control names and properties.
- Re-pasting full screen YAML to fix a single property. Targeted property changes are always safer and preserve existing customisations.
Verified Control Reference
Verified Control Reference
Last checked: 2026-07-05
Sources:
- Modern control updates: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-updates
- Modern controls reference (full index of all modern controls): https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-reference
- Modern Text input: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input
- Modern Combo box: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox
- Modern Dropdown: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-dropdown
- Modern Toggle: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-toggle
- Modern Button: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button
- Modern Progress bar: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-progress-bar
- Modern Avatar: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-avatar
- Modern Badge: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-badge
- Modern Checkbox: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-checkbox
- Modern Date picker: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-date-picker
- Modern Number input: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input
- Modern Radio group: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group
- Modern Slider: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider
- Modern Spinner: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-spinner
- Modern Tab List: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-tabs-or-tabs-list
- Modern Header: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-header
- Modern Link: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-link
- Modern Info button: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-info-button
- Modern Text: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text
- Modern Card (preview): https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-card
- Classic Button: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button
- Gallery: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-gallery
- Icon/shape controls: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-shapes-icons
- Edit form: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-form-detail
- Core properties: https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/properties-core
Full Modern Control Catalogue (2026-07-05)
Microsoft's index page lists 23 modern controls total. Not all are documented in depth below yet — only the ones verified/used or likely to matter for this app family. Full list for reference: Avatar, Badge, Button, Card (preview), Checkbox, Combobox, Copilot answer (preview), Data Grid (preview), Date picker, Dropdown (preview), Header, Info button, Link, Number input, Progress bar, Radio group, Spinner, Slider, Stream (preview), Table (preview), Tabs/tab list, Text, Text input, Toggle. Copilot answer, Data Grid, Table, and Stream skipped below as niche/preview and not yet needed by any app in this family — fetch their pages the same way if a future build needs them.
Baseline Warning
Microsoft's modern controls are in active change. Microsoft Learn notes that modern controls received updated versions from February 2026 with new property names, enum values, and behavior changes. Recheck Microsoft Learn before using a control not listed here or before changing a property convention.
Modern Text Input
Use for single-line, multi-line, password, and search text entry.
Verified key properties:
Default- initial text value.Text- current entered text, used in formulas.Placeholder- hint text when empty.Type- use enum values such asTextInputType.SingleLine,TextInputType.Multiline,TextInputType.Password,TextInputType.Search.TriggerOutput- use enum values such asTriggerOutput.Keypress,TriggerOutput.FocusOut,TriggerOutput.Delayed.Required,ValidationState,DisplayMode,Visible.- Layout/style:
X,Y,Width,Height,Align,PaddingTop,PaddingBottom,PaddingLeft,PaddingRight,Font,Size,Color,FontWeight,Italic,Underline,Strikethrough,Fill,BorderColor,BorderStyle,BorderThickness,RadiusTopLeft,RadiusTopRight,RadiusBottomLeft,RadiusBottomRight.
Do not use:
HintTextfor modern Text input. UsePlaceholder.FontSizeif the current updated modern Text input control exposesSize; older guide rows may still useFontSizeand should be checked in the live editor before final publishing.
Modern Combo Box
Use for searchable selection, especially multi-select.
Verified key properties:
ItemsItemDisplayText- formula that determines the visible text for each item. UseThisItemto reference the current row.DefaultSelectedItemsSelectMultipleInputTextPlaceholder- hint text in the input field.AccessibleLabel,IsSearchable,Visible,DisplayMode- Layout/style properties including
X,Y,Width,Height, padding, color, font, fill, border, and radius properties as exposed by the current modern control.
Do not use:
Placeholderfor modern Combo box. UseInputTextPlaceholder.- Missing
ItemDisplayTextwhenItemsis record-shaped and the display field is notValue. Office365Users search rows in this guide useThisItem.DisplayName. Defaultfor multi-select preselection. UseDefaultSelectedItems..SelectedwhenSelectMultiple=trueand the formula needs all values. Use.SelectedItems.
Known build note:
- In the user's current Power Apps editor,
SelectMultiple=trueis the default for modern Combo box. SetSelectMultiple=falseexplicitly for single-selection Combo boxes. - In the user's current Power Apps editor,
ItemDisplayText=ThisItem.Valueis the default for modern Combo box simple value tables. Do not list it as a manual step unless it is a labelled default/safety check. ItemDisplayTextmust match the shape ofItems.ThisItem.Valueonly works whenItemsis a simple value table or SharePoint choice-style table with aValuefield.
Modern Dropdown
Use for a single fixed selection. Microsoft recommends Combo box for multi-select.
Verified key properties:
ItemsItemDisplayText- formula that determines the visible text for each item. For a table like{Label: "...", Months: 12}, useThisItem.Label.DefaultOnChangeValidationStateRequiredAccessibleLabelVisible,DisplayMode- Style/layout properties including
Appearance,BasePaletteColor,Font,Size,Color,FontWeight,Italic,Underline,Strikethrough,Fill,BorderColor,BorderStyle,BorderThickness, radius and padding properties.
Do not use:
DefaultSelectedItems; that belongs to Combo box style selection, not modern Dropdown.- Multi-select patterns; use Combo box instead.
- Old "display/value field" wording for table-shaped items. State
ItemDisplayTextexplicitly.
Modern Toggle
Use for true/false state.
Verified key properties:
Checked- initial/current boolean state used by this guide pattern.Label- caption text beside the toggle.OnCheck,OnUncheck,OnSelect.AccessibleLabel,Visible,DisplayMode.
Do not use:
.Valueto read a modern Toggle in this guide. Use.Checked.Textfor the visible caption. UseLabel.Defaultfor the initial state in this guide. UseChecked.
Modern Button
Use for real clickable commands.
Common verified properties:
TextOnSelectDisplayModeVisibleBasePaletteColorX,Y,Width,Height- Font and style properties exposed by the current modern Button control.
Do not use modern Button as a rounded static card unless the live editor supports all needed view/hover styling. The Training Tracker guide uses classic Button for static rounded panels.
Classic Button As Rounded Panel
Use this established Training Tracker pattern for cards and rounded panels.
Required properties:
Text=""DisplayMode=DisplayMode.ViewFill=<panel color>HoverFill=<same panel color>PressedFill=<same panel color>BorderColor,BorderThicknessRadiusTopLeft,RadiusTopRight,RadiusBottomLeft,RadiusBottomRight
Do not use:
- Rectangle control for rounded panels. In this guide family, rounded panels are classic Buttons.
Classic Gallery
Use for lists of records and repeated row layouts.
Verified core properties:
Items- Template sizing and child controls.
- Formula context supports
ThisItem. - For nested formulas, use
Asaliases or captureThisItemfirst withWith.
Do not assume:
- A row index property exists.
ThisItem.IDexists in a collection unless the collection explicitly containsID.
Classic Icon
Use for action icons where Power Apps provides built-in icon shapes.
Verified core properties:
- Appearance, size, position, and
OnSelect.
Do not use:
- Icons as a substitute for accessible labelled buttons unless the guide includes a clear accessible label or nearby text.
Classic Edit Form And Attachments
Use classic Edit form when SharePoint attachments are required. The Training Tracker certificate upload depends on the classic Attachments card pattern.
Verified core properties:
DataSourceItem- form mode actions such as
NewForm,EditForm,SubmitForm,ResetForm.
Do not replace with:
- A modern-only control pattern unless attachments have been reverified in the target tenant/editor.
Modern Progress Bar (Progress@1.1.34)
Displays determinate (Value/Max) or indeterminate (loading) progress. No native ProgressBar control name exists — the real control type is Progress.
Verified key properties:
Value– number, 0 toMax. Only applies whenIndeterminate = false.Max– the number that represents 100%. Not required to be 100 — set it to a real count (e.g.CountRows(...)) and skip doing percentage math yourself.Indeterminate–true/false. Whentrue,Value/Maxare ignored (animated loading state).ProgressColor– plain string literal, not a typed enum:="Brand",="Success",="Error", or="Warning". Confirmed live via a real control paste 2026-07-05 (="Square"shown in the formula bar) — do not assume this follows the same'XCanvas.Y'.Zenum pattern as Badge below; it doesn't.Shape– plain string literal:="Square"or="Rounded".Thickness– plain string literal:="Medium"or="Large".BasePaletteColor– only matters if you want a colour outside the fourProgressColorpresets.- No
Minproperty. NoFill/BorderColor— colour is controlled only viaProgressColor/BasePaletteColor.
Full property list (from the properties panel, confirmed 2026-07-05): AccessibleLabel, BasePaletteColor, ContentLanguage, DisplayMode, Height, Indeterminate, Max, OnChange, ProgressColor, Shape, Thickness, Value, Visible, Width, X, Y.
Why this entry exists: built for the Policy Tracker Main screen redesign's readiness bar and Release Pipeline widget — first went in as hand-rolled Rectangle pairs (track + coloured fill) because this control wasn't in this file yet, and its exact syntax couldn't be safely guessed for a full-screen YAML paste. Real control export from the user's own tenant is what unblocked it.
Modern Badge (Badge@0.0.24)
Already in live use in Main.yaml (Version control) — confirmed real formulas, not just docs:
Appearance: ='BadgeCanvas.Appearance'.Tint
ThemeColor: ='BadgeCanvas.ThemeColor'.Success
Shape: ='BadgeCanvas.Shape'.Rounded
Contrast this with Progress bar above: Badge uses typed 'XCanvas.Y'.Z enums, Progress bar uses plain string literals for what look like equivalent style properties (Shape, colour state). The two controls do NOT share a syntax convention — always verify per-control, never assume.
Other properties (per docs, not yet confirmed live): Content, ThemeColor (docs list brand/danger/important/informative/severe/subtle/success/warning — note the real app uses .Success capitalised as a typed enum member, and Tint appears as a real Appearance value that isn't in the docs' filled/outline/ghost/inverted list, so the docs are incomplete here — trust the live export over the prose), BasePaletteColor, standard Font* properties, AccessibleLabel, DisplayMode.
Modern Avatar (ModernAvatar, exact version unconfirmed)
Not yet used in any app in this family — worth using instead of hand-rolled initials-circle Labels (the pattern currently used for owner avatars on Policy Tracker's Main screen cards).
Verified key properties (per docs, not live-confirmed):
Name– drives the initials shown when there's no image.Image– photo, e.g.ThisItem.Owner.PictureorOffice365Users.UserPhotoV2(...).Badge– small status decoration.Shape– Circular or Square.Appearance–Brand(theme colour),Neutral(grayscale), orColorful(hash-of-Name colour — useful for auto-varied owner colours without hand-picking a palette).BasePaletteColor, standard Font* properties,Out of office(adjusts the badge icon).
Get a live export before using in a full-screen paste — exact enum syntax (typed vs. string literal) unconfirmed, same caveat as everything below not yet used live in this app family.
Modern Checkbox (CheckBox@0.0.30 — note the type name has no "Modern" prefix, unlike Button/Dropdown/TextInput)
Same trap as Modern Toggle above:
- Read/set state via
Checked, not.Valueand notDefault. Labelis the caption text (notText).OnCheck/OnUncheck/OnSelect.
Confirmed live 2026-07-24 (Branch Contact Groups recCheckBox, real Studio export via GitHub issue) — Layer A (Microsoft's real parser) accepted the control cleanly, and it renders/behaves correctly in Studio (first live confirmation of this control in this app family):
- BasePaletteColor — sets the checkbox's accent colour, e.g. =RGBA(156, 220, 79, 1) for green. Same property name/pattern as ModernButton's colour property.
- CheckboxSize — controls the size of the checkbox glyph itself, independent of the control's own Width/Height (which set the overall hit-target/bounding box). Confirmed live at =22 with Width/Height at =38.
- Standard X/Y/Width/Height all behave as expected.
Standing default for this app family, per explicit user instruction 2026-07-24: every CheckBox@0.0.30 in Branch Contact Groups should use BasePaletteColor: =RGBA(156, 220, 79, 1) and CheckboxSize: =22 — this is the confirmed, user-approved house style, not just a one-off. Apply it by default to any new Modern Checkbox in this app, not only when asked. Width/Height stay context-dependent (a standalone tick-square like recCheckBox used =38/=38; a checkbox whose own Label also carries a long line of text inline, like chkGroupMember/chkAddPersonGroup, keeps a shorter Height — e.g. =32 — sized to the surrounding row/template instead).
Modern Date Picker
Format–Short/LongAbbreviated/YearMonth/Custom(custom takes a format string like"dd/mm/yyyy"). Exact literal syntax (typed enum vs string) unconfirmed — verify live before use.SelectedDate– the output property (local time).StartDate/EndDate– bounds.StartOfWeek,IsEditable,Required.ValidationState–Error/None, red border onError.PlaceHolder,OnChange.
Modern Number Input (ModernNumberInput@1.0.0)
Default(input, initial value) vs.Value(output, read-only) — same input/output split pattern as Modern Slider below. Don't try to setValuedirectly.Min/Max/Step(default step is 1).Precision– typed enumDecimalPrecision.Auto/DecimalPrecision.'0'/'1'/'2'/'3'(note the quoted numeral syntax).Appearance– typed enumAppearance.Filled/Appearance.FilledDarker(default) /Appearance.Outline.ValidationState–ValidationState.None/ValidationState.Error.OnChangefires on blur/step-click, not every keystroke.- Recent rename history (already-migrated apps may have old names):
FontColor→Color,FontSize→Size,FontItalic→Italic,FontStrikethrough→Strikethrough,FontUnderline→Underline,BorderRadius→ four separateRadiusTopLeft/Right/BottomLeft/Right.TriggerOutputremoved entirely.
Modern Radio Group (ModernRadio@1.0.0)
Items,ItemDisplayText(formula usingThisItem),Default,Selected(output),OnChange.Layout– typed enumLayout.Vertical(default) /Layout.Horizontal.- Best for 2-7 mutually exclusive options; use Combo Box beyond that.
- Same Font* property renames as Number Input above apply here too — this whole modern-control generation was refactored together, expect the same rename list on any control touched in the same wave.
Modern Slider (ModernSlider@1.0.0)
Default(input, initial value) vs.Value(output, read-only) — this was a breaking rename: the old version tookValueas the input property; the new version reservesValuefor output only and usesDefaultfor the initial value. If copying an old example from a blog, this will silently misbehave rather than error.Min(default 0) /Max(default 100).LayoutDirection– typed enumLayoutDirection.Horizontal(default) /LayoutDirection.Vertical. Previously a plain string"Horizontal"/"Vertical"— another breaking enum-format change.Size– typed enumSliderSize.Small/SliderSize.Medium(default) /SliderSize.Large. Previously a plain string.OnChange,Tooltip,AccessibleLabel.
This control is the single clearest illustration of the Baseline Warning at the top of this file — same control name, completely different formula syntax (string → typed enum, input/output property swap) between versions. Never trust an old example without checking the current docs' "Recent updates" section first.
Modern Spinner
For loading states (page/table loading), distinct from Progress Bar's indeterminate mode — Spinner has no track/value concept at all, it's a pure animated icon + optional label.
Label,LabelPosition,SpinnerSize.Appearance– Primary or Inverted.AccessibleLabel,DisplayMode,OnChange.
Modern Tab List (ModernTabList@1.0.0)
Directly relevant to this app family — this is the real control for what Policy Tracker's Main_1 redesign hand-built as a GroupContainer + Classic/Button row (the segmented dashboard tab strip). Worth revisiting as a real upgrade once its exact live syntax is confirmed.
Items,Default,Selected(output — drive content visibility off this, e.g.ContentSection.Visible = TabList1.Selected.Value = "Overview").OnChange(fires on tab switch) vs.OnSelect(fires on any tab click, including re-clicking the active one).Appearance– typed enumTabListAppearance.Transparent/.Subtle/.Underline/.Filled.Alignment– typed enumTabListAlignment.Start/.Center(default) /.End— this is the whole tab list's position, distinct fromAlign(individual tab text alignment).- 2-7 tabs recommended; no auto horizontal scroll if too many tabs are added.
Modern Header
A prebuilt app-header control (logo + title + user photo). Deliberately NOT used as a replacement for this app family's fully custom top bars — it explicitly does not support colour customisation or app navigation, and doesn't auto-replicate across screens (must be added per screen manually). Documented here so it isn't reached for by mistake when a "modern header" is wanted; the custom conTopBar/conHeader pattern already used across Main/ViewItem/Main_1/ViewItem_1 remains the right approach for this app family.
Title,IsTitleVisible,Logo,IsLogoVisible,LogoMaxHeight,LogoToolTip,OnSelectLogo,IsProfilePictureVisible,Style,TitleFontSize.
Modern Link (ModernLink@1.0.0)
Text,Url(blocks unsafe schemes likejavascript:),Wrap(default true).Type– typed enumLinkAppearance.Default/LinkAppearance.Subtle. Renamed fromAppearancein an earlier version.- Standard Font/Border/Radius* properties.
Modern Info Button (ModernInformationButton@1.0.0)
Inline "?" help icon that opens a flyout on click/hover — good candidate for field-level hint text instead of a separate hidden lblHint Label pattern already used elsewhere in this app family (e.g. lblHighPriorityHint in ViewItem.yaml).
Content(flyout text),IconColor,OnSelect.- Default size 32x32 — docs explicitly recommend not going smaller for tap targets.
Modern Text (ModernText@1.0.0)
Already in live use throughout Main.yaml (the Published/ReadyForRelease/ApprovedBy/LinkCount pill labels on release cards) — confirmed real control, not just docs.
Text,Size,Color,FontWeight,Align,VerticalAlign(default is now Middle),Wrap,AutoHeight.Fill,BorderColor,BorderThickness,RadiusTopLeft/Right/BottomLeft/Right— this control CAN look like a pill/badge on its own (fill + border + radius), which is exactly how the real app already uses it for the release-card pills.DisplayModewas removed from the properties panel in a recent update — the property still technically exists for backward compatibility but has no visible effect. Don't rely on it to lock down aModernTextcontrol; useVisibleinstead if it needs to disappear.OnSelectnow exists (didn't used to) — aModernTextcan be a clickable label directly now, no need to layer an invisible Button on top purely for click behaviour (though the full-card-click pattern documented inknown-bad-patterns.md/live-build-lessons may still prefer a Rectangle/Button for other reasons — this doesn't override that, just noting the option exists).
Modern Card (ModernCard@1.0.0, preview)
Preview control — treat with extra suspicion in a full-screen YAML paste. The prose docs and the code examples on the same page don't even agree with each other: prose says the image-position property is ImagePosition, but every YAML example on the page uses ImagePlacement instead. That kind of doc/example mismatch is exactly the sort of thing that has broken pastes in this app before — get a live export before trusting either name.
Title,Subtitle,Description,Image,ImageAltText,HeaderImage,HeaderImageAltText.Direction(prose) /LayoutDirection(example) — same naming inconsistency as above,LayoutDirection.Horizontalis what the actual YAML examples use.Fillauto-contrasts title/subtitle/description text colour unlessTitleColor/SubtitleColor/DescriptionColorare set explicitly.- Could be a real upgrade path for Policy Tracker's hand-built release-list item cards eventually, but not until this control's real property names are confirmed live — don't use it in a full-paste screen override until then.
Label (Label@2.5.1) — Tooltip property
Confirmed live 2026-07-24 (Branch Contact Groups, lblRowTitle/lblGroupName) via an isolated payaml-validate Layer A test before use — Tooltip is a valid property on Label@2.5.1, showing the given text on hover. Useful pattern: combine with a character-cap truncation formula on Text (e.g. =If(Len(full) > N, Left(full, N) & "...", full)) so long dynamic text gets a visible "..." cutoff plus a full-text tooltip on hover, rather than silently clipping via Wrap: =false alone with no way to see the rest.
Control Defaults (Fresh-Control Lab)
Power Apps Control Defaults
Last checked: 2026-06-20
This reference is generated from fresh controls inserted into the live Power Apps editor without manual edits.
Source Evidence
- Classic fresh-control lab:
.sources/default-lab/LabClassic.txt(18 parsed controls) - Modern fresh-control lab:
.sources/default-lab/LabModern.txt(49 parsed controls)
Interpretation Rules
- Treat these as observed defaults from the user's tenant/editor, not universal Microsoft documentation.
- A serialized property means the fresh control export explicitly contained that property.
- An omitted property means the fresh control did not serialize it; do not invent a literal default value from absence alone.
XandYcame from the repeated insert positions in the lab. Do not use them as default evidence.Width,Height, theme colors, font values, generated gallery children, and generated template formulas can be useful evidence, but still check whether the guide is intentionally changing behavior.- Future guide rows should use this file to remove or label default-only properties as
leave defaultordefault/safety check.
Quick Summary
| Source | Control | Example | Variant/Layout | Serialized properties excluding X/Y |
|---|---|---|---|---|
| Classic fresh-control lab | Label@2.5.1 |
Label3 |
- | BorderColor -> =RGBA(0, 18, 107, 1); Font -> =Font.'Open Sans' |
| Classic fresh-control lab | Classic/Button@2.2.0 |
Button6 |
- | BorderColor -> =ColorFade(Self.Fill, -15%); Color -> =RGBA(255, 255, 255, 1); DisabledBorderColor -> =RGBA(166, 166, 166, 1); Fill -> =RGBA(56, 96, 178, 1); Font -> =Font.'Open Sans'; HoverBorderColor -> =ColorFade(Self.BorderColor, 20%); HoverColor -> =RGBA(255, 255, 255, 1); HoverFill -> =ColorFade(RGBA(56, 96, 178, 1), -20%); PressedBorderColor -> =Self.Fill; PressedColor -> =Self.Fill; PressedFill -> =Self.Color |
| Classic fresh-control lab | Gallery@2.15.0 |
Gallery4 |
Vertical | BorderColor -> =RGBA(0, 18, 107, 1) |
| Classic fresh-control lab | Gallery@2.15.0 |
Gallery5 |
Horizontal | BorderColor -> =RGBA(0, 18, 107, 1) |
| Classic fresh-control lab | Gallery@2.15.0 |
Gallery6 |
VariableHeight | BorderColor -> =RGBA(0, 18, 107, 1) |
| Classic fresh-control lab | Form@2.4.4 |
Form2 |
Classic, Vertical | BorderColor -> =RGBA(0, 18, 107, 1) |
| Classic fresh-control lab | FormViewer@2.3.4 |
FormViewer1 |
Vertical | BorderColor -> =RGBA(0, 18, 107, 1) |
| Classic fresh-control lab | Classic/TextInput@2.3.2 |
TextInput3 |
- | BorderColor -> =RGBA(0, 18, 107, 1); Font -> =Font.'Open Sans'; HoverBorderColor -> =RGBA(0, 18, 107, 1); HoverFill -> =RGBA(186, 202, 226, 1) |
| Classic fresh-control lab | Classic/DropDown@2.3.1 |
Dropdown1 |
- | BorderColor -> =RGBA(0, 18, 107, 1); ChevronBackground -> =RGBA(56, 96, 178, 1); ChevronFill -> =RGBA(255, 255, 255, 1); ChevronHoverBackground -> =ColorFade(RGBA(56, 96, 178, 1), -20%); ChevronHoverFill -> =RGBA(255, 255, 255, 1); Font -> =Font.'Open Sans'; HoverFill -> =RGBA(186, 202, 226, 1); Items.Value -> =Value; PressedColor -> =RGBA(255, 255, 255, 1); PressedFill -> =RGBA(0, 18, 107, 1); SelectionColor -> =RGBA(255, 255, 255, 1); SelectionFill -> =RGBA(56, 96, 178, 1) |
| Classic fresh-control lab | Classic/ComboBox@2.4.0 |
ComboBox1 |
- | BorderColor -> =RGBA(0, 18, 107, 1); ChevronBackground -> =RGBA(56, 96, 178, 1); ChevronFill -> =RGBA(255, 255, 255, 1); ChevronHoverBackground -> =ColorFade(RGBA(56, 96, 178, 1), -20%); ChevronHoverFill -> =RGBA(255, 255, 255, 1); Font -> =Font.'Open Sans'; HoverFill -> =RGBA(186, 202, 226, 1); PressedColor -> =RGBA(255, 255, 255, 1); PressedFill -> =RGBA(0, 18, 107, 1); SelectionColor -> =RGBA(255, 255, 255, 1); SelectionFill -> =RGBA(56, 96, 178, 1) |
| Classic fresh-control lab | DataTable@1.0.3 |
DataTable1 |
- | BorderColor -> =RGBA(0, 18, 107, 1); Font -> =Font.'Open Sans'; HeadingColor -> =RGBA(255, 255, 255, 1); HeadingFill -> =RGBA(56, 96, 178, 1); HeadingFont -> =Font.'Open Sans'; HoverFill -> =RGBA(186, 202, 226, .2); SelectedFill -> =RGBA(56, 96, 178, .2) |
| Classic fresh-control lab | Classic/DatePicker@2.6.0 |
DatePicker2 |
- | BorderColor -> =RGBA(0, 18, 107, 1); Font -> =Font.'Open Sans'; IconBackground -> =RGBA(56, 96, 178, 1); IconFill -> =RGBA(255, 255, 255, 1) |
| Classic fresh-control lab | Classic/CheckBox@2.1.0 |
Checkbox1 |
- | BorderColor -> =RGBA(0, 18, 107, 1); CheckboxBorderColor -> =RGBA(0, 18, 107, 1); CheckmarkFill -> =RGBA(0, 0, 0, 1); Font -> =Font.'Open Sans'; HoverColor -> =RGBA(0, 18, 107, 1) |
| Classic fresh-control lab | Classic/Radio@2.3.0 |
Radio2 |
- | BorderColor -> =RGBA(0, 18, 107, 1); Font -> =Font.'Open Sans'; HoverColor -> =RGBA(0, 18, 107, 1); Items.Value -> =Value; RadioBorderColor -> =RGBA(0, 18, 107, 1); RadioSelectionFill -> =RGBA(0, 0, 0, 1) |
| Classic fresh-control lab | Classic/Toggle@2.1.0 |
Toggle2 |
- | BorderColor -> =RGBA(0, 18, 107, 1); Font -> =Font.'Open Sans'; TrueFill -> =RGBA(56, 96, 178, 1) |
| Classic fresh-control lab | Classic/Slider@2.1.0 |
Slider2 |
- | BorderColor -> =RGBA(0, 18, 107, 1); ValueFill -> =RGBA(0, 18, 107, 1) |
| Classic fresh-control lab | Rating@2.1.0 |
Rating1 |
- | BorderColor -> =RGBA(0, 18, 107, 1); RatingFill -> =RGBA(0, 18, 107, 1) |
| Classic fresh-control lab | Classic/Icon@2.5.0 |
Icon2 |
- | BorderColor -> =RGBA(0, 18, 107, 1); Color -> =RGBA(0, 18, 107, 1); Icon -> =Icon.Alarm |
| Modern fresh-control lab | GroupContainer@1.5.0 |
Container1 |
ManualLayout | none beyond placement |
| Modern fresh-control lab | GroupContainer@1.5.0 |
Container2 |
AutoLayout | LayoutAlignItems -> =LayoutAlignItems.Center; LayoutDirection -> =LayoutDirection.Horizontal; PaddingBottom -> =8; PaddingLeft -> =8; PaddingRight -> =8; PaddingTop -> =8 |
| Modern fresh-control lab | GroupContainer@1.5.0 |
Container3 |
AutoLayout | LayoutAlignItems -> =LayoutAlignItems.Center; LayoutDirection -> =LayoutDirection.Vertical; LayoutMinHeight -> =16; LayoutMinWidth -> =16; PaddingBottom -> =8; PaddingLeft -> =8; PaddingRight -> =8; PaddingTop -> =8 |
| Modern fresh-control lab | GroupContainer@1.5.0 |
Container4 |
GridLayout | LayoutMinHeight -> =16; LayoutMinWidth -> =16 |
| Modern fresh-control lab | Gallery@2.15.0 |
Gallery1 |
BrowseLayout_Vertical_TwoTextOneImageVariant_ver5.0 | BorderColor -> =RGBA(0, 18, 107, 1); Height -> =168; Width -> =468 |
| Modern fresh-control lab | Image@2.2.3 |
Image1 |
- | BorderColor -> =RGBA(0, 18, 107, 1); Height -> =72; OnSelect -> =Select(Parent); RadiusBottomLeft -> =8; RadiusBottomRight -> =8; RadiusTopLeft -> =8; RadiusTopRight -> =8; Width -> =72 |
| Modern fresh-control lab | Label@2.5.1 |
Title1 |
- | BorderColor -> =RGBA(0, 0, 0, 1); Color -> =RGBA(50, 49, 48, 1); Font -> =Font.'Open Sans'; FontWeight -> =If(ThisItem.IsSelected, FontWeight.Semibold, FontWeight.Normal); Height -> =Self.Size * 1.8; OnSelect -> =Select(Parent); PaddingBottom -> =0; PaddingLeft -> =0; PaddingRight -> =0; PaddingTop -> =0; Size -> =14; Text -> =ThisItem.SampleHeading; VerticalAlign -> =VerticalAlign.Top; Width -> =Parent.TemplateWidth - 173 |
| Modern fresh-control lab | Label@2.5.1 |
Subtitle1 |
- | BorderColor -> =RGBA(0, 0, 0, 1); Font -> =Font.'Open Sans'; FontWeight -> =If(ThisItem.IsSelected, FontWeight.Semibold, FontWeight.Normal); Height -> =Self.Size * 1.8; OnSelect -> =Select(Parent); PaddingBottom -> =0; PaddingLeft -> =0; PaddingRight -> =0; PaddingTop -> =0; Size -> =12; Text -> =ThisItem.SampleText; VerticalAlign -> =VerticalAlign.Top; Width -> =Title1.Width |
| Modern fresh-control lab | Classic/Icon@2.5.0 |
NextArrow1 |
- | AccessibleLabel -> =Self.Tooltip; BorderColor -> =RGBA(0, 0, 0, 1); Color -> =RGBA(166, 166, 166, 1); DisabledBorderColor -> =RGBA(56, 56, 56, 1); DisabledColor -> =RGBA(119, 119, 119, 1); Height -> =50; Icon -> =Icon.ChevronRight; OnSelect -> =Select(Parent); PaddingBottom -> =16; PaddingLeft -> =16; PaddingRight -> =16; PaddingTop -> =16; Tooltip -> ="View item details"; Width -> =50 |
| Modern fresh-control lab | Rectangle@2.3.0 |
Separator1 |
- | BorderColor -> =RGBA(0, 18, 107, 1); Fill -> =RGBA(255, 255, 255, 1); Height -> =8; OnSelect -> =Select(Parent); Width -> =Parent.TemplateWidth |
| Modern fresh-control lab | Rectangle@2.3.0 |
Rectangle1 |
- | BorderColor -> =RGBA(0, 18, 107, 1); Fill -> =RGBA(0, 18, 107, 1); Height -> =Parent.TemplateHeight - Separator1.Height; OnSelect -> =Select(Parent); Visible -> =ThisItem.IsSelected; Width -> =1 |
| Modern fresh-control lab | Gallery@2.15.0 |
Gallery2 |
BrowseLayout_Horizontal_TwoTextOneImageVariant_ver5.0 | BorderColor -> =RGBA(0, 18, 107, 1); Height -> =168; Width -> =468 |
| Modern fresh-control lab | Image@2.2.3 |
Image2 |
- | BorderColor -> =RGBA(0, 18, 107, 1); Height -> =72; ImagePosition -> =ImagePosition.Fill; OnSelect -> =Select(Parent); RadiusBottomLeft -> =8; RadiusBottomRight -> =8; RadiusTopLeft -> =8; RadiusTopRight -> =8; Width -> =Parent.TemplateWidth - 32 |
| Modern fresh-control lab | Label@2.5.1 |
Title2 |
- | BorderColor -> =RGBA(0, 0, 0, 1); Color -> =RGBA(50, 49, 48, 1); Font -> =Font.'Open Sans'; FontWeight -> =If(ThisItem.IsSelected, FontWeight.Semibold, FontWeight.Normal); Height -> =Self.Size * 1.8; OnSelect -> =Select(Parent); PaddingBottom -> =0; PaddingLeft -> =0; PaddingRight -> =0; PaddingTop -> =0; Size -> =14; Text -> =ThisItem.SampleHeading; VerticalAlign -> =VerticalAlign.Top; Width -> =Parent.TemplateWidth - 64 |
| Modern fresh-control lab | Label@2.5.1 |
Subtitle2 |
- | BorderColor -> =RGBA(0, 0, 0, 1); Font -> =Font.'Open Sans'; FontWeight -> =If(ThisItem.IsSelected, FontWeight.Semibold, FontWeight.Normal); Height -> =Self.Size * 1.8; OnSelect -> =Select(Parent); PaddingBottom -> =0; PaddingLeft -> =0; PaddingRight -> =0; PaddingTop -> =0; Size -> =12; Text -> =ThisItem.SampleText; VerticalAlign -> =VerticalAlign.Top; Width -> =Title2.Width |
| Modern fresh-control lab | Gallery@2.15.0 |
Gallery3 |
BrowseLayout_Flexible_SocialFeed_ver5.0 | BorderColor -> =RGBA(0, 18, 107, 1); Height -> =168; Width -> =468 |
| Modern fresh-control lab | Image@2.2.3 |
ProfileImage1 |
- | BorderColor -> =RGBA(0, 18, 107, 1); Height -> =12; ImagePosition -> =ImagePosition.Fill; OnSelect -> =Select(Parent); RadiusBottomLeft -> =8; RadiusBottomRight -> =8; RadiusTopLeft -> =8; RadiusTopRight -> =8; Width -> =64 |
| Modern fresh-control lab | Label@2.5.1 |
Title3 |
- | BorderColor -> =RGBA(0, 0, 0, 1); Color -> =RGBA(50, 49, 48, 1); Font -> =Font.'Open Sans'; FontWeight -> =If(ThisItem.IsSelected, FontWeight.Semibold, FontWeight.Normal); Height -> =12; OnSelect -> =Select(Parent); PaddingBottom -> =0; PaddingLeft -> =0; PaddingRight -> =0; PaddingTop -> =0; Size -> =14; Text -> =ThisItem.SampleHeading; VerticalAlign -> =VerticalAlign.Top; Width -> =Parent.TemplateWidth - 112 |
| Modern fresh-control lab | Image@2.2.3 |
Image3 |
- | BorderColor -> =RGBA(0, 18, 107, 1); Height -> =Min(Self.Width, Parent.TemplateHeight - 180); ImagePosition -> =ImagePosition.Fill; OnSelect -> =Select(Parent); RadiusBottomLeft -> =8; RadiusBottomRight -> =8; RadiusTopLeft -> =8; RadiusTopRight -> =8; Width -> =Parent.TemplateWidth - 32 |
| Modern fresh-control lab | Label@2.5.1 |
Body1 |
- | AutoHeight -> =true; BorderColor -> =RGBA(0, 0, 0, 1); Font -> =Font.'Open Sans'; FontWeight -> =If(ThisItem.IsSelected, FontWeight.Semibold, FontWeight.Normal); Height -> =12; OnSelect -> =Select(Parent); PaddingBottom -> =0; PaddingLeft -> =0; PaddingRight -> =0; PaddingTop -> =0; Size -> =12; Text -> =ThisItem.SampleText; VerticalAlign -> =VerticalAlign.Top; Width -> =Parent.TemplateWidth - 32 |
| Modern fresh-control lab | Header@0.0.44 |
Header1 |
- | none beyond placement |
| Modern fresh-control lab | Form@2.4.4 |
Form1 |
Vertical | BorderColor -> =RGBA(0, 18, 107, 1) |
| Modern fresh-control lab | ModernButton@1.0.0 |
Button5 |
- | none beyond placement |
| Modern fresh-control lab | ModernTextInput@1.1.0 |
TextInput2 |
- | none beyond placement |
| Modern fresh-control lab | ModernNumberInput@1.1.0 |
NumberInput1 |
- | none beyond placement |
| Modern fresh-control lab | ModernDropdown@1.0.1 |
modernDropdown2 |
- | none beyond placement |
| Modern fresh-control lab | ModernCombobox@1.1.0 |
Combobox3 |
- | none beyond placement |
| Modern fresh-control lab | ModernDatePicker@1.0.0 |
DatePicker1 |
- | none beyond placement |
| Modern fresh-control lab | CheckBox@0.0.30 |
CheckboxCanvas1 |
- | none beyond placement |
| Modern fresh-control lab | ModernRadio@1.0.0 |
Radio1 |
- | none beyond placement |
| Modern fresh-control lab | Toggle@1.1.5 |
Toggle1 |
- | none beyond placement |
| Modern fresh-control lab | PenInput@2.3.0 |
PenInput1 |
- | BorderColor -> =RGBA(0, 18, 107, 1) |
| Modern fresh-control lab | ModernTabList@1.0.0 |
TabList1 |
- | none beyond placement |
| Modern fresh-control lab | ModernSlider@1.0.0 |
Slider1 |
- | none beyond placement |
| Modern fresh-control lab | ListBox@2.2.0 |
ListBox1 |
- | BorderColor -> =RGBA(0, 18, 107, 1); Font -> =Font.'Open Sans'; HoverFill -> =RGBA(186, 202, 226, 1); Items.Value -> =Value; PressedColor -> =RGBA(255, 255, 255, 1); PressedFill -> =RGBA(0, 18, 107, 1); SelectionColor -> =RGBA(255, 255, 255, 1); SelectionFill -> =RGBA(56, 96, 178, 1) |
| Modern fresh-control lab | RichTextEditor@2.7.0 |
RichTextEditor1 |
- | BorderColor -> =RGBA(0, 18, 107, 1) |
| Modern fresh-control lab | ModernText@1.0.0 |
Text1 |
- | none beyond placement |
| Modern fresh-control lab | ModernInformationButton@1.0.0 |
InformationButton1 |
- | none beyond placement |
| Modern fresh-control lab | ModernIcon@1.1.0 |
Icon1 |
- | none beyond placement |
| Modern fresh-control lab | Avatar@1.0.40 |
Avatar1 |
- | none beyond placement |
| Modern fresh-control lab | Badge@0.0.24 |
BadgeCanvas1 |
- | none beyond placement |
| Modern fresh-control lab | ModernCard@1.2.0 |
Card1 |
- | none beyond placement |
| Modern fresh-control lab | Progress@1.1.34 |
Progress1 |
- | none beyond placement |
| Modern fresh-control lab | Spinner@1.4.6 |
Spinner1 |
- | none beyond placement |
| Modern fresh-control lab | ModernLink@1.0.0 |
Link1 |
- | none beyond placement |
| Modern fresh-control lab | Timer@2.1.0 |
Timer1 |
- | BorderColor -> =ColorFade(Self.Fill, -15%); Color -> =RGBA(255, 255, 255, 1); DisabledBorderColor -> =ColorFade(Self.BorderColor, 70%); DisabledColor -> =ColorFade(Self.Fill, 90%); DisabledFill -> =ColorFade(Self.Fill, 70%); Fill -> =RGBA(56, 96, 178, 1); Font -> =Font.'Open Sans'; HoverBorderColor -> =ColorFade(Self.BorderColor, 20%); HoverColor -> =RGBA(255, 255, 255, 1); HoverFill -> =ColorFade(RGBA(56, 96, 178, 1), -20%); PressedBorderColor -> =Self.Fill; PressedColor -> =Self.Fill; PressedFill -> =Self.Color |
| Modern fresh-control lab | HtmlViewer@2.1.0 |
HtmlText1 |
- | Font -> =Font.'Open Sans' |
| Modern fresh-control lab | Image@2.2.3 |
Image4 |
- | BorderColor -> =RGBA(0, 18, 107, 1) |
| Modern fresh-control lab | PDFViewer@2.5.0 |
PdfViewer1 |
- | none beyond placement |
Full Parsed Details
Classic fresh-control lab
Label3 - Label@2.5.1
- Path:
Label3 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Font |
=Font.'Open Sans' |
|
X |
=40 |
placement from lab insert order; ignore as default evidence |
Y |
=40 |
placement from lab insert order; ignore as default evidence |
Button6 - Classic/Button@2.2.0
- Path:
Button6 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=ColorFade(Self.Fill, -15%) |
|
Color |
=RGBA(255, 255, 255, 1) |
|
DisabledBorderColor |
=RGBA(166, 166, 166, 1) |
|
Fill |
=RGBA(56, 96, 178, 1) |
|
Font |
=Font.'Open Sans' |
|
HoverBorderColor |
=ColorFade(Self.BorderColor, 20%) |
|
HoverColor |
=RGBA(255, 255, 255, 1) |
|
HoverFill |
=ColorFade(RGBA(56, 96, 178, 1), -20%) |
|
PressedBorderColor |
=Self.Fill |
|
PressedColor |
=Self.Fill |
|
PressedFill |
=Self.Color |
|
X |
=60 |
placement from lab insert order; ignore as default evidence |
Y |
=60 |
placement from lab insert order; ignore as default evidence |
Gallery4 - Gallery@2.15.0 - variant Vertical
- Path:
Gallery4 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
X |
=80 |
placement from lab insert order; ignore as default evidence |
Y |
=80 |
placement from lab insert order; ignore as default evidence |
Gallery5 - Gallery@2.15.0 - variant Horizontal
- Path:
Gallery5 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
X |
=100 |
placement from lab insert order; ignore as default evidence |
Y |
=100 |
placement from lab insert order; ignore as default evidence |
Gallery6 - Gallery@2.15.0 - variant VariableHeight
- Path:
Gallery6 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
X |
=120 |
placement from lab insert order; ignore as default evidence |
Y |
=120 |
placement from lab insert order; ignore as default evidence |
Form2 - Form@2.4.4 - variant Classic - layout Vertical
- Path:
Form2 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
X |
=140 |
placement from lab insert order; ignore as default evidence |
Y |
=140 |
placement from lab insert order; ignore as default evidence |
FormViewer1 - FormViewer@2.3.4 - layout Vertical
- Path:
FormViewer1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
X |
=160 |
placement from lab insert order; ignore as default evidence |
Y |
=160 |
placement from lab insert order; ignore as default evidence |
TextInput3 - Classic/TextInput@2.3.2
- Path:
TextInput3 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Font |
=Font.'Open Sans' |
|
HoverBorderColor |
=RGBA(0, 18, 107, 1) |
|
HoverFill |
=RGBA(186, 202, 226, 1) |
|
X |
=180 |
placement from lab insert order; ignore as default evidence |
Y |
=180 |
placement from lab insert order; ignore as default evidence |
Dropdown1 - Classic/DropDown@2.3.1
- Path:
Dropdown1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
ChevronBackground |
=RGBA(56, 96, 178, 1) |
|
ChevronFill |
=RGBA(255, 255, 255, 1) |
|
ChevronHoverBackground |
=ColorFade(RGBA(56, 96, 178, 1), -20%) |
|
ChevronHoverFill |
=RGBA(255, 255, 255, 1) |
|
Font |
=Font.'Open Sans' |
|
HoverFill |
=RGBA(186, 202, 226, 1) |
|
Items.Value |
=Value |
|
PressedColor |
=RGBA(255, 255, 255, 1) |
|
PressedFill |
=RGBA(0, 18, 107, 1) |
|
SelectionColor |
=RGBA(255, 255, 255, 1) |
|
SelectionFill |
=RGBA(56, 96, 178, 1) |
|
X |
=200 |
placement from lab insert order; ignore as default evidence |
Y |
=200 |
placement from lab insert order; ignore as default evidence |
ComboBox1 - Classic/ComboBox@2.4.0
- Path:
ComboBox1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
ChevronBackground |
=RGBA(56, 96, 178, 1) |
|
ChevronFill |
=RGBA(255, 255, 255, 1) |
|
ChevronHoverBackground |
=ColorFade(RGBA(56, 96, 178, 1), -20%) |
|
ChevronHoverFill |
=RGBA(255, 255, 255, 1) |
|
Font |
=Font.'Open Sans' |
|
HoverFill |
=RGBA(186, 202, 226, 1) |
|
PressedColor |
=RGBA(255, 255, 255, 1) |
|
PressedFill |
=RGBA(0, 18, 107, 1) |
|
SelectionColor |
=RGBA(255, 255, 255, 1) |
|
SelectionFill |
=RGBA(56, 96, 178, 1) |
|
X |
=220 |
placement from lab insert order; ignore as default evidence |
Y |
=220 |
placement from lab insert order; ignore as default evidence |
DataTable1 - DataTable@1.0.3
- Path:
DataTable1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Font |
=Font.'Open Sans' |
|
HeadingColor |
=RGBA(255, 255, 255, 1) |
|
HeadingFill |
=RGBA(56, 96, 178, 1) |
|
HeadingFont |
=Font.'Open Sans' |
|
HoverFill |
=RGBA(186, 202, 226, .2) |
|
SelectedFill |
=RGBA(56, 96, 178, .2) |
|
X |
=240 |
placement from lab insert order; ignore as default evidence |
Y |
=240 |
placement from lab insert order; ignore as default evidence |
DatePicker2 - Classic/DatePicker@2.6.0
- Path:
DatePicker2 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Font |
=Font.'Open Sans' |
|
IconBackground |
=RGBA(56, 96, 178, 1) |
|
IconFill |
=RGBA(255, 255, 255, 1) |
|
X |
=260 |
placement from lab insert order; ignore as default evidence |
Y |
=260 |
placement from lab insert order; ignore as default evidence |
Checkbox1 - Classic/CheckBox@2.1.0
- Path:
Checkbox1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
CheckboxBorderColor |
=RGBA(0, 18, 107, 1) |
|
CheckmarkFill |
=RGBA(0, 0, 0, 1) |
|
Font |
=Font.'Open Sans' |
|
HoverColor |
=RGBA(0, 18, 107, 1) |
|
X |
=280 |
placement from lab insert order; ignore as default evidence |
Y |
=280 |
placement from lab insert order; ignore as default evidence |
Radio2 - Classic/Radio@2.3.0
- Path:
Radio2 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Font |
=Font.'Open Sans' |
|
HoverColor |
=RGBA(0, 18, 107, 1) |
|
Items.Value |
=Value |
|
RadioBorderColor |
=RGBA(0, 18, 107, 1) |
|
RadioSelectionFill |
=RGBA(0, 0, 0, 1) |
|
X |
=300 |
placement from lab insert order; ignore as default evidence |
Y |
=300 |
placement from lab insert order; ignore as default evidence |
Toggle2 - Classic/Toggle@2.1.0
- Path:
Toggle2 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Font |
=Font.'Open Sans' |
|
TrueFill |
=RGBA(56, 96, 178, 1) |
|
X |
=320 |
placement from lab insert order; ignore as default evidence |
Y |
=320 |
placement from lab insert order; ignore as default evidence |
Slider2 - Classic/Slider@2.1.0
- Path:
Slider2 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
ValueFill |
=RGBA(0, 18, 107, 1) |
|
X |
=340 |
placement from lab insert order; ignore as default evidence |
Y |
=340 |
placement from lab insert order; ignore as default evidence |
Rating1 - Rating@2.1.0
- Path:
Rating1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
RatingFill |
=RGBA(0, 18, 107, 1) |
|
X |
=360 |
placement from lab insert order; ignore as default evidence |
Y |
=360 |
placement from lab insert order; ignore as default evidence |
Icon2 - Classic/Icon@2.5.0
- Path:
Icon2 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Color |
=RGBA(0, 18, 107, 1) |
|
Icon |
=Icon.Alarm |
|
X |
=380 |
placement from lab insert order; ignore as default evidence |
Y |
=380 |
placement from lab insert order; ignore as default evidence |
Modern fresh-control lab
Container1 - GroupContainer@1.5.0 - variant ManualLayout
- Path:
Container1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=40 |
placement from lab insert order; ignore as default evidence |
Y |
=40 |
placement from lab insert order; ignore as default evidence |
Container2 - GroupContainer@1.5.0 - variant AutoLayout
- Path:
Container1 > Container2 - Depth:
1
| Property | Observed fresh value | Note |
|---|---|---|
LayoutAlignItems |
=LayoutAlignItems.Center |
|
LayoutDirection |
=LayoutDirection.Horizontal |
|
PaddingBottom |
=8 |
|
PaddingLeft |
=8 |
|
PaddingRight |
=8 |
|
PaddingTop |
=8 |
Container3 - GroupContainer@1.5.0 - variant AutoLayout
- Path:
Container1 > Container2 > Container3 - Depth:
2
| Property | Observed fresh value | Note |
|---|---|---|
LayoutAlignItems |
=LayoutAlignItems.Center |
|
LayoutDirection |
=LayoutDirection.Vertical |
|
LayoutMinHeight |
=16 |
|
LayoutMinWidth |
=16 |
|
PaddingBottom |
=8 |
|
PaddingLeft |
=8 |
|
PaddingRight |
=8 |
|
PaddingTop |
=8 |
Container4 - GroupContainer@1.5.0 - variant GridLayout
- Path:
Container1 > Container2 > Container3 > Container4 - Depth:
3
| Property | Observed fresh value | Note |
|---|---|---|
LayoutMinHeight |
=16 |
|
LayoutMinWidth |
=16 |
Gallery1 - Gallery@2.15.0 - variant BrowseLayout_Vertical_TwoTextOneImageVariant_ver5.0
- Path:
Container1 > Container2 > Container3 > Container4 > Gallery1 - Depth:
4
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Height |
=168 |
|
Width |
=468 |
|
X |
=40 |
placement from lab insert order; ignore as default evidence |
Y |
=40 |
placement from lab insert order; ignore as default evidence |
Image1 - Image@2.2.3
- Path:
Container1 > Container2 > Container3 > Container4 > Gallery1 > Image1 - Depth:
5
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Height |
=72 |
|
OnSelect |
=Select(Parent) |
|
RadiusBottomLeft |
=8 |
|
RadiusBottomRight |
=8 |
|
RadiusTopLeft |
=8 |
|
RadiusTopRight |
=8 |
|
Width |
=72 |
|
Y |
=(Parent.TemplateHeight / 2) - (Self.Height / 2) |
placement from lab insert order; ignore as default evidence |
Title1 - Label@2.5.1
- Path:
Container1 > Container2 > Container3 > Container4 > Gallery1 > Title1 - Depth:
5
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 0, 0, 1) |
|
Color |
=RGBA(50, 49, 48, 1) |
|
Font |
=Font.'Open Sans' |
|
FontWeight |
=If(ThisItem.IsSelected, FontWeight.Semibold, FontWeight.Normal) |
|
Height |
=Self.Size * 1.8 |
|
OnSelect |
=Select(Parent) |
|
PaddingBottom |
=0 |
|
PaddingLeft |
=0 |
|
PaddingRight |
=0 |
|
PaddingTop |
=0 |
|
Size |
=14 |
|
Text |
=ThisItem.SampleHeading |
|
VerticalAlign |
=VerticalAlign.Top |
|
Width |
=Parent.TemplateWidth - 173 |
|
X |
=1 |
placement from lab insert order; ignore as default evidence |
Y |
=(Parent.TemplateHeight - (Self.Size * 1.8 + Subtitle1.Size * 1.8)) / 2 |
placement from lab insert order; ignore as default evidence |
Subtitle1 - Label@2.5.1
- Path:
Container1 > Container2 > Container3 > Container4 > Gallery1 > Subtitle1 - Depth:
5
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 0, 0, 1) |
|
Font |
=Font.'Open Sans' |
|
FontWeight |
=If(ThisItem.IsSelected, FontWeight.Semibold, FontWeight.Normal) |
|
Height |
=Self.Size * 1.8 |
|
OnSelect |
=Select(Parent) |
|
PaddingBottom |
=0 |
|
PaddingLeft |
=0 |
|
PaddingRight |
=0 |
|
PaddingTop |
=0 |
|
Size |
=12 |
|
Text |
=ThisItem.SampleText |
|
VerticalAlign |
=VerticalAlign.Top |
|
Width |
=Title1.Width |
|
X |
=1 |
placement from lab insert order; ignore as default evidence |
Y |
=Title1.Y + Title1.Height |
placement from lab insert order; ignore as default evidence |
NextArrow1 - Classic/Icon@2.5.0
- Path:
Container1 > Container2 > Container3 > Container4 > Gallery1 > NextArrow1 - Depth:
5
| Property | Observed fresh value | Note |
|---|---|---|
AccessibleLabel |
=Self.Tooltip |
|
BorderColor |
=RGBA(0, 0, 0, 1) |
|
Color |
=RGBA(166, 166, 166, 1) |
|
DisabledBorderColor |
=RGBA(56, 56, 56, 1) |
|
DisabledColor |
=RGBA(119, 119, 119, 1) |
|
Height |
=50 |
|
Icon |
=Icon.ChevronRight |
|
OnSelect |
=Select(Parent) |
|
PaddingBottom |
=16 |
|
PaddingLeft |
=16 |
|
PaddingRight |
=16 |
|
PaddingTop |
=16 |
|
Tooltip |
="View item details" |
|
Width |
=50 |
|
Y |
=(Parent.TemplateHeight / 2) - (Self.Height / 2) |
placement from lab insert order; ignore as default evidence |
Separator1 - Rectangle@2.3.0
- Path:
Container1 > Container2 > Container3 > Container4 > Gallery1 > Separator1 - Depth:
5
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Fill |
=RGBA(255, 255, 255, 1) |
|
Height |
=8 |
|
OnSelect |
=Select(Parent) |
|
Width |
=Parent.TemplateWidth |
|
Y |
=Parent.TemplateHeight - Self.Height |
placement from lab insert order; ignore as default evidence |
Rectangle1 - Rectangle@2.3.0
- Path:
Container1 > Container2 > Container3 > Container4 > Gallery1 > Rectangle1 - Depth:
5
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Fill |
=RGBA(0, 18, 107, 1) |
|
Height |
=Parent.TemplateHeight - Separator1.Height |
|
OnSelect |
=Select(Parent) |
|
Visible |
=ThisItem.IsSelected |
|
Width |
=1 |
Gallery2 - Gallery@2.15.0 - variant BrowseLayout_Horizontal_TwoTextOneImageVariant_ver5.0
- Path:
Container1 > Container2 > Container3 > Container4 > Gallery2 - Depth:
4
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Height |
=168 |
|
Width |
=468 |
|
X |
=40 |
placement from lab insert order; ignore as default evidence |
Y |
=40 |
placement from lab insert order; ignore as default evidence |
Image2 - Image@2.2.3
- Path:
Container1 > Container2 > Container3 > Container4 > Gallery2 > Image2 - Depth:
5
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Height |
=72 |
|
ImagePosition |
=ImagePosition.Fill |
|
OnSelect |
=Select(Parent) |
|
RadiusBottomLeft |
=8 |
|
RadiusBottomRight |
=8 |
|
RadiusTopLeft |
=8 |
|
RadiusTopRight |
=8 |
|
Width |
=Parent.TemplateWidth - 32 |
|
X |
=(Parent.TemplateWidth / 2) - (Self.Width / 2) |
placement from lab insert order; ignore as default evidence |
Title2 - Label@2.5.1
- Path:
Container1 > Container2 > Container3 > Container4 > Gallery2 > Title2 - Depth:
5
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 0, 0, 1) |
|
Color |
=RGBA(50, 49, 48, 1) |
|
Font |
=Font.'Open Sans' |
|
FontWeight |
=If(ThisItem.IsSelected, FontWeight.Semibold, FontWeight.Normal) |
|
Height |
=Self.Size * 1.8 |
|
OnSelect |
=Select(Parent) |
|
PaddingBottom |
=0 |
|
PaddingLeft |
=0 |
|
PaddingRight |
=0 |
|
PaddingTop |
=0 |
|
Size |
=14 |
|
Text |
=ThisItem.SampleHeading |
|
VerticalAlign |
=VerticalAlign.Top |
|
Width |
=Parent.TemplateWidth - 64 |
|
X |
=1 |
placement from lab insert order; ignore as default evidence |
Y |
=47 |
placement from lab insert order; ignore as default evidence |
Subtitle2 - Label@2.5.1
- Path:
Container1 > Container2 > Container3 > Container4 > Gallery2 > Subtitle2 - Depth:
5
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 0, 0, 1) |
|
Font |
=Font.'Open Sans' |
|
FontWeight |
=If(ThisItem.IsSelected, FontWeight.Semibold, FontWeight.Normal) |
|
Height |
=Self.Size * 1.8 |
|
OnSelect |
=Select(Parent) |
|
PaddingBottom |
=0 |
|
PaddingLeft |
=0 |
|
PaddingRight |
=0 |
|
PaddingTop |
=0 |
|
Size |
=12 |
|
Text |
=ThisItem.SampleText |
|
VerticalAlign |
=VerticalAlign.Top |
|
Width |
=Title2.Width |
|
X |
=1 |
placement from lab insert order; ignore as default evidence |
Y |
=51 |
placement from lab insert order; ignore as default evidence |
Gallery3 - Gallery@2.15.0 - variant BrowseLayout_Flexible_SocialFeed_ver5.0
- Path:
Container1 > Container2 > Container3 > Container4 > Gallery3 - Depth:
4
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Height |
=168 |
|
Width |
=468 |
|
X |
=40 |
placement from lab insert order; ignore as default evidence |
Y |
=40 |
placement from lab insert order; ignore as default evidence |
ProfileImage1 - Image@2.2.3
- Path:
Container1 > Container2 > Container3 > Container4 > Gallery3 > ProfileImage1 - Depth:
5
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Height |
=12 |
|
ImagePosition |
=ImagePosition.Fill |
|
OnSelect |
=Select(Parent) |
|
RadiusBottomLeft |
=8 |
|
RadiusBottomRight |
=8 |
|
RadiusTopLeft |
=8 |
|
RadiusTopRight |
=8 |
|
Width |
=64 |
Title3 - Label@2.5.1
- Path:
Container1 > Container2 > Container3 > Container4 > Gallery3 > Title3 - Depth:
5
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 0, 0, 1) |
|
Color |
=RGBA(50, 49, 48, 1) |
|
Font |
=Font.'Open Sans' |
|
FontWeight |
=If(ThisItem.IsSelected, FontWeight.Semibold, FontWeight.Normal) |
|
Height |
=12 |
|
OnSelect |
=Select(Parent) |
|
PaddingBottom |
=0 |
|
PaddingLeft |
=0 |
|
PaddingRight |
=0 |
|
PaddingTop |
=0 |
|
Size |
=14 |
|
Text |
=ThisItem.SampleHeading |
|
VerticalAlign |
=VerticalAlign.Top |
|
Width |
=Parent.TemplateWidth - 112 |
|
X |
=1 |
placement from lab insert order; ignore as default evidence |
Image3 - Image@2.2.3
- Path:
Container1 > Container2 > Container3 > Container4 > Gallery3 > Image3 - Depth:
5
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Height |
=Min(Self.Width, Parent.TemplateHeight - 180) |
|
ImagePosition |
=ImagePosition.Fill |
|
OnSelect |
=Select(Parent) |
|
RadiusBottomLeft |
=8 |
|
RadiusBottomRight |
=8 |
|
RadiusTopLeft |
=8 |
|
RadiusTopRight |
=8 |
|
Width |
=Parent.TemplateWidth - 32 |
|
X |
=1 |
placement from lab insert order; ignore as default evidence |
Y |
=12 |
placement from lab insert order; ignore as default evidence |
Body1 - Label@2.5.1
- Path:
Container1 > Container2 > Container3 > Container4 > Gallery3 > Body1 - Depth:
5
| Property | Observed fresh value | Note |
|---|---|---|
AutoHeight |
=true |
|
BorderColor |
=RGBA(0, 0, 0, 1) |
|
Font |
=Font.'Open Sans' |
|
FontWeight |
=If(ThisItem.IsSelected, FontWeight.Semibold, FontWeight.Normal) |
|
Height |
=12 |
|
OnSelect |
=Select(Parent) |
|
PaddingBottom |
=0 |
|
PaddingLeft |
=0 |
|
PaddingRight |
=0 |
|
PaddingTop |
=0 |
|
Size |
=12 |
|
Text |
=ThisItem.SampleText |
|
VerticalAlign |
=VerticalAlign.Top |
|
Width |
=Parent.TemplateWidth - 32 |
|
X |
=1 |
placement from lab insert order; ignore as default evidence |
Header1 - Header@0.0.44
- Path:
Container1 > Container2 > Container3 > Container4 > Header1 - Depth:
4
| Property | Observed fresh value | Note |
|---|---|---|
X |
=40 |
placement from lab insert order; ignore as default evidence |
Y |
=40 |
placement from lab insert order; ignore as default evidence |
Form1 - Form@2.4.4 - layout Vertical
- Path:
Form1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
X |
=60 |
placement from lab insert order; ignore as default evidence |
Y |
=60 |
placement from lab insert order; ignore as default evidence |
Button5 - ModernButton@1.0.0
- Path:
Button5 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=80 |
placement from lab insert order; ignore as default evidence |
Y |
=80 |
placement from lab insert order; ignore as default evidence |
TextInput2 - ModernTextInput@1.1.0
- Path:
TextInput2 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=100 |
placement from lab insert order; ignore as default evidence |
Y |
=100 |
placement from lab insert order; ignore as default evidence |
NumberInput1 - ModernNumberInput@1.1.0
- Path:
NumberInput1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=120 |
placement from lab insert order; ignore as default evidence |
Y |
=120 |
placement from lab insert order; ignore as default evidence |
modernDropdown2 - ModernDropdown@1.0.1
- Path:
modernDropdown2 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=140 |
placement from lab insert order; ignore as default evidence |
Y |
=140 |
placement from lab insert order; ignore as default evidence |
Combobox3 - ModernCombobox@1.1.0
- Path:
Combobox3 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=160 |
placement from lab insert order; ignore as default evidence |
Y |
=160 |
placement from lab insert order; ignore as default evidence |
DatePicker1 - ModernDatePicker@1.0.0
- Path:
DatePicker1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=180 |
placement from lab insert order; ignore as default evidence |
Y |
=180 |
placement from lab insert order; ignore as default evidence |
CheckboxCanvas1 - CheckBox@0.0.30
- Path:
CheckboxCanvas1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=200 |
placement from lab insert order; ignore as default evidence |
Y |
=200 |
placement from lab insert order; ignore as default evidence |
Radio1 - ModernRadio@1.0.0
- Path:
Radio1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=220 |
placement from lab insert order; ignore as default evidence |
Y |
=220 |
placement from lab insert order; ignore as default evidence |
Toggle1 - Toggle@1.1.5
- Path:
Toggle1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=240 |
placement from lab insert order; ignore as default evidence |
Y |
=240 |
placement from lab insert order; ignore as default evidence |
PenInput1 - PenInput@2.3.0
- Path:
PenInput1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
X |
=260 |
placement from lab insert order; ignore as default evidence |
Y |
=260 |
placement from lab insert order; ignore as default evidence |
TabList1 - ModernTabList@1.0.0
- Path:
TabList1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=280 |
placement from lab insert order; ignore as default evidence |
Y |
=280 |
placement from lab insert order; ignore as default evidence |
Slider1 - ModernSlider@1.0.0
- Path:
Slider1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=300 |
placement from lab insert order; ignore as default evidence |
Y |
=300 |
placement from lab insert order; ignore as default evidence |
ListBox1 - ListBox@2.2.0
- Path:
ListBox1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
Font |
=Font.'Open Sans' |
|
HoverFill |
=RGBA(186, 202, 226, 1) |
|
Items.Value |
=Value |
|
PressedColor |
=RGBA(255, 255, 255, 1) |
|
PressedFill |
=RGBA(0, 18, 107, 1) |
|
SelectionColor |
=RGBA(255, 255, 255, 1) |
|
SelectionFill |
=RGBA(56, 96, 178, 1) |
|
X |
=320 |
placement from lab insert order; ignore as default evidence |
Y |
=320 |
placement from lab insert order; ignore as default evidence |
RichTextEditor1 - RichTextEditor@2.7.0
- Path:
RichTextEditor1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
X |
=340 |
placement from lab insert order; ignore as default evidence |
Y |
=340 |
placement from lab insert order; ignore as default evidence |
Text1 - ModernText@1.0.0
- Path:
Text1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=360 |
placement from lab insert order; ignore as default evidence |
Y |
=360 |
placement from lab insert order; ignore as default evidence |
InformationButton1 - ModernInformationButton@1.0.0
- Path:
InformationButton1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=380 |
placement from lab insert order; ignore as default evidence |
Y |
=380 |
placement from lab insert order; ignore as default evidence |
Icon1 - ModernIcon@1.1.0
- Path:
Icon1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=400 |
placement from lab insert order; ignore as default evidence |
Y |
=400 |
placement from lab insert order; ignore as default evidence |
Avatar1 - Avatar@1.0.40
- Path:
Avatar1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=420 |
placement from lab insert order; ignore as default evidence |
Y |
=420 |
placement from lab insert order; ignore as default evidence |
BadgeCanvas1 - Badge@0.0.24
- Path:
BadgeCanvas1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=440 |
placement from lab insert order; ignore as default evidence |
Y |
=440 |
placement from lab insert order; ignore as default evidence |
Card1 - ModernCard@1.2.0
- Path:
Card1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=460 |
placement from lab insert order; ignore as default evidence |
Y |
=460 |
placement from lab insert order; ignore as default evidence |
Progress1 - Progress@1.1.34
- Path:
Progress1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=480 |
placement from lab insert order; ignore as default evidence |
Y |
=480 |
placement from lab insert order; ignore as default evidence |
Spinner1 - Spinner@1.4.6
- Path:
Spinner1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=500 |
placement from lab insert order; ignore as default evidence |
Y |
=500 |
placement from lab insert order; ignore as default evidence |
Link1 - ModernLink@1.0.0
- Path:
Link1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=520 |
placement from lab insert order; ignore as default evidence |
Y |
=520 |
placement from lab insert order; ignore as default evidence |
Timer1 - Timer@2.1.0
- Path:
Timer1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=ColorFade(Self.Fill, -15%) |
|
Color |
=RGBA(255, 255, 255, 1) |
|
DisabledBorderColor |
=ColorFade(Self.BorderColor, 70%) |
|
DisabledColor |
=ColorFade(Self.Fill, 90%) |
|
DisabledFill |
=ColorFade(Self.Fill, 70%) |
|
Fill |
=RGBA(56, 96, 178, 1) |
|
Font |
=Font.'Open Sans' |
|
HoverBorderColor |
=ColorFade(Self.BorderColor, 20%) |
|
HoverColor |
=RGBA(255, 255, 255, 1) |
|
HoverFill |
=ColorFade(RGBA(56, 96, 178, 1), -20%) |
|
PressedBorderColor |
=Self.Fill |
|
PressedColor |
=Self.Fill |
|
PressedFill |
=Self.Color |
|
X |
=540 |
placement from lab insert order; ignore as default evidence |
Y |
=540 |
placement from lab insert order; ignore as default evidence |
HtmlText1 - HtmlViewer@2.1.0
- Path:
HtmlText1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
Font |
=Font.'Open Sans' |
|
X |
=560 |
placement from lab insert order; ignore as default evidence |
Y |
=560 |
placement from lab insert order; ignore as default evidence |
Image4 - Image@2.2.3
- Path:
Image4 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
BorderColor |
=RGBA(0, 18, 107, 1) |
|
X |
=580 |
placement from lab insert order; ignore as default evidence |
Y |
=580 |
placement from lab insert order; ignore as default evidence |
PdfViewer1 - PDFViewer@2.5.0
- Path:
PdfViewer1 - Depth:
0
| Property | Observed fresh value | Note |
|---|---|---|
X |
=600 |
placement from lab insert order; ignore as default evidence |
Y |
=288 |
placement from lab insert order; ignore as default evidence |
External Research: ChatGPT Property Matrix (context + precedence rule)
External Research: ChatGPT Control Property Matrix (2026-07-05)
Three files landed in reference/external/ from a separate ChatGPT research pass:
powerapps_canvas_control_bible_v0_1.md (curated summary, ~870 lines),
powerapps_canvas_control_property_matrix_v0_1.csv (raw property matrix, 412 rows),
and powerapps_canvas_control_bible_schema_v0_1.json (the CSV's column schema).
What this is good for
Much broader property-name coverage than this Bible had compiled by hand — 412
property rows across every Modern and Classic control Microsoft documents, including
controls this project hasn't touched yet (e.g. it flagged a Rating modern control
that was missing from CONTROL_VERIFICATION_CHECKLIST.md in the Policy Tracker repo —
added there now). Use it as a property-name dictionary: if you're not sure whether
a property exists on a control, check here first before guessing.
What this is NOT
It is honest about its own limits (its own intro says exactly this): it's derived from
Microsoft's documentation pages, the same source class that has been wrong or
incomplete multiple times in this project's actual live builds — ModernDatePicker.
SelectedDate not being settable, ModernCombobox.Reset() clearing the selection
instead of restoring it, Required not suppressing the clear-X on ModernDropdown,
GroupContainer.DropShadow defaulting on. None of those specific facts would have
been caught by more thorough documentation scraping, because the documentation itself
doesn't mention them — they were only found by touching the real, running control.
Its own confidence levels reflect this: of the 412 rows, ~171 are "High" (from an individual control's docs page), ~180 are "Medium" (inferred/shared, not verified per control), and the rest are "Gap flagged" (property list not even fully harvested yet). None are independently runtime-verified.
Precedence rule
When this external research conflicts with known-bad-patterns.md or
live-build-lessons.md, this project's own empirically-confirmed entries win, every
time. This matrix is a starting point for coverage on controls we haven't verified
yet, not a correction to anything we've already confirmed the hard way.
Two genuinely useful pointers surfaced by this research (not yet followed up)
microsoft/power-platform-skillsissue 101 — hidden/generated properties (e.g.SearchItemson searchable controls) that don't show up viadescribe_control/standard tooling. Worth checking if a control ever seems to have an internal property we can't find documented anywhere.microsoft/power-platform-skillsissue 146 —PowerBIIntegration, a runtime-injected host object, not a normal insertable control — can surprise an offline schema/compiler if ever encountered.
Full raw files: bible.md ·
property matrix (CSV) ·
schema (JSON)
ChatGPT Control Property Matrix (2026-07-05, docs-derived, unverified)
Power Apps Canvas Control Bible v0.1
A local, source-backed reference for Power Apps canvas controls, classic and modern. Built from the research session on 5 July 2026. This is deliberately honest: it separates confirmed Microsoft documentation from inferred/common properties and known gaps. It is useful now, but it is not pretending Microsoft has published a perfect canonical metadata dump.
Status
| Area | Status | Notes |
|---|---|---|
| Control inventory | Strong | Modern and classic/legacy documented control pages are listed from Microsoft Learn and the MicrosoftDocs GitHub tree. |
| Property dictionary | Strong for shared/common properties | Core, text, accessibility, size/location, colour/border and behaviour properties are normalised. |
| Full per-control property lists | Partial | Text input and Button are captured in detail for both classic and modern. Other controls are inventoried and marked for extraction/verification. |
| Enums and dropdown values | Partial | Some enum families are known, but exact accepted values vary by control/version. These must be checked in the individual page or Studio. |
| Hidden/generated/runtime properties | Known gap | SearchItems, PowerBIIntegration and hostControl-style objects need live/tooling verification. |
Source map
| Source | URL |
|---|---|
| Microsoft Learn, controls and properties in canvas apps | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/reference-properties |
| Microsoft Learn, modern controls reference | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-reference |
| Microsoft Learn, modern control updates | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-updates |
| Microsoft Learn, core properties | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/properties-core |
| Microsoft Learn, text properties | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/properties-text |
| Microsoft Learn, accessibility properties | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/properties-accessibility |
| Microsoft Learn, size and location properties | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/properties-size-location |
| Microsoft Learn, color and border properties | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/properties-color-border |
| Microsoft Learn, code view | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/code-view |
| Microsoft Learn, .pa.yaml source files | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/power-apps-yaml |
| Microsoft Docs GitHub repo, classic controls folder | https://github.com/MicrosoftDocs/powerapps-docs/tree/main/powerapps-docs/maker/canvas-apps/controls |
| Microsoft Docs GitHub repo, modern controls folder | https://github.com/MicrosoftDocs/powerapps-docs/tree/main/powerapps-docs/maker/canvas-apps/controls/modern-controls |
| Power Platform Skills issue 101, hidden/generated property gap | https://github.com/microsoft/power-platform-skills/issues/101 |
| Power Platform Skills issue 146, PowerBIIntegration host control gap | https://github.com/microsoft/power-platform-skills/issues/146 |
| Hardit Bhatia, The Power Addict modern control posts | https://thepoweraddict.com/text-input-everything-you-want-to-know-about-modern-control-21/ |
Control inventory: modern controls
| Control | Page slug | Notes |
|---|---|---|
| Avatar | modern-control-avatar | Modern control. Public summary page lists it. Exact complete property list should be harvested from the individual page/code view. |
| Badge | modern-control-badge | Modern control. Used for compact status/metadata labels. |
| Button | modern-control-button | Modern control. Full property list captured from research report. |
| Card | modern-control-card | Modern control. Separate page found in repo/docs. |
| Checkbox | modern-control-checkbox | Modern control. Boolean input. |
| Combobox | modern-control-combobox | Modern control. Choice picker with search, single or multiple selection depending configuration. |
| Copilot answer | modern-control-copilot-answer | Modern control. AI response display/control. Preview and tenant availability can vary. |
| Data Grid | modern-control-data-grid | Modern control. Page dated June 2026 in research. Uses Data Grid Column subcontrols. |
| Date picker | modern-control-date-picker | Modern control. Date input. |
| Dropdown | modern-control-dropdown | Modern control. Updated 2026 property naming noted in research. |
| Header | modern-control-header | Modern control. App/page header. |
| Icon | modern-control-icon | Modern control. Dedicated page found although not always listed on summary page. |
| Info button | modern-control-info-button | Modern control. Contextual help flyout/info. |
| Link | modern-control-link | Modern control. Hyperlink/clickable text. |
| Number input | modern-control-number-input | Modern control. Numeric input. |
| Progress bar | modern-control-progress-bar | Modern control. Progress/status display. |
| Radio group | modern-controls-radio-group | Modern control. Single selection from list. |
| Rating | modern-control-rating | Modern control. Dedicated page found although not always listed on summary page. |
| Slider | modern-control-slider | Modern control. Numeric range selector. |
| Spinner | modern-control-spinner | Modern control. Loading/progress indicator. |
| Stream | modern-control-stream | Modern control. Stream video/media integration. |
| Table | modern-control-table | Modern control. Preview status noted by Microsoft search snippet in research. |
| Tabs or tab list | modern-control-tabs-or-tabs-list | Modern control. Tabbed navigation/selection. |
| Text | modern-control-text | Modern control. Display text. |
| Text input | modern-control-text-input | Modern control. Full property list captured from research report. |
| Toggle | modern-control-toggle | Modern control. Boolean on/off input. |
Control inventory: classic, legacy, structural and related objects
| Control/object | Page slug | Notes |
|---|---|---|
| Add picture | control-add-picture | Image upload/capture style input. |
| Attachments | control-attachments | Dataverse/SharePoint attachment editing control. |
| Audio | control-audio-video | Media playback. |
| Barcode reader | control-barcodereader | Modern-ish scanner experience in canvas apps, device dependent. |
| Barcode scanner | control-new-barcode-scanner | Legacy scanner control, platform dependent. |
| Button | control-button | Classic action button. Full list captured. |
| Camera | control-camera | Device camera capture. Platform limitations apply. |
| Card | control-card | Form card structural object, not normal top-level insertable in the same sense as Button. |
| Check box | control-check-box | Classic boolean input. |
| Column chart | control-column-line-chart | Chart display. |
| Line chart | control-column-line-chart | Chart display. |
| Column | control-column | Data table column subcontrol/object. |
| Combo box | control-combo-box | Classic searchable choice picker. |
| Container | control-container | Manual layout container. |
| Data table | control-data-table | Legacy data table display/editing surface with known limitations. |
| Date Picker | control-date-picker | Classic date input. |
| Drop down | control-drop-down | Classic single selection list. |
| Export | control-export-import | Export data from collections. |
| Import | control-export-import | Import data into collections. |
| Display form | control-form-detail | Read-only form. |
| Edit form | control-form-detail | Editable form. |
| Gallery | control-gallery | Repeated layout/control template for records. |
| Grid container | control-grid-layout | Layout container. |
| Horizontal container | control-horizontal-container | Auto-layout container. |
| HTML text | control-html-text | HTML rendering control. |
| Image | control-image | Image display. |
| List Box | control-list-box | List selector. |
| Microphone | control-microphone | Audio recording input. |
| PDF viewer | control-pdf-viewer | PDF display. |
| Pen input | control-pen-input | Ink/drawing input. |
| Pie chart | control-pie-chart | Chart display. |
| Power BI tile | control-power-bi-tile | Power BI embed tile. |
| Radio | control-radio | Classic single selection. |
| Rating | control-rating | Classic rating input/display. |
| Rich text editor | control-richtexteditor | HTML rich text input. |
| Screen | control-screen | Canvas screen object. |
| Shape | control-shapes-icons | Visual shape. |
| Icon | control-shapes-icons | Classic icon. |
| Label | control-text-box | Classic display text label. |
| Slider | control-slider | Numeric range selector. |
| Text input | control-text-input | Classic text input. Full list captured. |
| Timer | control-timer | Timer for delayed/repeated actions. |
| Toggle | control-toggle | Classic boolean toggle. |
| Vertical container | control-vertical-container | Auto-layout container. |
| Video | control-audio-video | Media playback. |
Reliability labels used in this Bible
| Label | Meaning |
|---|---|
| High | Directly listed in Microsoft docs or captured in the research report from a Microsoft page. |
| Medium | Supported by Microsoft docs/repo structure, but exact per-control applicability still needs verification. |
| Gap flagged | Control exists, but full property list has not yet been harvested. |
| Community/tooling gap | Known through community issue, MCP/tooling behaviour, or runtime host object behaviour. |
| Studio verification required | Must be checked by inserting the control into a current canvas app and using code view or exported .pa.yaml. |
Master property dictionary
| Property | What it does | Applies to | Value/options notes | Source confidence |
|---|---|---|---|---|
| Default | Initial value for an input/control before user interaction or reset. | Input controls, many classic and modern controls | Value type depends on control: text, number, Boolean, date, record, or table. | Official/shared |
| Text | Displayed text or current typed text, depending on control. | Labels, buttons, text input, text modern control, links | For Text input, Text is output/current value, Default is initial value. | Official/control-specific |
| Value | Current numeric/Boolean/rating value. | Slider, toggle, rating, timer-like and numeric controls | Often output/readable. Some controls use Checked or Selected instead. | Official/shared |
| Items | Table/list of records or values displayed by a selector/data control. | Gallery, dropdown, combo box, list box, radio, data table, table | Usually a table formula. Column names and Selected shape depend on control. | Official/shared |
| Selected | Currently selected record/item. | Gallery, dropdown, radio, table, data table | Shape depends on Items. Often read-only output. | Official/shared |
| SelectedItems | Selected records when multi-select is enabled. | Combo box and multi-select controls | Usually a table of records. | Official/control-specific |
| DefaultSelectedItems | Initial selected records for multi-select controls. | Combo box | Must match Items record shape. | Official/control-specific |
| DisplayFields | Fields shown in list/search results. | Combo box | Array/table of field names depending syntax. | Official/control-specific |
| SearchFields | Fields searched by user input. | Combo box | Array/table of field names. Delegation can matter. | Official/control-specific |
| SearchText | Current search text entered into searchable selector. | Combo box | Output style property, not always shown by tooling. | Needs Studio verification |
| SearchItems | Auto-generated searchable item table used internally by some combo/search controls. | Combo box and searchable controls | Community issue indicates describe_control may omit it. Treat as generated/hidden. | Community/tooling gap |
| OnSelect | Formula run when user selects/clicks/taps a control. | Button, gallery, icons, labels, many controls | Behaviour property. Can contain Power Fx actions. | Official/shared |
| OnChange | Formula run when a value changes. | Input controls | Modern Text input changed: fires on blur, with TriggerOutput controlling downstream updates. | Official/update |
| OnCheck | Formula run when a checkbox/toggle becomes true. | Classic check box/toggle | Some modern controls use OnChange instead. | Official/control-specific |
| OnUncheck | Formula run when a checkbox/toggle becomes false. | Classic check box/toggle | Some modern controls use OnChange instead. | Official/control-specific |
| OnTimerStart | Formula run when a timer starts. | Timer | Behaviour. | Official/control-specific |
| OnTimerEnd | Formula run when a timer ends. | Timer | Behaviour. | Official/control-specific |
| Reset | When true, resets control to default value. | Many classic inputs; not all modern controls | Modern controls often lack Reset property; use Reset(control) where available. | Official/community |
| DisplayMode | Interaction state of control. | Most interactive controls | Common values: Edit, View, Disabled. | Official/shared |
| Visible | Whether the control is shown. | Almost all controls | Boolean formula. Hidden controls usually do not receive input. | Official/shared |
| X | Horizontal position. | Most visual controls | Number in canvas units. | Official/size-location |
| Y | Vertical position. | Most visual controls | Number in canvas units. | Official/size-location |
| Width | Control width. | Most visual controls | Number in canvas units. | Official/size-location |
| Height | Control height. | Most visual controls | Number in canvas units. | Official/size-location |
| PaddingTop | Internal top spacing. | Many controls | Number. Modern controls use same split padding names. | Official/size-location |
| PaddingBottom | Internal bottom spacing. | Many controls | Number. | Official/size-location |
| PaddingLeft | Internal left spacing. | Many controls | Number. | Official/size-location |
| PaddingRight | Internal right spacing. | Many controls | Number. | Official/size-location |
| RadiusTopLeft | Top-left corner radius. | Buttons, inputs, modern controls | Modern updates replaced some BorderRadius use with per-corner radius. | Official/update |
| RadiusTopRight | Top-right corner radius. | Buttons, inputs, modern controls | Number. | Official/update |
| RadiusBottomLeft | Bottom-left corner radius. | Buttons, inputs, modern controls | Number. | Official/update |
| RadiusBottomRight | Bottom-right corner radius. | Buttons, inputs, modern controls | Number. | Official/update |
| BorderColor | Border colour. | Many visual controls | Colour formula or theme token depending control. | Official/color-border |
| BorderStyle | Border line style. | Many visual controls | Common values include Solid, Dashed, Dotted, None depending control/version. | Official/color-border |
| BorderThickness | Border width. | Many visual controls | Number. | Official/color-border |
| Fill | Background fill colour. | Many visual controls | Colour formula. | Official/color-border |
| Color | Text/foreground colour. | Textual controls, modern controls | Modern update renamed FontColor to Color. | Official/update |
| Font | Font family. | Textual controls | Text enum/name. | Official/text |
| Size | Text size. | Textual controls | Modern update renamed FontSize to Size. | Official/update |
| FontWeight | Weight of text. | Textual controls | Common values: Lighter, Normal, Semibold, Bold. | Official/text |
| Italic | Italic text. | Textual controls | Boolean. Modern update renamed FontItalic to Italic. | Official/update |
| Underline | Underlined text. | Textual controls | Boolean. Modern update renamed FontUnderline to Underline. | Official/update |
| Strikethrough | Strikethrough text. | Textual controls | Boolean. Modern update renamed FontStrikethrough to Strikethrough. | Official/update |
| Align | Horizontal text/content alignment. | Textual controls, buttons, inputs | Common values: Left, Center, Right, Justify depending control. | Official/text |
| VerticalAlign | Vertical text/content alignment. | Buttons/labels and some controls | Common values: Top, Middle, Bottom. | Official/text |
| LineHeight | Height of each text line. | Text input, labels, rich text-like controls | Number. | Official/control-specific |
| AccessibleLabel | Screen-reader label. | Most interactive/non-text controls | Required for accessibility if visible text is not enough. | Official/accessibility |
| Tooltip | Hover/help text. | Many controls | Can improve accessibility and usability. | Official/shared |
| TabIndex | Keyboard navigation order. | Interactive classic controls | Modern controls may differ. Values <= -1 can remove from tab order in classic docs. | Official/accessibility |
| ContentLanguage | Language tag for control content. | Textual controls and modern controls | Useful for screen readers/language handling. | Official/accessibility |
| FocusedBorderColor | Border colour when focused. | Classic controls | Classic styling property. Modern controls may not expose same property. | Official/color-border |
| FocusedBorderThickness | Border thickness when focused. | Classic controls | Classic styling property. | Official/color-border |
| HoverColor | Foreground colour on hover. | Classic buttons and inputs | Classic interaction styling. | Official/color-border |
| HoverFill | Background colour on hover. | Classic buttons and inputs | Classic interaction styling. | Official/color-border |
| HoverBorderColor | Border colour on hover. | Classic controls | Classic interaction styling. | Official/color-border |
| PressedColor | Foreground colour when pressed. | Classic buttons/icons | Classic interaction styling. | Official/color-border |
| PressedFill | Background when pressed. | Classic buttons/icons | Classic interaction styling. | Official/color-border |
| PressedBorderColor | Border colour when pressed. | Classic buttons/icons | Classic interaction styling. | Official/color-border |
| DisabledColor | Foreground colour when disabled. | Classic controls | Classic disabled styling. | Official/color-border |
| DisabledFill | Background when disabled. | Classic controls | Classic disabled styling. | Official/color-border |
| DisabledBorderColor | Border when disabled. | Classic controls | Classic disabled styling. | Official/color-border |
| Appearance | Modern visual style variant. | Modern controls | Enum-based after 2026 updates. Values vary by control, e.g. Primary/Secondary/Subtle/Transparent style families. Verify per control. | Official/update, verify |
| BasePaletteColor | Modern theme palette base colour. | Modern controls | Theme/palette value. Exact accepted values should be validated in Studio. | Official/modern |
| Icon | Icon name or icon value. | Classic Icon, modern Icon, modern Button, Badge maybe | Modern Icon page says Fluent icon library, approximately 180 icons. | Official/modern |
| IconStyle | Modern icon style. | Modern Button/Icon-like controls | Enum. Exact values vary and should be harvested from individual page. | Official/update |
| IconRotation | Rotation applied to icon. | Modern Button/Icon-like controls | Number/enum depending control. Verify. | Official/modern |
| Layout | Arrangement of icon/text or options. | Modern Button, radio, tabs, containers | Enum values vary by control. | Official/update |
| Type | Input type. | Modern Text input | Enum TextInputType. E.g. text/password/email/number style values should be verified from docs/Studio. | Official/control-specific |
| TriggerOutput | When Text input outputs updates to dependent formulas. | Modern Text input | Controls live vs delayed updates after 2026 behaviour changes. | Official/update |
| ValidationState | Validation visual state. | Modern inputs/dropdowns | Enum, typically None/Error/Success/Warning style. Verify exact values. | Official/modern |
| Required | Whether input is required. | Modern input controls | Boolean. Used for validation visuals, not always data enforcement alone. | Official/modern |
| Placeholder | Placeholder text. | Modern Text input and similar inputs | Modern equivalent to HintText in many cases. | Official/modern |
| HintText | Placeholder/hint text. | Classic Text input, dropdown/search controls | Classic text property. | Official/text |
| MaxLength | Maximum text length. | Text input controls | Number. 0 or blank semantics should be verified. | Official/control-specific |
| Mode | Control mode. | Classic Text input and others | For Text input: single-line, multi-line, password style options depending version. | Official/control-specific |
| Format | Data/text format. | Text input, date picker, numeric controls | Enum/control-specific. | Official/control-specific |
| Clear | Shows clear button. | Classic Text input | Boolean. | Official/control-specific |
| DelayOutput | Delay text output until user pauses typing. | Classic Text input | Boolean. Modern equivalent is not identical, see TriggerOutput. | Official/control-specific |
| EnableSpellCheck | Spellchecking. | Classic Text input | Boolean. Browser/platform dependent. | Official/control-specific |
| VirtualKeyboardMode | Mobile virtual keyboard preference. | Classic Text input | Enum/control-specific. | Official/control-specific |
| AutoDisableOnSelect | Temporarily disables button while OnSelect runs. | Classic Button | Boolean. Helps prevent double-submit. | Official/control-specific |
| Pressed | Whether a button/control is being pressed. | Classic Button and some controls | Output Boolean. | Official/control-specific |
| Start | Starts timer/media/camera behaviour depending control. | Timer, media controls | Control-specific. | Official/control-specific |
| Duration | Timer duration. | Timer | Milliseconds. | Official/control-specific |
| Repeat | Repeats timer. | Timer | Boolean. | Official/control-specific |
| AutoStart | Starts automatically when visible/screen opens. | Timer/media controls | Boolean. | Official/control-specific |
| AutoPause | Pauses media automatically. | Audio/video | Boolean. | Official/control-specific |
| Media | Media file/stream source. | Audio, Video, Image | Type varies. | Official/control-specific |
| Image | Image source. | Image, Add picture, Avatar | Media/image value. | Official/control-specific |
| Camera | Selected device camera index. | Camera control | Number/device dependent. | Official/control-specific |
| Photo | Captured camera/photo output. | Camera/Add picture | Media output. | Official/control-specific |
| Stream | Live camera/video stream. | Camera | Media stream output. | Official/control-specific |
| BarcodeType | Barcode type/symbology. | Barcode controls | Enum/control-specific. Device support varies. | Official/control-specific |
| DataSource | Connected data source. | Forms, galleries, data table, attachments | Table/data source reference. | Official/control-specific |
| Item | Current record. | Forms, cards, galleries | Record. | Official/control-specific |
| Updates | Record of changes to submit. | Edit form/Data card | Record. | Official/control-specific |
| Valid | Whether form/card data is valid. | Forms/cards | Boolean output. | Official/control-specific |
| Error | Current validation/data error. | Forms/cards | Text output. | Official/control-specific |
| ErrorKind | Kind/category of error. | Forms | Enum output. | Official/control-specific |
| SubmitForm | Function, not property. Submits an Edit form. | Forms | Include in Bible because form controls depend on it. | Official/function |
| ResetForm | Function, not property. Resets an Edit form. | Forms | Include in Bible because form controls depend on it. | Official/function |
Confirmed full property maps
Classic Text input
Captured from the classic Text input control page in the research report. | Property | | --- | | Default | | Text | | AccessibleLabel | | Align | | BorderColor | | BorderStyle | | BorderThickness | | Clear | | Color | | DelayOutput | | DisplayMode | | DisabledBorderColor | | DisabledColor | | DisabledFill | | EnableSpellCheck | | Fill | | FocusedBorderColor | | FocusedBorderThickness | | Font | | FontWeight | | Format | | Height | | HintText | | HoverBorderColor | | HoverColor | | HoverFill | | Italic | | LineHeight | | MaxLength | | Mode | | OnChange | | OnSelect | | PaddingBottom | | PaddingLeft | | PaddingRight | | PaddingTop | | PressedBorderColor | | PressedColor | | PressedFill | | RadiusBottomLeft | | RadiusBottomRight | | RadiusTopLeft | | RadiusTopRight | | Reset | | Size | | Strikethrough | | TabIndex | | Tooltip | | Underline | | VirtualKeyboardMode | | Visible | | Width | | X | | Y |
Modern Text input
Captured from the modern Text input page and modern updates page in the research report. | Property | | --- | | Default | | Text | | Placeholder | | Visible | | OnChange | | OnSelect | | Type | | TriggerOutput | | MaxLength | | Required | | ValidationState | | DisplayMode | | Align | | X | | Y | | Width | | Height | | PaddingTop | | PaddingBottom | | PaddingLeft | | PaddingRight | | Appearance | | BasePaletteColor | | Font | | Size | | Color | | FontWeight | | Italic | | Underline | | Strikethrough | | Fill | | BorderColor | | BorderStyle | | BorderThickness | | RadiusTopLeft | | RadiusTopRight | | RadiusBottomLeft | | RadiusBottomRight | | AccessibleLabel | | ContentLanguage |
Classic Button
Captured from the classic Button control page in the research report. | Property | | --- | | OnSelect | | Text | | Align | | AutoDisableOnSelect | | BorderColor | | BorderStyle | | BorderThickness | | Color | | ContentLanguage | | DisplayMode | | DisabledBorderColor | | DisabledColor | | DisabledFill | | FocusedBorderColor | | FocusedBorderThickness | | Fill | | Font | | FontWeight | | Height | | HoverBorderColor | | HoverColor | | HoverFill | | Italic | | PaddingBottom | | PaddingLeft | | PaddingRight | | PaddingTop | | Pressed | | PressedBorderColor | | PressedColor | | PressedFill | | RadiusBottomLeft | | RadiusBottomRight | | RadiusTopLeft | | RadiusTopRight | | Size | | Strikethrough | | TabIndex | | Tooltip | | Underline | | VerticalAlign | | Visible | | Width | | X | | Y |
Modern Button
Captured from the modern Button page and modern updates page in the research report. | Property | | --- | | Text | | Visible | | OnSelect | | DisplayMode | | X | | Y | | Width | | Height | | Align | | VerticalAlign | | PaddingTop | | PaddingBottom | | PaddingLeft | | PaddingRight | | Appearance | | BasePaletteColor | | Icon | | IconStyle | | IconRotation | | Layout | | Font | | Size | | Color | | FontWeight | | Italic | | Underline | | Strikethrough | | BorderColor | | BorderStyle | | BorderThickness | | RadiusTopLeft | | RadiusTopRight | | RadiusBottomLeft | | RadiusBottomRight | | AccessibleLabel | | Tooltip | | ContentLanguage |
Current per-control property matrix
This is the practical working matrix. Rows marked as gaps are not safe to treat as exhaustive yet. | Family | Control | Property | Meaning | Confidence | Primary source | | --- | --- | --- | --- | --- | --- | | Modern | Avatar | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-avatar | | Modern | Badge | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-badge | | Modern | Button | Text | Displayed text or current typed text, depending on control. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | Visible | Whether the control is shown. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | OnSelect | Formula run when user selects/clicks/taps a control. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | DisplayMode | Interaction state of control. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | X | Horizontal position. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | Y | Vertical position. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | Width | Control width. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | Height | Control height. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | Align | Horizontal text/content alignment. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | VerticalAlign | Vertical text/content alignment. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | PaddingTop | Internal top spacing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | PaddingBottom | Internal bottom spacing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | PaddingLeft | Internal left spacing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | PaddingRight | Internal right spacing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | Appearance | Modern visual style variant. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | BasePaletteColor | Modern theme palette base colour. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | Icon | Icon name or icon value. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | IconStyle | Modern icon style. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | IconRotation | Rotation applied to icon. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | Layout | Arrangement of icon/text or options. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | Font | Font family. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | Size | Text size. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | Color | Text/foreground colour. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | FontWeight | Weight of text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | Italic | Italic text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | Underline | Underlined text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | Strikethrough | Strikethrough text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | BorderColor | Border colour. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | BorderStyle | Border line style. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | BorderThickness | Border width. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | RadiusTopLeft | Top-left corner radius. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | RadiusTopRight | Top-right corner radius. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | RadiusBottomLeft | Bottom-left corner radius. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | RadiusBottomRight | Bottom-right corner radius. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | AccessibleLabel | Screen-reader label. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | Tooltip | Hover/help text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Button | ContentLanguage | Language tag for control content. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-button | | Modern | Card | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-card | | Modern | Checkbox | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-checkbox | | Modern | Combobox | Items | Table/list of records or values displayed by a selector/data control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | DefaultSelectedItems | Initial selected records for multi-select controls. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | Selected | Currently selected record/item. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | SelectedItems | Selected records when multi-select is enabled. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | DisplayFields | Fields shown in list/search results. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | SearchFields | Fields searched by user input. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | SearchText | Current search text entered into searchable selector. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | OnChange | Formula run when a value changes. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | ValidationState | Validation visual state. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | DisplayMode | Interaction state of control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | Visible | Whether the control is shown. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | X | Horizontal position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | Y | Vertical position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | Width | Control width. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | Height | Control height. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | AccessibleLabel | Screen-reader label. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | ContentLanguage | Language tag for control content. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | Appearance | Modern visual style variant. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Combobox | BasePaletteColor | Modern theme palette base colour. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-combobox | | Modern | Copilot answer | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-copilot-answer | | Modern | Data Grid | Items | Table/list of records or values displayed by a selector/data control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-data-grid | | Modern | Data Grid | Selected | Currently selected record/item. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-data-grid | | Modern | Data Grid | OnSelect | Formula run when user selects/clicks/taps a control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-data-grid | | Modern | Data Grid | ReflowBehavior | Control-specific property. Definition should be verified against the current control page or Studio code view. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-data-grid | | Modern | Data Grid | Visible | Whether the control is shown. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-data-grid | | Modern | Data Grid | X | Horizontal position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-data-grid | | Modern | Data Grid | Y | Vertical position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-data-grid | | Modern | Data Grid | Width | Control width. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-data-grid | | Modern | Data Grid | Height | Control height. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-data-grid | | Modern | Data Grid | AccessibleLabel | Screen-reader label. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-data-grid | | Modern | Data Grid | ContentLanguage | Language tag for control content. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-data-grid | | Modern | Date picker | SelectedDate | Control-specific property. Definition should be verified against the current control page or Studio code view. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Date picker | DefaultSelectedDate | Control-specific property. Definition should be verified against the current control page or Studio code view. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Date picker | MinDate | Control-specific property. Definition should be verified against the current control page or Studio code view. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Date picker | MaxDate | Control-specific property. Definition should be verified against the current control page or Studio code view. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Date picker | Format | Data/text format. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Date picker | OnChange | Formula run when a value changes. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Date picker | ValidationState | Validation visual state. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Date picker | DisplayMode | Interaction state of control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Date picker | Visible | Whether the control is shown. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Date picker | X | Horizontal position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Date picker | Y | Vertical position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Date picker | Width | Control width. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Date picker | Height | Control height. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Date picker | AccessibleLabel | Screen-reader label. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Date picker | ContentLanguage | Language tag for control content. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Date picker | Appearance | Modern visual style variant. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Date picker | BasePaletteColor | Modern theme palette base colour. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-date-picker | | Modern | Dropdown | Items | Table/list of records or values displayed by a selector/data control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-dropdown | | Modern | Dropdown | Default | Initial value for an input/control before user interaction or reset. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-dropdown | | Modern | Dropdown | Selected | Currently selected record/item. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-dropdown | | Modern | Dropdown | OnChange | Formula run when a value changes. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-dropdown | | Modern | Dropdown | ValidationState | Validation visual state. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-dropdown | | Modern | Dropdown | DisplayMode | Interaction state of control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-dropdown | | Modern | Dropdown | Visible | Whether the control is shown. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-dropdown | | Modern | Dropdown | X | Horizontal position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-dropdown | | Modern | Dropdown | Y | Vertical position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-dropdown | | Modern | Dropdown | Width | Control width. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-dropdown | | Modern | Dropdown | Height | Control height. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-dropdown | | Modern | Dropdown | AccessibleLabel | Screen-reader label. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-dropdown | | Modern | Dropdown | ContentLanguage | Language tag for control content. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-dropdown | | Modern | Dropdown | Appearance | Modern visual style variant. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-dropdown | | Modern | Dropdown | BasePaletteColor | Modern theme palette base colour. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-dropdown | | Modern | Header | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-header | | Modern | Icon | Icon | Icon name or icon value. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-icon | | Modern | Icon | IconStyle | Modern icon style. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-icon | | Modern | Icon | IconRotation | Rotation applied to icon. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-icon | | Modern | Icon | DisplayMode | Interaction state of control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-icon | | Modern | Icon | Visible | Whether the control is shown. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-icon | | Modern | Icon | X | Horizontal position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-icon | | Modern | Icon | Y | Vertical position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-icon | | Modern | Icon | Width | Control width. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-icon | | Modern | Icon | Height | Control height. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-icon | | Modern | Icon | Color | Text/foreground colour. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-icon | | Modern | Icon | BasePaletteColor | Modern theme palette base colour. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-icon | | Modern | Icon | AccessibleLabel | Screen-reader label. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-icon | | Modern | Icon | Tooltip | Hover/help text. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-icon | | Modern | Icon | ContentLanguage | Language tag for control content. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-icon | | Modern | Info button | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-info-button | | Modern | Link | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-link | | Modern | Number input | Value | Current numeric/Boolean/rating value. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Number input | Default | Initial value for an input/control before user interaction or reset. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Number input | Min | Control-specific property. Definition should be verified against the current control page or Studio code view. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Number input | Max | Control-specific property. Definition should be verified against the current control page or Studio code view. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Number input | Step | Control-specific property. Definition should be verified against the current control page or Studio code view. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Number input | OnChange | Formula run when a value changes. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Number input | ValidationState | Validation visual state. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Number input | DisplayMode | Interaction state of control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Number input | Visible | Whether the control is shown. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Number input | X | Horizontal position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Number input | Y | Vertical position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Number input | Width | Control width. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Number input | Height | Control height. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Number input | AccessibleLabel | Screen-reader label. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Number input | ContentLanguage | Language tag for control content. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Number input | Appearance | Modern visual style variant. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Number input | BasePaletteColor | Modern theme palette base colour. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-number-input | | Modern | Progress bar | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-progress-bar | | Modern | Radio group | Items | Table/list of records or values displayed by a selector/data control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group | | Modern | Radio group | Selected | Currently selected record/item. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group | | Modern | Radio group | Default | Initial value for an input/control before user interaction or reset. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group | | Modern | Radio group | OnChange | Formula run when a value changes. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group | | Modern | Radio group | Layout | Arrangement of icon/text or options. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group | | Modern | Radio group | ValidationState | Validation visual state. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group | | Modern | Radio group | DisplayMode | Interaction state of control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group | | Modern | Radio group | Visible | Whether the control is shown. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group | | Modern | Radio group | X | Horizontal position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group | | Modern | Radio group | Y | Vertical position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group | | Modern | Radio group | Width | Control width. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group | | Modern | Radio group | Height | Control height. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group | | Modern | Radio group | AccessibleLabel | Screen-reader label. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group | | Modern | Radio group | ContentLanguage | Language tag for control content. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group | | Modern | Radio group | Appearance | Modern visual style variant. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group | | Modern | Radio group | BasePaletteColor | Modern theme palette base colour. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-controls-radio-group | | Modern | Rating | Value | Current numeric/Boolean/rating value. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-rating | | Modern | Rating | Default | Initial value for an input/control before user interaction or reset. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-rating | | Modern | Rating | Max | Control-specific property. Definition should be verified against the current control page or Studio code view. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-rating | | Modern | Rating | Precision | Control-specific property. Definition should be verified against the current control page or Studio code view. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-rating | | Modern | Rating | Icon | Icon name or icon value. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-rating | | Modern | Rating | OnChange | Formula run when a value changes. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-rating | | Modern | Rating | DisplayMode | Interaction state of control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-rating | | Modern | Rating | Visible | Whether the control is shown. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-rating | | Modern | Rating | X | Horizontal position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-rating | | Modern | Rating | Y | Vertical position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-rating | | Modern | Rating | Width | Control width. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-rating | | Modern | Rating | Height | Control height. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-rating | | Modern | Rating | AccessibleLabel | Screen-reader label. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-rating | | Modern | Rating | ContentLanguage | Language tag for control content. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-rating | | Modern | Rating | Appearance | Modern visual style variant. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-rating | | Modern | Rating | BasePaletteColor | Modern theme palette base colour. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-rating | | Modern | Slider | Value | Current numeric/Boolean/rating value. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider | | Modern | Slider | Default | Initial value for an input/control before user interaction or reset. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider | | Modern | Slider | Min | Control-specific property. Definition should be verified against the current control page or Studio code view. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider | | Modern | Slider | Max | Control-specific property. Definition should be verified against the current control page or Studio code view. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider | | Modern | Slider | Step | Control-specific property. Definition should be verified against the current control page or Studio code view. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider | | Modern | Slider | OnChange | Formula run when a value changes. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider | | Modern | Slider | DisplayMode | Interaction state of control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider | | Modern | Slider | Visible | Whether the control is shown. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider | | Modern | Slider | X | Horizontal position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider | | Modern | Slider | Y | Vertical position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider | | Modern | Slider | Width | Control width. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider | | Modern | Slider | Height | Control height. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider | | Modern | Slider | AccessibleLabel | Screen-reader label. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider | | Modern | Slider | ContentLanguage | Language tag for control content. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider | | Modern | Slider | Appearance | Modern visual style variant. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider | | Modern | Slider | BasePaletteColor | Modern theme palette base colour. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-slider | | Modern | Spinner | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-spinner | | Modern | Stream | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-stream | | Modern | Table | Items | Table/list of records or values displayed by a selector/data control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-table | | Modern | Table | Selected | Currently selected record/item. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-table | | Modern | Table | OnSelect | Formula run when user selects/clicks/taps a control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-table | | Modern | Table | ReflowBehavior | Control-specific property. Definition should be verified against the current control page or Studio code view. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-table | | Modern | Table | Visible | Whether the control is shown. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-table | | Modern | Table | X | Horizontal position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-table | | Modern | Table | Y | Vertical position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-table | | Modern | Table | Width | Control width. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-table | | Modern | Table | Height | Control height. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-table | | Modern | Table | AccessibleLabel | Screen-reader label. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-table | | Modern | Table | ContentLanguage | Language tag for control content. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-table | | Modern | Tabs or tab list | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-tabs-or-tabs-list | | Modern | Text | Text | Displayed text or current typed text, depending on control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text | | Modern | Text | Size | Text size. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text | | Modern | Text | Color | Text/foreground colour. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text | | Modern | Text | Font | Font family. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text | | Modern | Text | FontWeight | Weight of text. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text | | Modern | Text | Italic | Italic text. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text | | Modern | Text | Underline | Underlined text. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text | | Modern | Text | Strikethrough | Strikethrough text. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text | | Modern | Text | Align | Horizontal text/content alignment. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text | | Modern | Text | Visible | Whether the control is shown. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text | | Modern | Text | X | Horizontal position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text | | Modern | Text | Y | Vertical position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text | | Modern | Text | Width | Control width. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text | | Modern | Text | Height | Control height. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text | | Modern | Text | AccessibleLabel | Screen-reader label. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text | | Modern | Text | ContentLanguage | Language tag for control content. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text | | Modern | Text input | Default | Initial value for an input/control before user interaction or reset. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Text | Displayed text or current typed text, depending on control. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Placeholder | Placeholder text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Visible | Whether the control is shown. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | OnChange | Formula run when a value changes. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | OnSelect | Formula run when user selects/clicks/taps a control. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Type | Input type. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | TriggerOutput | When Text input outputs updates to dependent formulas. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | MaxLength | Maximum text length. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Required | Whether input is required. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | ValidationState | Validation visual state. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | DisplayMode | Interaction state of control. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Align | Horizontal text/content alignment. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | X | Horizontal position. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Y | Vertical position. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Width | Control width. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Height | Control height. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | PaddingTop | Internal top spacing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | PaddingBottom | Internal bottom spacing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | PaddingLeft | Internal left spacing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | PaddingRight | Internal right spacing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Appearance | Modern visual style variant. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | BasePaletteColor | Modern theme palette base colour. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Font | Font family. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Size | Text size. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Color | Text/foreground colour. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | FontWeight | Weight of text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Italic | Italic text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Underline | Underlined text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Strikethrough | Strikethrough text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | Fill | Background fill colour. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | BorderColor | Border colour. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | BorderStyle | Border line style. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | BorderThickness | Border width. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | RadiusTopLeft | Top-left corner radius. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | RadiusTopRight | Top-right corner radius. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | RadiusBottomLeft | Bottom-left corner radius. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | RadiusBottomRight | Bottom-right corner radius. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | AccessibleLabel | Screen-reader label. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Text input | ContentLanguage | Language tag for control content. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-text-input | | Modern | Toggle | Checked | Control-specific property. Definition should be verified against the current control page or Studio code view. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-toggle | | Modern | Toggle | Default | Initial value for an input/control before user interaction or reset. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-toggle | | Modern | Toggle | OnChange | Formula run when a value changes. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-toggle | | Modern | Toggle | DisplayMode | Interaction state of control. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-toggle | | Modern | Toggle | Visible | Whether the control is shown. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-toggle | | Modern | Toggle | X | Horizontal position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-toggle | | Modern | Toggle | Y | Vertical position. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-toggle | | Modern | Toggle | Width | Control width. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-toggle | | Modern | Toggle | Height | Control height. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-toggle | | Modern | Toggle | AccessibleLabel | Screen-reader label. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-toggle | | Modern | Toggle | ContentLanguage | Language tag for control content. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-toggle | | Modern | Toggle | Appearance | Modern visual style variant. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-toggle | | Modern | Toggle | BasePaletteColor | Modern theme palette base colour. | Medium, needs per-control verification | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-toggle | | Classic | Add picture | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-add-picture | | Classic | Attachments | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-attachments | | Classic | Audio | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-audio-video | | Classic | Barcode reader | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-barcodereader | | Classic | Barcode scanner | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-new-barcode-scanner | | Classic | Button | OnSelect | Formula run when user selects/clicks/taps a control. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | Text | Displayed text or current typed text, depending on control. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | Align | Horizontal text/content alignment. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | AutoDisableOnSelect | Temporarily disables button while OnSelect runs. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | BorderColor | Border colour. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | BorderStyle | Border line style. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | BorderThickness | Border width. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | Color | Text/foreground colour. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | ContentLanguage | Language tag for control content. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | DisplayMode | Interaction state of control. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | DisabledBorderColor | Border when disabled. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | DisabledColor | Foreground colour when disabled. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | DisabledFill | Background when disabled. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | FocusedBorderColor | Border colour when focused. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | FocusedBorderThickness | Border thickness when focused. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | Fill | Background fill colour. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | Font | Font family. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | FontWeight | Weight of text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | Height | Control height. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | HoverBorderColor | Border colour on hover. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | HoverColor | Foreground colour on hover. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | HoverFill | Background colour on hover. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | Italic | Italic text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | PaddingBottom | Internal bottom spacing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | PaddingLeft | Internal left spacing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | PaddingRight | Internal right spacing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | PaddingTop | Internal top spacing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | Pressed | Whether a button/control is being pressed. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | PressedBorderColor | Border colour when pressed. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | PressedColor | Foreground colour when pressed. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | PressedFill | Background when pressed. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | RadiusBottomLeft | Bottom-left corner radius. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | RadiusBottomRight | Bottom-right corner radius. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | RadiusTopLeft | Top-left corner radius. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | RadiusTopRight | Top-right corner radius. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | Size | Text size. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | Strikethrough | Strikethrough text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | TabIndex | Keyboard navigation order. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | Tooltip | Hover/help text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | Underline | Underlined text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | VerticalAlign | Vertical text/content alignment. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | Visible | Whether the control is shown. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | Width | Control width. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | X | Horizontal position. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Button | Y | Vertical position. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-button | | Classic | Camera | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-camera | | Classic | Card | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-card | | Classic | Check box | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-check-box | | Classic | Column chart | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-column-line-chart | | Classic | Line chart | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-column-line-chart | | Classic | Column | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-column | | Classic | Combo box | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-combo-box | | Classic | Container | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-container | | Classic | Data table | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-data-table | | Classic | Date Picker | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-date-picker | | Classic | Drop down | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-drop-down | | Classic | Export | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-export-import | | Classic | Import | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-export-import | | Classic | Display form | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-form-detail | | Classic | Edit form | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-form-detail | | Classic | Gallery | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-gallery | | Classic | Grid container | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-grid-layout | | Classic | Horizontal container | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-horizontal-container | | Classic | HTML text | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-html-text | | Classic | Image | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-image | | Classic | List Box | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-list-box | | Classic | Microphone | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-microphone | | Classic | PDF viewer | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-pdf-viewer | | Classic | Pen input | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-pen-input | | Classic | Pie chart | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-pie-chart | | Classic | Power BI tile | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-power-bi-tile | | Classic | Radio | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-radio | | Classic | Rating | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-rating | | Classic | Rich text editor | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-richtexteditor | | Classic | Screen | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-screen | | Classic | Shape | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-shapes-icons | | Classic | Icon | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-shapes-icons | | Classic | Label | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-box | | Classic | Slider | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-slider | | Classic | Text input | Default | Initial value for an input/control before user interaction or reset. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Text | Displayed text or current typed text, depending on control. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | AccessibleLabel | Screen-reader label. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Align | Horizontal text/content alignment. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | BorderColor | Border colour. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | BorderStyle | Border line style. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | BorderThickness | Border width. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Clear | Shows clear button. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Color | Text/foreground colour. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | DelayOutput | Delay text output until user pauses typing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | DisplayMode | Interaction state of control. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | DisabledBorderColor | Border when disabled. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | DisabledColor | Foreground colour when disabled. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | DisabledFill | Background when disabled. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | EnableSpellCheck | Spellchecking. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Fill | Background fill colour. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | FocusedBorderColor | Border colour when focused. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | FocusedBorderThickness | Border thickness when focused. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Font | Font family. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | FontWeight | Weight of text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Format | Data/text format. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Height | Control height. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | HintText | Placeholder/hint text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | HoverBorderColor | Border colour on hover. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | HoverColor | Foreground colour on hover. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | HoverFill | Background colour on hover. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Italic | Italic text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | LineHeight | Height of each text line. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | MaxLength | Maximum text length. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Mode | Control mode. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | OnChange | Formula run when a value changes. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | OnSelect | Formula run when user selects/clicks/taps a control. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | PaddingBottom | Internal bottom spacing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | PaddingLeft | Internal left spacing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | PaddingRight | Internal right spacing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | PaddingTop | Internal top spacing. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | PressedBorderColor | Border colour when pressed. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | PressedColor | Foreground colour when pressed. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | PressedFill | Background when pressed. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | RadiusBottomLeft | Bottom-left corner radius. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | RadiusBottomRight | Bottom-right corner radius. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | RadiusTopLeft | Top-left corner radius. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | RadiusTopRight | Top-right corner radius. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Reset | When true, resets control to default value. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Size | Text size. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Strikethrough | Strikethrough text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | TabIndex | Keyboard navigation order. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Tooltip | Hover/help text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Underline | Underlined text. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | VirtualKeyboardMode | Mobile virtual keyboard preference. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Visible | Whether the control is shown. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Width | Control width. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | X | Horizontal position. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Text input | Y | Vertical position. | High | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-text-input | | Classic | Timer | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-timer | | Classic | Toggle | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-toggle | | Classic | Vertical container | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-vertical-container | | Classic | Video | PROPERTY SET NOT YET FULLY HARVESTED | Individual Microsoft page exists or is inferred from docs tree, but exact property list needs extraction from Learn/GitHub and Studio code view. | Gap flagged | https://learn.microsoft.com/en-us/power-apps/maker/canvas-apps/controls/control-audio-video |
Known gaps and traps
| Gap | Why it matters | How to verify/fill it |
|---|---|---|
| Modern controls summary is not a complete index | Research found Icon and Rating dedicated pages even though the summary list can omit them. | Use the MicrosoftDocs repo tree as the inventory, not only the Learn summary page. |
| Shared property pages are separate from control pages | A control page may not make every shared property obvious. | Join control pages with core, text, accessibility, size/location and colour/border property pages. |
| Modern 2026 property renames | Older blogs/screenshots may use names such as FontColor, FontSize, FontItalic, BorderRadius. | Map old names to Color, Size, Italic, Radius* etc using modern-control-updates. |
| Modern Text input OnChange behaviour changed | Older assumptions about per-keystroke OnChange can be wrong. | Use TriggerOutput and test in Studio. |
| SearchItems and generated properties | Tooling issue reports hidden/generated properties not exposed by describe_control. | Export .pa.yaml and compare Studio code view against authoring tooling. |
| PowerBIIntegration host control | Runtime-injected object, not normal insertable control, can break offline compiler schema. | Keep runtime/host controls in a separate section. |
| Custom components | Properties are maker-defined, so there is no universal list. | Document component schema and each component separately from built-in controls. |
| Preview/tenant-gated controls | Controls such as Copilot-related or table/grid variants can vary by environment. | Record environment, Studio version, feature flags and tenant settings. |
Recommended harvesting workflow
Use this workflow to turn v0.1 into a genuinely brutal local knowledge base. | Step | Action | Output | | --- | --- | --- | | 1 | Clone or download MicrosoftDocs/powerapps-docs controls folder and modern-controls subfolder. | Local markdown source cache. | | 2 | Parse every markdown page for Properties, Key properties, Additional properties and Applies to tables. | Raw property rows. | | 3 | Merge shared property pages into every control where the page says the property applies. | Normalised property matrix. | | 4 | Insert every control into a blank canvas app, open Code view, copy YAML, then export .msapp/.pa.yaml. | Studio-observed property baseline. | | 5 | Compare docs properties vs Studio properties vs .pa.yaml. | Gap report: missing, renamed, hidden, generated, runtime-only. | | 6 | Add community/tooling issues as annotations only, not as official truth. | Confidence notes. | | 7 | Regenerate Markdown, CSV and optional DOCX monthly or before major builds. | Versioned local Bible. |
Copy/paste prompt for Claude or Codex to continue the extraction
Use this as a build prompt if you want an agent to complete the harvester against a local clone:
Build a Power Apps canvas control documentation harvester. Use the local MicrosoftDocs/powerapps-docs repository. Parse powerapps-docs/maker/canvas-apps/controls and controls/modern-controls. For every markdown file that represents a control, extract control name, classic/modern family, page path, description, key properties, additional properties, enum/value notes, deprecation/preview notes, and source line references where possible. Then parse shared property pages properties-core, properties-text, properties-accessibility, properties-size-location, and properties-color-border, and join shared properties to controls where the docs say they apply. Emit powerapps_controls.json, powerapps_properties.csv, gap_report.md, and bible.md. Mark each property confidence as direct, shared-inferred, community, runtime-only, or needs-studio-verification. Do not invent missing enum values.
Version notes
v0.1 is a grounded starter Bible, not a final canonical dump. It prioritises truthfulness over fake completeness. The next version should automate extraction from the docs repository and then validate by Studio Code View.
Live Build Lessons
Live Build Lessons
Last checked: 2026-06-23
These are lessons learned from the Training Tracker live build — real bugs hit and diagnosed in the Power Apps editor and via GitHub issue threads. They supplement real-build-quirks.md. Do not overrule them based on what seems logical; they are ground truth.
Character Escapes Don't Work in Power Apps Strings
Power Apps formula strings do not support \x or \u escape sequences. Writing \xB7 outputs the literal characters \, x, B, 7 — not the middle dot ·.
Use Char(decimal) instead:
Char(183)
This produces · (U+00B7, middle dot / interpunct). This is the correct approach for any Unicode character by decimal code point.
Common ones used in Training Tracker:
| Character | Char() |
|---|---|
| · (interpunct) | Char(183) |
Never write \xB7, ·, or any escape sequence in a Power Apps string literal.
Version Stamps Are Mandatory on Every Screen Page and Index
Every pa-yaml-wrap call and every docs/index.html must carry a version label and a build timestamp. Without them, the user cannot tell whether GitHub Pages has served the latest push — F5 refreshes look identical.
For screen pages, always pass --version:
pa-yaml-wrap scrHome.yaml docs/screens/scrHome.html --version v1.2
The stamp appears bottom-right in small monospace text: v1.2 — Built 23 Jun 2026 10:55 BST
For docs/index.html, add the version inline after the <h1> title and a build timestamp line below it. Use date '+%-d %b %Y %H:%M %Z' to get the local time string.
Version convention: start at v1.0, bump minor for each fix/push (v1.1, v1.2), bump major for structural changes. Every push that modifies screen content increments the version so the stamp visibly changes.
PA1006/PA1001 — Screen YAML Uses Screens: Root, Not Screen-Level Control
Error: (1,3) : error PA1006 : Empty or invalid value for Control.
Screen paste YAML must use the Source Code schema root:
Screens:
scrDashboard:
Do not paste a bare top-level list item such as - scrDashboard:. If the paste starts with - scrDashboard:, Power Apps reports the error at line 1, column 3 even when Control: Screen is present, because the screen is not under the Screens: schema root.
Once the screen is under Screens:, do not add Control: Screen. SchemaV3 screen instances do not expose a Control property. Adding it causes:
(3,5) : error PA1001 : YamlInvalidSyntax: Property 'Control' not found on type 'Microsoft.PowerPlatform.PowerApps.Persistence.PaYaml.Models.SchemaV3.ScreenInstance'.
Wrong:
- scrDashboard:
Control: Screen
Properties:
Fill: =RGBA(248,248,248,1)
Correct:
Screens:
scrDashboard:
Properties:
Fill: =RGBA(248,248,248,1)
Child controls under Children: still need normal Control: values such as Label@2.5.1 or Classic/Button@2.2.0. The no-Control rule applies only to the screen node under Screens:.
When checking with a standard YAML parser such as yaml.safe_load, quote any single-line Power Fx formulas that contain YAML-significant : text, for example record literals or labels with colons:
Default: '={Value: "New to MoD/Branch"}'
Text: '=If(IsBlank(varRole), "Role not set", "Role: " & varRole)'
The quotes are YAML syntax only; the parsed Power Fx value still starts with =.
Copy Pages Must Show and Guard the Actual Clipboard Payload
A repeated paste error can be caused by stale browser page content or stale clipboard text even after the repository has the corrected YAML. Version stamps alone are not enough proof that the copied payload is the corrected payload.
Every generated screen copy page should visibly show the first lines of the exact YAML string that the Copy button will write. For screen YAML, the preview must start:
Screens:
scrName:
Properties:
The copy script should refuse to copy known-invalid screen payloads, especially:
Screens:
scrName:
Control: Screen
If Power Apps reports (3,5) Property 'Control' not found on type ... ScreenInstance, the pasted clipboard text still contains a screen-level Control: Screen. Check the visible payload preview on the live copy page before changing YAML again.
Use versioned or cache-busted links from index pages, for example screens/scrDashboard.html?v=1.9, so the browser does not reuse an older generated screen page.
PA2109 — Gallery Variant Names Are Case-Sensitive
Error: (255,9) : error PA2109 : Unknown variant 'verticalGallery' for control type 'Gallery@2.15.0'.
For classic Gallery@2.15.0, use the verified variant names from the exported working screens and fresh-control defaults:
Control: Gallery@2.15.0
Variant: Vertical
Do not use generated/web-style names such as:
Variant: verticalGallery
Known valid classic gallery variants include:
VerticalHorizontalVariableHeight
The variant value is case-sensitive and schema-checked before Power Fx formulas are evaluated, so a wrong variant blocks the entire screen paste.
PA2108 — Labels Do Not Support Radius Properties
Error:
error PA2108 : Unknown property 'RadiusTopLeft' for control type 'Label@2.5.1'.
error PA2108 : Unknown property 'RadiusTopRight' for control type 'Label@2.5.1'.
error PA2108 : Unknown property 'RadiusBottomLeft' for control type 'Label@2.5.1'.
error PA2108 : Unknown property 'RadiusBottomRight' for control type 'Label@2.5.1'.
Label@2.5.1 can use Fill, Color, Align, VerticalAlign, and text styling, but it does not expose radius properties in the PaYaml schema. Do not use Label controls for rounded pills/badges.
For rounded badges or status pills, use the established Classic Button pattern with DisplayMode=DisplayMode.View:
- btnStatusPill:
Control: Classic/Button@2.2.0
Properties:
Text: ="Active"
DisplayMode: =DisplayMode.View
Fill: =RGBA(220,238,234,1)
HoverFill: =Self.Fill
PressedFill: =Self.Fill
Color: =RGBA(0,78,66,1)
BorderThickness: =0
RadiusTopLeft: =12
RadiusTopRight: =12
RadiusBottomLeft: =12
RadiusBottomRight: =12
If a label already exists and the rounded shape is not critical, remove the four radius properties rather than blocking the whole paste.
PA1001 — |- Block Scalars Are Only Safe on Event Handlers and Items
PaYaml (PowerApps' YAML dialect) does not reliably support |- block scalars on visual or style properties. Using |- on Fill, Color, Visible, Text, DisabledFill, HoverFill, or any similar property causes PA1001 YamlInvalidSyntax even when the YAML is structurally valid and passes a standard YAML parser.
Properties where |- is safe:
- OnSelect, OnChange, OnVisible, OnCheck, OnUncheck — event handlers
- Items — gallery/dropdown data source
Properties where |- must NOT be used — use a single-line formula instead:
- Fill, HoverFill, PressedFill, DisabledFill
- Color, HoverColor, PressedColor
- Visible
- Text
- BorderColor, BasePaletteColor
- Any other visual/style property
Wrong:
Fill: |-
=If(
ThisItem.Complete,
RGBA(34,139,34,1),
RGBA(163,100,0,1)
)
Visible: |-
=varSelectedRecord.'Movement Type'.Value = "Leaving Branch" ||
varSelectedRecord.'Movement Type'.Value = "Leaving MoD"
Correct:
Fill: =If(ThisItem.Complete, RGBA(34,139,34,1), RGBA(163,100,0,1))
Visible: =varSelectedRecord.'Movement Type'.Value = "Leaving Branch" || varSelectedRecord.'Movement Type'.Value = "Leaving MoD"
Even a long single-line formula is safe. Multi-line with |- on style properties is not.
PA1001 — Three Rules for |- Block Scalars (All Must Hold)
All three errors share the code PA1001 YamlInvalidSyntax. They are distinct causes and must be checked independently.
Rule 1 — Any multi-line formula must use |-, never inline
Error message: While parsing a block mapping, did not find expected key.
YAML cannot span an unquoted scalar value across multiple lines in a block mapping. If a formula opens a parenthesis on the key line without closing it, the next line is parsed as a new key — which fails.
Wrong:
Fill: =If(
ThisItem.Complete,
RGBA(34,139,34,1),
RGBA(163,100,0,1)
)
Correct:
Fill: |-
=If(
ThisItem.Complete,
RGBA(34,139,34,1),
RGBA(163,100,0,1)
)
Pre-output scan: For every Key: = line, count ( and ) on that line. If open count > closed count, the formula continues onto the next line — it must use |-. Applies to every property: Fill, Color, DisabledFill, HoverFill, Text, Visible, OnSelect, and all others.
Rule 2 — Every |- block's first content line must start with =
Error message: Power Fx expressions must start with '='
The = prefix marks the value as a Power Fx formula. It is required on the first content line only — continuation lines do not get it. This applies to every property that uses |- without exception: event handlers (OnSelect, OnChange, OnVisible, OnCheck, OnUncheck) and data properties (Items, Fill, Color, Visible, Text, etc.).
Wrong:
OnSelect: |-
Patch('MyList', varRecord, {Field: Today()});
Navigate(scrRecord)
Correct:
OnSelect: |-
=Patch('MyList', varRecord, {Field: Today()});
Navigate(scrRecord)
Pre-output scan: For every |- in the YAML, check that the immediately following non-empty line starts with =.
Rule 3 — Inside a |- block, indentation must follow paren depth
Error message: While parsing a block mapping, did not find expected key. (same as Rule 1, different cause)
When a |- block contains a nested formula like If(condition, If(...)), each line's indentation must match its logical paren depth. A common mistake when converting inline formulas to |- is to carry over original whitespace mechanically — this places the outer closing ) at the wrong indent level, making the YAML parser see it as a key instead of formula continuation.
Wrong (outer ) at wrong indent — both ) at the same level):
Fill: |-
=If(
ThisItem.Complete,
RGBA(34,139,34,1),
If(
condition,
RGBA(163,100,0,1),
RGBA(0,78,66,1)
)
)
Correct (outer ) at the same indent as =If():
Fill: |-
=If(
ThisItem.Complete,
RGBA(34,139,34,1),
If(
condition,
RGBA(163,100,0,1),
RGBA(0,78,66,1)
)
)
Rule: The closing ) of the outermost function must be at the same indent as =If( — that is, content indent (key indent + 2). Each nested level adds 4 spaces. Use paren depth to derive correct indentation, not the original source whitespace.
Depth formula:
- Content base = key indent + 2 spaces
- Each ( that doesn't close on the same line increases depth by 1 → add 4 spaces per depth level
- Each unmatched ) decreases depth before placing the line
IsOdd Does Not Exist
IsOdd() is not a Power Apps function. It causes a formula error.
Use Mod() instead:
Mod(value, 2) = 1
Full alternating row colour pattern:
If(Mod(ThisItem.ID, 2) = 0, RGBA(255,255,255,1), RGBA(247,249,252,1))
ThisItem.ItemIndex Is Unreliable for Alternating Row Colours
ItemIndex reflects the visual position in the gallery at render time. It shifts when the gallery filters or sorts, causing rows to flash between colours or flip incorrectly.
Use a stable identifier instead.
SharePoint-backed gallery (items from 'TT Personnel', 'TT Courses', etc.):
If(Mod(ThisItem.ID, 2) = 0, RGBA(255,255,255,1), RGBA(247,249,252,1))
Collection-backed gallery with a numeric course ID (e.g. galMyTraining bound to colMyTraining):
If(Mod(ThisItem.CourseID, 2) = 0, RGBA(255,255,255,1), RGBA(247,249,252,1))
Collection-backed gallery with no numeric ID (e.g. galMyChain keyed by email):
If(Mod(Len(ThisItem.Email), 2) = 0, RGBA(255,255,255,1), RGBA(247,249,252,1))
Never use ThisItem.ItemIndex in production alternating row formulas.
ModernButton BasePaletteColor — Don't Fight It
BasePaletteColor on a ModernButton is a Fluent 2 seed colour — the framework derives fill, text, and hover colours from it internally. You do not control the exact output shade; Fluent 2 does.
The correct approach: pick one dark, saturated seed per button role and leave it alone. Don't try to match a specific brand hex precisely, don't set it conditionally, don't add a Color override to compensate. Work with Fluent 2, not against it.
Rule: BasePaletteColor must be a dark, saturated colour. If you can imagine reading white text on it, it will probably work. If it's a pastel or near-white, Fluent 2 treats it as a low-contrast accent and overrides it with a dark fill regardless.
Standard roles for new apps (using army dark green as primary):
- Primary action: RGBA(0,78,66,1) — app primary colour
- Secondary / cancel: RGBA(120,120,120,1) — neutral dark grey
- Destructive: RGBA(163,45,45,1) — dark red
Confirmed broken — all render wrong regardless of what you set:
- Any near-white or pastel (RGBA(244,246,248,1), RGBA(230,241,251,1), RGBA(255,240,240,1), etc.)
- Conditional expressions like If(varTab="X", RGBA(34,139,80,1), RGBA(228,236,248,1)) — the light inactive state will always render dark
If you need conditional colour states (active/inactive tab buttons, toggle-style buttons), don't use ModernButton. Use Classic Button with Fill, HoverFill, and PressedFill set directly. See ui-patterns.md — Tab Navigation Bar.
Tab Navigation Buttons Must Be Classic Buttons
ModernButton BasePaletteColor does not support conditional light/dark fills for active/inactive tab states. Attempting to set BasePaletteColor conditionally based on a tab variable will not produce distinct active/inactive visual states when light colours are involved.
Use Classic buttons for tab navigation. Classic buttons expose Fill, HoverFill, and PressedFill directly, giving full colour control.
Standard tab button pattern (two tabs: "People" and "Courses"):
btnTabPeople — Classic/Button:
Fill = If(varTab="People", RGBA(34,139,80,1), RGBA(255,255,255,1))
Color = If(varTab="People", RGBA(255,255,255,1), RGBA(24,95,165,1))
HoverFill = If(varTab="People", RGBA(28,115,65,1), RGBA(235,241,250,1))
PressedFill = If(varTab="People", RGBA(22,95,55,1), RGBA(210,225,245,1))
BorderColor = RGBA(24,95,165,1)
BorderThickness = 1
RadiusTopLeft = RadiusTopRight = RadiusBottomLeft = RadiusBottomRight = 8
OnSelect = Set(varTab, "People")
Same pattern for btnTabCourses with varTab="Courses".
SortByColumns Fails on SharePoint Choice Fields
SortByColumns(source, "FieldName", SortOrder.Ascending) breaks when the field is a SharePoint Choice type. SharePoint returns Choice fields as records {Value: "..."}, not plain strings. SortByColumns cannot sort on a record expression.
Use Sort() with .Value to unwrap the Choice record:
Sort(source, Status.Value, SortOrder.Ascending)
For double-sort (status then title):
Sort(
Sort(source, Title, SortOrder.Ascending),
Status.Value, SortOrder.Ascending
)
Do not use SortByColumns on a column that is a SharePoint Choice field.
Multi-Select Choice Field: in Operator Fails Silently
The in operator checks for a full record match. A SharePoint multi-select Choice field returns a table of records {Value: "..."}. Writing "Army" in ApplicableTo checks whether the string "Army" matches an entire record — it never will, so it always returns false silently.
Use CountIf to check if any value in the table matches:
CountIf(ApplicableTo, Value = drpFilter.Selected.Value) > 0
This correctly counts how many rows in the multi-select field have the matching value string.
Example in a Filter:
Filter(colCourses,
(IsBlank(drpPeopleType.Selected.Value) ||
drpPeopleType.Selected.Value = "All types" ||
CountIf(ApplicableTo, Value = drpPeopleType.Selected.Value) > 0)
)
Launch() Reuses the Current Browser Tab
Launch(url) navigates the current tab away from the Power Apps app. Users lose their place.
Always use LaunchTarget.New as the third argument to open in a new tab:
Launch(varCourse.CourseURL, {}, LaunchTarget.New)
The second argument {} is a required empty record placeholder.
Never write Launch(url) alone for any URL that should leave the app running in the background.
Classic Dropdown Always Has a Selection
A Classic Dropdown (not ModernDropdown) always selects the first item on load. Its .Selected value is never blank. There is no way to make it empty.
Do not add required-field validation for Classic Dropdown controls — IsBlank(drpControl.Selected.Value) will always be false and the validation will never trigger.
If required validation on a dropdown is needed, use ModernDropdown with a placeholder, or add a deliberate "Select..." first item and validate against that string.
Collection IDs Are Text; SharePoint IDs Are Numeric
When a collection is built with ForAll and stores SharePoint IDs as CourseID: C.ID, the value may be stored as text depending on how the formula evaluated. SharePoint TT Courses.ID is a numeric Integer field.
A LookUp('TT Courses', ID = ThisItem.CourseID) may silently return blank if the types don't match.
Wrap the collection ID with Value() to force numeric comparison:
LookUp('TT Courses', ID = Value(varCourse.CourseID))
Use this whenever looking up a SharePoint record by an ID that was previously stored in a collection.
varCourse vs varFullCourse — Two-Variable Pattern for Detail Screens
When a gallery row sets varCourse to ThisItem (the collection row), and the detail screen needs SharePoint-only fields not included in the collection's ForAll projection, those fields will be blank on the detail screen.
The clean pattern: keep varCourse as the gallery row (for training status, expiry, dates), and look up SP-only fields directly on the detail screen:
LookUp('TT Courses', ID = Value(varCourse.CourseID), CourseHost.Value)
LookUp('TT Courses', ID = Value(varCourse.CourseID), CourseDescription)
LookUp('TT Courses', ID = Value(varCourse.CourseID), CourseURL)
For multi-value fields like ApplicableTo:
With(
{courseRow: LookUp('TT Courses', ID = Value(varCourse.CourseID))},
"Applies to: " & Concat(courseRow.ApplicableTo, Value, ", ")
)
Avoid putting all fields into varCourse by attempting a merged record in OnSelect — the schema mismatch between the collection row and the SharePoint record causes CanEdit and other collection-only fields to be unrecognized.
Avoid keeping a varFullCourse variable set in OnSelect and then using it with fallbacks on the detail screen — that pattern quickly accumulates fallback formula debt when fields aren't available in both sources.
Collection Projections Must Include Every Field a Downstream Screen Reads
If scrCourseDetail reads varCourse.CourseURL, varCourse.CourseHost, varCourse.CourseDescription, and varCourse.ApplicableTo, those fields must be either:
- Included in the
colMyTrainingForAll projection, or - Looked up directly on the detail screen from the SharePoint source.
If you pick option 1, add all of them explicitly. If you add a new field to SharePoint later, you must also add it to the ForAll projection or it will be blank on the detail screen.
If you pick option 2, use the LookUp('TT Courses', ID = Value(varCourse.CourseID), FieldName) pattern described above.
Never assume a field is in varCourse because it exists in SharePoint — it is only there if the ForAll included it.
OnStart Collections Go Stale — Reload on Each Screen's OnVisible
App.OnStart loads collections once at app launch. If a user adds data in one screen and navigates to another, the collections are still the launch-time snapshot.
Add a ClearCollect reload at the top of OnVisible for any screen that depends on fresh data:
ClearCollect(colCourses, 'TT Courses');
ClearCollect(colMyRecords,
Filter('TT TrainingRecords', Lower(PersonEmail) = varMyEmail));
This is especially important for scrMyTraining — without it, newly added courses won't appear until the app is relaunched.
varViewingForSelf Must Be Initialised on Screen Load
If scrMyTraining.OnVisible checks If(varViewingForSelf, ...) and varViewingForSelf is blank (never set), the entire block is skipped and the gallery is empty.
Always initialise at the top of OnVisible:
If(IsBlank(varViewingForSelf), Set(varViewingForSelf, true));
This ensures self-view is the default the first time the screen opens, without interfering with team-view navigation from scrTeamMember.
Never hard-code Set(varViewingForSelf, true) inside galMyTraining.OnSelect. That forces self-view every time a course row is tapped, which breaks team-member viewing (the context switches away from the team member before the screen loads).
Form Doesn't Reset Between Visits — OnVisible Must ResetForm
When a screen contains a Form control (frmCert), navigating away and back does not automatically reset the form. The previous record's data stays loaded.
Add to the screen's OnVisible:
ResetForm(frmCert)
Without this, revisiting the screen after viewing one course and tapping a different course can show stale data or cause form submission to patch the wrong record.
Line Manager Relationship Is Directional
To allow Person A to upload training for Person B:
- Person B's TT Personnel record must have Person A's email in the LineManagerEmail field.
- Setting Person A's record to have Person B as manager only allows Person B to upload for Person A.
The relationship reads: "My manager can upload for me."
This is a common point of confusion. The guide must state it clearly when describing the team management feature.
SharePoint Column Required Field Causes Network Error in Patch
If a SharePoint column is marked Required and the Patch formula sends a blank value for it, Power Apps returns:
Network error when using Patch function: Field 'FieldName' is required.
This is a SharePoint-level enforcement, not a Power Apps formula error. Two resolution paths:
- Unmark Required in SharePoint: Go to the list → Column settings → Edit → set "Require that this column contains information" to No.
- Add app-level validation before Patch: Use the Set-error-vars-then-If-guard pattern (see
ui-patterns.md) to validate before the Patch call runs, preventing the network error from ever occurring.
Option 2 is preferred because it gives users a clear UI-level error message rather than a vague network error.
ForAll SelectedItems: Alias vs No Alias for Multi-Select Choice Patch
Two valid ways to patch a multi-select Choice column from a Combo box:
With alias (can fail in some contexts):
ApplicableTo: ForAll(cmbNewApplic.SelectedItems As T, {Value: T.Value})
Without alias (more reliable):
ApplicableTo: ForAll(cmbNewApplic.SelectedItems, {Value: Value})
The alias form As T can cause a type mismatch in some Power Apps versions. The no-alias form is more reliable. Prefer the no-alias form in new guides.
YAML Text: = Is Invalid
A bare Text: = with nothing after it is not valid YAML or a valid Power Fx expression. It typically appears when YAML is copied from a partial source or generated incorrectly.
Always use:
Text: =""
Any property that should be visually empty needs an empty string expression, not a bare =.
%QUALIFIED_DATACARD_FIELD_VALUE.ID% Is a Broken Placeholder
This string sometimes appears in Form card Default properties when YAML is exported incompletely or generated without the correct qualified field value. It is not valid Power Fx.
Replace it with the correct expression. For a DateCompleted data card:
=ThisItem.DateCompleted
For any data card, the correct Default is the field the card is bound to:
=ThisItem.FieldName
If you see this placeholder in YAML, treat it as a required fix before pasting.
ModernButton Does Not Accept FontWeight
ModernButton@1.0.0 does not expose FontWeight. Setting it causes a PA2108 error in the live editor.
Remove FontWeight from any ModernButton control. The button's font weight is controlled internally by the Fluent 2 system.
Other confirmed missing properties on ModernButton: none yet — but always audit against verified-control-reference.md before publishing YAML.
Confirmed missing on Toggle (Toggle@1.1.5): Size (font size). Toggle does not expose font size.
Badge Control Cannot Repeat From a Collection
The Badge control from the insert menu is designed as a single status indicator. It cannot loop over a table to produce multiple pills.
To render a list of pill badges (e.g. ApplicableTo values), use a Gallery with Classic Button pill controls inside it:
- galApplicableTo:
Control: Gallery@2.15.0
Variant: Vertical
Properties:
Height: =36
Items: =LookUp('TT Courses', ID = Value(varCourse.CourseID)).ApplicableTo
TemplatePadding: =0
TemplateSize: =90
WrapCount: =5
Width: =500
Children:
- btnApplyPill:
Control: Classic/Button@2.2.0
Properties:
DisplayMode: =DisplayMode.View
Fill: =RGBA(24,95,165,1)
HoverFill: =Self.Fill
PressedFill: =Self.Fill
Color: =RGBA(255,255,255,1)
HoverColor: =RGBA(255,255,255,1)
PressedColor: =RGBA(255,255,255,1)
BorderThickness: =0
Height: =28
Width: =84
RadiusTopLeft: =14
RadiusTopRight: =14
RadiusBottomLeft: =14
RadiusBottomRight: =14
Size: =10
Text: =ThisItem.Value
Y: =4
Key settings:
- WrapCount controls how many pills appear per row before wrapping.
- TemplateSize is the width slot per pill — increase if values like "Civil Service Learning" are clipped.
- HoverFill = Self.Fill and PressedFill = Self.Fill make the pill non-interactive visually.
- DisplayMode = DisplayMode.View prevents click responses.
For coloured pills by value:
Fill = Switch(
ThisItem.Value,
"Civil Servant", RGBA(56,152,220,1),
"Army", RGBA(59,109,17,1),
"Contractor", RGBA(239,159,39,1),
RGBA(108,117,125,1)
)
Strings in the Switch must match the SharePoint Choice values exactly, including capitalisation.
SharePoint Rich Text Fields Return HTML — Always Wrap in PlainText()
A SharePoint "Multiple lines of text" column set to Rich Text or Enhanced Rich Text returns raw HTML when read through the Power Apps connector:
<div class="ExternalClass..."><div style="font-family:Calibri...">Your text here.</div></div>
Displaying this directly in a ModernTextInput.Default or Label.Text shows the raw HTML markup to the user instead of the note content.
Fix: Always wrap the field in PlainText() for any text input or label that displays notes, descriptions, or any multi-line text field:
Default: =PlainText(varSelectedRecord.Notes)
PlainText() strips all HTML tags and decodes HTML entities, returning the readable text. PlainText(Blank()) safely returns "".
When the user edits and saves ({Notes: Self.Text}), the value is saved back as plain text — removing the rich text formatting permanently. This is acceptable for a notes field. If rich text round-tripping is required, use HtmlViewer@2.1.0 for display instead.
Apply to every multi-line text field in Default properties on ModernTextInput and Text properties on Label.
ModernDropdown Default — Never Use {Value: expr.Value} (Value/Value1 Collision)
Error (in Power Apps Studio after paste): Formula bar shows Value1 instead of Value; dropdown errors when the formula tries to run.
Cause: When the Default property of a ModernDropdown@1.0.1 contains {Value: someRecord.SomeField.Value}, Power Apps sees a naming collision between the record literal key (Value) and the property accessor (.Value) on the right-hand side. It renames one to Value1, breaking the formula.
Wrong — triggers the collision:
Default: '=If(IsBlank(varSelectedRecord.''Movement Type''), {Value: ""}, {Value: varSelectedRecord.''Movement Type''.Value})'
Fix — use With() to extract the string into a local variable first:
Default: '=With({_v: Coalesce(varSelectedRecord.''Movement Type''.Value, "")}, {Value: _v})'
_v is a plain string variable. {Value: _v} has no .Value on the right-hand side, so there is no collision. Coalesce(..., "") handles the blank case (records that predate the column).
Apply this pattern to every ModernDropdown.Default that reads from a SharePoint Choice field via varSelectedRecord.FieldName.Value. This affects all edit/view panels where the dropdown pre-populates from a selected record.
The With() pattern is safe: it evaluates to the correct {Value: "choice string"} record that ModernDropdown expects, without triggering the rename.
SharePoint Choice Fields Always Use .Value — Never .Value1
When accessing a SharePoint Choice field in a formula, always use .Value:
ThisItem.'Movement Type'.Value
varSelectedRecord.'Position Type'.Value
Do not use .Value1. SharePoint's data connector exposes .Value (the selected choice string) and may also surface .Value1 as an internal artifact on some field configurations, but .Value1 is not the choice string and will error.
This applies to all single-select Choice fields everywhere: gallery labels, filter conditions, dropdown defaults, patch records, and visibility formulas.
Toggle Bound to a SharePoint Choice Field — Use .Value = "Yes", Not Boolean
Toggle@1.1.5 Checked requires a strict Boolean. If the underlying SharePoint column is a Choice type (not a true Yes/No checkbox), the data connector returns a Record {Value: "Yes"} or {Value: "No"} — comparing that Record to true throws:
Incompatible types for comparison. These types can't be compared: Record, Boolean.
How to tell: If field = true causes the above error, the field is a Choice, not a Yes/No.
Fix for every formula touching the field:
Checked: =varSelectedRecord.FieldName.Value = "Yes"
Visible: =varSelectedRecord.FieldName.Value = "Yes"
Label: =If(varSelectedRecord.FieldName.Value = "Yes", "Yes — upgrade needed", "No upgrade needed")
Fix for Patch in OnCheck / OnUncheck:
OnCheck: |-
=Patch('List', varRecord, {FieldName: {Value: "Yes"}});
...
OnUncheck: |-
=Patch('List', varRecord, {FieldName: {Value: "No"}});
...
Blank().Value returns blank (empty string), so .Value = "Yes" is safe for records where the field has never been set — it returns false, which is what the toggle needs.
Do not use field = true or bare field for a SharePoint Choice field regardless of the column's display name. Check how the connector returns it before writing the formula.
Real Build Quirks
Real Build Quirks
Last checked: 2026-06-20
These are issues found while building the Training Tracker app in the live Power Apps editor. Preserve them even when a generic Microsoft Learn example looks different, unless the live editor is rechecked and the guide is updated deliberately.
SharePoint List Names With Spaces
Power Fx formulas must wrap SharePoint list names containing spaces in single quotes:
'TT Personnel'
'TT Courses'
'TT TrainingRecords'
Do not write unquoted list names in formulas.
Layer Order
Layer order is a build requirement, not a cosmetic note.
Any classic Button used as a visual background must sit behind the controls it supports:
- card backgrounds
- panel backgrounds
- gallery row backgrounds
- indentation strips
- progress-bar backgrounds
In guide tables, place background controls before the controls that sit on top of them, and add a highlighted layer note when the order matters. If a background covers labels, inputs, icons or buttons in Power Apps, use Send to back or move it to the bottom/back of that screen, group, or gallery template before continuing.
For user-facing build guides, do not rely on table order alone. If a panel background appears first in a properties table, add a "Recommended build order" note that tells the builder to either:
- build the visible controls first, then create/send the panel background to the back, or
- build the panel first, then send it to the back after the visible controls are added.
For progress bars, the background bar must sit behind the fill bar:
recBarBack behind recBarFill
Temporary Formula Errors
Power Apps can show red-line formula errors while the builder is still partway through a phase and referenced controls, variables, or collections do not exist yet.
Future guides must call this out explicitly near the formula. Use this wording pattern:
Temporary red-line note: this formula may complain until [control/collection/variable] exists. Finish this phase first, then recheck.
If a formula still red-lines after every control and formula in that phase is complete, treat it as a real issue.
Grouping Controls
Groups are useful for clear sections such as tab bodies (grpPeople, grpCourses) and can make the tree tidier.
Use them carefully:
- Group after the controls work and layer order is correct.
- Do not let grouping hide which background control must sit behind visible controls.
- Grouping normally preserves control names, so formulas like
txtEditCourse.Textstill work. - Avoid unnecessary nested groups during the first build because they can make selection and send-to-back/front operations harder to follow.
- If a group controls visibility, still make sure the guide explains which variable drives it and whether that variable may temporarily red-line.
Default Values
Do not make the builder waste time hunting for properties that are already correct by default.
Guide rows should focus on properties that must be changed. If a default value is included because it is a useful safety check, label it clearly as default/safety check.
Use Microsoft Learn defaults where documented. If Microsoft Learn does not document a default for a property/control, do not claim one from memory.
Fresh Label controls in the user's live editor do not need Fill=RGBA(0,0,0,0) set manually when the goal is a normal transparent label over the screen/card background. The defaults lab did not serialize Fill for a fresh standalone Label, and the user confirmed the live editor already shows the intended default state. Future guide rows should omit label Fill=RGBA(0,0,0,0) unless transparency is a safety-critical reminder, in which case label it leave default or default/safety check.
Fresh Label controls in the user's live editor also default to BorderThickness=0. The defaults lab did not serialize BorderThickness for a fresh standalone Label, and the user confirmed the live editor shows 0. Do not make BorderThickness=0 a manual Label step unless it is a labelled safety check.
Sort Order Enum
Use:
SortOrder.Ascending
SortOrder.Descending
Do not use bare Ascending or Descending.
DateAdd Day Filters
In the Training Tracker expiring-soon formulas, the live editor accepted the day unit as a quoted string:
DateAdd(Today(), 60, "Days")
Do not normalize this to bare Days. Do not change it to TimeUnit.Days in this guide unless the live editor is rechecked.
Modern Combo Box
Modern Combo box rows need placeholder fields made explicit:
InputTextPlaceholder="Applies to..."
In the user's live editor, modern Combo box ItemDisplayText=ThisItem.Value is already the default. Do not make ItemDisplayText=ThisItem.Value a manual step for simple value tables unless it is labelled leave default or default/safety check.
For Office365Users search results:
ItemDisplayText=ThisItem.DisplayName
Do not use Placeholder for modern Combo box.
Still set ItemDisplayText explicitly when the Items row shape does not display from a Value field, for example Office365Users search rows.
In the user's live editor, modern Combo box SelectMultiple=true is already the default. Do not make SelectMultiple=true a manual step unless it is labelled leave default or default/safety check. For single-select Combo boxes, set SelectMultiple=false explicitly.
Modern Dropdown With Table Items
When a modern Dropdown uses a table of records, state the display formula explicitly:
ItemDisplayText=ThisItem.Label
For Training Tracker recurrence dropdowns, keep reading the numeric recurrence from:
drpNewRecur.Selected.Months
drpEditRecur.Selected.Months
Modern Toggle
Use Checked for state and Label for caption text in this guide family. Do not use .Value to read modern Toggle state.
Office365Users Casing
Preserve operation-specific casing:
Office365Users.SearchUserV2(...).value:.DisplayName,.MailOffice365Users.UserProfileV2(...):.displayName,.jobTitle,.mail
ModernButton BasePaletteColor — Light Colours Always Render Dark
BasePaletteColor is a Fluent 2 seed, not a fill. The framework derives fill, text, and hover colours from it. Light and pastel seeds are treated as low-contrast accents and overrides them with dark fills.
Use only dark, saturated colours:
- Navy: RGBA(24,95,165,1)
- Dark green: RGBA(34,139,80,1) or RGBA(34,139,80,1)
- Dark grey: RGBA(120,120,120,1)
- Dark red: RGBA(163,45,45,1)
For any button that needs a light or white fill (tab nav active/inactive, etc.), switch to Classic Button and use Fill, HoverFill, PressedFill directly.
Tab Buttons Must Be Classic Buttons
Modern Button cannot conditionally switch between light and dark fills for active/inactive tab states. Replace any ModernButton used as a tab navigation button with a Classic/Button and set Fill conditionally.
IsOdd Does Not Exist
IsOdd() is not a Power Apps function. Use Mod(value, 2) = 1.
\xB7 Prints as Literal Text
Power Apps strings do not support \x or \u escape sequences. \xB7 outputs the four characters \xB7 literally. Use Char(183) for the middle dot ·.
SortByColumns Fails on Choice Fields
SortByColumns cannot sort on a Choice column because the column returns a record. Use Sort(source, ChoiceField.Value, SortOrder.Ascending) to unwrap the Choice record to a string first.
Multi-Select Choice: in Operator Silently Returns Nothing
"Army" in ApplicableTo checks for a full record match against a string — it always returns false. Use CountIf(ApplicableTo, Value = "Army") > 0.
Launch Opens in Current Tab
Launch(url) reuses the current tab. Use Launch(url, {}, LaunchTarget.New) to open in a new tab.
Collection Projections Must Include All Downstream Fields
If a detail screen reads varCourse.CourseHost, varCourse.CourseURL, etc., those fields must either be in the ForAll projection that built colMyTraining, or the detail screen must look them up directly from SharePoint. They do not flow through automatically.
varViewingForSelf Must Be Initialised
Add If(IsBlank(varViewingForSelf), Set(varViewingForSelf, true)) to the top of any screen OnVisible that branches on this variable. If it is never set, the screen body is skipped entirely.
Form Does Not Reset Between Visits
Add ResetForm(frmCert) to a form screen's OnVisible. Without it, the form shows the previous record's data when the user navigates back and taps a different item.
SharePoint Required Column Causes Network Error
A Patch against a SharePoint column marked Required with a blank value returns "Network error: Field 'X' is required." Unmark the column as Required in SharePoint, or add app-level validation to prevent Patch from running when the field is blank.
SharePoint Collection Row Limit
ClearCollect(localCollection, 'Large SharePoint List') does not guarantee the app has every SharePoint row. It only caches the first client-side page. If downstream formulas count, filter, or build email recipients from that local collection, any rows outside the loaded page are invisible to the app even though SharePoint is correct.
Confirmed live in Branch Contact Groups, 2026-07-27: several groups showed 0 members in scrSendEmail while SharePoint BM Memberships had real rows. The groups whose membership rows appeared early in the SharePoint list counted correctly; later groups did not.
The first attempted fix used delegable ID windows, but the live app still cut off around the C groups. The more robust pattern for this app is to load memberships group-by-group, because each group roster is small:
ClearCollect(colMemberships, Filter('BM Memberships', false));
ForAll(
colGroups As grp,
Collect(colMemberships, Filter('BM Memberships', GroupName = grp.Title))
)
This depends on the app's intended data contract: BM Memberships.GroupName must match BM Groups.Title. After the rows are in colMemberships, local formulas can still use trim/case-insensitive comparison defensively.
Notify-First Validation Pattern Breaks Error Borders
If validation calls Notify(...) before setting error variables, the Notify message appears but the error borders (Visible driven by error variables) never show because the success path immediately clears everything. Set all error variables first, then check them in an If guard. See ui-patterns.md for the correct pattern.
UI Patterns
UI Patterns
Last checked: 2026-06-23
Reusable UI patterns verified in the Training Tracker live build. Use these as the basis for equivalent constructs in any future app.
Rounded Panel Card (Classic Button)
Use a Classic Button as a rounded white card background. Do not use Rectangle controls — they don't support the same radius properties in this guide family.
- recPanel:
Control: Classic/Button@2.2.0
Properties:
Text: =""
DisplayMode: =DisplayMode.View
Fill: =RGBA(255,255,255,1)
HoverFill: =RGBA(255,255,255,1)
PressedFill: =RGBA(255,255,255,1)
BorderColor: =RGBA(221,227,234,1)
BorderThickness: =1
RadiusTopLeft: =12
RadiusTopRight: =12
RadiusBottomLeft: =12
RadiusBottomRight: =12
X: =283
Y: =80
Width: =800
Height: =120
Layer rule: this control must be listed BEFORE (lower in Children) any controls that sit on top of it. In Power Apps, controls listed later in the Children array appear in front.
Tab Navigation Bar (Two Tabs)
Classic buttons give full conditional Fill control. ModernButton cannot render light-coloured inactive states reliably (see live-build-lessons.md).
- btnTabPeople:
Control: Classic/Button@2.2.0
Properties:
Text: ="People"
Fill: =If(varTab="People", RGBA(34,139,80,1), RGBA(255,255,255,1))
Color: =If(varTab="People", RGBA(255,255,255,1), RGBA(24,95,165,1))
HoverFill: =If(varTab="People", RGBA(28,115,65,1), RGBA(235,241,250,1))
PressedFill: =If(varTab="People", RGBA(22,95,55,1), RGBA(210,225,245,1))
HoverColor: =Self.Color
PressedColor: =Self.Color
BorderColor: =RGBA(24,95,165,1)
BorderThickness: =1
RadiusTopLeft: =8
RadiusTopRight: =8
RadiusBottomLeft: =8
RadiusBottomRight: =8
OnSelect: =Set(varTab, "People")
X: =672
Y: =48
Width: =120
Height: =36
- btnTabCourses:
Control: Classic/Button@2.2.0
Properties:
Text: ="Courses"
Fill: =If(varTab="Courses", RGBA(34,139,80,1), RGBA(255,255,255,1))
Color: =If(varTab="Courses", RGBA(255,255,255,1), RGBA(24,95,165,1))
HoverFill: =If(varTab="Courses", RGBA(28,115,65,1), RGBA(235,241,250,1))
PressedFill: =If(varTab="Courses", RGBA(22,95,55,1), RGBA(210,225,245,1))
HoverColor: =Self.Color
PressedColor: =Self.Color
BorderColor: =RGBA(24,95,165,1)
BorderThickness: =1
RadiusTopLeft: =8
RadiusTopRight: =8
RadiusBottomLeft: =8
RadiusBottomRight: =8
OnSelect: =Set(varTab, "Courses")
X: =800
Y: =48
Width: =120
Height: =36
Tab body controls use Visible: =varTab = "People" or Visible: =varTab = "Courses".
Initialise in App.OnStart or screen OnVisible:
Set(varTab, "People")
Error Border Pattern (Validation Highlight)
A red Classic Button positioned behind an input field simulates a red border. Place it before the input in the Children list so it appears behind.
Template (replace txtMyField with the actual control name, varErrMyField with the error variable):
- recErrMyField:
Control: Classic/Button@2.2.0
Properties:
Text: =""
DisplayMode: =DisplayMode.View
Fill: =RGBA(163,45,45,1)
HoverFill: =Self.Fill
PressedFill: =Self.Fill
BorderThickness: =0
RadiusTopLeft: =8
RadiusTopRight: =8
RadiusBottomLeft: =8
RadiusBottomRight: =8
Height: =txtMyField.Height + 4
Width: =txtMyField.Width + 4
X: =txtMyField.X - 2
Y: =txtMyField.Y - 2
Visible: =varErrMyField
The +4 height/width and -2 X/Y creates a 2px overhang on each side — it reads as a red border, not a red fill.
If the field moves, the error border moves with it because it references the field's X/Y/Width/Height.
Validation Pattern (Set Error Vars Then If Guard)
Do not use the Notify-first pattern for form validation. Notify fires before the error variables are set, so red borders don't appear.
Use this pattern for every save button that validates required fields:
Set(varErrTitle, IsBlank(Trim(txtTitle.Text)));
Set(varErrApplic, CountRows(cmbApplic.SelectedItems) = 0);
Set(varErrHost, IsBlank(drpHost.Selected.Value) || drpHost.Selected.Value = "Select...");
Set(varErrURL, IsBlank(txtURL.Text));
If(
varErrTitle || varErrApplic || varErrHost || varErrURL,
false,
Patch(DataSource, BaseRecord,
{
Title: Trim(txtTitle.Text),
ApplicableTo: ForAll(cmbApplic.SelectedItems, {Value: Value}),
Host: {Value: drpHost.Selected.Value},
URL: txtURL.Text
}
);
Set(varErrTitle, false);
Set(varErrApplic, false);
Set(varErrHost, false);
Set(varErrURL, false);
Notify("Saved.", NotificationType.Success);
ClearCollect(colData, DataSource)
)
Key rules:
- All Set(varErrX, ...) calls run unconditionally at the top, before the If.
- The If guard checks all error variables together.
- On success, all error variables are reset to false inside the success block.
- The Patch only runs if no errors are set.
Clearing Error Borders When User Starts Correcting
Add OnChange to each validated input to clear the error variable as soon as the user types or changes the field:
txtTitle.OnChange: Set(varErrTitle, false)
cmbApplic.OnChange: Set(varErrApplic, false)
drpHost.OnChange: Set(varErrHost, false)
txtURL.OnChange: Set(varErrURL, false)
Resetting Error Borders When Opening Edit Panel
Error variables linger from the previous save attempt. When the user opens an edit panel (e.g. clicking a pencil icon), reset all error variables:
Add to the pencil/edit button's OnSelect:
Set(varErrTitle, false);
Set(varErrURL, false);
Set(varErrApplic, false);
Set(varErrHost, false)
Without this, red borders from a previous failed save remain visible when the edit panel opens.
Pill Badge Gallery (Repeating Coloured Pills)
Use a Gallery + Classic Button. The Badge control cannot loop over a collection.
- galPills:
Control: Gallery@2.15.0
Variant: Vertical
Properties:
Items: =sourceTable
TemplatePadding: =0
TemplateSize: =90
WrapCount: =5
Height: =36
Width: =500
Visible: =CountRows(sourceTable) > 0
Children:
- btnPill:
Control: Classic/Button@2.2.0
Properties:
Text: =ThisItem.Value
DisplayMode: =DisplayMode.View
Fill: =RGBA(24,95,165,1)
HoverFill: =Self.Fill
PressedFill: =Self.Fill
Color: =RGBA(255,255,255,1)
HoverColor: =RGBA(255,255,255,1)
PressedColor: =RGBA(255,255,255,1)
BorderThickness: =0
Height: =28
Width: =84
RadiusTopLeft: =14
RadiusTopRight: =14
RadiusBottomLeft: =14
RadiusBottomRight: =14
Size: =10
Y: =4
Replace sourceTable with the actual table expression. For a SharePoint multi-select Choice field via LookUp:
Items: =LookUp('TT Courses', ID = Value(varCourse.CourseID)).ApplicableTo
For colour-coded pills by value (e.g. staff type):
Fill: =Switch(
ThisItem.Value,
"Civil Servant", RGBA(56,152,220,1),
"Army", RGBA(59,109,17,1),
"Contractor", RGBA(239,159,39,1),
RGBA(108,117,125,1)
)
Increase TemplateSize and btnPill.Width together if long values like "Civil Service Learning" are clipped.
Screen Header Bar
Full-width blue header with a back icon and title:
- recHeader:
Control: Classic/Button@2.2.0
Properties:
Text: =""
DisplayMode: =DisplayMode.View
Fill: =RGBA(24,95,165,1)
HoverFill: =RGBA(24,95,165,1)
PressedFill: =RGBA(24,95,165,1)
BorderThickness: =0
RadiusTopLeft: =0
RadiusTopRight: =0
RadiusBottomLeft: =0
RadiusBottomRight: =0
X: =0
Y: =0
Width: =1366
Height: =72
- icoBack:
Control: Classic/Icon@2.5.0
Properties:
Icon: =Icon.ChevronLeft
Color: =RGBA(230,241,251,1)
BorderColor: =RGBA(0,18,107,1)
OnSelect: =Back()
X: =16
Y: =24
Width: =24
Height: =24
- lblScreenTitle:
Control: Label@2.5.1
Properties:
Text: ="Screen Title"
Color: =RGBA(255,255,255,1)
FontWeight: =FontWeight.Bold
Size: =16
Font: =Font.'Open Sans'
X: =52
Y: =4
Width: =900
Height: =44
- lblScreenSub:
Control: Label@2.5.1
Properties:
Text: ="Subtitle or context"
Color: =RGBA(181,212,244,1)
Size: =11
Font: =Font.'Open Sans'
X: =52
Y: =44
Width: =900
Height: =24
Training Status Colour Coding
Consistent colour values for status labels and fills across the app:
| Status | Fill | Text |
|---|---|---|
| Expired | RGBA(163,45,45,1) |
RGBA(255,255,255,1) |
| Not Started | RGBA(108,117,125,1) |
RGBA(255,255,255,1) |
| Expiring Soon | RGBA(180,100,0,1) |
RGBA(255,255,255,1) |
| In Date | RGBA(59,109,17,1) |
RGBA(255,255,255,1) |
| Complete | RGBA(59,109,17,1) |
RGBA(255,255,255,1) |
Switch formula for Fill:
Switch(ThisItem.TrainingStatus,
"Expired", RGBA(163,45,45,1),
"Not Started", RGBA(108,117,125,1),
"Expiring Soon", RGBA(180,100,0,1),
"In Date", RGBA(59,109,17,1),
"Complete", RGBA(59,109,17,1),
RGBA(108,117,125,1)
)
Days Remaining / Overdue Label
Show urgency text below a date label. Separate label, colour-coded.
Text = If(
IsBlank(ThisItem.ExpiresOn),
"",
If(
ThisItem.ExpiresOn >= Today(),
Text(DateDiff(Today(), ThisItem.ExpiresOn, TimeUnit.Days)) & " days remaining",
"Overdue by " & Text(DateDiff(ThisItem.ExpiresOn, Today(), TimeUnit.Days)) & " days"
)
)
Color = If(
IsBlank(ThisItem.ExpiresOn),
RGBA(136,135,128,1),
ThisItem.ExpiresOn < Today(), RGBA(163,45,45,1),
DateDiff(Today(), ThisItem.ExpiresOn, TimeUnit.Days) <= 60, RGBA(180,100,0,1),
RGBA(59,109,17,1)
)
Visible = !IsBlank(ThisItem.ExpiresOn)
Visible = !IsBlank(ThisItem.ExpiresOn) is critical — without it the label appears for courses with no expiry date.
Date + Middle Dot Separator Label
A date label with · as a separator between date and expiry:
If(
IsBlank(ThisItem.DateDone),
"Not yet completed",
"Completed " & Text(ThisItem.DateDone, "dd mmm yyyy") &
If(
IsBlank(ThisItem.ExpiresOn),
"",
" " & Char(183) & " expires " & Text(ThisItem.ExpiresOn, "dd mmm yyyy")
)
)
Char(183) is the only correct way to produce · in a Power Apps string. Never use \xB7.
Context-Aware Search and Filter (Shared Controls, Multiple Tabs)
When a search input and a dropdown filter are shared between two gallery tabs, wire each gallery's Items to the same controls and make the search placeholder context-aware.
Search placeholder:
txtSearch.Placeholder = If(varTab = "People", "Search name or email...", "Search course name...")
People gallery filter:
SortByColumns(
Filter(
'TT Personnel',
Active = true &&
(IsBlank(txtSearch.Text) ||
txtSearch.Text in Title ||
txtSearch.Text in Email) &&
(IsBlank(drpTypeFilter.Selected.Value) ||
drpTypeFilter.Selected.Value = "All types" ||
StaffType.Value = drpTypeFilter.Selected.Value)
),
"Title", SortOrder.Ascending
)
Courses gallery filter (multi-select Choice on ApplicableTo):
Sort(
Sort(
Filter(
colCourses,
(IsBlank(txtSearch.Text) ||
txtSearch.Text in Title) &&
(IsBlank(drpTypeFilter.Selected.Value) ||
drpTypeFilter.Selected.Value = "All types" ||
CountIf(ApplicableTo, Value = drpTypeFilter.Selected.Value) > 0)
),
Title, SortOrder.Ascending
),
Status.Value, SortOrder.Ascending
)
ModernDropdown Default — Record Format
A ModernDropdown Default must be a record matching the Items row shape, not a plain string.
For Items bound to a simple string array:
Default = {Value: "All types"}
For Items bound to a table with a Label column:
Default = {Label: "Every year", Months: 12}
A plain string like Default = "All types" will cause the dropdown to show blank on load, and Filter formulas that check .Selected.Value will return no results.
Non-Compliant Filter Toggle
Add a modern Toggle to let admins quickly filter to only staff with outstanding training:
tglNonCompliantOnly.Label = "Non-compliant only"
In the gallery Items filter, add as the last condition:
(!tglNonCompliantOnly.Checked || Outstanding > 0)
When the toggle is off (unchecked), !false = true, so the condition passes for all rows. When on, only rows with Outstanding > 0 pass.
TeamMember Drill-Down: Setting Context for Viewing Another Person's Training
When navigating from a team gallery to view someone else's training:
Set(varViewingPerson, LookUp('TT Personnel', Lower(Email) = Lower(ThisItem.Email)));
Set(varViewingForSelf, false);
ClearCollect(colViewRecords, Filter(colAllRecords, Lower(PersonEmail) = Lower(ThisItem.Email)));
Then build colViewTraining the same way as colMyTraining but using the selected person's email and staff type.
On scrMyTraining, switch the gallery source:
galMyTraining.Items = If(varViewingForSelf, colMyTraining, colViewTraining)
And update the greeting label:
If(varViewingForSelf,
"Hello, " & First(Split(varMe.Title," ")).Value,
"Viewing: " & varViewingPerson.Title)
External Link Button (Opens New Tab)
- btnGoToCourse:
Control: ModernButton@1.0.0
Properties:
Text: ="Go to course →"
BasePaletteColor: =RGBA(24,95,165,1)
OnSelect: =Launch(LookUp('TT Courses', ID = Value(varCourse.CourseID), CourseURL), {}, LaunchTarget.New)
Visible: =!IsBlank(LookUp('TT Courses', ID = Value(varCourse.CourseID), CourseURL))
Width: =200
Height: =30
Always use LaunchTarget.New as the third argument. The second argument must be {} (empty record).
My Team Button (Auto-Hides When No Direct Reports)
- btnMyTeam:
Control: ModernButton@1.0.0
Properties:
Text: ="My team"
BasePaletteColor: =RGBA(46,110,145,1)
Visible: =CountRows(Filter('TT Personnel', Lower(LineManagerEmail) = varMyEmail && Active = true)) > 0
OnSelect: =Navigate(scrTeamMember, ScreenTransition.Cover)
X: =1086
Y: =16
Width: =124
Height: =40
The button is invisible when the current user has no active direct reports. No additional logic needed.
Power Fx Patterns
Power Fx Patterns
Last checked: 2026-06-20
Sources:
- Formula reference: https://learn.microsoft.com/en-us/power-platform/power-fx/formula-reference-canvas-apps
- Sort and SortByColumns: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-sort
- Patch: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-patch
- Filter, Search, LookUp: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-filter-lookup
- Distinct: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-distinct
- GroupBy/Ungroup/AddColumns examples: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-groupby
- UpdateContext: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-updatecontext
Sorting
Use full enum values:
SortByColumns(Source, "Title", SortOrder.Ascending)
SortByColumns(Source, "Created", SortOrder.Descending)
Do not use bare Ascending or Descending.
DateAdd / DateDiff Unit Argument — Always a Quoted String
Hard rule (confirmed broken in live builds — Training Tracker and Policy Tracker):
The time-unit argument to DateAdd and DateDiff must be a quoted string, not a bare identifier or enum:
// CORRECT
DateAdd(Today(), 7, "Days")
DateAdd(Today(), Mod(5 - Weekday(Today()) + 7, 7), "Days")
DateDiff(Today(), ExpiryDate, "Days")
// WRONG — causes runtime error in canvas apps
DateAdd(Today(), 7, Days)
DateAdd(Today(), 7, TimeUnit.Days)
Microsoft Learn sometimes documents TimeUnit.Days but this does not work in the canvas app formula bar. Always use quoted string literals: "Days", "Months", "Years", "Hours", "Minutes", "Seconds".
Filtering And Lookup
Use Filter for many records and LookUp for the first matching record.
Filter('TT Personnel', Active = true)
LookUp('TT Personnel', Lower(Email) = varMyEmail)
Use As aliases in nested formulas:
Filter(colPeople As P, Lower(P.ManagerEmail) = varMyEmail)
Patch
Use Patch(DataSource, BaseRecord, ChangeRecord) to update records. Use Defaults(DataSource) to create records.
Patch('TT Courses', Defaults('TT Courses'), {Title: txtCourse.Text})
Patch('TT Courses', varEditCourse, {Title: txtEditCourse.Text})
For SharePoint Choice columns, patch records with a Value field:
{Status: {Value: "Active"}}
For multi-choice columns, patch a table of {Value: ...} records:
{ApplicableTo: ForAll(cmbApplic.SelectedItems As T, {Value: T.Value})}
Collections
Prefer explicit shape when initializing collections that will be patched or reused later. Avoid schema-less empty table literals in guide formulas.
Good:
ClearCollect(colCourses, 'TT Courses')
Avoid:
ClearCollect(colCourses, [])
Record Scope
When a formula is inside a gallery and also uses nested ForAll, Filter, AddColumns, or With, capture the selected gallery row first:
With(
{selectedPerson: ThisItem},
Filter(colRecords, Lower(PersonEmail) = Lower(selectedPerson.Email))
)
Navigation
Do not use ScreenTransition.Back. For browser-like back behavior, use:
Back()
For navigation transitions, use valid enum values such as:
Navigate(scrHome, ScreenTransition.Fade)
Navigate(scrHome, ScreenTransition.None)
Launch (Open URL in New Tab)
Launch(url) alone reuses the current browser tab, navigating away from the app.
Always use LaunchTarget.New to open in a new tab:
Launch(urlValue, {}, LaunchTarget.New)
The second argument must be {} (empty record placeholder).
Alternating Row Colours
Do not use ThisItem.ItemIndex — it shifts when the gallery filters or sorts.
For SharePoint-backed galleries (items have ThisItem.ID):
If(Mod(ThisItem.ID, 2) = 0, RGBA(255,255,255,1), RGBA(247,249,252,1))
For collection-backed galleries with a numeric course or record ID:
If(Mod(ThisItem.CourseID, 2) = 0, RGBA(255,255,255,1), RGBA(247,249,252,1))
Multi-Select Choice Field Filter
The in operator checks full record equality. A multi-select Choice column holds a table of {Value: "..."} records — "Army" in ApplicableTo always returns false.
Use CountIf:
CountIf(ApplicableTo, Value = drpFilter.Selected.Value) > 0
Inside a Filter:
Filter(source,
IsBlank(drpFilter.Selected.Value) ||
drpFilter.Selected.Value = "All" ||
CountIf(ApplicableTo, Value = drpFilter.Selected.Value) > 0
)
Sort Choice Field
SortByColumns on a SharePoint Choice field fails because the field returns a record.
Use Sort() with .Value to unwrap:
Sort(source, Status.Value, SortOrder.Ascending)
Double-sort (e.g. active before archived, then alphabetical):
Sort(
Sort(source, Title, SortOrder.Ascending),
Status.Value, SortOrder.Ascending
)
Special Characters in Strings
Power Apps does not support \x or \u escape sequences. Use Char(decimal):
Char(183) // · middle dot / interpunct
Training Status Calculation
Standard pattern used across the Training Tracker:
If(IsBlank(rec.DateCompleted), "Not Started",
C.RecurrenceMonths = 0, "Complete",
DateAdd(rec.DateCompleted, C.RecurrenceMonths, TimeUnit.Months) < Today(), "Expired",
DateAdd(rec.DateCompleted, C.RecurrenceMonths, TimeUnit.Months) <= DateAdd(Today(), 60, "Days"), "Expiring Soon",
"In Date")
Sort Gallery by Status Priority
Add a numeric sort key then sort twice:
Sort(
Sort(source, CourseName, SortOrder.Ascending),
Switch(TrainingStatus,
"Expired", 1,
"Not Started", 2,
"Expiring Soon", 3,
"In Date", 4,
"Complete", 5,
99),
SortOrder.Ascending
)
Or use AddColumns:
SortByColumns(
AddColumns(
source,
SortKey, Switch(TrainingStatus,
"Expired", 1,
"Not Started", 2,
"Expiring Soon", 3,
"In Date", 4,
"Complete", 5)
),
"SortKey", SortOrder.Ascending,
"CourseName", SortOrder.Ascending
)
Concat Multi-Select Choice for Display
Concat(record.ApplicableTo, Value, ", ")
ForAll Multi-Select Choice Patch
Prefer the no-alias form — the As T alias can cause type mismatches in some versions:
ApplicableTo: ForAll(cmbApplic.SelectedItems, {Value: Value})
Collection ID vs SharePoint ID Type Mismatch
When a collection stores an ID that was originally from SharePoint (numeric), use Value() to force numeric comparison in LookUp:
LookUp('TT Courses', ID = Value(varCourse.CourseID))
Days Remaining / Overdue
If(
ExpiresOn >= Today(),
Text(DateDiff(Today(), ExpiresOn, TimeUnit.Days)) & " days remaining",
"Overdue by " & Text(DateDiff(ExpiresOn, Today(), TimeUnit.Days)) & " days"
)
Visible Guard for Optional Date Fields
Any label or pill that only makes sense when an expiry date exists:
Visible = !IsBlank(ThisItem.ExpiresOn)
If Chain Validation Before Patch
Do not use Notify-first. Set all error variables first, then gate the Patch:
```powerfx Set(varErrTitle, IsBlank(Trim(txtTitle.Text))); Set(varErrURL, IsBlank(txtURL.Text));
If( varErrTitle || varErrURL, false, Patch(...); Set(varErrTitle, false); Set(varErrURL, false); Notify("Saved.", NotificationType.Success) )
YAML Validation Checklist
YAML Pre-Output Validation Checklist
Last checked: 2026-06-23
Run through this checklist mentally before generating or outputting ANY screen YAML. Do not skip items based on "this section won't apply here" — check every item every time. A single missed property causes a PA2108 error that breaks the entire paste.
1. YAML Structure
- [ ] Every formula value starts with
=prefix — no bare values on formula properties - [ ] [PA1001]
|-is only allowed on event handlers and Items —OnSelect,OnChange,OnVisible,OnCheck,OnUncheck,Items. All other properties (Fill,Color,Visible,Text,DisabledFill,HoverFill,BorderColor, etc.) must use a single-line formula.|-on style/visual properties causes PA1001 even with structurally valid YAML. - [ ] [PA1001] No inline multi-line formulas — for every
Key: =Something(line, count(vs). If open > closed, it must use|-. But since|-is restricted to handlers/Items, the formula itself must be collapsed to a single line for any other property type. - [ ] [PA1001] Every
|-block's first content line starts with=— event handlers and Items only. Missing=causes PA1001 "Power Fx expressions must start with '='". - [ ] [PA1001] Inside
|-blocks, closing parens follow paren depth — outer)sits at the same indent as=If(. A double-)at the same indent level is wrong. - [ ] Indent is exactly 2 spaces — no tabs anywhere
- [ ] Control names follow the naming convention (
btn,lbl,txt,cmb,drp,gal,rec,ico,tgl,frm) - [ ] No trailing spaces on any line
- [ ] [PA1006] Screen-copy YAML starts with
Screens:— do not start with- scrName:. A bare top-level list item can cause PA1006 "Empty or invalid value for Control" at line 1, column 3 even whenControl: Screenexists. - [ ] [PA1001] Screen nodes under
Screens:do not haveControl:—Screens:→scrName:→Properties:is the valid shape.Control: Screenat this level causes "Property 'Control' not found on type ... ScreenInstance" at line 3, column 5. - [ ] [YAML parser] Quote single-line formulas containing
:— examples:Default: '={Value: "New to MoD/Branch"}'andText: '=If(IsBlank(varRole), "Role not set", "Role: " & varRole)'. This keepsyaml.safe_loadvalid while preserving the parsed Power Fx formula. - [ ] [YAML parser]
HtmlTextand other non-event-handler properties with inline CSS —|-is blocked (PA1001) on these properties, so the block-scalar escape is not available. Use YAML single-quote wrapping instead:HtmlText: '="<div style=""border: 1px solid ..."">"'. Any literal single quotes inside (e.g.'Open Sans') must be doubled:''Open Sans''. Triggers on any CSS property value (border:,padding:,margin:,font-family:,font-size:, etc.) embedded in a PowerFX string literal on a non-handler property. - [ ]
Control:andVariant:values use exact version strings (see version list below) - [ ] [PA2109] Gallery variants are exact and case-sensitive — for
Gallery@2.15.0, useVariant: Vertical,Variant: Horizontal, orVariant: VariableHeight; neververticalGallery. - [ ] [PA2108] Labels do not support radius properties — never put
RadiusTopLeft,RadiusTopRight,RadiusBottomLeft, orRadiusBottomRightonLabel@2.5.1. Use Classic Button for rounded pills/badges. - [ ] Screen copy pages show a visible first-lines payload preview and refuse to copy stale
Control: Screenscreen payloads - [ ] Index links to generated screen pages include the current version query string, for example
screens/scrDashboard.html?v=1.9
Known valid version strings
Label@2.5.1
Do not use radius properties on Label@2.5.1
Classic/Button@2.2.0
Classic/Icon@2.5.0
Gallery@2.15.0
Valid classic variants: Vertical, Horizontal, VariableHeight
Classic/TextInput@2.3.2
Classic/DropDown@2.3.1
Classic/ComboBox@2.4.0
Classic/DatePicker@2.6.0
Classic/CheckBox@2.1.0
Classic/Toggle@2.1.0
Form@2.4.4
ModernButton@1.0.0
ModernTextInput@1.1.0
ModernDropdown@1.0.1
ModernCombobox@1.1.0
Toggle@1.1.5
ModernDatePicker@1.0.0
GroupContainer@1.5.0
Rectangle@2.3.0
Image@2.2.3
Timer@2.1.0
HtmlViewer@2.1.0
2. Z-Order
Controls appear in the order listed — later = on top. Verify:
- [ ] Background panels (
recPanel,recHeader,recCard) are listed FIRST - [ ] Error border controls are listed IMMEDIATELY BEFORE the field they highlight (so they appear behind it)
- [ ] Overlay panels (edit/add panels) are listed LAST — they cover everything below
- [ ] Gallery row backgrounds are listed FIRST inside gallery Children
3. Property Blocklist — Check Every Control
ModernButton@1.0.0 — do not generate these:
- [ ] FontWeight — not exposed; causes PA2108
- [ ] Color as a workaround for BasePaletteColor — remove and fix the seed colour instead
- [ ] Conditional BasePaletteColor with light/pastel branches — use Classic Button instead
- [ ] Light or pastel BasePaletteColor (anything that reads like a pastel) — pick a darker seed
Toggle@1.1.5 — do not generate:
- [ ] Size (font size) — not exposed; causes PA2108
- [ ] Default for initial state — use Checked
- [ ] .Value to read state — use .Checked
- [ ] Text for label — use Label
ModernCombobox@1.1.0 — do not generate:
- [ ] Placeholder — use InputTextPlaceholder
- [ ] HintText — use InputTextPlaceholder
- [ ] Default for multi-select preselection — use DefaultSelectedItems
ModernTextInput@1.1.0 — do not generate:
- [ ] HintText — use Placeholder
ModernDropdown@1.0.1 — verify:
- [ ] Default is a record {Value: "..."} not a plain string — a plain string causes blank display on load
- [ ] If Items is table-shaped, ItemDisplayText is set explicitly
- [ ] If Default is being seeded from a SharePoint Choice column (e.g. ThisItem.ChoiceField), pass the field directly — it is already the {Value: "..."} record. Adding .Value unwraps it to a plain string, which then fails to match Items' {Value: "..."} row shape with "invalid formula, expected a value compatible with Items." Confirmed in Branch Contact Groups (drpEditThursdayBatch, ThisItem.ThursdayBatch.Value → fix: ThisItem.ThursdayBatch). 2026-07-23.
4. Power Fx Formula Checks
For every formula in the YAML, check:
- [ ] No
\xB7or\uXXXXescape sequences → useChar(183)for middle dot - [ ] No
IsOdd()function → useMod(value, 2) = 1 - [ ] No
SortByColumnson a SharePoint Choice field → useSort(..., Field.Value, SortOrder.Ascending) - [ ] No
"value" in MultiChoiceField→ useCountIf(field, Value = "value") > 0 - [ ] No
Launch(url)withoutLaunchTarget.New→ useLaunch(url, {}, LaunchTarget.New) - [ ] No
ForAll(items As T, {Value: T.Value})for patching → useForAll(items, {Value: Value}) - [ ] No
Text: =bare → any empty text must beText: ="" - [ ] No
%QUALIFIED_DATACARD_FIELD_VALUE%placeholder anywhere — replace with actual expression - [ ] No
ScreenTransition.Back→ useBack()or a valid ScreenTransition enum - [ ] No bare
Ascending/Descending→ useSortOrder.Ascending/SortOrder.Descending - [ ] No
ThisItem.ItemIndexin alternating row colours → useMod(ThisItem.ID, 2)or stable field - [ ] No Notify-first validation pattern → use Set-error-vars-then-If-guard (see
builder-system.mdPhase 7) - [ ]
LookUpby SharePoint ID through a collection: wrap withValue()→LookUp('List', ID = Value(varRow.StoredID)) - [ ] [Value1 collision]
ModernDropdown.Defaultmust never use{Value: expr.Value}→ useWith({_v: Coalesce(expr.Value, "")}, {Value: _v})instead. The{Value: …Value}nesting causes PA to rename the accessor toValue1, breaking the formula. - [ ] [PA2108] No
.Value1on SharePoint Choice fields → always use.Value..Value1is an internal artifact, not the choice string, and will error. - [ ] [Expected Boolean / Incompatible types] Toggle bound to a SharePoint Choice field → use
field.Value = "Yes"forChecked,Visible,If(), andLabel; patch with{Value: "Yes"}/{Value: "No"}. Iffield = truecauses "Incompatible types: Record, Boolean", the column is a Choice, not a Yes/No — switch to.Value = "Yes"throughout.
5. Architecture Checks
- [ ] Screen OnVisible reloads all collections this screen reads
- [ ] If
varViewingForSelfis used:If(IsBlank(varViewingForSelf), Set(varViewingForSelf, true))is at the top of OnVisible - [ ] If a Form control exists on this screen:
ResetForm(frmXxx)is in OnVisible - [ ] Error border vars are reset when opening any edit/add panel
- [ ] Every field read from
varSelectedorvarCoursewas included in theForAllprojection that built the collection, OR is looked up directly from SharePoint in the formula
6. SharePoint Integration
- [ ] All list names with spaces wrapped in single quotes in every formula:
'TT Personnel' - [ ] Choice fields accessed as
.Value:record.Status.Valuenotrecord.Status - [ ] Multi-select Choice patched with no-alias ForAll:
ForAll(cmbControl.SelectedItems, {Value: Value}) - [ ] URL fields are Single line of text (not SharePoint Hyperlink type) — accessed as plain string
- [ ] Person/Group fields accessed via the correct sub-field (check
sharepoint-office365users.md)
7. ModernButton Colour Check
For every ModernButton in the YAML:
- [ ]
BasePaletteColoris dark and saturated — if you can read white text on it, it will work - [ ]
BasePaletteColoris a static value — not a conditional expression - [ ] If the button needs active/inactive states → it must be a Classic Button, not ModernButton
Standard approved seeds:
- Primary action: =RGBA(0,78,66,1) (army dark green)
- Secondary / cancel: =RGBA(120,120,120,1)
- Destructive: =RGBA(163,45,45,1)
8. App.OnStart Separation
- [ ] App.OnStart formulas are NOT embedded in any screen YAML
- [ ] Every variable that screen formulas read is initialised in App.OnStart
- [ ]
varMyEmailis set as the first line of App.OnStart
9. Delivery Readiness
- [ ] All screens are complete — no screen ends with TODO, placeholder, or missing formula
- [ ] Screen count matches what was agreed with the user
- [ ] GitHub Pages site has a page for every screen
- [ ] Index page shows screens in correct paste order
- [ ] Issues tracker URL is known and ready to report
- [ ] Every screen HTML page carries a version and build timestamp — pass
--version vX.Ytopa-yaml-wrapon every output. Re-wrap every screen on every push, even if only one screen changed, so timestamps update uniformly. - [ ]
docs/index.htmlcarries the same version and local build timestamp — inline after the<h1>title. Without this, the user cannot tell whether GitHub Pages has served the latest push when refreshing.
Builder System
App Builder System
Last checked: 2026-06-23
This document defines the conventions, naming rules, and workflow for generating a complete new Power Apps canvas app from scratch. When asked to build a new app, follow this document before writing a single line of YAML.
Phase 0 — Consultation Q&A (Do This First, Always)
When the user requests a new app, do NOT start building immediately. Run a proper consultation phase first.
Step 0a — First Response
When the user describes an app they want: 1. Acknowledge what they've told you. 2. Think through the use case and identify every gap, edge case, and design decision that needs clarifying. 3. Ask all your questions in a single message — grouped by topic, clearly numbered. Do not drip-feed questions one by one. 4. Be thorough. It is better to ask 10 questions now than to build something wrong and need to redesign it later.
The consultation is a proper design session — treat it like a requirements meeting. The user knows the business domain; you know the technical implications. Ask enough questions to design the data model, access rules, workflow, and screens with confidence before touching any code.
Question Topics to Cover (derive specific questions from these)
Purpose and scope: - What does this app need to do, exactly? What is the core task a user performs? - Who uses it and what are their different roles? - Are there any roles that can do things other roles cannot? - How many users roughly?
Workflow — standard user: - Walk me through what a standard user does when they open the app. - What are the key actions they take? (add, edit, view, search, filter, submit) - Is there any concept of "my records" vs "all records"?
Workflow — manager/admin: - What can a manager or admin do that a standard user cannot? - Can managers see or edit other people's records? - Is there any kind of approval or sign-off flow?
Business rules: - Are there any date-driven rules? (expiry, deadlines, renewal intervals, overdue logic) - What does a record look like when it is "complete" vs "incomplete" vs "overdue"? - Are there any status values a record can have? What triggers a status change? - Are there any mandatory fields? (These become the validation rules in the app)
Data relationships: - Are there different categories or types of thing being tracked? (e.g. different course types, asset categories) - Does a person have a line manager relationship? Can managers update on behalf of others? - Are there any lists of reference data that don't change often? (e.g. list of departments, list of roles)
Edge cases: - What happens when someone leaves / is deactivated? - What happens if a record needs to be deleted vs archived? - Are there any records that should be read-only to most users?
Notifications and reporting: - Does anyone need to be notified when something changes, expires, or is submitted? - Does anyone need to export or report on the data?
Branding:
- Is the primary colour the default army dark green (#004e42), or a different colour?
- Any specific app name?
Technical: - Are all users on the same M365 tenant? - Is there an existing SharePoint site to use, or a new one?
What NOT to ask the user
- List names, column names, column types — design these yourself in Phase 1.
- How many lists are needed — derive this from the workflow answers.
- What Choice option strings to use — propose sensible defaults and confirm only if the domain is specialised.
- Screen names or navigation structure — design these yourself in Phase 2.
Step 0b — Follow-Up Questions
After the user answers, review their responses critically. If any answer raises new questions or reveals a gap, ask those as a short follow-up — still in one message.
It is acceptable to do up to 3 rounds of questions if the app is complex. Never build until you are confident you understand every part of the workflow.
Step 0c — Confirm Before Building
When you have enough information to design the complete app, present a brief summary: - App name - Roles and what each can do - Core screens (just names and one-line purpose) - Key business rules
Then end with:
Ready to build? Any final changes before I go ahead?
Wait for the user to say "build" or ask more questions. Do not start Phase 1 until the user explicitly confirms.
Phase 1 — SharePoint List Design (Builder's Responsibility)
Based on the workflow the user described, design all SharePoint lists completely. Present the full design to the user as a setup checklist — column by column — so they can create it in SharePoint without needing to make any decisions.
Output format to the user
For each list, produce a table like this:
List name: AB ListName
| Column name | Type | Options / Notes |
|---|---|---|
| Title | Single line of text | Built-in — rename to meaningful label if needed |
| Status | Choice | Active, Archived |
| Single line of text | Store email in lowercase | |
| ... | ... | ... |
Tell the user: exact column names (they must match in Power Fx), exact type to select in SharePoint, exact Choice option strings with their capitalisation, which columns to mark as Not Required (all of them — enforce required in the app).
Faster alternative: schema-preserving CSV import
Instead of (or alongside) the manual column-by-column table above, SharePoint can create a list's entire column set in one step from a specially-formatted CSV: Site Contents → New List → From CSV (or Excel). This isn't a generic "guess types from data" CSV import — SharePoint's own list-export feature embeds the real column schema as XML inside the file, and honours it on import.
Format, confirmed against a real export from a live tenant list:
- Row 1, single cell: ListSchema= followed by a JSON object {"schemaXmlList":[...]} — the array holds one raw <Field .../> XML string per column (SharePoint's own internal schema-export format, same shape used for Title, Choice, Number, Boolean, Text fields).
- Row 2: the plain column header row, names matching the Name/StaticName attributes in row 1's XML.
- Row 3+: normal data rows (at minimum, one placeholder row — an all-header, zero-data CSV hasn't been confirmed to work with SharePoint's import wizard).
Field XML shapes, one per SharePoint column type (each needs a fresh unique GUID in ID="{...}"):
Text: <Field DisplayName="X" Format="Dropdown" IsModern="TRUE" MaxLength="255" Name="X" Title="X" Type="Text" ID="{guid}" StaticName="X" />
Number: <Field CommaSeparator="TRUE" CustomUnitOnRight="TRUE" DisplayName="X" Format="Dropdown" IsModern="TRUE" Name="X" Percentage="FALSE" Title="X" Type="Number" Unit="None" ID="{guid}" StaticName="X" />
Boolean: <Field DisplayName="X" Format="Dropdown" IsModern="TRUE" Name="X" Title="X" Type="Boolean" ID="{guid}" StaticName="X"><Default>0</Default></Field>
Choice: <Field DisplayName="X" FillInChoice="FALSE|TRUE" Format="Dropdown" IsModern="TRUE" Name="X" Title="X" Type="Choice" ID="{guid}" StaticName="X"><CHOICES><CHOICE>A</CHOICE><CHOICE>B</CHOICE></CHOICES></Field>
Title: <Field ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Type="Text" Name="Title" DisplayName="Title" Required="FALSE" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="Title" FromBaseType="TRUE" MaxLength="255" />
(Title's GUID above is SharePoint's own fixed system GUID for the built-in Title field — reuse it verbatim, don't generate a new one, since Title isn't really a new column.)
Build script pattern: construct the field XML strings, json.dumps({"schemaXmlList": [...]}, separators=(",", ":")) (compact, no spaces — matches the real export byte-for-byte), prepend ListSchema=, then let Python's csv.writer(..., quoting=csv.QUOTE_ALL) handle the CSV-level quote-doubling automatically rather than hand-escaping — two layers of escaping (JSON's \" inside CSV's "") by hand is exactly the kind of thing that silently breaks if typed manually.
Worked example (both list templates, plus the exact Python builder script) is in PhadeDev/library-file-plan-manager's repo at docs/lists/*.csv — copy the script's structure for a new app rather than rebuilding from scratch.
Caveat: this technique was built by reverse-engineering the format from a real tenant export, not independently round-tripped by testing a hand-built file through the import wizard from scratch. It's confirmed working for at least one real case (a hand-built file, LibraryFilePlan, successfully created the list with a Choice column's choices intact via From CSV on 2026-08-12) but flag it to the user as unverified-until-tried for a brand new list shape, and always give the manual column table as a fallback in the same delivery.
List name rules
- Prefix all related lists with the app abbreviation:
TT Personnel,TT Courses, etc. - List names with spaces must be wrapped in single quotes in Power Fx:
'TT Personnel' - Never reference a list without the prefix in formulas.
- Use 2–3 character abbreviation that won't clash with existing lists.
Column type rules
| Intended use | SharePoint column type | Power Fx access |
|---|---|---|
| Short text | Single line of text | record.ColumnName |
| Long text | Multiple lines of text (plain) | record.ColumnName |
| Number | Number | record.ColumnName |
| Date | Date and Time (Date Only) | record.ColumnName, use Text(date, "dd mmm yyyy") |
| Single choice | Choice | record.ColumnName.Value |
| Multi-select choice | Choice (Allow multiple selections) | table of {Value: "..."} records |
| Yes/No | Yes/No | record.ColumnName (boolean) |
| Person/Group | Person or Group | returns a record; use specific sub-fields |
| URL | Single line of text | record.ColumnName — NOT SharePoint Hyperlink type |
| Attachment | Built-in (on SharePoint list) | accessed via Edit Form Attachments card only |
Required field rule
Mark ALL columns as Not Required in SharePoint. Enforce required fields in the app using the Set-error-vars-then-If-guard pattern (see ui-patterns.md). This gives users a clear red-border error instead of a vague network error from SharePoint.
Phase 2 — Variable and Collection Naming
Global variables (Set)
| Prefix | Purpose | Example |
|---|---|---|
var |
Any global variable | varMyEmail, varTab, varEditCourse |
varMe |
Current user's record from the people list | varMe |
varErr |
Validation error flag (boolean) | varErrTitle, varErrURL |
varViewing |
Context for viewing another user's data | varViewingPerson, varViewingForSelf |
varSelected |
Currently selected record for a detail screen | varSelectedCourse, varRecord |
varEdit |
Record being edited in an edit panel | varEditCourse, varEditPerson |
Collections (ClearCollect)
| Prefix | Purpose | Example |
|---|---|---|
col |
Any collection | colCourses, colMyRecords |
colMy |
Current user's records | colMyTraining, colMyRecords |
colView |
Records for the person being viewed | colViewTraining, colViewRecords |
colAll |
All records (admin context) | colAllRecords, colAllPersonnel |
colCompliance |
Computed compliance summary | colCompliance |
Control naming
| Prefix | Control type |
|---|---|
btn |
Button (Classic or Modern) |
lbl |
Label |
txt |
Text input (Modern) |
cmb |
Combo box (Modern) |
drp |
Dropdown (Modern or Classic) |
gal |
Gallery |
rec |
Classic Button used as a panel/background |
ico |
Icon |
tgl |
Toggle (Modern) |
frm |
Form |
img |
Image |
tim |
Timer |
Phase 3 — App.OnStart Template
Every app starts with these:
Set(varMyEmail, Lower(User().Email));
Set(varMe, LookUp('AppName Personnel', Lower(Email) = varMyEmail));
Set(varTab, "DefaultTab");
ClearCollect(colMainList, 'AppName MainList');
Add ClearCollect calls for every list the app needs at startup. Always use Lower() when comparing email addresses.
Phase 4 — Screen Architecture
Standard screens
Every app should have at minimum:
| Screen | Purpose |
|---|---|
scrStart |
Loading / login check / route to correct home |
scrHome |
Main user-facing screen |
scrDetail |
Detail / record view for a selected item |
scrAdmin |
Admin management screen (if admin role exists) |
Add screens for team management, profile pages, archive views, etc. as needed.
Screen naming convention
- Use
scrprefix:scrMyTraining,scrCourseDetail,scrAdminManage - Name by function, not visual layout
Screen OnVisible template
Every screen that shows data from a collection should reload that collection at the top of OnVisible:
ClearCollect(colCourses, 'TT Courses');
ClearCollect(colMyRecords,
Filter('TT TrainingRecords', Lower(PersonEmail) = varMyEmail));
For screens that can show self-view or team-member view, add the initialisation guard:
If(IsBlank(varViewingForSelf), Set(varViewingForSelf, true));
Phase 5 — Control Patterns
Check the component library first
Before hand-building a data table, KPI cards, chart, sidebar, nav menu, breadcrumbs, stepper, dialog, loading state, badge, chips, date picker, file/photo upload, or floating action button, check reference/external/powerappsui/README.md — these already exist as pre-built copy-paste YAML (MIT-licensed, from powerappsui.com) with notes on props/events/behavior per component. Adapt the YAML to the app's naming conventions and colour palette rather than rebuilding the pattern from scratch.
Use Classic Button for
- Panel backgrounds / card backgrounds
- Gallery row backgrounds (alternating colour, status stripe)
- Tab navigation (active/inactive colour states)
- Visual dividers
- Error border highlights
Use Modern Button for
- Actual clickable actions (Save, Add, Archive, Go to course)
- Set
BasePaletteColorto one dark seed and leave it alone — do not fight Fluent 2 - Primary action: app primary colour (default
RGBA(0,78,66,1)) - Secondary / cancel:
RGBA(120,120,120,1) - Destructive:
RGBA(163,45,45,1) - Never set
BasePaletteColorconditionally on a ModernButton — the light state will always render dark - Never add a
Coloroverride to try to fix a badBasePaletteColor— find a darker seed instead - For anything needing conditional colour states (tab nav, active/inactive), use Classic Button instead
Use Modern Text Input for
- Single-line text entry
- Multi-line text entry (set
Type = TextInputType.Multiline) - Search inputs (set
Type = TextInputType.Search)
Use Modern Combo Box for
- Multi-select (default —
SelectMultiple=true) - Single-select searchable (set
SelectMultiple=false) - People picker (bind to
Office365Users.SearchUserV2)
Use Modern Dropdown for
- Fixed single-select lists
- Always set
Default = {Value: "..."}— never a plain string
Use Modern Toggle for
- Boolean flags
- Filter toggles (e.g. "Non-compliant only")
- Read state with
.Checked, not.Value
Use Classic Gallery for
- All lists of records
- Pill badge rows (via WrapCount)
Use Classic Edit Form for
- Any screen that needs SharePoint Attachments
- Date pickers bound to SharePoint date fields
Phase 6 — YAML Generation Rules
Format requirements
- 2-space indent
- CRLF line endings (the
pa-yaml-wraptool handles this) - All formula values prefixed with
= - Multi-line formulas use
|-block scalar - Control version strings must match known versions from this reference pack
Z-order rule
Controls listed LATER in the Children array appear IN FRONT. Background panels must be listed BEFORE the controls they sit behind.
Children order
- Background panels and cards (recPanel, recHeader)
- Gallery controls
- Input controls and labels
- Overlay panels (edit panels, add panels — placed after the controls they cover)
- Error border controls (immediately before the field they highlight — lower z-order)
Wait — error borders must appear BEHIND their field. Since later = in front, error borders must be listed BEFORE the field they highlight.
Correct order for a field with an error border:
Children:
- recErrTitle: # error border — listed first = behind
...
- txtTitle: # field — listed after = in front
...
Known invalid properties (do not generate)
FontWeightonModernButton@1.0.0— causes PA2108SizeonToggle@1.1.5— causes PA2108PlaceholderonModernCombobox— useInputTextPlaceholderHintTexton any modern control — usePlaceholder(ModernTextInput) orInputTextPlaceholder(ModernCombobox)Text: =(bare) — must beText: =""Defaultfor multi-select preselection on ModernCombobox — useDefaultSelectedItemsScreenTransition.Back— useBack()
Audit before pushing
Run:
python3 tools/audit-guide.py path/to/guide.html
rg -n "FontWeight" screens/ScreenName.yaml
rg -n "Toggle.*Size|Size.*Toggle" screens/ScreenName.yaml
Phase 7 — Patch Formula Template
For an Add form (creates new record):
Set(varErrField1, IsBlank(Trim(txtField1.Text)));
Set(varErrField2, CountRows(cmbField2.SelectedItems) = 0);
If(
varErrField1 || varErrField2,
false,
Patch('List Name', Defaults('List Name'),
{
Title: Trim(txtField1.Text),
Field2: ForAll(cmbField2.SelectedItems, {Value: Value}),
Status: {Value: "Active"}
}
);
Set(varErrField1, false);
Set(varErrField2, false);
Notify("Added.", NotificationType.Success);
Reset(txtField1);
Reset(cmbField2);
ClearCollect(colData, 'List Name')
)
For an Edit form (updates existing record):
Set(varErrField1, IsBlank(Trim(txtField1.Text)));
Set(varErrField2, CountRows(cmbField2.SelectedItems) = 0);
If(
varErrField1 || varErrField2,
false,
Patch('List Name', varEditRecord,
{
Title: Trim(txtField1.Text),
Field2: ForAll(cmbField2.SelectedItems, {Value: Value})
}
);
Set(varErrField1, false);
Set(varErrField2, false);
Notify("Saved.", NotificationType.Success);
ClearCollect(colData, 'List Name');
Set(varEditRecord, Blank())
)
Phase 8 — Publishing Workflow
For a new app, always use the per-project repo system — do NOT push screen YAML into the Phaderon/PowerApps guide library repo.
See output-format.md for the exact delivery sequence and project-repo-workflow.md for the full GitHub repo setup procedure.
Summary for a new app:
- Run the YAML validation checklist in
yaml-validation-checklist.mdbefore generating any YAML. - Deliver output in this order:
- SharePoint setup checklist (tables)
- Data connections list
- App.OnStart as a separate code block — NEVER in screen YAML
- GitHub Pages link for screen YAMLs
- Create the per-project repo under
PhadeDev:bash gh repo create PhadeDev/app-slug --description "Power Apps canvas app — App Name" --private --add-readme - Create the
docs/structure and push screens viapa-yaml-wrap:bash pa-yaml-wrap /tmp/scrHome.yaml /var/home/Phaderon/PowerApps-Apps/app-slug/docs/screens/scrHome.html --version v1.0 - Confirm every generated screen page shows the visible payload preview and that it starts
Screens:->scrName:->Properties:. - Build the
docs/index.htmlfrom the template inproject-repo-workflow.md; screen links must include the current version query string, e.g.screens/scrHome.html?v=1.0. - Commit and push to the project repo, enable GitHub Pages from
/docs. - Report: live URL, screen paste order, issues tracker URL, and the exact version stamp to look for.
- Ask user's permission to add a library card to
Phaderon/PowerApps/index.html.
App.OnStart separation rule — non-negotiable:
App.OnStart is ALWAYS delivered as a separate code block. If a formula belongs in App.OnStart, it does NOT appear anywhere in the screen YAML. No exceptions.
Quick Reference: Common Formula Patterns
Get current user
Set(varMyEmail, Lower(User().Email));
Set(varMe, LookUp('AppName Personnel', Lower(Email) = varMyEmail));
Filter gallery with search + type dropdown
SortByColumns(
Filter(
'DataSource',
(IsBlank(txtSearch.Text) || txtSearch.Text in Title) &&
(IsBlank(drpType.Selected.Value) ||
drpType.Selected.Value = "All" ||
StaffType.Value = drpType.Selected.Value)
),
"Title", SortOrder.Ascending
)
Navigate with context variable
Set(varSelectedRecord, ThisItem);
Navigate(scrDetail, ScreenTransition.Cover)
TrainingStatus calculation
If(IsBlank(rec.DateCompleted), "Not Started",
C.RecurrenceMonths = 0, "Complete",
DateAdd(rec.DateCompleted, C.RecurrenceMonths, TimeUnit.Months) < Today(), "Expired",
DateAdd(rec.DateCompleted, C.RecurrenceMonths, TimeUnit.Months) <= DateAdd(Today(), 60, "Days"), "Expiring Soon",
"In Date")
Sort gallery by status priority
Sort(
Sort(source, CourseName, SortOrder.Ascending),
Switch(TrainingStatus,
"Expired", 1,
"Not Started", 2,
"Expiring Soon", 3,
"In Date", 4,
"Complete", 5,
99),
SortOrder.Ascending
)
Open URL in new tab
Launch(urlValue, {}, LaunchTarget.New)
Concat multi-select Choice for display
Concat(record.ApplicableTo, Value, ", ")
Filter by multi-select Choice
CountIf(ApplicableTo, Value = drpFilter.Selected.Value) > 0
Project Repo Workflow
Per-Project GitHub Repo Workflow
Last checked: 2026-08-15
When a new app is agreed upon, create a dedicated GitHub repository under the PhadeDev organisation. This gives the project its own issues tracker and keeps it cleanly separate from the guide library at Phaderon/PowerApps. Hosting for the screen YAML copy pages is Cloudflare Pages, not GitHub Pages — see the "Hosting" section at the top of AGENTS.md for why (GitHub Pages' legacy builder kept failing) and the exact deploy command. The docs/ folder in the repo is still the source of truth and gets committed to git as normal; it's just served from Cloudflare instead of GitHub.
Step 1 — Agree on App Name
Confirm the app name with the user before creating the repo. The name should be:
- Descriptive and short: "Staff Tracker", "Coffee Break Tracker", "Asset Register"
- The repo slug is the kebab-case version: staff-tracker, coffee-break-tracker, asset-register
Step 2 — Create the Repo
gh repo create PhadeDev/APP-SLUG \
--description "Power Apps canvas app — APP FULL NAME" \
--private \
--add-readme
Issues are on by default, nothing to configure there. Then set up the docs/ folder and push to git as normal (this is still real version history, just no longer what serves the live site):
# Create the docs/ folder structure
mkdir -p /var/home/Phaderon/PowerApps-Apps/APP-SLUG/docs/screens
# Create the initial index.html (from the app index template — see below)
# Copy the template and fill in app-specific content
# Initialise git and push
cd /var/home/Phaderon/PowerApps-Apps/APP-SLUG
git init
git remote add origin https://github.com/PhadeDev/APP-SLUG.git
git add .
git commit -m "Initial commit: Power Apps canvas app project"
git push -u origin main
Then create and deploy the Cloudflare Pages project (credentials already sourced via ~/.config/cloudflare/pages.env in ~/.bashrc — no login needed):
source ~/.config/cloudflare/pages.env
npx wrangler pages project create APP-SLUG --production-branch=main
cd /var/home/Phaderon/PowerApps-Apps/APP-SLUG/docs
npx wrangler pages deploy . --project-name=APP-SLUG --branch=main --commit-dirty=true
Pages URL: https://APP-SLUG.pages.dev/ — do NOT enable GitHub Pages for this repo.
Step 3 — Create Screen HTML Pages
For each screen YAML, write the YAML to a temp file, then wrap it with pa-yaml-wrap. Always pass --version — this stamps the version and local build time onto every page so the user can tell at a glance whether the Cloudflare deploy has served the latest push.
pa-yaml-wrap /tmp/scrHome.yaml /var/home/Phaderon/PowerApps-Apps/APP-SLUG/docs/screens/scrHome.html --version v1.0
The tool adds CRLF enforcement, produces a standalone copy-button HTML page, and stamps the bottom-right corner with e.g. v1.0 — Built 23 Jun 2026 11:02 BST using the system local time.
The generated page must also show the visible "Clipboard payload preview" block. For screen YAML, the first three preview lines must be:
Screens:
scrHome:
Properties:
If the preview shows Control: Screen under the screen name, do not paste it and do not push it. SchemaV3 screen instances do not allow a screen-level Control property.
Version convention:
- Start every app at v1.0
- Bump the minor number (v1.1, v1.2) for bug fixes and field-level changes
- Bump the major number (v2.0) for structural redesigns or added screens
- Every push that changes screen content must re-wrap with the new version so the stamp changes
Also stamp docs/index.html with the same version. Add directly below the <h1>:
<h1>APP_FULL_NAME <span style="font-size:0.65em;font-weight:400;color:#666;vertical-align:middle;margin-left:8px;">vX.Y</span></h1>
<p style="font-size:0.75rem;color:#3a3a55;font-family:'Cascadia Code','Consolas',monospace;margin-bottom:4px;">Built DD Mon YYYY HH:MM TZ</p>
Screen links in docs/index.html must include the same version query string to avoid stale browser pages:
<a class="screen-card" href="screens/scrHome.html?v=1.0">
Use date '+%-d %b %Y %H:%M %Z' in the terminal to get the correct local timestamp string to paste in.
Step 4 — Create the Project Index Page
The docs/index.html is the main page for the app, served from Cloudflare Pages. It shows:
- App name and description
- SharePoint setup checklist
- App.OnStart copy block
- Ordered screen cards (with links to the copy pages)
Use the app index template below to generate it. The user navigates to this page first, reads the setup steps, then clicks each screen card to copy the YAML.
App Index HTML Template
Save as docs/index.html and replace all APP_* placeholders:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>APP_FULL_NAME — PowerApps</title>
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Segoe UI', system-ui, sans-serif;
background: #0f0f1a;
color: #e8e8f0;
max-width: 900px;
margin: 0 auto;
padding: 40px 24px 80px;
}
h1 { font-size: 1.8rem; font-weight: 600; color: #c8b8ff; margin-bottom: 8px; }
.subtitle { color: #888; font-size: 0.95rem; margin-bottom: 40px; }
h2 { font-size: 1.2rem; color: #a0c0e0; margin: 40px 0 16px; border-bottom: 1px solid #2a2a3a; padding-bottom: 8px; }
h3 { font-size: 1rem; color: #e8e8f0; margin: 24px 0 8px; }
p { color: #aaa; line-height: 1.6; margin-bottom: 12px; }
table { width: 100%; border-collapse: collapse; font-size: 0.85rem; margin-bottom: 24px; }
th { background: #1a1a2e; color: #c8b8ff; text-align: left; padding: 8px 12px; border: 1px solid #2a2a3a; }
td { padding: 8px 12px; border: 1px solid #2a2a3a; color: #d0d0e0; vertical-align: top; }
tr:nth-child(even) td { background: #131320; }
.code-block { position: relative; margin: 12px 0 24px; }
pre {
background: #1a1a2e;
color: #c8d8f0;
padding: 16px;
border-radius: 8px;
font-family: 'Cascadia Code', 'Consolas', monospace;
font-size: 0.82rem;
line-height: 1.55;
overflow-x: auto;
white-space: pre;
}
.copy-btn {
position: absolute;
top: 8px;
right: 8px;
padding: 4px 12px;
background: #7c4dff;
color: white;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 0.78rem;
transition: background 0.15s;
}
.copy-btn:hover { background: #6a3de8; }
.copy-btn.ok { background: #2a7d4e; }
.screen-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 16px; margin-top: 16px; }
.screen-card {
display: flex;
flex-direction: column;
justify-content: space-between;
background: #1a1a2e;
border: 1px solid #2a2a3a;
border-radius: 12px;
padding: 20px;
text-decoration: none;
color: inherit;
transition: border-color 0.15s, background 0.15s;
}
.screen-card:hover { border-color: #7c4dff; background: #1e1e35; }
.screen-number { font-size: 0.75rem; color: #666; margin-bottom: 8px; }
.screen-name { font-size: 1rem; font-weight: 600; color: #c8b8ff; margin-bottom: 6px; }
.screen-desc { font-size: 0.82rem; color: #888; line-height: 1.4; }
.screen-cta { margin-top: 16px; font-size: 0.82rem; color: #7c4dff; }
.note { background: #1a2a1a; border-left: 3px solid #2a7d4e; padding: 12px 16px; border-radius: 4px; font-size: 0.85rem; color: #aaa; margin: 16px 0; }
.warning { background: #2a1a1a; border-left: 3px solid #7d2a2a; padding: 12px 16px; border-radius: 4px; font-size: 0.85rem; color: #aaa; margin: 16px 0; }
ol { padding-left: 24px; color: #aaa; font-size: 0.9rem; line-height: 2; }
a.back { font-size: 0.82rem; color: #666; text-decoration: none; display: inline-block; margin-bottom: 32px; }
a.back:hover { color: #999; }
</style>
</head>
<body>
<a class="back" href="https://powerapps.pages.dev/">← Guide Library</a>
<h1>APP_FULL_NAME</h1>
<p class="subtitle">APP_DESCRIPTION</p>
<h2>Before You Start</h2>
<ol>
<li>Create the SharePoint lists below (all columns, exact names).</li>
<li>Open Power Apps Studio → New blank canvas app.</li>
<li>Add all data sources listed below (Data panel → Add data).</li>
<li>Set App → OnStart using the code block below.</li>
<li>Create one blank screen per screen in the list, then paste each YAML.</li>
</ol>
<h2>Data Connections</h2>
<p>Add these in the Data panel before pasting any YAML:</p>
APP_DATA_CONNECTIONS
<h2>SharePoint Lists</h2>
APP_SHAREPOINT_TABLES
<div class="warning">Mark every column <strong>Not Required</strong> in SharePoint. Required fields cause network errors — validation is handled in the app.</div>
<h2>App.OnStart</h2>
<p>Paste into <strong>App → OnStart</strong> in Power Apps Studio.</p>
<div class="code-block">
<button class="copy-btn" onclick="copyBlock(this, 'on-start')">Copy</button>
<pre id="on-start">APP_ON_START_FORMULA</pre>
</div>
<h2>Screens</h2>
<p>Paste each screen in order. Create a new blank screen first, then paste.</p>
<div class="screen-grid">
APP_SCREEN_CARDS
</div>
<h2>Issues</h2>
<p>Found a problem? <a href="https://github.com/PhadeDev/APP-SLUG/issues" style="color:#7c4dff">Report it here</a>.</p>
<script>
async function copyBlock(btn, id) {
const text = document.getElementById(id).textContent;
try {
await navigator.clipboard.writeText(text);
btn.textContent = '✓ Copied!';
btn.className = 'copy-btn ok';
setTimeout(() => { btn.textContent = 'Copy'; btn.className = 'copy-btn'; }, 3000);
} catch (e) {
btn.textContent = 'Failed';
}
}
</script>
</body>
</html>
Screen card HTML snippet (repeat per screen):
<a class="screen-card" href="screens/scrXxx.html">
<div>
<div class="screen-number">Screen N</div>
<div class="screen-name">scrXxx</div>
<div class="screen-desc">What this screen does in one sentence.</div>
</div>
<div class="screen-cta">Open and copy →</div>
</a>
SharePoint table HTML snippet (repeat per list):
<h3>List: <code>XX ListName</code></h3>
<table>
<thead><tr><th>Column name</th><th>Type</th><th>Notes</th></tr></thead>
<tbody>
<tr><td>Title</td><td>Single line of text</td><td>Built-in — rename to meaningful label</td></tr>
<tr><td>Status</td><td>Choice</td><td>Options: Active, Archived</td></tr>
</tbody>
</table>
Step 5 — Add Library Card
Add a card to the main PowerApps guide library at /var/home/Phaderon/PowerApps/index.html. Confirm with the user before doing this if the app is still in progress.
<a class="guide-card" href="https://APP-SLUG.pages.dev/">
<div class="guide-top">
<span class="guide-kicker">Canvas app</span>
<h2>APP FULL NAME</h2>
<p>SHORT_APP_DESCRIPTION</p>
</div>
<div>
<div class="guide-meta">
<span class="pill">N screens</span>
<span class="pill">SharePoint</span>
<span class="pill">YYYY-MM-DD</span>
</div>
<span class="open-row">Open app guide <span aria-hidden="true">→</span></span>
</div>
</a>
Step 6 — Commit and Push
cd /var/home/Phaderon/PowerApps-Apps/APP-SLUG
git add docs/
git commit -m "Add all screens and index page"
git push origin main
Deploys are near-instant (wrangler pages deploy, no build step) — verify the live URL right after the command returns.
App Directory
All per-project repos are cloned or initialised at:
/var/home/Phaderon/PowerApps-Apps/
APP-SLUG/
docs/
index.html
screens/
scrHome.html
scrDetail.html
...
The PowerApps-Apps/ directory is a sibling of PowerApps/ (the guide library repo).
Quick Reference
| What | Where |
|---|---|
| Guide library repo | Phaderon/PowerApps at /var/home/Phaderon/PowerApps/ |
| Guide library Pages | https://powerapps.pages.dev/ |
| New app repos | PhadeDev/APP-SLUG at /var/home/Phaderon/PowerApps-Apps/APP-SLUG/ |
| New app Pages | https://APP-SLUG.pages.dev/ |
| Issues | https://github.com/PhadeDev/APP-SLUG/issues |
Output Format
App Delivery Output Format
Last checked: 2026-06-23
This document defines the exact format for delivering a complete Power Apps app build. Follow this order every time. Never mix App.OnStart into screen YAML.
Delivery Order
When delivering a completed app, present output in this exact sequence:
1. SharePoint Setup Checklist
A table per list showing every column the user needs to create. They copy this directly to SharePoint. See builder-system.md Phase 1 for the table format.
Where practical, also offer the schema-preserving CSV import as the faster path (builder-system.md Phase 1, "Faster alternative") — one file, one upload, every column created with the right type in one step instead of manual column-by-column setup. Keep the manual table as the documented fallback either way.
Present this first so the user can create all lists before opening Power Apps Studio.
2. Data Connections
List the data connections the user must add in Power Apps Studio before pasting any YAML:
Add these data sources in Power Apps Studio (Data panel → Add data):
- 'XX ListName' (SharePoint → your site → XX ListName)
- 'XX OtherList' (SharePoint → your site → XX OtherList)
If Office365Users is needed:
- Office365Users (Office 365 Users connector)
3. App.OnStart — Separate Code Block
Never embed App.OnStart formulas inside screen YAML. Always deliver it as a standalone Power Fx code block.
Example format:
## App.OnStart
Paste this into App → OnStart in the Power Apps Studio:
```powerfx
Set(varMyEmail, Lower(User().Email));
Set(varMe, LookUp('XX Personnel', Lower(Email) = varMyEmail));
Set(varTab, "Home");
ClearCollect(colPersonnel, 'XX Personnel')
The user pastes this into the App object's OnStart property, not into any screen.
### 4. Cloudflare Pages — Screen YAML
Hosted on Cloudflare Pages, not GitHub Pages — see the "Hosting" section at the top of
`AGENTS.md` before doing this for the first time. After creating the project (see
`project-repo-workflow.md`) and deploying with `wrangler pages deploy`, report:
Your app screens are ready at: https://APP-NAME.pages.dev/
Paste order: 1. Open Power Apps Studio → New screen (blank) for each screen below 2. Open each link, click "Copy YAML", then paste into the new screen
Screen 1 — scrHome: https://APP-NAME.pages.dev/screens/scrHome.html Screen 2 — scrDetail: https://APP-NAME.pages.dev/screens/scrDetail.html Screen 3 — scrAdmin: https://APP-NAME.pages.dev/screens/scrAdmin.html
Screens are pasted one at a time. Each screen replaces the blank screen content.
### 5. Issues Tracker
Report the issues URL:
Report any problems here: https://github.com/PhadeDev/APP-NAME/issues
---
## App.OnStart Rules
- App.OnStart is ALWAYS a separate code block — never part of a screen's YAML
- App.OnStart must initialise every variable every screen may read
- App.OnStart loads initial collections that all screens share
- Screen OnVisible reloads screen-specific collections (see `builder-system.md` Phase 4)
- Screens must never depend on a variable that App.OnStart does not set
### Variables that must always be in App.OnStart
```powerfx
Set(varMyEmail, Lower(User().Email));
This is the identity anchor used by every filter, every permission check, every context load. It must come first.
Collections that go in App.OnStart (load once)
- Reference lists that never change mid-session:
colCourses,colPersonnel,colCategories - These are static reference tables — not the user's live data
Collections that go in screen OnVisible (reload each visit)
- Anything the user can edit:
colMyRecords,colAllRecords, filtered lists - Rule: if the user can Patch into it, reload it in OnVisible
Non-Screen Code Blocks
Some formulas belong to specific controls rather than the screen or app, but are too long to embed clearly in YAML. If a formula is over 8 lines, consider delivering it as a separate labelled code block alongside the YAML:
### Formula: galHome → Items
Paste into the gallery's Items property:
```powerfx
SortByColumns(
Filter( ...
```
Always make clear: control name, property name, and that this replaces the entire property value.
What Never Goes in Screen YAML
App.OnStartformulas- Connection references or connector calls that belong at app level
- Variable initialisation that applies to all screens
%QUALIFIED_DATACARD_FIELD_VALUE%or any template placeholder — these are bugs, not YAML
Final Delivery Checklist
Before reporting "done" to the user, verify:
- [ ] SharePoint checklist is complete (all lists, all columns, all types, all Choice options)
- [ ] Data connections listed (every SharePoint list, any connectors)
- [ ] App.OnStart is a separate code block, not in any screen YAML
- [ ] Each screen YAML has a copy-button page on the project's Cloudflare Pages site, and it's actually been deployed with
wrangler pages deploy(not just committed to git) - [ ] Cloudflare Pages index shows all screens in paste order
- [ ] Issues tracker URL reported
- [ ] Library card added to
Phaderon/PowerAppsindex.html (or confirm with user first)
Future Guide Template
Future Guide Template
Last checked: 2026-06-20
Use this structure for new app guides.
Folder
new-app-guide/
index.html
Required Guide Sections
- Version panel
- Current version.
- Last checked date.
-
Known tenant/editor assumptions.
-
Overview
- What the app does.
- Who uses it.
-
What problem it solves.
-
Data model
- SharePoint lists or Dataverse tables.
- Required columns.
-
Column types and exact internal/display names where known.
-
App setup
- Canvas app type.
- Data connections.
- Theme/colors.
-
App-level formulas.
-
Screens
- Purpose.
- Controls table.
- Formulas.
-
Validation notes.
-
Critical technical notes
- Control/property traps.
- Connector casing traps.
-
SharePoint field-shape traps.
-
Final audit checklist
- Run
python3 tools/audit-guide.py guide-folder/index.html. - Run
git diff --check. - Browser preview.
- Responsive check.
- Copy button check.
Control Table Columns
Use this table shape:
<table>
<thead>
<tr>
<th>Control</th>
<th>Type</th>
<th>Key properties</th>
</tr>
</thead>
<tbody>
<tr>
<td>txtExample</td>
<td>Text input (modern)</td>
<td>X=32,Y=120,W=400,H=40, Placeholder=<code>"Enter text"</code>, Text: read with <code>txtExample.Text</code></td>
</tr>
</tbody>
</table>
Rules:
- Never omit modern/classic from control type where both families exist.
- Do not write long inline paragraphs for controls when a table is clearer.
- Use code tags for formulas, enum values, and exact strings.
- If a property is unverified, do not include it as an instruction.
Landing Page Card Template
<a class="guide-card" href="new-guide/">
<div class="guide-top">
<span class="guide-kicker">Draft</span>
<h2>New Guide Name</h2>
<p>Short app purpose, user group, and data source summary.</p>
</div>
<div>
<div class="guide-meta">
<span class="pill">Canvas app</span>
<span class="pill">SharePoint lists</span>
<span class="pill">Reference checked</span>
</div>
<span class="open-row">Open guide <span aria-hidden="true">→</span></span>
</div>
</a>
Reference Pack README
Power Apps Reference Pack
Last checked: 2026-06-20
Purpose: reusable, source-linked guidance for building future Power Apps guide pages with the same visual standard as the Training Tracker guide, without guessing control properties or formula patterns.
This is not a copied mirror of Microsoft Learn. It is a practical local reference pack built from:
- Microsoft Learn source pages linked in each reference file.
- Real corrections found while building the Training Tracker guide.
- Local audit rules in
../tools/audit-guide.py.
Files
powerapps-bible.md- entry point for the local Microsoft docs mirror, search index, curated quirks, and audit workflow.real-build-quirks.md- live Power Apps editor fixes discovered while building Training Tracker.verified-control-reference.md- modern/classic controls currently used by the guide style.powerapps-control-defaults.md- lab-derived fresh-control serialized defaults from the user's Power Apps editor.powerfx-patterns.md- formula patterns, source links, and traps.sharepoint-office365users.md- SharePoint field-shape and Office365Users connector notes.guide-authoring-rules.md- required workflow for future guide creation.future-guide-template.md- guide structure and landing-page card pattern.known-bad-patterns.md- recurring mistakes to block before publishing.external/powerappsui/- pre-built copy-paste component YAML from powerappsui.com (MIT-licensed open-source Power Apps component library), plus original condensed notes per component. Seeexternal/powerappsui/README.mdfor the full component index (data table, KPI cards, charts, sidebar, stepper, dialog, breadcrumbs, etc.). Check here before hand-building a UI pattern one of these components already covers.
Companion Power Automate Pack
Power Automate flow guidance lives separately at ../power-automate/.
Use that pack for:
- Power Apps (V2) trigger schemas and input order.
- Flow designer copy/paste payloads.
- SharePoint/Outlook connector action templates.
Respond to a PowerApp or flowoutput patterns.- Run-only and connection-reference behavior.
Keep Power Apps screen/control/YAML rules in this reference pack, and flow/action/trigger rules in the Power Automate pack. When an app calls a flow, update both sides deliberately.
Rule
If a future guide needs a control, connector, or formula pattern that is not in this pack, verify it from Microsoft Learn or live Power Apps behavior first. Add the result here before using it in the guide.
Use powerapps-control-defaults.md before writing long property lists. Do not ask the builder to change properties that are already fresh-control defaults unless the row labels them as leave default or default/safety check.
Local Microsoft Docs Mirror
Use:
tools/update-msdocs.sh
python3 tools/index-msdocs.py --rebuild
python3 tools/index-msdocs.py "Combo box ItemDisplayText"
The mirror lives in .sources/ and the SQLite index lives in .cache/; both are intentionally gitignored and not published.