///|
#external
pub type KeyboardEvent

///|
pub extern "js" fn KeyboardEvent::new_with_init_dict(
  type_ : String,
  event_init_dict : KeyboardEventInit,
) -> KeyboardEvent =
  #| (type_, event_init_dict) => new KeyboardEvent(type_, event_init_dict)

// key

///|
pub extern "js" fn KeyboardEvent::key(self : KeyboardEvent) -> String =
  #| (self) => self.key

// type_

///|
pub extern "js" fn KeyboardEvent::type_(self : KeyboardEvent) -> String =
  #| (self) => self.type

// key_code

///|
pub extern "js" fn KeyboardEvent::key_code(self : KeyboardEvent) -> UInt =
  #| (self) => self.keyCode

// shift_key

///|
pub extern "js" fn KeyboardEvent::shift_key(self : KeyboardEvent) -> Bool =
  #| (self) => self.shiftKey

// ctrl_key

///|
pub extern "js" fn KeyboardEvent::ctrl_key(self : KeyboardEvent) -> Bool =
  #| (self) => self.ctrlKey

// alt_key

///|
pub extern "js" fn KeyboardEvent::alt_key(self : KeyboardEvent) -> Bool =
  #| (self) => self.altKey

// meta_key

///|
pub extern "js" fn KeyboardEvent::meta_key(self : KeyboardEvent) -> Bool =
  #| (self) => self.metaKey

// repeat

///|
pub extern "js" fn KeyboardEvent::repeat(self : KeyboardEvent) -> Bool =
  #| (self) => self.repeat

///|
pub extern "js" fn KeyboardEvent::view(self : KeyboardEvent) -> Window =
  #| (self) => self.view

///|
pub extern "js" fn KeyboardEvent::code(self : KeyboardEvent) -> String =
  #| (self) => self.code

///|
pub extern "js" fn KeyboardEvent::char_code(self : KeyboardEvent) -> UInt =
  #| (self) => self.charCode

///|
pub extern "js" fn KeyboardEvent::location(self : KeyboardEvent) -> UInt =
  #| (self) => self.location

// dispatch_event

///|
pub extern "js" fn Node::dispatch_event(
  self : Node,
  event : KeyboardEvent,
) -> Bool =
  #| (self, event) => self.dispatchEvent(event)

///|
pub extern "js" fn KeyboardEvent::prevent_default(self : KeyboardEvent) -> Unit =
  #| (self) => self.preventDefault()

///|
pub extern "js" fn KeyboardEvent::stop_propagation(
  self : KeyboardEvent,
) -> Unit =
  #| (self) => self.stopPropagation()

// set_repeat

///|
pub extern "js" fn KeyboardEvent::set_repeat(
  self : KeyboardEvent,
  repeat : Bool,
) -> Unit =
  #| (self, repeat) => { self.repeat = repeat }

///|
/// need to init function first before creating real event
#external
pub type KeyboardEventInit

///|
pub extern "js" fn KeyboardEventInit::new() -> KeyboardEventInit =
  #| () => ({})

///|
pub extern "js" fn keyboard_event_init(
  self : Window,
  type_ : String,
) -> KeyboardEventInit =
  #| (self, type) => ({})

///|
pub extern "js" fn set_key(self : KeyboardEventInit, key : String) -> Unit =
  #| (self, key) => { self.key = key }

///|
pub extern "js" fn set_code(self : KeyboardEventInit, code : String) -> Unit =
  #| (self, code) => { self.code = code }

///|
pub extern "js" fn set_char_code(
  self : KeyboardEventInit,
  char_code : UInt,
) -> Unit =
  #| (self, char_code) => { self.charCode = char_code }

///|
pub extern "js" fn set_view(self : KeyboardEventInit, view : Window) -> Unit =
  #| (self, view) => { self.view = view }

///|
pub extern "js" fn set_location(
  self : KeyboardEventInit,
  location : UInt,
) -> Unit =
  #| (self, location) => { self.location = location }

///|
pub extern "js" fn set_key_code(
  self : KeyboardEventInit,
  key_code : UInt,
) -> Unit =
  #| (self, key_code) => { self.keyCode = key_code }

///|
#external
pub type InputEvent

///|
#external
pub type FocusEvent

///|
#external
pub type BlurEvent

///|
#external
pub type MouseEvent

///|
pub extern "js" fn MouseEvent::stop_propagation(self : MouseEvent) -> Unit =
  #| (self) => self.stopPropagation()

///|
pub extern "js" fn MouseEvent::prevent_default(self : MouseEvent) -> Unit =
  #| (self) => self.preventDefault()

// client_x

///|
pub extern "js" fn MouseEvent::client_x(self : MouseEvent) -> Float =
  #| (self) => self.clientX

// client_y

///|
pub extern "js" fn MouseEvent::client_y(self : MouseEvent) -> Float =
  #| (self) => self.clientY