From ea37f91c68f31dbaaff2eb17a67dcbc38bf8f71d Mon Sep 17 00:00:00 2001 From: Nina Middelmann Date: Thu, 7 May 2026 12:22:30 +0200 Subject: [PATCH] feat: support host-supplied named theme presets Replaces the long-standing "Not Implemented" preset stub with a working dropdown driven by themes the host application provides. - Add optional `Name` to `ThemeManagerTheme` so the existing wrapper can carry a display name. Default null preserves all existing usage. - Add `[Parameter] IEnumerable? Presets` and `[Parameter] EventCallback PresetSelected` on `MudThemeManager`. When `Presets` is null the original disabled stub renders unchanged (backward compatible). - Refactor theme initialisation into `SyncWithTheme()` and run it from both `OnInitialized` and `OnParametersSet`, with a reference guard. This lets the host swap the active theme via the existing `Theme` parameter (e.g. on preset selection) and have the manager re-sync its internal palette caches. Without this, switching the active theme after first render would leave subsequent edits applied to the previous theme. The library remains storage-agnostic: presets are passed in by the host, persistence stays the host application concern. --- .../Components/MudThemeManager.razor | 18 ++++++++++++--- .../Components/MudThemeManager.razor.cs | 22 ++++++++++++++++++- .../Models/ThemeManagerTheme.cs | 2 ++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/MudBlazor.ThemeManager/Components/MudThemeManager.razor b/src/MudBlazor.ThemeManager/Components/MudThemeManager.razor index f7e1f35..65718c7 100644 --- a/src/MudBlazor.ThemeManager/Components/MudThemeManager.razor +++ b/src/MudBlazor.ThemeManager/Components/MudThemeManager.razor @@ -5,9 +5,21 @@
Theme Presets - - - + @if (Presets is null) + { + + + + } + else + { + + @foreach (var preset in Presets) + { + @(preset.Name ?? "(unnamed)") + } + + }
diff --git a/src/MudBlazor.ThemeManager/Components/MudThemeManager.razor.cs b/src/MudBlazor.ThemeManager/Components/MudThemeManager.razor.cs index 7340836..f29813f 100644 --- a/src/MudBlazor.ThemeManager/Components/MudThemeManager.razor.cs +++ b/src/MudBlazor.ThemeManager/Components/MudThemeManager.razor.cs @@ -15,6 +15,7 @@ public partial class MudThemeManager : ComponentBaseWithState private Palette? _currentPaletteDark; private Palette _currentPalette; private MudTheme? _customTheme; + private ThemeManagerTheme? _previousTheme; public MudThemeManager() { @@ -45,14 +46,30 @@ public MudThemeManager() [Parameter] public ColorPickerView ColorPickerView { get; set; } = ColorPickerView.Spectrum; + [Parameter] + public IEnumerable? Presets { get; set; } + + [Parameter] + public EventCallback PresetSelected { get; set; } + [Parameter] public EventCallback ThemeChanged { get; set; } protected override void OnInitialized() { base.OnInitialized(); + SyncWithTheme(); + } - if (Theme is null) + protected override void OnParametersSet() + { + base.OnParametersSet(); + SyncWithTheme(); + } + + private void SyncWithTheme() + { + if (Theme is null || ReferenceEquals(Theme, _previousTheme)) { return; } @@ -61,8 +78,11 @@ protected override void OnInitialized() _currentPaletteLight = Theme.Theme.PaletteLight.DeepClone(); _currentPaletteDark = Theme.Theme.PaletteDark.DeepClone(); _currentPalette = GetPalette(); + _previousTheme = Theme; } + private Task OnPresetSelectedAsync(ThemeManagerTheme value) => PresetSelected.InvokeAsync(value); + public Task UpdatePalette(ThemeUpdatedValue value) { UpdateCustomTheme(); diff --git a/src/MudBlazor.ThemeManager/Models/ThemeManagerTheme.cs b/src/MudBlazor.ThemeManager/Models/ThemeManagerTheme.cs index 9afdb4a..be49cdf 100644 --- a/src/MudBlazor.ThemeManager/Models/ThemeManagerTheme.cs +++ b/src/MudBlazor.ThemeManager/Models/ThemeManagerTheme.cs @@ -2,6 +2,8 @@ public class ThemeManagerTheme { + public string? Name { get; set; } + public MudTheme Theme { get; set; } = new(); public bool RTL { get; set; }