The raw cell-area client size = the measured client (uncapped by content). The grid reads this
for its own pane layout (min(client, content)); getMetrics caps it at content.
The combined viewport (position + measured sizes) as one identity-stable object — what a subscribed ScrollPane reads to size and place its scrollbars.
Convenience { left, top } of the current (rendered) scroll.
The current (rendered) scroll snapshot. The returned object is identity-stable until the scroll
changes, so it is safe as a useSyncExternalStore snapshot.
The scroll TARGET the ticker is easing toward (equals current when settled).
The zoom factor (1 = none). Part of the viewport shape so a shared/synced viewport carries it.
Whether the viewport has everything it needs to clamp + emit: a measured client (observer fired or manual sizes pushed) AND real content AND a positive client. The shared readiness signal that replaces each grid's "pending until ready" gate.
Whether the current (rendered) position has reached the target — no easing in progress.
Subscribe to scroll changes. Driven by the rAF ticker, so the listener fires at most once per animation frame (and only while current is advancing toward target). Returns a remover.
Read-only view of the scroll store. Layers/panes read the current scroll here and subscribe for changes.