# @mwillbanks/tuil-scroll

Source: /tuil/docs/reference/packages/scroll
Locale: en

Shared terminal scroll containers, viewports, anchoring, culling, and restoration for tuil.



## Overview [#overview]

Shared terminal scroll containers, viewports, anchoring, culling, and restoration for tuil.

`@mwillbanks/tuil-scroll` is independently installable and also participates in the
umbrella `@mwillbanks/tuil` runtime where applicable.

## Installation [#installation]

<CodeBlockTabs defaultValue="npm">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash
    npm install @mwillbanks/tuil-scroll
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash
    pnpm add @mwillbanks/tuil-scroll
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash
    yarn add @mwillbanks/tuil-scroll
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash
    bun add @mwillbanks/tuil-scroll
    ```
  </CodeBlockTab>
</CodeBlockTabs>

## How it operates [#how-it-operates]

Shared scrolling manages bounded offsets, sticky edges, anchoring, nested wheel routing, variable measurements, culling, restoration, and scrollbar projection.

<Mermaid
  chart="flowchart LR
  S0[&#x22;register area&#x22;]
  S1[&#x22;measure&#x22;]
  S2[&#x22;move/anchor&#x22;]
  S3[&#x22;project&#x22;]
  S4[&#x22;restore/dispose&#x22;]
  S0 --> S1
  S1 --> S2
  S2 --> S3
  S3 --> S4"
/>

## API [#api]

| API                                                                            | Signature                     | Description                         |
| ------------------------------------------------------------------------------ | ----------------------------- | ----------------------------------- |
| [`ScrollAlignment`](/tuil/docs/reference/packages/scroll/api/scroll-alignment)      | `type ScrollAlignment`        | Public type ScrollAlignment.        |
| [`ScrollAreaOptions`](/tuil/docs/reference/packages/scroll/api/scroll-area-options) | `interface ScrollAreaOptions` | Public interface ScrollAreaOptions. |
| [`ScrollAreaState`](/tuil/docs/reference/packages/scroll/api/scroll-area-state)     | `class ScrollAreaState`       | Public class ScrollAreaState.       |
| [`ScrollAxis`](/tuil/docs/reference/packages/scroll/api/scroll-axis)                | `type ScrollAxis`             | Public type ScrollAxis.             |
| [`scrollbar`](/tuil/docs/reference/packages/scroll/api/scrollbar)                   | `function scrollbar`          | Public function scrollbar.          |
| [`ScrollExtent`](/tuil/docs/reference/packages/scroll/api/scroll-extent)            | `interface ScrollExtent`      | Public interface ScrollExtent.      |
| [`ScrollManager`](/tuil/docs/reference/packages/scroll/api/scroll-manager)          | `class ScrollManager`         | Public class ScrollManager.         |
| [`ScrollPosition`](/tuil/docs/reference/packages/scroll/api/scroll-position)        | `interface ScrollPosition`    | Public interface ScrollPosition.    |
| [`ScrollSnapshot`](/tuil/docs/reference/packages/scroll/api/scroll-snapshot)        | `interface ScrollSnapshot`    | Public interface ScrollSnapshot.    |
| [`ScrollViewport`](/tuil/docs/reference/packages/scroll/api/scroll-viewport)        | `interface ScrollViewport`    | Public interface ScrollViewport.    |

## Events and lifecycle [#events-and-lifecycle]

Each area exposes immutable snapshots through a subscription.

All subscriptions and registrations return a disposer or belong to an owning
runtime that disposes them in reverse order.

## Example [#example]

```tsx
import { ScrollAreaState } from "@mwillbanks/tuil-scroll";

const area = new ScrollAreaState({ id: "logs", viewport, extent });
```

## Related [#related]

* [Package architecture](/tuil/docs/concepts/packages)
* [Events](/tuil/docs/concepts/events)
* [Testing](/tuil/docs/guides/testing)
