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