const ThemeManager=(function(){'use strict';const STORAGE_KEY='theme-preference';const THEMES={DARK:'dark',LIGHT:'light',AUTO:'auto'};let currentTheme=THEMES.AUTO;let systemPreference=null;let mediaQuery=null;function detectSystemPreference(){if(window.matchMedia&&window.matchMedia('(prefers-color-scheme: light)').matches){return THEMES.LIGHT;}
return THEMES.DARK;}
function listenSystemPreference(){if(!window.matchMedia)return;mediaQuery=window.matchMedia('(prefers-color-scheme: light)');const handleChange=(e)=>{systemPreference=e.matches?THEMES.LIGHT:THEMES.DARK;console.log('系统主题偏好变更:',systemPreference);if(currentTheme===THEMES.AUTO){applyTheme(systemPreference);}};if(mediaQuery.addEventListener){mediaQuery.addEventListener('change',handleChange);}else if(mediaQuery.addListener){mediaQuery.addListener(handleChange);}
systemPreference=detectSystemPreference();}
function applyTheme(theme){const html=document.documentElement;const effectiveTheme=theme===THEMES.AUTO?systemPreference:theme;if(effectiveTheme===THEMES.DARK){html.removeAttribute('data-theme');}else{html.setAttribute('data-theme',effectiveTheme);}
updateMetaThemeColor(effectiveTheme);window.dispatchEvent(new CustomEvent('theme-changed',{detail:{theme:effectiveTheme,mode:theme}}));console.log('主题已应用:',effectiveTheme,'(模式:',theme+')');}
function updateMetaThemeColor(theme){let metaThemeColor=document.querySelector('meta[name="theme-color"]');if(!metaThemeColor){metaThemeColor=document.createElement('meta');metaThemeColor.name='theme-color';document.head.appendChild(metaThemeColor);}
metaThemeColor.content=theme===THEMES.LIGHT?'#f8fafc':'#1a1a1f';}
function savePreference(theme){try{localStorage.setItem(STORAGE_KEY,theme);}catch(e){console.warn('无法保存主题偏好到 localStorage:',e);}}
function loadPreference(){try{return localStorage.getItem(STORAGE_KEY);}catch(e){console.warn('无法从 localStorage 加载主题偏好:',e);return null;}}
async function syncToServer(theme){try{const response=await fetch('/api/update-notification-config',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({theme_preference:theme})});if(!response.ok){console.warn('同步主题到服务端失败:',response.status);}}catch(e){console.debug('同步主题到服务端失败:',e);}}
function createToggleButton(){const button=document.createElement('button');button.className='theme-toggle-btn';button.setAttribute('aria-label','切换主题');button.setAttribute('title','切换主题');button.innerHTML=`
<svg class="theme-icon theme-icon-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<circle cx="12" cy="12" r="5"/>
<line x1="12" y1="1" x2="12" y2="3"/>
<line x1="12" y1="21" x2="12" y2="23"/>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/>
<line x1="1" y1="12" x2="3" y2="12"/>
<line x1="21" y1="12" x2="23" y2="12"/>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/>
</svg>
<svg class="theme-icon theme-icon-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
</svg>
`;button.addEventListener('click',()=>{const effectiveTheme=currentTheme===THEMES.AUTO?systemPreference:currentTheme;const newTheme=effectiveTheme===THEMES.DARK?THEMES.LIGHT:THEMES.DARK;currentTheme=newTheme;savePreference(newTheme);applyTheme(newTheme);updateToggleButton();});return button;}
function updateToggleButton(){const effectiveTheme=currentTheme===THEMES.AUTO?systemPreference:currentTheme;const buttons=document.querySelectorAll('.theme-toggle-btn');buttons.forEach(button=>{button.classList.toggle('is-light',effectiveTheme===THEMES.LIGHT);});}
function bindExistingButtons(){const buttons=document.querySelectorAll('.theme-toggle-btn');buttons.forEach(button=>{if(!button.hasAttribute('data-theme-bound')){button.addEventListener('click',()=>{const effectiveTheme=currentTheme===THEMES.AUTO?systemPreference:currentTheme;const newTheme=effectiveTheme===THEMES.DARK?THEMES.LIGHT:THEMES.DARK;currentTheme=newTheme;savePreference(newTheme);applyTheme(newTheme);updateToggleButton();});button.setAttribute('data-theme-bound','true');console.debug('主题切换按钮已绑定:',button.id||'(无ID)');}});}
return{init:function(options={}){const{syncToServer:doSync=false,defaultTheme=THEMES.AUTO}=options;listenSystemPreference();const savedTheme=loadPreference();currentTheme=savedTheme||defaultTheme;applyTheme(currentTheme);updateToggleButton();bindExistingButtons();console.log('主题管理器已初始化:',currentTheme);},setTheme:function(theme){if(!Object.values(THEMES).includes(theme)){console.warn('无效的主题:',theme);return;}
currentTheme=theme;savePreference(theme);applyTheme(theme);updateToggleButton();},toggle:function(){const effectiveTheme=currentTheme===THEMES.AUTO?systemPreference:currentTheme;const newTheme=effectiveTheme===THEMES.DARK?THEMES.LIGHT:THEMES.DARK;this.setTheme(newTheme);},getTheme:function(){return currentTheme;},getEffectiveTheme:function(){return currentTheme===THEMES.AUTO?systemPreference:currentTheme;},insertToggleButton:function(container){const target=typeof container==='string'?document.querySelector(container):container;if(target){const button=createToggleButton();target.appendChild(button);updateToggleButton();}},THEMES:THEMES};})();document.addEventListener('DOMContentLoaded',()=>{ThemeManager.init();});if(typeof module!=='undefined'&&module.exports){module.exports=ThemeManager;}