A whole video
use fframes_kit::prelude::*;
#[derive(Debug)]pub struct MyVideo { pub theme: Theme,}
impl Video for MyVideo { const FPS: usize = 30; const WIDTH: usize = 1920; const HEIGHT: usize = 1080;
fn duration(&self) -> Duration<'_> { Duration::Seconds(6.0) }
fn audio(&self) -> AudioMap<'_> { AudioMap::none() }
fn render_frame<'a>(&'a self, frame: Frame, ctx: &FFramesContext<'a, '_>) -> Svgr<'a> { let mut ui = Ui::new(frame, ctx, &self.theme); let c = self.theme.colors; let title = self.theme.typography.title; let content = ui.show(Series { items: vec![ (3.0, children(move |ui| { let fade = FadeIn { shift: (0.0, -40.0), ..ui.defaults() }; let out: FadeOut = ui.defaults(); let text = svgr!( <text x="96" y="540" font-family={title.family} font-size={title.size} font-weight={title.weight} fill={c.title}>"Hello"</text> ); let entered = fade.apply(ui, text); out.apply(ui, entered) })), (3.0, children(move |ui| { let fade: FadeIn = ui.defaults(); fade.apply(ui, svgr!(<circle cx="960" cy="540" r="200" fill={c.accent} />)) })), ], overlap: 0.0, }); svgr!( <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080" width={ctx.current_video_size.width} height={ctx.current_video_size.height}> <rect width="1920" height="1080" fill={c.background} /> {content} </svg> ) }}The gallery (gallery/ of the repository) has one scene per component; render one with
cargo run --release -p components-gallery -- frame Sequence@50%.
