import type { ColorMode } from '~/types' import { InjectionKeyColorMode } from '~/constants/symbols' import { COOKIE_KEY_COLOR_MODE, COOKIE_MAX_AGE } from '~/constants' export default defineNuxtPlugin((nuxt) => { const cookieColorMode = useCookie(COOKIE_KEY_COLOR_MODE, { maxAge: COOKIE_MAX_AGE }) const preferColorMode = process.server ? computed(() => 'light') : usePreferredColorScheme() const colorMode = computed({ get() { return cookieColorMode.value || preferColorMode.value as ColorMode }, set(value) { cookieColorMode.value = value }, }) nuxt.vueApp.provide(InjectionKeyColorMode, colorMode) if (process.server) { useHead({ htmlAttrs: { class: colorMode, }, }) } else { watchEffect(() => { document.documentElement.classList.toggle('dark', colorMode.value === 'dark') document.documentElement.classList.toggle('light', colorMode.value === 'light') }) } useHead({ meta: [{ id: 'theme-color', name: 'theme-color', content: computed(() => colorMode.value === 'dark' ? '#111111' : '#ffffff'), }], }) })