# llimphi-widget-transport *Read this in English: [README.md](README.md).* Botones de **transporte** para reproductores de medios (play/pause/prev/next/seek/volume/mute/repeat/shuffle/speed/ snapshot/record/eq). Pattern análogo a `llimphi-widget-timeline`/`-waveform`: el widget **no mantiene estado** del reproductor. El caller arma un `TransportButton` por cada botón visible (con el flag que define su estado activo, como `playing` o `muted`), lo pasa a `transport_button_view`, y recibe el `TransportAction` semántico en un closure cuando el usuario clickea. Quien mapea esas acciones al `MediaCommand` propio del dominio es la app. ```text [⏮ ] [⏯ ] [⏭ ] [⏪ ] [⏩ ] [🔊] ``` Uso típico (media-app): ```ignore use llimphi_widget_transport::{transport_button_view, TransportAction as Ta, TransportButton as Tb, TransportPalette}; let pal = TransportPalette::from_theme(&theme); transport_button_view( Tb::PlayPause { playing: !pause().is_paused() }, &pal, |action| match action { Ta::TogglePlay => Msg::Command(MediaCommand::TogglePause), Ta::SeekBy(secs) => Msg::Command(MediaCommand::SeekBy { secs }), /* … */ }, ) ``` Para una fila completa el caller mapea su `Vec` con `.into_iter().map(|b| transport_button_view(b, &pal, on_action.clone()))` y lo pone como `children` de una `View` con `flex_direction: Row` y `gap: TransportPalette::gap`. --- Parte de **llimphi** — ver [llimphi](../../LEEME.md).