type Empty = null | undefined;
type RefOrRefFn = Element | (() => HTMLElement | Empty) | Empty;

type Logger = {
    error(...data: any[]): void;
    warn(...data: any[]): void;
    info(...data: any[]): void;
    debug(...data: any[]): void;
};
declare class BaseDriver {
    #private;
    logger: Logger | undefined;
    nodeName: string;
    constructor(refOrRefFn: RefOrRefFn, config: {
        logger: Logger;
    });
    get asyncEle(): Promise<Element>;
    get ele(): Element;
}

type Column = {
    path: string;
    header: string;
    type: string;
    attrs: Record<string, string>;
};
declare class GridDriver<T extends any> extends BaseDriver {
    #private;
    nodeName: string;
    onSelectedItemsChange(cb: (e: CustomEvent<{
        value: T[];
    }>) => void): () => void;
    get ele(): Element & {
        data: T[];
        columns: Column[];
        renderColumn: ({ path, header, type, attrs }: Column) => string;
    };
    get data(): T[];
    set data(data: T[]);
    get columns(): any[];
    filterColumns(filterFn: (col: Column) => boolean): void;
    onColumnsChange(cb: (columns: Column[]) => void): void;
    set renderColumn(renderFn: ({ path, header, type, attrs }: Column) => string);
}

declare class ButtonDriver extends BaseDriver {
    nodeName: string;
    onClick(cb: (e: Event) => void): () => void;
    disable(): void;
    enable(): void;
}

declare class ModalDriver extends BaseDriver {
    #private;
    beforeOpen: undefined | (() => void | Promise<void>);
    afterClose: undefined | (() => void);
    nodeName: string;
    close(): void;
    open(): Promise<void>;
    reset(): void;
    setContent(template: HTMLTemplateElement): void;
    remove(): void;
}

declare class MultiSelectDriver extends BaseDriver {
    nodeName: string;
    setData(data: {
        label: string;
        value: string;
    }[]): Promise<void>;
}

declare class SingleSelectDriver extends BaseDriver {
    nodeName: string;
    onInput(cb: (e: InputEvent) => void): () => void;
    get value(): string;
    set value(value: string);
    setData(data: {
        label: string;
        value: string;
    }[]): Promise<void>;
}

declare class NotificationDriver extends BaseDriver {
    nodeName: string;
    close(): void;
    show(): void;
    setContent(template: HTMLTemplateElement): void;
    remove(): void;
}

declare class TextDriver extends BaseDriver {
    nodeName: string;
    get ele(): Element & {
        innerText: string;
    };
    get text(): string;
    set text(content: string);
}

declare class TextFieldDriver extends BaseDriver {
    nodeName: string;
    onInput(cb: (e: InputEvent) => void): () => void;
    get value(): string;
    set value(value: string);
    disable(): void;
    enable(): void;
}

declare class AvatarDriver extends BaseDriver {
    nodeName: string;
    set displayName(name: string);
    set image(imgUrl: string);
    get flowId(): string;
    onClick(cb: (e: Event) => void): () => void;
}

declare class UserAttributeDriver extends BaseDriver {
    nodeName: string;
    set value(value: string);
    set badgeLabel(label: string);
    get label(): string;
    get editFlowId(): string;
    get deleteFlowId(): string;
    onEditClick(cb: (e: Event) => void): () => void;
    onDeleteClick(cb: (e: Event) => void): () => void;
}

declare class UserAuthMethodDriver extends BaseDriver {
    nodeName: string;
    set fulfilled(isFulfilled: boolean);
    onButtonClick(cb: (e: Event) => void): () => void;
    get flowId(): string;
}

declare class FlowDriver extends BaseDriver {
    nodeName: string;
    set projectId(projectId: string);
    set baseUrl(baseUrl: string);
    set flowId(flowId: string);
    set theme(theme: string | null | undefined);
    onSuccess(cb: () => void): () => void;
}

type Data = {
    name: string;
    icon: string;
    url: string;
}[];
declare class AppsListDriver extends BaseDriver {
    nodeName: string;
    set data(data: Data);
    get data(): Data;
    get ele(): Element & {
        data: Data;
    };
}

export { AppsListDriver, AvatarDriver, ButtonDriver, FlowDriver, GridDriver, ModalDriver, MultiSelectDriver, NotificationDriver, SingleSelectDriver, TextDriver, TextFieldDriver, UserAttributeDriver, UserAuthMethodDriver };
