| 141 | } |
| 142 | |
| 143 | bindEvents() { |
| 144 | // Single delegation pattern for all events |
| 145 | document.addEventListener('click', this.handleClick.bind(this)); |
| 146 | document.addEventListener('keydown', this.handleKeydown.bind(this)); |
| 147 | |
| 148 | // Close dropdowns on outside click |
| 149 | document.addEventListener('click', (e) => { |
| 150 | if (!e.target.closest('.mode-dropdown, #mode-selector-icon')) { |
| 151 | document.getElementById('mode-dropdown')?.classList.remove('show'); |
| 152 | } |
| 153 | }); |
| 154 | |
| 155 | // Sidebar toggle |
| 156 | const sidebarToggle = document.getElementById('sidebar-toggle'); |
| 157 | const sidebar = document.getElementById('sidebar'); |
| 158 | const mobileMenuToggle = document.getElementById('mobile-menu-toggle'); |
| 159 | |
| 160 | if (sidebarToggle && sidebar) { |
| 161 | // Restore sidebar state from localStorage |
| 162 | const isCollapsed = localStorage.getItem('nlweb-sidebar-collapsed') === 'true'; |
| 163 | if (isCollapsed) { |
| 164 | sidebar.classList.add('collapsed'); |
| 165 | sidebarToggle.classList.add('sidebar-collapsed'); |
| 166 | } |
| 167 | |
| 168 | // Handle sidebar toggle click |
| 169 | sidebarToggle.addEventListener('click', () => { |
| 170 | sidebar.classList.toggle('collapsed'); |
| 171 | sidebarToggle.classList.toggle('sidebar-collapsed'); |
| 172 | |
| 173 | // Save state to localStorage |
| 174 | const isCollapsed = sidebar.classList.contains('collapsed'); |
| 175 | localStorage.setItem('nlweb-sidebar-collapsed', isCollapsed); |
| 176 | }); |
| 177 | } |
| 178 | |
| 179 | // Mobile menu toggle |
| 180 | if (mobileMenuToggle && sidebar) { |
| 181 | mobileMenuToggle.addEventListener('click', () => { |
| 182 | sidebar.classList.toggle('open'); |
| 183 | }); |
| 184 | } |
| 185 | } |
| 186 | |
| 187 | handleUrlAutoQuery() { |
| 188 | // Check if there's both a site and query parameter to auto-send |