(filter)
| 43 | } |
| 44 | |
| 45 | function showCmdMenu(filter) { |
| 46 | const menu = $('cmd-menu'); |
| 47 | const items = COMMANDS.filter(c => c.name.includes(filter.toLowerCase())); |
| 48 | if (items.length === 0) { hideCmdMenu(); return; } |
| 49 | |
| 50 | menu.innerHTML = items.map((c, i) => |
| 51 | `<div class="cmd-item${i === 0 ? ' active' : ''}" data-cmd="${c.name}"> |
| 52 | <div class="cmd-icon">${c.icon}</div> |
| 53 | <div><div class="cmd-name">${c.name}</div><div class="cmd-desc">${c.desc}</div></div> |
| 54 | </div>` |
| 55 | ).join(''); |
| 56 | |
| 57 | menu.querySelectorAll('.cmd-item').forEach(el => { |
| 58 | el.addEventListener('click', () => execCmd(el.dataset.cmd)); |
| 59 | }); |
| 60 | |
| 61 | cmdActiveIdx = 0; |
| 62 | cmdMenuOpen = true; |
| 63 | menu.classList.add('visible'); |
| 64 | } |
| 65 | |
| 66 | function hideCmdMenu() { |
| 67 | $('cmd-menu').classList.remove('visible'); |
no test coverage detected