import { Constructor } from "@implab/core-amd/interfaces"; import { HtmlRendition } from "./tsx/HtmlRendition"; import { WidgetRendition } from "./tsx/WidgetRendition"; import { isWidgetConstructor, Rendition } from "./tsx/traits"; import { FunctionRendition } from "./tsx/FunctionRendition"; export function createElement Element)>(elementType: T, ...args: any[]): Rendition { if (typeof elementType === "string") { const ctx = new HtmlRendition(elementType); if (args) args.forEach(x => ctx.visitNext(x)); return ctx; } else if (isWidgetConstructor(elementType)) { const ctx = new WidgetRendition(elementType); if (args) args.forEach(x => ctx.visitNext(x)); return ctx; } else if (typeof elementType === "function") { const ctx = new FunctionRendition(elementType as (props: any) => Element); if (args) args.forEach(x => ctx.visitNext(x)); return ctx; } else { throw new Error(`The element type '${elementType}' is unsupported`); } } export interface EventDetails { detail: T; } export interface EventSelector { selectorTarget: HTMLElement; target: HTMLElement; } export type DojoMouseEvent = MouseEvent & EventSelector & EventDetails;