--- category: Browser related: - useDark - usePreferredDark - useStorage --- # useColorMode Reactive color mode (dark / light / customs) with auto data persistence. ## Basic Usage ```ts import { useColorMode } from '@vueuse/core' const mode = useColorMode() // Ref<'dark' | 'light'> ``` By default, it will match with users' browser preference using `usePreferredDark` (a.k.a `auto` mode). When reading the ref, it will by default return the current color mode (`dark`, `light` or your custom modes). The `auto` mode can be included in the returned modes by enabling the `emitAuto` option. When writing to the ref, it will trigger DOM updates and persist the color mode to local storage (or your custom storage). You can pass `auto` to set back to auto mode. ```ts import { useColorMode } from '@vueuse/core' const mode = useColorMode() // ---cut--- mode.value // 'dark' | 'light' mode.value = 'dark' // change to dark mode and persist mode.value = 'auto' // change to auto mode ``` ## Config ```ts import { useColorMode } from '@vueuse/core' const mode = useColorMode({ attribute: 'theme', modes: { // custom colors dim: 'dim', cafe: 'cafe', }, }) // Ref<'dark' | 'light' | 'dim' | 'cafe'> ``` ## Advanced Usage You can also explicit access to the system preference and storaged user override mode. ```ts import { useColorMode } from '@vueuse/core' const { system, store } = useColorMode() system.value // 'dark' | 'light' store.value // 'dark' | 'light' | 'auto' const myColorMode = computed(() => store.value === 'auto' ? system.value : store.value) ``` ## Component Usage ```vue ``` ## Type Declarations ```ts export type BasicColorMode = "light" | "dark" export type BasicColorSchema = BasicColorMode | "auto" export interface UseColorModeOptions extends UseStorageOptions { /** * CSS Selector for the target element applying to * * @default 'html' */ selector?: string | MaybeElementRef /** * HTML attribute applying the target element * * @default 'class' */ attribute?: string /** * The initial color mode * * @default 'auto' */ initialValue?: MaybeRefOrGetter /** * Prefix when adding value to the attribute */ modes?: Partial> /** * A custom handler for handle the updates. * When specified, the default behavior will be overridden. * * @default undefined */ onChanged?: ( mode: T | BasicColorMode, defaultHandler: (mode: T | BasicColorMode) => void, ) => void /** * Custom storage ref * * When provided, `useStorage` will be skipped */ storageRef?: Ref /** * Key to persist the data into localStorage/sessionStorage. * * Pass `null` to disable persistence * * @default 'vueuse-color-scheme' */ storageKey?: string | null /** * Storage object, can be localStorage or sessionStorage * * @default localStorage */ storage?: StorageLike /** * Emit `auto` mode from state * * When set to `true`, preferred mode won't be translated into `light` or `dark`. * This is useful when the fact that `auto` mode was selected needs to be known. * * @default undefined * @deprecated use `store.value` when `auto` mode needs to be known * @see https://vueuse.org/core/useColorMode/#advanced-usage */ emitAuto?: boolean /** * Disable transition on switch * * @see https://paco.me/writing/disable-theme-transitions * @default true */ disableTransition?: boolean } export type UseColorModeReturn = Ref< T | BasicColorSchema > & { store: Ref system: ComputedRef state: ComputedRef } /** * Reactive color mode with auto data persistence. * * @see https://vueuse.org/useColorMode * @param options */ export declare function useColorMode( options?: UseColorModeOptions, ): UseColorModeReturn ```