From 602145c956bb594ca0d0e10601cc4ad1a71cf70d Mon Sep 17 00:00:00 2001 From: Josh Kingsley Date: Sun, 23 Nov 2025 19:27:57 +0200 Subject: feat: integrate web and doc packages --- packages/web/src/html.ts | 50 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 packages/web/src/html.ts (limited to 'packages/web/src/html.ts') diff --git a/packages/web/src/html.ts b/packages/web/src/html.ts new file mode 100644 index 0000000..3fccda3 --- /dev/null +++ b/packages/web/src/html.ts @@ -0,0 +1,50 @@ +export function createElement( + tagName: string, + ...children: (Node | string)[] +): T; + +export function createElement( + tagName: string, + attrs: Partial, + ...children: (Node | string)[] +): T; + +export function createElement(tagName: string, ...args: any[]) { + const el = document.createElement(tagName); + + 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 = { + (...children: (Node | string)[]): T; + (attrs: Partial, ...children: (Node | string)[]): T; +}; + +type ElementCreator = { + [K in keyof HTMLElementTagNameMap]: CreateElement; +}; + +const h = new Proxy({} as ElementCreator, { + get: + (_, tagName: string) => + (...args: any[]) => { + return createElement(tagName, ...args); + }, +}); + +export default h; + +export function fragment(...children: (Node | string)[]): DocumentFragment { + const fragment = document.createDocumentFragment(); + fragment.append(...children); + return fragment; +} -- cgit v1.2.3