/* animations.css — every @keyframes used in the app.
 *
 * Two rules hold across all of them. Only transform and opacity are animated,
 * so nothing here can force a reflow; and everything enters from slightly
 * below and slightly small, which is the direction Apple's own surfaces come
 * from — a sheet rises into place rather than fading in from nowhere. */
@keyframes panelIn{from{opacity:0;transform:translateY(10px) scale(.995)}to{opacity:1;transform:none}}
@keyframes rowIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
@keyframes popIn{from{opacity:0;transform:translateY(-8px) scale(.96)}to{opacity:1;transform:none}}
@keyframes toastIn{from{opacity:0;transform:translateX(-50%) translateY(14px) scale(.94)}to{opacity:1;transform:translateX(-50%)}}
@keyframes scrimIn{from{opacity:0}to{opacity:1}}
/* The dialog is the one surface that scales up from behind the page rather
   than sliding: it is a sheet arriving on top, so it starts small and close. */
@keyframes modalIn{from{opacity:0;transform:translateY(16px) scale(.96)}to{opacity:1;transform:none}}
@keyframes bellPulse{0%,70%,100%{transform:scale(1);opacity:1}82%{transform:scale(1.55);opacity:.75}}
@keyframes bellNudge{0%,60%,100%{transform:rotate(0)}68%{transform:rotate(-11deg)}78%{transform:rotate(9deg)}88%{transform:rotate(-4deg)}}
