(function(){ const SHOW_BEFORE_FADE_MS = 750; const onCartPage = location.pathname.replace(/\/+$/,'') === '/cart'; // -------- utils -------- const debounce = (fn, ms=120) => { let t; return (...a)=>{ clearTimeout(t); t=setTimeout(()=>fn(...a),ms); }; }; const decode = (s) => s ? s.replace(/"/g,'"').replace(/&/g,'&') : ''; // -------- read SKUs from minicart dropdown (non-cart pages) -------- function getSkusFromMini(){ const out = []; document.querySelectorAll('.cart-dropdown table.minicart tr.item').forEach(row=>{ const raw = row.getAttribute('data-itemobj'); if (!raw) return; try { const obj = JSON.parse(decode(raw)); if (obj.item_sku) out.push(String(obj.item_sku).trim().toUpperCase()); } catch(e){} }); return out; } // -------- read SKUs from the full cart table (cart page) -------- function getSkusFromCartPage(){ const out = []; // Typical SKU spot on the cart page (from your snippet) document.querySelectorAll('tr.item .item_sku, tr.item .item-sku-value, tr.item [data-sku]').forEach(el=>{ const sku = (el.dataset.sku || el.textContent || '').trim(); if (sku) out.push(sku.toUpperCase()); }); // If rows also carry an encoded data-itemobj, parse that too document.querySelectorAll('tr.item[data-itemobj]').forEach(row=>{ const raw = row.getAttribute('data-itemobj'); try { const obj = JSON.parse(decode(raw)); if (obj.item_sku) out.push(String(obj.item_sku).trim().toUpperCase()); } catch(e){} }); return out; } function getCartSkus(){ const a = getSkusFromMini(); const b = onCartPage ? getSkusFromCartPage() : []; return [...new Set([...a, ...b])]; } function fadeAndHide(banner){ banner.classList.add('fading'); setTimeout(()=>{ banner.classList.remove('visible','fading'); banner.style.display = 'none'; }, 800); } const update = debounce(function updatePromoBanners(){ const cartSkus = getCartSkus(); document.querySelectorAll('.promo-banner[data-promo-sku]').forEach(banner=>{ const sku = (banner.dataset.promoSku || '').trim().toUpperCase(); if (!sku) return; if (cartSkus.includes(sku)) { if (sessionStorage.getItem('justAdded-' + sku) === 'true') { // Just added → show briefly then fade (works on /cart too) banner.style.display = 'flex'; banner.classList.add('visible'); setTimeout(()=>{ sessionStorage.removeItem('justAdded-' + sku); fadeAndHide(banner); }, SHOW_BEFORE_FADE_MS); } else { // Already in cart → hide immediately banner.classList.remove('visible','fading'); banner.style.display = 'none'; } } else { // Not in cart → show banner.style.display = 'flex'; banner.classList.add('visible'); } }); }); // Track add-to-cart clicks so we can fade after it lands in cart document.querySelectorAll('.paratus-add-to-cart-btn').forEach(btn=>{ btn.addEventListener('click', ()=>{ const sku = (btn.dataset.itemSku || '').trim().toUpperCase(); if (sku) sessionStorage.setItem('justAdded-' + sku, 'true'); }); }); // Initial run document.addEventListener('DOMContentLoaded', update); // Observe changes: if (onCartPage) { // Watch the main cart area since minicart dropdown is disabled here const cartRoot = document.querySelector('table.cart, .cart_view, #cart, .cart-items, .cart_content, #cart_content') || document.body; new MutationObserver(update).observe(cartRoot, { childList: true, subtree: true }); } else { // Off the cart page, watch minicart area so updates are caught const miniRoot = document.querySelector('.minicart_container') || document.body; new MutationObserver(update).observe(miniRoot, { childList: true, subtree: true }); } })();