// Widget: Latest Articles (() => { let articleIndex = 0 let autoScrollEnabled = true const elemControls = document.querySelector('div.widget-latest-controls')! const elemArticles = document.querySelector('div.widget-latest-articles')! const listArticles = elemArticles.querySelectorAll('div.latest-item') const listDots = elemControls.querySelectorAll('div.dot-circle') const gapOffset = parseInt(window .getComputedStyle(elemArticles) .getPropertyValue('gap') ) // Autoscrolling Behaviour function transitionNextArticle(shouldAdd) { // Over/Underflow Handling shouldAdd ? articleIndex++ : articleIndex-- if (articleIndex < 0) articleIndex = listArticles.length - 1 const desiredIndex = (articleIndex % listArticles.length) // Set Active Dot listDots.forEach((e, i) => { e.classList.remove('dot-active') if (desiredIndex === i) e.classList.add('dot-active') }) // Scroll over to post let scrollOffset = 0 for (let i = 0; i < desiredIndex; i++) { scrollOffset += listArticles[i].offsetWidth + gapOffset } elemArticles.scrollLeft = scrollOffset } setInterval(() => autoScrollEnabled && transitionNextArticle(true), 10_000) elemArticles.onmouseenter = () => autoScrollEnabled = false elemArticles.onmouseleave = () => autoScrollEnabled = true elemControls.onmouseenter = () => autoScrollEnabled = false elemControls.onmouseleave = () => autoScrollEnabled = true // Back/Next Buttons document .querySelector('button#latest-next')! .addEventListener('click', () => transitionNextArticle(true)) document .querySelector('button#latest-last')! .addEventListener('click', () => transitionNextArticle(false)) })()