{
  "version": 3,
  "sources": ["/cdn/shop/t/146/assets/klaviyo-events.js"],
  "sourcesContent": ["/**\n * klaviyo-events.js -- Klaviyo client-side commerce event tracking.\n *\n * Owned by Epic 10 ticket #58 (EP-DEP-07).\n *\n * Why this exists: the headless storefront tracked \"Added to Cart\" to Klaviyo\n * by routing a `provider: 'KLAVIYO'` payload through InstantJS\n * (`window.InstantJS.track('ITEM_ADDED_TO_CART', [klaviyoEvent, ...])`, see\n * headless `components/ProductCard/.../useSizeClick.tsx` and\n * `templates/ProductTemplate/components/Form/index.tsx`). InstantJS is not part\n * of the Shopify theme, so that delivery path was lost in the migration and no\n * ATC event ever reached Klaviyo. This module restores the event by pushing it\n * directly onto Klaviyo's onsite queue.\n *\n * Note: Klaviyo's native Shopify integration only tracks server-side events\n * (Placed Order, Started Checkout, Ordered Product, ...) via webhooks. There is\n * no Shopify webhook for \"Added to Cart\" -- it is inherently client-side and\n * must be instrumented in the theme. The onsite script + `_learnq` queue this\n * module pushes to are loaded by `snippets/klaviyo-embed.liquid`, which also\n * defer-loads this file (only when Klaviyo is enabled for the active market).\n *\n * Exposes `window.RTLKlaviyo.trackAddedToCart(addResponse)`, called from every\n * add-to-cart success path (PDP form, card quick-add, cart-drawer upsell, and\n * the cart-drawer global form interception). Accepts the raw `/cart/add.js`\n * response in any shape it returns (a single line-item object from a\n * form-encoded POST, a `{ items: [...] }` object from a JSON POST, or an\n * array) and fires one \"Added to Cart\" event per added line, enriched with\n * whole-cart context (total value + item names) read from `/cart.js`.\n *\n * No framework. Vanilla JS, no dependencies, defer-loaded.\n */\n(function () {\n  'use strict';\n\n  // Klaviyo's onsite queue. `_learnq` is initialised synchronously by\n  // klaviyo-embed.liquid and drains once klaviyo.js finishes loading, so it is\n  // always safe to push to. Prefer the modern `klaviyo` object when present.\n  function queue() {\n    if (window.klaviyo && typeof window.klaviyo.push === 'function') {\n      return window.klaviyo;\n    }\n    if (window._learnq && typeof window._learnq.push === 'function') {\n      return window._learnq;\n    }\n    return null;\n  }\n\n  // Normalise every /cart/add.js response shape into an array of line items.\n  function toItems(response) {\n    if (!response) return [];\n    if (Array.isArray(response)) return response;\n    if (Array.isArray(response.items)) return response.items;\n    if (response.id || response.variant_id || response.product_id) {\n      return [response];\n    }\n    return [];\n  }\n\n  // Shopify prices are integer cents; Klaviyo expects a numeric dollar value.\n  function money(cents) {\n    var n = Number(cents);\n    if (isNaN(n)) return 0;\n    return Math.round(n) / 100;\n  }\n\n  function absoluteUrl(path) {\n    if (!path) return '';\n    if (/^https?:\\/\\//.test(path)) return path;\n    return window.location.origin + path;\n  }\n\n  function buildItemProps(item) {\n    return {\n      ProductID: item.product_id,\n      SKU: item.sku || '',\n      ProductName: item.product_title || item.title || '',\n      VariantName: item.variant_title || '',\n      Quantity: item.quantity || 1,\n      ItemPrice: money(item.price),\n      RowTotal: money(item.line_price || item.final_line_price || item.price),\n      ProductURL: absoluteUrl(item.url),\n      ImageURL: item.image ? absoluteUrl(item.image) : '',\n      ProductCategories: item.product_type ? [item.product_type] : []\n    };\n  }\n\n  function trackAddedToCart(addResponse) {\n    var q = queue();\n    if (!q) return; // Klaviyo not enabled / not loaded -- nothing to do.\n\n    var added = toItems(addResponse);\n    if (!added.length) return;\n\n    // Enrich with whole-cart context. Klaviyo's canonical \"Added to Cart\"\n    // schema carries the running cart total and the full item list. Non-\n    // blocking: if /cart.js fails, fall back to item-only data so the event\n    // still fires.\n    fetch('/cart.js', { headers: { Accept: 'application/json' } })\n      .then(function (r) { return r.ok ? r.json() : null; })\n      .catch(function () { return null; })\n      .then(function (cart) {\n        var cartValue = cart ? money(cart.total_price) : null;\n        var cartItems = cart && Array.isArray(cart.items) ? cart.items : [];\n        var itemNames = cartItems.map(function (i) {\n          return i.product_title || i.title || '';\n        });\n        var itemsDetailed = cartItems.map(buildItemProps);\n\n        added.forEach(function (item) {\n          var itemProps = buildItemProps(item);\n          var props = {\n            $value: cartValue != null ? cartValue : itemProps.RowTotal,\n            AddedItemProductName: itemProps.ProductName,\n            AddedItemProductID: itemProps.ProductID,\n            AddedItemSKU: itemProps.SKU,\n            AddedItemCategories: itemProps.ProductCategories,\n            AddedItemImageURL: itemProps.ImageURL,\n            AddedItemURL: itemProps.ProductURL,\n            AddedItemPrice: itemProps.ItemPrice,\n            AddedItemQuantity: itemProps.Quantity,\n            ItemNames: itemNames.length ? itemNames : [itemProps.ProductName],\n            CheckoutURL: absoluteUrl('/checkout'),\n            Items: itemsDetailed.length ? itemsDetailed : [itemProps]\n          };\n          try {\n            q.push(['track', 'Added to Cart', props]);\n          } catch (err) {\n            if (window.console && console.warn) {\n              console.warn('[klaviyo-events] Added to Cart track failed', err);\n            }\n          }\n        });\n      });\n  }\n\n  window.RTLKlaviyo = window.RTLKlaviyo || {};\n  window.RTLKlaviyo.trackAddedToCart = trackAddedToCart;\n})();\n"],
  "mappings": "CA+BC,UAAY,CACX,aAKA,SAAS,OAAQ,CACf,OAAI,OAAO,SAAW,OAAO,OAAO,QAAQ,MAAS,WAC5C,OAAO,QAEZ,OAAO,SAAW,OAAO,OAAO,QAAQ,MAAS,WAC5C,OAAO,QAET,IACT,CAGA,SAAS,QAAQ,SAAU,CACzB,OAAK,SACD,MAAM,QAAQ,QAAQ,EAAU,SAChC,MAAM,QAAQ,SAAS,KAAK,EAAU,SAAS,MAC/C,SAAS,IAAM,SAAS,YAAc,SAAS,WAC1C,CAAC,QAAQ,EAEX,CAAC,EANc,CAAC,CAOzB,CAGA,SAAS,MAAM,MAAO,CACpB,IAAI,EAAI,OAAO,KAAK,EACpB,OAAI,MAAM,CAAC,EAAU,EACd,KAAK,MAAM,CAAC,EAAI,GACzB,CAEA,SAAS,YAAY,KAAM,CACzB,OAAK,KACD,eAAe,KAAK,IAAI,EAAU,KAC/B,OAAO,SAAS,OAAS,KAFd,EAGpB,CAEA,SAAS,eAAe,KAAM,CAC5B,MAAO,CACL,UAAW,KAAK,WAChB,IAAK,KAAK,KAAO,GACjB,YAAa,KAAK,eAAiB,KAAK,OAAS,GACjD,YAAa,KAAK,eAAiB,GACnC,SAAU,KAAK,UAAY,EAC3B,UAAW,MAAM,KAAK,KAAK,EAC3B,SAAU,MAAM,KAAK,YAAc,KAAK,kBAAoB,KAAK,KAAK,EACtE,WAAY,YAAY,KAAK,GAAG,EAChC,SAAU,KAAK,MAAQ,YAAY,KAAK,KAAK,EAAI,GACjD,kBAAmB,KAAK,aAAe,CAAC,KAAK,YAAY,EAAI,CAAC,CAChE,CACF,CAEA,SAAS,iBAAiB,YAAa,CACrC,IAAI,EAAI,MAAM,EACd,GAAK,EAEL,KAAI,MAAQ,QAAQ,WAAW,EAC1B,MAAM,QAMX,MAAM,WAAY,CAAE,QAAS,CAAE,OAAQ,kBAAmB,CAAE,CAAC,EAC1D,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,GAAK,EAAE,KAAK,EAAI,IAAM,CAAC,EACpD,MAAM,UAAY,CAAE,OAAO,IAAM,CAAC,EAClC,KAAK,SAAU,KAAM,CACpB,IAAI,UAAY,KAAO,MAAM,KAAK,WAAW,EAAI,KAC7C,UAAY,MAAQ,MAAM,QAAQ,KAAK,KAAK,EAAI,KAAK,MAAQ,CAAC,EAC9D,UAAY,UAAU,IAAI,SAAU,EAAG,CACzC,OAAO,EAAE,eAAiB,EAAE,OAAS,EACvC,CAAC,EACG,cAAgB,UAAU,IAAI,cAAc,EAEhD,MAAM,QAAQ,SAAU,KAAM,CAC5B,IAAI,UAAY,eAAe,IAAI,EAC/B,MAAQ,CACV,OAAQ,WAAa,KAAO,UAAY,UAAU,SAClD,qBAAsB,UAAU,YAChC,mBAAoB,UAAU,UAC9B,aAAc,UAAU,IACxB,oBAAqB,UAAU,kBAC/B,kBAAmB,UAAU,SAC7B,aAAc,UAAU,WACxB,eAAgB,UAAU,UAC1B,kBAAmB,UAAU,SAC7B,UAAW,UAAU,OAAS,UAAY,CAAC,UAAU,WAAW,EAChE,YAAa,YAAY,WAAW,EACpC,MAAO,cAAc,OAAS,cAAgB,CAAC,SAAS,CAC1D,EACA,GAAI,CACF,EAAE,KAAK,CAAC,QAAS,gBAAiB,KAAK,CAAC,CAC1C,OAAS,IAAK,CACR,OAAO,SAAW,QAAQ,MAC5B,QAAQ,KAAK,8CAA+C,GAAG,CAEnE,CACF,CAAC,CACH,CAAC,EACL,CAEA,OAAO,WAAa,OAAO,YAAc,CAAC,EAC1C,OAAO,WAAW,iBAAmB,gBACvC,GAAG",
  "names": []
}
