/* Inflowave animation toolkit — authored in-house, no external deps. */
/* Reveal is a fail-safe ENHANCEMENT: content is VISIBLE by default and only
   hidden once JS confirms it's active (html.iw-anim-on) AND the element hasn't
   revealed yet (:not(.iw-in)). Revealing simply stops the hide from matching —
   no specificity battle — and a JS failsafe reveals everything after a timeout,
   so content is NEVER left blank (no-JS, stripped script, or observer failure). */
/* Reveal timing is variable so a CLONE can match the source's exact duration/ease
   (--iw-reveal-dur / --iw-reveal-ease, set in the injected block); defaults are a
   tasteful in-house curve. */
.iw-reveal,.iw-fade-up,.iw-fade-left,.iw-fade-right,.iw-zoom{transition:opacity var(--iw-reveal-dur,.7s) var(--iw-reveal-ease,cubic-bezier(.16,1,.3,1)),transform var(--iw-reveal-dur,.7s) var(--iw-reveal-ease,cubic-bezier(.16,1,.3,1))}
.iw-fade-in{transition:opacity var(--iw-reveal-dur,.8s) var(--iw-reveal-ease,ease)}
@media (prefers-reduced-motion: no-preference){
  html.iw-anim-on .iw-reveal:not(.iw-in),html.iw-anim-on .iw-fade-up:not(.iw-in){opacity:0;transform:translateY(24px);will-change:opacity,transform}
  html.iw-anim-on .iw-fade-left:not(.iw-in){opacity:0;transform:translateX(-28px);will-change:opacity,transform}
  html.iw-anim-on .iw-fade-right:not(.iw-in){opacity:0;transform:translateX(28px);will-change:opacity,transform}
  html.iw-anim-on .iw-zoom:not(.iw-in){opacity:0;transform:scale(.94);will-change:opacity,transform}
  html.iw-anim-on .iw-fade-in:not(.iw-in){opacity:0}
  .iw-float{animation:iw-float 6s ease-in-out infinite}
  @keyframes iw-float{0%,100%{transform:translateY(0)}50%{transform:translateY(-10px)}}
  .iw-marquee__track{animation:iw-marquee var(--iw-marquee-dur,28s) linear infinite}
  @keyframes iw-marquee{from{transform:translateX(0)}to{transform:translateX(-50%)}}
  .iw-shimmer-text{background-size:200% auto;animation:iw-shimmer 5s linear infinite}
  @keyframes iw-shimmer{to{background-position:200% center}}
  .iw-gradient-mesh::before{animation:iw-mesh 18s ease-in-out infinite alternate}
  @keyframes iw-mesh{0%{transform:translate3d(-4%,-3%,0) scale(1.05)}100%{transform:translate3d(4%,3%,0) scale(1.15)}}
}
/* Interactive helpers (safe with reduced motion — hover/scroll driven) */
.iw-lift{transition:transform .28s cubic-bezier(.16,1,.3,1),box-shadow .28s cubic-bezier(.16,1,.3,1)}
.iw-lift:hover{transform:translateY(-6px);box-shadow:0 18px 40px -18px rgba(0,0,0,.28)}
.iw-tilt{transition:transform .18s ease-out;transform-style:preserve-3d;will-change:transform}
.iw-underline{position:relative}
.iw-underline::after{content:"";position:absolute;left:0;bottom:-2px;width:100%;height:2px;background:currentColor;transform:scaleX(0);transform-origin:left;transition:transform .3s cubic-bezier(.16,1,.3,1)}
.iw-underline:hover::after{transform:scaleX(1)}
/* Animated multi-blob gradient background. Put on a positioned container; it
   paints behind the content. Colors come from --iw-c1/--iw-c2/--iw-c3 (fall
   back to a tasteful neutral set) so it inherits the site's palette. */
.iw-gradient-mesh{position:relative;isolation:isolate;overflow:hidden}
.iw-gradient-mesh::before{content:"";position:absolute;inset:-25%;z-index:-1;
  background:
    radial-gradient(40% 40% at 20% 25%,var(--iw-c1,#c7d2fe) 0,transparent 60%),
    radial-gradient(45% 45% at 80% 20%,var(--iw-c2,#fbcfe8) 0,transparent 60%),
    radial-gradient(45% 45% at 60% 85%,var(--iw-c3,#bfdbfe) 0,transparent 60%);
  filter:blur(40px);opacity:.55}
/* Cursor spotlight — JS sets --iw-x/--iw-y (px). Sits behind content. */
.iw-spotlight{position:relative;isolation:isolate}
.iw-spotlight::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
  background:radial-gradient(600px circle at var(--iw-x,50%) var(--iw-y,50%),var(--iw-spot,rgba(255,255,255,.14)) 0,transparent 45%);
  transition:background .2s}
.iw-marquee{overflow:hidden;-webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)}
.iw-marquee__track{display:flex;width:max-content;gap:var(--iw-marquee-gap,3rem)}
