export type CreateElement = {
(...children: (Node | string)[]): T;
(attrs: Partial, ...children: (Node | string)[]): T;
};
type ElementCreator = {
[K in keyof HTMLElementTagNameMap]: CreateElement;
};
const h = new Proxy({} as ElementCreator, {
get:
(_, tag: string) =>
(...args: any[]) => {
const el = document.createElement(tag);
if (args[0]?.constructor === Object) {
const { dataset, ...attrs } = args.shift();
Object.assign(el, attrs);
if (dataset) {
Object.assign(el.dataset, dataset);
}
}
el.append(...args.flat());
return el;
},
});
export default h;