# ScrollManager

Source: /tuil/docs/reference/packages/scroll/api/scroll-manager
Locale: en

class exported by @mwillbanks/tuil-scroll.



{/* Generated by tooling/docs/generate-reference.ts. */}

## class [#class]

Public class exported by `@mwillbanks/tuil-scroll`.

```ts
export class ScrollManager {
  readonly #areas = new Map<string, ScrollAreaState>();
  readonly #restoration = new Map<string, ScrollPosition>();

  register(area: ScrollAreaState): () => void {
    if (this.#areas.has(area.id))
      throw new Error(`Scroll area "${area.id}" is already registered`);
    if (area.parentId && !this.#areas.has(area.parentId)) {
      throw new Error(
        `Parent scroll area "${area.parentId}" is not registered`,
      );
    }
    this.#areas.set(area.id, area);
    const restored = this.#restoration.get(area.id);
    if (restored) area.scrollTo(restored);
    return () => {
      this.#restoration.set(area.id, area.snapshot().position);
      this.#areas.delete(area.id);
    };
  }

  get(id: string): ScrollAreaState | undefined {
    return this.#areas.get(id);
  }

  routeWheel(
    id: string,
    deltaX: number,
    deltaY: number,
  ): ScrollSnapshot | undefined {
    let current = this.#areas.get(id);
    while (current) {
      const before = current.snapshot();
      const after = current.wheel(deltaX, deltaY);
      if (
        before.position.x !== after.position.x ||
        before.position.y !== after.position.y
      )
        return after;
      current = current.parentId
        ? this.#areas.get(current.parentId)
        : undefined;
    }
    return undefined;
  }

  focus(
    id: string,
    bounds: Parameters<ScrollAreaState["scrollIntoView"]>[0],
  ): ScrollSnapshot | undefined {
    const area = this.#areas.get(id);
    return area?.followFocus ? area.scrollIntoView(bounds) : area?.snapshot();
  }

  snapshots(): readonly ScrollSnapshot[] {
    return Object.freeze(
      [...this.#areas.values()].map((area) => area.snapshot()),
    );
  }
}
```

## Members [#members]

| Member         | Type                                                                                                    | Required | Description                                                                                                                                   | Related types                                                                                                                                       |
| -------------- | ------------------------------------------------------------------------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| `#areas`       | `Map<string, ScrollAreaState>`                                                                          | Yes      | The `#areas` member uses the `Map<string, ScrollAreaState>` contract.                                                                         | [`ScrollAreaState`](/tuil/docs/reference/packages/scroll/api/scroll-area-state)                                                                          |
| `#restoration` | `Map<string, ScrollPosition>`                                                                           | Yes      | The `#restoration` member uses the `Map<string, ScrollPosition>` contract.                                                                    | [`ScrollPosition`](/tuil/docs/reference/packages/scroll/api/scroll-position)                                                                             |
| `register`     | `(area: ScrollAreaState) => () => void`                                                                 | Yes      | The `register` member uses the `(area: ScrollAreaState) => () => void` contract.                                                              | [`ScrollAreaState`](/tuil/docs/reference/packages/scroll/api/scroll-area-state)                                                                          |
| `get`          | `(id: string) => ScrollAreaState \| undefined`                                                          | Yes      | The `get` member uses the `(id: string) => ScrollAreaState \| undefined` contract.                                                            | [`ScrollAreaState`](/tuil/docs/reference/packages/scroll/api/scroll-area-state)                                                                          |
| `routeWheel`   | `(id: string, deltaX: number, deltaY: number) => ScrollSnapshot \| undefined`                           | Yes      | The `routeWheel` member uses the `(id: string, deltaX: number, deltaY: number) => ScrollSnapshot \| undefined` contract.                      | [`ScrollSnapshot`](/tuil/docs/reference/packages/scroll/api/scroll-snapshot)                                                                             |
| `focus`        | `(id: string, bounds: Parameters<ScrollAreaState["scrollIntoView"]>[0]) => ScrollSnapshot \| undefined` | Yes      | The `focus` member uses the `(id: string, bounds: Parameters<ScrollAreaState["scrollIntoView"]>[0]) => ScrollSnapshot \| undefined` contract. | [`ScrollAreaState`](/tuil/docs/reference/packages/scroll/api/scroll-area-state), [`ScrollSnapshot`](/tuil/docs/reference/packages/scroll/api/scroll-snapshot) |
| `snapshots`    | `() => readonly ScrollSnapshot[]`                                                                       | Yes      | The `snapshots` member uses the `() => readonly ScrollSnapshot[]` contract.                                                                   | [`ScrollSnapshot`](/tuil/docs/reference/packages/scroll/api/scroll-snapshot)                                                                             |

## Parameters [#parameters]

This declaration has no public members.

## Returns [#returns]

This declaration does not return a value.

## Throws [#throws]

No thrown errors are documented for this declaration.

## Related types [#related-types]

* [`ScrollAreaState`](/tuil/docs/reference/packages/scroll/api/scroll-area-state)
* [`ScrollPosition`](/tuil/docs/reference/packages/scroll/api/scroll-position)
* [`ScrollSnapshot`](/tuil/docs/reference/packages/scroll/api/scroll-snapshot)

## Source [#source]

[View the secondary source reference](https://github.com/mwillbanks/tuil/blob/main/packages/scroll/src/index.ts)

## Package [#package]

[@mwillbanks/tuil-scroll](/tuil/docs/reference/packages/scroll)
