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(() => (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"); }