var module_257643504827 = (function() { // Initialize carousel for module document.addEventListener('DOMContentLoaded', function() { const moduleId = ''; const carousel = document.getElementById('carousel-' + moduleId); if (!carousel) return; // Project data const projects = [ {% for project in module.projects %} { title: "", link: "", newTab: , noFollow: }{% if not loop.last %},{% endif %} {% endfor %} ]; let currentSlide = 0; const track = document.getElementById('carousel-track-' + moduleId); const slides = track.querySelectorAll('.carousel-slide'); const prevBtn = document.getElementById('prev-btn-' + moduleId); const nextBtn = document.getElementById('next-btn-' + moduleId); const dots = document.querySelectorAll('#carousel-dots-' + moduleId + ' .carousel-dot'); const projectTitle = document.getElementById('project-title-' + moduleId); const projectLink = document.getElementById('project-link-' + moduleId); // Touch/drag variables let isDragging = false; let startPos = 0; let currentTranslate = 0; let prevTranslate = 0; let animationID = 0; let autoplayInterval = null; // Update carousel position function setSlidePosition(animate = true) { if (animate) { track.style.transition = 'transform 0.4s ease'; } else { track.style.transition = 'none'; } track.style.transform = `translateX(-${currentSlide * 100}%)`; updateContent(); updateDots(); resetAutoplay(); } // Update text content and link function updateContent() { if (!projectTitle || !projectLink) return; projectTitle.style.opacity = '0'; setTimeout(() => { projectTitle.textContent = projects[currentSlide].title; projectTitle.style.opacity = '1'; projectLink.href = projects[currentSlide].link; // Update link attributes if (projects[currentSlide].newTab) { projectLink.setAttribute('target', '_blank'); } else { projectLink.removeAttribute('target'); } if (projects[currentSlide].noFollow) { projectLink.setAttribute('rel', 'nofollow'); } else { projectLink.removeAttribute('rel'); } }, 150); } // Update dots function updateDots() { dots.forEach((dot, index) => { dot.classList.toggle('active', index === currentSlide); }); } // Next slide function nextSlide() { currentSlide = (currentSlide + 1) % slides.length; setSlidePosition(); } // Previous slide function prevSlide() { currentSlide = (currentSlide - 1 + slides.length) % slides.length; setSlidePosition(); } // Navigation buttons if (prevBtn) { prevBtn.addEventListener('click', function(e) { e.preventDefault(); prevSlide(); }); } if (nextBtn) { nextBtn.addEventListener('click', function(e) { e.preventDefault(); nextSlide(); }); } // Dot navigation dots.forEach((dot, index) => { dot.addEventListener('click', function(e) { e.preventDefault(); currentSlide = index; setSlidePosition(); }); }); // Touch/Mouse drag functionality let touchStartX = 0; let touchEndX = 0; function handleGesture() { const threshold = 50; const diff = touchStartX - touchEndX; if (Math.abs(diff) > threshold) { if (diff > 0) { nextSlide(); } else { prevSlide(); } } } carousel.addEventListener('touchstart', function(e) { touchStartX = e.changedTouches[0].screenX; }, { passive: true }); carousel.addEventListener('touchend', function(e) { touchEndX = e.changedTouches[0].screenX; handleGesture(); }, { passive: true }); // Mouse drag let mouseDown = false; let mouseStartX = 0; let mouseEndX = 0; carousel.addEventListener('mousedown', function(e) { mouseDown = true; mouseStartX = e.pageX; carousel.style.cursor = 'grabbing'; e.preventDefault(); }); carousel.addEventListener('mousemove', function(e) { if (!mouseDown) return; e.preventDefault(); }); carousel.addEventListener('mouseup', function(e) { if (!mouseDown) return; mouseDown = false; mouseEndX = e.pageX; carousel.style.cursor = 'grab'; const diff = mouseStartX - mouseEndX; if (Math.abs(diff) > 50) { if (diff > 0) { nextSlide(); } else { prevSlide(); } } }); carousel.addEventListener('mouseleave', function() { mouseDown = false; carousel.style.cursor = 'grab'; }); // Keyboard navigation document.addEventListener('keydown', function(e) { if (carousel.contains(document.activeElement) || document.activeElement === prevBtn || document.activeElement === nextBtn) { if (e.key === 'ArrowLeft') { e.preventDefault(); prevSlide(); } else if (e.key === 'ArrowRight') { e.preventDefault(); nextSlide(); } } }); // Autoplay functionality function startAutoplay() { {% if module.carousel_settings.autoplay %} autoplayInterval = setInterval(nextSlide, ); {% endif %} } function stopAutoplay() { if (autoplayInterval) { clearInterval(autoplayInterval); autoplayInterval = null; } } function resetAutoplay() { {% if module.carousel_settings.autoplay %} stopAutoplay(); startAutoplay(); {% endif %} } // Pause autoplay on hover carousel.addEventListener('mouseenter', stopAutoplay); carousel.addEventListener('mouseleave', startAutoplay); // Initialize setSlidePosition(false); startAutoplay(); }); })();