From dd9b7a289a997c12a2d5a11af073bf90f3af1441 Mon Sep 17 00:00:00 2001 From: Ajay Ghanwat Date: Wed, 12 Aug 2026 21:17:20 +0530 Subject: [PATCH] fix(theme): persist switcher accent for SSR --- packages/cli/package.json | 2 +- packages/dev-server/package.json | 2 +- packages/styles/package.json | 2 +- packages/styles/src/theme.ts | 15 --------------- packages/styles/test/theme-accent.test.ts | 3 +-- packages/ui/components/PreferenceSwitcher.wrn | 2 ++ packages/ui/package.json | 2 +- packages/ui/test/ui.test.ts | 8 ++++---- 8 files changed, 11 insertions(+), 25 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 959fda4e..db0a8515 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/cli", - "version": "0.8.27", + "version": "0.8.28", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/dev-server/package.json b/packages/dev-server/package.json index 631ad537..6e7acc4c 100644 --- a/packages/dev-server/package.json +++ b/packages/dev-server/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/dev-server", - "version": "0.8.26", + "version": "0.8.27", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/styles/package.json b/packages/styles/package.json index 642443b0..1d7221c5 100644 --- a/packages/styles/package.json +++ b/packages/styles/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/styles", - "version": "0.8.12", + "version": "0.8.13", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/styles/src/theme.ts b/packages/styles/src/theme.ts index 5f1ec4e6..b226591e 100644 --- a/packages/styles/src/theme.ts +++ b/packages/styles/src/theme.ts @@ -745,17 +745,6 @@ export function renderThemeRuntime(theme: ResolvedTheme): string { window.dispatchEvent(new CustomEvent("wrnexus:accent-changed",{detail:{accent:null}})); } - function syncSharedAccent(){ - var cookieAccent=readCookie(ACCENT_COOKIE); - var next=cookieAccent&&ACCENTS.indexOf(cookieAccent)>=0?cookieAccent:DEFAULT_ACCENT; - var current=el.getAttribute("data-accent"); - if(next===current)return; - if(next)el.setAttribute("data-accent",next);else el.removeAttribute("data-accent"); - syncStylesheet(getTheme(),next); - syncAccentButtons(document); - window.dispatchEvent(new CustomEvent("wrnexus:accent-changed",{detail:{accent:next}})); - } - function bind(root){ var target=root||document; @@ -814,10 +803,6 @@ export function renderThemeRuntime(theme: ResolvedTheme): string { }; window.addEventListener("wrnexus:navigated",function(){bind(document);}); - window.addEventListener("focus",syncSharedAccent); - window.addEventListener("pageshow",syncSharedAccent); - document.addEventListener("visibilitychange",function(){if(!document.hidden)syncSharedAccent();}); - window.setInterval(syncSharedAccent,1000); if(document.readyState==="loading"){ document.addEventListener("DOMContentLoaded",function(){bind(document);}); }else{ diff --git a/packages/styles/test/theme-accent.test.ts b/packages/styles/test/theme-accent.test.ts index 0771c46c..003d1e9c 100644 --- a/packages/styles/test/theme-accent.test.ts +++ b/packages/styles/test/theme-accent.test.ts @@ -58,8 +58,7 @@ describe("theme accents", () => { expect(runtime).toContain('"domain":"localhost"'); expect(runtime).toContain("deleteCookie(ACCENT_COOKIE);"); expect(runtime).toContain("writeCookie(ACCENT_COOKIE,name,ACCENT_COOKIE_OPTIONS)"); - expect(runtime).toContain('window.addEventListener("focus",syncSharedAccent)'); - expect(runtime).toContain("window.setInterval(syncSharedAccent,1000)"); + expect(runtime).not.toContain("setInterval(syncSharedAccent"); }); }); test("live document accent has priority over cookie and default", () => { diff --git a/packages/ui/components/PreferenceSwitcher.wrn b/packages/ui/components/PreferenceSwitcher.wrn index a3b65239..8992f78f 100644 --- a/packages/ui/components/PreferenceSwitcher.wrn +++ b/packages/ui/components/PreferenceSwitcher.wrn @@ -30,6 +30,8 @@ size: string = "default" functions { client function choose(type, value) { + if (type === "color") window.wrnAccent?.set(value) + if (type === "theme") window.wrnTheme?.set(value) output[type]({ value: value }) } } diff --git a/packages/ui/package.json b/packages/ui/package.json index 0dd9db45..e92288ea 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/ui", - "version": "0.8.14", + "version": "0.8.15", "private": true, "type": "module", "main": "src/index.ts", diff --git a/packages/ui/test/ui.test.ts b/packages/ui/test/ui.test.ts index 8ab260d4..238afa04 100644 --- a/packages/ui/test/ui.test.ts +++ b/packages/ui/test/ui.test.ts @@ -374,10 +374,10 @@ test("navbar hover menu stays open while the pointer crosses into its panel", as }); test("preference switcher keeps only one popover open and closes outside", async () => { - const html = await renderComponent( - readFileSync(uiComponentPath("PreferenceSwitcher"), "utf8"), - {}, - ); + const source = readFileSync(uiComponentPath("PreferenceSwitcher"), "utf8"); + const html = await renderComponent(source, {}); + expect(source).toContain("window.wrnAccent?.set(value)"); + expect(source).toContain("window.wrnTheme?.set(value)"); const dom = mountHtml(html); const menus = Array.from(dom.querySelectorAll(".wrn-preferences__menu")) as HTMLDetailsElement[]; const DomEvent = (dom.window as { Event: typeof Event }).Event;