'use client' import EventEmitter from 'events' import { useState, useEffect, MouseEvent } from 'react' type AppearanceMode = undefined | 'light' | 'dark' export const themeSignal = new EventEmitter() export default function Appearance() { const [appearance, setAppearance] = useState(undefined) useEffect(() => { if (appearance !== undefined) { document.body.parentElement?.classList.remove('light') document.body.parentElement?.classList.remove('dark') document.body.parentElement?.classList.add(appearance) themeSignal.emit('change') } }, [appearance]) function toggleDarkMode(ev: MouseEvent) { ev.preventDefault() const current = appearance ?? getDefaultTheme() switch (current) { case 'light': setAppearance('dark') return case 'dark': setAppearance('light') return } } return ( appearance ) } function getDefaultTheme(): 'light' | 'dark' { const { matches: lightTheme } = window.matchMedia('(prefers-color-scheme: light)') return lightTheme ? 'light' : 'dark' }