1// /components/swiper-slideshow/slideshowv2.js 2// Requires jQuery and Swiper to be loaded BEFORE this file. 3 4(function (global, $) { 5 'use strict'; 6 7 function parseBool(v) { 8 return v === true || v === 'true' || v === '1'; 9 } 10 11 function parseIntOr(v, fallback) { 12 var n = parseInt(v, 10); 13 return isNaN(n) ? fallback : n; 14 } 15 16 function initElement(el) { 17 var $el = $(el); 18 var $wrapper = $el.closest('.slideshowv2-swiper'); 19 if (!$wrapper.length) return null; 20 21 // Avoid double initialization 22 if (el.swiper) { 23 el.swiper.destroy(true, true); 24 } 25 26 var selector = '#' + el.id; 27 var ds = el.dataset || {}; 28 29 var slidesPerView = parseIntOr(ds.slidesPerView, 1); 30 31 var config = { 32 effect: ds.effect || 'slide', 33 speed: parseIntOr(ds.speed, 400), 34 loop: parseBool(ds.loop), 35 autoHeight: parseBool(ds.autoHeight), 36 slidesPerView: slidesPerView, 37 preloadImages: false, 38 lazy: true, 39 breakpoints: { 40 880: { slidesPerView: 1 } 41 }, 42 watchOverflow: true, 43 touchEventsTarget: 'wrapper', 44 centeredSlides: true 45 }; 46 47 // Pagination 48 if (parseBool(ds.pager)) { 49 config.pagination = { 50 el: selector + ' .swiper-pagination', 51 clickable: true 52 }; 53 } 54 55 // Next/Prev controls 56 if (parseBool(ds.controls)) { 57 config.navigation = { 58 nextEl: selector + ' .swiper-button-next', 59 prevEl: selector + ' .swiper-button-prev' 60 }; 61 } 62 63 // Autoplay + related flags 64 var auto = parseBool(ds.auto); 65 var pause = parseIntOr(ds.pause, 5000); 66 var autoStart = ds.autoStart === undefined ? true : parseBool(ds.autoStart); 67 var autoHover = parseBool(ds.autoHover); 68 var autoControls = parseBool(ds.autoControls); 69 var autoControlsCombine = parseBool(ds.autoControlsCombine); 70 71 var startText = ds.startText || 'Play'; 72 var stopText = ds.stopText || 'Pause'; 73 74 if (auto) { 75 config.autoplay = { delay: pause }; 76 } 77 78 // Create Swiper instance 79 var swiper = new Swiper(el, config); 80 el.swiper = swiper; 81 82 // Re-init helper if needed later 83 $wrapper.data('reinit', function () { 84 var swiperParams = el.swiper.params; 85 if (el.swiper) el.swiper.destroy(true, true); 86 var reinitSwiper = new Swiper(el, swiperParams); 87 el.swiper = reinitSwiper; 88 }); 89 90 // Stop autoplay initially if requested 91 if (auto && !autoStart && swiper.autoplay) { 92 swiper.autoplay.stop(); 93 } 94 95 // Hover pause/resume (if no manual controls) 96 if (auto && autoHover && autoStart && !autoControls) { 97 $wrapper.hover( 98 function () { 99 if (swiper.autoplay) swiper.autoplay.stop(); 100 }, 101 function () { 102 if (swiper.autoplay) swiper.autoplay.start(); 103 } 104 ); 105 } 106 107 // Autoplay controls combined wrapper or separate buttons 108 if (auto && autoControls) { 109 var startSelector, stopSelector; 110 111 if (autoControlsCombine) { 112 startSelector = selector + ' ~ .swiper-auto-combined .swiper-auto-start'; 113 stopSelector = selector + ' ~ .swiper-auto-combined .swiper-auto-stop'; 114 } else { 115 startSelector = selector + ' ~ .swiper-auto-buttons .swiper-auto-start'; 116 stopSelector = selector + ' ~ .swiper-auto-buttons .swiper-auto-stop'; 117 } 118 119 var $startBtn = $(startSelector); 120 var $stopBtn = $(stopSelector); 121 122 $startBtn.on('click', function () { 123 if (!swiper.autoplay) return; 124 125 // If already active, do nothing 126 if ($startBtn.hasClass('__active')) return; 127 128 swiper.autoplay.start(); 129 130 $startBtn 131 .addClass('__active') 132 .attr('aria-pressed', 'true'); 133 134 $stopBtn 135 .removeClass('__active') 136 .attr('aria-pressed', 'false'); 137 }); 138 139 $stopBtn.on('click', function () { 140 if (!swiper.autoplay) return; 141 142 if ($stopBtn.hasClass('__active')) return; 143 144 swiper.autoplay.stop(); 145 146 $stopBtn 147 .addClass('__active') 148 .attr('aria-pressed', 'true'); 149 150 $startBtn 151 .removeClass('__active') 152 .attr('aria-pressed', 'false'); 153 }); 154 } 155 156 // Accessibility: Enter/Space triggers click on controls 157 $( 158 selector + ' ~ .swiper-auto-combined .swiper-auto-button, ' + 159 selector + ' ~ .swiper-auto-buttons .swiper-auto-start, ' + 160 selector + ' ~ .swiper-auto-buttons .swiper-auto-stop, ' + 161 selector + ' .swiper-button-next, ' + 162 selector + ' .swiper-button-prev' 163 ).on('keydown', function (e) { 164 if (e.key === 'Enter' || e.key === ' ') { 165 e.preventDefault(); 166 $(this).trigger('click'); 167 } 168 }); 169 170 return swiper; 171 } 172 173 function initAll() {
174 var nodes = document.querySelectorAll('[data-slideshowv2="true"]'); 175 nodes.forEach(initElement); 176 } 177 178 // Expose API + auto-init 179 global.SlideshowV2 = { 180 initElement: initElement, 181 initAll: initAll 182 }; 183 184 $(function () { 185 if (!global.Swiper) return; 186 initAll(); 187 }); 188 189})(window, jQuery);
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.