// =============================================================================
// AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
// Generated by: scripts/generate_dom_elements.ts
// =============================================================================

///| Element factories for browser DOM with DSL syntax

///|

///| These functions create DOM elements with event handler support.

///| Uses HandlerMap and build_props from dsl.mbt.

// =============================================================================

// HTML Element factories

// =============================================================================

///|
/// Create a main element
pub fn main_(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("main", props, children)
}

///|
/// Create a nav element
pub fn nav(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("nav", props, children)
}

///|
/// Create a header element
pub fn header_(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("header", props, children)
}

///|
/// Create a footer element
pub fn footer_(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("footer", props, children)
}

///|
/// Create a section element
pub fn section(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("section", props, children)
}

///|
/// Create an article element
pub fn article(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("article", props, children)
}

///|
/// Create an aside element
pub fn aside(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("aside", props, children)
}

///|
/// Create a div element
pub fn div(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("div", props, children)
}

///|
/// Create a span element
pub fn span(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("span", props, children)
}

///|
/// Create a p element
pub fn p(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("p", props, children)
}

///|
/// Create an anchor element
pub fn a(
  href? : String,
  target? : String,
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if href is Some(v) {
    props.push(("href", Static(v)))
  }
  if target is Some(v) {
    props.push(("target", Static(v)))
  }
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("a", props, children)
}

///|
/// Create h1 element
pub fn h1(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("h1", props, children)
}

///|
/// Create h2 element
pub fn h2(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("h2", props, children)
}

///|
/// Create h3 element
pub fn h3(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("h3", props, children)
}

///|
/// Create h4 element
pub fn h4(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("h4", props, children)
}

///|
/// Create h5 element
pub fn h5(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("h5", props, children)
}

///|
/// Create h6 element
pub fn h6(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("h6", props, children)
}

///|
/// Create ul element
pub fn ul(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("ul", props, children)
}

///|
/// Create ol element
pub fn ol(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("ol", props, children)
}

///|
/// Create li element
pub fn li(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("li", props, children)
}

///|
/// Create a button element
pub fn button(
  disabled? : Bool,
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  dyn_disabled? : () -> Bool,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if disabled is Some(true) {
    props.push(("disabled", Static("true")))
  }
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  if dyn_disabled is Some(getter) {
    props.push(("disabled", Dynamic(fn() { getter().to_string() })))
  }
  create_element("button", props, children)
}

///|
/// Create an input element
pub fn input(
  type_? : String,
  name? : String,
  value? : String,
  placeholder? : String,
  disabled? : Bool,
  readonly_? : Bool,
  required? : Bool,
  checked? : Bool,
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  dyn_value? : () -> String,
  dyn_disabled? : () -> Bool,
  dyn_checked? : () -> Bool,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if type_ is Some(v) {
    props.push(("type", Static(v)))
  }
  if name is Some(v) {
    props.push(("name", Static(v)))
  }
  if value is Some(v) {
    props.push(("value", Static(v)))
  }
  if placeholder is Some(v) {
    props.push(("placeholder", Static(v)))
  }
  if disabled is Some(true) {
    props.push(("disabled", Static("true")))
  }
  if readonly_ is Some(true) {
    props.push(("readonly", Static("true")))
  }
  if required is Some(true) {
    props.push(("required", Static("true")))
  }
  if checked is Some(true) {
    props.push(("checked", Static("true")))
  }
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  if dyn_value is Some(getter) {
    props.push(("value", Dynamic(getter)))
  }
  if dyn_disabled is Some(getter) {
    props.push(("disabled", Dynamic(fn() { getter().to_string() })))
  }
  if dyn_checked is Some(getter) {
    props.push(("checked", Dynamic(fn() { getter().to_string() })))
  }
  create_element("input", props, [])
}

///|
/// Create a textarea element
pub fn textarea(
  name? : String,
  placeholder? : String,
  disabled? : Bool,
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if name is Some(v) {
    props.push(("name", Static(v)))
  }
  if placeholder is Some(v) {
    props.push(("placeholder", Static(v)))
  }
  if disabled is Some(true) {
    props.push(("disabled", Static("true")))
  }
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("textarea", props, children)
}

///|
/// Create a form element
pub fn form(
  action? : String,
  http_method? : String,
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if action is Some(v) {
    props.push(("action", Static(v)))
  }
  if http_method is Some(v) {
    props.push(("method", Static(v)))
  }
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("form", props, children)
}

///|
/// Create a label element
pub fn label(
  for_? : String,
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if for_ is Some(v) {
    props.push(("for", Static(v)))
  }
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("label", props, children)
}

///|
/// Create img element
pub fn img(
  src? : String,
  alt? : String,
  width? : String,
  height? : String,
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if src is Some(v) {
    props.push(("src", Static(v)))
  }
  if alt is Some(v) {
    props.push(("alt", Static(v)))
  }
  if width is Some(v) {
    props.push(("width", Static(v)))
  }
  if height is Some(v) {
    props.push(("height", Static(v)))
  }
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("img", props, [])
}

///|
/// Create br element
pub fn br(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("br", props, [])
}

///|
/// Create hr element
pub fn hr(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("hr", props, [])
}

///|
/// Create strong element
pub fn strong(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("strong", props, children)
}

///|
/// Create em element
pub fn em(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("em", props, children)
}

///|
/// Create code element
pub fn code(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("code", props, children)
}

///|
/// Create pre element
pub fn pre(
  id? : String,
  class? : String,
  style? : String,
  dyn_class? : () -> String,
  dyn_style? : () -> String,
  on? : HandlerMap,
  ref_? : ElementRef,
  attrs? : Array[(String, Attr)],
  dyn_attrs? : Array[(String, AttrValue)],
  children : Array[DomNode],
) -> DomNode {
  let props = build_props(id, class, style, on, ref_, attrs, dyn_attrs~)
  if dyn_class is Some(getter) {
    props.push(("className", Dynamic(getter)))
  }
  if dyn_style is Some(getter) {
    props.push(("style", Dynamic(getter)))
  }
  create_element("pre", props, children)
}
// =============================================================================
// Text helpers
// =============================================================================

///|
/// Create a static text node
pub fn text(content : String) -> DomNode {
  ToDomNode::to_dom_node(content)
}

///|
/// Create a reactive text node from a getter function
pub fn text_dyn(content : () -> String) -> DomNode {
  text_node(content)
}

///|
/// Create a reactive text node from a signal
pub fn[T : Show] text_sig(sig : @resource.Signal[T]) -> DomNode {
  text_from_signal(sig)
}

///|
/// Create a reactive text node from a signal (alias for text_sig)
pub fn[T : Show] text_of(sig : @resource.Signal[T]) -> DomNode {
  text_from_signal(sig)
}

// =============================================================================
// AttrValue factory functions for external use
// =============================================================================

///|
/// Create a static attribute value
pub fn attr_static(value : String) -> AttrValue {
  Static(value)
}

///|
/// Create a dynamic attribute value
pub fn attr_dynamic(getter : () -> String) -> AttrValue {
  Dynamic(getter)
}

///|
/// Create an event handler attribute
pub fn attr_handler(handler : (@js.Any) -> Unit) -> AttrValue {
  Handler(handler)
}

///|
/// Create a static style attribute (string form, e.g. "color: red; margin: 10px")
pub fn attr_style(style : String) -> AttrValue {
  Static(style)
}

///|
/// Create a dynamic style attribute
pub fn attr_dynamic_style(getter : () -> String) -> AttrValue {
  Dynamic(getter)
}

// =============================================================================
// JSX Runtime - For TSX/JSX compatibility
// =============================================================================

///|
/// JSX runtime: jsx function (maps directly to create_element)
/// Usage in TSX: 
children
pub fn jsx( tag : String, attrs : Array[(String, AttrValue)], children : Array[DomNode], ) -> DomNode { create_element(tag, attrs, children) } ///| /// JSX runtime: jsxs function (same as jsx, for static children) pub fn jsxs( tag : String, attrs : Array[(String, AttrValue)], children : Array[DomNode], ) -> DomNode { create_element(tag, attrs, children) } ///| /// JSX runtime: Fragment (returns children as a DocumentFragment) pub fn fragment(children : Array[DomNode]) -> DomNode { // Return single child directly for optimization match children.length() { 0 => { // Empty fragment: return empty DocumentFragment let doc = @js_dom.document() let frag = doc.createDocumentFragment() Raw(frag.as_node()) } 1 => children[0] _ => { // Multiple children: use real DocumentFragment let doc = @js_dom.document() let frag = doc.createDocumentFragment() for child in children { frag.as_node().appendChild(child.to_dom()) |> ignore } Raw(frag.as_node()) } } }