summaryrefslogtreecommitdiff
path: root/web/src/html.ts
blob: a1188499798132bb0207a6ef98518ac08ed1cd14 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
export function createElement<T extends HTMLElement>(
  tag: string,
  ...children: (Node | string)[]
): T;

export function createElement<T extends HTMLElement>(
  tag: string,
  attrs: Partial<T>,
  ...children: (Node | string)[]
): T;

export function createElement(tag: string, ...args: any[]) {
  const el = document.createElement(tag);

  if (args[0]?.constructor === Object) {
    const { dataset, style, ...attrs } = args.shift();
    Object.assign(el, attrs);
    if (dataset) Object.assign(el.dataset, dataset);
    if (style) Object.assign(el.style, style);
  }

  el.append(...args.flat());

  return el;
}

export type CreateElement<T extends HTMLElement> = {
  (...children: (Node | string)[]): T;
  (attrs: Partial<T>, ...children: (Node | string)[]): T;
};

type ElementCreator = {
  [K in keyof HTMLElementTagNameMap]: CreateElement<HTMLElementTagNameMap[K]>;
};

const h = new Proxy({} as ElementCreator, {
  get:
    (_, tagName: string) =>
    (...args: any[]) => {
      return createElement(tagName, ...args);
    },
});

export default h;