@@ -100,6 +100,80 @@ var selectedSuggestionIndex = -1;
100100var projectCards = [ ] ;
101101var recentSearches = JSON . parse ( localStorage . getItem ( "recentSearches" ) || "[]" ) ;
102102
103+ // ============================================
104+ // INFO MODAL FUNCTIONS - FIXED
105+ // ============================================
106+
107+ function showInfoModal ( title , steps ) {
108+ var overlay = document . getElementById ( "infoModalOverlay" ) ;
109+ var titleEl = document . getElementById ( "infoModalTitle" ) ;
110+ var listEl = document . getElementById ( "infoModalList" ) ;
111+ var closeBtn = document . getElementById ( "infoModalClose" ) ;
112+ var gotItBtn = document . getElementById ( "infoModalGotIt" ) ;
113+
114+ if ( ! overlay || ! titleEl || ! listEl ) return ;
115+
116+ titleEl . textContent = title ;
117+ listEl . innerHTML = "" ;
118+ steps . forEach ( function ( step ) {
119+ const li = document . createElement ( "li" ) ;
120+ li . textContent = step ;
121+ listEl . appendChild ( li ) ;
122+ } ) ;
123+
124+ // Show modal
125+ overlay . style . display = 'flex' ;
126+ overlay . style . visibility = 'visible' ;
127+ overlay . style . opacity = '1' ;
128+ overlay . classList . add ( "active" ) ;
129+ overlay . setAttribute ( 'aria-hidden' , 'false' ) ;
130+
131+ function closeModal ( ) {
132+ overlay . style . display = 'none' ;
133+ overlay . style . visibility = 'hidden' ;
134+ overlay . style . opacity = '0' ;
135+ overlay . classList . remove ( "active" ) ;
136+ overlay . setAttribute ( 'aria-hidden' , 'true' ) ;
137+ // Clean up event listeners
138+ if ( closeBtn ) closeBtn . removeEventListener ( "click" , closeModal ) ;
139+ if ( gotItBtn ) gotItBtn . removeEventListener ( "click" , closeModal ) ;
140+ overlay . removeEventListener ( "click" , overlayClick ) ;
141+ document . removeEventListener ( "keydown" , escapeHandler ) ;
142+ }
143+
144+ function overlayClick ( e ) {
145+ if ( e . target === overlay ) closeModal ( ) ;
146+ }
147+
148+ function escapeHandler ( e ) {
149+ if ( e . key === 'Escape' ) closeModal ( ) ;
150+ }
151+
152+ // Add event listeners
153+ if ( closeBtn ) {
154+ // Remove old listeners by cloning
155+ const newClose = closeBtn . cloneNode ( true ) ;
156+ closeBtn . parentNode . replaceChild ( newClose , closeBtn ) ;
157+ newClose . addEventListener ( "click" , function ( e ) {
158+ e . preventDefault ( ) ;
159+ e . stopPropagation ( ) ;
160+ closeModal ( ) ;
161+ } ) ;
162+ }
163+
164+ if ( gotItBtn ) {
165+ const newGotIt = gotItBtn . cloneNode ( true ) ;
166+ gotItBtn . parentNode . replaceChild ( newGotIt , gotItBtn ) ;
167+ newGotIt . addEventListener ( "click" , function ( e ) {
168+ e . preventDefault ( ) ;
169+ e . stopPropagation ( ) ;
170+ closeModal ( ) ;
171+ } ) ;
172+ }
173+
174+ overlay . addEventListener ( "click" , overlayClick ) ;
175+ document . addEventListener ( "keydown" , escapeHandler ) ;
176+ }
103177
104178// Themed confirmation modal (in-page) helper
105179function showConfirm ( message , onConfirm , onCancel ) {
0 commit comments