(* Element creation *) type attribute = | TextAttr of string * string | EventAttr of string * (Dom.event -> unit) let h tag attributes children = let element = if tag == "svg" || tag == "path" then Document.createElementNS "http://www.w3.org/2000/svg" tag else Document.createElement tag in let () = Js.Array.forEach (fun attr -> match attr with | TextAttr (name, value) -> Element.setAttribute element name value | EventAttr (name, eventListener) -> Element.addEventListener element name eventListener) attributes in let () = Js.Array.forEach (fun child -> Element.appendChild element child) children in element (* Node creation *) let text = Document.createTextNode let div = h "div" let span = h "span" let header = h "header" let button = h "button" let section = h "section" let svg = h "svg" let path = h "path" let form = h "form" let label = h "label" let input = h "input" let textarea = h "textarea" let i = h "i" let a = h "a" let h1 = h "h1" let h2 = h "h2" let h3 = h "h3"