@@ -369,20 +369,61 @@ document.addEventListener('DOMContentLoaded', () => {
369369 }
370370 tabs . forEach ( tab => tab . addEventListener ( 'click' , ( ) => { tabs . forEach ( t => t . classList . remove ( 'active' ) ) ; tab . classList . add ( 'active' ) ; applyFilter ( tab . getAttribute ( 'data-category' ) || 'all' ) ; } ) ) ;
371371
372- // Modal helpers
373- let removeTrap = null ;
374- function openProjectSafe ( name , trigger ) {
375- if ( ! modal || ! modalBody ) return ;
376- lastFocusedElement = trigger || document . activeElement ;
377- if ( modalTitle && trigger ) {
378- const card = trigger . closest ( '.project-card' ) ;
379- const h = card ?. querySelector ( 'h3' ) ?. textContent ?. trim ( ) ;
380- modalTitle . textContent = h || ( name || 'Project' ) ;
381- }
382- modal . classList . add ( 'active' ) ;
383- modal . setAttribute ( 'aria-hidden' , 'false' ) ;
384- document . body . style . overflow = 'hidden' ;
385- setMainInert ( true ) ;
372+ // Random Project Generator
373+ const randomProjectBtn = document . getElementById ( 'randomProjectBtn' ) ;
374+
375+ function getRandomProject ( ) {
376+ // Get all visible project cards (based on current filter)
377+ const visibleCards = Array . from ( projectCards ) . filter ( card => {
378+ return card . style . display !== 'none' ;
379+ } ) ;
380+
381+ if ( visibleCards . length === 0 ) {
382+ // If no cards are visible (shouldn't happen), get all cards
383+ return projectCards [ Math . floor ( Math . random ( ) * projectCards . length ) ] ;
384+ }
385+
386+ return visibleCards [ Math . floor ( Math . random ( ) * visibleCards . length ) ] ;
387+ }
388+
389+ function selectRandomProject ( ) {
390+ const randomCard = getRandomProject ( ) ;
391+
392+ // Add shuffle animation to the button
393+ randomProjectBtn . classList . add ( 'shuffle' ) ;
394+
395+ // Remove animation class after it completes
396+ setTimeout ( ( ) => {
397+ randomProjectBtn . classList . remove ( 'shuffle' ) ;
398+ } , 600 ) ;
399+
400+ // Open the random project after a short delay for effect
401+ setTimeout ( ( ) => {
402+ const projectName = randomCard . getAttribute ( 'data-project' ) ;
403+ openProject ( projectName ) ;
404+
405+ // Optional: Scroll to project card smoothly
406+ randomCard . scrollIntoView ( { behavior : 'smooth' , block : 'nearest' } ) ;
407+ } , 300 ) ;
408+ }
409+
410+ randomProjectBtn . addEventListener ( 'click' , selectRandomProject ) ;
411+
412+ // Open Project Modal
413+ projectCards . forEach ( card => {
414+ const playButton = card . querySelector ( '.btn-play' ) ;
415+
416+ playButton . addEventListener ( 'click' , ( e ) => {
417+ e . stopPropagation ( ) ;
418+ const projectName = card . getAttribute ( 'data-project' ) ;
419+ openProject ( projectName ) ;
420+ } ) ;
421+
422+ card . addEventListener ( 'click' , ( ) => {
423+ const projectName = card . getAttribute ( 'data-project' ) ;
424+ openProject ( projectName ) ;
425+ } ) ;
426+ } ) ;
386427
387428 // load content safely
388429 safeRun ( ( ) => {
0 commit comments