|
177 | 177 | const listOut = document.getElementById('searchresults-outer'); |
178 | 178 | const header = document.getElementById('searchresults-header'); |
179 | 179 | const icon = document.getElementById('search-toggle'); |
180 | | - |
181 | | - const READY_ICON = icon.innerHTML; |
| 180 | + |
| 181 | + if(!wrap || !bar || !list || !listOut || !header || !icon) { |
| 182 | + console.error('[HT Search] Missing DOM elements:', {wrap:!!wrap, bar:!!bar, list:!!list, listOut:!!listOut, header:!!header, icon:!!icon}); |
| 183 | + return; |
| 184 | + } |
| 185 | + |
| 186 | + /* Clear icon content and use emoji states directly */ |
182 | 187 | icon.textContent = '⏳'; |
183 | 188 | icon.setAttribute('aria-label','Loading search …'); |
184 | | - icon.setAttribute('title','Search is loading, please wait...'); |
| 189 | + icon.setAttribute('title','Search is loading, please wait...'); |
| 190 | + |
| 191 | + const setIconState = state => { |
| 192 | + if(state === 'ready'){ |
| 193 | + icon.textContent = '🔍'; |
| 194 | + icon.setAttribute('aria-label','Open search (S)'); |
| 195 | + icon.removeAttribute('title'); |
| 196 | + } else if(state === 'error'){ |
| 197 | + icon.textContent = '❌'; |
| 198 | + icon.setAttribute('aria-label','Search unavailable'); |
| 199 | + icon.setAttribute('title','Search is unavailable'); |
| 200 | + } else { |
| 201 | + icon.textContent = '⏳'; |
| 202 | + icon.setAttribute('aria-label','Loading search …'); |
| 203 | + icon.setAttribute('title','Search is loading, please wait...'); |
| 204 | + } |
| 205 | + }; |
185 | 206 |
|
186 | 207 |
|
187 | 208 | const HOT=83, ESC=27, DOWN=40, UP=38, ENTER=13; |
|
240 | 261 | /* ───────────── worker messages ───────────── */ |
241 | 262 | worker.onmessage = ({data}) => { |
242 | 263 | if(data && data.ready!==undefined){ |
243 | | - if(data.ready){ |
244 | | - icon.innerHTML=READY_ICON; |
245 | | - icon.setAttribute('aria-label','Open search (S)'); |
246 | | - icon.removeAttribute('title'); |
247 | | - } |
248 | | - else { |
249 | | - icon.textContent='❌'; |
250 | | - icon.setAttribute('aria-label','Search unavailable'); |
251 | | - icon.setAttribute('title','Search is unavailable'); |
252 | | - } |
| 264 | + setIconState(data.ready ? 'ready' : 'error'); |
253 | 265 | return; |
254 | 266 | } |
255 | 267 | const docs=data, q=bar.value.trim(), terms=q.split(/\s+/).filter(Boolean); |
|
0 commit comments