1addEventListener('page:loaded', function() { 2 initGsap(); 3 initLenis(); 4 initImages(); 5 initHeadroom(); 6 initFancybox(); 7 initMarquee(); 8 initForm(); 9 initBackToTop(); 10}); 11 12function initGsap() { 13 if(typeof ScrollTrigger !== 'undefined') { gsap.registerPlugin(ScrollTrigger); } 14 if(typeof SplitText !== 'undefined') { gsap.registerPlugin(SplitText); } 15 if(typeof GSDevTools !== 'undefined') { gsap.registerPlugin(GSDevTools); } 16 17 // GSDevTools.create(); 18} 19 20function initLenis() { 21 // Init lenis 22 window.scroll = new Lenis() 23 window.scroll.on('scroll', (e) => { 24 //console.log(e) 25 }) 26 window.scroll.on('scroll', ScrollTrigger.update) 27 gsap.ticker.add((time)=>{ 28 window.scroll.raf(time * 1000) 29 }) 30 gsap.ticker.lagSmoothing(0); 31 32 // Handle anchors 33 document.querySelectorAll('*[href*="#"]').forEach(function(el) { 34 el.addEventListener('click', function(e) { 35 const offset = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--header-h')); 36 const target = el.getAttribute('href'); 37 const hash = '#'+target.split('#')[1]; 38 39 if(target.charAt(0) == '#') { 40 e.preventDefault(); 41 window.scroll.scrollTo(hash, { offset: -offset }); 42 } else { 43 const actualPathname = window.location.pathname; 44 const targetPathname = new URL(target).pathname 45 if(actualPathname == targetPathname) { 46 e.preventDefault(); 47 window.scroll.scrollTo(hash, { offset: -offset }); 48 } 49 } 50 }); 51 }) 52} 53 54// Initialisation du lazyload 55function initImages() { 56 const imagesToResize = document.querySelectorAll('img[sizes]'); 57 addEventListener('resize', function(e) { 58 imagesToResize.forEach(function(el) { 59 const width = el.clientWidth; 60 el.sizes = width+'px'; 61 }) 62 }); 63} 64 65// Gestion de l'entête sticky. 66function initHeadroom() { 67 let offset = 0; 68 69 let el = document.body; 70 setClasses(0, 0); 71 72 ScrollTrigger.create({ 73 trigger: el, 74 start: 'top+='+offset+' top', 75 end: 'bottom bottom', 76 onEnter: function(self) { 77 setClasses(self.progress, self.direction) 78 }, 79 onUpdate: function(self) { 80 setClasses(self.progress, self.direction); 81 } 82 }); 83 84 function setClasses(progress, direction) { 85 switch(progress) { 86 case 0: 87 el.classList.remove('not-top'); 88 el.classList.add('top'); 89 break; 90 case 1: 91 el.classList.remove('top'); 92 el.classList.add('bottom'); 93 break; 94 default: 95 el.classList.remove('top'); 96 el.classList.add('not-top'); 97 break; 98 } 99 100 switch(direction) { 101 case 1: 102 el.classList.remove('pinned'); 103 el.classList.add('unpinned'); 104 break; 105 default: 106 el.classList.remove('unpinned'); 107 el.classList.add('pinned'); 108 break; 109 } 110 } 111} 112 113// Initialisation du fancybox 114function initFancybox() { 115 if (typeof Fancybox !== "undefined") { 116 Fancybox.bind("[data-fancybox]", { 117 118 }); 119 } 120} 121 122// Initialisation d'un marquee 123function initMarquee() { 124 if (typeof Marquee3k !== "undefined") { 125 Marquee3k.init(); 126 } 127} 128 129// Gestion des classes sur un formulaire 130function initForm() { 131 132 // Ajout / suppression d'une classe active lors du focus d'un élément 133 document.querySelectorAll('input:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]), select, textarea').forEach(function(el) { 134 el.addEventListener('focus', function(e) { 135 const field = e.target.closest('.field'); 136 if(!field) return; 137 field.classList.add('field-focus'); 138 }); 139 el.addEventListener('focusout', function(e) { 140 const field = e.target.closest('.field'); 141 if(!field) return; 142 field.classList.remove('field-focus'); 143 if(e.target.value) { 144 field.classList.add('field-filled'); 145 } else { 146 field.classList.remove('field-filled'); 147 } 148 }); 149 });
150 151 // Champs invalides après soumission 152 addEventListener('ajax:invalid-field', function(e) { 153 const { element, fieldName, fieldMessages, isFirst } = e.detail; 154 const field = element.closest('.field'); 155 if(!field) return; 156 field.classList.add('field-error'); 157 }); 158 159 // Nettoyage des champs au moment de la validation 160 addEventListener('ajax:promise', function(e) { 161 if(e.target.tagName == 'FORM') { 162 e.target.closest('form').querySelectorAll('.field-error').forEach(function(el) { 163 el.classList.remove('field-error'); 164 }); 165 } 166 }); 167 168 // On réinitialise la fonction en cas de refresh ajax 169 addEventListener('ajax:update-complete', function(e) { 170 // Refresh form 171 initForm(); 172 // Refresh scroll trigger 173 if(typeof ScrollTrigger !== 'undefined') { ScrollTrigger.refresh() } 174 }); 175 176} 177 178// Affichage d'un lien vers le haut de page 179function initBackToTop() { 180 var offset = 1000; 181 var selector = document.getElementById('backtotop'); 182 if(selector) { 183 window.addEventListener('scroll', function() { 184 scrollTop = window.scrollY; 185 if (scrollTop > offset) { 186 selector.classList.add('visible'); 187 } else { 188 selector.classList.remove('visible'); 189 } 190 }); 191 } 192} 193 194// Fonction utilitaire pour calculer une valeur avec Gsap 195function calculateVar(progress, x, y, start, end) { 196 return progress < start ? x : x + (y - x) * (Math.min(progress, 1) - start) / (end - start); 197} 198// Lorsque le DOM est prêt 199addEventListener('page:loaded', function() { 200 initSwipers(); 201 initButtons(); 202 initGsap(); 203 initVideos(); 204}); 205 206window.document.addEventListener('offline.boxes.editorRefreshed', function (e) { 207 initSwipers(); 208 initButtons(); 209 initGsap(); 210 initVideos(); 211}); 212 213 214function initSwipers() { 215 // Hero accueil 216 document.querySelectorAll('.box-hero-1, .box-hero-2').forEach(function(el, index) { 217 new Swiper(el.querySelector('.swiper'), { 218 speed: 750, 219 spaceBetween: 4, 220 slidesPerView: 1, 221 rewind: true, 222 centeredSlides: false, 223 autoplay: false, 224 pagination: { 225 el: el.querySelector('.swiper-pagination'), 226 clickable: true, 227 }, 228 breakpoints: { 229 575: { 230 slidesPerView: 1, 231 }, 232 768: { 233 slidesPerView: 1, 234 }, 235 991: { 236 slidesPerView: 1, 237 centeredSlides: false, 238 autoplay: { 239 delay: 3000, 240 }, 241 }, 242 1200: { 243 slidesPerView: 2, 244 }, 245 1400: { 246 slidesPerView: 2, 247 }, 248 } 249 }); 250 }); 251 252 // Text images 253 document.querySelectorAll('.box-text-2, .box-text-3').forEach(function(el, index) { 254 new Swiper(el.querySelector('.swiper'), { 255 speed: 750, 256 spaceBetween: 16, 257 slidesPerView: 1, 258 pagination: { 259 el: el.querySelector('.swiper-pagination'), 260 clickable: true, 261 }, 262 navigation: { 263 prevEl: el.querySelector('.prev'), 264 nextEl: el.querySelector('.next'), 265 }, 266 breakpoints: { 267 575: { 268 269 }, 270 768: { 271 272 }, 273 991: { 274 275 }, 276 1200: { 277 278 }, 279 1400: { 280 281 }, 282 } 283 }); 284 }); 285 286 // Liste de vignettes 287 document.querySelectorAll('.box-list-2').forEach(function(el, index) { 288 new Swiper(el.querySelector('.swiper'), { 289 speed: 750, 290 spaceBetween: 16, 291 slidesPerView: 1.2, 292 initialSlide: el.querySelectorAll('.swiper-slide').length - 1, 293 breakpoints: { 294 575: { 295 slidesPerView: 2.2, 296 }, 297 768: { 298 slidesPerView: 1.5, 299 }, 300 991: { 301 slidesPerView: 1.5, 302 }, 303 1200: { 304 slidesPerView: 2, 305 }, 306 1400: { 307 slidesPerView: 2.5, 308 }, 309 1800: { 310 slidesPerView: 3.5, 311 }, 312 } 313 }); 314 });
315 316 document.querySelectorAll('.box-list-4').forEach(function(el, index) { 317 const cols = el.dataset.cols; 318 new Swiper(el.querySelector('.swiper'), { 319 speed: 750, 320 spaceBetween: 16, 321 slidesPerView: 1.2, 322 pagination: { 323 el: el.querySelector('.swiper-pagination'), 324 clickable: true, 325 }, 326 breakpoints: { 327 575: { 328 slidesPerView: cols / 3, 329 }, 330 768: { 331 slidesPerView: cols / 2.5, 332 }, 333 991: { 334 slidesPerView: cols / 2, 335 }, 336 1400: { 337 slidesPerView: cols, 338 }, 339 } 340 }); 341 }); 342 343 document.querySelectorAll('.box-list-7').forEach(function(el, index) { 344 new Swiper(el.querySelector('.swiper'), { 345 speed: 750, 346 spaceBetween: 16, 347 slidesPerView: 1, 348 pagination: { 349 el: el.querySelector('.swiper-pagination'), 350 clickable: true, 351 }, 352 breakpoints: { 353 575: { 354 slidesPerView: 1.2, 355 }, 356 768: { 357 slidesPerView: 1.5, 358 }, 359 991: { 360 slidesPerView: 1.5, 361 }, 362 1200: { 363 slidesPerView: 2, 364 }, 365 1400: { 366 slidesPerView: 2.5, 367 }, 368 1800: { 369 slidesPerView: 3.5, 370 }, 371 } 372 }); 373 }); 374 375 // Actualités 376 document.querySelectorAll('.box-blog-1').forEach(function(el, index) { 377 new Swiper(el.querySelector('.swiper'), { 378 speed: 750, 379 spaceBetween: 48, 380 slidesPerView: 1, 381 // slidesPerGroup: 3, 382 autoplay: { 383 delay: 4000, 384 }, 385 pagination: { 386 el: el.querySelector('.swiper-pagination'), 387 clickable: true, 388 }, 389 breakpoints: { 390 575: { 391 slidesPerView: 1.5, 392 }, 393 768: { 394 slidesPerView: 1.8, 395 }, 396 991: { 397 slidesPerView: 2.2, 398 }, 399 1200: { 400 slidesPerView: 2.6, 401 }, 402 1400: { 403 slidesPerView: 3.8, 404 }, 405 } 406 }); 407 }); 408 409 // Liste de logos 410 document.querySelectorAll('.box-logos-1').forEach(function(el, index) { 411 const cols = el.dataset.cols; 412 new Swiper(el.querySelector('.swiper'), { 413 speed: 750, 414 spaceBetween: 64, 415 slidesPerView: 'auto', 416 // centeredSlides: true, 417 navigation: { 418 prevEl: el.querySelector('.prev'), 419 nextEl: el.querySelector('.next'), 420 }, 421 pagination: { 422 el: el.querySelector('.swiper-pagination'), 423 clickable: true, 424 }, 425 /* 426 breakpoints: { 427 575: { 428 slidesPerView: 2, 429 }, 430 768: { 431 slidesPerView: 3, 432 }, 433 991: { 434 slidesPerView: 3, 435 }, 436 1200: { 437 slidesPerView: 4, 438 }, 439 1400: { 440 slidesPerView: 5, 441 }, 442 } 443 */ 444 }); 445 }); 446 447 // Témoignages 448 document.querySelectorAll('.box-testimonials-1').forEach(function(el, index) { 449 new Swiper(el.querySelector('.swiper'), { 450 speed: 750, 451 spaceBetween: 16, 452 slidesPerView: 1, 453 autoHeight: true, 454 // slidesPerGroup: 3, 455 navigation: { 456 prevEl: el.querySelector('.prev'), 457 nextEl: el.querySelector('.next'), 458 }, 459 pagination: { 460 el: el.querySelector('.swiper-pagination'), 461 clickable: true, 462 }, 463 }); 464 });
465 466 // Blog 467 document.querySelectorAll('.box-blog-slider').forEach(function(el, index) { 468 const cols = el.dataset.cols; 469 new Swiper(el.querySelector('.swiper'), { 470 speed: 750, 471 spaceBetween: 24, 472 slidesPerView: cols, 473 rewind: true, 474 autoplay: { 475 delay: 4000, 476 }, 477 navigation: { 478 prevEl: el.querySelector('.swiper-button-prev'), 479 nextEl: el.querySelector('.swiper-button-next'), 480 }, 481 scrollbar: { 482 el: el.querySelector('.swiper-scrollbar'), 483 draggable: true, 484 }, 485 }); 486 }); 487 488 489 // Actualités 490 document.querySelectorAll('.box-blog-related').forEach(function(el, index) { 491 new Swiper(el.querySelector('.swiper'), { 492 speed: 750, 493 spaceBetween: 16, 494 slidesPerView: 3.8, 495 // slidesPerGroup: 3, 496 navigation: { 497 prevEl: el.querySelector('.prev'), 498 nextEl: el.querySelector('.next'), 499 }, 500 }); 501 }); 502} 503 504function initButtons() { 505 document.querySelectorAll('.btn').forEach(function (el) { 506 const text = el.innerHTML; 507 508 el.innerHTML = `<div class="btn-inner"><span>${text}</span><span>${text}</span></div>`; // Ajoute les spans avec le texte répété 509 }); 510} 511 512 513function initGsap() { 514 // Liste de vignettes (variante 2) 515 document.querySelectorAll('.box-hero-1').forEach(function(el, index) { 516 /* 517 gsap.fromTo('.box-hero-1', 518 { 519 x: '75%', 520 }, 521 { 522 x: '-25%', 523 scrollTrigger: { 524 trigger: '.bigtitle', 525 scrub: 1, 526 }, 527 } 528 ); 529 */ 530 /* 531 const swiper = el.querySelector('.swiper'); 532 ScrollTrigger.create({ 533 trigger: el.querySelector('.slider'), 534 //start: 'top top', 535 //endTrigger: '#otherID', 536 //end: 'bottom 50%+=100px', 537 //onToggle: (self) => console.log('toggled, isActive:', self.isActive), 538 onUpdate: (self) => { 539 swiper.setProgress(self.progress.toFixed(3)); 540 console.log( 541 'progress:', 542 self.progress.toFixed(3), 543 'direction:', 544 self.direction, 545 'velocity', 546 self.getVelocity() 547 ); 548 } 549 }); 550 */ 551 }); 552} 553 554function initVideos() { 555 document.querySelectorAll('.video-js').forEach(function(el) { 556 const player = videojs(document.querySelector('.video-js')); 557 player.on('play', function(e) { 558 el.parentNode.classList.remove('overlay-20'); 559 }); 560 player.on('pause', function(e) { 561 el.parentNode.classList.add('overlay-20'); 562 }); 563 564 }) 565 566}
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.