import type { Theme } from "../../../../../../modes/interactive/theme/theme.ts";
import type { MarkdownTheme } from "@earendil-works/pi-tui";
import type { QuestionData } from "../../../tool/types.ts";
import type { PreviewLayoutMode } from "./preview-layout-decider.ts";
/**
 * Affordance text shown below the bordered preview when focused on a preview-bearing option.
 * Re-exported by `preview-pane.ts` for the existing test surface.
 */
export declare const NOTES_AFFORDANCE_TEXT = "Notes: n add notes";
export interface PreviewBlockRendererConfig {
    question: QuestionData;
    theme: Theme;
    markdownTheme: MarkdownTheme;
}
/**
 * Renders the bordered markdown preview block for a single question (one block per render call,
 * for the option at `optionIndex`). Owns a per-question `MarkdownContentCache`.
 *
 * NOT a `Component` — pure render-and-measure helper consumed by `PreviewPane`. The layout mode
 * is threaded as an explicit param (never re-derived from column width post-split).
 *
 * The affordance row is always emitted (visually empty when gated) so the preview block's row
 * count is height-stable across affordance-state transitions.
 */
export declare class PreviewBlockRenderer {
    private readonly theme;
    private readonly cache;
    constructor(config: PreviewBlockRendererConfig);
    hasAnyPreview(): boolean;
    has(optionIndex: number): boolean;
    invalidate(): void;
    /**
     * Height contribution of the preview block: `BORDER_VERTICAL_OVERHEAD + contentRows +
     * NOTES_AFFORDANCE_OVERHEAD`. Always returns the same value as `renderBlock(...).length`
     * — the affordance overhead is constant, not gated by `focused`/`notesVisible`.
     */
    blockHeight(width: number, optionIndex: number, mode: PreviewLayoutMode): number;
    /**
     * Render the full preview block at `width`: bordered box + blank separator + affordance row.
     * `focused` and `notesVisible` together gate the affordance text (visible only when the
     * focused option carries a preview AND notes mode is inactive). The affordance row is ALWAYS
     * emitted (as an empty string when gated) so the row count is invariant.
     */
    renderBlock(width: number, optionIndex: number, mode: PreviewLayoutMode, focused: boolean, notesVisible: boolean): string[];
}
//# sourceMappingURL=preview-block-renderer.d.ts.map