File size: 2,383 Bytes
82a88c5 8869f63 82a88c5 0f198fd 4ccc492 0f198fd 82a88c5 19d10ff 82a88c5 8869f63 82a88c5 19d10ff 82a88c5 8869f63 82a88c5 0f198fd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
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 getFocusableElements(parentEls: Element[] | HTMLElement[]) {
const focusableQuery =
'a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type="text"]:not([disabled]), input[type="radio"]:not([disabled]), input[type="checkbox"]:not([disabled]), select:not([disabled])';
return parentEls
.flatMap(parentEl => {
const isParentFocusable = parentEl.matches(focusableQuery);
const focusableEls: HTMLElement[] = Array.from(parentEl.querySelectorAll(focusableQuery));
return [...(isParentFocusable ? [parentEl as HTMLElement] : []), ...focusableEls];
})
.filter(el => {
return getComputedStyle(el).pointerEvents !== "none" && isElementVisible(el);
});
}
export function bringInView(element: Element) {
if (!element || isElementInView(element)) {
return;
}
const shouldSmoothScroll = getConfig("smoothScroll");
const isTallerThanViewport = (element as HTMLElement).offsetHeight > window.innerHeight;
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: isTallerThanViewport ? "start" : "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)
);
}
export function isElementVisible(el: HTMLElement) {
return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length);
}
|