Category grief witchcraft

/** * WCFB Umami funnel stub — product_impression / product_click * * Env-gated via window.WCFB_UMAMI_CONFIG (set by PHP snippet or inline config). * Does NOT emit fake analytics when disabled or when umami is unavailable. */ (function () { 'use strict'; var cfg = window.WCFB_UMAMI_CONFIG || {}; var enabled = Boolean(cfg.enabled); var websiteId = cfg.websiteId || ''; function umamiReady() { return enabled && websiteId && typeof window.umami === 'function'; } function track(name, props) { if (!umamiReady()) { return; } try { window.umami(name, props || {}); } catch (e) { /* silent — analytics must never break the page */ } } function readAttrs(el) { return { product_id: el.getAttribute('data-product-id') || '', variant: el.getAttribute('data-variant') || 'A', surface: el.getAttribute('data-surface') || 'unknown', }; } function bindImpressions() { document.querySelectorAll('[data-event="product_impression"]').forEach(function (el) { if (el.dataset.umamiImpression) { return; } el.dataset.umamiImpression = '1'; track('product_impression', readAttrs(el)); }); } document.addEventListener('click', function (e) { var target = e.target.closest( '[data-event="product_click"], [data-event="add_to_cart"]' ); if (!target) { return; } track('product_click', readAttrs(target)); }, true); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', bindImpressions); } else { bindImpressions(); } })(); /** * WCFB Umami funnel stub — product_impression / product_click * * Env-gated via window.WCFB_UMAMI_CONFIG (set by PHP snippet or inline config). * Does NOT emit fake analytics when disabled or when umami is unavailable. */ (function () { 'use strict'; var cfg = window.WCFB_UMAMI_CONFIG || {}; var enabled = Boolean(cfg.enabled); var websiteId = cfg.websiteId || ''; function umamiReady() { return enabled && websiteId && typeof window.umami === 'function'; } function track(name, props) { if (!umamiReady()) { return; } try { window.umami(name, props || {}); } catch (e) { /* silent — analytics must never break the page */ } } function readAttrs(el) { return { product_id: el.getAttribute('data-product-id') || '', variant: el.getAttribute('data-variant') || 'A', surface: el.getAttribute('data-surface') || 'unknown', }; } function bindImpressions() { document.querySelectorAll('[data-event="product_impression"]').forEach(function (el) { if (el.dataset.umamiImpression) { return; } el.dataset.umamiImpression = '1'; track('product_impression', readAttrs(el)); }); } document.addEventListener('click', function (e) { var target = e.target.closest( '[data-event="product_click"], [data-event="add_to_cart"]' ); if (!target) { return; } track('product_click', readAttrs(target)); }, true); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', bindImpressions); } else { bindImpressions(); } })(); /** * WCFB Exit Intent Modal — loads exit_intent zone HTML once per session. */ (function () { 'use strict'; var SHOWN_KEY = 'wcfb_exit_intent_shown'; if (sessionStorage.getItem(SHOWN_KEY)) return; var apiBase = window.WCFB_CONVERSION_API || ''; if (!apiBase) return; function showModal(html) { if (!html || html.indexOf('wcfb-zone') === -1) return; sessionStorage.setItem(SHOWN_KEY, '1'); var overlay = document.createElement('div'); overlay.className = 'wcfb-exit-overlay'; overlay.innerHTML = ''; overlay.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,.65);z-index:99999;display:flex;align-items:center;justify-content:center;padding:1rem'; var modal = overlay.querySelector('.wcfb-exit-modal'); if (modal) { modal.style.cssText = 'max-width:520px;width:100%;background:#12121a;border-radius:12px;padding:1.5rem;position:relative'; } overlay.addEventListener('click', function (e) { if (e.target === overlay || e.target.classList.contains('wcfb-exit-close')) { overlay.remove(); } }); document.body.appendChild(overlay); } function fetchZone() { var url = apiBase.replace(/\/$/, '') + '/zones/exit_intent'; fetch(url, { credentials: 'omit' }) .then(function (r) { return r.text(); }) .then(showModal) .catch(function () {}); } var triggered = false; document.addEventListener('mouseout', function (e) { if (triggered) return; if (!e.relatedTarget && e.clientY <= 0) { triggered = true; fetchZone(); } }); })();
Featured on
Listed on DevTool.ioListed on SaaSHub
Featured on
Listed on DevTool.ioListed on SaaSHub