Skip to content

useColorScheme

A composable for light/dark/system color scheme with persistence. Supports prefers-color-scheme for system preference, optional attribute on document, and localStorage persistence.

Basic Usage

vue
<template>
  <BvButton @click="toggleScheme">
    {{ isDark ? "Light" : "Dark" }} mode
  </BvButton>
</template>

<script setup>
import { BvButton } from "@baklavue/ui";
import { useColorScheme } from "@baklavue/composables";

const { scheme, isDark, setScheme } = useColorScheme();

function toggleScheme() {
  setScheme(isDark.value ? "light" : "dark");
}
</script>

System Preference

Use "system" to follow the OS preference:

vue
<script setup>
import { useColorScheme } from "@baklavue/composables";

const { scheme, setScheme } = useColorScheme();

// Follow system
setScheme("system");
</script>

Options

vue
<script setup>
import { useColorScheme } from "@baklavue/composables";

const { scheme, isDark, setScheme } = useColorScheme({
  storageKey: "app-color-scheme",
  attribute: "data-theme",
  selector: "html",
  defaultScheme: "system",
});
</script>
OptionTypeDefaultDescription
storageKeystring | false"color-scheme"localStorage key. Set to false to disable persistence
attribute"data-theme" | "class""data-theme"Attribute to set on document.documentElement
selectorstring"html"Selector for the element to apply the attribute
defaultScheme"light" | "dark" | "system""system"Default when no stored value exists

With attribute: "class"

When using attribute: "class", the composable adds dark class for dark mode and removes it for light:

vue
<script setup>
import { useColorScheme } from "@baklavue/composables";

useColorScheme({ attribute: "class" });
</script>

<template>
  <div class="bg-white dark:bg-gray-900 text-gray-900 dark:text-white">
    Content
  </div>
</template>

API

Return Value

PropertyTypeDescription
schemeRef<"light" | "dark" | "system">Current scheme choice
isDarkRef<boolean>true when dark mode is active
setScheme(value: ColorScheme) => voidSet scheme and persist

ColorScheme

typescript
type ColorScheme = "light" | "dark" | "system";

TypeScript Support

typescript
import {
  useColorScheme,
  type ColorScheme,
  type UseColorSchemeOptions,
} from "@baklavue/composables";

const { scheme, isDark, setScheme } = useColorScheme({
  storageKey: "my-app-theme",
  defaultScheme: "system",
});