driver.js / src /utils.ts
kamrify's picture
Handle scrollable elements for highlighting
82a88c5
raw
history blame
1.41 kB
import { getConfig } from "./config";
export function easeInOutQuad(
elapsed: number,
initialValue: number,
amountOfChange: number,
duration: number
): number {
if ((elapsed /= duration / 2) < 1) {
return (amountOfChange / 2) * elapsed * elapsed + initialValue;
}
return (-amountOfChange / 2) * (--elapsed * (elapsed - 2) - 1) + initialValue;
}
export function bringInView(element: Element) {
if (!element || isElementInView(element)) {
return;
}
const shouldSmoothScroll = getConfig("smoothScroll");
element.scrollIntoView({
// Removing the smooth scrolling for elements which exist inside the scrollable parent
// This was causing the highlight to not properly render
behavior:
!shouldSmoothScroll || hasScrollableParent(element) ? "auto" : "smooth",
inline: "center",
block: "center",
});
}
function hasScrollableParent(e: Element) {
if (!e || !e.parentElement) {
return;
}
const parent = e.parentElement as HTMLElement & { scrollTopMax?: number };
return parent.scrollHeight > parent.clientHeight;
}
function isElementInView(element: Element) {
const rect = element.getBoundingClientRect();
return (
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <=
(window.innerHeight || document.documentElement.clientHeight) &&
rect.right <= (window.innerWidth || document.documentElement.clientWidth)
);
}