Files
invyone/frontend/hooks/useColorTheme.ts
T
gbpark b3ad787179
Build & Deploy to K8s / build-and-deploy (push) Successful in 5m4s
대시보드 구현 완료 세세한 오류 수정 진행중
2026-04-19 21:15:25 +09:00

41 lines
1.5 KiB
TypeScript

"use client";
import { useState, useEffect, useCallback } from "react";
export type ColorTheme = "purple" | "blue" | "green" | "orange" | "pink" | "cyan";
export const COLOR_THEME_STORAGE_KEY = "v5-color-theme";
export const DEFAULT_COLOR_THEME: ColorTheme = "purple";
export const COLOR_THEMES: { id: ColorTheme; label: string; light: string; dark: string }[] = [
{ id: "purple", label: "보라", light: "#6c5ce7", dark: "#a29bfe" },
{ id: "blue", label: "블루", light: "#3b82f6", dark: "#93c5fd" },
{ id: "green", label: "그린", light: "#10b981", dark: "#6ee7b7" },
{ id: "orange", label: "오렌지", light: "#f97316", dark: "#fdba74" },
{ id: "pink", label: "핑크", light: "#ec4899", dark: "#f472b6" },
{ id: "cyan", label: "시안", light: "#0891b2", dark: "#7dd3fc" },
];
export function useColorTheme() {
const [color, setColorState] = useState<ColorTheme>(DEFAULT_COLOR_THEME);
useEffect(() => {
const current = (document.documentElement.getAttribute("data-color") as ColorTheme) || DEFAULT_COLOR_THEME;
setColorState(current);
}, []);
const setColor = useCallback((next: ColorTheme) => {
if (next === DEFAULT_COLOR_THEME) {
document.documentElement.removeAttribute("data-color");
} else {
document.documentElement.setAttribute("data-color", next);
}
try {
localStorage.setItem(COLOR_THEME_STORAGE_KEY, next);
} catch {}
setColorState(next);
}, []);
return { color, setColor };
}