import { Merge, TNode } from '@tempots/dom';
import { InputOptions } from '../input/input-options';
import { Controller } from '../controller';
import { InputWrapperOptions } from '../input';
export declare const makeOnBlurHandler: (_controller: Controller<any>, onBlur?: () => void) => () => void;
export declare const makeOnChangeHandler: <T>(controller: Controller<T>, onChange?: (value: T) => void) => (value: T) => void;
export type BaseControlOptions = InputOptions<any>;
export type ControlOptions = Merge<BaseControlOptions, InputWrapperOptions>;
export type BaseControllerOptions<T, O extends BaseControlOptions> = Merge<Omit<O, 'value'>, {
    controller: Controller<T>;
}>;
export type ControllerOptions<T, O extends BaseControlOptions> = Merge<Omit<InputWrapperOptions, 'content'>, Merge<Omit<O, 'value'>, {
    controller: Controller<T>;
}>>;
export type MappedControllerOptions<T, U, O extends BaseControlOptions> = Merge<ControllerOptions<T, O>, {
    toInput: (value: T) => U;
    fromInput: (value: U) => T;
}>;
export declare function BaseControl<T, O extends BaseControlOptions>(InputComponent: (options: O) => TNode, options: BaseControllerOptions<T, O>): TNode;
export declare function Control<T, O extends BaseControlOptions>(InputComponent: (options: O) => TNode, { id: idArg, labelFor: labelForArg, ...options }: ControllerOptions<T, O>, ...children: TNode[]): import("@tempots/dom").Renderable;
export declare function BaseMappedControl<T, U, O extends BaseControlOptions>(InputComponent: (options: O) => TNode, options: MappedControllerOptions<T, U, O>): TNode;
export declare function MappedControl<T, U, O extends BaseControlOptions>(InputComponent: (options: O) => TNode, { id: idArg, labelFor: labelForArg, ...options }: MappedControllerOptions<T, U, O>, ...children: TNode[]): import("@tempots/dom").Renderable;
