()
| 13 | import sideNavStyles from '@adobe/spectrum-css-temp/components/sidenav/vars.css'; |
| 14 | |
| 15 | export function attachToToC() { |
| 16 | let tocLinks = document.querySelectorAll('#toc a'); |
| 17 | let headers = []; |
| 18 | for (let link of tocLinks) { |
| 19 | let headerId = link.href.split('#').pop(); |
| 20 | let header = document.getElementById(headerId); |
| 21 | headers.push({link, header}); |
| 22 | } |
| 23 | |
| 24 | function updateToc() { |
| 25 | requestAnimationFrame(() => { |
| 26 | // this needs to be improved a little but the math hurts my head right now |
| 27 | // right now it's impossible to select the last section if the last two heights combined are smaller than the viewport height |
| 28 | headers.some((header, i) => { |
| 29 | if ( |
| 30 | header.header.offsetTop + header.header.getBoundingClientRect().height > |
| 31 | document.documentElement.scrollTop |
| 32 | ) { |
| 33 | let currentSelection = document.querySelectorAll(`#toc .${sideNavStyles['is-selected']}`); |
| 34 | if (currentSelection) { |
| 35 | currentSelection.forEach(node => { |
| 36 | node.classList.remove(sideNavStyles['is-selected']); |
| 37 | const link = node.querySelector('[aria-current]'); |
| 38 | if (link) { |
| 39 | link.removeAttribute('aria-current'); |
| 40 | } |
| 41 | }); |
| 42 | } |
| 43 | header.link.parentElement.classList.add(sideNavStyles['is-selected']); |
| 44 | header.link.setAttribute('aria-current', 'location'); |
| 45 | return true; |
| 46 | } |
| 47 | }); |
| 48 | }); |
| 49 | } |
| 50 | |
| 51 | updateToc(); |
| 52 | |
| 53 | document.addEventListener('scroll', updateToc); |
| 54 | } |
no test coverage detected