feat(theme): ThemeScripts + localStorage nav-state enhancer
This commit is contained in:
@@ -0,0 +1,4 @@
|
|||||||
|
@namespace ZB.MOM.WW.Theme
|
||||||
|
@* Components/ThemeScripts.razor — drop before </body>. Emits the kit's nav-state
|
||||||
|
enhancer that persists NavRailSection open/closed state in localStorage. *@
|
||||||
|
<script src="_content/ZB.MOM.WW.Theme/js/nav-state.js" defer></script>
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
// ZB.MOM.WW.Theme nav-state.js — persists <details data-nav-key> open/closed
|
||||||
|
// state in localStorage so NavRailSection expand state survives navigation and
|
||||||
|
// reloads. Pure client-side; works with static Blazor SSR. Keyed per section.
|
||||||
|
(function () {
|
||||||
|
var PREFIX = "zbnav:";
|
||||||
|
function apply() {
|
||||||
|
document.querySelectorAll("details.rail-section[data-nav-key]").forEach(function (el) {
|
||||||
|
var key = PREFIX + el.getAttribute("data-nav-key");
|
||||||
|
var saved = null;
|
||||||
|
try { saved = window.localStorage.getItem(key); } catch (e) { return; }
|
||||||
|
if (saved === "1") el.open = true;
|
||||||
|
else if (saved === "0") el.open = false;
|
||||||
|
el.addEventListener("toggle", function () {
|
||||||
|
try { window.localStorage.setItem(key, el.open ? "1" : "0"); } catch (e) { /* ignore */ }
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (document.readyState === "loading")
|
||||||
|
document.addEventListener("DOMContentLoaded", apply);
|
||||||
|
else
|
||||||
|
apply();
|
||||||
|
})();
|
||||||
@@ -35,6 +35,10 @@ public class StaticAssetsTests
|
|||||||
public void Fonts_are_vendored(string file) =>
|
public void Fonts_are_vendored(string file) =>
|
||||||
Assert.True(File.Exists(Path.Combine(Wwwroot, "fonts", file)));
|
Assert.True(File.Exists(Path.Combine(Wwwroot, "fonts", file)));
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void NavStateScript_ships() =>
|
||||||
|
Assert.True(File.Exists(Path.Combine(Wwwroot, "js", "nav-state.js")));
|
||||||
|
|
||||||
// Theme-002: .chip-idle pairs the idle background with the matching --idle
|
// Theme-002: .chip-idle pairs the idle background with the matching --idle
|
||||||
// foreground token (per DESIGN-TOKENS.md), not --ink-soft.
|
// foreground token (per DESIGN-TOKENS.md), not --ink-soft.
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
namespace ZB.MOM.WW.Theme.Tests;
|
||||||
|
|
||||||
|
public class ThemeScriptsTests : TestContext
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void ThemeScripts_emits_nav_state_script_tag()
|
||||||
|
{
|
||||||
|
var cut = RenderComponent<ThemeScripts>();
|
||||||
|
var script = cut.Find("script");
|
||||||
|
Assert.Equal("_content/ZB.MOM.WW.Theme/js/nav-state.js", script.GetAttribute("src"));
|
||||||
|
Assert.True(script.HasAttribute("defer"));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user