38 lines
1.1 KiB
JavaScript
38 lines
1.1 KiB
JavaScript
export async function renderSvg(relativePath) {
|
|
const svgRes = await fetch(relativePath);
|
|
const svgText = await svgRes.text();
|
|
const parser = new DOMParser();
|
|
const svgDoc = parser.parseFromString(svgText, "image/svg+xml");
|
|
const svgElement = svgDoc.documentElement;
|
|
|
|
return svgElement;
|
|
}
|
|
|
|
export function html(tag, props = {}, children = []) {
|
|
const element = document.createElement(tag);
|
|
|
|
Object.entries(props).forEach(([key, value]) => {
|
|
if (key === "textContent" || key === "innerHTML") {
|
|
element[key] = value;
|
|
} else if (key === "style" && typeof value === "object") {
|
|
Object.assign(element.style, value);
|
|
} else if (key === "class") {
|
|
element.className = value;
|
|
} else if (key.startsWith("on")) {
|
|
element.addEventListener(key.slice(2).toLowerCase(), value);
|
|
} else {
|
|
element.setAttribute(key, value);
|
|
}
|
|
});
|
|
|
|
children.flat().forEach((child) => {
|
|
if (typeof child === "string") {
|
|
element.appendChild(document.createTextNode(child));
|
|
} else if (child instanceof Node) {
|
|
element.appendChild(child);
|
|
}
|
|
});
|
|
|
|
return element;
|
|
}
|