alt=''><\/div>

No se necesitan periféricos adicionales<\/strong><\/h2><\/div>
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>

Mejor calidad de imagen Led de su clase<\/strong><\/h2><\/div>
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>

Imagenes claramente refinadas<\/strong><\/h2><\/div>
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>

Instalación Sencilla<\/strong><\/h2><\/div>
<\/div>

Política de Garantía<\/h3>

SYSCOM se apega a las políticas de garantía de cada proveedor de la marca y/o fábrica.<\/p>

La cobertura de garantía por defecto de fábrica y/o mal funcionamiento es de 90 días con Syscom. Posterior a este periodo, la garantía es directa con el fabricante. En quebraduras, daños físicos de equipo y/o empaque dañado, reportarlo dentro de las 24 horas posteriores a la fecha de recepción para el reclamo a paquetería.<\/p><\/div>

Características principales<\/div>
  • Tamaño diagonal:<\/strong> 130'<\/li>
  • Pixel Pitch:<\/strong> 1.5mm<\/li>
  • Resolución:<\/strong> 2K (1920 x 1080)<\/li>
  • Relación de aspecto:<\/strong> 16:9<\/li>
  • Brillo:<\/strong> 500 nit Max<\/li>
  • Relación de contraste:<\/strong> 6,000:1<\/li>
  • Compatible con HDR:<\/strong> LED HDR / AI Picture<\/li>
  • Bocinas integradas:<\/strong> 2 CH 10 W<\/li>
  • Tiempo de vida del led:<\/strong> 100,000 horas<\/li><\/ul><\/div><\/div><\/div>
    Conectividad<\/div>
    • Entradas de Video:<\/strong> Display port 1.2 (1), HDMI 1.4 (3)<\/li>
    • Salida:<\/strong> Audio mini Jack Estereo / eARC<\/li>
    • Puerto:<\/strong> x2 USB 2.0<\/li>
    • Puerto LAN:<\/strong> RJ45 10/100 Mbps<\/li>
    • Puerto:<\/strong> RS232C (In)<\/li><\/ul><\/div><\/div>
      Funciones especiales<\/div>
      • Compatible con MagicINFO y Samsung VXT<\/li>
      • Temperature, Eco Sensor<\/li>
      • AI Picture, LED HDR, Dinamic Peaking<\/li>
      • DICOM Simulation Mode<\/li>
      • Sistema operativo Tizen 6.5<\/li><\/ul><\/div><\/div><\/div>
        Control externo<\/div>
        • Puerto RS-232C<\/li>
        • Puerto RJ45<\/li>
        • Control remoto incluido<\/li><\/ul><\/div><\/div>
          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(); }); })();