# core/observers/route.observer.ts

> 34 lines of code and 8 definitions.

Tree: Site tree
Language: typescript
Layer: application
Canonical: https://banes-lab.com/anatomy/tree#file-core-observers-route-observer-ts
Source text: https://banes-lab.com/assets/sources/source.f2e75c3536c094fc389b23de597604a56f03ee0489d18e3ab7e0ee5830c541d7.generated.txt

## Definitions

- `apply` (lexical_declaration, line 24, exported)
- `stop` (lexical_declaration, line 18, exported)
- `track` (lexical_declaration, line 33, exported)
- `holdScroll` (lexical_declaration, line 14, exported)
- `INPUT_EVENTS` (lexical_declaration, line 4)
- `isReload` (lexical_declaration, line 6, exported)
- `[entry]` (lexical_declaration, line 10, exported)
- `observer` (lexical_declaration, line 15, exported)

## Source

```typescript
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 });
    }
    const track = observer.observe.bind(observer);
    track(scroller.firstElementChild ?? scroller);
    apply();
    return stop;
};
```
