/** A room scene: poster + optional native Rive layer + hotspots resolved to real destinations. Generated by scripts/stage-approved-assets.ts. */ export const ROOM = { width: 1648, height: 928 } as const; export interface Hitbox { x: number; y: number; width: number; height: number } export type HotspotTarget = { kind: 'page'; pageId: string; project?: string } | { kind: 'anchor'; anchor: string; pageId?: string }; export interface SceneHotspot { id: string; label: string; hit: Hitbox; target: HotspotTarget; focusValue: string; trigger?: string } export type SceneRiveDensity = '2x' | '4x'; export interface SceneRiveVariant { file: string; sha256: string } export interface SceneRive { file: string; artboard: string; stateMachine: string; viewModel: string; sha256: string; variants?: Partial>; viewModelOptional?: boolean; nativeInputs?: string } export interface SceneEnvironmentAsset { production_name: string; file: string; x: number; y: number; width: number; height: number; draw_order: number; z?: number; roles: string[]; compositeSafe?: boolean; alphaAudit?: { nontransparent_pct: number; opaque_pct: number; edge_nontransparent_pct: number; suspicious_full_rect: boolean } } export interface SceneEnvironment { staticBase: string; vector: string; sourceHash: string; manifest?: string; assets?: SceneEnvironmentAsset[]; referenceMetrics?: { width: number; height: number; rgb_mae: number; max_diff: number; pixels_differing: number }; } export interface SceneCanvas { width: number; height: number } export interface SceneRecord { id: string; canvas: SceneCanvas; poster: string; posterAlt: string; rive: SceneRive | null; hotspots: SceneHotspot[]; captionRest: string; captions: Record; environment?: SceneEnvironment }