{
  "version": 3,
  "sources": ["/cdn/shop/t/61/assets/yotpo-live-rating.js?cb=1781209648"],
  "sourcesContent": ["/*\n * yotpo-live-rating.js\n * Populates the theme's custom star-rating markup (.product__section--rating-wrapper)\n * with LIVE data from Yotpo's public API, so collection cards / quickview / PDP always\n * match the Yotpo product-page widget. Replaces the unreliable yotpo.* metafields, which\n * go stale on duplicated products and lag for brand-new reviews.\n *\n * Placeholders are rendered `hidden` (display:none) and unhidden only when reviews exist,\n * so zero-review cards keep no gap. Because hidden elements never intersect, loading is\n * EAGER (no IntersectionObserver) \u2014 responses are tiny and CDN-cached.\n */\n(function () {\n  var APP_KEY = '24Ofsw45U51BUg0YnXKJ8zaraSyMzQeg6QxNLyTI';\n  var RATING_MAX = 5;\n  // v3 storefront API \u2014 the SAME endpoint the Yotpo PDP widget uses, including\n  // grouped reviews (reviews pooled across related products). The older v1\n  // /products/{id}/reviews.json excludes grouping and undercounts (e.g. 7 vs 9).\n  var ENDPOINT = 'https://api-cdn.yotpo.com/v3/storefront/store/' + APP_KEY + '/product/';\n\n  function buildMarkup(avg, count) {\n    var floor = Math.floor(avg);\n    var dec = avg - floor;\n    var ratingDecimal = 0;\n    if (dec >= 0.3 && dec <= 0.7) ratingDecimal = 0.5;\n    else if (dec > 0.7) ratingDecimal = 1;\n    var display = (Math.round(avg * 10) / 10).toFixed(1);\n    var label = display + ' out of ' + RATING_MAX + ' stars, ' + count + ' review' + (count === 1 ? '' : 's');\n    return (\n      '<div class=\"product__section-rating\" role=\"img\" aria-label=\"' + label + '\">' +\n        '<span aria-hidden=\"true\" class=\"product__section-rating-star color-icon\" ' +\n        'style=\"--rating: ' + floor + '; --rating-max: ' + RATING_MAX + '; --rating-decimal: ' + ratingDecimal + ';\"></span>' +\n      '</div>' +\n      '<p class=\"product__section-rating-text caption\"><span aria-hidden=\"true\">' + display + ' / ' + RATING_MAX + '</span></p>' +\n      '<p class=\"product__section-rating-count caption\"><span aria-hidden=\"true\">(' + count + ')</span>' +\n        '<span class=\"visually-hidden\">' + count + ' total reviews</span></p>'\n    );\n  }\n\n  function load(el) {\n    var id = el.getAttribute('data-product-id');\n    if (!id || el.dataset.yotpoLoaded) return;\n    el.dataset.yotpoLoaded = '1';\n    fetch(ENDPOINT + id + '/reviews?page=1&perPage=1')\n      .then(function (r) { return r.json(); })\n      .then(function (d) {\n        var bl = d && d.bottomline;\n        var count = bl ? parseInt(bl.totalReview, 10) : 0;\n        var avg = bl ? parseFloat(bl.averageScore) : 0;\n        if (count > 0 && avg > 0) {\n          el.innerHTML = buildMarkup(avg, count);\n          el.removeAttribute('hidden');\n        }\n        // no reviews -> stays hidden (matches live Yotpo: nothing shown)\n      })\n      .catch(function () {\n        el.removeAttribute('data-yotpo-loaded'); // allow retry on next scan after a network blip\n      });\n  }\n\n  function scan(root) {\n    var els = (root || document).querySelectorAll('.js-yotpo-live-rating[data-product-id]:not([data-yotpo-loaded])');\n    Array.prototype.forEach.call(els, load);\n  }\n\n  function init() { scan(document); }\n\n  if (document.readyState !== 'loading') init();\n  else document.addEventListener('DOMContentLoaded', init);\n\n  // Re-scan for cards added via AJAX (quickview, predictive search, infinite scroll, section reloads)\n  document.addEventListener('shopify:section:load', function () { scan(document); });\n  var mo = new MutationObserver(function (mutations) {\n    for (var i = 0; i < mutations.length; i++) {\n      if (mutations[i].addedNodes && mutations[i].addedNodes.length) { scan(document); break; }\n    }\n  });\n  function startMO() { mo.observe(document.body, { childList: true, subtree: true }); }\n  if (document.body) startMO();\n  else document.addEventListener('DOMContentLoaded', startMO);\n})();\n"],
  "mappings": "CAWC,UAAY,CACX,IAAI,QAAU,2CACV,WAAa,EAIb,SAAW,iDAAmD,QAAU,YAE5E,SAAS,YAAY,IAAK,MAAO,CAC/B,IAAI,MAAQ,KAAK,MAAM,GAAG,EACtB,IAAM,IAAM,MACZ,cAAgB,EAChB,KAAO,IAAO,KAAO,GAAK,cAAgB,GACrC,IAAM,KAAK,cAAgB,GACpC,IAAI,SAAW,KAAK,MAAM,IAAM,EAAE,EAAI,IAAI,QAAQ,CAAC,EAC/C,MAAQ,QAAU,WAAa,WAAa,WAAa,MAAQ,WAAa,QAAU,EAAI,GAAK,KACrG,MACE,+DAAiE,MAAQ,+FAEjD,MAAQ,mBAAqB,WAAa,uBAAyB,cAAgB,4FAE7B,QAAU,MAAQ,WAAa,yFAC7B,MAAQ,yCACnD,MAAQ,2BAEjD,CAEA,SAAS,KAAK,GAAI,CAChB,IAAI,GAAK,GAAG,aAAa,iBAAiB,EACtC,CAAC,IAAM,GAAG,QAAQ,cACtB,GAAG,QAAQ,YAAc,IACzB,MAAM,SAAW,GAAK,2BAA2B,EAC9C,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,KAAK,CAAG,CAAC,EACtC,KAAK,SAAU,EAAG,CACjB,IAAI,GAAK,GAAK,EAAE,WACZ,MAAQ,GAAK,SAAS,GAAG,YAAa,EAAE,EAAI,EAC5C,IAAM,GAAK,WAAW,GAAG,YAAY,EAAI,EACzC,MAAQ,GAAK,IAAM,IACrB,GAAG,UAAY,YAAY,IAAK,KAAK,EACrC,GAAG,gBAAgB,QAAQ,EAG/B,CAAC,EACA,MAAM,UAAY,CACjB,GAAG,gBAAgB,mBAAmB,CACxC,CAAC,EACL,CAEA,SAAS,KAAK,KAAM,CAClB,IAAI,KAAO,MAAQ,UAAU,iBAAiB,iEAAiE,EAC/G,MAAM,UAAU,QAAQ,KAAK,IAAK,IAAI,CACxC,CAEA,SAAS,MAAO,CAAE,KAAK,QAAQ,CAAG,CAE9B,SAAS,aAAe,UAAW,KAAK,EACvC,SAAS,iBAAiB,mBAAoB,IAAI,EAGvD,SAAS,iBAAiB,uBAAwB,UAAY,CAAE,KAAK,QAAQ,CAAG,CAAC,EACjF,IAAI,GAAK,IAAI,iBAAiB,SAAU,UAAW,CACjD,QAAS,EAAI,EAAG,EAAI,UAAU,OAAQ,IACpC,GAAI,UAAU,CAAC,EAAE,YAAc,UAAU,CAAC,EAAE,WAAW,OAAQ,CAAE,KAAK,QAAQ,EAAG,KAAO,CAE5F,CAAC,EACD,SAAS,SAAU,CAAE,GAAG,QAAQ,SAAS,KAAM,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,CAAG,CAChF,SAAS,KAAM,QAAQ,EACtB,SAAS,iBAAiB,mBAAoB,OAAO,CAC5D,GAAG",
  "names": []
}
