function getPos(element) { /* Element.getBoundingClientRect() * Return box of the element relatively to viewport. */ const rect = element.getBoundingClientRect(); /* The properties window.scrollX and window.scrollY * return the viewport position relatively to the document */ return { x: rect.left + window.scrollX, y: rect.top + window.scrollY, }; } // Use this if needed : // const getTop = element => element.offsetTop + (element.offsetParent && getTop(element.offsetParent)); let sidenotes; const resize = () => { for (const sidenote of sidenotes) { if (sidenote.offsetWidth < 200 || window.screen.width < 1400) { sidenote.innerHTML = ''; return; } const articleRef = sidenote.attributes.for.value; const article = document.querySelector(`#${CSS.escape(articleRef)}`); const notes = Array.from(article.querySelectorAll('li')) .filter(element => element.id.startsWith('user-content-fn')); const newSidenotes = notes.map(sidenoteLi => { const div = document.createElement('div'); const refName = sidenoteLi.querySelector('.data-footnote-backref').attributes.href.value; const refSideNode = article.querySelector(refName); const sup = document.createElement('sup'); sup.textContent = refSideNode.textContent + ' '; for (const element of sidenoteLi.children) { const child = element.cloneNode(true); div.append(child); } div.children[0].prepend(sup); div.style.top = `${getPos(refSideNode).y}px`; div.classList.add('sidenote'); return div; }); sidenote.replaceChildren(...newSidenotes); if (sidenote.offsetWidth < 100 || window.screen.width < 1400) { sidenote.innerHTML = ''; return; } } }; window.addEventListener('DOMContentLoaded', () => { sidenotes = document.querySelectorAll('.sidenotes'); if (sidenotes.length > 0) { new ResizeObserver(resize).observe(sidenotes[0]); } if (document.querySelectorAll('.math-display').length > 0) { document.head.innerHTML += ''; } });