/** * YCat Theme System — LIGHT / DARK / AUTO * - 三态:light / dark / auto(跟随系统) * - 持久化到 localStorage('ycat-theme') * - 同步更新右上角 #themeToggle 按钮图标与文案 * - 移除旧版「强制浅色」guard,允许暗色生效 */ (function () { const STORAGE_KEY = 'ycat-theme'; const MODES = ['light', 'dark', 'auto']; function sysPref() { try { return (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) ? 'dark' : 'light'; } catch (e) { return 'light'; } } function apply(mode) { const eff = (mode === 'auto') ? sysPref() : mode; document.documentElement.setAttribute('data-theme', eff); try { localStorage.setItem(STORAGE_KEY, mode); } catch (e) {} const btn = document.getElementById('themeToggle'); if (btn) { btn.dataset.mode = mode; const ic = btn.querySelector('i'); if (ic) ic.className = 'fa-solid ' + (mode === 'light' ? 'fa-sun' : mode === 'dark' ? 'fa-moon' : 'fa-circle-half-stroke'); btn.title = '主题:' + (mode === 'light' ? '浅色' : mode === 'dark' ? '深色' : '跟随系统'); } } function current() { try { return localStorage.getItem(STORAGE_KEY) || 'light'; } catch (e) { return 'light'; } } window.setTheme = function (m) { if (MODES.indexOf(m) >= 0) apply(m); }; window.cycleTheme = function () { const i = MODES.indexOf(current()); apply(MODES[(i + 1) % MODES.length]); }; window.getCurrentTheme = current; // 兼容旧调用 window.toggleTheme = window.cycleTheme; let saved = current(); apply(saved); // 跟随系统时实时切换 if (window.matchMedia) { try { const mq = window.matchMedia('(prefers-color-scheme: dark)'); const onChange = function () { if (current() === 'auto') apply('auto'); }; if (mq.addEventListener) mq.addEventListener('change', onChange); else if (mq.addListener) mq.addListener(onChange); } catch (e) {} } // 移动端菜单(保留) window.toggleMobileMenu = function () { const nav = document.querySelector('.header-nav'); if (nav) nav.classList.toggle('mobile-open'); }; document.addEventListener('click', function (e) { const nav = document.querySelector('.header-nav'); if (nav && e.target.closest('.header-nav a')) nav.classList.remove('mobile-open'); }); document.addEventListener('click', function (e) { const nav = document.querySelector('.header-nav'); if (nav && nav.classList.contains('mobile-open') && !e.target.closest('.header-nav') && !e.target.closest('.mobile-menu-btn')) { nav.classList.remove('mobile-open'); } }); })();