// @ds-adherence-ignore -- omelette starter scaffold (raw elements/hex/px by design) // Copied omelette starter. Re-running copy_starter_component with this kind overwrites this file with the latest version (page content is unaffected). /* BEGIN USAGE */ // animations.jsx — timeline engine. Exports (on window): Stage, Sprite, // TextSprite, ImageSprite, RectSprite, VideoSprite, PlaybackBar, // useTime, useTimeline, useSprite, Easing, interpolate, animate, clamp. // // // // // // // // // // // Stage({width,height,duration,background,fps,loop,autoplay}) — auto-scales to // viewport; scrubber + play/pause + ←/→ seek + space + 0-reset; persists // playhead. The canvas is an , export-ready: Share → // Export → Video (or the PlaybackBar's download button) renders it to .mp4. // Stage OWNS the exportable-video contract (the // data-om-exportable-video-with-duration-secs attribute + seek listener + // font inlining) — NEVER put that attribute on any other element; a second // nested "exportable root" makes export and the host timeline bind to the // wrong element and silently breaks playback control. // Screenshot tools DOM-rerender (not pixel-capture) and unwrap this wrapper // so captures should work — but if one comes back black, that's a capture // artifact, not a render bug; trust the live preview. // Sprite({start,end,keepMounted}) — mounts children only while playhead is in // [start,end]. Children read {localTime, progress, duration} via useSprite(). // useTime() → seconds; useTimeline() → {time,duration,playing,setTime,setPlaying}. // TextSprite({text,x,y,size,color,font,weight,align,entryDur,exitDur}) — fades/scales in+out. // ImageSprite({src,x,y,width,height,fit,radius,kenBurns,placeholder}) — same, with optional ken-burns. // RectSprite({x,y,width,height,color,radius}) — solid box with entry/exit. // VideoSprite({src,start,end,speed,style}) — looped