import { useComputed, useSignal, useSignalEffect } from '@preact/signals' import { IS_BROWSER } from '$fresh/runtime.ts' export default function ThemePicker() { const colorSchemeQuery = '(prefers-color-scheme: dark)' const colorSchemeDark = useSignal( IS_BROWSER ? matchMedia('(prefers-color-scheme: dark)').matches : false, ) if (IS_BROWSER) { matchMedia(colorSchemeQuery).addEventListener( 'change', (event) => colorSchemeDark.value = event.matches, ) } type Theme = 'system' | 'light' | 'dark' const theme = useSignal( localStorage.getItem('$cohabit.theme') as Theme ?? 'system', ) const themeIcon = useComputed(() => { if (theme.value === 'light') { return } if (theme.value === 'dark') { return } //If not forced use system if (colorSchemeDark.value) { return } return }) useSignalEffect(() => { localStorage.setItem('$cohabit.theme', theme.value) document.body.setAttribute('data-theme', theme.value) }) return ( ) }