import { type LogEntry, type ProgressState, type RunState } from "../state.js"; export declare function renderBar(progress: ProgressState, width?: number): string; export declare function renderHeader(state: RunState): string[]; /** * Lines the live region may occupy without the terminal scrolling under it. * * The hard limit is the viewport height; the margin covers the one extra line * a permanent log write costs when the region is already at full height. */ export declare function bodyBudget(): number; /** How hard `renderBody` has had to squeeze to fit — 1 is the least compressed. */ export type BodyTier = 1 | 2 | 3 | 4; /** * The live body, guaranteed to fit `bodyBudget()`, plus the tier it took to * get there. * * This guarantee is load-bearing, not cosmetic: the renderer repaints by moving * the cursor up N lines, so a frame taller than the viewport scrolls its own * top off screen and every repaint appends a copy instead of overwriting. Four * progressively stronger reductions are tried, and the result is clamped. * * `minTier` exists so a caller that repaints repeatedly can pin the tier once * it has had to compress: an active step's own detail (its progress bar, its * task list) and a `"bottom"`-placed log tail both change height every tick on * their own, with nothing about *other*, already-finished phases changing at * all. Re-deciding "does everything fit?" from scratch on every frame means * that harmless wobble alone repeatedly drags the whole body across the fit * threshold — every finished phase flips between full and one-line collapsed * along with it, which reads as the frame randomly changing its mind rather * than reacting to anything the user did. Once a tier has been needed, holding * it keeps already-settled phases settled even while the active step's own * footprint keeps moving. */ export declare function renderBodyTiered(state: RunState, tick: number, now: number, fit?: boolean, minTier?: BodyTier): { lines: string[]; tier: BodyTier; }; /** Convenience wrapper over {@link renderBodyTiered} for callers that just want the lines. */ export declare function renderBody(state: RunState, tick: number, now: number, fit?: boolean, minTier?: BodyTier): string[]; export declare function renderSummary(state: RunState, now: number): string[]; export declare function renderLogEntry(entry: LogEntry): string; //# sourceMappingURL=frame.d.ts.map