// Generated from WebIDL - DO NOT EDIT
// Source: @webref/idl/css-nav

///|
/// SpatialNavigationDirection enum
pub(all) enum SpatialNavigationDirection {
  Up
  Down
  Left
  Right
} derive(Eq, Show)

///|
/// Convert to string value
pub fn SpatialNavigationDirection::to_string(
  self : SpatialNavigationDirection,
) -> String {
  match self {
    SpatialNavigationDirection::Up => "up"
    SpatialNavigationDirection::Down => "down"
    SpatialNavigationDirection::Left => "left"
    SpatialNavigationDirection::Right => "right"
  }
}

///|
/// Parse from string value
pub fn SpatialNavigationDirection::from_string(
  s : String,
) -> SpatialNavigationDirection? {
  match s {
    "up" => Some(SpatialNavigationDirection::Up)
    "down" => Some(SpatialNavigationDirection::Down)
    "left" => Some(SpatialNavigationDirection::Left)
    "right" => Some(SpatialNavigationDirection::Right)
    _ => None
  }
}

///|
/// FocusableAreaSearchMode enum
pub(all) enum FocusableAreaSearchMode {
  Visible
  All
} derive(Eq, Show)

///|
/// Convert to string value
pub fn FocusableAreaSearchMode::to_string(
  self : FocusableAreaSearchMode,
) -> String {
  match self {
    FocusableAreaSearchMode::Visible => "visible"
    FocusableAreaSearchMode::All => "all"
  }
}

///|
/// Parse from string value
pub fn FocusableAreaSearchMode::from_string(
  s : String,
) -> FocusableAreaSearchMode? {
  match s {
    "visible" => Some(FocusableAreaSearchMode::Visible)
    "all" => Some(FocusableAreaSearchMode::All)
    _ => None
  }
}

///|
/// FocusableAreasOption dictionary
pub(all) struct FocusableAreasOption {
  mode : FocusableAreaSearchMode?
}

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

///|
extern "js" fn FocusableAreasOption::to_js_ffi(
  self : FocusableAreasOption,
) -> JsValue =
  #| (self) => ({
  #|   mode: ((() => { const v = self.mode; if (v === undefined) return undefined; return ['visible', 'all'][v]; })())
  #| })

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

///|
extern "js" fn FocusableAreasOption::from_js_ffi(
  value : JsValue,
) -> FocusableAreasOption =
  #| (v) => ({
  #|   mode: (v.mode === undefined ? undefined : ['visible', 'all'].indexOf(v.mode))
  #| })

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

///|
/// SpatialNavigationSearchOptions dictionary
pub(all) struct SpatialNavigationSearchOptions {
  candidates : Array[Node]?
  container : Nullable[Node]
}

///|
/// Create a new SpatialNavigationSearchOptions with default values
pub fn SpatialNavigationSearchOptions::default() -> SpatialNavigationSearchOptions {
  SpatialNavigationSearchOptions::{
    candidates: None,
    container: Nullable::Undefined,
  }
}

///|
extern "js" fn SpatialNavigationSearchOptions::to_js_ffi(
  self : SpatialNavigationSearchOptions,
) -> JsValue =
  #| (self) => ({
  #|   candidates: ((() => { const v = self.candidates; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   container: ((() => { const v = self.container; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })())
  #| })

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

///|
extern "js" fn SpatialNavigationSearchOptions::from_js_ffi(
  value : JsValue,
) -> SpatialNavigationSearchOptions =
  #| (v) => ({
  #|   candidates: (v.candidates === undefined ? { $tag: 0 } : { $tag: 1, _0: v.candidates }),
  #|   container: (v.container === undefined ? { $tag: 0 } : v.container === null ? { $tag: 1 } : { $tag: 2, _0: v.container })
  #| })

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

///|
/// NavigationEventInit dictionary
pub(all) struct NavigationEventInit {
  dir : SpatialNavigationDirection?
  relatedTarget : Nullable[EventTarget]
}

///|
/// Create a new NavigationEventInit with default values
pub fn NavigationEventInit::default() -> NavigationEventInit {
  NavigationEventInit::{ dir: None, relatedTarget: Nullable::Undefined }
}

///|
extern "js" fn NavigationEventInit::to_js_ffi(
  self : NavigationEventInit,
) -> JsValue =
  #| (self) => ({
  #|   dir: ((() => { const v = self.dir; if (v === undefined) return undefined; return ['up', 'down', 'left', 'right'][v]; })()),
  #|   relatedTarget: ((() => { const v = self.relatedTarget; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })())
  #| })

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

///|
extern "js" fn NavigationEventInit::from_js_ffi(
  value : JsValue,
) -> NavigationEventInit =
  #| (v) => ({
  #|   dir: (v.dir === undefined ? undefined : ['up', 'down', 'left', 'right'].indexOf(v.dir)),
  #|   relatedTarget: (v.relatedTarget === undefined ? { $tag: 0 } : v.relatedTarget === null ? { $tag: 1 } : { $tag: 2, _0: v.relatedTarget })
  #| })

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

///|
/// NavigationEvent interface
pub type NavigationEvent

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

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

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

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

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

///|
pub extern "js" fn NavigationEvent::to_ui_event(
  self : NavigationEvent,
) -> UIEvent =
  #| (self) => self

///|
pub extern "js" fn NavigationEvent::to_event(self : NavigationEvent) -> Event =
  #| (self) => self

///|
pub extern "js" fn NavigationEvent::new(type_ : String) -> NavigationEvent =
  #| (type_) => new NavigationEvent(type_)

///|
extern "js" fn NavigationEvent::new_with_event_init_dict_ffi(
  type_ : String,
  event_init_dict : JsValue,
) -> NavigationEvent =
  #| (type_, event_init_dict) => new NavigationEvent(type_, event_init_dict)

///|
pub fn NavigationEvent::new_with_event_init_dict(
  type_ : String,
  event_init_dict : NavigationEventInit,
) -> NavigationEvent {
  NavigationEvent::new_with_event_init_dict_ffi(type_, event_init_dict.to_js())
}

///|
pub extern "js" fn NavigationEvent::get_dir(
  self : NavigationEvent,
) -> SpatialNavigationDirection =
  #| (self) => ['up', 'down', 'left', 'right'].indexOf(self.dir)

///|
pub extern "js" fn NavigationEvent::get_related_target(
  self : NavigationEvent,
) -> EventTarget? =
  #| (self) => (() => { const v = self.relatedTarget; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()