"use client"; import { useEffect, useRef, useState } from "react"; import { motion } from "framer-motion"; import CountUp from "react-countup"; /** * Shared visual-FX primitives for the premium service pages — floating * particles, mouse-tilt cards, an infinite tech belt, scroll-spy counters and * a browser/product mockup frame. Brand-strict (orange/gold on dark). Keep * positions deterministic so client+server markup match (no hydration drift). */ /* Fixed particle field — deterministic so SSR and client agree. */ const DOTS = [ { left: "8%", top: "24%", s: 6, d: 0, dur: 7 }, { left: "18%", top: "68%", s: 4, d: 1.2, dur: 8 }, { left: "32%", top: "16%", s: 5, d: 0.6, dur: 6.5 }, { left: "44%", top: "78%", s: 3, d: 1.8, dur: 9 }, { left: "58%", top: "30%", s: 7, d: 0.3, dur: 7.5 }, { left: "70%", top: "62%", s: 4, d: 1.5, dur: 8.5 }, { left: "82%", top: "22%", s: 5, d: 0.9, dur: 6.8 }, { left: "90%", top: "70%", s: 3, d: 2.1, dur: 9.5 }, { left: "26%", top: "44%", s: 4, d: 1.1, dur: 7.2 }, { left: "64%", top: "48%", s: 5, d: 0.4, dur: 8.1 }, ]; export function Particles({ className = "" }) { return ( ); } /* Slow-drifting aurora blobs — a living gradient backdrop for heroes. */ const BLOBS = [ { c: "primary", left: "6%", top: "10%", size: "34rem", dx: 50, dy: -28, dur: 19 }, { c: "accent", left: "60%", top: "2%", size: "30rem", dx: -58, dy: 40, dur: 23 }, { c: "primary", left: "42%", top: "52%", size: "32rem", dx: 32, dy: 30, dur: 27 }, ]; export function Aurora({ className = "" }) { return ( ); } /** Dot-field "wave" backdrop with soft top light beams (AI-agency hero look). */ export function WaveBackdrop({ className = "" }) { return (