// Tiny element builder. All text goes through append() → text nodes, so API data can never inject HTML. export function el(tag, props = {}, ...children) { const node = document.createElement(tag); for (const [k, v] of Object.entries(props)) { if (v == null || v === false) continue; if (k === 'class') node.className = v; else if (k === 'dataset') Object.assign(node.dataset, v); else node.setAttribute(k, v === true ? '' : v); } node.append(...children.flat().filter((c) => c != null && c !== false)); return node; }