import { symbols, Listeners } from './internal';
import { TagNameMap, Attrs, Factory as BaseFactory } from './util/dom';
declare global {
    interface ElementEventMap {
        'mutate': Event;
        'connect': Event;
        'disconnect': Event;
    }
}
export interface El<T extends string = string, E extends Element = Element, C extends El.Children = El.Children> {
    readonly tag: T;
    readonly element: E;
    get children(): El.Getter<C>;
    set children(children: El.Setter<C>);
}
export declare namespace El {
    type Children = Children.Void | Children.Node | Children.Text | Children.Array | Children.Struct;
    namespace Children {
        type Void = void;
        type Node = DocumentFragment;
        type Text = string;
        type Array = readonly El[];
        type Struct = {
            [field: string]: El;
        };
    }
    type Getter<C extends El.Children> = C;
    type Setter<C extends El.Children> = C extends Children.Struct ? Partial<C> : C;
    type Factory<M extends TagNameMap, C extends El.Children = El.Children> = <T extends keyof M & string>(baseFactory: BaseFactory<M>, tag: T, attrs: Attrs<Extract<M[T], Element>>, children: C) => M[T];
}
export declare class ElementProxy<T extends string = string, E extends Element = Element, C extends El.Children = El.Children> implements El<T, E, C> {
    readonly tag: T;
    readonly element: E;
    private readonly container;
    constructor(tag: T, element: E, children: C, container?: Element | ShadowRoot);
    private isInternalUpdate;
    private observe;
    private readonly type;
    private isInit;
    private $children;
    readonly [symbols.listeners]: Listeners;
    get children(): El.Getter<C>;
    set children(children: El.Setter<C>);
}
