# llimphi-lottie *Read this in English: [README.md](README.md).* Puente fino entre `velato` (reproductor de Lottie de Linebender) y Llimphi. `llimphi-svg` cubre el vector *estático* arbitrario (íconos `.desktop`, logos). `llimphi-motion` cubre el movimiento *generado por código* (tweens sobre el bucle Elm). Este crate cubre el hueco del medio: **animación vectorial autorada por fuera** — los `.json` de Lottie que exportan los diseñadores desde After Effects / lottiefiles (íconos animados, ilustraciones, estados vacíos, onboarding). Es el gemelo de `llimphi-svg`, con un eje de tiempo: `velato` parsea el JSON a una `Composition` y, para un `frame` dado, emite a la **misma** `vello::Scene` que usa `llimphi-raster`. ## Uso ```ignore use llimphi_lottie::LottieAsset; use std::time::Duration; // Parsea UNA vez (al cargar la app): let anim = LottieAsset::from_str(include_str!("spinner.json")).expect("lottie válido"); // En el estado de la app guardas el tiempo transcurrido y lo avanzas con el // bucle Elm — exactamente el patrón de los workers de simulación: // handle.spawn_periodic(Duration::from_millis(16), || Msg::Tick); // y en update: self.t += 1.0 / 60.0; // Pintalo a su instante actual (escala + centra al rect, en loop): View::new(style).children(vec![anim.view_at_time::(self.t)]) ``` El parse cuesta (corre el importador serde de Lottie); el `paint`/`view` no. `LottieAsset` es `Clone` barato (`Arc` internamente) — el mismo asset en varios nodos no replica memoria. ## Por qué un `Renderer` nuevo por paint `velato::Renderer` es `Default` y sólo guarda Vecs de scratch que se limpian en cada `append`. No tiene recursos de GPU (eso es trabajo de `llimphi-hal`). Crear uno por frame es despreciable frente a empujar la geometría — que se hace igual — y nos deja un `LottieAsset` `Send + Sync` sin `Mutex`. ## Cobertura `velato` 0.9 implementa shapes, transforms animados, gradientes, trim paths, máscaras y precomposiciones — el grueso de los Lottie reales de íconos e ilustración. **No** implementa todavía capas de **texto**, **effects** (blur/drop-shadow) ni **expresiones** (declarado en su propio `schema/mod.rs`). Un asset que use esas features se pinta omitiéndolas, no rompe. Cuando un `.json` concreto las necesite, el camino es vendorizar `velato` como `shared/foreign-lottie` y completar el `todo` puntual. --- Parte de **llimphi** — ver [llimphi](../LEEME.md).