# llimphi-widget-rive-button *Read this in English: [README.md](README.md).* Botón **reactivo** dirigido por una máquina de estados estilo Rive ([`llimphi_anim::StateMachine`]). Es el primer consumidor *real* de la máquina de estados fuera del `llimphi-anim-studio` (que la autora) y de los examples de `llimphi-lottie`. Encapsula la composición canónica del demo `pointer_listeners_demo` como un widget reusable: tres estados —`idle` / `hover` / `press`— cada uno con su clip Lottie, hilados por inputs que el motor deriva del puntero crudo: - **hover** (`bool`): los listeners `Enter`/`Exit` sobre toda la superficie prenden/apagan el input `hovered`; `idle ⇄ hover` con crossfade. - **press** (`trigger`): el host llama `RiveButton::press` desde su `on_click`; dispara el trigger `pressed`, la máquina entra al estado `press` (clip **no-loop**) y, al terminar el clip (`ClipDone`), vuelve a `hover` o `idle` según siga el puntero encima. El widget es **stateful** (como `text-editor`/`nodegraph`): el host lo guarda en su `Model`, lo avanza con `advance` desde un tick periódico, le reenvía el puntero con `pointer` y el click con `press`, y lo pinta con `view`. El hit-testing vive en el motor, no en la app. ```ignore // En el Model del host: boton: RiveButton::builtin(), // update: Msg::Tick => m.boton.advance(DT), Msg::Pointer(p)=> m.boton.pointer(p), Msg::Click => { m.boton.press(); /* acción del host */ } // view: m.boton.view(Msg::Pointer, Msg::Click) ``` `advance`: RiveButton::advance `pointer`: RiveButton::pointer `press`: RiveButton::press `view`: RiveButton::view --- Parte de **llimphi** — ver [llimphi](../../LEEME.md).