useTheme

Access and control the current color mode and active palette. Must be used within a ThemeProvider.

Setup

Wrap your app with ThemeProvider before using this hook anywhere in the tree:

import { ThemeProvider, builtInPalettes } from "@bloomkit/react";
 
export default function App({ children }: { children: React.ReactNode }) {
  return (
    <ThemeProvider
      defaultColorMode="system"
      defaultPalette="bloom"
      palettes={builtInPalettes}
    >
      {children}
    </ThemeProvider>
  );
}

Return value

PropertyTypeDescription
colorMode"light" | "dark" | "system"Current color mode setting
resolvedMode"light" | "dark"Resolved value after applying system preference
setColorMode(mode) => voidSet to "dark", "light", or "system"
toggleColorMode() => voidToggle between light and dark
palettestringActive palette name
setPalette(name) => voidSwitch to a palette by name
palettesstring[]All available palette names

resolvedMode is always "light" or "dark" — it never returns "system". Use it to render icons or labels safely.

Dark mode toggle

import { useTheme } from "@bloomkit/react";
 
export function ThemeToggle() {
  const { resolvedMode, toggleColorMode } = useTheme();
 
  return (
    <button
      onClick={toggleColorMode}
      aria-label={resolvedMode === "dark" ? "Switch to light mode" : "Switch to dark mode"}
    >
      {resolvedMode === "dark" ? "Light mode" : "Dark mode"}
    </button>
  );
}

For a three-way picker (light / dark / system), use colorMode and setColorMode instead:

import { useTheme } from "@bloomkit/react";
 
const modes = ["light", "dark", "system"] as const;
 
export function ColorModePicker() {
  const { colorMode, setColorMode } = useTheme();
 
  return (
    <div role="group" aria-label="Color mode">
      {modes.map((mode) => (
        <button
          key={mode}
          onClick={() => setColorMode(mode)}
          aria-pressed={colorMode === mode}
        >
          {mode}
        </button>
      ))}
    </div>
  );
}

Palette switcher

import { useTheme } from "@bloomkit/react";
 
export function PaletteSwitcher() {
  const { palette, setPalette, palettes } = useTheme();
 
  return (
    <div>
      {palettes.map((name) => (
        <button
          key={name}
          onClick={() => setPalette(name)}
          aria-pressed={palette === name}
        >
          {name}
        </button>
      ))}
    </div>
  );
}

ThemeProvider props

PropTypeDefaultDescription
defaultColorMode"light" | "dark" | "system""system"Initial color mode
defaultPalettestring"bloom"Initial palette name
palettesBloomPalette[][]Palette definitions to register
storageKeystring"bloom-theme"localStorage key prefix for persistence
childrenReactNodeApp content

The selected color mode and palette are persisted to localStorage so the user's preference is restored on the next visit.