import type { Finding } from '../../core/types.js'; import type { PageInput } from '../page.js'; export interface SurfaceKind { name: string; /** how a reader moves through the surface: 'free' = any view any time (the * dashboard's sidebar), 'linear' = the authored order IS the path (the * report's scroll). 'stepped' is reserved for Slides — conflating it with * linear now would hollow out the axis (design §9.5). */ traversal: 'free' | 'linear'; /** the hosting ceiling this surface can honestly render under */ ceiling: { /** 'direct' admits every write mode the host declares; 'capture' means * gestures can only ever record suggestions — the surface has no live * redraw to make a direct write's result visible */ write: 'direct' | 'capture'; /** whether live row/indicator sources make sense on this surface */ live: boolean; }; /** the payload slices this surface's module contributes — documentation of * the seam, and what a host enumerates when it caches per-slice */ slices: readonly string[]; } export declare const SURFACE_KINDS: Record<'dashboard' | 'report' | 'form', SurfaceKind>; /** * Clamp a host's PageInput to what `kind` can honestly render (§1.4). For the * dashboard — ceiling {write: 'direct', live: true} — this is the IDENTITY, * same object out, so threading it through the render entry is byte-free by * construction, not by luck. Anything actually clamped is one warn-level * `surface-ceiling` finding naming every field that moved. */ export declare function applyCeiling(input: PageInput, kind: SurfaceKind, findings: Finding[]): PageInput;