(function () { function initSlider() { const track = document.querySelector('.slider_list') || document.querySelector('.slider_list-wrapper .w-dyn-items'); const slides = document.querySelectorAll('.slider_slide'); const prevBtn = document.querySelector('.slider_prev'); const nextBtn = document.querySelector('.slider_next'); const currentEl = document.querySelector('.slider_current'); const totalEl = document.querySelector('.slider_total'); const progressBar = document.querySelector('.slider_progress-bar'); if (!track || slides.length === 0) { console.warn('Slider init failed: elements not found'); return; } let currentIndex = 0; let step = 0; // ๐Ÿ‘‰ swipe state let startX = 0; let currentTranslate = 0; let isDragging = false; let movedBy = 0; function isMobile() { return window.innerWidth <= 991; } function updateSizes() { const slide = slides[0]; const style = window.getComputedStyle(track); const gap = parseInt(style.gap || style.columnGap || 24); const width = slide.offsetWidth; step = width + gap; } function updateSlider() { track.style.transition = 'transform 0.4s ease'; track.style.transform = `translateX(-${currentIndex * step}px)`; slides.forEach(el => el.classList.remove('is-active')); if (slides[currentIndex]) { slides[currentIndex].classList.add('is-active'); } if (currentEl) { currentEl.textContent = String(currentIndex + 1).padStart(2, '0'); } if (totalEl) { totalEl.textContent = String(slides.length).padStart(2, '0'); } if (progressBar) { const percent = ((currentIndex + 1) / slides.length) * 100; progressBar.style.width = percent + "%"; } if (prevBtn) { prevBtn.style.pointerEvents = currentIndex === 0 ? "none" : "auto"; prevBtn.style.opacity = currentIndex === 0 ? "0.3" : "1"; } if (nextBtn) { nextBtn.style.pointerEvents = currentIndex >= slides.length - 1 ? "none" : "auto"; nextBtn.style.opacity = currentIndex >= slides.length - 1 ? "0.3" : "1"; } } function goNext() { if (currentIndex < slides.length - 1) { currentIndex++; updateSlider(); } } function goPrev() { if (currentIndex > 0) { currentIndex--; updateSlider(); } } // ๐Ÿ‘‰ SWIPE LOGIC function touchStart(event) { if (!isMobile()) return; isDragging = true; startX = event.touches ? event.touches[0].clientX : event.clientX; currentTranslate = -currentIndex * step; track.style.transition = 'none'; } function touchMove(event) { if (!isDragging || !isMobile()) return; const currentX = event.touches ? event.touches[0].clientX : event.clientX; movedBy = currentX - startX; track.style.transform = `translateX(${currentTranslate + movedBy}px)`; } function touchEnd() { if (!isDragging || !isMobile()) return; isDragging = false; const threshold = step * 0.2; if (movedBy < -threshold) { goNext(); } else if (movedBy > threshold) { goPrev(); } else { updateSlider(); } movedBy = 0; } // ๐Ÿ‘‰ events track.addEventListener('touchstart', touchStart); track.addEventListener('touchmove', touchMove); track.addEventListener('touchend', touchEnd); // ะผั‹ัˆัŒ (ะฟั€ะธัั‚ะฝั‹ะน ะฑะพะฝัƒั) track.addEventListener('mousedown', touchStart); track.addEventListener('mousemove', touchMove); track.addEventListener('mouseup', touchEnd); track.addEventListener('mouseleave', touchEnd); nextBtn && nextBtn.addEventListener('click', goNext); prevBtn && prevBtn.addEventListener('click', goPrev); window.addEventListener('resize', function () { updateSizes(); updateSlider(); }); // INIT updateSizes(); updateSlider(); } window.addEventListener('load', function () { setTimeout(initSlider, 100); }); })();