# DD-021 — Molle interrompibili al posto delle animazioni a durata fissa **Data:** 5 settembre 2026 **Stato:** Accettata **Contesto** Il movimento era fatto con `@keyframes` CSS e transizioni a durata fissa. Funzionava, ma nessuna di quelle animazioni può essere interrotta: se l'utente tocca o scorre a metà, la sequenza va avanti per conto suo, e per ripartire deve prima finire. Mancava del tutto qualsiasi gesto: il calendario si cambiava solo con due frecce. Contemporaneamente 43 componenti su 45 in `src/components/ui/` non erano importati da nessuna parte, e con loro ~45 dipendenze (tutti i `@radix-ui/*`, `recharts`, `react-hook-form`, `date-fns`, `embla`, `cmdk`, …): superficie di aggiornamento e di sicurezza pagata a vuoto. **Decisione** Aggiungere **una** libreria di animazione — `motion` — e toglierne ~45 inutilizzate. I parametri stanno in `src/lib/molla.ts` e sono i due di Apple (_Designing Fluid Interfaces_): rimbalzo e durata, non massa/rigidità/smorzamento. `molla.ui` (nessun sorpasso) è il default; `molla.slancio` si usa **solo** dopo un gesto che portava già inerzia. **Alternative scartate** - Tenere solo CSS con easing `linear()` e View Transitions → copre le comparse, non i gesti: niente handoff di velocità, niente ripartenza dal valore corrente. - GSAP → più grande e orientato alla timeline, cioè al modello prescritto che stiamo lasciando. **Conseguenze** - Le animazioni partono dal valore _a schermo_: un dato che cambia a metà transizione non produce salti. - Il movimento è ora codice JavaScript: senza JS non c'è comparsa (l'app già non funziona senza, per auth e dati). - `src/lib/motion.ts` resta solo per il movimento ridotto e i coriandoli. - `src/components/ui/` non è più una libreria: aggiungere una primitiva shadcn significa installarla, non pescarla da lì. **Riesame** Se il peso del bundle client diventasse un problema misurato, o se il web recuperasse nativamente l'interrompibilità (`ScrollTimeline` e `linear()` sono un primo passo).