Deploy / build (push) Successful in 42s
offsetTop is measured from the nearest positioned ancestor, so inside an unpositioned .yue2-box it returned the line's distance from the page top (thousands of px). scrollTop clamped that to maxScroll, so the box jumped to the bottom the moment singing started and the text was unreadable. Now: box.scrollTop += (pr.top - br.top) - (clientHeight - lineHeight)/2, plus position:relative on the box. Verified in headless Chrome with a numeric probe: the active line sits ~124px into a 274px box at t=48/100, nothing is highlighted and scrollTop=0 at t=0, and the box settles at maxScroll only for the final lines.