{
  "version": 3,
  "sources": ["/cdn/shop/t/69/assets/tnf-click-tracking-gaps.js?cb=20260613a"],
  "sourcesContent": ["/* TNF Click-Tracking Gaps \u2014 2026-06-13 v1.\n   Fills the GA4 dataLayer tracking gaps that NEITHER the standard ecommerce\n   bundle (tracking-bundle-ga4.js: select_item / view_item_list / view_cart /\n   remove_from_cart / add_to_cart / view_promotion / select_promotion) NOR the\n   per-surface tnf_* scripts already cover.\n\n   Scope = DISCOVERY + NAVIGATION clicks only. Deliberately does NOT touch the\n   purchase path (product cards, ATC, checkout, cart) \u2014 those are already\n   tracked, and duplicating them would double-count in GA4.\n\n   Events added (all pure window.dataLayer.push \u2014 zero UX/behavior change):\n     - tnf_filter_apply        click a collection filter link (was inactive)\n     - tnf_filter_remove       click the X on an active-filter chip / a filter\n                               link that was already active\n     - tnf_filter_clear_all    click \"clear all filters\"\n     - tnf_sort_change         pick a sort option\n     - tnf_display_change      change items-per-page\n     - tnf_pagination_click    prev / next / numbered page\n     - tnf_breadcrumb_click    breadcrumb link\n     - tnf_localization_change country / currency selector submit\n     - tnf_newsletter_submit   footer (non-Klaviyo) newsletter form submit\n\n   Pattern mirrors the existing inline trackers: one capturing-phase delegated\n   click listener on document, guarded by an init flag, everything in try/catch\n   so a tracking error can never break a real interaction.\n*/\n(function () {\n  if (window.__tnfClickGapsInit) return;\n  window.__tnfClickGapsInit = true;\n\n  function push(obj) {\n    try {\n      window.dataLayer = window.dataLayer || [];\n      obj.source_path = location.pathname;\n      window.dataLayer.push(obj);\n    } catch (e) {}\n  }\n  function txt(el) {\n    return el && el.textContent ? el.textContent.replace(/\\s+/g, ' ').trim() : '';\n  }\n\n  document.addEventListener('click', function (e) {\n    var t = e.target;\n    if (!t || !t.closest) return;\n    try {\n      // \u2500\u2500 Collection filters \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      // Filter links (.collection__filter-link). \"is-active\" means the filter\n      // is currently applied, so clicking it REMOVES it; otherwise it APPLIES.\n      var fLink = t.closest('a.collection__filter-link');\n      if (fLink) {\n        var wasActive = fLink.classList.contains('is-active');\n        push({\n          event: wasActive ? 'tnf_filter_remove' : 'tnf_filter_apply',\n          filter_label: txt(fLink),\n          filter_url: fLink.getAttribute('href') || '',\n          via: 'filter_link'\n        });\n        return;\n      }\n      // Clear-all filters\n      var clearAll = t.closest('[data-action=\"clear-filters\"]');\n      if (clearAll) {\n        push({ event: 'tnf_filter_clear_all', filter_label: txt(clearAll) });\n        return;\n      }\n      // Single active-filter chip removal (the X cross)\n      var chipX = t.closest('.collection__active-filter-cross');\n      if (chipX) {\n        var chip = chipX.closest('.collection__active-filter-item');\n        push({\n          event: 'tnf_filter_remove',\n          filter_label: txt(chip) || txt(chipX),\n          filter_url: (chip && chip.getAttribute && chip.getAttribute('href')) || '',\n          via: 'active_chip'\n        });\n        return;\n      }\n\n      // \u2500\u2500 Sort / items-per-page (shared .value-picker__choice-item markup) \u2500\u2500\n      var choice = t.closest('.value-picker__choice-item[data-action=\"select-value\"]');\n      if (choice) {\n        var dataVal = choice.getAttribute('data-value') || '';\n        var inSort = !!choice.closest('#sort-by-selector');\n        if (inSort) {\n          push({ event: 'tnf_sort_change', sort_value: dataVal || txt(choice) });\n        } else {\n          // The non-sort value-picker is the items-per-page (display) control.\n          push({ event: 'tnf_display_change', per_page: dataVal || txt(choice) });\n        }\n        return;\n      }\n\n      // \u2500\u2500 Pagination \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      var pag = t.closest('.pagination__prev, .pagination__next, .pagination__nav-item');\n      if (pag && t.closest('.pagination')) {\n        var dir = pag.classList.contains('pagination__prev') ? 'prev'\n                : pag.classList.contains('pagination__next') ? 'next'\n                : 'page';\n        var pageA = pag.matches('a') ? pag : pag.querySelector('a');\n        push({\n          event: 'tnf_pagination_click',\n          direction: dir,\n          page_label: txt(pag),\n          page_url: (pageA && pageA.getAttribute('href')) || ''\n        });\n        return;\n      }\n\n      // \u2500\u2500 Breadcrumb \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      var crumb = t.closest('.breadcrumb__link');\n      if (crumb && t.closest('.breadcrumb')) {\n        var list = crumb.closest('.breadcrumb__list') || crumb.closest('.breadcrumb');\n        var items = list ? list.querySelectorAll('.breadcrumb__link') : [];\n        var level = 0;\n        for (var i = 0; i < items.length; i++) { if (items[i] === crumb) { level = i + 1; break; } }\n        push({\n          event: 'tnf_breadcrumb_click',\n          crumb_label: txt(crumb),\n          crumb_url: crumb.getAttribute('href') || '',\n          crumb_level: level\n        });\n        return;\n      }\n\n      // \u2500\u2500 Localization (country / currency) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      var locBtn = t.closest('button[name=\"country_code\"], button[name=\"locale_code\"]');\n      if (locBtn) {\n        var isCountry = locBtn.getAttribute('name') === 'country_code';\n        push({\n          event: 'tnf_localization_change',\n          loc_type: isCountry ? 'currency_country' : 'language',\n          loc_value: locBtn.getAttribute('value') || txt(locBtn)\n        });\n        return;\n      }\n    } catch (err) {}\n  }, true);\n\n  // \u2500\u2500 Footer newsletter submit (native form, distinct from Klaviyo popups) \u2500\u2500\n  document.addEventListener('submit', function (e) {\n    try {\n      var form = e.target;\n      if (!form || !form.closest) return;\n      var nl = form.closest('#footer-newsletter');\n      if (!nl) return;\n      push({ event: 'tnf_newsletter_submit', source: 'footer' });\n    } catch (err) {}\n  }, true);\n})();\n"],
  "mappings": "CA0BC,UAAY,CACX,GAAI,OAAO,mBAAoB,OAC/B,OAAO,mBAAqB,GAE5B,SAAS,KAAK,IAAK,CACjB,GAAI,CACF,OAAO,UAAY,OAAO,WAAa,CAAC,EACxC,IAAI,YAAc,SAAS,SAC3B,OAAO,UAAU,KAAK,GAAG,CAC3B,OAAS,EAAG,CAAC,CACf,CACA,SAAS,IAAI,GAAI,CACf,OAAO,IAAM,GAAG,YAAc,GAAG,YAAY,QAAQ,OAAQ,GAAG,EAAE,KAAK,EAAI,EAC7E,CAEA,SAAS,iBAAiB,QAAS,SAAU,EAAG,CAC9C,IAAI,EAAI,EAAE,OACV,GAAI,GAAC,GAAK,CAAC,EAAE,SACb,GAAI,CAIF,IAAI,MAAQ,EAAE,QAAQ,2BAA2B,EACjD,GAAI,MAAO,CACT,IAAI,UAAY,MAAM,UAAU,SAAS,WAAW,EACpD,KAAK,CACH,MAAO,UAAY,oBAAsB,mBACzC,aAAc,IAAI,KAAK,EACvB,WAAY,MAAM,aAAa,MAAM,GAAK,GAC1C,IAAK,aACP,CAAC,EACD,MACF,CAEA,IAAI,SAAW,EAAE,QAAQ,+BAA+B,EACxD,GAAI,SAAU,CACZ,KAAK,CAAE,MAAO,uBAAwB,aAAc,IAAI,QAAQ,CAAE,CAAC,EACnE,MACF,CAEA,IAAI,MAAQ,EAAE,QAAQ,kCAAkC,EACxD,GAAI,MAAO,CACT,IAAI,KAAO,MAAM,QAAQ,iCAAiC,EAC1D,KAAK,CACH,MAAO,oBACP,aAAc,IAAI,IAAI,GAAK,IAAI,KAAK,EACpC,WAAa,MAAQ,KAAK,cAAgB,KAAK,aAAa,MAAM,GAAM,GACxE,IAAK,aACP,CAAC,EACD,MACF,CAGA,IAAI,OAAS,EAAE,QAAQ,wDAAwD,EAC/E,GAAI,OAAQ,CACV,IAAI,QAAU,OAAO,aAAa,YAAY,GAAK,GAC/C,OAAS,CAAC,CAAC,OAAO,QAAQ,mBAAmB,EAE/C,KADE,OACG,CAAE,MAAO,kBAAmB,WAAY,SAAW,IAAI,MAAM,CAAE,EAG/D,CAAE,MAAO,qBAAsB,SAAU,SAAW,IAAI,MAAM,CAAE,CAHA,EAKvE,MACF,CAGA,IAAI,IAAM,EAAE,QAAQ,6DAA6D,EACjF,GAAI,KAAO,EAAE,QAAQ,aAAa,EAAG,CACnC,IAAI,IAAM,IAAI,UAAU,SAAS,kBAAkB,EAAI,OAC7C,IAAI,UAAU,SAAS,kBAAkB,EAAI,OAC7C,OACN,MAAQ,IAAI,QAAQ,GAAG,EAAI,IAAM,IAAI,cAAc,GAAG,EAC1D,KAAK,CACH,MAAO,uBACP,UAAW,IACX,WAAY,IAAI,GAAG,EACnB,SAAW,OAAS,MAAM,aAAa,MAAM,GAAM,EACrD,CAAC,EACD,MACF,CAGA,IAAI,MAAQ,EAAE,QAAQ,mBAAmB,EACzC,GAAI,OAAS,EAAE,QAAQ,aAAa,EAAG,CAIrC,QAHI,KAAO,MAAM,QAAQ,mBAAmB,GAAK,MAAM,QAAQ,aAAa,EACxE,MAAQ,KAAO,KAAK,iBAAiB,mBAAmB,EAAI,CAAC,EAC7D,MAAQ,EACH,EAAI,EAAG,EAAI,MAAM,OAAQ,IAAO,GAAI,MAAM,CAAC,IAAM,MAAO,CAAE,MAAQ,EAAI,EAAG,KAAO,CACzF,KAAK,CACH,MAAO,uBACP,YAAa,IAAI,KAAK,EACtB,UAAW,MAAM,aAAa,MAAM,GAAK,GACzC,YAAa,KACf,CAAC,EACD,MACF,CAGA,IAAI,OAAS,EAAE,QAAQ,yDAAyD,EAChF,GAAI,OAAQ,CACV,IAAI,UAAY,OAAO,aAAa,MAAM,IAAM,eAChD,KAAK,CACH,MAAO,0BACP,SAAU,UAAY,mBAAqB,WAC3C,UAAW,OAAO,aAAa,OAAO,GAAK,IAAI,MAAM,CACvD,CAAC,EACD,MACF,CACF,OAAS,IAAK,CAAC,CACjB,EAAG,EAAI,EAGP,SAAS,iBAAiB,SAAU,SAAU,EAAG,CAC/C,GAAI,CACF,IAAI,KAAO,EAAE,OACb,GAAI,CAAC,MAAQ,CAAC,KAAK,QAAS,OAC5B,IAAI,GAAK,KAAK,QAAQ,oBAAoB,EAC1C,GAAI,CAAC,GAAI,OACT,KAAK,CAAE,MAAO,wBAAyB,OAAQ,QAAS,CAAC,CAC3D,OAAS,IAAK,CAAC,CACjB,EAAG,EAAI,CACT,GAAG",
  "names": []
}
