Envío GRATIS en todos los pedidos Jerseys 2026 Copa del Mundo Pago seguro con tarjeta Tallas niño desde la 20 +500 modelos disponibles Entrega en 2-10 días Envío GRATIS en todos los pedidos Jerseys 2026 Copa del Mundo Pago seguro con tarjeta Tallas niño desde la 20 +500 modelos disponibles Entrega en 2-10 días
Tienda Oficial · Temporada 2025/26

Las Camisetas Más Épicas Del Fútbol

Selecciones, clubes y ediciones retro. Calidad premium con envío gratis a toda la república.

★★★★★
4.9 / 5
+50,000 clientes satisfechos

Preventa Exclusiva

Accede antes que nadie a jerseys nuevos con 20% de descuento. Solo para miembros registrados.

⚽ SEYYPRO

Accede a preventa exclusiva, historial de compras y ofertas solo para miembros.

Al continuar aceptas nuestros términos y política de privacidad.

Explora por categoría

Nuestras Colecciones

Encuentra la jersey de tu equipo favorito

Selecciones 2026
18 equipos
Selecciones 2026
Explorar →
Liga MX
8 equipos
Liga MX
Explorar →
Premier League
7 equipos
Premier League
Explorar →
La Liga
3 equipos
La Liga
Explorar →
Retro
Ediciones clásicas
Retro
Explorar →
Niño
Tallas 20-28
Niño
Explorar →
Lo más nuevo

Novedades

Lo que dicen nuestros clientes

Reseñas Verificadas

Nuestra historia

Una marca construida con
estilo, orden y confianza

SEYYPRO nace de una pasión real por el fútbol y la convicción de que comprar un jersey debe ser tan memorable como usarlo.

01
Origen

Nacemos en México con una misión clara: traer jerseys auténticos de las selecciones más icónicas del mundo con una presentación premium y un proceso de compra honesto, rápido y sin sorpresas.

🇲🇽 Empresa Mexicana
⚽ 100% Fútbol
02
📈
Crecimiento

Cada pedido que sale de nuestras manos es una promesa cumplida. Crecemos gracias a la confianza de clientes que regresan y nos recomiendan — no por publicidad, sino por resultados reales.

+500
Clientes
98%
Satisfacción
32
Estados
03
🌎
Visión

Queremos ser la referencia número uno en jerseys de fútbol en México. Cada selección, cada era, cada leyenda — disponible con la presentación que merece, entregada directo a tu puerta.

✅ +30 Selecciones
🚀 Envío a todo México
🏆 Retros & Ediciones limitadas
04
🛡️
Garantía

Tu compra está protegida. Si el jersey no llega en perfectas condiciones o no es lo que esperabas, te damos solución inmediata — cambio, reenvío o reembolso. Sin peros.

Devoluciones sin complicaciones en 30 días
Pago 100% seguro — Stripe & protección al comprador
Atención personalizada vía WhatsApp
Calidad verificada en cada jersey antes de enviarlo
Museos

Francia & Brasil

Dos colecciones con identidad propia. Entra a cada museo y vuelve a la portada cuando quieras.

Úsalos como quieras

El Look SEYYPRO

Nuestras jerseys no son solo para la cancha — son para la calle, el estadio y la vida.

Look Portugal Local — SEYYPRO
⚽ Portugal Local 2026 · #7
Portugal Local 2026
Jersey Ronaldo #7 · Tela premium transpirable · Escudo bordado
📸

¡Tu foto aquí!
Mándanos tu look y aparece en nuestra galería

Enviar foto →
¿Eres el próximo?
Comparte tu look con SEYYPRO y te destacamos aquí
🏆

Más looks y modelos
próximamente

Próximamente
Estamos armando más contenido para ti
Únete al club

¡Ofertas Exclusivas!

Suscríbete y recibe descuentos, novedades y preventas antes que nadie.

¿Tienes dudas?

Preguntas Frecuentes

¿Cuánto tarda en llegar mi jersey?
Ofrecemos dos opciones: Envío Normal GRATIS de 5 a 10 días hábiles, o Envío Express de 1 a 3 días hábiles por solo $100 MXN extra. Elige tu opción durante el checkout.
¿Qué métodos de pago aceptan?
Aceptamos tarjetas de débito y crédito: Visa, Mastercard, American Express y más. Todos los pagos son procesados por Stripe con encriptación SSL de 256 bits — el mismo sistema que usa Amazon y Apple.
¿Tienen tallas para niños?
¡Sí! Manejamos tallas de niño desde la 20 hasta la 28, y tallas de adulto de la S a la XL. Selecciónala al agregar al carrito.
¿Puedo cambiar mi jersey si no me queda?
Sí, ofrecemos cambios sin costo en los primeros 30 días desde que recibes tu pedido. Contáctanos por WhatsApp y te guiamos en el proceso.
¿Cómo rasteo mi pedido?
Una vez que tu pedido sea enviado, recibirás por WhatsApp o correo el número de guía con la paquetería (Estafeta o FedEx) para rastrearlo en tiempo real.
¿Los jerseys son de buena calidad?
Todos nuestros jerseys son de alta calidad con tela transpirable de doble capa, costuras reforzadas y detalles bordados. Son réplicas premium ideales para usar diario o coleccionar.
Tu lista

Favoritos

Panel de control

Dashboard SEYYPRO

Gestiona tu tienda completa desde aquí

Cargando datos guardados…
⬆️ Importar JSON
0
📦 Total Pedidos
$0
💰 Ingresos Totales
0
👕 Productos
0
🔔 Notificaciones

Gestión de Productos

Filtrar:

Mensajes Pendientes

Notificaciones del Sistema

📷 Gestionar Fotos

Producto
🖼️
Arrastra tus fotos aquí
o haz clic para seleccionar desde tu dispositivo
JPG, PNG, WEBP · Máximo 5MB por foto
Fotos del producto

🛒 Tu Carrito

🛒

Tu carrito está vacío

Subtotal$0 MXN
✓ Envío gratis en este pedido
1
Envío
2
Pago
3
¡Listo!
SP
SEYYPRO Soporte
En línea ahora
¡Escríbenos! Respuesta inmediata
'); w.document.close(); setTimeout(()=>w.print(),400); } let currentUser = null; let captchaAnswer = ''; const CAPTCHA_CHARS = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; function generateCaptcha() { captchaAnswer = Array.from({length:5}, ()=> CAPTCHA_CHARS[Math.floor(Math.random()*CAPTCHA_CHARS.length)]).join(''); const canvas = document.getElementById('captchaCanvas'); if(!canvas) return; const ctx = canvas.getContext('2d'); const W = canvas.width, H = canvas.height; ctx.fillStyle = '#0f0f0f'; ctx.fillRect(0,0,W,H); for(let i=0;i<60;i++){ ctx.beginPath(); ctx.arc(Math.random()*W, Math.random()*H, Math.random()*1.5, 0, Math.PI*2); ctx.fillStyle = `rgba(201,168,76,${Math.random()*.18+.04})`; ctx.fill(); } for(let i=0;i<5;i++){ ctx.beginPath(); ctx.moveTo(Math.random()*W, Math.random()*H); ctx.bezierCurveTo(Math.random()*W,Math.random()*H,Math.random()*W,Math.random()*H,Math.random()*W,Math.random()*H); ctx.strokeStyle = `rgba(201,168,76,${Math.random()*.12+.06})`; ctx.lineWidth = Math.random()*1.2+.4; ctx.stroke(); } const colors = ['#C9A84C','#E8C96A','#9A7930','#F8F4EE','#C9A84C']; captchaAnswer.split('').forEach((ch, i) => { ctx.save(); const x = 18 + i * 32; const y = H/2 + 2; const angle = (Math.random() - 0.5) * 0.45; const size = 22 + Math.floor(Math.random()*6); ctx.translate(x, y); ctx.rotate(angle); ctx.font = `900 ${size}px 'Bebas Neue', Impact, sans-serif`; ctx.fillStyle = colors[i % colors.length]; ctx.shadowColor = 'rgba(0,0,0,.6)'; ctx.shadowBlur = 3; ctx.fillStyle = 'rgba(0,0,0,.4)'; ctx.fillText(ch, 2, 2); ctx.fillStyle = colors[i % colors.length]; ctx.fillText(ch, 0, 0); ctx.restore(); }); ctx.beginPath(); ctx.moveTo(0, H-1); ctx.lineTo(W, H-1); ctx.strokeStyle = 'rgba(201,168,76,.2)'; ctx.lineWidth = 1; ctx.stroke(); if(document.getElementById('captchaInput')) document.getElementById('captchaInput').value = ''; } function validateCaptcha() { const input = (document.getElementById('captchaInput')?.value||'').trim().toUpperCase(); return input === captchaAnswer; } function initCaptcha() { setTimeout(generateCaptcha, 80); } const EMAILJS_PUBLIC_KEY = 'TU_PUBLIC_KEY'; // Account → API Keys const EMAILJS_SERVICE_ID = 'TU_SERVICE_ID'; // Email Services → Service ID const EMAILJS_TEMPLATE_ID = 'TU_TEMPLATE_ID'; // Email Templates → Template ID (function(){ if(EMAILJS_PUBLIC_KEY !== 'TU_PUBLIC_KEY') { emailjs.init({ publicKey: EMAILJS_PUBLIC_KEY }); } })(); async function sendVerificationEmail(toEmail, toName, code) { if(EMAILJS_PUBLIC_KEY === 'TU_PUBLIC_KEY') { document.getElementById('codeHint').style.display = ''; document.getElementById('codeHintNum').textContent = code; return { ok: true, demo: true }; } document.getElementById('codeHint').style.display = 'none'; try { await emailjs.send(EMAILJS_SERVICE_ID, EMAILJS_TEMPLATE_ID, { to_email : toEmail, name : toName, code : code, email : toEmail, }); return { ok: true, demo: false }; } catch(err) { console.error('EmailJS error:', err); document.getElementById('codeHint').style.display = ''; document.getElementById('codeHintNum').textContent = code; return { ok: true, demo: true }; } } let pendingVerifyCode = null; let pendingUserData = null; let resendInterval = null; async function hashPassword(pass) { const buf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(pass)); return Array.from(new Uint8Array(buf)).map(b=>b.toString(16).padStart(2,'0')).join(''); } function getUsers() { try{ return JSON.parse(localStorage.getItem('seyypro_users')||'{}'); }catch(e){ return {}; } } function saveUsers(u){ localStorage.setItem('seyypro_users', JSON.stringify(u)); } function generateCode(){ return String(Math.floor(100000 + Math.random()*900000)); } function saveSession(user, remember) { const data = JSON.stringify(user); if(remember){ localStorage.setItem('seyypro_session', data); } else { sessionStorage.setItem('seyypro_session', data); } } function loadSession() { try { const ls = localStorage.getItem('seyypro_session'); const ss = sessionStorage.getItem('seyypro_session'); return ls ? JSON.parse(ls) : ss ? JSON.parse(ss) : null; } catch(e){ return null; } } function clearSession() { localStorage.removeItem('seyypro_session'); sessionStorage.removeItem('seyypro_session'); } function togglePassVis(id, btn) { const inp = document.getElementById(id); if(inp.type==='password'){ inp.type='text'; btn.textContent='🙈'; } else { inp.type='password'; btn.textContent='👁'; } } function checkPassStrength(pass) { let score = 0; if(pass.length >= 8) score++; if(/[A-Z]/.test(pass)) score++; if(/[0-9]/.test(pass)) score++; if(/[^A-Za-z0-9]/.test(pass)) score++; const colors = ['#e53935','#f97316','#eab308','#22c55e']; const labels = ['Muy débil','Débil','Buena','Fuerte']; for(let i=1;i<=4;i++){ const b = document.getElementById('pb'+i); if(b) b.style.background = i<=score ? colors[score-1] : 'var(--k4)'; } const lbl = document.getElementById('passStrengthLabel'); if(lbl) lbl.textContent = pass.length ? labels[score-1]||'' : ''; return score; } function openAuth(mode='login'){ authMode = mode; document.getElementById('authOverlay').classList.add('open'); switchAuth(mode); showStep(1); initCaptcha(); } function closeAuth(){ document.getElementById('authOverlay').classList.remove('open'); clearResendTimer(); } function handleAuthBg(e){ if(e.target===document.getElementById('authOverlay')) closeAuth(); } function showStep(n) { document.getElementById('authStep1').style.display = n===1 ? '' : 'none'; document.getElementById('authStep2').style.display = n===2 ? '' : 'none'; setAuthError(''); } function backToStep1(){ showStep(1); } function switchAuth(tab){ authMode = tab; const isReg = tab==='register'; document.getElementById('atLogin').classList.toggle('active', !isReg); document.getElementById('atRegister').classList.toggle('active', isReg); document.getElementById('authNameField').style.display = isReg ? '' : 'none'; document.getElementById('authPassConfirmWrap').style.display = isReg ? '' : 'none'; document.getElementById('passStrengthWrap').style.display = isReg ? '' : 'none'; document.getElementById('authCta').textContent = isReg ? 'Crear Cuenta' : 'Iniciar Sesión'; if(isReg){ document.getElementById('authPass').oninput = ()=>checkPassStrength(document.getElementById('authPass').value); } else { document.getElementById('authPass').oninput = null; } setAuthError(''); setTimeout(generateCaptcha, 50); } function setAuthError(msg) { const el = document.getElementById('authError'); el.textContent = msg; el.style.display = msg ? '' : 'none'; } async function submitAuth(){ const email = document.getElementById('authEmail').value.trim().toLowerCase(); const pass = document.getElementById('authPass').value; const remember = document.getElementById('rememberMe').checked; if(!email || !pass){ setAuthError('Por favor completa todos los campos.'); return; } if(!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)){ setAuthError('Ingresa un correo electrónico válido.'); return; } if(!validateCaptcha()){ setAuthError('Código de seguridad incorrecto. Intenta de nuevo.'); generateCaptcha(); return; } const btn = document.getElementById('authCta'); btn.disabled = true; btn.textContent = 'Procesando...'; const users = getUsers(); if(authMode === 'register'){ const name = document.getElementById('authName').value.trim(); const passConfirm = document.getElementById('authPassConfirm').value; if(!name){ setAuthError('Por favor ingresa tu nombre.'); btn.disabled=false; btn.textContent='Crear Cuenta'; return; } if(pass.length < 8){ setAuthError('La contraseña debe tener al menos 8 caracteres.'); btn.disabled=false; btn.textContent='Crear Cuenta'; return; } if(pass !== passConfirm){ setAuthError('Las contraseñas no coinciden.'); btn.disabled=false; btn.textContent='Crear Cuenta'; return; } if(checkPassStrength(pass) < 2){ setAuthError('Contraseña muy débil. Agrega números o mayúsculas.'); btn.disabled=false; btn.textContent='Crear Cuenta'; return; } if(users[email]){ setAuthError('Este correo ya está registrado. ¿Deseas iniciar sesión?'); btn.disabled=false; btn.textContent='Crear Cuenta'; return; } const hash = await hashPassword(pass); pendingUserData = { email, name, hash, remember, isNew: true }; const code = generateCode(); pendingVerifyCode = code; document.getElementById('authVerifyEmail').textContent = email; document.getElementById('codeHintNum').textContent = code; document.getElementById('codeHint').style.display = 'none'; showStep(2); startResendTimer(60); const sendResult = await sendVerificationEmail(email, name, code); if(!sendResult.demo) showToast('📧 Código enviado a ' + email); } else { const user = users[email]; if(!user){ setAuthError('No encontramos una cuenta con ese correo.'); btn.disabled=false; btn.textContent='Iniciar Sesión'; return; } const hash = await hashPassword(pass); if(hash !== user.hash){ setAuthError('Contraseña incorrecta. Verifica e intenta de nuevo.'); btn.disabled=false; btn.textContent='Iniciar Sesión'; return; } const sessionUser = { email, name: user.name }; saveSession(sessionUser, remember); currentUser = sessionUser; closeAuth(); updateAuthUI(); showToast('✅ ¡Bienvenido de vuelta, ' + user.name + '!'); } btn.disabled=false; btn.textContent = authMode==='register' ? 'Crear Cuenta' : 'Iniciar Sesión'; } function submitVerify(){ const code = document.getElementById('authVerifyCode').value.trim(); const errEl = document.getElementById('verifyError'); errEl.style.display = 'none'; if(!code){ errEl.textContent='Ingresa el código de verificación.'; errEl.style.display=''; return; } if(code !== pendingVerifyCode){ errEl.textContent='Código incorrecto. Verifica e intenta de nuevo.'; errEl.style.display=''; return; } const users = getUsers(); users[pendingUserData.email] = { name: pendingUserData.name, hash: pendingUserData.hash, createdAt: new Date().toISOString() }; saveUsers(users); const sessionUser = { email: pendingUserData.email, name: pendingUserData.name }; saveSession(sessionUser, pendingUserData.remember); currentUser = sessionUser; pendingVerifyCode = null; pendingUserData = null; clearResendTimer(); closeAuth(); updateAuthUI(); showToast('🎉 ¡Cuenta creada! Bienvenido a SEYYPRO, ' + currentUser.name + '.'); } async function resendCode(){ const code = generateCode(); pendingVerifyCode = code; document.getElementById('codeHintNum').textContent = code; document.getElementById('authVerifyCode').value = ''; document.getElementById('verifyError').style.display = 'none'; startResendTimer(60); await sendVerificationEmail(pendingUserData.email, pendingUserData.name, code); showToast('Código reenviado ✉️'); } function startResendTimer(seconds){ clearResendTimer(); document.getElementById('resendBtn').style.display = 'none'; const timerEl = document.getElementById('resendTimer'); timerEl.style.display = ''; let s = seconds; timerEl.textContent = `Reenviar en ${s}s`; resendInterval = setInterval(()=>{ s--; if(s<=0){ clearResendTimer(); document.getElementById('resendBtn').style.display=''; timerEl.style.display='none'; } else { timerEl.textContent = `Reenviar en ${s}s`; } },1000); } function clearResendTimer(){ if(resendInterval){ clearInterval(resendInterval); resendInterval=null; } } function logoutUser(){ currentUser = null; clearSession(); updateAuthUI(); showToast('Sesión cerrada correctamente.'); } function updateAuthUI(){ const li = !!currentUser; document.getElementById('pdOut').style.display = li ? 'none' : ''; document.getElementById('pdIn').style.display = li ? '' : 'none'; document.getElementById('profileBtn').classList.toggle('logged-in', li); if(li) document.getElementById('pdName').textContent = 'Hola, ' + currentUser.name; document.getElementById('pvLocked').style.display = li ? 'none' : ''; document.getElementById('pvContent').style.display = li ? '' : 'none'; } currentUser = loadSession(); if(currentUser) updateAuthUI(); function scrollToPreventa(){ document.getElementById('preventaSection').scrollIntoView({behavior:'smooth'}); } function toggleProfDropdown(){ document.getElementById('profDropdown').classList.toggle('open'); } function closeProfDropdown(){ document.getElementById('profDropdown').classList.remove('open'); } document.addEventListener('click', function(e){ const pw = document.querySelector('.profile-wrap'); if(pw && !pw.contains(e.target)) closeProfDropdown(); }); (function(){ const target = new Date(Date.now() + 3*864e5 + 14*36e5 + 27*6e4); function tick(){ const d = Math.max(0, target - Date.now()); const pad = n => String(n).padStart(2,'0'); const get = id => document.getElementById(id); if(get('pvD')){ get('pvD').textContent = pad(Math.floor(d/864e5)); get('pvH').textContent = pad(Math.floor(d%864e5/36e5)); get('pvM').textContent = pad(Math.floor(d%36e5/6e4)); get('pvS').textContent = pad(Math.floor(d%6e4/1e3)); } } tick(); setInterval(tick,1000); })(); const CHAT_FAQS = [ { q:'📦 ¿Cuánto tarda el envío?', a:'Envío estándar GRATIS: 5-10 días hábiles. Express ⚡ solo $100 MXN: 1-3 días. Incluimos número de rastreo por correo.' }, { q:'💳 ¿Qué métodos de pago hay?', a:'Aceptamos Visa, Mastercard y AmEx (débito y crédito). Pago 100% seguro con encriptación SSL 256-bit procesado por Stripe 🔒' }, { q:'👕 ¿Cómo elijo mi talla?', a:'Adulto: S, M, L, XL. Niño: 20, 22, 24, 26, 28. Si dudas entre dos tallas, te recomendamos pedir la más grande.' }, { q:'🔄 ¿Puedo hacer cambio?', a:'¡Sí! 30 días para cambio sin costo. Solo contáctanos por WhatsApp y coordinamos el envío de regreso sin problema.' }, { q:'⭐ ¿Cuál es la calidad?', a:'Jerseys premium con tela transpirable doble capa, costuras reforzadas y detalles bordados. Más de 50,000 clientes felices ★★★★★ 4.9/5' }, ]; const CHAT_RESPONSES = { 'hola': ['¡Hola! 👋 Bienvenido a SEYYPRO. ¿Estás buscando alguna jersey en especial?'], 'precio': ['Los precios van desde $600 MXN para jerseys en oferta, $860 para el catálogo completo y $960 para ediciones retro. ¡Todos con envío gratis!'], 'talla': ['Manejamos tallas adulto: S, M, L y XL. Niños: 20, 22, 24, 26 y 28. Si tienes dudas de tu talla, dime tu peso y estatura y te ayudo 😊'], 'envio': ['El envío normal es GRATIS y tarda 5-10 días hábiles. También tenemos Express por $100 MXN extra que llega en 1-3 días ⚡'], 'pago': ['Aceptamos Visa, Mastercard y AmEx, débito y crédito. Todo 100% seguro con encriptación SSL mediante Stripe 🔒'], 'cambio': ['¡Sí! Tienes 30 días para cambio sin costo. Escríbenos por WhatsApp y te guiamos en el proceso.'], 'calidad': ['Nuestros jerseys son de alta calidad: tela transpirable de doble capa, costuras reforzadas y detalles bordados. ¡Más de 50,000 clientes los adoramos! ⭐ 4.9/5'], 'default': [ '¡Gracias por escribirnos! 😊 Para atención inmediata también puedes escribirnos por WhatsApp al 5611346664.', '¡Con gusto te ayudamos! Para mayor rapidez contáctanos por WhatsApp: 5611346664 📱', ], }; let chatOpen = false; let chatQRShown = false; function toggleChat(){ chatOpen = !chatOpen; document.getElementById('chatWidget').classList.toggle('open', chatOpen); const badge = document.getElementById('chatFabBadge'); if(badge) badge.style.display = chatOpen ? 'none' : ''; if(chatOpen && !document.querySelector('.chat-msg')){ setTimeout(()=>{ addChatMsg('¡Hola! 👋 Soy el asistente de SEYYPRO. ¿En qué puedo ayudarte hoy?','bot'); setTimeout(showChatQR, 500); }, 600); } } function showChatQR(){ const wrap = document.getElementById('chatQRWrap'); wrap.innerHTML = CHAT_FAQS.map((f,i)=> `` ).join(''); } function handleChatQR(i){ document.getElementById('chatQRWrap').innerHTML = ''; addChatMsg(CHAT_FAQS[i].q.replace(/^[^\s]+\s/,''), 'user'); showTypingThenReply(CHAT_FAQS[i].a); } function sendChat(){ const inp = document.getElementById('chatInput'); const msg = inp.value.trim(); if(!msg) return; addChatMsg(msg, 'user'); inp.value = ''; document.getElementById('chatQRWrap').innerHTML = ''; const low = msg.toLowerCase(); let resp = CHAT_RESPONSES.default[Math.floor(Math.random()*CHAT_RESPONSES.default.length)]; for(const [k,v] of Object.entries(CHAT_RESPONSES)){ if(k!=='default' && low.includes(k)){ resp=v[0]; break; } } showTypingThenReply(resp); } function showTypingThenReply(text){ const typing = document.createElement('div'); typing.className = 'chat-typing'; typing.innerHTML = ''; document.getElementById('chatMsgs').appendChild(typing); document.getElementById('chatMsgs').scrollTop = 9999; setTimeout(()=>{ typing.remove(); addChatMsg(text,'bot'); setTimeout(showChatQR, 400); }, 1100); } function addChatMsg(text,type){ const div = document.createElement('div'); div.className = `chat-msg ${type}`; div.textContent = text; document.getElementById('chatMsgs').appendChild(div); document.getElementById('chatMsgs').scrollTop = 9999; } function subscribeNL(){ const v=document.getElementById('nlEmail').value; if(v&&v.includes('@')){alert('¡Gracias! 🎉 Ya eres parte del club SEYYPRO. Pronto recibirás nuestras mejores ofertas.');document.getElementById('nlEmail').value='';} else alert('Por favor ingresa un correo válido.'); } let photoProductIdx = null; let pendingPhotos = []; // { src: dataURL, name: string } function openPhotoModal(idx) { photoProductIdx = idx; const p = PRODUCTS[idx]; document.getElementById('photoModalProductName').textContent = p.name + ' · ' + p.team; pendingPhotos = (p.imgs || []).map(src => ({ src, name: '' })); renderPhotosGrid(); document.getElementById('photoModalOverlay').classList.add('open'); document.getElementById('dropZone').classList.remove('drag-over'); } function closePhotoModal() { document.getElementById('photoModalOverlay').classList.remove('open'); pendingPhotos = []; photoProductIdx = null; document.getElementById('photoFileInput').value = ''; } function handlePhotoModalBg(e) { if (e.target === document.getElementById('photoModalOverlay')) closePhotoModal(); } function renderPhotosGrid() { const grid = document.getElementById('photosGrid'); const empty = document.getElementById('photosEmptyMsg'); if (!pendingPhotos.length) { grid.innerHTML = ''; empty.style.display = 'block'; return; } empty.style.display = 'none'; grid.innerHTML = pendingPhotos.map((ph, i) => `
foto ${i+1} ${i === 0 ? 'Principal' : `#${i+1}`}
`).join(''); } function removePhoto(i) { pendingPhotos.splice(i, 1); renderPhotosGrid(); } function savePhotos() { if (photoProductIdx === null) return; PRODUCTS[photoProductIdx].imgs = pendingPhotos.map(ph => ph.src); closePhotoModal(); renderAdminProducts(); const t = document.createElement('div'); t.style.cssText = 'position:fixed;bottom:32px;left:50%;transform:translateX(-50%);background:var(--k3);border:1px solid var(--g);color:var(--w);padding:12px 24px;border-radius:30px;font-size:13px;z-index:9999;display:flex;align-items:center;gap:8px;box-shadow:0 8px 32px rgba(0,0,0,.4)'; t.innerHTML = ` Fotos guardadas correctamente`; document.body.appendChild(t); setTimeout(() => { t.style.opacity='0'; t.style.transition='opacity .3s'; setTimeout(() => t.remove(), 300); }, 2200); } function handleFileInput(input) { processFiles([...input.files]); input.value = ''; } function handleDragOver(e) { e.preventDefault(); document.getElementById('dropZone').classList.add('drag-over'); } function handleDragLeave(e) { if (!document.getElementById('dropZone').contains(e.relatedTarget)) document.getElementById('dropZone').classList.remove('drag-over'); } function handleDrop(e) { e.preventDefault(); document.getElementById('dropZone').classList.remove('drag-over'); const files = [...e.dataTransfer.files].filter(f => f.type.startsWith('image/')); if (files.length) processFiles(files); } function processFiles(files) { const MAX = 5 * 1024 * 1024; const valid = files.filter(f => f.size <= MAX); if (valid.length < files.length) { const t = document.createElement('div'); t.style.cssText = 'position:fixed;bottom:32px;left:50%;transform:translateX(-50%);background:var(--k3);border:1px solid var(--red);color:var(--w);padding:10px 22px;border-radius:30px;font-size:12px;z-index:9999'; t.textContent = '⚠️ Algunas fotos superan 5MB y no se cargaron'; document.body.appendChild(t); setTimeout(() => t.remove(), 2500); } if (!valid.length) return; const prog = document.getElementById('uploadProgress'); const bar = document.getElementById('uploadProgressBar'); prog.style.display = 'block'; bar.style.width = '0%'; let loaded = 0; valid.forEach(file => { const reader = new FileReader(); reader.onload = ev => { pendingPhotos.push({ src: ev.target.result, name: file.name }); loaded++; bar.style.width = Math.round(loaded / valid.length * 100) + '%'; if (loaded === valid.length) { setTimeout(() => { prog.style.display = 'none'; bar.style.width = '0%'; }, 500); renderPhotosGrid(); } }; reader.readAsDataURL(file); }); } let dragFromIdx = null; function photoDragStart(e, i) { dragFromIdx = i; e.dataTransfer.effectAllowed = 'move'; e.currentTarget.style.opacity = '.4'; } function photoDragOver(e, i) { e.preventDefault(); e.dataTransfer.dropEffect = 'move'; } function photoDragDrop(e, i) { e.preventDefault(); e.stopPropagation(); // don't bubble to drop zone if (dragFromIdx === null || dragFromIdx === i) return; const moved = pendingPhotos.splice(dragFromIdx, 1)[0]; pendingPhotos.splice(i, 0, moved); dragFromIdx = null; renderPhotosGrid(); } function photoDragEnd(e) { e.currentTarget.style.opacity = '1'; dragFromIdx = null; } function handleSearch(q) { const box = document.getElementById('searchSuggestions'); const val = q.trim().toLowerCase(); if (!val) { box.classList.remove('open'); box.innerHTML = ''; return; } const results = PRODUCTS.filter(p => p.name.toLowerCase().includes(val) || p.team.toLowerCase().includes(val) || (p.player && p.player.toLowerCase().includes(val)) || p.type.toLowerCase().includes(val) ).slice(0, 6); if (!results.length) { box.innerHTML = `
😕 Sin resultados para "${q}"
`; box.classList.add('open'); return; } box.innerHTML = `
Resultados
` + results.map(p => { const imgHtml = p.imgs && p.imgs[0] ? `${p.name}` : ''; const price = `$${p.price.toLocaleString('es-MX')}`; return `
${imgHtml || '👕'}
${p.name}
${p.team}
${price}
`; }).join(''); box.classList.add('open'); } function selectSearchResult(id) { closeSearch(); showDetail(id); } function handleSearchKey(e) { if (e.key === 'Escape') closeSearch(); if (e.key === 'Enter') { const first = document.querySelector('.search-suggestion-item'); if (first) first.click(); } } function closeSearch() { document.getElementById('searchSuggestions').classList.remove('open'); document.getElementById('searchInput').value = ''; } document.addEventListener('click', function(e) { const sw = document.getElementById('searchWrap'); if (sw && !sw.contains(e.target)) closeSearch(); }); const LS_KEY = 'seyypro_products_v1'; const LS_META = 'seyypro_meta_v1'; function saveToLocalStorage() { try { const payload = JSON.stringify(PRODUCTS); localStorage.setItem(LS_KEY, payload); const meta = { savedAt: new Date().toISOString(), count: PRODUCTS.length }; localStorage.setItem(LS_META, JSON.stringify(meta)); updateDataStatus('ok'); } catch(e) { updateDataStatus('full'); } } function loadFromLocalStorage() { try { const raw = localStorage.getItem(LS_KEY); if (!raw) { updateDataStatus('empty'); return false; } const saved = JSON.parse(raw); saved.forEach(sp => { const idx = PRODUCTS.findIndex(p => p.id === sp.id); if (idx > -1) { PRODUCTS[idx].imgs = sp.imgs || []; if (sp._edited) { PRODUCTS[idx].name = sp.name; PRODUCTS[idx].price = sp.price; PRODUCTS[idx].promo = sp.promo; PRODUCTS[idx].promoOrig = sp.promoOrig; PRODUCTS[idx].player = sp.player; PRODUCTS[idx].num = sp.num; PRODUCTS[idx].desc = sp.desc; PRODUCTS[idx].cat = sp.cat; PRODUCTS[idx].type = sp.type; } } else { PRODUCTS.push(sp); } }); updateDataStatus('ok'); return true; } catch(e) { updateDataStatus('error'); return false; } } function updateDataStatus(state) { const dot = document.getElementById('dataStatusDot'); const text = document.getElementById('dataStatusText'); const time = document.getElementById('dataStatusTime'); const wrap = document.getElementById('storageBarWrap'); if (!dot) return; if (state === 'ok') { dot.className = 'data-status-dot'; const meta = JSON.parse(localStorage.getItem(LS_META) || '{}'); const ts = meta.savedAt ? new Date(meta.savedAt) : null; text.textContent = `✓ Datos guardados · ${meta.count || PRODUCTS.length} productos`; time.textContent = ts ? 'Último guardado: ' + ts.toLocaleString('es-MX', {dateStyle:'short', timeStyle:'short'}) : ''; updateStorageBar(); wrap.style.display = 'flex'; } else if (state === 'empty') { dot.className = 'data-status-dot warning'; text.textContent = 'Sin datos guardados — los cambios se perderán al recargar'; time.textContent = ''; wrap.style.display = 'none'; } else if (state === 'full') { dot.className = 'data-status-dot error'; text.textContent = '⚠️ Almacenamiento lleno — usa Exportar JSON para no perder tus fotos'; time.textContent = ''; wrap.style.display = 'none'; showToast('⚠️ localStorage lleno. Exporta tus datos como JSON para guardarlos.', 'warn'); } else if (state === 'error') { dot.className = 'data-status-dot error'; text.textContent = 'Error al leer datos guardados'; time.textContent = ''; wrap.style.display = 'none'; } } function updateStorageBar() { try { const wrap = document.getElementById('storageBarWrap'); const fill = document.getElementById('storageBarFill'); const label = document.getElementById('storageBarLabel'); if (!fill) return; let total = 0; for (let k in localStorage) { if (localStorage.hasOwnProperty(k)) total += (localStorage[k].length * 2); } const usedMB = (total / 1024 / 1024).toFixed(1); const limitMB = 5; const pct = Math.min(100, (total / (limitMB * 1024 * 1024)) * 100); fill.style.width = pct + '%'; fill.className = 'storage-bar-fill' + (pct > 80 ? ' full' : pct > 60 ? ' warn' : ''); label.textContent = usedMB + ' / ' + limitMB + ' MB'; wrap.style.display = 'flex'; } catch(e) {} } function exportData() { try { const data = { version: 1, exportedAt: new Date().toISOString(), store: 'SEYYPRO', products: PRODUCTS }; const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'seyypro-productos-' + new Date().toISOString().slice(0,10) + '.json'; a.click(); URL.revokeObjectURL(url); showToast('✓ Archivo JSON descargado correctamente'); } catch(e) { showToast('❌ Error al exportar: ' + e.message, 'error'); } } function importData(input) { const file = input.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = ev => { try { const data = JSON.parse(ev.target.result); const imported = data.products || data; // support both formats if (!Array.isArray(imported)) throw new Error('Formato inválido'); if (!confirm(`¿Cargar ${imported.length} productos desde el archivo "${file.name}"?\n\nEsto reemplazará los productos que no existan en el archivo.`)) return; imported.forEach(sp => { const idx = PRODUCTS.findIndex(p => p.id === sp.id); if (idx > -1) { Object.assign(PRODUCTS[idx], sp); } else { PRODUCTS.push(sp); } }); saveToLocalStorage(); renderAdminProducts(); renderFeatured(); document.getElementById('stat-prods').textContent = PRODUCTS.length; showToast(`✓ ${imported.length} productos importados correctamente`); } catch(e) { showToast('❌ Error al importar: archivo inválido o dañado', 'error'); } input.value = ''; }; reader.readAsText(file); } function clearSavedData() { if (!confirm('¿Borrar todos los datos guardados en este navegador?\n\nLas fotos cargadas y cambios realizados se perderán. Los productos del catálogo original seguirán disponibles.')) return; localStorage.removeItem(LS_KEY); localStorage.removeItem(LS_META); updateDataStatus('empty'); showToast('🗑 Caché borrado. Recarga la página para restaurar datos originales.'); } function showToast(msg, type = 'ok') { const colors = { ok: 'var(--g)', warn: '#f59e0b', error: 'var(--red)' }; const t = document.createElement('div'); t.style.cssText = `position:fixed;bottom:32px;left:50%;transform:translateX(-50%);background:var(--k2);border:1px solid ${colors[type]};color:var(--w);padding:12px 24px;border-radius:30px;font-size:13px;z-index:9999;box-shadow:0 8px 32px rgba(0,0,0,.5);white-space:nowrap;transition:opacity .3s`; t.textContent = msg; document.body.appendChild(t); setTimeout(() => { t.style.opacity = '0'; setTimeout(() => t.remove(), 300); }, 3000); } const _origSaveAdmin = saveAdminProduct; window.saveAdminProduct = function() { const i = editingProductId; _origSaveAdmin(); if (i !== null && PRODUCTS[i]) PRODUCTS[i]._edited = true; saveToLocalStorage(); }; const _origSavePhotos = savePhotos; window.savePhotos = function() { _origSavePhotos(); saveToLocalStorage(); }; const _origDeleteProduct = deleteProduct; window.deleteProduct = function(i) { _origDeleteProduct(i); saveToLocalStorage(); }; function openPayModal() { document.getElementById('payModal').classList.add('open'); } function closePayModal() { document.getElementById('payModal').classList.remove('open'); } function openShipModal() { document.getElementById('shipModal').classList.add('open'); } function closeShipModal(){ document.getElementById('shipModal').classList.remove('open'); } function openSizeGuide() { document.getElementById('sizeGuideModal').classList.add('open'); } function closeSizeGuide(){ document.getElementById('sizeGuideModal').classList.remove('open'); } function switchSzGuideTab(tab, el) { document.querySelectorAll('.sz-guide-tab').forEach(t => t.classList.remove('active')); el.classList.add('active'); document.getElementById('sgAdulto').style.display = tab === 'adulto' ? '' : 'none'; document.getElementById('sgNino').style.display = tab === 'nino' ? '' : 'none'; } document.addEventListener('keydown', e => { if(e.key === 'Escape'){ closePayModal(); closeShipModal(); closeSizeGuide(); } }); loadFromLocalStorage(); updateCartUI(); (function(){ var featDone=false,revDone=false; var io=new IntersectionObserver(function(entries){ entries.forEach(function(e){ if(!e.isIntersecting) return; if(!featDone && e.target.id==='featuredGrid'){featDone=true;renderFeatured();} if(!revDone && e.target.id==='reviewTrack'){revDone=true;renderReviews();} io.unobserve(e.target); }); },{rootMargin:'300px'}); var fg=document.getElementById('featuredGrid'); var rt=document.getElementById('reviewTrack'); if(fg) io.observe(fg); else renderFeatured(); if(rt) io.observe(rt); else renderReviews(); })();

💳 Medios de Pago

Tarjetas de crédito — 3 meses sin intereses

Visa Crédito
Todas las tarjetas Visa participantes
3 MSI
Mastercard Crédito
Todas las tarjetas Mastercard participantes
3 MSI
American Express
Tarjetas AmEx crédito
3 MSI

Tarjetas de débito — Pago de contado

Visa Débito
BBVA, Banamex, Santander, Banorte y más
Sin cargo extra
Mastercard Débito
Todos los bancos participantes
Sin cargo extra

Otras opciones

📱
Transferencia / SPEI
Pago por transferencia bancaria
Sin cargo
📲
WhatsApp / Pago Manual
Coordina tu pago directo con nosotros
Flexible
🔒 Todos los pagos con tarjeta son procesados con encriptación SSL 256-bit mediante Stripe. Tu información nunca se almacena en nuestros servidores.

🚚 Opciones de Envío

Elige tu modalidad de envío

📦
Envío Estándar
Entrega en 5 a 10 días hábiles contados a partir de la confirmación del pago.
Disponible para toda la República Mexicana.
Cobertura con Estafeta, FedEx y DHL.
GRATIS
Envío Express
Entrega en 1 a 3 días hábiles.
Disponible para toda la República Mexicana.
Procesamos el mismo día si ordenas antes de las 12 PM.
🏙️
Mismo Día — Flex
Entrega el mismo día en CDMX y Estado de México.
Solo en códigos postales seleccionados.
Pedido antes de las 12:00 PM hora del centro.

Paqueterías disponibles

📮 Estafeta
✈️ FedEx
🚀 DHL
📍 Recibirás tu número de guía por WhatsApp una vez que tu pedido sea enviado, para que puedas rastrearlo en tiempo real. Los tiempos de entrega son estimados y pueden variar en temporadas de alta demanda.
📱 Consultar por WhatsApp

📏 Guía de Tallas

Medidas en centímetros (cm)

Talla Pecho Cintura Cadera Largo
S 88 – 92 74 – 78 90 – 94 68
M 96 – 100 82 – 86 98 – 102 71
L 104 – 108 90 – 94 106 – 110 74
XL 112 – 118 98 – 104 114 – 120 77
💡 Mide el contorno más amplio de tu pecho con los brazos relajados. Si quedas entre dos tallas, te recomendamos elegir la talla mayor para mayor comodidad en la cancha.

¿Cómo tomar tus medidas?

📐
Pecho
Rodea la cinta métrica por la parte más ancha del pecho, por debajo de los brazos.
📏
Cintura
Mide alrededor de la parte más estrecha del torso, generalmente sobre el ombligo.
📱 ¿Dudas? Escríbenos por WhatsApp