@pionjs/pion
Version:
Hooks for web components
25 lines (24 loc) • 1.35 kB
TypeScript
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, };