'use strict'; // ---------------------------------------------------------------------------- // DATA // ---------------------------------------------------------------------------- const root = document.documentElement; // HOME NAVIGATION DISPLAY // const navEl = document.querySelector('.home__nav'); const navLinks = document.querySelectorAll('.home__nav-link'); const navImage = document.querySelector('.home__nav-image'); const circleTypes = []; // VIDEO PLAYERS // const galleryVideos = document.querySelectorAll('.gallery__video'); let videoPlayers = []; // HEADER BAR ANIMATION // const headerBar = document.querySelector('.header-bar'); let scrollOffset = 0; // NAVIGATION MENU ANIMATION // const mainNavBtn = document.querySelector('.header-bar__nav-button'); const mainNavMenu = document.querySelector('.header-bar__nav-menu'); // ---------------------------------------------------------------------------- // UTILS // ---------------------------------------------------------------------------- // Convert rem to pixels by getting font-size CSS property function convertRemToPixels(rem) { let fontSize = parseFloat(window.getComputedStyle(document.body).getPropertyValue('font-size')); return rem * fontSize; } // ---------------------------------------------------------------------------- // LOGIC // ---------------------------------------------------------------------------- // HOME NAVIGATION DISPLAY // // Calculate navigation grid inner width function calculateNavGridInnerWidth() { if (root && navImage) { let navGridGapProperty = window.getComputedStyle(root).getPropertyValue('--home-nav-gap'); let navGridGap = parseFloat(navGridGapProperty.slice(0, -3)); return navImage.getBoundingClientRect().width + (convertRemToPixels(navGridGap) * 2); } } // Calculate navigation grid inner diagonal function calculateNavGridInnerDiagonal() { return calculateNavGridInnerWidth() * Math.sqrt(2); } // Create new instance of CircleType for each navigation link, set radius and direction function curveNavLinks() { if (navLinks.length !== 0 && circleTypes) { for (let i = 0; i < (navLinks.length - 2); i++) { circleTypes[i] = new CircleType(navLinks[i]); circleTypes[i].radius(calculateNavGridInnerWidth() / 2); } for (let i = (navLinks.length - 2); i < navLinks.length; i++) { circleTypes[i] = new CircleType(navLinks[i]); circleTypes[i].dir(-1); circleTypes[i].radius(calculateNavGridInnerWidth() / 2); } } } // Set --home-nav-item-translation CSS property function setNavItemTranslationProperty() { let navItemTranslation = (calculateNavGridInnerDiagonal() - calculateNavGridInnerWidth()) / 2; if (root) { root.style.setProperty('--home-nav-item-translation', navItemTranslation + 'px'); } } // Set navigation grid display depending on number of links function setNavGridDisplay() { if (navEl && navLinks.length !== 0) { if (navLinks.length === 2) { navEl.classList.add('home__nav--2-items'); } else if (navLinks.length === 3) { navEl.classList.add('home__nav--3-items'); } else if (navLinks.length === 4) { navEl.classList.add('home__nav--4-items'); } for (let i = 0; i < navLinks.length; i++) { navLinks[i].classList.add('home__nav-link--visible'); } } } // Edit navigation links radius and translation on window resize event function editNavLinksOnResize() { window.addEventListener('resize', function(e) { if (navLinks.length !== 0 && circleTypes) { for (let i = 0; i < navLinks.length; i++) { circleTypes[i].radius(calculateNavGridInnerWidth() / 2); } } setNavItemTranslationProperty(); }); } // Add wave up animation to a single letter and remove it on animationend event function waveNavLetterUp(navLetter) { navLetter.classList.add('home__nav-letter--wave-up'); navLetter.addEventListener('animationend', function(e) { navLetter.classList.remove('home__nav-letter--wave-up'); }); } // Add wave down animation to a single letter and remove it on animationend event function waveNavLetterDown(navLetter) { navLetter.classList.add('home__nav-letter--wave-down'); navLetter.addEventListener('animationend', function(e) { navLetter.classList.remove('home__nav-letter--wave-down'); }); } // Add wave up animation to every letters of a single link with a slight delay function waveNavLinkUp(navLink) { let navLinkLetters = navLink.querySelectorAll('span'); let animationDelay = 0; for (let i = 0; i < navLinkLetters.length; i++) { setTimeout(waveNavLetterUp, animationDelay, navLinkLetters[i]); animationDelay += 50; } } // Add wave down animation to every letters of a single link with a slight delay function waveNavLinkDown(navLink) { let navLinkLetters = navLink.querySelectorAll('span'); let animationDelay = 0; for (let i = 0; i < navLinkLetters.length; i++) { setTimeout(waveNavLetterDown, animationDelay, navLinkLetters[i]); animationDelay += 50; } } // Add wave (up or down) animation to every letters of each link on mouseover event function waveNavLinksOnHover() { if (navLinks.length !== 0) { for (let i = 0; i < (navLinks.length - 2); i++) { navLinks[i].addEventListener('mouseover', function(e) { waveNavLinkUp(navLinks[i]); }); } for (let i = (navLinks.length - 2); i < navLinks.length; i++) { navLinks[i].addEventListener('mouseover', function(e) { waveNavLinkDown(navLinks[i]); }); } } } // VIDEO PLAYERS // // Set up Plyr video players function setUpVideoPlayers() { if (galleryVideos.length !== 0) { videoPlayers = Plyr.setup(galleryVideos, { controls: [ 'play-large', 'play', 'progress', 'current-time', 'duration', 'mute', 'volume', 'settings', 'fullscreen' ], settings: [ 'quality' ], i18n: { play: 'Lire', pause: 'Mettre sur pause', seek: 'Parcourir la piste audio', currentTime: 'Temps écoulé depuis le début de la piste audio', duration: 'Durée de la piste audio', volume: 'Ajuster le volume', mute: 'Couper le son', unmute: 'Activer le son', enterFullscreen: 'Activer le mode plein écran', exitFullscreen: 'Quitter le mode plein écran' }, tooltips: { controls: true, seek: true }, quality: { default: 720, options: [ 1080, 720, 480, 360, 240, ] } }); } } // Toggle videos full screen mode on Plyr enterfullscreen and exitfullscreen media events function toggleVideosFullScreen() { if (videoPlayers.length !== 0) { for (let i = 0; i < videoPlayers.length; i++) { videoPlayers[i].on('enterfullscreen', function(e) { galleryVideos[i].classList.add('gallery__video--full-screen'); }); videoPlayers[i].on('exitfullscreen', function(e) { galleryVideos[i].classList.remove('gallery__video--full-screen'); }); } } } // HEADER BAR ANIMATION // // Toggle header bar depending on scroll function toggleHeaderBar() { if (headerBar) { let headerBarHeight = headerBar.getBoundingClientRect().height; if (window.pageYOffset > headerBarHeight) { // Scroll down past header bar height headerBar.classList.add('header-bar--fixed'); } else if (window.pageYOffset <= 0) { headerBar.classList.remove('header-bar--fixed'); headerBar.classList.remove('header-bar--visible'); } if (headerBar.classList.contains('header-bar--fixed')) { if (scrollOffset < window.pageYOffset) { // Scroll down headerBar.classList.remove('header-bar--visible'); } else if (scrollOffset > window.pageYOffset) { // Scroll up headerBar.classList.add('header-bar--visible'); } scrollOffset = window.pageYOffset; } } } // NAVIGATION MENU ANIMATION // // Show main navigation menu on button click event function showMainNavMenu() { if (mainNavBtn && mainNavMenu) { mainNavBtn.addEventListener('click', function(e) { mainNavBtn.classList.toggle('header-bar__nav-button--custom-focus'); mainNavMenu.classList.toggle('header-bar__nav-menu--visible'); // document.body.classList.toggle('body--hidden-overflow-y'); }); } } // ---------------------------------------------------------------------------- // PROGRAM // ---------------------------------------------------------------------------- // Enable CSS :active pseudo-class in Safari Mobile document.addEventListener("touchstart", function() {},false); // HOME NAVIGATION DISPLAY // window.addEventListener('load', function() { curveNavLinks(); setNavItemTranslationProperty(); setNavGridDisplay(); editNavLinksOnResize(); waveNavLinksOnHover(); }); // VIDEO PLAYERS // setUpVideoPlayers(); toggleVideosFullScreen(); // HEADER BAR ANIMATION // document.addEventListener('scroll', function() { toggleHeaderBar(); }); // NAVIGATION MENU ANIMATION // showMainNavMenu();