import { serialize } from './serialize.mjs' export function createElement(tree) { if (!tree.type) { if (Array.isArray(tree)) { const frag = document.createDocumentFragment() frag.replaceChildren(...tree.map((leaf) => createElement(leaf))) return frag } return document.createTextNode(tree) } else { const el = document.createElement(tree.type) /** * handle props */ if (tree.props) { Object.entries(tree.props).forEach(([prop, value]) => { const domProp = prop.toLowerCase() if (domProp === 'style' && typeof value === 'object' && !!value) { applyStyles(el, value) } else if (prop in el) { el[prop] = value } else if (domProp in el) { el[domProp] = value } else { el.setAttribute(prop, serialize(value)) } }) } /** * handle children */ tree.children?.forEach((child) => { const childEl = createElement(child) if (childEl instanceof Node) { el.appendChild(childEl) } }) return el } } function applyStyles(el, styleObj) { Object.entries(styleObj).forEach(([rule, value]) => { if (rule in el.style && value) el.style[rule] = value }) }