| // 'More projects' button on use case pages |
| (() => { |
| const button = document.querySelector('.js-moreProjectsBtn'); |
| if (!button) return; |
| const hiddenProjects = document.querySelectorAll('.js-featuredUsersRow[hidden]'); |
| button.addEventListener('click', () => { |
| button.setAttribute('hidden', true); |
| hiddenProjects.forEach(project => { |
| project.removeAttribute('hidden'); |
| }); |
| }); |
| })(); |
| |
| // Use case pages section navigation |
| (() => { |
| const stickyNav = document.querySelector('.js-useCaseStickyNav'); |
| if (!stickyNav) return; |
| const linkData = { |
| 'overview': 'Overview', |
| 'key-benefits': 'Key Benefits', |
| 'use-case': 'Use Case', |
| 'featured-users': 'Featured Users', |
| 'get-started': 'Get Started', |
| }; |
| const container = document.querySelector('.js-useCaseSubnav'); |
| const subNavAnchorLinks = document.querySelector('.js-useCaseSubnavLinks'); |
| const siteHeader = document.querySelector('.js-siteHeader'); |
| const header = document.querySelector('.js-useCaseSubnavHeader'); |
| const icon = document.querySelector('.js-useCaseSubnavMenuIcon'); |
| const menu = document.querySelector('.js-useCaseSubnavMenu'); |
| const contentBody = document.querySelector('.js-useCaseContentBody'); |
| const headerHeightPx = 56; |
| const sectionHeadings = Array.from( |
| document.querySelectorAll('.sectionHeading') |
| ); |
| let distanceFromTop = |
| window.pageYOffset + |
| contentBody.getBoundingClientRect().top - |
| headerHeightPx; |
| if (!header || !menu) return; |
| container.addEventListener('click', handleClick); |
| container.addEventListener('keydown', handleKeydown); |
| changeScrollPosition(); |
| |
| function handleClick(event) { |
| if (event.target === header) { |
| toggleMenu(); |
| } else { |
| closeMenu(); |
| } |
| } |
| |
| function handleKeydown(event) { |
| if (event.key === 'Enter') { |
| closeMenu(); |
| } else { |
| openMenu(); |
| } |
| } |
| |
| function openMenu() { |
| menu.classList.add('UseCaseSubNav-menu--open'); |
| icon.classList.add('UseCaseSubNav-menuIcon--open'); |
| } |
| |
| function closeMenu() { |
| menu.classList.remove('UseCaseSubNav-menu--open'); |
| icon.classList.remove('UseCaseSubNav-menuIcon--open'); |
| } |
| |
| function toggleMenu() { |
| menu.classList.toggle('UseCaseSubNav-menu--open'); |
| icon.classList.toggle('UseCaseSubNav-menuIcon--open'); |
| } |
| |
| sectionHeadings.forEach(heading => { |
| let a = document.createElement('a'); |
| a.classList.add('UseCase-anchorLink', 'anchor-link'); |
| a.href = `${window.location.pathname}#${heading.id}`; |
| a.textContent = linkData[heading.id]; |
| stickyNav.appendChild(a); |
| a = a.cloneNode(); |
| a.textContent = linkData[heading.id]; |
| subNavAnchorLinks.appendChild(a); |
| }); |
| |
| // Selected section styles |
| const anchorLinks = document.querySelectorAll('.anchor-link'); |
| anchorLinks.forEach(link => { |
| link.addEventListener('click', () => { |
| document |
| .querySelectorAll('.anchor-link') |
| .forEach(el => el.classList.remove('selected')); |
| link.classList.add('selected'); |
| }); |
| }); |
| |
| window.addEventListener('scroll', () => { |
| // delay in case the user clicked the anchor link and we are autoscrolling |
| setTimeout(setSelectedAnchor, 500); |
| }); |
| |
| function setSelectedAnchor() { |
| for (heading of sectionHeadings) { |
| const {offsetTop} = heading; |
| if (offsetTop > window.scrollY) { |
| anchorLinks.forEach(link => { |
| const anchorId = link.href.slice(link.href.indexOf('#') + 1); |
| if (anchorId === heading.id) { |
| link.classList.add('selected'); |
| } else { |
| link.classList.remove('selected'); |
| } |
| }); |
| break; |
| } |
| } |
| } |
| |
| /* sticky nav logic -- uses content for y position because reloading page |
| when not scrolled to the top creates bug if using current y position of |
| sticky nav */ |
| window.addEventListener('scroll', setStickyNav); |
| |
| window.addEventListener('resize', () => { |
| distanceFromTop = |
| window.pageYOffset + |
| contentBody.getBoundingClientRect().top - |
| headerHeightPx; |
| |
| changeScrollPosition() |
| }); |
| |
| /** |
| * Changes scroll position according to the size of the header and menu |
| * Also changes according to the user's browser |
| */ |
| function changeScrollPosition() { |
| const SUPPORTS_SCROLL_BEHAVIOR = document.body.style.scrollBehavior !== undefined; |
| const WINDOW_WIDTH_BREAKPOINT_PX = 923; |
| let scrollPosition = headerHeightPx; |
| |
| if (SUPPORTS_SCROLL_BEHAVIOR) { |
| if (window.innerWidth < WINDOW_WIDTH_BREAKPOINT_PX) { |
| scrollPosition += header.clientHeight; |
| } |
| } else { |
| if (window.innerWidth >= WINDOW_WIDTH_BREAKPOINT_PX) { |
| scrollPosition = siteHeader.clientHeight |
| } else { |
| scrollPosition = siteHeader.clientHeight + header.clientHeight; |
| } |
| } |
| } |
| |
| function setStickyNav() { |
| if (window.scrollY > distanceFromTop) { |
| stickyNav.classList.add('UseCaseSubNav-anchorLinks--sticky'); |
| } else { |
| stickyNav.classList.remove('UseCaseSubNav-anchorLinks--sticky'); |
| } |
| } |
| })(); |