1const swiffyslider = function() { 2 return { 3 version: "1.6.0", 4 init(rootElement = document.body) { 5 for (let sliderElement of rootElement.querySelectorAll(".swiffy-slider")) { 6 this.initSlider(sliderElement); 7 } 8 }, 9 10 initSlider(sliderElement) { 11 for (let navElement of sliderElement.querySelectorAll(".slider-nav")) { 12 let next = navElement.classList.contains("slider-nav-next"); 13 navElement.addEventListener("click", () => this.slide(sliderElement, next), { passive: true }); 14 } 15 for (let indicatorElement of sliderElement.querySelectorAll(".slider-indicators")) { 16 indicatorElement.addEventListener("click", () => this.slideToByIndicator()); 17 this.onSlideEnd(sliderElement, () => this.handleIndicators(sliderElement), 60); 18 } 19 if (sliderElement.classList.contains("slider-nav-autoplay")) { 20 const timeout = sliderElement.getAttribute("data-slider-nav-autoplay-interval") ? sliderElement.getAttribute("data-slider-nav-autoplay-interval") : 2500; 21 this.autoPlay(sliderElement, timeout, sliderElement.classList.contains("slider-nav-autopause")); 22 } 23 if (["slider-nav-autohide", "slider-nav-animation"].some(className => sliderElement.classList.contains(className))) { 24 const threshold = sliderElement.getAttribute("data-slider-nav-animation-threshold") ? sliderElement.getAttribute("data-slider-nav-animation-threshold") : 0.3; 25 this.setVisibleSlides(sliderElement, threshold); 26 } 27 }, 28 29 setVisibleSlides(sliderElement, threshold = 0.3) { 30 let observer = new IntersectionObserver(slides => {
31 slides.forEach(slide => { 32 slide.isIntersecting ? slide.target.classList.add("slide-visible") : slide.target.classList.remove("slide-visible"); 33 }); 34 sliderElement.querySelector(".slider-container>*:first-child").classList.contains("slide-visible") ? sliderElement.classList.add("slider-item-first-visible") : sliderElement.classList.remove("slider-item-first-visible"); 35 sliderElement.querySelector(".slider-container>*:last-child").classList.contains("slide-visible") ? sliderElement.classList.add("slider-item-last-visible") : sliderElement.classList.remove("slider-item-last-visible"); 36 }, { 37 root: sliderElement.querySelector(".slider-container"), 38 threshold: threshold 39 }); 40 for (let slide of sliderElement.querySelectorAll(".slider-container>*")) 41 observer.observe(slide); 42 }, 43 44 slide(sliderElement, next = true) { 45 const container = sliderElement.querySelector(".slider-container"); 46 const fullpage = sliderElement.classList.contains("slider-nav-page"); 47 const noloop = sliderElement.classList.contains("slider-nav-noloop"); 48 const nodelay = sliderElement.classList.contains("slider-nav-nodelay"); 49 const slides = container.children; 50 const gapWidth = parseInt(window.getComputedStyle(container).columnGap); 51 const scrollStep = slides[0].offsetWidth + gapWidth; 52 let scrollLeftPosition = next ? 53 container.scrollLeft + scrollStep : 54 container.scrollLeft - scrollStep; 55 if (fullpage) { 56 scrollLeftPosition = next ? 57 container.scrollLeft + container.offsetWidth : 58 container.scrollLeft - container.offsetWidth; 59 } 60 if (container.scrollLeft < 1 && !next && !noloop) { 61 scrollLeftPosition = (container.scrollWidth - container.offsetWidth); 62 } 63 if (container.scrollLeft >= (container.scrollWidth - container.offsetWidth) && next && !noloop) { 64 scrollLeftPosition = 0; 65 } 66 container.scroll({ 67 left: scrollLeftPosition, 68 behavior: nodelay ? "auto" : "smooth" 69 }); 70 }, 71 72 slideToByIndicator() { 73 const indicator = window.event.target; 74 const indicatorIndex = Array.from(indicator.parentElement.children).indexOf(indicator); 75 const indicatorCount = indicator.parentElement.children.length; 76 const sliderElement = indicator.closest(".swiffy-slider"); 77 const slideCount = sliderElement.querySelector(".slider-container").children.length; 78 const relativeSlideIndex = (slideCount / indicatorCount) * indicatorIndex; 79 this.slideTo(sliderElement, relativeSlideIndex); 80 }, 81 82 slideTo(sliderElement, slideIndex) { 83 const container = sliderElement.querySelector(".slider-container"); 84 const gapWidth = parseInt(window.getComputedStyle(container).columnGap); 85 const scrollStep = container.children[0].offsetWidth + gapWidth; 86 const nodelay = sliderElement.classList.contains("slider-nav-nodelay"); 87 container.scroll({ 88 left: (scrollStep * slideIndex), 89 behavior: nodelay ? "auto" : "smooth" 90 }); 91 }, 92 93 onSlideEnd(sliderElement, delegate, timeout = 125) { 94 let isScrolling; 95 sliderElement.querySelector(".slider-container").addEventListener("scroll", function() { 96 window.clearTimeout(isScrolling); 97 isScrolling = setTimeout(delegate, timeout); 98 }, { capture: false, passive: true }); 99 }, 100 101 autoPlay(sliderElement, timeout, autopause) { 102 timeout = timeout < 750 ? 750 : timeout; 103 let autoplayTimer = setInterval(() => this.slide(sliderElement), timeout); 104 const autoplayer = () => this.autoPlay(sliderElement, timeout, autopause); 105 if (autopause) { 106 ["mouseover", "touchstart"].forEach(function(event) { 107 sliderElement.addEventListener(event, function() { 108 window.clearTimeout(autoplayTimer); 109 }, { once: true, passive: true }); 110 }); 111 ["mouseout", "touchend"].forEach(function(event) { 112 sliderElement.addEventListener(event, function() { 113 autoplayer(); 114 }, { once: true, passive: true }); 115 }); 116 } 117 return autoplayTimer; 118 }, 119 120 handleIndicators(sliderElement) { 121 if (!sliderElement) return; 122 const container = sliderElement.querySelector(".slider-container"); 123 const slidingAreaWidth = container.scrollWidth - container.offsetWidth; 124 const percentSlide = (container.scrollLeft / slidingAreaWidth); 125 for (let scrollIndicatorContainers of sliderElement.querySelectorAll(".slider-indicators")) { 126 let scrollIndicators = scrollIndicatorContainers.children; 127 let activeIndicator = Math.abs(Math.round((scrollIndicators.length - 1) * percentSlide)); 128 for (let element of scrollIndicators) 129 element.classList.remove("active"); 130 scrollIndicators[activeIndicator].classList.add("active"); 131 } 132 } 133 }; 134}(); 135 136window.swiffyslider = swiffyslider; 137swiffyslider.init(); 138const sliderElement = document.querySelector(".swiffy-slider"); 139if (sliderElement) { 140 swiffyslider.slideTo(sliderElement, 0); 141}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.