refactor: 重构配置管理移除冗余提供商配置 fix: 修复手动OAuth回调处理逻辑 style: 优化用量卡片UI增加折叠功能 perf: 提升服务启动时提供商池节点初始化效率 docs: 更新i18n翻译文本和配置说明 chore: 清理无用代码和配置文件
118 lines
No EOL
3.3 KiB
JavaScript
118 lines
No EOL
3.3 KiB
JavaScript
/**
|
|
* 主题切换模块
|
|
* 支持亮色/暗黑主题切换,并保存用户偏好到 localStorage
|
|
*/
|
|
|
|
// 主题常量
|
|
const THEME_KEY = 'theme';
|
|
const THEME_LIGHT = 'light';
|
|
const THEME_DARK = 'dark';
|
|
|
|
/**
|
|
* 获取当前主题
|
|
* @returns {string} 当前主题 ('light' 或 'dark')
|
|
*/
|
|
export function getCurrentTheme() {
|
|
// 优先从 localStorage 获取
|
|
const savedTheme = localStorage.getItem(THEME_KEY);
|
|
if (savedTheme) {
|
|
return savedTheme;
|
|
}
|
|
|
|
// 检查系统偏好
|
|
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
|
return THEME_DARK;
|
|
}
|
|
|
|
return THEME_LIGHT;
|
|
}
|
|
|
|
/**
|
|
* 设置主题
|
|
* @param {string} theme - 主题名称 ('light' 或 'dark')
|
|
*/
|
|
export function setTheme(theme) {
|
|
const root = document.documentElement;
|
|
|
|
if (theme === THEME_DARK) {
|
|
root.setAttribute('data-theme', THEME_DARK);
|
|
} else {
|
|
root.removeAttribute('data-theme');
|
|
}
|
|
|
|
// 保存到 localStorage
|
|
localStorage.setItem(THEME_KEY, theme);
|
|
|
|
// 更新 meta theme-color
|
|
updateMetaThemeColor(theme);
|
|
|
|
// 触发自定义事件
|
|
window.dispatchEvent(new CustomEvent('themechange', { detail: { theme } }));
|
|
}
|
|
|
|
/**
|
|
* 切换主题
|
|
* @returns {string} 切换后的主题
|
|
*/
|
|
export function toggleTheme() {
|
|
const currentTheme = getCurrentTheme();
|
|
const newTheme = currentTheme === THEME_DARK ? THEME_LIGHT : THEME_DARK;
|
|
setTheme(newTheme);
|
|
return newTheme;
|
|
}
|
|
|
|
/**
|
|
* 更新 meta theme-color
|
|
* @param {string} theme - 主题名称
|
|
*/
|
|
function updateMetaThemeColor(theme) {
|
|
const metaThemeColor = document.querySelector('meta[name="theme-color"]');
|
|
if (metaThemeColor) {
|
|
// 暗黑主题使用深色,亮色主题使用主色调
|
|
metaThemeColor.setAttribute('content', theme === THEME_DARK ? '#1f2937' : '#059669');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 初始化主题切换器
|
|
* @param {string} [toggleButtonId='themeToggleBtn'] - 切换按钮的 ID
|
|
*/
|
|
export function initThemeSwitcher(toggleButtonId = 'themeToggleBtn') {
|
|
// 应用保存的主题或系统偏好
|
|
const savedTheme = getCurrentTheme();
|
|
setTheme(savedTheme);
|
|
|
|
// 绑定切换按钮事件
|
|
const toggleBtn = document.getElementById(toggleButtonId);
|
|
if (toggleBtn) {
|
|
toggleBtn.addEventListener('click', () => {
|
|
const newTheme = toggleTheme();
|
|
console.log(`主题已切换为: ${newTheme === THEME_DARK ? '暗黑模式' : '亮色模式'}`);
|
|
});
|
|
}
|
|
|
|
// 监听系统主题变化
|
|
if (window.matchMedia) {
|
|
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
mediaQuery.addEventListener('change', (e) => {
|
|
// 只有在用户没有手动设置主题时才跟随系统
|
|
const savedTheme = localStorage.getItem(THEME_KEY);
|
|
if (!savedTheme) {
|
|
setTheme(e.matches ? THEME_DARK : THEME_LIGHT);
|
|
}
|
|
});
|
|
}
|
|
|
|
console.log(`主题切换器已初始化,当前主题: ${savedTheme === THEME_DARK ? '暗黑模式' : '亮色模式'}`);
|
|
}
|
|
|
|
/**
|
|
* 检查当前是否为暗黑主题
|
|
* @returns {boolean}
|
|
*/
|
|
export function isDarkTheme() {
|
|
return getCurrentTheme() === THEME_DARK;
|
|
}
|
|
|
|
// 导出常量
|
|
export { THEME_LIGHT, THEME_DARK }; |