/** A situation group within one section. Declaration order is lane order. */ export interface ScreenLaneDef { /** Unique within its section. */ id: string; /** Human-readable, in the host's language — drawn as the lane caption. */ label: string; /** The section this lane belongs to, matched against `page.section`. */ section: string; /** Caption rule colour. Defaults to the neutral caption colour. */ accent?: string; } export interface ScreenLaneDiagnostic { severity: 'error' | 'warning'; laneId: string; message: string; } export declare const LANE_CAPTION_STYLE: { /** Rule width and the gap between rule and text. */ readonly ruleWidth: 4; readonly gap: 10; /** Caption band height, and the space between caption and the first label. */ readonly height: 26; readonly marginBottom: 14; readonly fontSize: 17; readonly fontWeight: 700; readonly color: "#6b6b76"; readonly accent: "#b8b8c2"; readonly countColor: "#a1a1b3"; readonly countSize: 14; }; /** * Lane layout constants. `maxFramesPerRow` is what a designer can take in * without panning at overview zoom — six 1280px screens is about one viewport * — so a longer lane wraps into continuation rows rather than running off. */ export declare const LANE_LAYOUT: { readonly gap: 80; readonly laneGap: 210; readonly maxFramesPerRow: 6; }; /** The implicit lane that collects frames no declaration placed. */ export declare const UNDECLARED_LANE_ID = ""; export declare function validateScreenLanes(lanes: readonly ScreenLaneDef[], context?: { sections?: readonly string[]; }): ScreenLaneDiagnostic[]; /** One editor's declared screen lanes. */ export declare function createFrameLanes(): { setScreenLanes: (lanes: readonly ScreenLaneDef[] | undefined) => void; getScreenLanes: () => readonly ScreenLaneDef[]; lanesForSection: (section: string) => ScreenLaneDef[]; laneCaptionFor: (section: string, laneId: string) => ScreenLaneDef | null; groupByLane: (section: string, frames: readonly T[]) => { laneId: string; frames: T[]; }[]; }; export type FrameLanes = ReturnType;