Files
vancouver/src/stores.js
T

91 lines
2.4 KiB
JavaScript

import { writable } from 'svelte/store';
const browser = typeof window !== 'undefined';
// Theme store with three modes: system, light, dark
function createThemeStore() {
const { subscribe, set, update } = writable('system');
function applyTheme(mode) {
if (!browser) return;
let actualTheme;
if (mode === 'system') {
actualTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
} else {
actualTheme = mode;
}
document.documentElement.setAttribute('data-theme', actualTheme);
}
return {
subscribe,
set: (theme) => {
if (browser) {
localStorage.setItem('theme', theme);
applyTheme(theme);
}
set(theme);
},
init: () => {
if (browser) {
const saved = localStorage.getItem('theme') || 'system';
applyTheme(saved);
set(saved);
// Listen for system theme changes when in system mode
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
mediaQuery.addEventListener('change', () => {
const currentTheme = localStorage.getItem('theme') || 'system';
if (currentTheme === 'system') {
applyTheme('system');
}
});
}
},
cycle: () => {
update(current => {
const modes = ['system', 'light', 'dark'];
const currentIndex = modes.indexOf(current);
const nextMode = modes[(currentIndex + 1) % modes.length];
if (browser) {
localStorage.setItem('theme', nextMode);
applyTheme(nextMode);
}
return nextMode;
});
}
};
}
// Language store
function createLanguageStore() {
const { subscribe, set, update } = writable('en');
return {
subscribe,
set: (lang) => {
if (browser) {
localStorage.setItem('language', lang);
document.documentElement.setAttribute('lang', lang);
}
set(lang);
},
init: () => {
if (browser) {
const saved = localStorage.getItem('language');
const browserLang = navigator.language.split('-')[0];
const supportedLangs = ['en', 'uk', 'ru'];
const lang = saved || (supportedLangs.includes(browserLang) ? browserLang : 'en');
document.documentElement.setAttribute('lang', lang);
set(lang);
}
}
};
}
export const theme = createThemeStore();
export const language = createLanguageStore();