|
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({ |
|
|
|
|
|
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) |
|
); |
|
} |
|
|