// Do not edit. This file is generated.
// MoonBit type: HTMLMeterElement
// Specifications: html.idl

///|
/// [HTMLMeterElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMeterElement)
#external
pub type HTMLMeterElement

///|
pub impl TJsValue for HTMLMeterElement with to_js(self : HTMLMeterElement) -> JsValue = "%identity"

///|
pub impl FromJsAny for HTMLMeterElement with from_js_any(value : JsAny) -> HTMLMeterElement = "%identity"

///|
/// Unchecked downcast — no runtime type check is performed.
/// Prefer `try_into()` for checked downcasts.
#deprecated("Use unsafe_into or try_into instead")
pub fn[T : THTMLMeterElement] HTMLMeterElement::into(
  self : HTMLMeterElement,
) -> T = "%identity"

///|
/// Unchecked downcast — no runtime type check is performed.
/// WARNING: If the underlying JS value is not of type T, this will silently
/// produce a value with incorrect type, leading to undefined behavior.
pub fn[T : THTMLMeterElement] HTMLMeterElement::unsafe_into(
  self : HTMLMeterElement,
) -> T = "%identity"

///|
pub impl HasConstructor for HTMLMeterElement with constructor_name() {
  "HTMLMeterElement"
}

///|
/// Checked downcast — returns None if the JS value is not an instance of T.
pub fn[T : THTMLMeterElement + HasConstructor] HTMLMeterElement::try_into(
  self : HTMLMeterElement,
) -> T? {
  if js_instanceof(TJsValue::to_js(self), T::constructor_name()) {
    Some(self.unsafe_into())
  } else {
    None
  }
}

///|
pub impl THTMLMeterElement for HTMLMeterElement

///|
pub impl THTMLElement for HTMLMeterElement

///|
pub impl TElement for HTMLMeterElement

///|
pub impl TNode for HTMLMeterElement

///|
pub impl TEventTarget for HTMLMeterElement

///|
pub fn HTMLMeterElement::new() -> HTMLMeterElement {
  html_meter_element_new_ffi()
}

///|
/// [HTMLMeterElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMeterElement) interface.
pub trait THTMLMeterElement: THTMLElement {
  value(self : Self) -> Double = _
  set_value(self : Self, value : Double) -> Unit = _
  min(self : Self) -> Double = _
  set_min(self : Self, min : Double) -> Unit = _
  max(self : Self) -> Double = _
  set_max(self : Self, max : Double) -> Unit = _
  low(self : Self) -> Double = _
  set_low(self : Self, low : Double) -> Unit = _
  high(self : Self) -> Double = _
  set_high(self : Self, high : Double) -> Unit = _
  optimum(self : Self) -> Double = _
  set_optimum(self : Self, optimum : Double) -> Unit = _
  labels(self : Self) -> NodeList = _
}

///|
/// [HTMLMeterElement.value](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMeterElement/value)
impl THTMLMeterElement with value(self : Self) -> Double {
  html_meter_element_value_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMeterElement.value](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMeterElement/value)
impl THTMLMeterElement with set_value(self : Self, value : Double) -> Unit {
  html_meter_element_set_value_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(value),
  )
}

///|
/// [HTMLMeterElement.min](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMeterElement/min)
impl THTMLMeterElement with min(self : Self) -> Double {
  html_meter_element_min_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMeterElement.min](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMeterElement/min)
impl THTMLMeterElement with set_min(self : Self, min : Double) -> Unit {
  html_meter_element_set_min_ffi(TJsValue::to_js(self), TJsValue::to_js(min))
}

///|
/// [HTMLMeterElement.max](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMeterElement/max)
impl THTMLMeterElement with max(self : Self) -> Double {
  html_meter_element_max_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMeterElement.max](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMeterElement/max)
impl THTMLMeterElement with set_max(self : Self, max : Double) -> Unit {
  html_meter_element_set_max_ffi(TJsValue::to_js(self), TJsValue::to_js(max))
}

///|
/// [HTMLMeterElement.low](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMeterElement/low)
impl THTMLMeterElement with low(self : Self) -> Double {
  html_meter_element_low_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMeterElement.low](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMeterElement/low)
impl THTMLMeterElement with set_low(self : Self, low : Double) -> Unit {
  html_meter_element_set_low_ffi(TJsValue::to_js(self), TJsValue::to_js(low))
}

///|
/// [HTMLMeterElement.high](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMeterElement/high)
impl THTMLMeterElement with high(self : Self) -> Double {
  html_meter_element_high_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMeterElement.high](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMeterElement/high)
impl THTMLMeterElement with set_high(self : Self, high : Double) -> Unit {
  html_meter_element_set_high_ffi(TJsValue::to_js(self), TJsValue::to_js(high))
}

///|
/// [HTMLMeterElement.optimum](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMeterElement/optimum)
impl THTMLMeterElement with optimum(self : Self) -> Double {
  html_meter_element_optimum_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMeterElement.optimum](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMeterElement/optimum)
impl THTMLMeterElement with set_optimum(self : Self, optimum : Double) -> Unit {
  html_meter_element_set_optimum_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(optimum),
  )
}

///|
/// [HTMLMeterElement.labels](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMeterElement/labels)
impl THTMLMeterElement with labels(self : Self) -> NodeList {
  html_meter_element_labels_ffi(TJsValue::to_js(self))
}

///|
#cfg(target="js")
extern "js" fn html_meter_element_new_ffi() -> HTMLMeterElement = "() => new HTMLMeterElement()"

///|
#cfg(target="js")
extern "js" fn html_meter_element_value_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.value"

///|
#cfg(target="js")
fn html_meter_element_value_ffi(obj : JsValue) -> Double {
  html_meter_element_value_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_meter_element_set_value_ffi(
  obj : JsValue,
  value : JsValue,
) -> Unit = "(obj, value) => { obj.value = value; }"

///|
#cfg(target="js")
extern "js" fn html_meter_element_min_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.min"

///|
#cfg(target="js")
fn html_meter_element_min_ffi(obj : JsValue) -> Double {
  html_meter_element_min_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_meter_element_set_min_ffi(
  obj : JsValue,
  min : JsValue,
) -> Unit = "(obj, min) => { obj.min = min; }"

///|
#cfg(target="js")
extern "js" fn html_meter_element_max_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.max"

///|
#cfg(target="js")
fn html_meter_element_max_ffi(obj : JsValue) -> Double {
  html_meter_element_max_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_meter_element_set_max_ffi(
  obj : JsValue,
  max : JsValue,
) -> Unit = "(obj, max) => { obj.max = max; }"

///|
#cfg(target="js")
extern "js" fn html_meter_element_low_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.low"

///|
#cfg(target="js")
fn html_meter_element_low_ffi(obj : JsValue) -> Double {
  html_meter_element_low_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_meter_element_set_low_ffi(
  obj : JsValue,
  low : JsValue,
) -> Unit = "(obj, low) => { obj.low = low; }"

///|
#cfg(target="js")
extern "js" fn html_meter_element_high_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.high"

///|
#cfg(target="js")
fn html_meter_element_high_ffi(obj : JsValue) -> Double {
  html_meter_element_high_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_meter_element_set_high_ffi(
  obj : JsValue,
  high : JsValue,
) -> Unit = "(obj, high) => { obj.high = high; }"

///|
#cfg(target="js")
extern "js" fn html_meter_element_optimum_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.optimum"

///|
#cfg(target="js")
fn html_meter_element_optimum_ffi(obj : JsValue) -> Double {
  html_meter_element_optimum_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_meter_element_set_optimum_ffi(
  obj : JsValue,
  optimum : JsValue,
) -> Unit = "(obj, optimum) => { obj.optimum = optimum; }"

///|
#cfg(target="js")
extern "js" fn html_meter_element_labels_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.labels"

///|
#cfg(target="js")
fn html_meter_element_labels_ffi(obj : JsValue) -> NodeList {
  html_meter_element_labels_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="wasm-gc")
fn html_meter_element_new_ffi() -> HTMLMeterElement = "webapi_HTMLMeterElement" "new"

///|
#cfg(target="wasm-gc")
fn html_meter_element_value_ffi(obj : JsValue) -> Double = "webapi_HTMLMeterElement" "get_value"

///|
#cfg(target="wasm-gc")
fn html_meter_element_set_value_ffi(obj : JsValue, value : JsValue) -> Unit = "webapi_HTMLMeterElement" "set_value"

///|
#cfg(target="wasm-gc")
fn html_meter_element_min_ffi(obj : JsValue) -> Double = "webapi_HTMLMeterElement" "get_min"

///|
#cfg(target="wasm-gc")
fn html_meter_element_set_min_ffi(obj : JsValue, min : JsValue) -> Unit = "webapi_HTMLMeterElement" "set_min"

///|
#cfg(target="wasm-gc")
fn html_meter_element_max_ffi(obj : JsValue) -> Double = "webapi_HTMLMeterElement" "get_max"

///|
#cfg(target="wasm-gc")
fn html_meter_element_set_max_ffi(obj : JsValue, max : JsValue) -> Unit = "webapi_HTMLMeterElement" "set_max"

///|
#cfg(target="wasm-gc")
fn html_meter_element_low_ffi(obj : JsValue) -> Double = "webapi_HTMLMeterElement" "get_low"

///|
#cfg(target="wasm-gc")
fn html_meter_element_set_low_ffi(obj : JsValue, low : JsValue) -> Unit = "webapi_HTMLMeterElement" "set_low"

///|
#cfg(target="wasm-gc")
fn html_meter_element_high_ffi(obj : JsValue) -> Double = "webapi_HTMLMeterElement" "get_high"

///|
#cfg(target="wasm-gc")
fn html_meter_element_set_high_ffi(obj : JsValue, high : JsValue) -> Unit = "webapi_HTMLMeterElement" "set_high"

///|
#cfg(target="wasm-gc")
fn html_meter_element_optimum_ffi(obj : JsValue) -> Double = "webapi_HTMLMeterElement" "get_optimum"

///|
#cfg(target="wasm-gc")
fn html_meter_element_set_optimum_ffi(obj : JsValue, optimum : JsValue) -> Unit = "webapi_HTMLMeterElement" "set_optimum"

///|
#cfg(target="wasm-gc")
fn html_meter_element_labels_ffi(obj : JsValue) -> NodeList = "webapi_HTMLMeterElement" "get_labels"