function observeViewport(callback) {
let top = -1, bottom = -1, raf;
const observer = new IntersectionObserver(([e]) => {
const t = e.intersectionRect.top;
const b = e.intersectionRect.bottom;
if(t !== top || b !== bottom) {
top = t;
bottom = b;
callback(top, bottom);
}
observer.unobserve(target);
raf = requestAnimationFrame(observe);
});
const target = document.documentElement;
const observe = () => observer.observe(target);
observe();
return () => {
cancelAnimationFrame(raf);
observer.disconnect();
}
}