| /** | |
| * This is a basic version of the jump links. | |
| * New version will follow with parity to package site. | |
| */ | |
| (function() { | |
| 'use-strict' | |
| async function resetNav() { | |
| return new Promise((resolve, reject) => { | |
| const nav = document.querySelector('.LearnNav'); | |
| if (!nav) { | |
| reject(new Error('.LearnNav element not found.')); | |
| } | |
| for (let a of Array.from(nav?.children ?? [])) { | |
| a.classList.remove('active'); | |
| } | |
| resolve(); | |
| }); | |
| } | |
| async function setNav() { | |
| return new Promise((resolve, reject) => { | |
| const nav = document.querySelector('.LearnNav'); | |
| if (!nav) { | |
| reject(new Error('.LearnNav element not found.')); | |
| } | |
| for (let a of Array.from(nav?.children ?? [])) { | |
| if (a.href === location.href) { | |
| a.classList.add('active'); | |
| document.getElementById(location.hash.substring(1))?.scrollIntoView(); | |
| break; | |
| } | |
| } | |
| resolve(); | |
| }); | |
| } | |
| function observeSections() { | |
| const learnContent = document.querySelector('.Learn-body'); | |
| if (learnContent && learnContent.children) { | |
| const callback = async (payload) => { | |
| if (payload && payload.length > 0) { | |
| for (p of payload) { | |
| if (p.isIntersecting) { | |
| const {id} = p.target; | |
| const link = document.querySelector(`[href='#${id}']`); | |
| await resetNav(); | |
| link.classList.add('active'); | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| // rootMargin is important when multiple sections are in the observable area **on page load**. | |
| // they will still be highlighted on scroll because of the root margin. | |
| const ob = new IntersectionObserver(callback, { | |
| threshold: 0, | |
| rootMargin: '0px 0px -50% 0px', | |
| }); | |
| for (section of learnContent.children) { | |
| ob.observe(section); | |
| } | |
| } | |
| } | |
| setNav() | |
| .then(observeSections) | |
| .catch((error) => { | |
| console.error(error); | |
| }); | |
| })(); |