/* ============================================================ PRODUCT ITEM VIEWS — HTML con Tailwind, sin CSS custom ============================================================ */ /* ── TIENDA ─────────────────────────────────────────────── */ function renderStoreProductCard(product, options = {}) { const { index = 0, activeIndex = -1, quantity = 1, onOpen = 'openStoreProduct', onQtyChange = 'changeStoreQty', onAdd = 'addToCart' } = options; const discount = product.badge ? calculateDiscount(product.price, product.sale) : 0; const outOfStock = Number(product.stock || 0) <= 0; const isActive = index === activeIndex; const articleCls = [ 'group flex flex-col bg-white rounded-2xl border overflow-hidden', 'transition-all duration-200 select-none', outOfStock ? 'opacity-60 cursor-not-allowed border-gray-200 grayscale' : 'cursor-pointer border-gray-200 hover:-translate-y-1 hover:shadow-xl hover:border-blue-300', isActive ? 'ring-2 ring-blue-500 border-blue-400' : '' ].join(' '); const badge = product.badge ? ` ${discount}% OFF ` : ''; const stockOverlay = outOfStock ? `
Sin stock
` : ''; const storePrice = (STATE.activePriceListId && typeof getPriceForList === 'function') ? getPriceForList(product, STATE.activePriceListId) : product.sale; const priceRegular = product.price !== storePrice ? `${fmt(product.price)}` : ''; const actions = outOfStock ? '' : `
`; return `
${badge} ${stockOverlay} ${escapeHtml(product.name)}

${escapeHtml(product.name)}

${escapeHtml(product.short || '')}

${priceRegular} ${fmt(storePrice)}
${actions}
`; } /* ── POS / FACTURACIÓN ──────────────────────────────────── */ function renderPosProductCard(product, options = {}) { const { index = 0, activeIndex = -1, onAdd = 'addToAdminCart' } = options; const outOfStock = Number(product.stock || 0) <= 0; const isActive = index === activeIndex; const lowStock = !outOfStock && product.stock <= 5; const articleCls = [ 'flex flex-col bg-white rounded-xl border overflow-hidden', 'transition-all duration-150', outOfStock ? 'opacity-50 cursor-not-allowed border-gray-200 grayscale' : 'cursor-pointer border-gray-200 hover:border-blue-400 hover:-translate-y-0.5 hover:shadow-md', isActive ? 'border-blue-500 ring-2 ring-blue-200' : '' ].join(' '); const stockTag = outOfStock ? `Sin stock` : lowStock ? `Últ. ${product.stock}` : ''; const displayPrice = STATE.activePriceListId && typeof getPriceForList === 'function' ? getPriceForList(product, STATE.activePriceListId) : (typeof applyPriceListFactor === 'function' ? applyPriceListFactor(product.sale) : product.sale); return `
${stockTag} ${escapeHtml(product.name)}

${escapeHtml(product.name)}

SKU: ${escapeHtml(product.sku || '—')}

Stock: ${product.stock}

${fmt(displayPrice)}

`; }