What it does
Modern themes are style sets that drive colour, typography, borders and shadows across a canvas app from one place. You pick a seed colour and the platform generates a sixteen-slot palette from it; the active theme is exposed to formulas as App.Theme.
Key facts
- Themes come with modern controls. They're behind the same Modern controls and themes app setting, and turning it on removes access to the classic theme picker unless you also enable Keep classic themes under Retired.
- A custom theme is defined by a primary (seed) colour, a font, a hue torsion value, a vibrancy value, and optional per-slot colour overrides. Torsion and vibrancy both run from -100 to 100.
- By default the sixteen-slot palette is generated with accessibility in mind. The Lock primary color toggle (preview) puts your exact seed colour in the middle slot instead and generates lighter and darker steps around it — Microsoft states the result might not meet contrast requirements.
- Themes are copied and pasted as YAML. The structure is
Font,BasePaletteColor,HueTorsion,Vibrancyand an optionalColorOverridesblock with named slots likeLighter30andDarker10. - Built-in themes can't be edited or deleted. Custom ones can.
- Applying a theme sets
App.Theme. In formulas you can referenceApp.Theme.Colors.Primaryand similar, including on classic controls, to style them from the active theme by hand. Fontis a CSS font-family string, so the font has to actually be available and licensed wherever the app runs.
When to use / skip
Use a theme on anything that will exist for more than a quarter. The alternative is a hundred hardcoded hex values across screens, which is what you'll find in almost every inherited app and which nobody ever wants to change afterwards. Where themes fall short is estate-wide brand governance: there's no central theme library, no managed theme artefact, no push mechanism. If the client expects "update the brand once, all forty apps change", say plainly that the product doesn't do that yet.
Configuration decisions
- Whether you build one house theme from the client's primary brand colour, or one per business area.
- Whether to lock the primary colour for exact brand fidelity and take the contrast risk, or let the palette be generated for accessibility and accept a colour that's slightly off-brand.
- Which colour slots you override by hand versus letting torsion and vibrancy do the work — fewer overrides is easier to maintain.
- Where the canonical theme YAML lives: a repo, the solution documentation, or somewhere it will be lost.
- Whether classic controls in existing apps get styled from
App.Themein formulas, or left alone.
Gotchas
- Distribution is copy-paste YAML. Every app holds its own copy, so a brand change means opening every app. Treat the YAML file as the source of truth and the apps as copies.
- Delete a custom theme and any Power Fx formula referencing it needs fixing by hand. Nothing tells you which formulas those are.
- Applying a modern theme when classic controls are present writes formulas onto those controls' properties. The result won't match the modern controls exactly, because classic controls aren't Fluent v9.
- Fonts specified in a pasted theme may not exist in the target tenant or on the user's device. Test the theme where it will actually run, not just in Studio.
- Paste a theme whose name already exists and it gets renamed automatically rather than replacing the original. You end up with "Contoso Brand 1", "Contoso Brand 2" and no idea which is live.
Consultant notes
- Get the brand hex values, the font and any accessibility commitment out of the client's marketing team before you build anything. Reworking a theme after screens are laid out is fine; reworking it after sign-off is a conversation about scope.
- Manage the theme YAML in source control from day one. It's a small text file and it's the only artefact that makes an estate-wide brand refresh survivable.
- Push back gently on exact brand-colour matching. The generated palette exists to keep contrast usable, and locking the seed colour trades that away.
- If the client has a Microsoft 365 design language already, start from the closest built-in theme rather than from their print brand guide.
Worth revisiting if Microsoft ships a shared or solution-aware theme artefact, or when Lock primary color leaves preview.