import { useState, useEffect, useCallback } from 'react';
export type Accent = 'green' | 'ocean' | 'nebula' | 'cyber' | 'sunset' | 'crimson';
export const ACCENTS: { id: Accent; label: string; color: string }[] = [
{ id: 'green', label: 'Green', color: '#22e06a' },
{ id: 'ocean', label: 'Ocean', color: '#2f97ff' },
{ id: 'nebula', label: 'Nebula', color: '#a78bfa' },
{ id: 'cyber', label: 'Cyber', color: '#22e0d6' },
{ id: 'sunset', label: 'Sunset', color: '#ffae3b' },
{ id: 'crimson', label: 'Crimson', color: '#ff4d7d' },
];
const STORAGE_KEY = 'sz_accent';
function getInitial(): Accent {
try {
const saved = localStorage.getItem(STORAGE_KEY) as Accent | null;
if (saved && ACCENTS.some(a => a.id === saved)) return saved;
} catch { /* localStorage unavailable */ }
return 'green';
}
function applyAccent(accent: Accent) {
document.documentElement.setAttribute('data-accent', accent);
}
export function useAccent() {
const [accent, setAccentState] = useState<Accent>(getInitial);
useEffect(() => {
applyAccent(accent);
try { localStorage.setItem(STORAGE_KEY, accent); } catch { /* ignore */ }
}, [accent]);
const setAccent = useCallback((a: Accent) => setAccentState(a), []);
return { accent, setAccent };
}
📜 Git History
dc6c37efeat(theme): add Sunset/Amber + Crimson accent themes (6 total)12 days ago
e822e64feat(theme): multi color themes via data-accent layer (green default + ocean/nebula/cyber)12 days ago
Show last diff
Loading...