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