/* Honor Choir Academy — ONE motion system for the whole domain.
   Loaded by every app the same way assets/hca-theme.css is. Colors live in the
   theme file; how anything MOVES lives here, so the site cannot end up with a
   different idea of "fast" on every page. `app/assets` is symlinked wholesale
   into the served public/, so this needs no Dockerfile change.

   Owner, 2026-08-29: "make all animation and movement on the domain smooth as
   butter." Butter is not slower, it is CONSISTENT and CHEAP: everything moves on
   the same few curves, motion rides transform and opacity so the compositor can
   carry it, and nothing that moves every frame touches layout.

   THE RULES the site is held to:
     1. Animate transform and opacity. left/top/width/height/margin lay the page
        out again on every frame; a transform does not.
     2. Anything moving frame by frame is driven by requestAnimationFrame and
        positioned with translate3d, never style.left.
     3. A long lived mover carries will-change:transform while it moves and drops
        it when it stops. Left on, it costs memory for nothing.
     4. Transitions name their properties. `transition: all` animates things you
        did not mean, including layout.
     5. Engraved music glows by filter or opacity only. Never move or refill a
        notehead.
     6. Deliberate character is kept: the landing logo's swing, the count-in
        digits, the pad's hit. Only unnamed ad-hoc timings are routed to tokens. */

:root{
  /* Durations. Three is enough; a fourth becomes noise. */
  --hca-dur-1:120ms;   /* a tap answering, a colour changing, a hover */
  --hca-dur-2:220ms;   /* buttons, chips, panels, most of the interface */
  --hca-dur-3:420ms;   /* a view arriving, a card entering, a sheet opening */

  /* Curves. Motion decelerates into place; it does not arrive at full speed. */
  --hca-ease:cubic-bezier(.2,.8,.2,1);          /* standard, out */
  --hca-ease-in:cubic-bezier(.4,0,1,1);         /* leaving the screen */
  --hca-ease-inout:cubic-bezier(.4,0,.2,1);     /* moving between two places */
  --hca-spring:cubic-bezier(.34,1.56,.64,1);    /* a deliberate overshoot, sparingly */
}

/* A reader who has asked their system for less motion gets the state change
   without the travel. Tokens only, never a blanket !important sweep: an
   animation that fades content in without a fill mode would leave that content
   invisible, which is how a working button disappears. */
@media (prefers-reduced-motion: reduce){
  :root{--hca-dur-1:0ms;--hca-dur-2:0ms;--hca-dur-3:0ms}
}
