Files
CapaKraken/apps/web/src/hooks/useTheme.ts
T
Hartmut 1df208dbcc feat(timeline): add pulse animation for in-flight drag mutations
Allocation bars that have active optimistic overrides (post-drag,
awaiting server confirmation) now pulse subtly via animate-pulse.
The pending set is derived from the existing optimisticAllocations
map keys, requiring no additional state.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 13:28:46 +02:00

42 lines
1.2 KiB
TypeScript

"use client";
import { useCallback, useEffect } from "react";
import { useLocalStorage } from "./useLocalStorage.js";
export type ThemeMode = "light" | "dark";
export type AccentColor = "sky" | "indigo" | "violet" | "emerald" | "rose" | "amber";
export interface ThemePreferences {
mode: ThemeMode;
accent: AccentColor;
}
const STORAGE_KEY = "capakraken_theme";
const DEFAULT: ThemePreferences = { mode: "light", accent: "sky" };
function applyTheme(prefs: ThemePreferences) {
const html = document.documentElement;
if (prefs.mode === "dark") html.classList.add("dark");
else html.classList.remove("dark");
html.setAttribute("data-accent", prefs.accent);
}
export function useTheme() {
const [prefs, setPrefs] = useLocalStorage<ThemePreferences>(STORAGE_KEY, DEFAULT);
// Apply theme to DOM whenever prefs change
useEffect(() => {
applyTheme(prefs);
}, [prefs]);
const setMode = useCallback((mode: ThemeMode) => {
setPrefs((prev) => ({ ...prev, mode }));
}, [setPrefs]);
const setAccent = useCallback((accent: AccentColor) => {
setPrefs((prev) => ({ ...prev, accent }));
}, [setPrefs]);
return { prefs, setMode, setAccent };
}