1export function modals(overlay) { 2 const modalTriggers = document.querySelectorAll('[data-modal]'); 3 modalTriggers.forEach(btn => { 4 btn.addEventListener('click', e => { 5 e.preventDefault(); 6 const modalId = btn.getAttribute('data-modal'); 7 const modal = document.getElementById(modalId); 8 modal.style.display = 'block'; 9 overlay.style.display = 'block'; 10 document.querySelector('body').classList.add('no-scroll'); 11 if (modal.classList.contains('contest-popup')) { 12 const marqueeLine = modal.querySelector('.marquee-wrapper'); 13 if (marqueeLine) { 14 const marqueeInner = marqueeLine.querySelector('.marquee-wrapper__inner'); 15 if (!marqueeInner) return; 16 function bonusMarquee() { 17 const marqueeWidth = marqueeLine.offsetWidth; 18 let innerWidth = marqueeInner.scrollWidth; 19 20 while (innerWidth < marqueeWidth * 2.5) { 21 marqueeInner.innerHTML += marqueeInner.innerHTML; 22 innerWidth = marqueeInner.scrollWidth; 23 } 24 } 25 bonusMarquee(); 26 } 27 } 28 setTimeout(() => { 29 modal.style.opacity = '1'; 30 overlay.style.opacity = '1'; 31 overlay.style.zIndex = '1000'; 32 }, (50)) 33 }); 34 }); 35 36 document.addEventListener('click', function (e) { 37 const closeBtn = e.target.closest('.modal .cancel-popup'); 38 if (!closeBtn) return; 39 40 const modal = closeBtn.closest('.modal'); 41 if (!modal) return; 42 43 modal.style.opacity = '0'; 44 overlay.style.opacity = '0'; 45 document.querySelector('body').classList.remove('no-scroll'); 46 47 if (modal.classList.contains('contest-popup')) { 48 document.querySelector('.special-contest')?.remove(); 49 } 50 51 setTimeout(() => { 52 modal.style.display = 'none'; 53 overlay.style.display = 'none'; 54 overlay.style.zIndex = '100'; 55 }, 200); 56 }); 57}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.