/* Motion layer. Additive only — every colour, radius and easing comes from site.css.
   The hidden state is scoped to .js so that if scripting never runs, the page still
   renders fully; the animation is an enhancement, never a prerequisite for content. */

.js .reveal{opacity:0;transform:translate3d(0,18px,0);transition:opacity .7s var(--ease),transform .7s var(--ease);}
.js .reveal.in{opacity:1;transform:none;}

.card{transition:transform .28s var(--ease),box-shadow .28s var(--ease);}
.card:hover{transform:translate3d(0,-4px,0);box-shadow:var(--shadow-raised);}

.go{transition:transform .2s var(--ease);}
.card:hover .go{transform:translate3d(3px,0,0);}

[data-parallax]{overflow:hidden;}
[data-parallax] img{will-change:transform;}

/* site.css already kills transitions under reduce; these cover transform/opacity left behind. */
@media (prefers-reduced-motion:reduce){
  .js .reveal{opacity:1 !important;transform:none !important;}
  .card:hover{transform:none;}
  [data-parallax] img{transform:none !important;}
}

/* Sign-up form: honeypot + inline status */
.hp-field{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden;}
.form-status{margin:14px 0 0;font-size:15px;line-height:1.5;font-weight:700;}
.form-status:empty{margin:0;}
.form-status.ok{color:var(--gold-hi);}
.form-status.err{color:#FFB4B4;}