/* global React */ const { useEffect, useRef, useState } = React; // ============ Constantes de marca ============ const WA_PHONE = '573041170678'; const WA_BASE_MSG = 'Hola Lebike, quiero asesoría'; const WA_URL = `https://wa.me/${WA_PHONE}?text=${encodeURIComponent(WA_BASE_MSG)}`; const WA_URL_UNIFORM = `https://wa.me/${WA_PHONE}?text=${encodeURIComponent('Hola Lebike, quiero asesoría para mi uniforme')}`; // ============ Icon library (minimalist, single-stroke) ============ const I = { arrow: (p={}) => ( ), whatsapp: (p={}) => ( ), wind: (p={}) => ( ), aero: (p={}) => ( ), fabric: (p={}) => ( ), stitch: (p={}) => ( ), drop: (p={}) => ( ), road: (p={}) => ( ), body: (p={}) => ( ), shield: (p={}) => ( ), star: (p={}) => ( ), ig: (p={}) => ( ), fb: (p={}) => ( ), tt: (p={}) => ( ), ruler: (p={}) => (), bike: (p={}) => (), chat: (p={}) => (), }; // ============ Reveal hook ============ function useReveal() { const ref = useRef(null); useEffect(() => { const el = ref.current; if (!el) return; const io = new IntersectionObserver((es) => { es.forEach(e => { if (e.isIntersecting) { el.classList.add('in'); io.unobserve(el); } }); }, { threshold: 0.12 }); io.observe(el); return () => io.disconnect(); }, []); return ref; } // ============ NAV ============ function ThemeToggle() { const getInitial = () => { if (typeof document === 'undefined') return 'dark'; const stored = localStorage.getItem('lebike-theme'); if (stored === 'light' || stored === 'dark') return stored; return document.documentElement.getAttribute('data-theme') || 'dark'; }; const [theme, setTheme] = useState(getInitial); useEffect(() => { document.documentElement.setAttribute('data-theme', theme); try { localStorage.setItem('lebike-theme', theme); } catch (e) {} }, [theme]); const isLight = theme === 'light'; return ( ); } function Nav({ activeCategory }) { const [scrolled, setScrolled] = useState(false); const [menuOpen, setMenuOpen] = useState(false); useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 40); window.addEventListener('scroll', onScroll); return () => window.removeEventListener('scroll', onScroll); }, []); useEffect(() => { document.body.style.overflow = menuOpen ? 'hidden' : ''; return () => { document.body.style.overflow = ''; }; }, [menuOpen]); const navItems = [ { key: 'jerseys', label: 'Jerseys', href: '../jerseys/' }, { key: 'licras', label: 'Licras', href: '../licras/' }, { key: 'enterizos', label: 'Enterizos', href: '../enterizos/' }, ]; return ( <>
setMenuOpen(false)}>
e.stopPropagation()}> Colección {navItems.map(it => ( {it.label} ))} Soporte setMenuOpen(false)}> Asesoría setMenuOpen(false)}> Hablar por WhatsApp
); } // ============ HERO ============ function Hero({ heroImg, categoryLabel, seoH1, eyebrow, headline, sub, specs }) { const defaultHeadline = (<>Diseñado
para romper
tus límites.); const defaultSub = 'Uniformes de ciclismo premium creados para máxima comodidad, aerodinámica y rendimiento en cada kilómetro.'; const defaultSpecs = [ { num: '8 años', lab: 'En el mercado' }, { num: 'Ibagué', lab: 'Hecho en Colombia' }, { num: '5–8 días', lab: 'Envío a toda Colombia' }, ]; const heroSpecs = specs && specs.length ? specs : defaultSpecs; return (
{categoryLabel && ( )}
{eyebrow || '8 años · Hecho en Ibagué, Tolima · Envíos a toda Colombia'} Rendimiento que se siente, estilo que se nota
Asesoría 1:1 por WhatsApp Envío 5–8 días hábiles
{seoH1 &&

{seoH1}

}

{headline || defaultHeadline}

{sub || defaultSub}

Recibir asesoría personalizada ★★★★★ 8 años · Reseñas verificadas en Facebook
{heroSpecs.map((s, i) => (
{s.num}
{s.lab}
))}
); } // ============ MARQUEE ============ function Marquee() { const items = [ '8 años en el mercado','Hecho en Ibagué, Tolima','Envíos a toda Colombia', 'Asesoría 1:1 por WhatsApp','Diseños personalizados','Cambios hasta 15 días', 'Garantía 30 días','Atención humana','Pelotón Lebike', ]; const all = [...items, ...items]; return (
{all.map((t, i) => (
{t}
))}
); } // ============ BENEFITS ============ // 4 cards orientadas a las objeciones reales del comprador. // La ficha técnica detallada vive en la sección de producto. function Benefits() { const ref = useReveal(); const benefits = [ { icon: I.shield, title: '¿Aguantará rutas largas?', desc: 'Badana 3D de gel de densidad media pensada para rutas largas, costuras planas y banda de silicona que mantiene la prenda en su lugar kilómetro tras kilómetro.', }, { icon: I.fabric, title: '¿Calidad como las marcas grandes?', desc: 'Lycra italiana con compresión gradual en licras y tejido aerodinámico tipo Pro en enterizos. Telas con transporte de humedad y secado rápido, hechas en Colombia.', }, { icon: I.bike, title: '¿Llegará bien y a tiempo?', desc: 'Envíos a toda Colombia en 5–8 días hábiles. Pago por transferencia, Nequi, Daviplata o contraentrega — tú decides cómo.', }, { icon: I.chat, title: '¿Y si no me queda?', desc: 'Asesoría 1:1 por WhatsApp con Luis para acertar la talla. Cambios sin problema hasta 15 días y garantía de 30 días por calidad.', }, ]; return (
Por qué Lebike Hecho para ciclistas reales

Lo que importa
cuando compras
en línea.

Las dudas que todo ciclista tiene antes de pedir su uniforme — resueltas. Sin letra pequeña ni promesas vacías.

{benefits.map((b, i) => (
{String(i+1).padStart(2,'0')} / 04

{b.title}

{b.desc}

))}
); } // ============ PRODUCTS ============ function Product({ pid, name, tagline, features, specs, images, colorways, badge, reverse, primaryCTA, secondaryCTA, secondaryCTAUrl, price }) { const [activeIdx, setActiveIdx] = useState(0); const touchStartX = useRef(null); const imageCount = images.length; const imgIdx = Math.min(activeIdx, imageCount - 1); const goNext = () => setActiveIdx(() => (imgIdx + 1) % imageCount); const goPrev = () => setActiveIdx(() => (imgIdx - 1 + imageCount) % imageCount); const onTouchStart = (e) => { touchStartX.current = e.touches[0].clientX; }; const onTouchEnd = (e) => { if (touchStartX.current === null) return; const dx = e.changedTouches[0].clientX - touchStartX.current; if (Math.abs(dx) > 40) { if (dx < 0) goNext(); else goPrev(); } touchStartX.current = null; }; const ImgPanel = ({ alignRight }) => (
{badge}
{imageCount > 1 && ( <>
{images.map((_, i) => (
)}
Colorways {colorways.map((c, i) => ( setActiveIdx(i)} style={{ background: c.hex, cursor: 'pointer', outline: activeIdx === i ? '2px solid var(--accent)' : '2px solid transparent', outlineOffset: 3, transition: 'outline 0.2s', }} title={c.name} > ))}
Ref. {pid} · {colorways[activeIdx]?.name || colorways[0].name}
); return (
{!reverse && }

{name}

{tagline}

{specs.map((s, i) => (
{s.l} {s.v}
))}
Desde {price}
{primaryCTA} {secondaryCTA}
{reverse && }
); } function Products({ sectionNum, kicker, title, subtitle, products }) { const ref = useReveal(); return (
{sectionNum || 'Colección'} {kicker || 'Lebike · Hecho en Colombia'}

{title}

{subtitle}

{products.map((p, i) => ( ))}
); } // ============ ASESORÍA ============ function Asesoria() { const ref = useReveal(); return (
Asesoría Atención humana 1:1

No solo vendemos uniformes.
Te ayudamos a encontrar el tuyo.

CP
Luis Castellanos · Lebike Lun a sáb · respuesta rápida
Hola Lebike, mido 1.75 y peso 72kg. ¿Qué talla de licra me recomiendan? 9:42 AM
¡Hola! 👋 Talla M te queda perfecta. Tenemos 15 colores disponibles — ¿quieres negro clásico o algo más llamativo como verde olivo o vinotinto? 9:43 AM
Negro y verde olivo. ¿Cómo pago? 9:43 AM
Transferencia, Nequi, Daviplata o contraentrega. Te llega en 5–8 días hábiles a toda Colombia. ¿Te paso los datos? 9:44 AM

Cada ciclista tiene un cuerpo, un terreno y una meta diferentes. Por eso no usamos calculadoras de talla automáticas: hablamos contigo, entendemos tu ruta y te recomendamos el uniforme que de verdad va a funcionar.

{[ { n:'01', t:'Escríbenos por WhatsApp', d:'Cuéntanos tu medida, disciplina y qué buscas. Te enviamos el catálogo.', icon: I.chat }, { n:'02', t:'Recibe recomendación personalizada', d:'Talla, color y combinación ideal según tu cuerpo y tu ruta.', icon: I.ruler }, { n:'03', t:'Pago y envío a toda Colombia', d:'Transferencia, Nequi, Daviplata o contraentrega. Llega en 5–8 días hábiles.', icon: I.bike }, ].map(s => (
{s.n}
{s.t}
{s.d}
))}
Iniciar conversación Guía de tallas
); } // ============ SOCIAL PROOF ============ function SocialProof() { const ref = useReveal(); const carouselRef = useRef(null); const stars = (n=5) => Array.from({length:n}).map((_,i) => ); const scrollByCard = (dir) => { const el = carouselRef.current; if (!el) return; const card = el.firstElementChild; const step = card ? (card.offsetWidth + 24) : el.clientWidth * 0.8; el.scrollBy({ left: dir * step, behavior: 'smooth' }); }; return (
Comunidad Pelotón Lebike

Ciclistas reales.
Kilómetros reales.

8 años
En el mercado · Ibagué, Tolima
100%
Diseñado en Colombia
5–8 días
Envío a toda Colombia
30 días
Garantía por calidad
{[ { q: 'Recibí mi badana para la rodada de la travesía Bogotá–Villavicencio. Excelente, muy buena calidad. En serio que son los número uno, muchas gracias.', n: 'Sandra Pijaran', r: 'Reseña en Facebook · 12 abr 2026', a: 'SP', }, { q: 'Adquirí una y es de muy buena calidad. Yo vivo en Cali y estuve en Decathlon, son más costosas y nada que ver. Por eso me decidí por las de ustedes. Muy buena badana y muy cómoda.', n: 'Orlando Cardona', r: 'Reseña en Facebook · 29 abr 2026', a: 'OC', }, { q: 'Hoy recibí por primera vez mi pedido. Completamente de acuerdo con su slogan: "Te acompañaré en todas tus rodadas". Desde ahora fan #1 de Lebike. Excelente calidad de badanas, muy buen asesoramiento, seriedad y cumplimiento.', n: 'Angela Londoño', r: 'Reseña en Facebook · 11 abr 2026', a: 'AL', }, { q: 'Últimamente uso solo badanas Lebike porque me ofrecen recorridos cómodos. Las de 9 horas son súper cómodas y de buena calidad. Los invito a usarlas, son muy cumplidos con las entregas. Súper recomendados.', n: 'Mazamorro Jerico', r: 'Reseña en Facebook · 21 abr 2026', a: 'MJ', }, { q: 'Excelente producto, muy cumplidos con la entrega. Excelente calidad en la tela y el diseño espectacular. La atención y asesoría 100/100. Muchas gracias.', n: 'Luz Picon Castro', r: 'Reseña en Facebook · 17 abr 2026', a: 'LP', }, { q: 'Las recomiendo por su calidad y desempeño. Cumple con las especificaciones.', n: 'Lorena Martínez', r: 'Reseña en Facebook · 10 abr 2026', a: 'LM', }, { q: 'Compré una larga, muy buena calidad. Excelente para clima caliente.', n: 'José Beltrán', r: 'Reseña en Facebook · 26 mar 2026', a: 'JB', }, { q: 'Me acaba de llegar el pedido y de verdad que son todo lo que dicen. Las telas excelentes, muy suaves, no acaloran para nada. Excelente calidad. 👍', n: 'Manuel Alonso Algecira', r: 'Reseña en Facebook · 7 may 2026', a: 'MA', }, ].map((t, i) => (
{stars()}

"{t.q}"

{t.a}
{t.n} {t.r}
))}
Síguenos
Instagram @lebikecyclingclothes Facebook Lebike Cycling Design TikTok @lebikecycling ◇ 8 años en el mercado ⏣ Hecho en Ibagué, Tolima
); } // ============ FINAL CTA ============ function FinalCTA({ img }) { return (
Próxima ruta

Tu próxima
mejor ruta
comienza aquí.

Asesoría personalizada para encontrar el uniforme perfecto para ti. Hablamos por WhatsApp y te acompañamos hasta el primer kilómetro.

Comprar por WhatsApp Atención por WhatsApp lun a sáb · respuesta rápida.
Tu experiencia incluye
{[ { t: 'Asesoría 1:1 por WhatsApp', d: 'Talla, color y combinación ideal para tu cuerpo y tu ruta.', icon: I.chat }, { t: 'Envío a toda Colombia', d: '5–8 días hábiles. Pago: transferencia, Nequi, Daviplata o contraentrega.', icon: I.bike }, { t: 'Cambios y garantía', d: 'Cambios hasta 15 días · Garantía de 30 días por defecto de fabricación.', icon: I.shield }, ].map((it, i) => (
{it.t} {it.d}
))}
); } // ============ FOOTER ============ function Footer() { return ( ); } // ============ WhatsApp Float (desktop) ============ function WhatsAppFloat() { return ( Asesoría WhatsApp ); } // ============ Sticky CTA bar (mobile) ============ // Barra fija inferior solo visible en mobile/tablet. CTA único, alta conversión. function StickyMobileCTA() { return (
Pedir por WhatsApp
); } // ============ PERSONALIZACIÓN (solo enterizos) ============ function Personalizacion() { const ref = useReveal(); return (
Personalización Tu equipo, tu identidad

Diseñado
para tu equipo.

Personalizamos enterizos para clubes, equipos y academias. Tu logo, tu nombre, tu RH — listos para la línea de salida.

{[ { icon: I.shield, title: 'Logos de equipos y patrocinadores', desc: 'Sublimación de logos de clubes, academias y marcas patrocinantes en alta resolución.' }, { icon: I.body, title: 'Nombres y números', desc: 'Nombre del ciclista en el panel trasero o lateral. Tipografía a medida.' }, { icon: I.drop, title: 'Tipo de sangre (RH)', desc: 'RH visible en zona estratégica — un detalle que puede salvar vidas en ruta.' }, ].map((b, i) => (
{String(i+1).padStart(2,'0')} / 03

{b.title}

{b.desc}

))}
Cotizar para mi equipo Ver ejemplos
); } // ============ CAMBIOS Y GARANTÍA ============ function CambiosGarantia() { const ref = useReveal(); const cards = [ { icon: I.chat, tag: 'Cambios', plazo: '15 días', items: [ 'Producto sin uso, sin lavado, con etiquetas originales', 'Cambio por talla, color, referencia o bono saldo', 'Costos de envío asumidos por el cliente, salvo defecto', 'Productos en promoción no aplican (salvo garantía)', ], }, { icon: I.shield, tag: 'Garantía', plazo: '30 días', items: [ 'Cubre defectos de costuras, cierres, estampados y telas', 'No cubre mal uso, desgaste natural ni lavado inadecuado', 'Solicita por WhatsApp con fotos y número de pedido', 'Respuesta en 3–5 días hábiles', ], }, { icon: I.drop, tag: 'Cuidado', plazo: 'Para que dure', items: [ 'Lavar a mano o en ciclo suave', 'No usar blanqueador', 'No retorcer · secar a la sombra', 'No planchar estampados', ], }, ]; return (
Cambios y Garantía Tu compra, respaldada

Te acompañamos
antes y después.

Si algo no calza o falla por fabricación, lo resolvemos. Estos son los plazos y condiciones que aplican a todos los pedidos Lebike.

{cards.map((c, i) => (
{c.tag}

{c.plazo}

    {c.items.map((it, j) => (
  • {it}
  • ))}
))}

Para gestionar un cambio o garantía, escríbenos por WhatsApp con tu nombre completo, número de pedido y fotos de la novedad.

); } Object.assign(window, { Nav, Hero, Marquee, Benefits, Products, Asesoria, SocialProof, FinalCTA, Footer, WhatsAppFloat, StickyMobileCTA, Personalizacion, CambiosGarantia, I });