Build a list of progress bars that animate from empty to full as they appear on screen. It's a small step up from a single bar, and it teaches a surprisingly common gotcha: to make something animate in on mount, you can't just render it in its final state — you have to render the start state first, then change to the end state after the browser has painted, so there's something to transition between.
// A self-contained component. No props.
function App(): JSX.Element;
Several bars that each transition their fill from 0% to 100% when the component mounts.
on mount: all bars at 0% (empty)
~frame later: width set to 100% → CSS transitions the fill
after ~1.6s: all bars at 100% (full)
The animation is pure CSS (`transition: width …`). React's only job is to
flip the width from 0% to 100% one paint after mount.
transition: width on the fill animates the change for free; you only toggle the value.requestAnimationFrame, or a 0 ms timeout) so the 0% state paints before you switch to 100%.