Skip to content

[dev-v5] Initial work to add a Theme API (and a Theme Designer to the demo)#4602

Open
vnbaaij wants to merge 18 commits intodev-v5from
users/vnbaaij/dev-v5/theme-enhancement
Open

[dev-v5] Initial work to add a Theme API (and a Theme Designer to the demo)#4602
vnbaaij wants to merge 18 commits intodev-v5from
users/vnbaaij/dev-v5/theme-enhancement

Conversation

@vnbaaij
Copy link
Collaborator

@vnbaaij vnbaaij commented Mar 6, 2026

  • Add IThemeService, ThemeService and corresponding TS code
  • Add color ramp calculation code (copied from React theme designer)
  • Add Theme Designer (with ramp and theme preview)
  • Add Theme docs

ToDo:

  • Add Unit Tests

Theme Designer:
image

We offer two ways to set a custom brand color in your Blazor application:

Set the Brand color declaratively

You can add a data-theme attribute to the <body> tag in your HTML and set its value to 'light', 'dark', or 'system' to specify the theme mode. This allows
you to configure the theme mode.

You can add a data-theme-color attribute to the <body> tag in your HTML and set its value to a valid hex color code (e.g., #FF0000). The library will
automatically detect this attribute, generate a color ramp based on the provided color, and apply it to the application.

The declarative data-theme-* attributes are treated as developer-provided overrides and are not persisted to localStorage.

To have acces to all variables that are available to customize a theme, you can use the methods described below.

Set the Brand color with code

A full API is available for configuring the theme programmatically in your Blazor application. This allows you to dynamically change the theme based on user
interactions or other conditions in your application.

The following methods are available for setting the brand color programmatically:

Name Description
CreateCustomThemeAsync(ThemeSettings settings) Creates a custom Theme based on the specified settings. The returned theme can be modified by the caller before it is applied.
SetThemeAsync(Theme theme) Applies a fully custom Theme (for example created with CreateCustomThemeAsync). This applies the theme without generating it from brand settings.
SetThemeAsync(ThemeType type) Sets a built-in theme by type (Default or Teams) using the current effective mode (light or dark).
SetThemeAsync(ThemeType type, ThemeMode mode) Sets a built-in theme by type (Default or Teams) and a specific mode (Light, Dark, or System).
SetThemeAsync(string color, bool isExact = false) Sets a custom brand theme from a hex color (e.g. #FF0000). isExact controls whether the exact provided color is used for the brand background. Uses ThemeMode.System.
SetThemeAsync(ThemeSettings settings) Sets a custom brand theme using full settings control: brand color, hue torsion (-0.5 to 0.5), vibrancy (-0.5 to 0.5), mode, and exact color behavior.
SetLightThemeAsync() Convenience wrapper that sets the Default theme to Light mode.
SetDarkThemeAsync() Convenience wrapper that sets the Default theme to Dark mode.
SetSystemThemeAsync() Convenience wrapper that sets the Default theme to System mode.
SetTeamsLightThemeAsync() Convenience wrapper that sets the Teams theme to Light mode.
SetTeamsDarkThemeAsync() Convenience wrapper that sets the Teams theme to Dark mode.
SetTeamsSystemThemeAsync() Convenience wrapper that sets the Teams theme to System mode.
ClearThemeSettingsAsync() Removes any stored theme configuration from localStorage and resets the theme to the default settings.
IsSystemDarkAsync() Returns whether the user's system preference is set to dark mode.
IsDarkModeAsync() Returns whether the current effective theme mode is dark mode.
GetColorRampAsync() Returns the current cached color ramp as a dictionary of ramp number to color value, or null if no custom ramp has been generated yet.
GetColorRampFromSettingsAsync(ThemeSettings settings) Generates a new color ramp based on the provided settings. Validates inputs and always recalculates the ramp without using the internal cache. Returns null for invalid inputs.
SwitchDirectionAsync() Switches the document direction between left-to-right (LTR) and right-to-left (RTL).
SwitchThemeAsync() Toggles between light and dark mode. Returns true if the new effective theme is dark.
SetThemeToElementAsync(ElementReference element, ThemeSettings settings) Applies a custom brand theme (from settings) to a specific element only; does not change the global theme.

The SetThemeAsync result is cached in localStorage so that the theme configuration can be persisted across sessions and restored on subsequent visits
to the application. The only exception to this is when using the SetThemeAsync(Theme theme) overload, which applies a
fully custom theme without caching it.

- Add color ramp calculation code (copied from React theme designer)
- Add initial ThemeDesigner
- Add Theme docs
@vnbaaij vnbaaij added this to the v5.0-RC2 milestone Mar 6, 2026
@vnbaaij vnbaaij requested a review from dvoituron as a code owner March 6, 2026 16:25
Copilot AI review requested due to automatic review settings March 6, 2026 16:25
@github-actions
Copy link

github-actions bot commented Mar 6, 2026

✅ All tests passed successfully

Details on your Workflow / Core Tests page.

@github-actions
Copy link

github-actions bot commented Mar 6, 2026

Summary - Unit Tests Code Coverage

Summary
Generated on: 03/15/2026 - 12:56:35
Coverage date: 03/15/2026 - 12:56:05
Parser: Cobertura
Assemblies: 1
Classes: 234
Files: 321
Line coverage: 98.1% (9522 of 9701)
Covered lines: 9522
Uncovered lines: 179
Coverable lines: 9701
Total lines: 34634
Branch coverage: 92.1% (4629 of 5022)
Covered branches: 4629
Total branches: 5022
Method coverage: Feature is only available for sponsors
Tag: 5653_23110768432

Coverage

Microsoft.FluentUI.AspNetCore.Components - 98.1%
Name Line Branch
Microsoft.FluentUI.AspNetCore.Components 98.1% 92.1%
Microsoft.FluentUI.AspNetCore.Components.AccordionItemEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.AdditionalAttributesExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.CachedServices 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Calendar.CalendarExtended 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Calendar.CalendarTitles`1 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Calendar.CalendarTValue 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ColumnBase`1 97.2% 90.2%
Microsoft.FluentUI.AspNetCore.Components.ColumnKeyGridSort`1 94.4% 75%
Microsoft.FluentUI.AspNetCore.Components.ColumnOptionsUISettings 100%
Microsoft.FluentUI.AspNetCore.Components.ColumnResizeOptions`1 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ColumnResizeUISettings 100%
Microsoft.FluentUI.AspNetCore.Components.ColumnSortUISettings 100%
Microsoft.FluentUI.AspNetCore.Components.CustomEmoji 100% 100%
Microsoft.FluentUI.AspNetCore.Components.CustomIcon 100%
Microsoft.FluentUI.AspNetCore.Components.DataGrid.Infrastructure.Defer 100%
Microsoft.FluentUI.AspNetCore.Components.DataGrid.Infrastructure.InternalGr
idContext`1
100% 100%
Microsoft.FluentUI.AspNetCore.Components.DataGridSortEventArgs`1 100%
Microsoft.FluentUI.AspNetCore.Components.DateTimeProvider 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DateTimeProviderContext 100% 92.8%
Microsoft.FluentUI.AspNetCore.Components.DefaultStyles 100%
Microsoft.FluentUI.AspNetCore.Components.Dialog.MessageBox.FluentMessageBox 100% 75%
Microsoft.FluentUI.AspNetCore.Components.DialogEventArgs 100% 92.8%
Microsoft.FluentUI.AspNetCore.Components.DialogInstance 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogOptions 100%
Microsoft.FluentUI.AspNetCore.Components.DialogOptionsFooter 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogOptionsFooterAction 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogOptionsHeader 100%
Microsoft.FluentUI.AspNetCore.Components.DialogResult 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogResult`1 100%
Microsoft.FluentUI.AspNetCore.Components.DialogService 100% 82.3%
Microsoft.FluentUI.AspNetCore.Components.DialogToggleEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.DropdownEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.Emoji 100% 100%
Microsoft.FluentUI.AspNetCore.Components.EmojiCompress 100% 100%
Microsoft.FluentUI.AspNetCore.Components.EmojiExtensions 100% 50%
Microsoft.FluentUI.AspNetCore.Components.EmojiInfo 100%
Microsoft.FluentUI.AspNetCore.Components.Extensions.DateTimeExtensions 98.4% 90.3%
Microsoft.FluentUI.AspNetCore.Components.Extensions.DisplayAttributeExtensi
ons
100% 100%
Microsoft.FluentUI.AspNetCore.Components.Extensions.EnumExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Extensions.FieldSizeExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Extensions.FluentInputExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FileSizeConverter 100%
Microsoft.FluentUI.AspNetCore.Components.FluentAccordion 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentAccordionItem 100% 95.8%
Microsoft.FluentUI.AspNetCore.Components.FluentAnchorButton 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentAppBar 97.4% 97.6%
Microsoft.FluentUI.AspNetCore.Components.FluentAppBarItem 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentAvatar 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentBadge 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentButton 98.4% 90.6%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendar`1 97.4% 86.8%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendarBase`1 100% 94.4%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendarDay`1 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendarMonth`1 100% 92.8%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendarYear`1 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCard 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCheckbox 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCombobox`2 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentComponentBase 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCompoundButton 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCounterBadge 100% 94.4%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGrid`1 92.5% 88.1%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGridCell`1 100% 95.6%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGridRow`1 98.5% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDatePicker`1 97.4% 85.2%
Microsoft.FluentUI.AspNetCore.Components.FluentDialog 97.5% 89.3%
Microsoft.FluentUI.AspNetCore.Components.FluentDialogBody 100% 91.6%
Microsoft.FluentUI.AspNetCore.Components.FluentDialogInstance 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDialogProvider 100% 73.9%
Microsoft.FluentUI.AspNetCore.Components.FluentDivider 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDragContainer`1 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDragEventArgs`1 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDropZone`1 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentEmoji`1 100% 95%
Microsoft.FluentUI.AspNetCore.Components.FluentErrorBoundary 95.3% 93.7%
Microsoft.FluentUI.AspNetCore.Components.FluentField 100% 96.5%
Microsoft.FluentUI.AspNetCore.Components.FluentFieldCondition 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentFieldConditionItem 100%
Microsoft.FluentUI.AspNetCore.Components.FluentFieldConditionOptions 100%
Microsoft.FluentUI.AspNetCore.Components.FluentFieldExtensions 100%
Microsoft.FluentUI.AspNetCore.Components.FluentFieldParameterSelector 100% 98.7%
Microsoft.FluentUI.AspNetCore.Components.FluentGrid 100% 90%
Microsoft.FluentUI.AspNetCore.Components.FluentGridItem 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentHighlighter 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentIcon`1 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentImage 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentInputBase`1 93.8% 50%
Microsoft.FluentUI.AspNetCore.Components.FluentInputFile 100% 93.3%
Microsoft.FluentUI.AspNetCore.Components.FluentInputFileBuffer 100%
Microsoft.FluentUI.AspNetCore.Components.FluentInputFileErrorEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentInputFileEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentInputImmediateBase`1 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentJSModule 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentKeyCode 100% 92.8%
Microsoft.FluentUI.AspNetCore.Components.FluentKeyCodeEventArgs 100% 75%
Microsoft.FluentUI.AspNetCore.Components.FluentKeyCodeProvider 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentKeyPressEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentLabel 100%
Microsoft.FluentUI.AspNetCore.Components.FluentLayout 100% 88.8%
Microsoft.FluentUI.AspNetCore.Components.FluentLayoutHamburger 100% 96.6%
Microsoft.FluentUI.AspNetCore.Components.FluentLayoutItem 100% 91%
Microsoft.FluentUI.AspNetCore.Components.FluentLink 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentListBase`2 97.7% 89.1%
Microsoft.FluentUI.AspNetCore.Components.FluentListbox`2 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentLocalizerExtensions 100%
Microsoft.FluentUI.AspNetCore.Components.FluentLocalizerInternal 100%
Microsoft.FluentUI.AspNetCore.Components.FluentMenu 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentMenuButton 100% 71.4%
Microsoft.FluentUI.AspNetCore.Components.FluentMenuItem 100% 90.4%
Microsoft.FluentUI.AspNetCore.Components.FluentMenuList 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentMessageBar 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentMultiSplitter 100% 93.4%
Microsoft.FluentUI.AspNetCore.Components.FluentMultiSplitterEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentMultiSplitterPane 100% 87.5%
Microsoft.FluentUI.AspNetCore.Components.FluentMultiSplitterResizeEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentNav 100% 95.4%
Microsoft.FluentUI.AspNetCore.Components.FluentNavBase 100%
Microsoft.FluentUI.AspNetCore.Components.FluentNavCategory 97.8% 92.1%
Microsoft.FluentUI.AspNetCore.Components.FluentNavItem 100% 89.7%
Microsoft.FluentUI.AspNetCore.Components.FluentNavSectionHeader 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentOption`1 96% 92.8%
Microsoft.FluentUI.AspNetCore.Components.FluentOptionString 100%
Microsoft.FluentUI.AspNetCore.Components.FluentOverflow 100% 95.8%
Microsoft.FluentUI.AspNetCore.Components.FluentOverflowItem 100% 80%
Microsoft.FluentUI.AspNetCore.Components.FluentOverlay 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentPaginator 100% 94.4%
Microsoft.FluentUI.AspNetCore.Components.FluentPopover 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentPresenceBadge 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentProgress 100%
Microsoft.FluentUI.AspNetCore.Components.FluentProgressBar 100% 87.5%
Microsoft.FluentUI.AspNetCore.Components.FluentProgressRing 100%
Microsoft.FluentUI.AspNetCore.Components.FluentProviders 100%
Microsoft.FluentUI.AspNetCore.Components.FluentPullToRefresh 100% 96.7%
Microsoft.FluentUI.AspNetCore.Components.FluentRadio`1 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentRadioGroup`1 100% 88.8%
Microsoft.FluentUI.AspNetCore.Components.FluentRatingDisplay 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSelect`2 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentServiceBase`1 100%
Microsoft.FluentUI.AspNetCore.Components.FluentServiceProviderException`1 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSkeleton 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSlider`1 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSortableList`1 95.8% 92.3%
Microsoft.FluentUI.AspNetCore.Components.FluentSortableListEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSpacer 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSpinner 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSplitButton 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentStack 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentStatus 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSwitch 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentTab 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentTabs 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentText 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentTextArea 100% 70%
Microsoft.FluentUI.AspNetCore.Components.FluentTextInput 100% 85%
Microsoft.FluentUI.AspNetCore.Components.FluentTimePicker`1 100% 81.1%
Microsoft.FluentUI.AspNetCore.Components.FluentToast 100% 92.8%
Microsoft.FluentUI.AspNetCore.Components.FluentToastInstance 100%
Microsoft.FluentUI.AspNetCore.Components.FluentToastProvider 100% 80%
Microsoft.FluentUI.AspNetCore.Components.FluentToggleButton 100% 91.6%
Microsoft.FluentUI.AspNetCore.Components.FluentTooltip 100% 95%
Microsoft.FluentUI.AspNetCore.Components.FluentTooltipProvider 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentTreeItem 100% 95.3%
Microsoft.FluentUI.AspNetCore.Components.FluentTreeView 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentValidationSummary 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FreeOptionOutput 100%
Microsoft.FluentUI.AspNetCore.Components.GridItemsProviderRequest`1 100% 100%
Microsoft.FluentUI.AspNetCore.Components.GridItemsProviderResult 100%
Microsoft.FluentUI.AspNetCore.Components.GridItemsProviderResult`1 100%
Microsoft.FluentUI.AspNetCore.Components.GridSort`1 100% 100%
Microsoft.FluentUI.AspNetCore.Components.HierarchicalGridItem`2 100% 100%
Microsoft.FluentUI.AspNetCore.Components.HierarchicalGridUtilities 100% 100%
Microsoft.FluentUI.AspNetCore.Components.HierarchicalSelectColumn`1 98.8% 95.5%
Microsoft.FluentUI.AspNetCore.Components.HighlighterSplitter 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Icon 100% 95%
Microsoft.FluentUI.AspNetCore.Components.IconFromImage 100%
Microsoft.FluentUI.AspNetCore.Components.IconInfo 100%
Microsoft.FluentUI.AspNetCore.Components.IconsExtensions 100% 50%
Microsoft.FluentUI.AspNetCore.Components.IFluentComponentChangeAfterKeyPres
s
100% 100%
Microsoft.FluentUI.AspNetCore.Components.IFluentLocalizer 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Infrastructure.EventCallbackSubscr
ibable`1
100% 100%
Microsoft.FluentUI.AspNetCore.Components.Infrastructure.EventCallbackSubscr
iber`1
100% 87.5%
Microsoft.FluentUI.AspNetCore.Components.InputFileInstance 100% 100%
Microsoft.FluentUI.AspNetCore.Components.InputFileOptions 100%
Microsoft.FluentUI.AspNetCore.Components.InternalAppBarContext 100% 100%
Microsoft.FluentUI.AspNetCore.Components.InternalListContext`1 100%
Microsoft.FluentUI.AspNetCore.Components.KeyCodeService 100% 85.7%
Microsoft.FluentUI.AspNetCore.Components.KeyPress 100%
Microsoft.FluentUI.AspNetCore.Components.LayoutHamburgerEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.LibraryTooltipOptions 100%
Microsoft.FluentUI.AspNetCore.Components.Localization.LanguageResource 100% 100%
Microsoft.FluentUI.AspNetCore.Components.MarkupSanitizedOptions 100%
Microsoft.FluentUI.AspNetCore.Components.MenuItemEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.MessageBoxOptions 100%
Microsoft.FluentUI.AspNetCore.Components.Migration.AppearanceExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Migration.FluentInputAppearanceExt
ensions
100% 100%
Microsoft.FluentUI.AspNetCore.Components.Migration.TooltipPositionExtension 100% 100%
Microsoft.FluentUI.AspNetCore.Components.PaginationState 100% 81.2%
Microsoft.FluentUI.AspNetCore.Components.ProgressFileDetails 100%
Microsoft.FluentUI.AspNetCore.Components.PropertyColumn`2 100% 81.8%
Microsoft.FluentUI.AspNetCore.Components.RadioEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.RangeOfDates 100% 100%
Microsoft.FluentUI.AspNetCore.Components.SelectAllTemplateArgs 100%
Microsoft.FluentUI.AspNetCore.Components.SelectColumn`1 94.3% 89.7%
Microsoft.FluentUI.AspNetCore.Components.ServiceProviderExtensions 100%
Microsoft.FluentUI.AspNetCore.Components.SortedProperty 100%
Microsoft.FluentUI.AspNetCore.Components.SpacingExtensions 100% 97.2%
Microsoft.FluentUI.AspNetCore.Components.TabChangeEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.TemplateColumn`1 100% 25%
Microsoft.FluentUI.AspNetCore.Components.Theme 100% 80%
Microsoft.FluentUI.AspNetCore.Components.ThemeExtensions 94.7% 87.5%
Microsoft.FluentUI.AspNetCore.Components.ThemeService 0% 0%
Microsoft.FluentUI.AspNetCore.Components.ThemeSettings 0%
Microsoft.FluentUI.AspNetCore.Components.ToastEventArgs 100% 92.8%
Microsoft.FluentUI.AspNetCore.Components.ToastInstance 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ToastOptions 100%
Microsoft.FluentUI.AspNetCore.Components.ToastResult 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ToastResult`1 100%
Microsoft.FluentUI.AspNetCore.Components.ToastService 96.5% 67.8%
Microsoft.FluentUI.AspNetCore.Components.TooltipEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.TotalItemCountChangedEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.TreeItemChangedEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.TreeViewItem 100% 100%
Microsoft.FluentUI.AspNetCore.Components.TreeViewItemExpandedEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.UploadedFileDetails 100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.AddTag 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.CssBuilder 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.Debounce 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.Identifier 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.IdentifierContext 100% 75%
Microsoft.FluentUI.AspNetCore.Components.Utilities.InlineStyleBuilder 100% 91.6%
Microsoft.FluentUI.AspNetCore.Components.Utilities.MarkupStringSanitized 100% 92.5%
Microsoft.FluentUI.AspNetCore.Components.Utilities.RangeOf`1 96.7% 97.2%
Microsoft.FluentUI.AspNetCore.Components.Utilities.StyleBuilder 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ZIndex 100%

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds an initial Theme API for Fluent UI Blazor (v5 dev branch), including a ThemeService with JS interop, brand color ramp generation ported from the React Fluent UI Theme Designer, declarative theme attributes, localStorage persistence, and a demo Theme Designer page.

Changes:

  • Add IThemeService/ThemeService with JS interop for theme management, registered via DI, plus ThemeType and ThemeMode enums
  • Add brand color ramp calculation TypeScript code (ported from React theme designer) and comprehensive Theme.ts rewrite with localStorage persistence, system theme change listener, and declarative attribute support
  • Add Theme Designer demo page, theme documentation, and fix layout header CSS token usage

Reviewed changes

Copilot reviewed 18 out of 19 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
src/Core/Utilities/Theme/IThemeService.cs New public interface defining theme API methods
src/Core/Utilities/Theme/ThemeService.cs Implementation of IThemeService using JS interop
src/Core/Enums/ThemeType.cs New enum: Default, Teams
src/Core/Enums/ThemeMode.cs New enum: Light, Dark, System
src/Core/Extensions/ServiceCollectionExtensions.cs Register IThemeService in DI + trailing comma fixes
src/Core.Scripts/src/Utilities/Theme.ts Major rewrite with brand theme support, localStorage, system listener
src/Core.Scripts/src/d-ts/Blazor.d.ts Updated type declarations for new theme API
src/Core.Scripts/src/Startup.ts Call initializeThemeSettings early, remove setDefaultTheme
src/Core.Scripts/src/Utilities/BrandRamp/* Ported color ramp generation from React theme designer
src/Core/Components/Layout/FluentLayoutItem.razor.css Fix header background token (was using hover for normal state)
examples/Demo/.../Themes.md Theme documentation
examples/Demo/.../ThemeDesigner.razor Interactive theme designer demo
examples/Demo/.../ThemeDesigner.razor.css Styling for theme designer
examples/Demo/.../SystemColorsTable.razor Use brand foreground token

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants