// Generated from WebIDL - DO NOT EDIT
// Source: @webref/idl/resize-observer

///|
/// ResizeObserverBoxOptions enum
pub(all) enum ResizeObserverBoxOptions {
  BorderBox
  ContentBox
  DevicePixelContentBox
} derive(Eq, Show)

///|
/// Convert to string value
pub fn ResizeObserverBoxOptions::to_string(
  self : ResizeObserverBoxOptions,
) -> String {
  match self {
    ResizeObserverBoxOptions::BorderBox => "border-box"
    ResizeObserverBoxOptions::ContentBox => "content-box"
    ResizeObserverBoxOptions::DevicePixelContentBox =>
      "device-pixel-content-box"
  }
}

///|
/// Parse from string value
pub fn ResizeObserverBoxOptions::from_string(
  s : String,
) -> ResizeObserverBoxOptions? {
  match s {
    "border-box" => Some(ResizeObserverBoxOptions::BorderBox)
    "content-box" => Some(ResizeObserverBoxOptions::ContentBox)
    "device-pixel-content-box" =>
      Some(ResizeObserverBoxOptions::DevicePixelContentBox)
    _ => None
  }
}

///|
/// ResizeObserverCallback callback interface
pub type ResizeObserverCallback

///|
/// Create ResizeObserverCallback from a MoonBit function
pub extern "js" fn ResizeObserverCallback::from_fn(
  handler : (Array[ResizeObserverEntry], ResizeObserver) -> Unit,
) -> ResizeObserverCallback =
  #| (handler) => (a0, a1) => handler(a0, a1)

///|
/// ResizeObserverOptions dictionary
pub(all) struct ResizeObserverOptions {
  box : ResizeObserverBoxOptions?
}

///|
/// Create a new ResizeObserverOptions with default values
pub fn ResizeObserverOptions::default() -> ResizeObserverOptions {
  ResizeObserverOptions::{ box: None }
}

///|
extern "js" fn ResizeObserverOptions::to_js_ffi(
  self : ResizeObserverOptions,
) -> JsValue =
  #| (self) => ({
  #|   box: ((() => { const v = self.box; if (v === undefined) return undefined; return ['border-box', 'content-box', 'device-pixel-content-box'][v]; })())
  #| })

///|
/// Convert to JsValue
pub fn ResizeObserverOptions::to_js(self : ResizeObserverOptions) -> JsValue {
  ResizeObserverOptions::to_js_ffi(self)
}

///|
extern "js" fn ResizeObserverOptions::from_js_ffi(
  value : JsValue,
) -> ResizeObserverOptions =
  #| (v) => ({
  #|   box: (v.box === undefined ? undefined : ['border-box', 'content-box', 'device-pixel-content-box'].indexOf(v.box))
  #| })

///|
/// Convert from JsValue
pub fn ResizeObserverOptions::from_js(value : JsValue) -> ResizeObserverOptions {
  ResizeObserverOptions::from_js_ffi(value)
}

///|
/// ResizeObserver interface
pub type ResizeObserver

///|
pub extern "js" fn ResizeObserver::to_js_value(
  self : ResizeObserver,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to ResizeObserver (unchecked)
pub extern "js" fn ResizeObserver::from_js_value(v : JsValue) -> ResizeObserver =
  #| (v) => v

///|
/// Safely cast JsValue to ResizeObserver (checked with instanceof)
pub extern "js" fn ResizeObserver::from_js_value_opt(
  v : JsValue,
) -> ResizeObserver? =
  #| (v) => (v instanceof ResizeObserver) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to ResizeObserver (checked with instanceof)
pub extern "js" fn JsValue::as_resize_observer(
  self : JsValue,
) -> ResizeObserver? =
  #| (self) => (self instanceof ResizeObserver) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to ResizeObserver (unchecked)
pub extern "js" fn JsValue::to_resize_observer(
  self : JsValue,
) -> ResizeObserver =
  #| (self) => self

///|
pub extern "js" fn ResizeObserver::new(
  callback : ResizeObserverCallback,
) -> ResizeObserver =
  #| (callback) => new ResizeObserver(callback)

///|
pub extern "js" fn ResizeObserver::observe(
  self : ResizeObserver,
  target : Element,
) -> Unit =
  #| (self, target) => self.observe(target)

///|
extern "js" fn ResizeObserver::observe_with_options_ffi(
  self : ResizeObserver,
  target : Element,
  options : JsValue,
) -> Unit =
  #| (self, target, options) => self.observe(target, options)

///|
pub fn ResizeObserver::observe_with_options(
  self : ResizeObserver,
  target : Element,
  options : ResizeObserverOptions,
) -> Unit {
  ResizeObserver::observe_with_options_ffi(self, target, options.to_js())
}

///|
pub extern "js" fn ResizeObserver::unobserve(
  self : ResizeObserver,
  target : Element,
) -> Unit =
  #| (self, target) => self.unobserve(target)

///|
pub extern "js" fn ResizeObserver::disconnect(self : ResizeObserver) -> Unit =
  #| (self) => self.disconnect()

///|
/// ResizeObserverEntry interface
pub type ResizeObserverEntry

///|
pub extern "js" fn ResizeObserverEntry::to_js_value(
  self : ResizeObserverEntry,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to ResizeObserverEntry (unchecked)
pub extern "js" fn ResizeObserverEntry::from_js_value(
  v : JsValue,
) -> ResizeObserverEntry =
  #| (v) => v

///|
/// Safely cast JsValue to ResizeObserverEntry (checked with instanceof)
pub extern "js" fn ResizeObserverEntry::from_js_value_opt(
  v : JsValue,
) -> ResizeObserverEntry? =
  #| (v) => (v instanceof ResizeObserverEntry) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to ResizeObserverEntry (checked with instanceof)
pub extern "js" fn JsValue::as_resize_observer_entry(
  self : JsValue,
) -> ResizeObserverEntry? =
  #| (self) => (self instanceof ResizeObserverEntry) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to ResizeObserverEntry (unchecked)
pub extern "js" fn JsValue::to_resize_observer_entry(
  self : JsValue,
) -> ResizeObserverEntry =
  #| (self) => self

///|
pub extern "js" fn ResizeObserverEntry::get_target(
  self : ResizeObserverEntry,
) -> Element =
  #| (self) => self.target

///|
pub extern "js" fn ResizeObserverEntry::get_content_rect(
  self : ResizeObserverEntry,
) -> DOMRectReadOnly =
  #| (self) => self.contentRect

///|
pub extern "js" fn ResizeObserverEntry::get_border_box_size(
  self : ResizeObserverEntry,
) -> Array[ResizeObserverSize] =
  #| (self) => self.borderBoxSize

///|
pub extern "js" fn ResizeObserverEntry::get_content_box_size(
  self : ResizeObserverEntry,
) -> Array[ResizeObserverSize] =
  #| (self) => self.contentBoxSize

///|
pub extern "js" fn ResizeObserverEntry::get_device_pixel_content_box_size(
  self : ResizeObserverEntry,
) -> Array[ResizeObserverSize] =
  #| (self) => self.devicePixelContentBoxSize

///|
/// ResizeObserverSize interface
pub type ResizeObserverSize

///|
pub extern "js" fn ResizeObserverSize::to_js_value(
  self : ResizeObserverSize,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to ResizeObserverSize (unchecked)
pub extern "js" fn ResizeObserverSize::from_js_value(
  v : JsValue,
) -> ResizeObserverSize =
  #| (v) => v

///|
/// Safely cast JsValue to ResizeObserverSize (checked with instanceof)
pub extern "js" fn ResizeObserverSize::from_js_value_opt(
  v : JsValue,
) -> ResizeObserverSize? =
  #| (v) => (v instanceof ResizeObserverSize) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to ResizeObserverSize (checked with instanceof)
pub extern "js" fn JsValue::as_resize_observer_size(
  self : JsValue,
) -> ResizeObserverSize? =
  #| (self) => (self instanceof ResizeObserverSize) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to ResizeObserverSize (unchecked)
pub extern "js" fn JsValue::to_resize_observer_size(
  self : JsValue,
) -> ResizeObserverSize =
  #| (self) => self

///|
pub extern "js" fn ResizeObserverSize::get_inline_size(
  self : ResizeObserverSize,
) -> Double =
  #| (self) => self.inlineSize

///|
pub extern "js" fn ResizeObserverSize::get_block_size(
  self : ResizeObserverSize,
) -> Double =
  #| (self) => self.blockSize