()
| 8315 | return randomItem; |
| 8316 | }; |
| 8317 | |
| 8318 | // Spin animation without scrolling (to avoid white flashes) |
| 8319 | for (let i = 0; i < ROULETTE_SPINS; i++) { |
| 8320 | await new Promise(resolve => setTimeout(resolve, delay)); |
| 8321 | highlightRandom(); // no scrolling on intermediate spins |
| 8322 | delay += ROULETTE_DELAY_INCREMENT; // Gradually slow down |
| 8323 | } |
| 8324 | |
| 8325 | // Final selection with scrolling. |
| 8326 | const finalItem = highlightRandom(true); |
| 8327 | const filePath = finalItem.getAttribute('data-filepath'); |
| 8328 | |
| 8329 | // Add winning animation class |
| 8330 | finalItem.classList.add('roulette-winner'); |
| 8331 | setTimeout(() => finalItem.classList.remove('roulette-winner'), 3000); |
| 8332 | |
| 8333 | // Show model details and update selection state |
| 8334 | selectedModels.add(filePath); |
| 8335 | await showModelDetails(filePath); |
| 8336 | |
| 8337 | // Show celebration message |
| 8338 | await window.electron.showMessage( |
nothing calls this directly
no test coverage detected