|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
|
window.ModalSystem = {
|
|
|
overlay: null,
|
|
|
content: null,
|
|
|
container: null,
|
|
|
closeBtn: null,
|
|
|
isOpen: false,
|
|
|
currentModal: null,
|
|
|
|
|
|
init: function() {
|
|
|
this.overlay = document.getElementById('modal-overlay');
|
|
|
if (!this.overlay) return;
|
|
|
|
|
|
this.content = document.getElementById('modal-content');
|
|
|
this.container = this.overlay.querySelector('.bg-white');
|
|
|
this.closeBtn = document.getElementById('modal-close');
|
|
|
|
|
|
this.bindEvents();
|
|
|
},
|
|
|
bindEvents: function() {
|
|
|
if (this.closeBtn) {
|
|
|
this.closeBtn.addEventListener('click', () => this.close());
|
|
|
}
|
|
|
this.overlay.addEventListener('click', (e) => {
|
|
|
if (e.target === this.overlay) {
|
|
|
this.close();
|
|
|
}
|
|
|
});
|
|
|
|
|
|
document.addEventListener('keydown', (e) => {
|
|
|
if (e.key === 'Escape' && this.isOpen) {
|
|
|
this.close();
|
|
|
}
|
|
|
});
|
|
|
|
|
|
document.addEventListener('click', (e) => {
|
|
|
const modalTrigger = e.target.closest('[data-modal]');
|
|
|
if (modalTrigger) {
|
|
|
e.preventDefault();
|
|
|
const modalName = modalTrigger.getAttribute('data-modal');
|
|
|
this.open(modalName);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
document.addEventListener('click', (e) => {
|
|
|
if (e.target.closest('[data-modal-close]')) {
|
|
|
e.preventDefault();
|
|
|
this.close();
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
|
|
|
|
|
|
open: function(modalName) {
|
|
|
if (this.isOpen) {
|
|
|
this.close();
|
|
|
}
|
|
|
|
|
|
const template = document.getElementById(`modal-template-${modalName}`);
|
|
|
if (!template) {
|
|
|
console.error(`модальное окно ${modalName} не найдено`);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
this.currentModal = modalName;
|
|
|
this.content.innerHTML = template.innerHTML;
|
|
|
this.show();
|
|
|
},
|
|
|
|
|
|
show: function() {
|
|
|
|
|
|
this.overlay.classList.remove('opacity-0', 'invisible');
|
|
|
this.overlay.classList.add('opacity-100', 'visible');
|
|
|
|
|
|
|
|
|
setTimeout(() => {
|
|
|
this.container.classList.remove('scale-90');
|
|
|
this.container.classList.add('scale-100');
|
|
|
}, 10);
|
|
|
|
|
|
this.isOpen = true;
|
|
|
|
|
|
setTimeout(() => {
|
|
|
this.closeBtn.focus();
|
|
|
}, 350);
|
|
|
},
|
|
|
|
|
|
close: function() {
|
|
|
if (!this.isOpen) return;
|
|
|
|
|
|
this.container.classList.remove('scale-100');
|
|
|
this.container.classList.add('scale-90');
|
|
|
|
|
|
this.overlay.classList.remove('opacity-100', 'visible');
|
|
|
this.overlay.classList.add('opacity-0', 'invisible');
|
|
|
|
|
|
this.isOpen = false;
|
|
|
this.currentModal = null;
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
getState: function() {
|
|
|
return {
|
|
|
isOpen: this.isOpen,
|
|
|
currentModal: this.currentModal
|
|
|
};
|
|
|
}
|
|
|
};
|
|
|
|
|
|
ModalSystem.init();
|
|
|
|
|
|
window.openModal = function(modalName) {
|
|
|
ModalSystem.open(modalName);
|
|
|
};
|
|
|
|
|
|
window.closeModal = function() {
|
|
|
ModalSystem.close();
|
|
|
};
|
|
|
}); |