Off By One UI
← Back to Components

Mode Toggle

Toggle between light, dark, and system color modes.

Installation

npx shadcn@latest add https://ui.offbyone.ai/r/mode-toggle.json

Usage

The Mode Toggle requires a ThemeProvider wrapper:

import { ThemeProvider } from "@/components/ui/theme-provider"
import { ModeToggle } from "@/components/ui/mode-toggle"

export default function App() {
  return (
    <ThemeProvider defaultMode="system">
      <ModeToggle />
    </ThemeProvider>
  )
}

Examples

Default

With Theme Selector

Combine with the Theme Selector for full theme control:

Color Mode

Theme Preset

Theme Provider

Wrap your app with the ThemeProvider to enable theme switching:

// app/layout.tsx or main.tsx
import { ThemeProvider } from "@/components/ui/theme-provider"

export default function RootLayout({ children }) {
  return (
    <html>
      <body>
        <ThemeProvider
          defaultMode="system"
          defaultPreset="default"
        >
          {children}
        </ThemeProvider>
      </body>
    </html>
  )
}

API Reference

ThemeProvider Props

PropTypeDefault
defaultMode"light" | "dark" | "system""system"
defaultPresetThemePreset"default"
modeStorageKeystring"ui-theme-mode"
presetStorageKeystring"ui-theme-preset"

useTheme Hook

const { mode, setMode, preset, setPreset, resolvedMode } = useTheme()
PropertyTypeDescription
mode"light" | "dark" | "system"Current mode setting
setMode(mode) => voidUpdate the mode
presetThemePresetCurrent theme preset
setPreset(preset) => voidUpdate the preset
resolvedMode"light" | "dark"Actual mode after resolving “system”