From 86999cb94ec38a549ca01c1eb14d99911aa975a7 Mon Sep 17 00:00:00 2001 From: daniel-c-harvey Date: Sat, 13 Jun 2026 20:00:20 -0400 Subject: [PATCH] fix(nav): per-parent dropdown collapsed state; reset on focusout HashSet _collapsedDropdowns replaces single bool so each parent tracks its own dismiss state independently. onfocusout added alongside onmouseleave so keyboard users get the dropdown re-enabled without a mouse pass after Enter-activating a child link. --- DeepDrftPublic.Client/Layout/DeepDrftMenu.razor | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/DeepDrftPublic.Client/Layout/DeepDrftMenu.razor b/DeepDrftPublic.Client/Layout/DeepDrftMenu.razor index d7d04a5..9cfb97d 100644 --- a/DeepDrftPublic.Client/Layout/DeepDrftMenu.razor +++ b/DeepDrftPublic.Client/Layout/DeepDrftMenu.razor @@ -17,15 +17,16 @@ dd-nav-item-collapsed is added on child click to force-hide the dropdown after SPA navigation (which keeps the DOM and may leave :hover true). It is cleared on mouseleave so the next hover works. *@ -
  • +
  • @navPage.Name
      @foreach (var child in navPage.Children) {
    • @child.Name + @onclick="() => CollapseDropdown(navPage.Route)">@child.Name
    • }
    @@ -95,7 +96,7 @@ [Parameter] public required EventCallback IsDarkModeChanged { get; set; } private bool _mobileMenuOpen; - private bool _dropdownCollapsed; + private readonly HashSet _collapsedDropdowns = []; protected override async Task OnAfterRenderAsync(bool firstRender) { @@ -129,7 +130,7 @@ private void CloseMobileMenu() => _mobileMenuOpen = false; - private void CollapseDropdown() => _dropdownCollapsed = true; + private void CollapseDropdown(string route) => _collapsedDropdowns.Add(route); - private void ResetDropdown() => _dropdownCollapsed = false; + private void ResetDropdown(string route) => _collapsedDropdowns.Remove(route); }