1document.addEventListener('DOMContentLoaded', function() { 2 const utilityNav = document.querySelector('.utility-nav'); 3 const mainNav = document.querySelector('.navbar'); 4 const mobileToggle = document.getElementById('mobileToggle'); 5 const navMenu = document.getElementById('navMenu'); 6 const navItems = Array.from(document.querySelectorAll('.nav-item')); 7 const memberNavItem = document.querySelector('.nav-item.member-click-only'); 8 const utilityMemberTrigger = document.querySelector('.utility-member-trigger'); 9 let activeDropdown = null; 10 let isMobile = window.innerWidth <= 1024; 11 const hoverCloseTimers = new WeakMap(); 12 const HOVER_CLOSE_DELAY = 140; 13 let lastScrollY = window.scrollY; 14 let scrollDirection = 0; 15 let directionDistance = 0; 16 let headerHidden = false; 17 let headerScrollThreshold = 0; 18 let scrollTicking = false; 19 20 function updateIsMobile() { 21 isMobile = window.innerWidth <= 1024; 22 } 23 24 function getHeaderHeight() { 25 const utilityHeight = utilityNav ? utilityNav.offsetHeight : 0; 26 const mainHeight = mainNav ? mainNav.offsetHeight : 0; 27 return utilityHeight + mainHeight; 28 } 29 30 function syncHeaderMetrics() { 31 const utilityHeight = utilityNav ? utilityNav.offsetHeight : 0; 32 headerScrollThreshold = getHeaderHeight(); 33 document.documentElement.style.setProperty('--header-utility-height', `${utilityHeight}px`); 34 } 35 36 function setHeaderHidden(nextHidden) { 37 if (headerHidden === nextHidden) { 38 return; 39 } 40 41 headerHidden = nextHidden; 42 document.body.classList.toggle('nav-scroll-hidden', headerHidden); 43 44 if (headerHidden) { 45 navItems.forEach(item => { 46 deactivateNavItem(item); 47 }); 48 } 49 } 50 51 function handleHeaderScroll() { 52 scrollTicking = false; 53 54 if (!mainNav) { 55 return; 56 } 57 58 if (navMenu && navMenu.classList.contains('active')) { 59 setHeaderHidden(false); 60 lastScrollY = window.scrollY; 61 scrollDirection = 0; 62 directionDistance = 0; 63 return; 64 } 65 66 const currentScrollY = Math.max(window.scrollY, 0); 67 const delta = currentScrollY - lastScrollY; 68 69 if (Math.abs(delta) < 2) { 70 return; 71 } 72 73 const nextDirection = delta > 0 ? 1 : -1; 74 75 if (nextDirection !== scrollDirection) { 76 scrollDirection = nextDirection; 77 directionDistance = 0; 78 } 79 80 directionDistance += Math.abs(delta); 81 82 const threshold = Math.max(headerScrollThreshold || getHeaderHeight(), mainNav.offsetHeight); 83 84 if (currentScrollY <= threshold) { 85 setHeaderHidden(false); 86 directionDistance = 0; 87 scrollDirection = 0; 88 } else if (nextDirection === 1 && !headerHidden && directionDistance >= threshold) { 89 setHeaderHidden(true); 90 directionDistance = 0; 91 } else if (nextDirection === -1 && headerHidden && directionDistance >= threshold) { 92 setHeaderHidden(false); 93 directionDistance = 0; 94 } 95 96 lastScrollY = currentScrollY; 97 } 98 99 function updateToggleState(targetItem) { 100 if (!targetItem) { 101 return; 102 } 103 104 const toggleButton = targetItem.querySelector('.nav-expand-toggle'); 105 if (toggleButton) { 106 const expanded = targetItem.classList.contains('active'); 107 toggleButton.setAttribute('aria-expanded', expanded ? 'true' : 'false'); 108 } 109 } 110 111 function updateSectionToggle(section) { 112 if (!section) { 113 return; 114 } 115 116 const toggle = section.querySelector('.section-toggle'); 117 if (toggle) { 118 const expanded = section.classList.contains('expanded'); 119 toggle.setAttribute('aria-expanded', expanded ? 'true' : 'false'); 120 } 121 } 122 123 function updateMemberTriggerState() { 124 if (!utilityMemberTrigger || !memberNavItem) { 125 return; 126 } 127 const expanded = memberNavItem.classList.contains('active'); 128 utilityMemberTrigger.setAttribute('aria-expanded', expanded ? 'true' : 'false'); 129 } 130 131 function clearHoverCloseTimer(navItem) { 132 const timeoutId = hoverCloseTimers.get(navItem); 133 if (timeoutId) { 134 clearTimeout(timeoutId); 135 hoverCloseTimers.delete(navItem); 136 } 137 } 138 139 function scheduleHoverClose(navItem) { 140 if (!navItem) { 141 return; 142 } 143 144 clearHoverCloseTimer(navItem); 145 const timeoutId = setTimeout(function() { 146 hoverCloseTimers.delete(navItem); 147 if (!isMobile) { 148 deactivateNavItem(navItem); 149 } 150 }, HOVER_CLOSE_DELAY); 151 hoverCloseTimers.set(navItem, timeoutId); 152 } 153 154 function deactivateNavItem(navItem) { 155 if (!navItem) { 156 return; 157 } 158 clearHoverCloseTimer(navItem); 159 navItem.classList.remove('active'); 160 if (activeDropdown === navItem) { 161 activeDropdown = null; 162 } 163 updateToggleState(navItem); 164 if (navItem === memberNavItem) { 165 updateMemberTriggerState(); 166 } 167 } 168 169 function activateNavItem(navItem) { 170 clearHoverCloseTimer(navItem);
171 navItems.forEach(item => { 172 if (item !== navItem) { 173 deactivateNavItem(item); 174 } 175 }); 176 navItem.classList.add('active'); 177 activeDropdown = navItem; 178 updateToggleState(navItem); 179 if (navItem === memberNavItem) { 180 updateMemberTriggerState(); 181 } 182 } 183 184 function toggleNavItem(navItem) { 185 if (navItem.classList.contains('active')) { 186 deactivateNavItem(navItem); 187 } else { 188 activateNavItem(navItem); 189 } 190 } 191 192 mobileToggle.addEventListener('click', function() { 193 mobileToggle.classList.toggle('active'); 194 navMenu.classList.toggle('active'); 195 setHeaderHidden(false); 196 197 if (!navMenu.classList.contains('active')) { 198 navItems.forEach(item => { 199 deactivateNavItem(item); 200 }); 201 } 202 }); 203 204 205 206 /* if (utilityMemberTrigger && memberNavItem) { 207 utilityMemberTrigger.addEventListener('click', function(e) { 208 if (isMobile) { 209 const targetHref = utilityMemberTrigger.getAttribute('data-href') || 'members.html'; 210 window.location.href = targetHref; 211 return; 212 } 213 214 e.preventDefault(); 215 e.stopPropagation(); 216 toggleNavItem(memberNavItem); 217 }); 218 } */ 219 220 if (utilityMemberTrigger && memberNavItem) { 221 utilityMemberTrigger.addEventListener('click', function() { 222 const targetHref = utilityMemberTrigger.getAttribute('data-href') || '/members/'; 223 window.location.href = targetHref; 224 }); 225 /* utilityMemberTrigger.addEventListener('click', function(e) { 226 e.preventDefault(); 227 e.stopPropagation(); 228 toggleNavItem(memberNavItem); 229 }); */ 230 231 utilityMemberTrigger.addEventListener('mouseenter', function() { 232 if (isMobile) { 233 return; 234 } 235 clearHoverCloseTimer(memberNavItem); 236 activateNavItem(memberNavItem); 237 }); 238 239 utilityMemberTrigger.addEventListener('mouseleave', function(e) { 240 if (isMobile) { 241 return; 242 } 243 const nextTarget = e.relatedTarget; 244 if (nextTarget && (utilityMemberTrigger.contains(nextTarget) || memberNavItem.contains(nextTarget))) { 245 return; 246 } 247 scheduleHoverClose(memberNavItem); 248 }); 249 } 250 251/************/ 252 253 navItems.forEach(navItem => { 254 const sections = navItem.querySelectorAll('.mega-menu-section'); 255 const megaMenu = navItem.querySelector('.mega-menu'); 256 const navLink = navItem.querySelector('.nav-link'); 257 const navTrigger = navItem.querySelector('.nav-trigger'); 258 const isDirectLink = navLink && navLink.classList.contains('nav-link-direct'); 259 const hasDropdown = navItem.classList.contains('has-dropdown'); 260 261 sections.forEach(section => { 262 const sectionToggle = section.querySelector('.section-toggle'); 263 if (sectionToggle) { 264 sectionToggle.addEventListener('click', function(e) { 265 e.preventDefault(); 266 e.stopPropagation(); 267 section.classList.toggle('expanded'); 268 updateSectionToggle(section); 269 }); 270 271 updateSectionToggle(section); 272 } 273 }); 274 275 if (navTrigger && hasDropdown) { 276 navTrigger.addEventListener('click', function(e) { 277 if (!isMobile) { 278 return; 279 } 280 if (e.target.closest('.nav-expand-toggle')) { 281 return; 282 } 283 if (e.target.closest('.nav-link')) { 284 return; 285 } 286 e.stopPropagation(); 287 toggleNavItem(navItem); 288 }); 289 } 290 291 if (hasDropdown) { 292 const hoverTargets = [navTrigger, megaMenu].filter(Boolean); 293 294 hoverTargets.forEach(target => { 295 target.addEventListener('mouseenter', function() { 296 if (isMobile) { 297 return; 298 } 299 clearHoverCloseTimer(navItem); 300 activateNavItem(navItem); 301 }); 302 303 target.addEventListener('mouseleave', function(e) { 304 if (isMobile) { 305 return; 306 } 307 const nextTarget = e.relatedTarget; 308 if (nextTarget && hoverTargets.some(hoverTarget => hoverTarget.contains(nextTarget))) { 309 return; 310 } 311 scheduleHoverClose(navItem); 312 }); 313 }); 314 } 315 316 const toggleButton = navItem.querySelector('.nav-expand-toggle'); 317 318 if (toggleButton) { 319 toggleButton.addEventListener('click', function(e) { 320 if (!isMobile) { 321 return; 322 } 323 e.preventDefault(); 324 e.stopPropagation(); 325 toggleNavItem(navItem); 326 }); 327 } 328 329 updateToggleState(navItem); 330 }); 331 332 document.addEventListener('click', function(e) { 333 const insideNav = e.target.closest('.navbar') || e.target.closest('.utility-nav') || e.target.closest('.mega-menu'); 334 if (!insideNav) {
335 navItems.forEach(item => { 336 deactivateNavItem(item); 337 }); 338 } 339 }); 340 341 let resizeTimeout; 342 window.addEventListener('resize', function() { 343 clearTimeout(resizeTimeout); 344 resizeTimeout = setTimeout(() => { 345 const wasMobile = isMobile; 346 updateIsMobile(); 347 syncHeaderMetrics(); 348 setHeaderHidden(false); 349 350 if (isMobile !== wasMobile) { 351 navMenu.classList.remove('active'); 352 mobileToggle.classList.remove('active'); 353 navItems.forEach(navItem => { 354 deactivateNavItem(navItem); 355 }); 356 } 357 }, 250); 358 }); 359 360 document.querySelectorAll('a[href^="#"]').forEach(anchor => { 361 anchor.addEventListener('click', function(e) { 362 const href = this.getAttribute('href'); 363 if (href !== '#' && href.length > 1) { 364 const target = document.querySelector(href); 365 if (target) { 366 e.preventDefault(); 367 target.scrollIntoView({ 368 behavior: 'smooth', 369 block: 'start' 370 }); 371 372 if (isMobile) { 373 navMenu.classList.remove('active'); 374 mobileToggle.classList.remove('active'); 375 navItems.forEach(item => item.classList.remove('active')); 376 } 377 } 378 } 379 }); 380 }); 381 382 syncHeaderMetrics(); 383 lastScrollY = window.scrollY; 384 385 window.addEventListener('scroll', function() { 386 if (scrollTicking) { 387 return; 388 } 389 390 scrollTicking = true; 391 window.requestAnimationFrame(handleHeaderScroll); 392 }, { passive: true }); 393 394}); 395 396 397/* const openBtn = document.querySelector(".menu-open"); 398const closeBtn = document.querySelector(".menu-close"); 399const nav = document.querySelector(".main-nav-wrap"); 400 401closeBtn.addEventListener("click", (e) => { 402nav.classList.remove("open"); 403nav.classList.add("close"); 404nav.addEventListener("transitionend", () => { 405 console.log("animation ended"); 406 nav.classList.remove("close"); 407}); 408e.preventDefault(); 409}); 410openBtn.addEventListener("click", (e) => { 411nav.classList.remove("close"); 412nav.classList.add("open"); 413e.preventDefault(); 414}); */ 415 416 /*import './style.css' 417import { gsap } from 'gsap' 418import { ScrollTrigger } from 'gsap/ScrollTrigger'*/ 419/***PIN PROJECT VIDEO***/ 420/* gsap.registerPlugin(ScrollTrigger) 421 422const imageWrapper = document.getElementById('imageWrapper') 423const video2 = document.getElementById('video2') 424 425if (imageWrapper && video2) { 426 ScrollTrigger.create({ 427 trigger: imageWrapper, 428 start: 'center center', 429 end: () => window.innerHeight * 3 + ' top', 430 pin: true, 431 pinSpacing: true, 432 markers: true 433 }) 434 435 const tl = gsap.timeline({ 436 scrollTrigger: { 437 trigger: imageWrapper, 438 start: 'center center', 439 end: () => window.innerHeight * 3 + ' top', 440 scrub: true 441 } 442 }) 443 444 tl.fromTo(imageWrapper, 445 { 446 height: getComputedStyle(imageWrapper).height, 447 clipPath: getComputedStyle(imageWrapper).clipPath 448 }, 449 { 450 height: '100vh', 451 clipPath: 'polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%)', 452 duration: 1 453 } 454 ) 455 .to(video2, { 456 clipPath: 'inset(0px 0px 0% 0px)', 457 duration: 1 458 }, '+=0.2') 459} 460 */ 461 462/* Card sorting (cards page) */ 463const cardGrid = document.querySelector('.card-grid-sortable[data-sortable]'); 464const sortButtons = document.querySelectorAll('.card-sort__btn'); 465 466if (cardGrid && sortButtons.length) { 467 const cards = Array.from(cardGrid.querySelectorAll('.sort-card')); 468 const normalizeCategoryList = (value) => { 469 if (!value) { 470 return []; 471 } 472 return value 473 .split(/[\s,]+/) 474 .map(item => item.trim()) 475 .filter(Boolean); 476 }; 477 478 sortButtons.forEach(button => { 479 button.addEventListener('click', () => { 480 const target = button.dataset.sort; 481 482 sortButtons.forEach(btn => { 483 const isTarget = btn === button; 484 btn.classList.toggle('is-active', isTarget); 485 btn.setAttribute('aria-pressed', isTarget ? 'true' : 'false'); 486 }); 487 488 cards.forEach(card => { 489 const categories = normalizeCategoryList(card.dataset.category); 490 const match = target === 'all' || categories.includes(target); 491 card.classList.toggle('is-hidden', !match); 492 }); 493 }); 494 }); 495} 496 497 498/* HERO IMAGE/VIDEO */ 499/* (function () { 500 const figure = document.querySelector('.hero__figure'); 501 if (!figure) return; 502 503 const video = figure.querySelector('.hero__media--video'); 504 if (!video) return;
504 // image-only: do nothing; image stays visible 505 506 const makeReady = () => { 507 figure.classList.add('is-video-ready'); // triggers image fade-out 508 }; 509 510 // If the video is already buffered enough 511 if (video.readyState >= 3) { // HAVE_FUTURE_DATA 512 makeReady(); 513 } else { 514 // Wait until it can play 515 video.addEventListener('canplay', makeReady, { once: true }); 516 } 517 })(); */ 518 (function () { 519 const figure = document.querySelector('.hero__figure'); 520 if (!figure) return; 521 522 const video = figure.querySelector('.hero__media--video'); 523 const source = video?.querySelector('source[data-src]'); 524 if (!video || !source) return; 525 526 const makeReady = () => { 527 figure.classList.add('is-video-ready'); 528 }; 529 530 const loadVideo = () => { 531 if (source.src) return; 532 533 source.src = source.dataset.src; 534 video.load(); 535 536 if (video.readyState >= 3) { 537 makeReady(); 538 } else { 539 video.addEventListener('canplay', makeReady, { once: true }); 540 } 541 542 video.play().catch(() => { 543 // If autoplay fails, keep the image visible. 544 }); 545 }; 546 547 if ('requestIdleCallback' in window) { 548 requestIdleCallback(loadVideo, { timeout: 800 }); 549 } else { 550 setTimeout(loadVideo, 300); 551 } 552})(); 553 554/* SEARCH MODAL */ 555 556 const searchIcon = document.querySelector('.search-icon'); 557 const searchModal = document.getElementById('searchModal'); 558 const closeBtn = searchModal.querySelector('.search-modal__close'); 559 const backdrop = searchModal.querySelector('.search-modal__backdrop'); 560 const input = searchModal.querySelector('.search-modal__input'); 561 562 function openSearchModal(event) { 563 if (event) event.preventDefault(); 564 searchModal.classList.add('is-open'); 565 document.body.classList.add('modal-open'); 566 // focus the input after open 567 setTimeout(() => input && input.focus(), 100); 568 } 569 570 function closeSearchModal() { 571 searchModal.classList.remove('is-open'); 572 document.body.classList.remove('modal-open'); 573 } 574 575 576 // Open on icon click 577 searchIcon.addEventListener('click', openSearchModal); 578 579 // Close on close button or backdrop click 580 closeBtn.addEventListener('click', closeSearchModal); 581 backdrop.addEventListener('click', closeSearchModal); 582 583 // Close on ESC key 584 document.addEventListener('keydown', (e) => { 585 if (e.key === 'Escape' && searchModal.classList.contains('is-open')) { 586 closeSearchModal(); 587 } 588 }); 589 590/* History timeline scroll interactions */ 591document.addEventListener('DOMContentLoaded', () => { 592 const timeline = document.querySelector('.history-timeline'); 593 const historyItems = gsap.utils.toArray('.history-timeline__item'); 594 const navLinks = gsap.utils.toArray('.history-nav__link'); 595 596 if (!timeline || !historyItems.length) { 597 return; 598 } 599 600 const linkById = new Map(); 601 navLinks.forEach((link) => { 602 const target = link.getAttribute('href'); 603 if (target && target.startsWith('#')) { 604 linkById.set(target.slice(1), link); 605 } 606 }); 607 608 const setActiveNav = (id) => { 609 const activeLink = linkById.get(id); 610 navLinks.forEach((link) => { 611 const isActive = link === activeLink; 612 link.classList.toggle('is-active', isActive); 613 link.setAttribute('aria-current', isActive ? 'true' : 'false'); 614 }); 615 }; 616 617 const getContentShift = (element) => { 618 const shift = window.getComputedStyle(element).getPropertyValue('--history-content-shift').trim(); 619 return shift || '0px'; 620 }; 621 622 const getFixedHeaderOffset = () => { 623 const utilityNav = document.querySelector('.utility-nav'); 624 const mainNav = document.querySelector('.navbar'); 625 const utilityHeight = utilityNav ? utilityNav.offsetHeight : 0; 626 const mainHeight = mainNav ? mainNav.offsetHeight : 0; 627 return utilityHeight + mainHeight; 628 }; 629 630 const getActivationLine = () => { 631 const headerOffset = getFixedHeaderOffset(); 632 const viewportTarget = window.innerHeight * 0.32; 633 const minLine = headerOffset + 24; 634 const maxLine = window.innerHeight - 140; 635 return Math.min(Math.max(minLine, viewportTarget), maxLine); 636 }; 637 638 navLinks.forEach((link) => { 639 link.addEventListener('click', (event) => { 640 const targetId = link.getAttribute('href'); 641 const target = targetId ? document.querySelector(targetId) : null; 642 643 if (target) { 644 event.preventDefault(); 645 const offset = getActivationLine(); 646 const y = target.getBoundingClientRect().top + window.pageYOffset - offset; 647 window.scrollTo({ top: y, behavior: 'smooth' }); 648 } 649 }); 650 }); 651
652 historyItems.forEach((item, index) => { 653 const media = item.querySelector('.history-timeline__media'); 654 const content = item.querySelector('.history-timeline__content'); 655 const offsetY = index % 2 === 0 ? -80 : 80; 656 const contentShift = content ? getContentShift(content) : '0px'; 657 658 gsap.set(media, { autoAlpha: 0, y: offsetY, scale: 0.9 }); 659 gsap.set(content, { autoAlpha: 0, y: offsetY * 0.7, scale: 0.97, x: contentShift }); 660 661 gsap.timeline({ 662 scrollTrigger: { 663 trigger: item, 664 start: 'top 60%', 665 end: 'bottom 60%', 666 toggleActions: 'play none none reverse', 667 /* markers: true */ 668 } 669 }) 670 .to(media, { autoAlpha: 1, y: 0, scale: 1, duration: 0.9, ease: 'power2.out' }) 671 .to(content, { autoAlpha: 1, y: 0, scale: 1, x: contentShift, duration: 0.85, ease: 'power2.out' }, '-=0.45'); 672 673 ScrollTrigger.create({ 674 trigger: item, 675 start: () => `top ${getActivationLine()}px`, 676 end: () => `bottom ${getActivationLine()}px`, 677 onEnter: () => item.id && setActiveNav(item.id), 678 onEnterBack: () => item.id && setActiveNav(item.id), 679 onLeave: (self) => { 680 if (self.direction === 1 && item === historyItems[historyItems.length - 1] && item.id) {
681 setActiveNav(item.id); 682 } 683 }, 684 onLeaveBack: (self) => { 685 if (self.direction === -1 && item === historyItems[0] && item.id) { 686 setActiveNav(item.id); 687 } 688 } 689 }); 690 }); 691 692 if (historyItems[0] && historyItems[0].id) { 693 setActiveNav(historyItems[0].id); 694 } 695 696 const syncContentShifts = () => { 697 historyItems.forEach((item) => { 698 const content = item.querySelector('.history-timeline__content'); 699 if (!content) return; 700 const contentShift = getContentShift(content); 701 gsap.set(content, { x: contentShift }); 702 }); 703 }; 704 705 let resizeTimeout; 706 window.addEventListener('resize', () => { 707 window.clearTimeout(resizeTimeout); 708 resizeTimeout = window.setTimeout(() => { 709 syncContentShifts(); 710 ScrollTrigger.refresh(); 711 }, 150); 712 }); 713}); 714 715/******** SIDEBAR MEMBER NAV *************/ 716 717document.addEventListener('DOMContentLoaded', function() { 718 const sidebarNav = document.querySelector('.sidebar-nav'); 719 if (!sidebarNav) { 720 return; 721 } 722 723 function getFixedHeaderOffset() { 724 const utilityNav = document.querySelector('.utility-nav'); 725 const mainNav = document.querySelector('.navbar'); 726 const utilityHeight = utilityNav ? utilityNav.offsetHeight : 0; 727 const mainHeight = mainNav ? mainNav.offsetHeight : 0; 728 return utilityHeight + mainHeight + 12; 729 } 730 731 function updateSidebarToggle(section) { 732 if (!section) { 733 return; 734 } 735 736 const toggle = section.querySelector('.sidebar-nav-toggle'); 737 if (toggle) { 738 const expanded = section.classList.contains('is-expanded'); 739 toggle.setAttribute('aria-expanded', expanded ? 'true' : 'false'); 740 } 741 } 742 743 const sections = sidebarNav.querySelectorAll('.sidebar-nav-section'); 744 sections.forEach(section => { 745 const sectionToggle = section.querySelector('.sidebar-nav-toggle'); 746 if (sectionToggle) { 747 sectionToggle.addEventListener('click', function(e) { 748 e.preventDefault(); 749 e.stopPropagation(); 750 section.classList.toggle('is-expanded'); 751 updateSidebarToggle(section); 752 }); 753 updateSidebarToggle(section); 754 } else { 755 section.classList.add('is-expanded'); 756 } 757 }); 758 759 sidebarNav.querySelectorAll('a[href^="#"]').forEach(anchor => { 760 anchor.addEventListener('click', function(e) { 761 const href = this.getAttribute('href'); 762 if (href !== '#' && href.length > 1) { 763 const target = document.querySelector(href); 764 if (target) { 765 e.preventDefault(); 766 const targetTop = target.getBoundingClientRect().top + window.scrollY; 767 const offsetTop = Math.max(0, targetTop - getFixedHeaderOffset()); 768 window.scrollTo({ 769 top: offsetTop, 770 behavior: 'smooth' 771 }); 772 } 773 } 774 }); 775 }); 776}); 777 778/***** DRAWER COMPONENT *****/ 779function toggleDrawer(drawerContent, caret, toggleButton) { 780 if (drawerContent.style.maxHeight === "0px" || drawerContent.style.maxHeight === "") { 781 drawerContent.style.maxHeight = drawerContent.scrollHeight + "px"; 782 caret.classList.add("rotated"); 783 toggleButton.setAttribute("aria-expanded", "true"); 784 } else { 785 drawerContent.style.maxHeight = "0px"; 786 caret.classList.remove("rotated"); 787 toggleButton.setAttribute("aria-expanded", "false"); 788 } 789} 790 791// Get all toggle buttons and their corresponding drawer contents 792const toggleButtons = document.querySelectorAll('.toggleDrawer'); 793toggleButtons.forEach(toggleButton => { 794 toggleButton.addEventListener('click', function(event) { 795 event.preventDefault(); 796 let drawerContent = this.nextElementSibling; 797 let caret = this.querySelector('.caret'); 798 toggleDrawer(drawerContent, caret, this); 799 }); 800}); 801 802document.querySelectorAll('a[href*="iuoe-store"]').forEach(function(link) { 803 link.setAttribute('target', '_blank'); 804 link.setAttribute('rel', 'noopener noreferrer'); 805}); 806 807 808 // Swiper Instances 809 const showcaseSlider = new Swiper(".home-showcaseSlider", { 810 lazy: true, 811 speed: 1000, 812 slidesPerView: 1, 813 parallax: true, 814 loop: true, 815 autoplay: { 816 delay: 4000, 817 disableOnInteraction: false, 818 }, 819 pagination: { 820 el: ".showcaseSlider-pagination", 821 clickable: true, 822 }, 823 navigation: { 824 nextEl: ".showcaseSlider-next", 825 prevEl: ".showcaseSlider-prev", 826 }, 827 }); 828 829 const portraitCarousel = new Swiper(".portrait-card-grid", { 830 speed: 650, 831 spaceBetween: 18, 832 slidesPerView: 1.1, 833 grabCursor: true, 834 keyboard: { enabled: true }, 835 navigation: { 836 nextEl: ".portrait-next", 837 prevEl: ".portrait-prev", 838 }, 839 breakpoints: { 840 600: { slidesPerView: 1.2 }, 841 900: { slidesPerView: 3 }, 842 1280: { slidesPerView: 4.2 }, 843 1440: { slidesPerView: 4.2 }, 844 } 845 }); 846 847 const newsCarousel = new Swiper(".news-grid", { 848 speed: 650, 849 spaceBetween: 18, 850 slidesPerView: 1.1, 851 grabCursor: true, 852 keyboard: { enabled: true }, 853 navigation: { 854 nextEl: ".news-next",
855 prevEl: ".news-prev", 856 }, 857 breakpoints: { 858 600: { slidesPerView: 1.2 }, 859 900: { slidesPerView: 3 }, 860 1280: { slidesPerView: 3.2 } 861 } 862 }); 863 864 var tradesSwiper = new Swiper(".trades-swiper", { 865 lazy: true, 866 spaceBetween: 5, 867 slidesPerView: 2.2, 868 loop: true, 869 autoplay: { 870 delay: 2500, 871 disableOnInteraction: false, 872 }, 873 breakpoints: { 874 900: { slidesPerView: 3} 875 } 876 }); 877 const swiper2 = new Swiper(".mySwiper2", { 878 slidesPerView: 1.3, 879 spaceBetween: 15, 880 loop: true, 881 grabCursor: true, 882 freeMode: true, 883 breakpoints: { 884 768: { slidesPerView: 2 }, 885 1024: { slidesPerView: 4 }, 886 } , 887 navigation: { 888 nextEl: ".swiper-button-next", 889 prevEl: ".swiper-button-prev", 890 } 891 /* pagination: { 892 el: ".swiper-pagination", 893 clickable: true 894 } */ 895 });
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.