1/** 2* Template Name: Selecao - v4.9.1 3* Template URL: https://bootstrapmade.com/selecao-bootstrap-template/ 4* Author: BootstrapMade.com 5* License: https://bootstrapmade.com/license/ 6*/ 7(function() { 8 "use strict"; 9 10 /** 11 * Easy selector helper function 12 */ 13 const select = (el, all = false) => { 14 el = el.trim() 15 if (all) { 16 return [...document.querySelectorAll(el)] 17 } else { 18 return document.querySelector(el) 19 } 20 } 21 22 /** 23 * Easy event listener function 24 */ 25 const on = (type, el, listener, all = false) => { 26 let selectEl = select(el, all) 27 if (selectEl) { 28 if (all) { 29 selectEl.forEach(e => e.addEventListener(type, listener)) 30 } else { 31 selectEl.addEventListener(type, listener) 32 } 33 } 34 } 35 36 /** 37 * Easy on scroll event listener 38 */ 39 const onscroll = (el, listener) => { 40 el.addEventListener('scroll', listener) 41 } 42 43 /** 44 * Navbar links active state on scroll 45 */ 46 let navbarlinks = select('#navbar .scrollto', true) 47 const navbarlinksActive = () => { 48 let position = window.scrollY + 200 49 navbarlinks.forEach(navbarlink => { 50 if (!navbarlink.hash) return 51 let section = select(navbarlink.hash) 52 if (!section) return 53 if (position >= section.offsetTop && position <= (section.offsetTop + section.offsetHeight)) { 54 navbarlink.classList.add('active') 55 } else { 56 navbarlink.classList.remove('active') 57 } 58 }) 59 } 60 window.addEventListener('load', navbarlinksActive) 61 onscroll(document, navbarlinksActive) 62 63 /** 64 * Scrolls to an element with header offset 65 */ 66 const scrollto = (el) => { 67 let header = select('#header') 68 let offset = header.offsetHeight 69 70 let elementPos = select(el).offsetTop 71 window.scrollTo({ 72 top: elementPos - offset, 73 behavior: 'smooth' 74 }) 75 } 76 77 /** 78 * Toggle .header-scrolled class to #header when page is scrolled 79 */ 80 let selectHeader = select('#header') 81 if (selectHeader) { 82 const headerScrolled = () => { 83 if (window.scrollY > 100) { 84 selectHeader.classList.add('header-scrolled') 85 } else { 86 selectHeader.classList.remove('header-scrolled') 87 } 88 } 89 window.addEventListener('load', headerScrolled) 90 onscroll(document, headerScrolled) 91 } 92 93 /** 94 * Back to top button 95 */ 96 let backtotop = select('.back-to-top') 97 if (backtotop) { 98 const toggleBacktotop = () => { 99 if (window.scrollY > 100) { 100 backtotop.classList.add('active') 101 } else { 102 backtotop.classList.remove('active') 103 } 104 } 105 window.addEventListener('load', toggleBacktotop) 106 onscroll(document, toggleBacktotop) 107 } 108 109 /** 110 * Mobile nav toggle 111 */ 112 on('click', '.mobile-nav-toggle', function(e) { 113 select('#navbar').classList.toggle('navbar-mobile') 114 this.classList.toggle('bi-list') 115 this.classList.toggle('bi-x') 116 }) 117 118 /** 119 * Mobile nav dropdowns activate 120 */ 121 on('click', '.navbar .dropdown > a', function(e) { 122 if (select('#navbar').classList.contains('navbar-mobile')) { 123 e.preventDefault() 124 this.nextElementSibling.classList.toggle('dropdown-active') 125 } 126 }, true) 127 128 /** 129 * Scrool with ofset on links with a class name .scrollto 130 */ 131 on('click', '.scrollto', function(e) { 132 if (select(this.hash)) { 133 e.preventDefault() 134 135 let navbar = select('#navbar') 136 if (navbar.classList.contains('navbar-mobile')) { 137 navbar.classList.remove('navbar-mobile') 138 let navbarToggle = select('.mobile-nav-toggle') 139 navbarToggle.classList.toggle('bi-list') 140 navbarToggle.classList.toggle('bi-x') 141 } 142 scrollto(this.hash) 143 } 144 }, true) 145 146 /** 147 * Scroll with ofset on page load with hash links in the url 148 */ 149 window.addEventListener('load', () => { 150 if (window.location.hash) { 151 if (select(window.location.hash)) { 152 scrollto(window.location.hash) 153 } 154 } 155 }); 156 157 /** 158 * Porfolio isotope and filter 159 */ 160 window.addEventListener('load', () => { 161 let portfolioContainer = select('.portfolio-container'); 162 if (portfolioContainer) { 163 let portfolioIsotope = new Isotope(portfolioContainer, { 164 itemSelector: '.portfolio-item', 165 }); 166 167 let portfolioFilters = select('#portfolio-flters li', true); 168 169 on('click', '#portfolio-flters li', function(e) { 170 e.preventDefault();
171 portfolioFilters.forEach(function(el) { 172 el.classList.remove('filter-active'); 173 }); 174 this.classList.add('filter-active'); 175 176 portfolioIsotope.arrange({ 177 filter: this.getAttribute('data-filter') 178 }); 179 portfolioIsotope.on('arrangeComplete', function() { 180 AOS.refresh() 181 }); 182 }, true); 183 } 184 185 }); 186 187 /** 188 * Initiate portfolio lightbox 189 */ 190 const portfolioLightbox = GLightbox({ 191 selector: '.portfolio-lightbox' 192 }); 193 194 /** 195 * Portfolio details slider 196 */ 197 new Swiper('.portfolio-details-slider', { 198 speed: 400, 199 loop: true, 200 autoplay: { 201 delay: 5000, 202 disableOnInteraction: false 203 }, 204 pagination: { 205 el: '.swiper-pagination', 206 type: 'bullets', 207 clickable: true 208 } 209 }); 210 211 /** 212 * Testimonials slider 213 */ 214 new Swiper('.testimonials-slider', { 215 speed: 600, 216 loop: true, 217 autoplay: { 218 delay: 5000, 219 disableOnInteraction: false 220 }, 221 slidesPerView: 'auto', 222 pagination: { 223 el: '.swiper-pagination', 224 type: 'bullets', 225 clickable: true 226 }, 227 breakpoints: { 228 320: { 229 slidesPerView: 1, 230 spaceBetween: 20 231 }, 232 233 1200: { 234 slidesPerView: 3, 235 spaceBetween: 20 236 } 237 } 238 }); 239 240 /** 241 * Animation on scroll 242 */ 243 window.addEventListener('load', () => { 244 AOS.init({ 245 duration: 1000, 246 easing: 'ease-in-out', 247 once: true, 248 mirror: false 249 }) 250 }); 251 252})()
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.