"use client"; import { useEffect, useRef } from "react"; import { gsap } from "gsap"; const line1 = "La mayoría de agencias alquilan sus herramientas.".split(" "); const line2 = "Nosotros construimos la nuestra.".split(" "); function Words({ words, grad }: { words: string[]; grad?: boolean }) { return ( {words.map((w, i) => ( {w}{" "} ))} ); } export default function Hero() { const root = useRef(null); const mark = useRef(null); useEffect(() => { const el = root.current; if (!el) return; const ctx = gsap.context(() => { const tl = gsap.timeline({ defaults: { ease: "power4.out" } }); tl.from(".eyebrow", { y: 20, opacity: 0, duration: 0.8 }) .from( ".word-in", { yPercent: 115, duration: 1.05, stagger: 0.045 }, "-=0.4" ) .from(".hero-sub", { y: 24, opacity: 0, duration: 0.9 }, "-=0.7") .from(".hero-actions > *", { y: 20, opacity: 0, stagger: 0.12, duration: 0.7 }, "-=0.6") .from(".bar", { scaleX: 0, transformOrigin: "left", stagger: 0.08, duration: 0.7, ease: "power3.inOut" }, "-=1.1"); // floating pill-mark gsap.to(".bar", { y: "+=8", duration: 2.4, ease: "sine.inOut", repeat: -1, yoyo: true, stagger: { each: 0.15, from: "random" }, }); }, el); const onMove = (e: MouseEvent) => { const rx = (e.clientX / window.innerWidth - 0.5) * 2; const ry = (e.clientY / window.innerHeight - 0.5) * 2; gsap.to(mark.current, { x: rx * 22, y: ry * 22, duration: 0.8, ease: "power3" }); gsap.to(".blob", { x: rx * 30, y: ry * 30, duration: 1.2, ease: "power3" }); }; window.addEventListener("mousemove", onMove); return () => { window.removeEventListener("mousemove", onMove); ctx.revert(); }; }, []); return ( Agencia de marketing AI-native Estrategia humana + nuestra propia plataforma de IA. Web, SEO, ads y contenido — más rápido, más medible y a mejor coste que una agencia tradicional. Habla con nosotros Ver qué hacemos scroll ); }
Agencia de marketing AI-native
Estrategia humana + nuestra propia plataforma de IA. Web, SEO, ads y contenido — más rápido, más medible y a mejor coste que una agencia tradicional.