/** * Screen-state group declarations are host-owned: the host names which frames * belong to a scenario (the capture pipeline proposes, the declaration on the * page decides), and the core never infers membership from names, routes, or * layout proximity. What the core CAN do is hold the declaration to the * contract the Screen states panel actually enforces — same canvas, one frame * per state label, a shared viewport, at least one sibling to flip to. A * declaration that breaks the contract does not error at runtime; it just * silently renders a confusing panel (or none at all), so validation surfaces * those mismatches as diagnostics the host can fix at declaration time. */ /** The declaration-relevant slice of a page: everything grouping keys off. */ export interface ScreenStateGroupInput { name: string; canvas?: string; route?: string; scenario?: string; state?: string; width?: number; height?: number; } export interface ScreenStateGroupDiagnostic { severity: 'warning' | 'info'; code: 'mixed-viewport' | 'duplicate-state' | 'cross-canvas' | 'singleton-group'; scenario: string; message: string; } /** * Validates every declared screen-state group among the given pages. Only * pages that actually declare membership participate: a page without a * scenario has made no claim, and a page without a route is not a captured * screen (mirrors the variant panel's gate). Diagnostics come back with * warnings before infos, then ordered by scenario, so the first entry is * always the most actionable one. */ export declare function validateScreenStateGroups(pages: readonly ScreenStateGroupInput[]): ScreenStateGroupDiagnostic[];