You've already forked AstralRinth
forked from didirus/AstralRinth
* 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
39 lines
1.0 KiB
TypeScript
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')
|
|
}
|