import React from "react";
interface TranscriptViewportProps {
    /** Flat ANSI transcript lines (history + liveItems + streaming, serialized). */
    lines: readonly string[];
    /** Terminal width — bounds each rendered row. */
    columns: number;
    /** Number of rows the transcript region occupies. */
    viewportRows: number;
}
/**
 * Bounded, bottom-anchored transcript region rendered entirely inside Ink.
 *
 * Renders a windowed slice of the pre-flattened transcript line buffer as
 * truncated <Text> rows. The controls sit below it in the same full-height
 * frame, so the footer stays pinned to the bottom while the transcript scrolls
 * *within* this box.
 *
 * Sizing: `height={viewportRows}` is the PREFERRED height, but the box is
 * `flexShrink={1}` so it yields when the controls region grows taller than
 * expected — e.g. when the slash-command menu or a task picker opens below
 * the input. Without this the menu would overflow off the bottom of the screen
 * (it's pinned). `justifyContent="flex-end"` + `overflowY="hidden"` means any
 * shrink clips the OLDEST rows at the top, keeping the newest output and the
 * controls visible.
 */
declare function TranscriptViewportImpl({ lines, columns, viewportRows }: TranscriptViewportProps): import("react/jsx-runtime").JSX.Element;
/**
 * Memoized so unrelated App re-renders (streaming ticks, footer timers, status
 * shimmer) don't force the transcript subtree to reconcile. It only re-renders
 * when its line buffer, dimensions, or scroll offset actually change.
 */
export declare const TranscriptViewport: React.MemoExoticComponent<typeof TranscriptViewportImpl>;
export {};
//# sourceMappingURL=TranscriptViewport.d.ts.map