===== moon.pkg =====
import {
  "example/player_menu/model",
  "example/generated/ui_views/quest_tab" @quest,
  "example/generated/ui_views/inventory_tab" @inventory,
  "KKKIIO/selene/app",
  "KKKIIO/selene/entity",
  "KKKIIO/selene/event",
  "KKKIIO/selene/xaml_view",
}

supported_targets = "native+js"

===== view.generated.mbt =====
// Generated by selene-xaml@0.37.3. DO NOT EDIT.
// input user ui_xaml/player_menu.xaml sha256=5ba12d742c5df1daa9abb2306ab0393e6c43706e9dd0d7fdebfc0b96cb237b40
// input moon-info model/pkg.generated.mbti sha256=6c891cdba62f53fe41b8af7516f4dd341011d8212fd355af39639971ab6e17a7

///|
type PlayerMenuViewModel = @model.PlayerMenuViewModel

///|
pub(all) enum PlayerMenuViewAction {} derive(Eq, Debug)

///|
#warnings("-unused_value")
fn generated_rect_component(
  value : String,
  index : Int,
  path : String,
  image_region : Bool,
  corner_radius : Bool,
  non_negative : Bool,
) -> Double raise {
  @xaml_view.generated_view_rect_component(
    value,
    index,
    path,
    image_region,
    corner_radius~,
    non_negative~,
  )
}

///|
#warnings("-unused_value")
fn generated_image_drop_shadow(
  value : String,
  path : String,
) -> @xaml_view.ImageDropShadow? raise {
  @xaml_view.generated_view_image_drop_shadow(value, path)
}

///|
#warnings("-struct_never_constructed")
pub struct PlayerMenuView {}

///|
let generated_runtime : @xaml_view.GeneratedViewRuntime[
  PlayerMenuViewModel,
  PlayerMenuViewAction,
] = @xaml_view.GeneratedViewRuntime::new(generated_handle_event)

///|
/// World-isolated typed actions emitted by this view.
pub let action_event_bus : @event.Events[
  @xaml_view.GeneratedViewAction[PlayerMenuViewAction],
] = generated_runtime.action_events()

///|
/// ViewModel components mounted by this View in the current World.
pub fn PlayerMenuView::view_models() -> Map[@entity.Entity, PlayerMenuViewModel] {
  generated_runtime.view_models()
}

///|
#warnings("-unused_error_type")
fn generated_specs(
  state : PlayerMenuViewModel,
) -> Array[@xaml_view.NodeSpec] raise {
  let nodes : Array[@xaml_view.NodeSpec] = []
  nodes.push({
    key: "node-root-flex",
    parent: None,
    kind: @xaml_view.NodeKind::Flex,
    text: "",
    spans: [],
    source: "",
    path_geometry: None,
    active: true,
    enabled: true,
    focusable: false,
    tab_index: 0,
    focus_scope: false,
    auto_focus: false,
    navigation_up: "",
    navigation_down: "",
    navigation_left: "",
    navigation_right: "",
    automation_name: "",
    style: { ..@xaml_view.NodeStyle::default() },
    visual_state_groups: [],
  })
  nodes.push({
    key: "inventory",
    parent: Some("node-root-flex"),
    kind: @xaml_view.NodeKind::View,
    text: "",
    spans: [],
    source: "",
    path_geometry: None,
    active: state.inventory_active,
    enabled: true,
    focusable: true,
    tab_index: 0,
    focus_scope: false,
    auto_focus: false,
    navigation_up: "",
    navigation_down: "",
    navigation_left: "",
    navigation_right: "",
    automation_name: "",
    style: {
      ..@xaml_view.NodeStyle::default(),
      width: @xaml_view.LayoutValue::Px(240),
      padding_left: 12,
      padding_top: 12,
      padding_right: 12,
      padding_bottom: 12,
      clip_to_bounds: true,
    },
    visual_state_groups: [],
  })
  nodes.push({
    key: "quest",
    parent: Some("node-root-flex"),
    kind: @xaml_view.NodeKind::View,
    text: "",
    spans: [],
    source: "",
    path_geometry: None,
    active: state.quest_active,
    enabled: true,
    focusable: false,
    tab_index: 0,
    focus_scope: false,
    auto_focus: false,
    navigation_up: "",
    navigation_down: "",
    navigation_left: "",
    navigation_right: "",
    automation_name: "",
    style: { ..@xaml_view.NodeStyle::default() },
    visual_state_groups: [],
  })
  nodes
}

///|
/// Refreshes presentation dependencies rooted at quest.
pub fn PlayerMenuView::refresh_quest(root : @entity.Entity) -> Unit raise {
  let refreshes : Array[@xaml_view.GeneratedNodeRefresh[PlayerMenuViewModel]] = []
  generated_runtime.refresh_nodes(root, refreshes)
  @quest.QuestTabView::replace(
    PlayerMenuView::quest(root),
    generated_runtime.view_model(root).quest,
  )
}

///|
/// Refreshes presentation dependencies rooted at inventory.
pub fn PlayerMenuView::refresh_inventory(root : @entity.Entity) -> Unit raise {
  let refreshes : Array[@xaml_view.GeneratedNodeRefresh[PlayerMenuViewModel]] = []
  generated_runtime.refresh_nodes(root, refreshes)
  @inventory.InventoryTabView::replace(
    PlayerMenuView::inventory(root),
    generated_runtime.view_model(root).inventory,
  )
}

///|
/// Refreshes presentation dependencies rooted at quest_active.
pub fn PlayerMenuView::refresh_quest_active(
  root : @entity.Entity,
) -> Unit raise {
  let refreshes : Array[@xaml_view.GeneratedNodeRefresh[PlayerMenuViewModel]] = [
    {
      key: "quest",
      update: fn(state, spec) { { ..spec, active: state.quest_active } },
    },
  ]
  generated_runtime.refresh_nodes(root, refreshes)
}

///|
/// Refreshes presentation dependencies rooted at inventory_active.
pub fn PlayerMenuView::refresh_inventory_active(
  root : @entity.Entity,
) -> Unit raise {
  let refreshes : Array[@xaml_view.GeneratedNodeRefresh[PlayerMenuViewModel]] = [
    {
      key: "inventory",
      update: fn(state, spec) { { ..spec, active: state.inventory_active } },
    },
  ]
  generated_runtime.refresh_nodes(root, refreshes)
}

///|
/// Returns the mounted root owned by the named child View.
pub fn PlayerMenuView::quest(root : @entity.Entity) -> @entity.Entity raise {
  match @xaml_view.ViewHost::new().entity(root, "quest") {
    Some(value) => value
    None => fail("component placeholder is missing: quest")
  }
}

///|
/// Returns the mounted root owned by the named child View.
pub fn PlayerMenuView::inventory(root : @entity.Entity) -> @entity.Entity raise {
  match @xaml_view.ViewHost::new().entity(root, "inventory") {
    Some(value) => value
    None => fail("component placeholder is missing: inventory")
  }
}

///|
/// Mounts this view on an alive root entity in the current world.
/// Destroying the root ends the view lifetime.
pub fn PlayerMenuView::mount(
  entity : @entity.Entity,
  view_model : PlayerMenuViewModel,
) -> Unit raise {
  let desired = generated_specs(view_model)
  generated_runtime.mount(entity, view_model, desired)
  let host = @xaml_view.ViewHost::new()
  let generated_component_0 = match host.entity(entity, "quest") {
    Some(value) => value
    None => fail("component placeholder is missing: quest")
  }
  @quest.QuestTabView::mount(generated_component_0, view_model.quest)
  let generated_component_1 = match host.entity(entity, "inventory") {
    Some(value) => value
    None => fail("component placeholder is missing: inventory")
  }
  @inventory.InventoryTabView::mount(
    generated_component_1,
    view_model.inventory,
  )
}

///|
/// Releases this View while leaving its caller-owned root entity alive.
pub fn PlayerMenuView::unmount(entity : @entity.Entity) -> Unit raise {
  generated_runtime.unmount(entity)
}

///|
/// Refreshes the complete presentation from the current ViewModel component.
pub fn PlayerMenuView::refresh(entity : @entity.Entity) -> Unit raise {
  let view_model = generated_runtime.view_model(entity)
  let desired = generated_specs(view_model)
  generated_runtime.refresh(entity, desired)
  let host = @xaml_view.ViewHost::new()
  match host.entity(entity, "quest") {
    Some(target) => @quest.QuestTabView::replace(target, view_model.quest)
    None => fail("component placeholder is missing: quest")
  }
  match host.entity(entity, "inventory") {
    Some(target) =>
      @inventory.InventoryTabView::replace(target, view_model.inventory)
    None => fail("component placeholder is missing: inventory")
  }
}

///|
/// Reconciles this mounted View with a new ViewModel.
pub fn PlayerMenuView::replace(
  entity : @entity.Entity,
  view_model : PlayerMenuViewModel,
) -> Unit raise {
  let desired = generated_specs(view_model)
  generated_runtime.replace(entity, view_model, desired)
  let host = @xaml_view.ViewHost::new()
  match host.entity(entity, "quest") {
    Some(target) => @quest.QuestTabView::replace(target, view_model.quest)
    None => fail("component placeholder is missing: quest")
  }
  match host.entity(entity, "inventory") {
    Some(target) =>
      @inventory.InventoryTabView::replace(target, view_model.inventory)
    None => fail("component placeholder is missing: inventory")
  }
}

///|
#warnings("-unused_value")
fn generated_handle_event(
  view_model : PlayerMenuViewModel,
  event : @xaml_view.UiEvent,
) -> PlayerMenuViewAction? {
  None
}

///|
/// Installs this View below a root generated View that owns the shared host.
pub fn component_plugin(app : @app.App) -> @app.App {
  let app = app
    .add_plugin(@quest.component_plugin)
    .add_plugin(@inventory.component_plugin)
  generated_runtime.install_component(app, "selene_xaml_PlayerMenuView_events")
}

///|
/// Installs the shared host and this View package component tree.
pub fn plugin(app : @app.App) -> @app.App {
  app.add_plugin(@xaml_view.plugin).add_plugin(component_plugin)
}

===== view.generated.mbt.map.json =====
{
  "mappings": [
    {
      "source": "ui_xaml/player_menu.xaml",
      "original_offset": 477,
      "generated_offset": 2446,
      "length": 22
    },
    {
      "source": "ui_xaml/player_menu.xaml",
      "original_offset": 589,
      "generated_offset": 3154,
      "length": 18
    }
  ]
}

