Spaces:
Running
Running
| document.addEventListener('DOMContentLoaded', () => { | |
| const slides = document.querySelectorAll('.slide'); | |
| const totalSlides = slides.length; | |
| let currentSlideIndex = 0; | |
| const progressFill = document.getElementById('progressFill'); | |
| const slideCounter = document.getElementById('slideCounter'); | |
| const nextBtn = document.getElementById('nextBtn'); | |
| const prevBtn = document.getElementById('prevBtn'); | |
| const blobs = document.querySelectorAll('.blob'); | |
| function updateSlide() { | |
| slides.forEach((slide, index) => { | |
| slide.classList.remove('active'); | |
| if (index === currentSlideIndex) { | |
| slide.classList.add('active'); | |
| } | |
| }); | |
| // Update progress bar | |
| const progress = ((currentSlideIndex + 1) / totalSlides) * 100; | |
| progressFill.style.width = `${progress}%`; | |
| // Update slide counter text | |
| const currentCount = (currentSlideIndex + 1).toString().padStart(2, '0'); | |
| const totalCount = totalSlides.toString().padStart(2, '0'); | |
| slideCounter.textContent = `${currentCount} / ${totalCount}`; | |
| // Update button states | |
| prevBtn.disabled = currentSlideIndex === 0; | |
| nextBtn.disabled = currentSlideIndex === totalSlides - 1; | |
| prevBtn.style.opacity = prevBtn.disabled ? '0.2' : '1'; | |
| nextBtn.style.opacity = nextBtn.disabled ? '0.2' : '1'; | |
| // Background parallax effect | |
| blobs.forEach((blob, i) => { | |
| const shiftX = (currentSlideIndex / totalSlides) * 100 * (i === 0 ? 1 : -1); | |
| const shiftY = (currentSlideIndex / totalSlides) * 50 * (i === 0 ? -1 : 1); | |
| blob.style.transform = `translate(${shiftX}px, ${shiftY}px)`; | |
| }); | |
| } | |
| function nextSlide() { | |
| if (currentSlideIndex < totalSlides - 1) { | |
| currentSlideIndex++; | |
| updateSlide(); | |
| } else { | |
| // Flash effect for end of presentation | |
| document.body.style.backgroundColor = 'rgba(6, 182, 212, 0.1)'; | |
| setTimeout(() => { | |
| document.body.style.backgroundColor = '#020617'; | |
| }, 200); | |
| } | |
| } | |
| function prevSlide() { | |
| if (currentSlideIndex > 0) { | |
| currentSlideIndex--; | |
| updateSlide(); | |
| } | |
| } | |
| // Click handlers | |
| nextBtn.addEventListener('click', nextSlide); | |
| prevBtn.addEventListener('click', prevSlide); | |
| // Keyboard handlers | |
| document.addEventListener('keydown', (e) => { | |
| if (e.key === 'ArrowRight' || e.key === ' ' || e.key === 'ArrowDown') { | |
| e.preventDefault(); | |
| nextSlide(); | |
| } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') { | |
| e.preventDefault(); | |
| prevSlide(); | |
| } | |
| }); | |
| // Touch support (simple swipe) | |
| let touchstartX = 0; | |
| let touchendX = 0; | |
| document.addEventListener('touchstart', (e) => { | |
| touchstartX = e.changedTouches[0].screenX; | |
| }); | |
| document.addEventListener('touchend', (e) => { | |
| touchendX = e.changedTouches[0].screenX; | |
| handleSwipe(); | |
| }); | |
| function handleSwipe() { | |
| if (touchendX < touchstartX - 50) nextSlide(); | |
| if (touchendX > touchstartX + 50) prevSlide(); | |
| } | |
| // Init | |
| updateSlide(); | |
| }); | |