Skip to content
This repository was archived by the owner on Jul 20, 2025. It is now read-only.

Commit e69131f

Browse files
fix: portal sync theme (#139)
1 parent 776eb85 commit e69131f

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

src/components/Portal/Portal.tsx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,36 @@ export function Portal({ children, mounted = false, rootClassName = "portal-root
2020
setRootRef(root);
2121
document.body.appendChild(root);
2222

23+
// Sync dark/light classes or data-mode attribute from documentElement/body
24+
const syncThemeClass = () => {
25+
const isDark =
26+
document.documentElement.classList.contains("dark") ||
27+
document.body.classList.contains("dark") ||
28+
document.documentElement.getAttribute("data-mode") === "dark" ||
29+
document.body.getAttribute("data-mode") === "dark";
30+
if (isDark) {
31+
root.classList.add("dark");
32+
root.setAttribute("data-mode", "dark");
33+
} else {
34+
root.classList.remove("dark");
35+
root.setAttribute("data-mode", "light");
36+
}
37+
};
38+
39+
syncThemeClass();
40+
41+
const observer = new MutationObserver(syncThemeClass);
42+
observer.observe(document.documentElement, {
43+
attributes: true,
44+
attributeFilter: ["class", "data-mode"],
45+
});
46+
observer.observe(document.body, {
47+
attributes: true,
48+
attributeFilter: ["class", "data-mode"],
49+
});
50+
2351
return () => {
52+
observer.disconnect();
2453
document.body.removeChild(root);
2554
};
2655
}, [mounted]);

0 commit comments

Comments
 (0)