@using DeepDrftPublic.Client.Common @using DeepDrftPublic.Client.Controls @using DeepDrftPublic.Client.Services @* Desktop Menu *@
@* Mobile Menu *@
@code { [Inject] public required DarkModeCookieService DarkModeCookieService { get; set; } // Elevation is vestigial under the frosted-glass design but kept on the parameter // surface so MainLayout's call site stays intact. [Parameter] public int Elevation { get; set; } [Parameter] public required bool IsDarkMode { get; set; } [Parameter] public required EventCallback IsDarkModeChanged { get; set; } private bool _mobileMenuOpen; protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { // Runs here (not OnInitializedAsync) because OnAfterRenderAsync(firstRender) // is guaranteed not to execute during any SSR prerender pass. During prerender // (now interactive across all of Routes), awaiting IsDarkModeChanged.InvokeAsync // triggers a parent re-render cycle that cannot complete on the prerender renderer // and hangs the response. Server-side DarkModeService has already seeded // DarkModeSettings via PersistentComponentState, so the prerender paint is // already correct; this call reads that persisted value and propagates it to the // parent so the menu's IsDarkMode parameter stays consistent with DarkModeSettings. IsDarkMode = DarkModeCookieService.GetDarkMode(); await IsDarkModeChanged.InvokeAsync(IsDarkMode); } } private string NavClass => IsDarkMode ? "dd-nav dd-nav-dark" : "dd-nav dd-nav-light"; private string DarkLightModeIconSvg => IsDarkMode ? DDIcons.GasLampLit : DDIcons.GasLamp; private string DarkLightModeButtonIcon => IsDarkMode switch { true => DDIcons.GasLampLit, false => DDIcons.GasLamp, }; private async Task DarkModeToggle() { IsDarkMode = !IsDarkMode; await DarkModeCookieService.SetDarkModeAsync(IsDarkMode); await IsDarkModeChanged.InvokeAsync(IsDarkMode); } private void ToggleMobileMenu() => _mobileMenuOpen = !_mobileMenuOpen; private void CloseMobileMenu() => _mobileMenuOpen = false; }