import {q, qa, ElemJS} from "./elemjs/elemjs.js" class Chapter { constructor(linkElement) { this.link = new ElemJS(linkElement) this.time = +linkElement.getAttribute("data-clickable-timestamp") } } let chapters = [...document.querySelectorAll("[data-clickable-timestamp]")].map(linkElement => new Chapter(linkElement)) chapters.sort((a, b) => a.time - b.time) function getCurrentChapter(time) { const candidates = chapters.filter(chapter => chapter.time <= time) if (candidates.length > 0) { return candidates[candidates.length - 1] } else { return null } } const video = q("#video") const description = q("#description") const regularBackground = "var(--regular-background)" const highlightBackground = "var(--highlight-background)" const paddingWidth = 4 let lastChapter = null setInterval(() => { const currentChapter = getCurrentChapter(video.currentTime) if (currentChapter !== lastChapter) { // Style link if (lastChapter) { lastChapter.link.removeClass("timestamp--active") } if (currentChapter) { currentChapter.link.class("timestamp--active") } // Style background if (currentChapter) { const {offsetTop, offsetHeight} = currentChapter.link.element; const offsetBottom = offsetTop + offsetHeight let gradient = `linear-gradient(to bottom,` + ` ${regularBackground} ${offsetTop - paddingWidth}px, ${highlightBackground} ${offsetTop - paddingWidth}px,` + ` ${highlightBackground} ${offsetBottom + paddingWidth}px, ${regularBackground} ${offsetBottom + paddingWidth}px)` console.log(gradient) description.style.background = gradient } else { description.style.background = "" } } lastChapter = currentChapter }, 1000)