|
import { atom } from 'nanostores'; |
|
import { logStore } from './logs'; |
|
|
|
export type Theme = 'dark' | 'light'; |
|
|
|
export const kTheme = 'bolt_theme'; |
|
|
|
export function themeIsDark() { |
|
return themeStore.get() === 'dark'; |
|
} |
|
|
|
export const DEFAULT_THEME = 'light'; |
|
|
|
export const themeStore = atom<Theme>(initStore()); |
|
|
|
function initStore() { |
|
if (!import.meta.env.SSR) { |
|
const persistedTheme = localStorage.getItem(kTheme) as Theme | undefined; |
|
const themeAttribute = document.querySelector('html')?.getAttribute('data-theme'); |
|
|
|
return persistedTheme ?? (themeAttribute as Theme) ?? DEFAULT_THEME; |
|
} |
|
|
|
return DEFAULT_THEME; |
|
} |
|
|
|
export function toggleTheme() { |
|
const currentTheme = themeStore.get(); |
|
const newTheme = currentTheme === 'dark' ? 'light' : 'dark'; |
|
themeStore.set(newTheme); |
|
logStore.logSystem(`Theme changed to ${newTheme} mode`); |
|
localStorage.setItem(kTheme, newTheme); |
|
document.querySelector('html')?.setAttribute('data-theme', newTheme); |
|
} |
|
|