import { type Component, type Focusable, type TUI } from "@earendil-works/pi-tui";
import type { HostInputFormRequest } from "../../../core/extensions/ui-types.ts";
import type { KeybindingsManager } from "../../../core/keybindings.ts";
import type { Theme } from "../theme/theme.ts";
export interface HostInputFormDelegate {
    onSubmit(values: Record<string, string>): void;
    onCancel(): void;
}
/** Host-owned form: all key handling and mutable editing state stay in the terminal process. */
export declare class HostInputFormComponent implements Component, Focusable {
    private readonly title;
    private readonly fields;
    private readonly values;
    private readonly editors;
    private readonly keybindings;
    private readonly theme;
    private readonly tui;
    private readonly delegate;
    private focusedIndex;
    private invalid;
    private _focused;
    constructor(tui: TUI, theme: Theme, keybindings: KeybindingsManager, request: HostInputFormRequest, delegate: HostInputFormDelegate);
    get focused(): boolean;
    set focused(value: boolean);
    handleInput(data: string): void;
    render(width: number): string[];
    invalidate(): void;
    private renderField;
    private handleEditable;
    private handleSelect;
    private handleBoolean;
    private handleSubmitRow;
    private submit;
    private invalidReason;
    private moveFocus;
    private syncFocus;
    private currentValue;
    /** Field header: focus chevron + name (accent when active) with a right-aligned required/optional badge. */
    private labelRow;
    /** Submit control rendered as a button pill; filled accent when focused, quiet outline otherwise. */
    private submitRow;
    /** Key-hint footer with accent key chips and muted verbs. */
    private footerRow;
    /**
     * Wrap the pre-built body rows in a rounded panel. The title rides the top
     * border; each row gets one cell of interior padding on both sides. Rows are
     * padded (not truncated) unless they overflow, so an embedded editor's inline
     * cursor marker is never clipped away.
     */
    private frame;
}
//# sourceMappingURL=host-input-form.d.ts.map