// Do not edit. This file is generated.
// MoonBit type: MouseEvent
// Specifications: cssom-view.idl, pointerevents.idl

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

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

///|
pub impl FromJsAny for MouseEvent with from_js_any(value : JsAny) -> MouseEvent = "%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 : TMouseEvent] MouseEvent::into(self : MouseEvent) -> 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 : TMouseEvent] MouseEvent::unsafe_into(self : MouseEvent) -> T = "%identity"

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

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

///|
pub impl TMouseEvent for MouseEvent

///|
pub impl TUIEvent for MouseEvent

///|
pub impl TEvent for MouseEvent

///|
pub fn MouseEvent::new(
  type_ : String,
  event_init_dict? : MouseEventInit,
) -> MouseEvent {
  mouse_event_new_ffi(TJsValue::to_js(type_), opt_to_js(event_init_dict))
}

///|
/// [MouseEvent](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent) interface.
pub trait TMouseEvent: TUIEvent {
  page_x(self : Self) -> Double = _
  page_y(self : Self) -> Double = _
  x(self : Self) -> Double = _
  y(self : Self) -> Double = _
  offset_x(self : Self) -> Double = _
  offset_y(self : Self) -> Double = _
  screen_x(self : Self) -> Int = _
  screen_y(self : Self) -> Int = _
  client_x(self : Self) -> Int = _
  client_y(self : Self) -> Int = _
  layer_x(self : Self) -> Int = _
  layer_y(self : Self) -> Int = _
  ctrl_key(self : Self) -> Bool = _
  shift_key(self : Self) -> Bool = _
  alt_key(self : Self) -> Bool = _
  meta_key(self : Self) -> Bool = _
  button(self : Self) -> Int = _
  buttons(self : Self) -> UInt = _
  related_target(self : Self) -> EventTarget = _
  get_modifier_state(self : Self, key_arg : String) -> Bool = _
  init_mouse_event(
    self : Self,
    type_arg : String,
    bubbles_arg? : Bool,
    cancelable_arg? : Bool,
    view_arg? : &TWindow,
    detail_arg? : Int,
    screen_x_arg? : Int,
    screen_y_arg? : Int,
    client_x_arg? : Int,
    client_y_arg? : Int,
    ctrl_key_arg? : Bool,
    alt_key_arg? : Bool,
    shift_key_arg? : Bool,
    meta_key_arg? : Bool,
    button_arg? : Int,
    related_target_arg? : &TEventTarget,
  ) -> Unit = _
}

///|
/// [MouseEvent.pageX](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/pageX)
impl TMouseEvent with page_x(self : Self) -> Double {
  mouse_event_page_x_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.pageY](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/pageY)
impl TMouseEvent with page_y(self : Self) -> Double {
  mouse_event_page_y_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.x](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/x)
impl TMouseEvent with x(self : Self) -> Double {
  mouse_event_x_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.y](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/y)
impl TMouseEvent with y(self : Self) -> Double {
  mouse_event_y_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.offsetX](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/offsetX)
impl TMouseEvent with offset_x(self : Self) -> Double {
  mouse_event_offset_x_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.offsetY](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/offsetY)
impl TMouseEvent with offset_y(self : Self) -> Double {
  mouse_event_offset_y_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.screenX](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/screenX)
impl TMouseEvent with screen_x(self : Self) -> Int {
  mouse_event_screen_x_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.screenY](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/screenY)
impl TMouseEvent with screen_y(self : Self) -> Int {
  mouse_event_screen_y_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.clientX](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/clientX)
impl TMouseEvent with client_x(self : Self) -> Int {
  mouse_event_client_x_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.clientY](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/clientY)
impl TMouseEvent with client_y(self : Self) -> Int {
  mouse_event_client_y_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.layerX](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/layerX)
impl TMouseEvent with layer_x(self : Self) -> Int {
  mouse_event_layer_x_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.layerY](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/layerY)
impl TMouseEvent with layer_y(self : Self) -> Int {
  mouse_event_layer_y_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.ctrlKey](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/ctrlKey)
impl TMouseEvent with ctrl_key(self : Self) -> Bool {
  mouse_event_ctrl_key_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.shiftKey](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/shiftKey)
impl TMouseEvent with shift_key(self : Self) -> Bool {
  mouse_event_shift_key_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.altKey](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/altKey)
impl TMouseEvent with alt_key(self : Self) -> Bool {
  mouse_event_alt_key_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.metaKey](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/metaKey)
impl TMouseEvent with meta_key(self : Self) -> Bool {
  mouse_event_meta_key_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.button](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button)
impl TMouseEvent with button(self : Self) -> Int {
  mouse_event_button_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.buttons](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons)
impl TMouseEvent with buttons(self : Self) -> UInt {
  mouse_event_buttons_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.relatedTarget](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/relatedTarget)
impl TMouseEvent with related_target(self : Self) -> EventTarget {
  mouse_event_related_target_ffi(TJsValue::to_js(self))
}

///|
/// [MouseEvent.getModifierState](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/getModifierState)
impl TMouseEvent with get_modifier_state(self : Self, key_arg : String) -> Bool {
  mouse_event_get_modifier_state_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(key_arg),
  )
}

///|
/// [MouseEvent.initMouseEvent](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/initMouseEvent)
impl TMouseEvent with init_mouse_event(
  self : Self,
  type_arg : String,
  bubbles_arg? : Bool,
  cancelable_arg? : Bool,
  view_arg? : &TWindow,
  detail_arg? : Int,
  screen_x_arg? : Int,
  screen_y_arg? : Int,
  client_x_arg? : Int,
  client_y_arg? : Int,
  ctrl_key_arg? : Bool,
  alt_key_arg? : Bool,
  shift_key_arg? : Bool,
  meta_key_arg? : Bool,
  button_arg? : Int,
  related_target_arg? : &TEventTarget,
) -> Unit {
  mouse_event_init_mouse_event_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(type_arg),
    opt_to_js(bubbles_arg),
    opt_to_js(cancelable_arg),
    opt_to_js(view_arg),
    opt_to_js(detail_arg),
    opt_to_js(screen_x_arg),
    opt_to_js(screen_y_arg),
    opt_to_js(client_x_arg),
    opt_to_js(client_y_arg),
    opt_to_js(ctrl_key_arg),
    opt_to_js(alt_key_arg),
    opt_to_js(shift_key_arg),
    opt_to_js(meta_key_arg),
    opt_to_js(button_arg),
    opt_to_js(related_target_arg),
  )
}

///|
#cfg(target="js")
extern "js" fn mouse_event_new_ffi(
  type_ : JsValue,
  event_init_dict : JsValue,
) -> MouseEvent = "(type_, event_init_dict) => new MouseEvent(type_, event_init_dict)"

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

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

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

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

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

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

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

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

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

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

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

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

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

///|
#cfg(target="js")
fn mouse_event_screen_x_ffi(obj : JsValue) -> Int {
  mouse_event_screen_x_ffi_js(obj).unsafe_cast()
}

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

///|
#cfg(target="js")
fn mouse_event_screen_y_ffi(obj : JsValue) -> Int {
  mouse_event_screen_y_ffi_js(obj).unsafe_cast()
}

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

///|
#cfg(target="js")
fn mouse_event_client_x_ffi(obj : JsValue) -> Int {
  mouse_event_client_x_ffi_js(obj).unsafe_cast()
}

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

///|
#cfg(target="js")
fn mouse_event_client_y_ffi(obj : JsValue) -> Int {
  mouse_event_client_y_ffi_js(obj).unsafe_cast()
}

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

///|
#cfg(target="js")
fn mouse_event_layer_x_ffi(obj : JsValue) -> Int {
  mouse_event_layer_x_ffi_js(obj).unsafe_cast()
}

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

///|
#cfg(target="js")
fn mouse_event_layer_y_ffi(obj : JsValue) -> Int {
  mouse_event_layer_y_ffi_js(obj).unsafe_cast()
}

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

///|
#cfg(target="js")
fn mouse_event_ctrl_key_ffi(obj : JsValue) -> Bool {
  mouse_event_ctrl_key_ffi_js(obj).unsafe_cast()
}

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

///|
#cfg(target="js")
fn mouse_event_shift_key_ffi(obj : JsValue) -> Bool {
  mouse_event_shift_key_ffi_js(obj).unsafe_cast()
}

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

///|
#cfg(target="js")
fn mouse_event_alt_key_ffi(obj : JsValue) -> Bool {
  mouse_event_alt_key_ffi_js(obj).unsafe_cast()
}

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

///|
#cfg(target="js")
fn mouse_event_meta_key_ffi(obj : JsValue) -> Bool {
  mouse_event_meta_key_ffi_js(obj).unsafe_cast()
}

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

///|
#cfg(target="js")
fn mouse_event_button_ffi(obj : JsValue) -> Int {
  mouse_event_button_ffi_js(obj).unsafe_cast()
}

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

///|
#cfg(target="js")
fn mouse_event_buttons_ffi(obj : JsValue) -> UInt {
  mouse_event_buttons_ffi_js(obj).unsafe_cast()
}

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

///|
#cfg(target="js")
fn mouse_event_related_target_ffi(obj : JsValue) -> EventTarget {
  mouse_event_related_target_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn mouse_event_get_modifier_state_ffi_js(
  obj : JsValue,
  key_arg : JsValue,
) -> JsValue = "(obj, key_arg) => obj.getModifierState(key_arg)"

///|
#cfg(target="js")
fn mouse_event_get_modifier_state_ffi(obj : JsValue, key_arg : JsValue) -> Bool {
  mouse_event_get_modifier_state_ffi_js(obj, key_arg).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn mouse_event_init_mouse_event_ffi(
  obj : JsValue,
  type_arg : JsValue,
  bubbles_arg : JsValue,
  cancelable_arg : JsValue,
  view_arg : JsValue,
  detail_arg : JsValue,
  screen_x_arg : JsValue,
  screen_y_arg : JsValue,
  client_x_arg : JsValue,
  client_y_arg : JsValue,
  ctrl_key_arg : JsValue,
  alt_key_arg : JsValue,
  shift_key_arg : JsValue,
  meta_key_arg : JsValue,
  button_arg : JsValue,
  related_target_arg : JsValue,
) -> Unit = "(obj, type_arg, bubbles_arg, cancelable_arg, view_arg, detail_arg, screen_x_arg, screen_y_arg, client_x_arg, client_y_arg, ctrl_key_arg, alt_key_arg, shift_key_arg, meta_key_arg, button_arg, related_target_arg) => obj.initMouseEvent(type_arg, bubbles_arg, cancelable_arg, view_arg, detail_arg, screen_x_arg, screen_y_arg, client_x_arg, client_y_arg, ctrl_key_arg, alt_key_arg, shift_key_arg, meta_key_arg, button_arg, related_target_arg)"

///|
#cfg(target="wasm-gc")
fn mouse_event_new_ffi(
  type_ : JsValue,
  event_init_dict : JsValue,
) -> MouseEvent = "webapi_MouseEvent" "new"

///|
#cfg(target="wasm-gc")
fn mouse_event_page_x_ffi(obj : JsValue) -> Double = "webapi_MouseEvent" "get_pageX"

///|
#cfg(target="wasm-gc")
fn mouse_event_page_y_ffi(obj : JsValue) -> Double = "webapi_MouseEvent" "get_pageY"

///|
#cfg(target="wasm-gc")
fn mouse_event_x_ffi(obj : JsValue) -> Double = "webapi_MouseEvent" "get_x"

///|
#cfg(target="wasm-gc")
fn mouse_event_y_ffi(obj : JsValue) -> Double = "webapi_MouseEvent" "get_y"

///|
#cfg(target="wasm-gc")
fn mouse_event_offset_x_ffi(obj : JsValue) -> Double = "webapi_MouseEvent" "get_offsetX"

///|
#cfg(target="wasm-gc")
fn mouse_event_offset_y_ffi(obj : JsValue) -> Double = "webapi_MouseEvent" "get_offsetY"

///|
#cfg(target="wasm-gc")
fn mouse_event_screen_x_ffi(obj : JsValue) -> Int = "webapi_MouseEvent" "get_screenX"

///|
#cfg(target="wasm-gc")
fn mouse_event_screen_y_ffi(obj : JsValue) -> Int = "webapi_MouseEvent" "get_screenY"

///|
#cfg(target="wasm-gc")
fn mouse_event_client_x_ffi(obj : JsValue) -> Int = "webapi_MouseEvent" "get_clientX"

///|
#cfg(target="wasm-gc")
fn mouse_event_client_y_ffi(obj : JsValue) -> Int = "webapi_MouseEvent" "get_clientY"

///|
#cfg(target="wasm-gc")
fn mouse_event_layer_x_ffi(obj : JsValue) -> Int = "webapi_MouseEvent" "get_layerX"

///|
#cfg(target="wasm-gc")
fn mouse_event_layer_y_ffi(obj : JsValue) -> Int = "webapi_MouseEvent" "get_layerY"

///|
#cfg(target="wasm-gc")
fn mouse_event_ctrl_key_ffi(obj : JsValue) -> Bool = "webapi_MouseEvent" "get_ctrlKey"

///|
#cfg(target="wasm-gc")
fn mouse_event_shift_key_ffi(obj : JsValue) -> Bool = "webapi_MouseEvent" "get_shiftKey"

///|
#cfg(target="wasm-gc")
fn mouse_event_alt_key_ffi(obj : JsValue) -> Bool = "webapi_MouseEvent" "get_altKey"

///|
#cfg(target="wasm-gc")
fn mouse_event_meta_key_ffi(obj : JsValue) -> Bool = "webapi_MouseEvent" "get_metaKey"

///|
#cfg(target="wasm-gc")
fn mouse_event_button_ffi(obj : JsValue) -> Int = "webapi_MouseEvent" "get_button"

///|
#cfg(target="wasm-gc")
fn mouse_event_buttons_ffi(obj : JsValue) -> UInt = "webapi_MouseEvent" "get_buttons"

///|
#cfg(target="wasm-gc")
fn mouse_event_related_target_ffi(obj : JsValue) -> EventTarget = "webapi_MouseEvent" "get_relatedTarget"

///|
#cfg(target="wasm-gc")
fn mouse_event_get_modifier_state_ffi(obj : JsValue, key_arg : JsValue) -> Bool = "webapi_MouseEvent" "getModifierState"

///|
#cfg(target="wasm-gc")
fn mouse_event_init_mouse_event_ffi(
  obj : JsValue,
  type_arg : JsValue,
  bubbles_arg : JsValue,
  cancelable_arg : JsValue,
  view_arg : JsValue,
  detail_arg : JsValue,
  screen_x_arg : JsValue,
  screen_y_arg : JsValue,
  client_x_arg : JsValue,
  client_y_arg : JsValue,
  ctrl_key_arg : JsValue,
  alt_key_arg : JsValue,
  shift_key_arg : JsValue,
  meta_key_arg : JsValue,
  button_arg : JsValue,
  related_target_arg : JsValue,
) -> Unit = "webapi_MouseEvent" "initMouseEvent"