/** * User-directed Crowdy Studio layout state: which panes are visible and how * large they are. The editor is the only always-visible surface; the explorer, * project settings, agent dock, and bottom panel are toggled by the person * using the Studio and their choices persist locally. */ export type StudioPaneId = 'explorer' | 'settings' | 'agent' | 'bottom'; export interface StudioPaneSizeRange { readonly min: number; readonly max: number; } export interface StudioLayoutState { readonly visible: Readonly>; /** Pixel widths for side panes; pixel height for the bottom panel. */ readonly sizes: Readonly>; } export type StudioLayoutListener = (state: StudioLayoutState) => void; export type StudioLayoutStorage = Pick; export interface StudioLayoutControllerOptions { storage?: StudioLayoutStorage | null; storageKey?: string; defaults?: Partial; } export declare const STUDIO_LAYOUT_STORAGE_KEY = "ck:crowdy-studio:layout:v1"; export declare const STUDIO_PANE_IDS: readonly StudioPaneId[]; export declare function studioPaneSizeRange(pane: StudioPaneId): StudioPaneSizeRange; export declare function clampStudioPaneSize(pane: StudioPaneId, size: number): number; /** * Headless layout state machine. DOM shells subscribe and translate the state * into CSS variables / hidden attributes; tests drive it directly. */ export declare class StudioLayoutController { private readonly storage; private readonly storageKey; private readonly listeners; private visible; private sizes; constructor(options?: StudioLayoutControllerOptions); getState(): StudioLayoutState; isVisible(pane: StudioPaneId): boolean; paneSize(pane: StudioPaneId): number; subscribe(listener: StudioLayoutListener): () => void; setVisible(pane: StudioPaneId, visible: boolean): void; toggle(pane: StudioPaneId): void; setSize(pane: StudioPaneId, size: number, persist?: boolean): void; private emit; private loadPersisted; private persist; } //# sourceMappingURL=layout.d.ts.map