diff --git a/NET10/BlazorInteractiveServer/Components/UI/SidebarProvider.razor b/NET10/BlazorInteractiveServer/Components/UI/SidebarProvider.razor index c833970..8b2184c 100644 --- a/NET10/BlazorInteractiveServer/Components/UI/SidebarProvider.razor +++ b/NET10/BlazorInteractiveServer/Components/UI/SidebarProvider.razor @@ -111,6 +111,7 @@ { try { await JSRuntime.InvokeVoidAsync("ShellUI.disposeSidebar", _handle); } catch (JSException) { } + catch (JSDisconnectedException) { } } _dotnetRef?.Dispose(); diff --git a/ShellUI.Tests/InitBootstrapTests.cs b/ShellUI.Tests/InitBootstrapTests.cs index 7bf7f0e..edcc9aa 100644 --- a/ShellUI.Tests/InitBootstrapTests.cs +++ b/ShellUI.Tests/InitBootstrapTests.cs @@ -102,6 +102,23 @@ public void RewriteAppRazor_IsIdempotent() Assert.Equal(once, twice); } + [Theory] + [InlineData("standalone")] + [InlineData("npm")] + public void TargetsFile_IsValidMsBuildXml(string method) + { + var targets = InitService.GetTargetsFileContent(method); + + var xml = System.Xml.Linq.XDocument.Parse(targets); + Assert.Equal("Project", xml.Root!.Name.LocalName); + if (method == "standalone") + { + Assert.Contains($"{ShellUI.Core.TailwindConstants.GitHubTag}", targets); + Assert.Contains("(); + var item = new CommandItem { Title = "Go home", Action = () => { calls.Add("action"); return Task.CompletedTask; } }; + + var command = ctx.Render(p => p + .Add(c => c.IsOpen, true) + .Add(c => c.Commands, new List { item }) + .Add(c => c.CommandSelected, EventCallback.Factory.Create(this, _ => calls.Add("selected")))); + + command.Find("[role=option]").Click(); + + Assert.Equal(new[] { "action", "selected" }, calls); + } + + [Fact] + public void Popover_ClosesOnEscape() + { + using var ctx = new BunitContext(); + bool? open = null; + + var popover = ctx.Render(p => p + .Add(c => c.IsOpen, true) + .Add(c => c.IsOpenChanged, EventCallback.Factory.Create(this, v => open = v)) + .Add(c => c.Trigger, "Open") + .Add(c => c.ChildContent, "Body")); + + popover.Find("div.relative").KeyDown(new KeyboardEventArgs { Key = "Escape" }); + + Assert.False(open); + Assert.DoesNotContain("Body", popover.Markup); + } + + [Fact] + public void Dropdown_ClosesOnEscapeButNotOnOtherKeys() + { + using var ctx = new BunitContext(); + var changes = new List(); + + var dropdown = ctx.Render(p => p + .Add(c => c.IsOpen, true) + .Add(c => c.IsOpenChanged, EventCallback.Factory.Create(this, v => changes.Add(v))) + .Add(c => c.Trigger, "Menu") + .Add(c => c.ChildContent, "Item")); + + dropdown.Find("div.relative").KeyDown(new KeyboardEventArgs { Key = "a" }); + Assert.Empty(changes); + + dropdown.Find("div.relative").KeyDown(new KeyboardEventArgs { Key = "Escape" }); + Assert.Equal(new[] { false }, changes); + } +} diff --git a/docs/CLI_SYNTAX.md b/docs/CLI_SYNTAX.md index ab60258..246622f 100644 --- a/docs/CLI_SYNTAX.md +++ b/docs/CLI_SYNTAX.md @@ -44,7 +44,7 @@ Options: - `--force` reinitializes a project that already has `shellui.json`. - `--style