/* Suite-wide motion polish (2026-08-22). Task Board pioneered these and
   keeps its own copy; this file brings the same feel to every other page.
   Rules: transform/opacity only (compositor-friendly), everything behind
   prefers-reduced-motion, and NO scroll or layout behavior changes. */
@media (prefers-reduced-motion: no-preference){
  /* entrance: cards rise in with a soft cascade, capped stagger */
  .card{ animation: suiteRise .38s cubic-bezier(.22,.7,.3,1) backwards; }
  .card:nth-of-type(1){ animation-delay:.04s }
  .card:nth-of-type(2){ animation-delay:.09s }
  .card:nth-of-type(3){ animation-delay:.14s }
  .card:nth-of-type(4){ animation-delay:.19s }
  .card:nth-of-type(5){ animation-delay:.24s }
  .card:nth-of-type(6){ animation-delay:.29s }
  .card:nth-of-type(n+7){ animation-delay:.33s }
  /* tactile press on interactive controls */
  button, .btn{ transition: transform .12s ease; }
  button:active, .btn:active{ transform: scale(.96); }
  input[type="checkbox"]{ transition: transform .12s ease; }
  input[type="checkbox"]:active{ transform: scale(.82); }
  input[type="checkbox"]:checked{ animation: suiteCheckPop .22s cubic-bezier(.2,.9,.3,1.3); }
  /* overlay dialogs settle in rather than snapping */
  .modal > div, [id$="Modal"] > div{ animation: suitePop .2s cubic-bezier(.2,.9,.3,1.15); }
}
@keyframes suiteRise{ from{ opacity:0; transform:translateY(10px) } to{ opacity:1; transform:none } }
@keyframes suitePop{ from{ opacity:0; transform:scale(.94) translateY(6px) } to{ opacity:1; transform:none } }
@keyframes suiteCheckPop{ 0%{ transform:scale(.7) } 60%{ transform:scale(1.12) } 100%{ transform:scale(1) } }
