Files
AstralRinth/apps/frontend/src/plugins/theme/native-theme.ts
Cal H. 2aabcf36ee refactor: migrate to common eslint+prettier configs (#4168)
* refactor: migrate to common eslint+prettier configs

* fix: prettier frontend

* feat: config changes

* fix: lint issues

* fix: lint

* fix: type imports

* fix: cyclical import issue

* fix: lockfile

* fix: missing dep

* fix: switch to tabs

* fix: continue switch to tabs

* fix: rustfmt parity

* fix: moderation lint issue

* fix: lint issues

* fix: ui intl

* fix: lint issues

* Revert "fix: rustfmt parity"

This reverts commit cb99d2376c321d813d4b7fc7e2a213bb30a54711.

* feat: revert last rs
2025-08-14 20:48:38 +00:00

39 lines
1.0 KiB
TypeScript

export type SystemTheme = 'unknown' | 'light' | 'dark'
function useNativeThemeServer() {
let clientHint
switch (useRequestHeader('Sec-CH-Prefers-Color-Scheme')) {
case 'light':
clientHint = 'light'
break
case 'dark':
clientHint = 'dark'
break
default:
clientHint = 'unknown'
}
return computed(() => clientHint as SystemTheme)
}
function useNativeThemeClient() {
const lightPreference = window.matchMedia('(prefers-color-scheme: light)')
const isLight = ref(lightPreference.matches)
const onPreferenceChange = ({ matches }: MediaQueryListEvent) => (isLight.value = matches)
lightPreference.addEventListener('change', onPreferenceChange)
onScopeDispose(() => lightPreference.removeEventListener('change', onPreferenceChange))
return computed<SystemTheme>(() => (isLight.value ? 'light' : 'dark'))
}
export function useNativeTheme() {
if (import.meta.server) return useNativeThemeServer()
if (import.meta.client) return useNativeThemeClient()
throw new Error('Cannot determine the side')
}