/* GCF motion layer (snappy-20260913) - micro-interactions for gcfdata.com, marketing + app.
   Enqueued last by gcf-snappy.php (sandbox). Rules per DESIGN.md: 160-220 ms, ease-out, transform /
   opacity / colour / shadow only (never width, height, padding, margin), no bounce, nothing over 250 ms,
   and ONE prefers-reduced-motion block at the end that neutralises all of it.
   Classes driven by JS: .is-pressed (gcf-snappy.js), .is-enter + .is-busy (gcf-onboard.js),
   .is-busy + .is-shake on auth forms (gcf-auth.js, other owner).
   REVERT: delete this file, gcf-snappy.js and gcf-snappy.php; restore gcf-onboard.js.bak-snappy-20260913. */

/* ---- 0. cross-document view transitions (same-origin only, the spec default): a 180 ms crossfade
        between pages instead of a white flash. Browsers without the feature ignore it. ---- */
@view-transition{navigation:auto;}
::view-transition-old(root),::view-transition-new(root){animation-duration:.18s;animation-timing-function:ease-out;}

/* ---- 1. buttons and links ---- */
button:not([class*="depicter"]),[type="button"],[type="submit"],[role="button"],a.gdlr-core-button,[class*="__btn"]{
  transition:background-color .16s ease-out,border-color .16s ease-out,box-shadow .16s ease-out,color .16s ease-out,transform .16s ease-out,opacity .16s ease-out,filter .16s ease-out;
}
/* Pressed: scale in fast, release at the normal speed. !important because hover rules
   (.gcf-onb__next:hover, a.gcf-auth__btn:hover) set transform at higher specificity. */
.is-pressed{transform:scale(.98)!important;transition-duration:.08s;}
/* Form fields: the focus ring (border + shadow) eases in rather than snapping. */
.gcf-auth__form input,.gcf-formwrap input,.gcf-formwrap textarea,.gcf-formwrap select,.gcf-onb input[type=text],.gcf-onb textarea,.gcf-onb select{
  transition:border-color .16s ease-out,box-shadow .16s ease-out,background-color .16s ease-out;
}

/* ---- 2. cards, tiles, rows that already have hover styles: consistent transform/shadow only ---- */
.gcf-dash__tile,.gcf-dash__stat,.gcf-onb__route{transition:border-color .16s ease-out,box-shadow .16s ease-out,transform .16s ease-out;}
.gcf-dash__tile:hover,.gcf-dash__stat:hover{transform:translateY(-1px);}
tr.gcf-fc__row{transition:background-color .16s ease-out;}
.gcf-prc__opt{transition:color .16s ease-out;}

/* ---- 3. onboarding wizard ---- */
/* Card enter. gcf-onboard.js adds .is-enter right after innerHTML, before the first paint, so the card's
   first frame IS the keyframe start (no flash of the final state). */
@keyframes gcfMEnter{from{opacity:0;transform:translateY(8px);}to{opacity:1;transform:none;}}
.gcf-onb__card.is-enter{animation:gcfMEnter .2s ease-out both;}
/* Rail: the rail is re-rendered on every step, so transitions cannot run; keyframes do. Only the step
   that just completed (the done item directly before the current one) pops its check mark - animating
   every done check on every repaint would read as a rail-wide flicker. */
@keyframes gcfMPop{from{opacity:0;transform:scale(.6);}to{opacity:1;transform:none;}}
.gcf-onb__railitem.is-done:has(+ .gcf-onb__railitem.is-now) .gcf-onb__railno svg{animation:gcfMPop .18s ease-out both;}
@keyframes gcfMRing{from{box-shadow:0 0 0 0 rgba(27,108,168,0);}to{box-shadow:0 0 0 4px rgba(27,108,168,.14);}}
.gcf-onb__railitem.is-now .gcf-onb__railno{animation:gcfMRing .18s ease-out both;}
/* Chips: pop in where they render once (accelerator proposals). Deliberately NOT the live [data-chips]
   echo under the NAICS / keyword / agency fields - that box is re-rendered on every keystroke and
   would flicker. */
@keyframes gcfMChip{from{opacity:0;transform:scale(.96);}to{opacity:1;transform:none;}}
.gcf-onb__psec .gcf-onb__chip{animation:gcfMChip .14s ease-out both;}
/* Checkbox tick draws in (opacity + scale). Pre-checked boxes render straight in the final state. */
.gcf-onb__optbox svg{transform:scale(.5);transition:opacity .16s ease-out,transform .16s ease-out;}
.gcf-onb__opt.is-on .gcf-onb__optbox svg{transform:none;}

/* ---- 4. busy buttons (onboarding accelerators + auth submit) and the auth error shake ---- */
@keyframes gcfMSpin{to{transform:rotate(360deg);}}
.gcf-onb__next.is-busy,.gcf-auth__btn.is-busy{position:relative;opacity:.85;pointer-events:none;}
.gcf-onb__next.is-busy::after,.gcf-auth__btn.is-busy::after{content:"";display:inline-block;width:14px;height:14px;margin-left:9px;vertical-align:-2px;border-radius:50%;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;animation:gcfMSpin .7s linear infinite;}
@keyframes gcfMShake{0%,100%{transform:none;}20%{transform:translateX(-3px);}40%{transform:translateX(3px);}60%{transform:translateX(-3px);}80%{transform:translateX(3px);}}
.gcf-auth__msg.is-err.is-shake{animation:gcfMShake .3s ease-out;}

/* ---- 5. detail drawer + save-search modal: they were appended with no entry state ---- */
@keyframes gcfMFade{from{opacity:0;}to{opacity:1;}}
@keyframes gcfMRise{from{opacity:0;transform:translateY(6px);}to{opacity:1;transform:none;}}
.gcf-dt__overlay,.gcf-sm__overlay{animation:gcfMFade .16s ease-out;}
.gcf-dt,.gcf-sm{animation:gcfMRise .18s ease-out;}

/* (Skeletons already sweep - gcf-site.css "skeleton loaders 2026-08-05" - so nothing is added here.
   html{scroll-behavior:smooth} is deliberately absent: the Goodlayers page-builder JS animates
   scrollTop with jQuery, and CSS smooth scrolling fights that step-by-step.) */

/* ---- 6. reduced motion: everything above, off ---- */
@media (prefers-reduced-motion:reduce){
  @view-transition{navigation:none;}
  ::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none!important;}
  button:not([class*="depicter"]),[type="button"],[type="submit"],[role="button"],a.gdlr-core-button,[class*="__btn"],
  .gcf-auth__form input,.gcf-formwrap input,.gcf-formwrap textarea,.gcf-formwrap select,.gcf-onb input[type=text],.gcf-onb textarea,.gcf-onb select,
  .gcf-dash__tile,.gcf-dash__stat,.gcf-onb__route,tr.gcf-fc__row,.gcf-prc__opt,.gcf-onb__optbox svg{transition:none;}
  .is-pressed{transform:none!important;}
  .gcf-dash__tile:hover,.gcf-dash__stat:hover{transform:none;}
  .gcf-onb__optbox svg{transform:none;}
  .gcf-onb__card.is-enter,.gcf-onb__railitem.is-done:has(+ .gcf-onb__railitem.is-now) .gcf-onb__railno svg,.gcf-onb__railitem.is-now .gcf-onb__railno,
  .gcf-onb__psec .gcf-onb__chip,.gcf-auth__msg.is-err.is-shake,.gcf-dt__overlay,.gcf-sm__overlay,.gcf-dt,.gcf-sm{animation:none;}
  .gcf-onb__next.is-busy::after,.gcf-auth__btn.is-busy::after{display:none;}
}
