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";
const whatsappLink = (message = "Me interesa posicionar mi marca") =>
`https://wa.me/573153593552?text=${encodeURIComponent(message)}`;
const WHATSAPP_LINK = whatsappLink();
/* ======================================================================
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", ...rest }) {
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
{["Servicios", "Casos de Éxito", "Precios", "Recursos"].map((item) => (
{item}
))}
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) => (
setTab(t)}
className="relative px-5 py-2 text-sm font-medium rounded-full z-10"
>
{tab === t && (
)}
{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) => (
))}
);
}
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}
);
}
/* ======================================================================
CASOS DE ÉXITO — video gallery
====================================================================== */
const CASE_VIDEOS = [
{ src: "videos/tardea-dron.mp4", poster: "posters/tardea-dron.jpg" },
{ src: "videos/casao-montadito.mp4", poster: "posters/casao-montadito.jpg" },
{ src: "videos/anas-topara.mp4", poster: "posters/anas-topara.jpg" },
{ src: "videos/fastfoodbrasil-burger.mp4", poster: "posters/fastfoodbrasil-burger.jpg" },
{ src: "videos/bakers-tarta-manzana.mp4", poster: "posters/bakers-tarta-manzana.jpg" },
{ src: "videos/divebynature-gorgona.mp4", poster: "posters/divebynature-gorgona.jpg" },
{ src: "videos/casao-receta.mp4", poster: "posters/casao-receta.jpg" },
{ src: "videos/tardea-michael.mp4", poster: "posters/tardea-michael.jpg" },
{ src: "videos/burgerclub-philly.mp4", poster: "posters/burgerclub-philly.jpg" },
{ src: "videos/anas-giraldo.mp4", poster: "posters/anas-giraldo.jpg" },
{ src: "videos/osmo-nano.mp4", poster: "posters/osmo-nano.jpg" },
{ src: "videos/casao-recinto.mp4", poster: "posters/casao-recinto.jpg" },
{ src: "videos/tardea-foto-jero.mp4", poster: "posters/tardea-foto-jero.jpg" },
{ src: "videos/bakers-24-48-horas.mp4", poster: "posters/bakers-24-48-horas.jpg" },
{ src: "videos/anas-bustamante.mp4", poster: "posters/anas-bustamante.jpg" },
{ src: "videos/casa-paseo-bosque.mp4", poster: "posters/casa-paseo-bosque.jpg" },
{ src: "videos/tardea-pov-botella.mp4", poster: "posters/tardea-pov-botella.jpg" },
{ src: "videos/bakers-desayunos.mp4", poster: "posters/bakers-desayunos.jpg" },
];
const AUTOSCROLL_SPEED = 0.6;
function BeforeAfterSection() {
const videoRefs = useRef([]);
const scrollRef = useRef(null);
const hoveringRef = useRef(false);
const activeIndexRef = useRef(null);
const dirRef = useRef(1);
const [activeIndex, setActiveIndex] = useState(null);
useEffect(() => {
activeIndexRef.current = activeIndex;
}, [activeIndex]);
useEffect(() => {
const id = setInterval(() => {
const el = scrollRef.current;
if (!el || hoveringRef.current || activeIndexRef.current !== null) return;
const max = el.scrollWidth - el.clientWidth;
if (max <= 0) return;
let next = el.scrollLeft + AUTOSCROLL_SPEED * dirRef.current;
if (next >= max) {
next = max;
dirRef.current = -1;
} else if (next <= 0) {
next = 0;
dirRef.current = 1;
}
el.scrollLeft = next;
}, 30);
return () => clearInterval(id);
}, []);
function handleVideoPlay(index) {
videoRefs.current.forEach((el, i) => {
if (el && i !== index) el.pause();
});
setActiveIndex(index);
}
function handleVideoStop(index) {
setActiveIndex((current) => (current === index ? null : current));
}
function scrollByCards(dir) {
scrollRef.current?.scrollBy({ left: dir * 240, behavior: "smooth" });
}
return (
Casos de Éxito
De Invisible a Inolvidable.
Contenido real que ya estamos produciendo para negocios reales.
(hoveringRef.current = true)}
onMouseLeave={() => (hoveringRef.current = false)}
onTouchStart={() => (hoveringRef.current = true)}
onTouchEnd={() => (hoveringRef.current = false)}
>
scrollByCards(-1)}
className="hidden md:flex absolute left-4 top-1/2 -translate-y-1/2 z-20 w-10 h-10 rounded-full bg-white shadow-lg items-center justify-center text-ink/60 hover:text-ink"
>
←
scrollByCards(1)}
className="hidden md:flex absolute right-4 top-1/2 -translate-y-1/2 z-20 w-10 h-10 rounded-full bg-white shadow-lg items-center justify-center text-ink/60 hover:text-ink"
>
→
{CASE_VIDEOS.map((v, i) => (
handleVideoPlay(i)}
onVideoStop={() => handleVideoStop(i)}
videoRef={(el) => (videoRefs.current[i] = el)}
/>
))}
);
}
function VideoCard({ src, poster, isActive, dimmed, onVideoPlay, onVideoStop, videoRef }) {
const localRef = useRef(null);
const [playing, setPlaying] = useState(false);
function setRefs(el) {
localRef.current = el;
videoRef(el);
}
function handleClickPlay() {
localRef.current.play();
}
return (
{
setPlaying(true);
onVideoPlay();
}}
onPause={() => {
setPlaying(false);
onVideoStop();
}}
onEnded={() => {
setPlaying(false);
onVideoStop();
}}
className="absolute inset-0 w-full h-full object-cover"
/>
{!playing && (
▶
)}
);
}
/* ======================================================================
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}
))}
);
}
/* ======================================================================
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.
);
}
/* ======================================================================
APP
====================================================================== */
function App() {
useLenis();
const mouse = useMouse();
return (
<>
>
);
}
createRoot(document.getElementById("root")).render( );