import { GenericRenderer, RenderFunction } from "./core";
type KebabCase<S> = S extends `${infer C}${infer T}` ? KebabCase<T> extends infer U ? U extends string ? T extends Uncapitalize<T> ? `${Uncapitalize<C>}${U}` : `${Uncapitalize<C>}-${U}` : never : never : S;
type Atts<P> = readonly KebabCase<keyof P>[];
interface Renderer<P extends object> extends GenericRenderer<HTMLElement, P> {
    (this: Component<P>, host: Component<P>): unknown | void;
    observedAttributes?: Atts<P>;
    styleSheets?: (CSSStyleSheet | string)[];
}
type Component<P extends object> = HTMLElement & P;
type Constructor<P extends object> = new (...args: unknown[]) => Component<P>;
interface Creator {
    <P extends object>(renderer: Renderer<P>): Constructor<P>;
    <P extends object>(renderer: Renderer<P>, options: Options<P>): Constructor<P>;
    <P extends object>(renderer: Renderer<P>, baseElement: Constructor<{}>, options: Omit<Options<P>, "baseElement">): Constructor<P>;
}
export interface Options<P> {
    baseElement?: Constructor<{}>;
    observedAttributes?: Atts<P>;
    useShadowDOM?: boolean;
    shadowRootInit?: ShadowRootInit;
    styleSheets?: (CSSStyleSheet | string)[];
}
declare function makeComponent(render: RenderFunction): Creator;
export { makeComponent, Component, Constructor as ComponentConstructor, Creator as ComponentCreator, };
