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

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

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

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

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

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

///|
pub impl TNavigateEvent for NavigateEvent

///|
pub impl TEvent for NavigateEvent

///|
pub fn NavigateEvent::new(
  type_ : String,
  event_init_dict : NavigateEventInit,
) -> NavigateEvent {
  navigate_event_new_ffi(
    TJsValue::to_js(type_),
    TJsValue::to_js(event_init_dict),
  )
}

///|
/// [NavigateEvent](https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent) interface.
pub trait TNavigateEvent: TEvent {
  navigation_type(self : Self) -> NavigationType = _
  destination(self : Self) -> NavigationDestination = _
  can_intercept(self : Self) -> Bool = _
  user_initiated(self : Self) -> Bool = _
  hash_change(self : Self) -> Bool = _
  signal(self : Self) -> AbortSignal = _
  form_data(self : Self) -> FormData = _
  download_request(self : Self) -> String = _
  info(self : Self) -> JsValue = _
  has_ua_visual_transition(self : Self) -> Bool = _
  source_element(self : Self) -> Element = _
  intercept(self : Self, options? : NavigationInterceptOptions) -> Unit = _
  scroll(self : Self) -> Unit = _
}

///|
/// [NavigateEvent.navigationType](https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent/navigationType)
impl TNavigateEvent with navigation_type(self : Self) -> NavigationType {
  navigate_event_navigation_type_ffi(TJsValue::to_js(self))
}

///|
/// [NavigateEvent.destination](https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent/destination)
impl TNavigateEvent with destination(self : Self) -> NavigationDestination {
  navigate_event_destination_ffi(TJsValue::to_js(self))
}

///|
/// [NavigateEvent.canIntercept](https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent/canIntercept)
impl TNavigateEvent with can_intercept(self : Self) -> Bool {
  navigate_event_can_intercept_ffi(TJsValue::to_js(self))
}

///|
/// [NavigateEvent.userInitiated](https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent/userInitiated)
impl TNavigateEvent with user_initiated(self : Self) -> Bool {
  navigate_event_user_initiated_ffi(TJsValue::to_js(self))
}

///|
/// [NavigateEvent.hashChange](https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent/hashChange)
impl TNavigateEvent with hash_change(self : Self) -> Bool {
  navigate_event_hash_change_ffi(TJsValue::to_js(self))
}

///|
/// [NavigateEvent.signal](https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent/signal)
impl TNavigateEvent with signal(self : Self) -> AbortSignal {
  navigate_event_signal_ffi(TJsValue::to_js(self))
}

///|
/// [NavigateEvent.formData](https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent/formData)
impl TNavigateEvent with form_data(self : Self) -> FormData {
  navigate_event_form_data_ffi(TJsValue::to_js(self))
}

///|
/// [NavigateEvent.downloadRequest](https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent/downloadRequest)
impl TNavigateEvent with download_request(self : Self) -> String {
  navigate_event_download_request_ffi(TJsValue::to_js(self))
}

///|
/// [NavigateEvent.info](https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent/info)
impl TNavigateEvent with info(self : Self) -> JsValue {
  navigate_event_info_ffi(TJsValue::to_js(self))
}

///|
/// [NavigateEvent.hasUAVisualTransition](https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent/hasUAVisualTransition)
impl TNavigateEvent with has_ua_visual_transition(self : Self) -> Bool {
  navigate_event_has_ua_visual_transition_ffi(TJsValue::to_js(self))
}

///|
/// [NavigateEvent.sourceElement](https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent/sourceElement)
impl TNavigateEvent with source_element(self : Self) -> Element {
  navigate_event_source_element_ffi(TJsValue::to_js(self))
}

///|
/// [NavigateEvent.intercept](https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent/intercept)
impl TNavigateEvent with intercept(
  self : Self,
  options? : NavigationInterceptOptions,
) -> Unit {
  navigate_event_intercept_ffi(TJsValue::to_js(self), opt_to_js(options))
}

///|
/// [NavigateEvent.scroll](https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent/scroll)
impl TNavigateEvent with scroll(self : Self) -> Unit {
  navigate_event_scroll_ffi(TJsValue::to_js(self))
}

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

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

///|
#cfg(target="js")
fn navigate_event_navigation_type_ffi(obj : JsValue) -> NavigationType {
  NavigationType::from_unchecked(
    navigate_event_navigation_type_ffi_js(obj).unsafe_cast(),
  )
}

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

///|
#cfg(target="js")
fn navigate_event_destination_ffi(obj : JsValue) -> NavigationDestination {
  navigate_event_destination_ffi_js(obj).unsafe_cast()
}

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

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

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

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

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

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

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

///|
#cfg(target="js")
fn navigate_event_signal_ffi(obj : JsValue) -> AbortSignal {
  navigate_event_signal_ffi_js(obj).unsafe_cast()
}

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

///|
#cfg(target="js")
fn navigate_event_form_data_ffi(obj : JsValue) -> FormData {
  navigate_event_form_data_ffi_js(obj).unsafe_cast()
}

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

///|
#cfg(target="js")
fn navigate_event_download_request_ffi(obj : JsValue) -> String {
  navigate_event_download_request_ffi_js(obj).unsafe_cast()
}

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

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

///|
#cfg(target="js")
extern "js" fn navigate_event_has_ua_visual_transition_ffi_js(
  obj : JsValue,
) -> JsValue = "(obj) => obj.hasUAVisualTransition"

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

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

///|
#cfg(target="js")
fn navigate_event_source_element_ffi(obj : JsValue) -> Element {
  navigate_event_source_element_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn navigate_event_intercept_ffi(
  obj : JsValue,
  options : JsValue,
) -> Unit = "(obj, options) => obj.intercept(options)"

///|
#cfg(target="js")
extern "js" fn navigate_event_scroll_ffi(obj : JsValue) -> Unit = "(obj) => obj.scroll()"

///|
#cfg(target="wasm-gc")
fn navigate_event_new_ffi(
  type_ : JsValue,
  event_init_dict : JsValue,
) -> NavigateEvent = "webapi_NavigateEvent" "new"

///|
#cfg(target="wasm-gc")
fn navigate_event_navigation_type_ffi_wasm(obj : JsValue) -> JsValue = "webapi_NavigateEvent" "get_navigationType"

///|
#cfg(target="wasm-gc")
fn navigate_event_navigation_type_ffi(obj : JsValue) -> NavigationType {
  NavigationType::from_unchecked(
    jsvalue_to_string(navigate_event_navigation_type_ffi_wasm(obj)),
  )
}

///|
#cfg(target="wasm-gc")
fn navigate_event_destination_ffi(obj : JsValue) -> NavigationDestination = "webapi_NavigateEvent" "get_destination"

///|
#cfg(target="wasm-gc")
fn navigate_event_can_intercept_ffi(obj : JsValue) -> Bool = "webapi_NavigateEvent" "get_canIntercept"

///|
#cfg(target="wasm-gc")
fn navigate_event_user_initiated_ffi(obj : JsValue) -> Bool = "webapi_NavigateEvent" "get_userInitiated"

///|
#cfg(target="wasm-gc")
fn navigate_event_hash_change_ffi(obj : JsValue) -> Bool = "webapi_NavigateEvent" "get_hashChange"

///|
#cfg(target="wasm-gc")
fn navigate_event_signal_ffi(obj : JsValue) -> AbortSignal = "webapi_NavigateEvent" "get_signal"

///|
#cfg(target="wasm-gc")
fn navigate_event_form_data_ffi(obj : JsValue) -> FormData = "webapi_NavigateEvent" "get_formData"

///|
#cfg(target="wasm-gc")
fn navigate_event_download_request_ffi_wasm(obj : JsValue) -> JsValue = "webapi_NavigateEvent" "get_downloadRequest"

///|
#cfg(target="wasm-gc")
fn navigate_event_download_request_ffi(obj : JsValue) -> String {
  jsvalue_to_string(navigate_event_download_request_ffi_wasm(obj))
}

///|
#cfg(target="wasm-gc")
fn navigate_event_info_ffi(obj : JsValue) -> JsValue = "webapi_NavigateEvent" "get_info"

///|
#cfg(target="wasm-gc")
fn navigate_event_has_ua_visual_transition_ffi(obj : JsValue) -> Bool = "webapi_NavigateEvent" "get_hasUAVisualTransition"

///|
#cfg(target="wasm-gc")
fn navigate_event_source_element_ffi(obj : JsValue) -> Element = "webapi_NavigateEvent" "get_sourceElement"

///|
#cfg(target="wasm-gc")
fn navigate_event_intercept_ffi(obj : JsValue, options : JsValue) -> Unit = "webapi_NavigateEvent" "intercept"

///|
#cfg(target="wasm-gc")
fn navigate_event_scroll_ffi(obj : JsValue) -> Unit = "webapi_NavigateEvent" "scroll"