alt=''> <\/div>

Solución versátil, diferentes modos de uso<\/h3> r.json()).then(s => { window.__SETTINGS__ = s; renderCart(); }).catch(() => {}); function escapeHtml(t) { if (!t) return ''; const d = document.createElement('div'); d.textContent = t; return d.innerHTML; } function formatPrice(p) { const n = parseFloat(p); return isNaN(n) ? '0.00' : n.toLocaleString('es-MX', {minimumFractionDigits:2, maximumFractionDigits:2}); } function showToast(msg) { document.getElementById('toastMessage').textContent = msg; const t = document.getElementById('toast'); t.classList.add('active'); setTimeout(() => t.classList.remove('active'), 2500); } function renderCartCount() { const total = cart.reduce((s, i) => s + (i.qty || 1), 0); document.getElementById('cartCount').textContent = total; } function saveCart() { localStorage.setItem(CART_KEY, JSON.stringify(cart)); renderCartCount(); } function addToCart(product) { const priceUSD = product.precios?.precio_especial_usd || product.precios?.precio_especial || 0; const existing = cart.find(i => i.id === product.producto_id); if (existing) { existing.qty += 1; } else { cart.push({ id: product.producto_id, title: product.titulo || product.modelo, price: priceUSD, image: product.img_portada || '', categorias: product.categorias || '', oversized: !!product.oversized, qty: 1 }); } saveCart(); showToast('Producto agregado al carrito'); } // Cart drawer const cartBtn = document.getElementById('cartBtn'); const cartOverlay = document.getElementById('cartOverlay'); const cartDrawer = document.getElementById('cartDrawer'); const cartClose = document.getElementById('cartClose'); function openCart() { cartOverlay.style.opacity='1'; cartOverlay.style.visibility='visible'; cartDrawer.style.translate='0 0'; } function closeCart() { cartOverlay.style.opacity='0'; cartOverlay.style.visibility='hidden'; cartDrawer.style.translate='100% 0'; } cartBtn.addEventListener('click', openCart); cartClose.addEventListener('click', closeCart); cartOverlay.addEventListener('click', closeCart); function renderCart() { const body = document.getElementById('cartBody'); const footer = document.getElementById('cartFooter'); if (cart.length === 0) { body.innerHTML = '

Tu carrito está vacío

'; footer.style.display='none'; return; } const totalUSD = cart.reduce((s,i) => s + (i.price * i.qty), 0); const exchangeRate = parseFloat(window.__SETTINGS__?.exchange_rate || 17.5); const totalMXN = totalUSD * exchangeRate; const hasOversized = cart.some(item => item.oversized); const freeShippingThreshold = hasOversized ? 5000 : 1000; const shippingCost = totalMXN >= freeShippingThreshold ? 0 : (hasOversized ? 160 : 80); const finalMXN = totalMXN + shippingCost; document.getElementById('cartTotalUSD').textContent = '$' + formatPrice(totalUSD) + ' USD'; document.getElementById('cartSubtotalMXN').textContent = '≈ $' + formatPrice(totalMXN) + ' MXN'; document.getElementById('cartShipping').textContent = shippingCost > 0 ? '$' + formatPrice(shippingCost) + ' MXN' : 'Gratis'; document.getElementById('cartTotalMXN').textContent = '≈ $' + formatPrice(finalMXN) + ' MXN'; body.innerHTML = cart.map(i => `
${escapeHtml(i.title)}
$${formatPrice(i.price)} x${i.qty}
`).join(''); footer.style.display = 'block'; } window.removeFromCart = function(id) { cart = cart.filter(i => i.id !== id); saveCart(); renderCart(); }; async function loadProduct() { if (!productId && !window.__PRODUCT__) { showError(); return; } try { const p = window.__PRODUCT__ || await (await fetch(`${API_BASE}/products/${encodeURIComponent(productId)}`)).json(); if (!p || !p.producto_id) { showError(); return; } document.title = `${p.titulo} — Tienda Tecype`; document.getElementById('breadcrumbTitle').textContent = p.titulo; const priceUSD = p.precios?.precio_especial_usd || p.precios?.precio_especial || 0; const priceMXN = p.precios?.precio_especial_mxn || 0; const image = p.img_portada || 'https://via.placeholder.com/400x400?text=Sin+Imagen'; const inStock = p.total_existencia > 0; document.getElementById('productContent').innerHTML = `
${escapeHtml(p.titulo)}
${escapeHtml(p.marca)}

${escapeHtml(p.titulo)}

$${formatPrice(priceUSD)} USD
≈ $${formatPrice(priceMXN)} MXN
Modelo
${escapeHtml(p.modelo)}
Existencia
${p.total_existencia} unidades
Garantía
${escapeHtml(p.garantia || 'Consultar')}
Marca
${escapeHtml(p.marca)}
`; // Render description separately to avoid template literal issues with raw HTML if (p.descripcion) { document.getElementById('productDescription').innerHTML = '

Descripción

' + p.descripcion + '
'; } if (p.caracteristicas && p.caracteristicas.length > 0) { document.getElementById('productSpecs').innerHTML = '

Características

    ' + p.caracteristicas.map(c => '
  • ' + escapeHtml(c) + '
  • ').join('') + '
'; } const addBtn = document.getElementById('addToCartBtn'); if (addBtn && inStock) { addBtn.addEventListener('click', () => { addToCart(p); renderCart(); }); } // Image gallery thumbnails const images = (p.imagenes && p.imagenes.length > 1) ? p.imagenes : [image]; if (images.length > 1) { const strip = document.getElementById('thumbStrip'); strip.innerHTML = images.map((src, i) => ``).join(''); strip.addEventListener('click', (e) => { const img = e.target.closest('[data-idx]'); if (!img) return; document.getElementById('mainImage').src = images[img.dataset.idx]; strip.querySelectorAll('img').forEach(t => t.classList.replace('border-accent','border-glass-border')); img.classList.replace('border-glass-border','border-accent'); }); } } catch (e) { console.error(e); showError(); } } function showError() { document.getElementById('productContent').innerHTML = `

Producto no encontrado

Volver a la tienda
`; } // Init renderCartCount(); renderCart(); loadProduct(); document.getElementById('year').textContent = new Date().getFullYear(); // Mobile nav const navToggle = document.getElementById('navToggle'); const mobileNav = document.getElementById('mobileNav'); navToggle.addEventListener('click', () => { navToggle.classList.toggle('is-open'); mobileNav.classList.toggle('is-open'); }); // Header scroll window.addEventListener('scroll', () => { document.getElementById('siteHeader').classList.toggle('is-scrolled', window.scrollY > 40); }); // Escape key document.addEventListener('keydown', (e) => { if (e.key === 'Escape') closeCart(); }); })(); alt=''> <\/div>
<\/div>","caracteristicas":["Pantalla 24\" Full HD (1920x1080p)","Sistema operativo Windows IoT integrado","Tecnología táctil con capa antibacterial","Conectividad WiFi y 3 puertos USB","Compatibilidad con periféricos mediante dockable","Diseño VESA 200x200 compatible con montaje"],"imagenes":["https://ftp3.syscom.mx/usuarios/fotos/BancoFotografiasSyscom/SAMSUNGELECTRONICS/KM24C/KM24C-p.PNG","https://ftp3.syscom.mx/usuarios/fotos/BancoFotografiasSyscom/SAMSUNGELECTRONICS/KM24C/KM24C-AD-1-p.PNG","https://ftp3.syscom.mx/usuarios/fotos/BancoFotografiasSyscom/SAMSUNGELECTRONICS/KM24C/KM24C-AD-2-p.PNG","https://ftp3.syscom.mx/usuarios/fotos/BancoFotografiasSyscom/SAMSUNGELECTRONICS/KM24C/KM24C-AD-3-p.PNG","https://ftp3.syscom.mx/usuarios/fotos/BancoFotografiasSyscom/SAMSUNGELECTRONICS/KM24C/KM24C-AD-4-p.PNG"],"oversized":false};

Cargando producto...

Producto agregado