Motivation
The menu card (src/menu-card/card.ts) currently snaps straight to new values when its data signature changes. A small "slot machine" digit-roll animation on update would give the card a more alive, tactile feel without touching its information density.
Proposal
When today/30d figures change between renders, animate the digits rolling from the old value to the new one (each digit column ticks independently) instead of an instant swap.
Feasibility notes
card.ts is a pure Canvas 2D draw function invoked by MenuCardRenderer and cached by data signature (TrayManager.refreshCard). True animation requires a short-lived requestAnimationFrame loop in the hidden card window while a transition is in flight, then handing the final PNG frame back to the tray — a scoped change to menu-card-window.ts's render contract (currently one-shot draw → PNG).
- Menu items only display a static bitmap per open, so the practical animation window is: kick off the roll when new data arrives, capture a few interim frames, and let it settle before the menu is next opened (or accept it's only visible if the menu happens to be open across a refresh).
Acceptance criteria
Motivation
The menu card (
src/menu-card/card.ts) currently snaps straight to new values when its data signature changes. A small "slot machine" digit-roll animation on update would give the card a more alive, tactile feel without touching its information density.Proposal
When
today/30dfigures change between renders, animate the digits rolling from the old value to the new one (each digit column ticks independently) instead of an instant swap.Feasibility notes
card.tsis a pure Canvas 2D draw function invoked byMenuCardRendererand cached by data signature (TrayManager.refreshCard). True animation requires a short-livedrequestAnimationFrameloop in the hidden card window while a transition is in flight, then handing the final PNG frame back to the tray — a scoped change tomenu-card-window.ts's render contract (currently one-shot draw → PNG).Acceptance criteria
todayCost/cost30d/etc. change from a previously-rendered value.