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