/* ============ RBO — Animations ============ */

/* Reveal on scroll (driven by IntersectionObserver -> .in) */
.reveal{opacity:0;transform:translateY(38px);transition:opacity .9s var(--ease),transform .9s var(--ease)}
.reveal.in{opacity:1;transform:translateY(0)}

/* Staggered children inside grids */
.about__grid .reveal.in{transition-delay:calc(var(--d,0) * .12s)}

/* Hero title line reveal (keyframe = reliable paint, avoids clip-text repaint bug) */
.hero__title .line>span{opacity:0;transform:translateY(42px);will-change:transform,opacity}
.hero__title.in .line:nth-child(1)>span{animation:heroLine .95s var(--ease) forwards}
.hero__title.in .line:nth-child(2)>span{animation:heroLine .95s var(--ease) .14s forwards}
@keyframes heroLine{from{opacity:0;transform:translateY(42px)}to{opacity:1;transform:translateY(0)}}

/* Keyframes */
@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-16px)}}
@keyframes pulse{0%{box-shadow:0 0 0 0 rgba(52,211,153,.5)}70%{box-shadow:0 0 0 8px rgba(52,211,153,0)}100%{box-shadow:0 0 0 0 rgba(52,211,153,0)}}
@keyframes scrollx{to{transform:translateX(-50%)}}

/* Line chart draw */
.linechart.draw .linechart__line{animation:drawline 1.8s var(--ease) forwards}
@keyframes drawline{to{stroke-dashoffset:0}}

/* Orb subtle drift */
.hero__orb--1{animation:drift1 18s ease-in-out infinite}
.hero__orb--2{animation:drift2 22s ease-in-out infinite}
@keyframes drift1{0%,100%{transform:translate(0,0)}50%{transform:translate(40px,30px)}}
@keyframes drift2{0%,100%{transform:translate(0,0)}50%{transform:translate(-50px,-30px)}}

/* Accessibility: reduce motion */
@media (prefers-reduced-motion:reduce){
  *{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important}
  .reveal{opacity:1;transform:none}
  .hero__title .line>span{transform:none;opacity:1}
}
