import { type Controller } from './Controller';
type ListenerFn<K extends keyof EventMap> = K extends 'destroy' ? () => void : (event: EventMap[K]) => void;
interface EventMap extends DocumentEventMap {
    'destroy': never;
}
export declare class Dom {
    controller: Controller;
    _listeners: DomListener<keyof EventMap>[];
    constructor(controller: any);
    _initListeners(): any[];
    _listenerIndex(domListener: any): number;
    /**
     * Adds a DOM event listener that will get cleaned up when this component is cleaned up.
     *
     * @param type - Name of the DOM event to listen to
     * @param target - Optional target to add the DOM listener to. If not provided, the target is `document`.
     * @param listener - Listener to be called when the DOM event occurs
     * @param useCapture - Optional, defaults to false. If true, add the listener as a capturing listener.
     *
     * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
     */
    addListener<K extends keyof EventMap>(type: K, target: EventTarget, listener: ListenerFn<K>, useCapture?: boolean): void;
    addListener<K extends keyof EventMap>(type: K, listener: ListenerFn<K>, useCapture?: boolean): void;
    /**
     * Adds a DOM event listener that will get cleaned up when this component is cleaned up.
     *
     * @param type - Name of the DOM event to listen to
     * @param target - Optional target to add the DOM listener to. If not provided, the target is `document`.
     * @param listener - Listener to be called when the DOM event occurs
     * @param useCapture - Optional, defaults to false. If true, add the listener as a capturing listener.
     *
     * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
     */
    on<K extends keyof EventMap>(type: K, target: EventTarget, listener: ListenerFn<K>, useCapture?: boolean): void;
    on<K extends keyof EventMap>(type: K, listener: ListenerFn<K>, useCapture?: boolean): void;
    /**
     * Adds a one-time DOM event listener that will get cleaned up when this component is cleaned up.
     *
     * @param type - Name of the DOM event to listen to
     * @param target - Optional target to add the DOM listener to. If not provided, the target is `document`.
     * @param listener - Listener to be called when the DOM event occurs
     * @param useCapture - Optional, defaults to false. If true, add the listener as a capturing listener.
     *
     * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
     */
    once<K extends keyof EventMap>(type: K, target: EventTarget, listener: ListenerFn<K>, useCapture?: boolean): void;
    once<K extends keyof EventMap>(type: K, listener: ListenerFn<K>, useCapture?: boolean): void;
    /**
     * Removes a DOM event listener that was added via `#addListener`, `#on`, or `#once`, using the same
     * parameters as those methods.
     *
     * @param type - Name of the DOM event
     * @param target - Optional target for the DOM listener. If not provided, the target is `document`.
     * @param listener - Listener function that was passed to  `#addListener`, `#on`, or `#once`.
     * @param useCapture - Optional, defaults to false. If true, removes a capturing listener.
     *
     * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
     */
    removeListener<K extends keyof EventMap>(type: K, target: EventTarget, listener: ListenerFn<K>, useCapture?: boolean): void;
    removeListener<K extends keyof EventMap>(type: K, listener: ListenerFn<K>, useCapture?: boolean): void;
}
export declare class DomListener<K extends keyof EventMap> {
    type: string;
    target: EventTarget;
    listener: ListenerFn<K>;
    useCapture: boolean;
    constructor(type: string, target: EventTarget, listener: ListenerFn<K>, useCapture?: boolean);
    equals(domListener: any): boolean;
    add(): void;
    remove(): void;
}
export declare class DestroyListener extends DomListener<'destroy'> {
    constructor(target: EventTarget, listener: ListenerFn<'destroy'>);
    add(): void;
    remove(): void;
}
export {};
