/** * Netflix 2025 Info Modal Component * Premium, cinematic modal with video preview and rich metadata */ export function createInfoModal(video, onClose, onPlay, recommendations = []) { const modal = document.createElement('div'); modal.className = 'modal modal--info active'; modal.id = `modal-${video.id}`; const backdropUrl = video.backdrop || video.thumbnail; const isSeries = video.type === 'series' || video.category?.toLowerCase() === 'series'; modal.innerHTML = ` `; // Event Listeners modal.querySelector('.modal__close').addEventListener('click', () => onClose(modal)); modal.querySelector('.modal__backdrop').addEventListener('click', () => onClose(modal)); modal.querySelector('[data-action="play"]').addEventListener('click', () => onPlay(video)); // Autoplay header video const headerVideo = modal.querySelector('.modal__header-preview'); const headerImg = modal.querySelector('.modal__header-img'); if (headerVideo) { setTimeout(() => { headerVideo.play().then(() => { headerImg.style.opacity = '0'; headerVideo.style.opacity = '1'; }).catch(e => console.log('Autoplay failed', e)); }, 1000); } // Recommendation card clicks modal.querySelectorAll('.recommendation-card').forEach(card => { card.addEventListener('click', () => { const vidId = card.dataset.videoId; const targetVid = recommendations.find(r => r.id == vidId); if (targetVid) { // In a real app, we might navigate or open another modal onPlay(targetVid); } }); }); // Episode row clicks modal.querySelectorAll('.episode-row').forEach(row => { row.addEventListener('click', () => { const url = row.dataset.episodeUrl; if (url) { // Create a temporary video object for the episode const episodeTitle = row.querySelector('.episode-row__title').textContent; const episodeVideo = { ...video, source_url: url, title: `${video.title}: ${episodeTitle}`, isEpisode: true }; onPlay(episodeVideo); } }); }); return modal; }