const KeyboardShortcuts=(function(){'use strict';const MODIFIER_KEYS={ctrl:'ctrlKey',alt:'altKey',shift:'shiftKey',meta:'metaKey',cmd:'metaKey',command:'metaKey',option:'altKey'};const KEY_ALIASES={'esc':'Escape','escape':'Escape','enter':'Enter','return':'Enter','space':' ','spacebar':' ','up':'ArrowUp','down':'ArrowDown','left':'ArrowLeft','right':'ArrowRight','delete':'Delete','del':'Delete','backspace':'Backspace','tab':'Tab','home':'Home','end':'End','pageup':'PageUp','pagedown':'PageDown'};const IGNORED_ELEMENTS=['INPUT','TEXTAREA','SELECT'];const shortcuts=new Map();let initialized=false;function parseShortcut(shortcut){const parts=shortcut.toLowerCase().split('+').map(p=>p.trim());const modifiers=new Set();let key='';for(const part of parts){if(MODIFIER_KEYS[part]){modifiers.add(MODIFIER_KEYS[part]);}else{key=KEY_ALIASES[part]||part;}}
return{modifiers,key};}
function getShortcutId(event){const parts=[];if(event.ctrlKey)parts.push('ctrl');if(event.altKey)parts.push('alt');if(event.shiftKey)parts.push('shift');if(event.metaKey)parts.push('meta');let key=event.key.toLowerCase();if(key===' ')key='space';parts.push(key);return parts.join('+');}
function shouldIgnore(event,options){if(!options.allowInInputs){const target=event.target;if(IGNORED_ELEMENTS.includes(target.tagName)){return true;}
if(target.isContentEditable){return true;}}
return false;}
function handleKeydown(event){const id=getShortcutId(event);const shortcutData=shortcuts.get(id);if(!shortcutData)return;const{callback,options}=shortcutData;if(shouldIgnore(event,options))return;if(options.preventDefault){event.preventDefault();}
if(options.stopPropagation){event.stopPropagation();}
try{callback(event);}catch(error){console.error(`[KeyboardShortcuts] 执行快捷键 "${id}" 时出错:`,error);}}
return{init:function(){if(initialized)return;document.addEventListener('keydown',handleKeydown);initialized=true;this.registerDefaults();console.log('[KeyboardShortcuts] 已初始化');},register:function(shortcut,callback,options={}){const defaultOptions={preventDefault:true,stopPropagation:false,allowInInputs:false};const mergedOptions={...defaultOptions,...options};const{modifiers,key}=parseShortcut(shortcut);const parts=[];if(modifiers.has('ctrlKey'))parts.push('ctrl');if(modifiers.has('altKey'))parts.push('alt');if(modifiers.has('shiftKey'))parts.push('shift');if(modifiers.has('metaKey'))parts.push('meta');parts.push(key.toLowerCase());const id=parts.join('+');if(shortcuts.has(id)){console.warn(`[KeyboardShortcuts] 快捷键 "${shortcut}" 已存在,将被覆盖`);}
shortcuts.set(id,{callback,options:mergedOptions});console.debug(`[KeyboardShortcuts] 注册: ${id}`);},unregister:function(shortcut){const{modifiers,key}=parseShortcut(shortcut);const parts=[];if(modifiers.has('ctrlKey'))parts.push('ctrl');if(modifiers.has('altKey'))parts.push('alt');if(modifiers.has('shiftKey'))parts.push('shift');if(modifiers.has('metaKey'))parts.push('meta');parts.push(key.toLowerCase());const id=parts.join('+');if(shortcuts.delete(id)){console.debug(`[KeyboardShortcuts] 注销: ${id}`);}},registerDefaults:function(){this.register('escape',()=>{const settingsPanel=document.getElementById('settings-panel');if(settingsPanel&&settingsPanel.classList.contains('show')){settingsPanel.classList.remove('show');settingsPanel.classList.add('hidden');return;}
const imageModal=document.getElementById('image-modal');if(imageModal&&imageModal.classList.contains('show')){imageModal.classList.remove('show');return;}});const submitShortcut=navigator.platform.includes('Mac')?'meta+enter':'ctrl+enter';this.register(submitShortcut,()=>{const submitBtn=document.getElementById('submit-btn');if(submitBtn&&!submitBtn.disabled){submitBtn.click();}},{allowInInputs:true});const helpShortcut=navigator.platform.includes('Mac')?'meta+/':'ctrl+/';this.register(helpShortcut,()=>{this.showHelp();});const settingsShortcut=navigator.platform.includes('Mac')?'meta+,':'ctrl+,';this.register(settingsShortcut,()=>{const settingsBtn=document.getElementById('settings-btn');if(settingsBtn)settingsBtn.click();});this.register('t',()=>{if(typeof ThemeManager!=='undefined'){ThemeManager.toggle();}});this.register('tab',(event)=>{const tabs=document.querySelectorAll('.task-tab:not(.hidden)');if(tabs.length>1){event.preventDefault();const currentIndex=Array.from(tabs).findIndex(tab=>tab.classList.contains('active'));const nextIndex=(currentIndex+1)%tabs.length;tabs[nextIndex].click();}});this.register('shift+tab',(event)=>{const tabs=document.querySelectorAll('.task-tab:not(.hidden)');if(tabs.length>1){event.preventDefault();const currentIndex=Array.from(tabs).findIndex(tab=>tab.classList.contains('active'));const prevIndex=(currentIndex-1+tabs.length)%tabs.length;tabs[prevIndex].click();}});},showHelp:function(){const isMac=navigator.platform.includes('Mac');const mod=isMac?'⌘':'Ctrl';const alt=isMac?'⌥':'Alt';const helpText=`
╔══════════════════════════════════════╗
║ ⌨️ 键盘快捷键帮助 ║
╠══════════════════════════════════════╣
║ ${mod}+Enter 提交反馈 ║
║ ${mod}+, 打开设置 ║
║ ${mod}+/ 显示此帮助 ║
║ T 切换主题 ║
║ Tab 下一个任务 ║
║ Shift+Tab 上一个任务 ║
║ Escape 关闭弹窗/面板 ║
╚══════════════════════════════════════╝
`.trim();console.log(helpText);if(typeof notificationManager!=='undefined'){notificationManager.sendNotification('⌨️ 快捷键',`${mod}+Enter 提交 | T 切换主题 | Esc 关闭弹窗`,{tag:'keyboard-help',requireInteraction:false});}},getAll:function(){return new Map(shortcuts);},destroy:function(){document.removeEventListener('keydown',handleKeydown);shortcuts.clear();initialized=false;console.log('[KeyboardShortcuts] 已销毁');}};})();document.addEventListener('DOMContentLoaded',()=>{KeyboardShortcuts.init();});if(typeof module!=='undefined'&&module.exports){module.exports=KeyboardShortcuts;}