Skip to content

useTheme

Theme state singleton: read/switch color family and light/dark mode.

When to use

  • Building custom theme-switching UI (or just use ThemeSwitcher)
  • Business logic that needs the current theme (e.g. chart palettes)

Usage

ts
import { useTheme } from '@luxeanor/ui'

const { family, mode, resolvedMode, setFamily, setMode } = useTheme()

setFamily('ink')          // switches family, writes <html data-theme>, persists
setMode('auto')           // 'light' | 'dark' | 'auto'
console.log(resolvedMode.value)  // resolved: 'light' | 'dark'

API

ReturnTypeDescription
familyReadonly<Ref<'amethyst' | 'obsidian' | 'ink' | 'emerald'>>current family
modeReadonly<Ref<'light' | 'dark' | 'auto'>>current setting
resolvedModeComputedRef<'light' | 'dark'>auto-resolved actual mode
setFamily(f: ThemeFamily) => voidswitch family (writes attrs + persists)
setMode(m: ThemeModeSetting) => voidswitch mode (writes attrs + persists)

Behavior:

  • Module-level singleton — all callers share one state; first call initializes
  • Persists to localStorage['lx-theme'] (JSON { family, mode })
  • auto follows system prefers-color-scheme live
  • Under SSR returns defaults (amethyst / light), never touches the DOM
  • The themeBootScript string export handles flash-free first paint, see Theming