import React, { useEffect, useRef, useState, useMemo, useId } from "react"; import { createRoot } from "react-dom/client"; import { motion, AnimatePresence, useMotionValue, useSpring, useTransform, useScroll, useInView, animate, } from "framer-motion"; import Lenis from "lenis"; /* ====================================================================== GLOBAL HOOKS ====================================================================== */ function useLenis() { useEffect(() => { const lenis = new Lenis({ lerp: 0.1, wheelMultiplier: 1, smoothWheel: true }); let rafId; function raf(time) { lenis.raf(time); rafId = requestAnimationFrame(raf); } rafId = requestAnimationFrame(raf); return () => { cancelAnimationFrame(rafId); lenis.destroy(); }; }, []); } function useMouse() { const x = useMotionValue(-200); const y = useMotionValue(-200); useEffect(() => { function handle(e) { x.set(e.clientX); y.set(e.clientY); } window.addEventListener("mousemove", handle); return () => window.removeEventListener("mousemove", handle); }, [x, y]); return { x, y }; } /* ====================================================================== CURSOR + PROGRESS + GRAIN ====================================================================== */ function CustomCursor({ mouse }) { const [hovering, setHovering] = useState(false); const dotX = useSpring(mouse.x, { damping: 40, stiffness: 900 }); const dotY = useSpring(mouse.y, { damping: 40, stiffness: 900 }); const ringX = useSpring(mouse.x, { damping: 30, stiffness: 200 }); const ringY = useSpring(mouse.y, { damping: 30, stiffness: 200 }); useEffect(() => { function over(e) { if (e.target.closest("[data-cursor]")) setHovering(true); } function out(e) { if (e.target.closest("[data-cursor]")) setHovering(false); } document.addEventListener("mouseover", over); document.addEventListener("mouseout", out); return () => { document.removeEventListener("mouseover", over); document.removeEventListener("mouseout", out); }; }, []); return ( <> ); } function ScrollProgressBar() { const { scrollYProgress } = useScroll(); return ( ); } /* ====================================================================== REUSABLE PRIMITIVES ====================================================================== */ const easeOut = [0.16, 1, 0.3, 1]; function Reveal({ children, className = "", delay = 0, y = 36, once = true }) { return ( {children} ); } function Stagger({ children, className = "", stagger = 0.08 }) { return ( {children} ); } function StaggerItem({ children, className = "" }) { return ( {children} ); } function CountUp({ to, prefix = "", suffix = "", decimals = 0 }) { const ref = useRef(null); const inView = useInView(ref, { once: true, amount: 0.6 }); const [val, setVal] = useState(0); useEffect(() => { if (!inView) return; const controls = animate(0, to, { duration: 1.6, ease: easeOut, onUpdate: (v) => setVal(v), }); return () => controls.stop(); }, [inView, to]); return ( {prefix} {val.toFixed(decimals)} {suffix} ); } function MagneticButton({ children, className = "", onClick, as = "button" }) { const ref = useRef(null); const x = useSpring(0, { stiffness: 200, damping: 15, mass: 0.4 }); const y = useSpring(0, { stiffness: 200, damping: 15, mass: 0.4 }); function handleMove(e) { const rect = ref.current.getBoundingClientRect(); const relX = e.clientX - (rect.left + rect.width / 2); const relY = e.clientY - (rect.top + rect.height / 2); x.set(relX * 0.3); y.set(relY * 0.3); } function handleLeave() { x.set(0); y.set(0); } const Comp = motion[as]; return ( {children} ); } function TiltCard({ children, className = "" }) { const ref = useRef(null); const rx = useSpring(0, { stiffness: 150, damping: 18 }); const ry = useSpring(0, { stiffness: 150, damping: 18 }); const scale = useSpring(1, { stiffness: 150, damping: 18 }); function handleMove(e) { const rect = ref.current.getBoundingClientRect(); const px = (e.clientX - rect.left) / rect.width - 0.5; const py = (e.clientY - rect.top) / rect.height - 0.5; ry.set(px * 14); rx.set(-py * 14); } function reset() { rx.set(0); ry.set(0); scale.set(1); } return ( scale.set(1.03)} onMouseLeave={reset} style={{ rotateX: rx, rotateY: ry, scale, transformPerspective: 900 }} > {children} ); } function Eyebrow({ children, dark = false }) { return (
{children}
); } /* ====================================================================== NAVBAR ====================================================================== */ function Navbar() { const [scrolled, setScrolled] = useState(false); useEffect(() => { function onScroll() { setScrolled(window.scrollY > 20); } window.addEventListener("scroll", onScroll); return () => window.removeEventListener("scroll", onScroll); }, []); return (
Infinity Pixel Empezar Gratis
); } function slugify(s) { return s .toLowerCase() .normalize("NFD") .replace(/[̀-ͯ]/g, "") .replace(/\s+/g, "-"); } function LogoMark({ size = 26, loop = false }) { const gid = useId(); return ( ); } /* ====================================================================== TICKER ====================================================================== */ const TICKER_ITEMS = [ { icon: "🥖", label: "Bakers Manizales", tag: "3.6K seguidores" }, { icon: "🏢", label: "Raíces Inmobiliaria", tag: "697 seguidores" }, { icon: "🌾", label: "Origen Caldas", tag: "2.3K seguidores" }, { icon: "💧", label: "PureWater", tag: "221 seguidores" }, { icon: "🍬", label: "Casa'o", tag: "3.6K seguidores" }, { icon: "📈", label: "El Darling Academy", tag: "4.9K seguidores" }, ]; function Ticker() { const items = [...TICKER_ITEMS, ...TICKER_ITEMS]; return (
{items.map((item, i) => (
{item.icon} {item.label} {item.tag}
))}
); } /* ====================================================================== HERO ====================================================================== */ function Hero({ mouse }) { const blob1x = useTransform(mouse.x, [0, window.innerWidth], [-40, 40]); const blob1y = useTransform(mouse.y, [0, window.innerHeight], [-30, 30]); const blob2x = useTransform(mouse.x, [0, window.innerWidth], [30, -30]); const blob2y = useTransform(mouse.y, [0, window.innerHeight], [20, -20]); const blob1xs = useSpring(blob1x, { damping: 25, stiffness: 60 }); const blob1ys = useSpring(blob1y, { damping: 25, stiffness: 60 }); const blob2xs = useSpring(blob2x, { damping: 25, stiffness: 60 }); const blob2ys = useSpring(blob2y, { damping: 25, stiffness: 60 }); const words = "Contenido que".split(" "); const words2 = "Posiciona tu Marca.".split(" "); return (
Agencia de Contenido para Redes Sociales

{words.map((w, i) => ( {w} ))} {words2.map((w, i) => ( {w} ))}

Estrategia, diseño y producción de contenido para que tu negocio local tenga la presencia que merece en redes sociales.

Solicita tu Auditoría Gratis → Ver casos de éxito
{["🍕", "💇‍♀️", "🦷", "👗"].map((e, i) => (
{e}
))}
Negocios de Manizales que ya confían en Infinity Pixel
); } /* ====================================================================== AGENTS SECTION (24/7 team + pipeline) ====================================================================== */ const AGENT_TABS = ["Vídeo", "Copy", "Diseño", "SEO"]; const AGENT_TAB_COPY = { Vídeo: "Guiones, edición y renderizado automático de reels y shorts listos para publicar.", Copy: "Anuncios, descripciones de producto y posts con el tono de tu marca.", Diseño: "Piezas gráficas, banners y branding coherente en cada publicación.", SEO: "Fichas de Google Business y contenido optimizado para aparecer en búsquedas locales.", }; function AgentsSection() { const [tab, setTab] = useState(AGENT_TABS[0]); const pipeline = usePipelineMock(); return (
Nuestro Equipo

Un Equipo Dedicado a
Posicionar tu Marca.

Especialistas en estrategia, producción y redes que trabajan tu contenido cada semana, sin pausas ni festivos.

{AGENT_TABS.map((t) => ( ))}
{AGENT_TAB_COPY[tab]}
Producción

Contenido Listo en Minutos, no en Semanas.

Nuestro equipo analiza tu negocio, produce piezas de alto impacto y las deja listas para publicar en cualquier canal, sin depender de agencias lentas ni de que tú tengas que aprender a hacerlo.

Ver planes {["Instagram", "TikTok", "Google", "WhatsApp"].map((b) => ( {b} ))}
{pipeline.map((row, i) => (

{row.label}

{row.sub}

))}
); } function usePipelineMock() { const stages = [ { label: "Brief del negocio", sub: "Datos y objetivos recogidos" }, { label: "Producción de contenido", sub: "Vídeo, copy y diseño" }, { label: "Publicación", sub: "Programado en tus redes" }, ]; const statuses = ["Completado", "En proceso", "En cola"]; const [offset, setOffset] = useState(0); useEffect(() => { const id = setInterval(() => setOffset((o) => (o + 1) % statuses.length), 2600); return () => clearInterval(id); }, []); return stages.map((s, i) => ({ ...s, status: statuses[(i + offset) % statuses.length] })); } function StatusPill({ status }) { const styles = { Completado: "bg-mint-400/15 text-mint-500", "En proceso": "bg-violet-100 text-violet-600", "En cola": "bg-black/5 text-ink/40", }; return ( {status} ); } /* ====================================================================== BEFORE / AFTER — CASOS DE ÉXITO (video mockups) ====================================================================== */ const CASE_STUDIES = { Cafetería: { emoji: "☕", before: { views: "42", likes: "3", comments: "0", caption: "video del café", age: "hace 9 meses" }, after: { views: "18.4K", likes: "892", comments: "64", caption: "El café que tu barrio llevaba esperando ☕", age: "hace 2 días", }, }, Peluquería: { emoji: "✂️", before: { views: "12", likes: "1", comments: "0", caption: "corte de pelo hoy", age: "hace 11 meses" }, after: { views: "24.1K", likes: "1240", comments: "98", caption: "Tu mejor versión empieza aquí ✂️", age: "hace 5 días", }, }, "Clínica Dental": { emoji: "🦷", before: { views: "8", likes: "0", comments: "0", caption: "clinica dental valencia", age: "hace 1 año" }, after: { views: "9800", likes: "410", comments: "31", caption: "Sonríe sin miedo 🦷✨", age: "hace 1 semana", }, }, "Tienda de Ropa": { emoji: "👗", before: { views: "31", likes: "2", comments: "0", caption: "ropa nueva tienda", age: "hace 7 meses" }, after: { views: "31200", likes: "2100", comments: "156", caption: "Nueva colección ya disponible 👗", age: "hace 3 días", }, }, }; function BeforeAfterSection() { const tabs = Object.keys(CASE_STUDIES); const [tab, setTab] = useState(tabs[0]); const data = CASE_STUDIES[tab]; return (
Casos de Éxito

De Invisible
a Inolvidable.

Mismo negocio, mismo local: así cambia un vídeo grabado a la carrera frente a uno producido por Infinity Pixel.

{tabs.map((t) => ( ))}
); } function ReelMockup({ label, emoji, data, tabKey, muted = false }) { return (
{!muted && ( )} {label}
❤️ {muted ? data.likes : }
💬 {data.comments}
{emoji} {muted ? "Sin editar" : "Nuevo"}

{data.caption}

{data.age} · {muted ? data.views : } vistas
); } /* ====================================================================== ROLES SECTION ====================================================================== */ const ROLES = [ { icon: "🍽️", title: "Restaurantes y Hostelería", copy: "Fotos y reels que dan hambre, gestión de reseñas y promos de temporada listas en minutos.", }, { icon: "🛍️", title: "Comercios y Retail", copy: "Fichas de producto, catálogos y campañas de temporada que convierten visitas en ventas.", }, { icon: "💼", title: "Servicios Profesionales", copy: "Contenido de autoridad para clínicas, peluquerías, gimnasios y despachos que genera confianza.", }, ]; function RolesSection() { return (
Roles

Soluciones para Cada Tipo de Negocio.

Ya vendas platos, cortes de pelo o consultas médicas, Infinity Pixel se adapta a tu forma de trabajar.

{ROLES.map((r) => (
{r.icon}

{r.title}

{r.copy}

))}
); } function ToolCTA() { const ref = useRef(null); const { scrollYProgress } = useScroll({ target: ref, offset: ["start end", "end start"] }); const linesX = useTransform(scrollYProgress, [0, 1], [-60, 60]); return (
Auditoría Gratuita

Descubre Cómo
Posicionar tu Marca.

Analizamos tu presencia actual y te mostramos, sin compromiso, el plan para hacerla crecer.

    {["Analizamos tu presencia actual", "Diseñamos tu estrategia de contenido", "Publicas en menos de 2 semanas"].map( (t) => (
  • {t}
  • ) )}
Solicita tu Auditoría →
{[...Array(6)].map((_, i) => (
))}
); } /* ====================================================================== PRICING ====================================================================== */ const PRICING = [ { name: "Plan Sencillo", price: "800.000", desc: "Para negocios que están dando sus primeros pasos en redes.", features: ["8 publicaciones al mes", "Diseño y redacción incluidos", "Atención directa con el equipo"], highlight: false, }, { name: "Plan Intermedio", price: "1.100.000", desc: "Para negocios que quieren mantener una presencia constante.", features: ["12 publicaciones al mes", "Diseño y redacción incluidos", "Atención directa con el equipo"], highlight: true, }, { name: "Plan Premium", price: "1.500.000", desc: "Para negocios que quieren maximizar su presencia en redes.", features: ["16 publicaciones al mes", "Diseño y redacción incluidos", "Atención directa con el equipo"], highlight: false, }, ]; function PricingSection() { return (
Precios

Planes para Cada Etapa de tu Negocio.

Sin permanencia. Cambia o cancela cuando quieras.

{PRICING.map((p) => (
{p.highlight && ( Más popular )}

{p.name}

{p.desc}

${p.price} COP/mes
    {p.features.map((f) => (
  • {f}
  • ))}
Elegir {p.name}
))}
); } /* ====================================================================== RESOURCES GRID ====================================================================== */ const RESOURCES = [ { title: "Casos de Éxito", copy: "Historias reales de negocios que despegaron con Infinity Pixel.", color: "bg-[#ffb3c7]" }, { title: "Academia", copy: "Cursos gratuitos sobre contenido, marca y redes sociales.", color: "bg-[#0b4fc4] text-white" }, { title: "Blog de Marketing", copy: "Ideas, tendencias y análisis para negocios locales.", color: "bg-[#5ee6f0]" }, { title: "Plantillas Gratis", copy: "Guiones, calendarios de contenido y ejemplos listos para usar.", color: "bg-[#ffb066]" }, ]; function ResourcesSection() { return (
Aprende

Recursos e Ideas para Vender Más.

{RESOURCES.map((r) => (

{r.title}

{r.copy}

Explorar
))}
); } /* ====================================================================== FINAL CTA ====================================================================== */ function FinalCTA() { const ref = useRef(null); const { scrollYProgress } = useScroll({ target: ref, offset: ["start end", "end start"] }); const orbScale = useTransform(scrollYProgress, [0, 0.5, 1], [0.8, 1.3, 0.8]); return (

Posiciona tu Marca.
Que te Vean, que te Recuerden.

Únete a los negocios de Manizales que ya construyeron una presencia de marca sólida en redes sociales.

Empezar Ahora
); } /* ====================================================================== FOOTER ====================================================================== */ function Footer() { const cols = [ { title: "Navegación", items: ["Inicio", "Servicios", "Casos de Éxito", "Precios"] }, { title: "Trabaja con Nosotros", items: ["Auditoría Gratuita", "Portfolio", "Únete al Equipo"] }, { title: "Recursos", items: ["Academia", "Blog", "Plantillas", "Ayuda"] }, ]; return (
Infinity Pixel

Agencia de contenido para redes sociales con sede en Manizales, Caldas.

{cols.map((c) => (

{c.title}

    {c.items.map((i) => (
  • {i}
  • ))}
))}
© 2026 Infinity Pixel. Todos los derechos reservados.

Infinity Pixel

); } /* ====================================================================== APP ====================================================================== */ function App() { useLenis(); const mouse = useMouse(); return ( <>