///|
#external
type HTMLElement

///|
pub trait IsHtmlElement: IsElement {
  as_html_element(Self) -> HTMLElement = _
  set_style(Self, String, String) -> Unit = _
  remove_style(Self, String) -> Unit = _
}

///|
pub impl IsEventTarget for HTMLElement

///|
pub impl IsNode for HTMLElement

///|
pub impl IsElement for HTMLElement

///|
pub impl IsHtmlElement for HTMLElement

///|
impl IsHtmlElement with as_html_element(s) {
  js_identity(s)
}

///|
impl IsHtmlElement with set_style(s, key, value) {
  s |> js_identity |> ffi_html_element_set_style(key, value)
}

///|
impl IsHtmlElement with remove_style(s, key) {
  s |> js_identity |> ffi_html_element_remove_style(key)
}

///|
extern "js" fn ffi_html_element_set_style(
  x : @js.Value,
  key : String,
  value : String
) -> Unit =
  #| (self,key,value) => self.style[key] = value

///|
extern "js" fn ffi_html_element_remove_style(x : @js.Value, key : String) =
  #| (self,key) => self.style[key] = ''