import type * as THREE from 'three'; import type { Disposable, FrameContext, SceneContext } from '../types.js'; /** * One "view" of the app (a whole sub-scene). `update` advances animation; * `updateState` projects app state onto objects; `setActive` toggles * visibility/attachment when the view is entered/left. */ export interface ViewRenderer extends Disposable { update?(frame: FrameContext): void; updateState?(state: S): void; getInteractiveObjects?(): THREE.Object3D[]; setActive?(active: boolean): void; } /** Options for {@link createViewRegistry}: the `create` factory plus the LRU `limit`. */ export interface ViewRegistryOptions { create(key: string, ctx: SceneContext): ViewRenderer; /** Max cached renderers (including the active one). Default 4. */ limit?: number; } /** LRU registry of {@link ViewRenderer}s. `dispose()` disposes every cached renderer. */ export interface ViewRegistry extends Disposable { /** Get-or-create the renderer for `key`, make it active, LRU-evict overflow. */ activate(key: string, ctx: SceneContext): ViewRenderer; active(): ViewRenderer | null; activeKey(): string | null; get(key: string): ViewRenderer | undefined; /** Tick the ACTIVE renderer only. */ update(frame: FrameContext): void; updateState(state: S): void; } /** * Pluggable per-view renderers with an LRU persistent-mount cache: switching * views deactivates (but keeps) the previous renderer so switching back is * instant; least-recently-used renderers beyond `limit` are disposed. * * @param options - Renderer factory and cache limit. * @returns A {@link ViewRegistry} keyed by view name. * @typeParam S - App state type projected into renderers via `updateState`. */ export declare function createViewRegistry({ create, limit }: ViewRegistryOptions): ViewRegistry; //# sourceMappingURL=view-registry.d.ts.map