@@ -7,20 +7,43 @@ export function ThemeToggle() {
77 const [ mounted , setMounted ] = useState ( false ) ;
88
99 useEffect ( ( ) => {
10+ const getCurrentTheme = ( ) => {
11+ const mode = document . documentElement . getAttribute ( "data-mode" ) ;
12+ if ( mode === "dark" || mode === "light" ) return mode ;
13+
14+ const stored = localStorage . getItem ( "theme" ) ;
15+ if ( stored === "dark" || stored === "light" ) return stored ;
16+
17+ return window . matchMedia ( "(prefers-color-scheme: dark)" ) . matches
18+ ? "dark"
19+ : "light" ;
20+ } ;
21+
22+ const handleThemeChange = ( event : Event ) => {
23+ const nextTheme = ( event as CustomEvent < { theme ?: "light" | "dark" } > )
24+ . detail ?. theme ;
25+ if ( nextTheme === "dark" || nextTheme === "light" ) {
26+ setTheme ( nextTheme ) ;
27+ }
28+ } ;
29+
1030 setMounted ( true ) ;
11- const stored = localStorage . getItem ( "theme" ) ;
12- if ( stored === "dark" || stored === "light" ) {
13- setTheme ( stored ) ;
14- } else if ( window . matchMedia ( "(prefers-color-scheme: dark)" ) . matches ) {
15- setTheme ( "dark" ) ;
16- }
31+ setTheme ( getCurrentTheme ( ) ) ;
32+ window . addEventListener ( "kumo:theme-change" , handleThemeChange ) ;
33+
34+ return ( ) => {
35+ window . removeEventListener ( "kumo:theme-change" , handleThemeChange ) ;
36+ } ;
1737 } , [ ] ) ;
1838
1939 const toggleTheme = ( ) => {
2040 const newTheme = theme === "light" ? "dark" : "light" ;
2141 setTheme ( newTheme ) ;
2242 localStorage . setItem ( "theme" , newTheme ) ;
2343 document . documentElement . setAttribute ( "data-mode" , newTheme ) ;
44+ window . dispatchEvent (
45+ new CustomEvent ( "kumo:theme-change" , { detail : { theme : newTheme } } ) ,
46+ ) ;
2447 } ;
2548
2649 // Prevent hydration mismatch
@@ -37,6 +60,7 @@ export function ThemeToggle() {
3760 variant = "ghost"
3861 shape = "square"
3962 aria-label = { `Switch to ${ theme === "light" ? "dark" : "light" } mode` }
63+ title = "Toggle theme (D)"
4064 onClick = { toggleTheme }
4165 >
4266 { theme === "light" ? < MoonIcon size = { 20 } /> : < SunIcon size = { 20 } /> }
0 commit comments