From cbcc269be607cc964fbd69d179d8a0e8b8e4bffa Mon Sep 17 00:00:00 2001 From: Joris Date: Mon, 3 Feb 2020 18:28:50 +0100 Subject: Extract dom and number utilities to external files --- src/dom.ts | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/dom.ts (limited to 'src/dom.ts') diff --git a/src/dom.ts b/src/dom.ts new file mode 100644 index 0000000..6b1c803 --- /dev/null +++ b/src/dom.ts @@ -0,0 +1,54 @@ +type Attribute = string | boolean | ((e: Event) => void) + +type Child = Element | string + +export function h(tag: string, attrs: {[key: string]: Attribute}, children: Array = []): Element { + let element = document.createElement(tag) + + for (let name in attrs) { + let value = attrs[name] + if (typeof value === 'boolean') { + if (value) { + element.setAttribute(name, name) + } + } else if (typeof value === 'function') { + (element as any)[name] = (e: Event) => { + (value as ((e: Event) => void))(e) + } + } else { + element.setAttribute(name, value) + } + } + + children.forEach(child => { + if (typeof child === 'string') { + element.appendChild(document.createTextNode(child)) + } else { + element.appendChild(child) + } + }) + + return element +} + +export function toggleClassName(node: Element, className: string) { + if (node.className === className) { + node.className = '' + } else { + node.className = className + } +} + +export function nodeListToArray(nodeList: NodeListOf): HTMLElement[] { + const xs: HTMLElement[] = []; + nodeList.forEach(node => xs.push(node)) + return xs +} + +export function replace(node: Node, replacement: Node) { + const parentNode = node.parentNode + + if (parentNode) { + parentNode.replaceChild(replacement, node) + } +} -- cgit v1.2.3