/**
 * Layout math for the experimental fullscreen shell. Kept as pure functions so
 * the 80x24 / 120x40 / 207x47 acceptance cases can be covered without
 * rendering Ink.
 */
export type ExperimentalLayout = {
    rootHeight: number;
    rootWidth: number;
    headerHeight: number;
    bodyHeight: number;
    transcriptHeight: number;
    transcriptWidth: number;
    composerHeight: number;
    approvalHeight: number;
    paletteHeight: number;
    todoDockHeight: number;
    artifactsHeight: number;
    footerHeight: number;
};
/** Height of the todo dock panel for a given number of todos (0 = hidden). */
export declare function todoDockHeightFor(todoCount: number): number;
export declare function computeExperimentalLayout(options: {
    rows: number;
    columns: number;
    composerInput: string;
    paletteItemCount: number;
    approvalActive: boolean;
    todoCount?: number;
    hasArtifacts?: boolean;
}): ExperimentalLayout;
export type RowWindow = {
    start: number;
    end: number;
    anchored: "top" | "bottom";
    clampedOffset: number;
    hasOverflow: boolean;
};
/**
 * Window a list of rows into a viewport.
 *
 * - When the content fits, it is anchored to the TOP (short outputs start at
 *   the top, no artificial blank lines — the caller pads with flexGrow).
 * - When it overflows, it is anchored to the BOTTOM and `scrollOffset` walks
 *   the window upward.
 */
export declare function windowRows(totalRows: number, viewportHeight: number, scrollOffset: number): RowWindow;
