//! Corre una app WASM Tier 3 dentro de una ventana Llimphi real. //! //! El `.wasm` está embebido (compilado por `scripts/build-wasm-demo.sh`). El //! host no sabe nada de la app: pide `wasm_view`, materializa el `WireNode`, //! rebota clicks y rutea el teclado al input enfocado. Toda la lógica vive del //! lado guest. //! //! `cargo run -p llimphi-wasm-runner --example run_counter --release` use llimphi_ui::{App, Handle, KeyEvent, View}; use llimphi_wasm_runner::{RunnerMsg, WasmGuest}; const COUNTER_WASM: &[u8] = include_bytes!("../assets/counter.wasm"); struct Host; impl App for Host { type Model = WasmGuest; type Msg = RunnerMsg; fn title() -> &'static str { "llimphi · wasm runner — counter" } fn init(_: &Handle) -> Self::Model { WasmGuest::load(COUNTER_WASM, 0).expect("cargar counter.wasm") } fn update(mut model: Self::Model, msg: Self::Msg, _: &Handle) -> Self::Model { if let Err(e) = model.apply(&msg) { eprintln!("wasm dispatch: {e}"); } model } fn view(model: &Self::Model) -> View { model.render() } fn on_key(model: &Self::Model, event: &KeyEvent) -> Option { model.key_to_msg(event) } fn on_focus(_model: &Self::Model, id: Option) -> Option { Some(WasmGuest::focus_msg(id)) } } fn main() { llimphi_ui::run::(); }