/* CampusPulse — motion layer */

@keyframes cp-spin{to{transform:rotate(360deg)}}
@keyframes cp-rise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
@keyframes cp-rise-sm{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}
@keyframes cp-fade{from{opacity:0}to{opacity:1}}
@keyframes cp-pop{0%{opacity:0;transform:translateY(12px) scale(.97)}60%{transform:translateY(-2px) scale(1.005)}100%{opacity:1;transform:none}}
@keyframes cp-slide-left{from{opacity:0;transform:translateX(40px)}to{opacity:1;transform:none}}
@keyframes cp-slide-in-x{from{transform:translateX(100%)}to{transform:none}}
@keyframes cp-toast{from{opacity:0;transform:translateX(24px) scale(.96)}to{opacity:1;transform:none}}
@keyframes cp-shimmer{from{background-position:-360px 0}to{background-position:360px 0}}
@keyframes cp-float{0%,100%{transform:translate3d(0,0,0) scale(1)}50%{transform:translate3d(18px,-26px,0) scale(1.06)}}
@keyframes cp-float-2{0%,100%{transform:translate3d(0,0,0) scale(1)}50%{transform:translate3d(-24px,18px,0) scale(1.08)}}
@keyframes cp-tick{from{opacity:0;transform:translateY(56px)}12%{opacity:1;transform:none}30%{opacity:1;transform:none}42%{opacity:0;transform:translateY(-56px)}100%{opacity:0;transform:translateY(-56px)}}
@keyframes cp-curtain{to{opacity:0;visibility:hidden}}
@keyframes cp-star{0%{transform:scale(1)}45%{transform:scale(1.34) rotate(-12deg)}100%{transform:scale(1)}}
@keyframes cp-nudge{0%,100%{transform:translateX(0)}20%{transform:translateX(-6px)}40%{transform:translateX(6px)}60%{transform:translateX(-4px)}80%{transform:translateX(4px)}}
@keyframes cp-ripple{to{transform:scale(2.6);opacity:0}}
@keyframes cp-beat{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--ember) 45%,transparent)}70%{box-shadow:0 0 0 12px transparent}100%{box-shadow:0 0 0 0 transparent}}

/* Boot */
.boot__ring{animation:cp-spin 1s linear infinite}
.boot__dot{animation:cp-beat 1.6s ease-out infinite}
.boot__word{animation:cp-fade .8s ease both}
body:not(.is-booting) .boot{animation:cp-curtain .5s ease .1s forwards}

/* Gate */
.orb--a{animation:cp-float 15s ease-in-out infinite}
.orb--b{animation:cp-float-2 19s ease-in-out infinite}
.gate__pitch .display{animation:cp-rise .8s cubic-bezier(.2,.8,.2,1) both}
.gate__pitch .lede{animation:cp-rise .8s cubic-bezier(.2,.8,.2,1) .12s both}
.ticker{animation:cp-rise .8s cubic-bezier(.2,.8,.2,1) .22s both}
.ticker__item{animation:cp-tick 12s cubic-bezier(.65,.05,.15,1) infinite}
.ticker__item:nth-child(1){animation-delay:0s}
.ticker__item:nth-child(2){animation-delay:4s}
.ticker__item:nth-child(3){animation-delay:8s}
.panel{animation:cp-pop .55s cubic-bezier(.2,.8,.2,1) both}
.gateform-in > *{animation:cp-rise-sm .42s cubic-bezier(.2,.8,.2,1) both}
.gateform-in > *:nth-child(1){animation-delay:.02s}
.gateform-in > *:nth-child(2){animation-delay:.06s}
.gateform-in > *:nth-child(3){animation-delay:.1s}
.gateform-in > *:nth-child(4){animation-delay:.14s}
.gateform-in > *:nth-child(5){animation-delay:.18s}
.gateform-in > *:nth-child(6){animation-delay:.22s}
.gateform-in > *:nth-child(7){animation-delay:.26s}
.gateform-in > *:nth-child(8){animation-delay:.3s}
.shake{animation:cp-nudge .42s ease}

/* App entry + route transitions */
.shell-in{animation:cp-fade .45s ease both}
.page-in > *{animation:cp-rise .46s cubic-bezier(.2,.8,.2,1) both}
.page-in > *:nth-child(1){animation-delay:.01s}
.page-in > *:nth-child(2){animation-delay:.07s}
.page-in > *:nth-child(3){animation-delay:.13s}
.page-in > *:nth-child(4){animation-delay:.19s}
.page-in > *:nth-child(5){animation-delay:.25s}
.page-in > *:nth-child(6){animation-delay:.31s}
.page-out{opacity:0;transform:translateY(-6px);transition:opacity .16s ease,transform .16s ease}
.g-kpi .stat{animation:cp-pop .5s cubic-bezier(.2,.8,.2,1) both}
.g-kpi .stat:nth-child(1){animation-delay:.04s}
.g-kpi .stat:nth-child(2){animation-delay:.1s}
.g-kpi .stat:nth-child(3){animation-delay:.16s}
.g-kpi .stat:nth-child(4){animation-delay:.22s}
tbody tr{animation:cp-rise-sm .34s ease both}
tbody tr:nth-child(1){animation-delay:.01s}
tbody tr:nth-child(2){animation-delay:.03s}
tbody tr:nth-child(3){animation-delay:.05s}
tbody tr:nth-child(4){animation-delay:.07s}
tbody tr:nth-child(5){animation-delay:.09s}
tbody tr:nth-child(6){animation-delay:.11s}
tbody tr:nth-child(7){animation-delay:.13s}
tbody tr:nth-child(n+8){animation-delay:.15s}
.beat{animation:cp-slide-in-x .4s cubic-bezier(.2,.8,.2,1) both}

/* Overlays */
.veil{animation:cp-fade .2s ease both}
.drawer{animation:cp-slide-left .38s cubic-bezier(.2,.85,.25,1) both}
.sheet{animation:cp-pop .32s cubic-bezier(.2,.9,.3,1.15) both}
.toast{animation:cp-toast .3s cubic-bezier(.2,.9,.3,1.1) both}
.rate button.on{animation:cp-star .34s ease}
.btn .spin{animation:cp-spin .7s linear infinite}

/* Ripple */
.btn,.cta,.navlink,.seg__btn{position:relative;overflow:hidden}
.ripple{position:absolute;border-radius:50%;background:currentColor;opacity:.22;transform:scale(0);pointer-events:none;animation:cp-ripple .58s ease-out forwards}

/* Skeleton */
.skel{border-radius:8px;background:linear-gradient(90deg,var(--card-2) 25%,var(--line) 37%,var(--card-2) 63%);
  background-size:720px 100%;animation:cp-shimmer 1.25s linear infinite;height:14px}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms !important;animation-iteration-count:1 !important;transition-duration:.001ms !important}
  .boot{display:none}
}
