Skip to content

No.290 · Micro-animations

Download Tray

The arrow drops into the tray while a ring fills with real progress; when it's done a tick appears and the tray bounces.

The prompt

The design brief behind this component — reuse it to regenerate, remix, or explain it.

Build a round download button (56px) with a progress ring. Its icon is an arrow over an open tray. On press, the action is called with a progress callback: while it runs, the arrow repeatedly drops into the tray (translate −6px → 5px, fading in and out, 900ms loop) and a ring around the button (SVG circle, stroke-dashoffset from the circumference) fills with the reported progress. When it resolves, the ring turns green and full, the arrow is replaced by a tick drawing itself in, and the tray does a quick squash-and-stretch bounce from the bottom; after 2.2s it resets. Live progress is announced politely ("Downloading 40%", "Download complete"). The demo fakes the progress.

Notes

Interaction
Click, tap, Space or Enter to start; the button shows progress and confirms when done.
Motion
Arrow drop loop 900ms; ring follows real progress; tick 360ms; tray bounce 520ms; reset after 2.2s.
Accessibility
aria-busy while downloading and a label that changes to "Downloaded"; progress is announced in a status region. Reduced motion removes the looping drop and bounce.
Responsive
A fixed-size control that sits inline wherever it's placed; nothing depends on screen width.
On touch
Works the same on touch; there's no hover-only behaviour.

Featured

301 components