core/observers/route.observer.ts
core/observers/route.observer.ts is a file in Bane's Lab Site. 33 lines of code and 7 definitions.
import type { Disposer } from "#types/base.types";
import { NAVIGATION_ENTRY } from "#core/ids/route.ids";
const INPUT_EVENTS = ["wheel", "touchstart", "keydown", "pointerdown"] as const;
export const isReload = function isReload(): boolean {
if (!("getEntriesByType" in performance)) {
return false;
}
const [entry] = performance.getEntriesByType(NAVIGATION_ENTRY);
return entry !== undefined && "type" in entry && entry.type === "reload";
};
export const holdScroll = function holdScroll(scroller: HTMLElement, top: number): Disposer {
const observer = new ResizeObserver(() => {
apply();
});
const stop = function stop(): void {
observer.disconnect();
for (const name of INPUT_EVENTS) {
scroller.removeEventListener(name, stop);
}
};
const apply = function apply(): void {
scroller.scrollTo(0, top);
if (scroller.scrollHeight - scroller.clientHeight >= top) {
stop();
}
};
for (const name of INPUT_EVENTS) {
scroller.addEventListener(name, stop, { passive: true });
}
observer.observe(scroller.firstElementChild ?? scroller);
apply();
return stop;
};