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

///|
/// ChildDisplayType enum
pub(all) enum ChildDisplayType {
  Block
  Normal
} derive(Eq, Show)

///|
/// Convert to string value
pub fn ChildDisplayType::to_string(self : ChildDisplayType) -> String {
  match self {
    ChildDisplayType::Block => "block"
    ChildDisplayType::Normal => "normal"
  }
}

///|
/// Parse from string value
pub fn ChildDisplayType::from_string(s : String) -> ChildDisplayType? {
  match s {
    "block" => Some(ChildDisplayType::Block)
    "normal" => Some(ChildDisplayType::Normal)
    _ => None
  }
}

///|
/// LayoutSizingMode enum
pub(all) enum LayoutSizingMode {
  BlockLike
  Manual
} derive(Eq, Show)

///|
/// Convert to string value
pub fn LayoutSizingMode::to_string(self : LayoutSizingMode) -> String {
  match self {
    LayoutSizingMode::BlockLike => "block-like"
    LayoutSizingMode::Manual => "manual"
  }
}

///|
/// Parse from string value
pub fn LayoutSizingMode::from_string(s : String) -> LayoutSizingMode? {
  match s {
    "block-like" => Some(LayoutSizingMode::BlockLike)
    "manual" => Some(LayoutSizingMode::Manual)
    _ => None
  }
}

///|
/// BlockFragmentationType enum
pub(all) enum BlockFragmentationType {
  None
  Page
  Column
  Region
} derive(Eq, Show)

///|
/// Convert to string value
pub fn BlockFragmentationType::to_string(
  self : BlockFragmentationType,
) -> String {
  match self {
    BlockFragmentationType::None => "none"
    BlockFragmentationType::Page => "page"
    BlockFragmentationType::Column => "column"
    BlockFragmentationType::Region => "region"
  }
}

///|
/// Parse from string value
pub fn BlockFragmentationType::from_string(
  s : String,
) -> BlockFragmentationType? {
  match s {
    "none" => Some(BlockFragmentationType::None)
    "page" => Some(BlockFragmentationType::Page)
    "column" => Some(BlockFragmentationType::Column)
    "region" => Some(BlockFragmentationType::Region)
    _ => None
  }
}

///|
/// BreakType enum
pub(all) enum BreakType {
  None
  Line
  Column
  Page
  Region
} derive(Eq, Show)

///|
/// Convert to string value
pub fn BreakType::to_string(self : BreakType) -> String {
  match self {
    BreakType::None => "none"
    BreakType::Line => "line"
    BreakType::Column => "column"
    BreakType::Page => "page"
    BreakType::Region => "region"
  }
}

///|
/// Parse from string value
pub fn BreakType::from_string(s : String) -> BreakType? {
  match s {
    "none" => Some(BreakType::None)
    "line" => Some(BreakType::Line)
    "column" => Some(BreakType::Column)
    "page" => Some(BreakType::Page)
    "region" => Some(BreakType::Region)
    _ => None
  }
}

///|
/// LayoutOptions dictionary
pub(all) struct LayoutOptions {
  childDisplay : ChildDisplayType?
  sizing : LayoutSizingMode?
}

///|
/// Create a new LayoutOptions with default values
pub fn LayoutOptions::default() -> LayoutOptions {
  LayoutOptions::{ childDisplay: None, sizing: None }
}

///|
extern "js" fn LayoutOptions::to_js_ffi(self : LayoutOptions) -> JsValue =
  #| (self) => ({
  #|   childDisplay: ((() => { const v = self.childDisplay; if (v === undefined) return undefined; return ['block', 'normal'][v]; })()),
  #|   sizing: ((() => { const v = self.sizing; if (v === undefined) return undefined; return ['block-like', 'manual'][v]; })())
  #| })

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

///|
extern "js" fn LayoutOptions::from_js_ffi(value : JsValue) -> LayoutOptions =
  #| (v) => ({
  #|   childDisplay: (v.childDisplay === undefined ? undefined : ['block', 'normal'].indexOf(v.childDisplay)),
  #|   sizing: (v.sizing === undefined ? undefined : ['block-like', 'manual'].indexOf(v.sizing))
  #| })

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

///|
/// LayoutConstraintsOptions dictionary
pub(all) struct LayoutConstraintsOptions {
  availableInlineSize : Double?
  availableBlockSize : Double?
  fixedInlineSize : Double?
  fixedBlockSize : Double?
  percentageInlineSize : Double?
  percentageBlockSize : Double?
  blockFragmentationOffset : Double?
  blockFragmentationType : BlockFragmentationType?
  data : JsValue?
}

///|
/// Create a new LayoutConstraintsOptions with default values
pub fn LayoutConstraintsOptions::default() -> LayoutConstraintsOptions {
  LayoutConstraintsOptions::{
    availableInlineSize: None,
    availableBlockSize: None,
    fixedInlineSize: None,
    fixedBlockSize: None,
    percentageInlineSize: None,
    percentageBlockSize: None,
    blockFragmentationOffset: None,
    blockFragmentationType: None,
    data: None,
  }
}

///|
extern "js" fn LayoutConstraintsOptions::to_js_ffi(
  self : LayoutConstraintsOptions,
) -> JsValue =
  #| (self) => ({
  #|   availableInlineSize: ((() => { const v = self.availableInlineSize; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   availableBlockSize: ((() => { const v = self.availableBlockSize; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   fixedInlineSize: ((() => { const v = self.fixedInlineSize; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   fixedBlockSize: ((() => { const v = self.fixedBlockSize; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   percentageInlineSize: ((() => { const v = self.percentageInlineSize; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   percentageBlockSize: ((() => { const v = self.percentageBlockSize; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   blockFragmentationOffset: ((() => { const v = self.blockFragmentationOffset; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   blockFragmentationType: ((() => { const v = self.blockFragmentationType; if (v === undefined) return undefined; return ['none', 'page', 'column', 'region'][v]; })()),
  #|   data: ((() => { const v = self.data; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

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

///|
extern "js" fn LayoutConstraintsOptions::from_js_ffi(
  value : JsValue,
) -> LayoutConstraintsOptions =
  #| (v) => ({
  #|   availableInlineSize: (v.availableInlineSize === undefined ? { $tag: 0 } : { $tag: 1, _0: v.availableInlineSize }),
  #|   availableBlockSize: (v.availableBlockSize === undefined ? { $tag: 0 } : { $tag: 1, _0: v.availableBlockSize }),
  #|   fixedInlineSize: (v.fixedInlineSize === undefined ? { $tag: 0 } : { $tag: 1, _0: v.fixedInlineSize }),
  #|   fixedBlockSize: (v.fixedBlockSize === undefined ? { $tag: 0 } : { $tag: 1, _0: v.fixedBlockSize }),
  #|   percentageInlineSize: (v.percentageInlineSize === undefined ? { $tag: 0 } : { $tag: 1, _0: v.percentageInlineSize }),
  #|   percentageBlockSize: (v.percentageBlockSize === undefined ? { $tag: 0 } : { $tag: 1, _0: v.percentageBlockSize }),
  #|   blockFragmentationOffset: (v.blockFragmentationOffset === undefined ? { $tag: 0 } : { $tag: 1, _0: v.blockFragmentationOffset }),
  #|   blockFragmentationType: (v.blockFragmentationType === undefined ? undefined : ['none', 'page', 'column', 'region'].indexOf(v.blockFragmentationType)),
  #|   data: (v.data === undefined ? { $tag: 0 } : { $tag: 1, _0: v.data })
  #| })

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

///|
/// BreakTokenOptions dictionary
pub(all) struct BreakTokenOptions {
  childBreakTokens : Array[ChildBreakToken]?
  data : JsValue?
}

///|
/// Create a new BreakTokenOptions with default values
pub fn BreakTokenOptions::default() -> BreakTokenOptions {
  BreakTokenOptions::{ childBreakTokens: None, data: None }
}

///|
extern "js" fn BreakTokenOptions::to_js_ffi(
  self : BreakTokenOptions,
) -> JsValue =
  #| (self) => ({
  #|   childBreakTokens: ((() => { const v = self.childBreakTokens; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   data: ((() => { const v = self.data; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

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

///|
extern "js" fn BreakTokenOptions::from_js_ffi(
  value : JsValue,
) -> BreakTokenOptions =
  #| (v) => ({
  #|   childBreakTokens: (v.childBreakTokens === undefined ? { $tag: 0 } : { $tag: 1, _0: v.childBreakTokens }),
  #|   data: (v.data === undefined ? { $tag: 0 } : { $tag: 1, _0: v.data })
  #| })

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

///|
/// FragmentResultOptions dictionary
pub(all) struct FragmentResultOptions {
  inlineSize : Double?
  blockSize : Double?
  autoBlockSize : Double?
  childFragments : Array[LayoutFragment]?
  data : JsValue?
  breakToken : BreakTokenOptions?
}

///|
/// Create a new FragmentResultOptions with default values
pub fn FragmentResultOptions::default() -> FragmentResultOptions {
  FragmentResultOptions::{
    inlineSize: None,
    blockSize: None,
    autoBlockSize: None,
    childFragments: None,
    data: None,
    breakToken: None,
  }
}

///|
extern "js" fn FragmentResultOptions::to_js_ffi(
  self : FragmentResultOptions,
) -> JsValue =
  #| (self) => ({
  #|   inlineSize: ((() => { const v = self.inlineSize; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   blockSize: ((() => { const v = self.blockSize; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   autoBlockSize: ((() => { const v = self.autoBlockSize; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   childFragments: ((() => { const v = self.childFragments; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   data: ((() => { const v = self.data; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   breakToken: ((() => { const v = self.breakToken; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

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

///|
extern "js" fn FragmentResultOptions::from_js_ffi(
  value : JsValue,
) -> FragmentResultOptions =
  #| (v) => ({
  #|   inlineSize: (v.inlineSize === undefined ? { $tag: 0 } : { $tag: 1, _0: v.inlineSize }),
  #|   blockSize: (v.blockSize === undefined ? { $tag: 0 } : { $tag: 1, _0: v.blockSize }),
  #|   autoBlockSize: (v.autoBlockSize === undefined ? { $tag: 0 } : { $tag: 1, _0: v.autoBlockSize }),
  #|   childFragments: (v.childFragments === undefined ? { $tag: 0 } : { $tag: 1, _0: v.childFragments }),
  #|   data: (v.data === undefined ? { $tag: 0 } : { $tag: 1, _0: v.data }),
  #|   breakToken: (v.breakToken === undefined ? { $tag: 0 } : { $tag: 1, _0: v.breakToken })
  #| })

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

///|
/// IntrinsicSizesResultOptions dictionary
pub(all) struct IntrinsicSizesResultOptions {
  maxContentSize : Double?
  minContentSize : Double?
}

///|
/// Create a new IntrinsicSizesResultOptions with default values
pub fn IntrinsicSizesResultOptions::default() -> IntrinsicSizesResultOptions {
  IntrinsicSizesResultOptions::{ maxContentSize: None, minContentSize: None }
}

///|
extern "js" fn IntrinsicSizesResultOptions::to_js_ffi(
  self : IntrinsicSizesResultOptions,
) -> JsValue =
  #| (self) => ({
  #|   maxContentSize: ((() => { const v = self.maxContentSize; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   minContentSize: ((() => { const v = self.minContentSize; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

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

///|
extern "js" fn IntrinsicSizesResultOptions::from_js_ffi(
  value : JsValue,
) -> IntrinsicSizesResultOptions =
  #| (v) => ({
  #|   maxContentSize: (v.maxContentSize === undefined ? { $tag: 0 } : { $tag: 1, _0: v.maxContentSize }),
  #|   minContentSize: (v.minContentSize === undefined ? { $tag: 0 } : { $tag: 1, _0: v.minContentSize })
  #| })

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

///|
/// LayoutWorkletGlobalScope interface
pub type LayoutWorkletGlobalScope

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

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

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

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

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

///|
pub extern "js" fn LayoutWorkletGlobalScope::to_worklet_global_scope(
  self : LayoutWorkletGlobalScope,
) -> WorkletGlobalScope =
  #| (self) => self

///|
pub extern "js" fn LayoutWorkletGlobalScope::register_layout(
  self : LayoutWorkletGlobalScope,
  name : String,
  layout_ctor : VoidFunction,
) -> Unit =
  #| (self, name, layout_ctor) => self.registerLayout(name, layout_ctor)

///|
/// LayoutChild interface
pub type LayoutChild

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

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

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

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

///|
/// Cast JsValue to LayoutChild (unchecked)
pub extern "js" fn JsValue::to_layout_child(self : JsValue) -> LayoutChild =
  #| (self) => self

///|
pub extern "js" fn LayoutChild::get_style_map(
  self : LayoutChild,
) -> StylePropertyMapReadOnly =
  #| (self) => self.styleMap

///|
pub extern "js" fn LayoutChild::intrinsic_sizes(
  self : LayoutChild,
) -> Promise[IntrinsicSizes] =
  #| (self) => self.intrinsicSizes()

///|
extern "js" fn LayoutChild::layout_next_fragment_ffi(
  self : LayoutChild,
  constraints : JsValue,
  break_token : ChildBreakToken,
) -> Promise[LayoutFragment] =
  #| (self, constraints, break_token) => self.layoutNextFragment(constraints, break_token)

///|
pub fn LayoutChild::layout_next_fragment(
  self : LayoutChild,
  constraints : LayoutConstraintsOptions,
  break_token : ChildBreakToken,
) -> Promise[LayoutFragment] {
  LayoutChild::layout_next_fragment_ffi(self, constraints.to_js(), break_token)
}

///|
/// LayoutFragment interface
pub type LayoutFragment

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

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

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

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

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

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

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

///|
pub extern "js" fn LayoutFragment::get_inline_offset(
  self : LayoutFragment,
) -> Double =
  #| (self) => self.inlineOffset

///|
pub extern "js" fn LayoutFragment::set_inline_offset(
  self : LayoutFragment,
  value : Double,
) -> Unit =
  #| (self, value) => { self.inlineOffset = value }

///|
pub extern "js" fn LayoutFragment::get_block_offset(
  self : LayoutFragment,
) -> Double =
  #| (self) => self.blockOffset

///|
pub extern "js" fn LayoutFragment::set_block_offset(
  self : LayoutFragment,
  value : Double,
) -> Unit =
  #| (self, value) => { self.blockOffset = value }

///|
pub extern "js" fn LayoutFragment::get_data(self : LayoutFragment) -> JsValue =
  #| (self) => self.data

///|
pub extern "js" fn LayoutFragment::get_break_token(
  self : LayoutFragment,
) -> ChildBreakToken? =
  #| (self) => (() => { const v = self.breakToken; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
/// IntrinsicSizes interface
pub type IntrinsicSizes

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

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

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

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

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

///|
pub extern "js" fn IntrinsicSizes::get_min_content_size(
  self : IntrinsicSizes,
) -> Double =
  #| (self) => self.minContentSize

///|
pub extern "js" fn IntrinsicSizes::get_max_content_size(
  self : IntrinsicSizes,
) -> Double =
  #| (self) => self.maxContentSize

///|
/// LayoutConstraints interface
pub type LayoutConstraints

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

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

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

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

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

///|
pub extern "js" fn LayoutConstraints::get_available_inline_size(
  self : LayoutConstraints,
) -> Double =
  #| (self) => self.availableInlineSize

///|
pub extern "js" fn LayoutConstraints::get_available_block_size(
  self : LayoutConstraints,
) -> Double =
  #| (self) => self.availableBlockSize

///|
pub extern "js" fn LayoutConstraints::get_fixed_inline_size(
  self : LayoutConstraints,
) -> Double? =
  #| (self) => (() => { const v = self.fixedInlineSize; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn LayoutConstraints::get_fixed_block_size(
  self : LayoutConstraints,
) -> Double? =
  #| (self) => (() => { const v = self.fixedBlockSize; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn LayoutConstraints::get_percentage_inline_size(
  self : LayoutConstraints,
) -> Double =
  #| (self) => self.percentageInlineSize

///|
pub extern "js" fn LayoutConstraints::get_percentage_block_size(
  self : LayoutConstraints,
) -> Double =
  #| (self) => self.percentageBlockSize

///|
pub extern "js" fn LayoutConstraints::get_block_fragmentation_offset(
  self : LayoutConstraints,
) -> Double? =
  #| (self) => (() => { const v = self.blockFragmentationOffset; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn LayoutConstraints::get_block_fragmentation_type(
  self : LayoutConstraints,
) -> BlockFragmentationType =
  #| (self) => ['none', 'page', 'column', 'region'].indexOf(self.blockFragmentationType)

///|
pub extern "js" fn LayoutConstraints::get_data(
  self : LayoutConstraints,
) -> JsValue =
  #| (self) => self.data

///|
/// ChildBreakToken interface
pub type ChildBreakToken

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

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

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

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

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

///|
pub extern "js" fn ChildBreakToken::get_break_type(
  self : ChildBreakToken,
) -> BreakType =
  #| (self) => ['none', 'line', 'column', 'page', 'region'].indexOf(self.breakType)

///|
pub extern "js" fn ChildBreakToken::get_child(
  self : ChildBreakToken,
) -> LayoutChild =
  #| (self) => self.child

///|
/// BreakToken interface
pub type BreakToken

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

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

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

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

///|
/// Cast JsValue to BreakToken (unchecked)
pub extern "js" fn JsValue::to_break_token(self : JsValue) -> BreakToken =
  #| (self) => self

///|
pub extern "js" fn BreakToken::get_child_break_tokens(
  self : BreakToken,
) -> Array[ChildBreakToken] =
  #| (self) => self.childBreakTokens

///|
pub extern "js" fn BreakToken::get_data(self : BreakToken) -> JsValue =
  #| (self) => self.data

///|
/// LayoutEdges interface
pub type LayoutEdges

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

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

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

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

///|
/// Cast JsValue to LayoutEdges (unchecked)
pub extern "js" fn JsValue::to_layout_edges(self : JsValue) -> LayoutEdges =
  #| (self) => self

///|
pub extern "js" fn LayoutEdges::get_inline_start(self : LayoutEdges) -> Double =
  #| (self) => self.inlineStart

///|
pub extern "js" fn LayoutEdges::get_inline_end(self : LayoutEdges) -> Double =
  #| (self) => self.inlineEnd

///|
pub extern "js" fn LayoutEdges::get_block_start(self : LayoutEdges) -> Double =
  #| (self) => self.blockStart

///|
pub extern "js" fn LayoutEdges::get_block_end(self : LayoutEdges) -> Double =
  #| (self) => self.blockEnd

///|
pub extern "js" fn LayoutEdges::get_inline(self : LayoutEdges) -> Double =
  #| (self) => self.inline

///|
pub extern "js" fn LayoutEdges::get_block(self : LayoutEdges) -> Double =
  #| (self) => self.block

///|
/// FragmentResult interface
pub type FragmentResult

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

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

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

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

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

///|
pub extern "js" fn FragmentResult::new() -> FragmentResult =
  #| () => new FragmentResult()

///|
extern "js" fn FragmentResult::new_with_options_ffi(
  options : JsValue,
) -> FragmentResult =
  #| (options) => new FragmentResult(options)

///|
pub fn FragmentResult::new_with_options(
  options : FragmentResultOptions,
) -> FragmentResult {
  FragmentResult::new_with_options_ffi(options.to_js())
}

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

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