// фон const overlay = makeOverlay(200); let isOpen = false, closing = false; function openPanel(){ if(isOpen) return; isOpen = true; panel.classList.remove(ANIM_OUT); panel.classList.add(OPEN_CLS,'animate__animated',ANIM_IN); overlay.style.display = 'block'; if (isMobile()) document.body.classList.add(BODY_LOCK); // убрать классы анимации после показа setTimeout(()=>panel.classList.remove('animate__animated',ANIM_IN),300); } function closePanel(){ if(!isOpen || closing) return; closing = true; panel.classList.add('animate__animated',ANIM_OUT); setTimeout(()=>{ panel.classList.remove(ANIM_OUT,OPEN_CLS,'animate__animated'); overlay.style.display = 'none'; document.body.classList.remove(BODY_LOCK); isOpen = false; closing = false; },200); } function togglePanel(){ isOpen ? closePanel() : openPanel(); } function isMobile(){ return /Android|webOS|iPhone|iPad|iPod/i.test(navigator.userAgent) || (navigator.maxTouchPoints && navigator.maxTouchPoints>1); } // ===== Поведение как в Annexx ===== if(!isMobile()){ // Desktop: hover для открытия triggers.forEach(t=>{ t.addEventListener('mouseenter', openPanel); // если ушли с триггера и не в панель — закрыть t.addEventListener('mouseleave', e=>{ // короткая задержка, чтобы успеть навести на панель setTimeout(()=>{ if(!panel.matches(':hover')) closePanel(); }, 120); }); }); // уход мыши с панели — закрыть panel.addEventListener('mouseleave', closePanel); } else { // Mobile: tap toggle triggers.forEach(t=>{ t.style.cursor = 'pointer'; t.addEventListener('touchstart', e=>{ e.preventDefault(); togglePanel(); }, {passive:false}); t.addEventListener('click', e=>{ e.preventDefault(); togglePanel(); }); }); } // Клик/тап по подложке — закрыть ['click','touchstart'].forEach(ev=>{ overlay.addEventListener(ev, (e)=>{ e.preventDefault(); closePanel(); }, {passive:false}); }); // ESC для закрытия document.addEventListener('keydown', (e)=>{ if(e.key==='Escape') closePanel(); }); // Клик по ссылкам внутри панели — закрыть (как linkclose:true) panel.addEventListener('click', (e)=>{ const a = e.target.closest('a'); if(a && !a.target){ closePanel(); } }); }); })();