{
  "version": 3,
  "sources": ["/cdn/shop/t/153/assets/oj-bundle.js?cb=1794313567416"],
  "sourcesContent": ["/* ============================================\r\n   OJAR BLACK FRIDAY BUNDLE \u2014 JAVASCRIPT (v1)\r\n   Pattern: adapted from oj-gift-box-builder.js\r\n   What it does:\r\n   - On a bundle product page, intercept \"Add to Cart\"\r\n   - Split the bundle into its individual component products\r\n   - Add each component as a SEPARATE cart line with _bundle_* properties\r\n   - 40% discount is applied at checkout (create-checkout-session.js reads _bundle_*)\r\n   ============================================ */\r\n(function () {\r\n  'use strict';\r\n\r\n  var BUNDLE_DISCOUNT_PERCENT = '40'; // Black Friday flat 40%\r\n\r\n  /* ---------------------------------------------------------------\r\n     BUNDLE MAP \u2014 bundle product HANDLE -> { name, components:[component handles] }\r\n     NOTE: component values are PRODUCT HANDLES (not SKUs). We look up each\r\n     component product's first variant id at add-to-cart time.\r\n     TODO: confirm each component handle once the component products are verified.\r\n     The 6 TRIO bundles (Phase 1 / 12 Nov) are filled first; the rest are stubs.\r\n     --------------------------------------------------------------- */\r\n  var BUNDLE_MAP = {\r\n    // ---- Phase 1: 6 TRIO bundles (100ml + 20ml + 15ml, same scent) ----\r\n    'halwa-kiss-trio-bf': {\r\n      name: 'HALWA KISS TRIO',\r\n      components: ['halwa_kiss_eau_de_parfum', 'halwa-kiss-absolute', 'halwa-kiss-15-ml']\r\n    },\r\n    'stallion-soul-trio-bf': {\r\n      name: 'STALLION SOUL TRIO',\r\n      components: ['stallion_soul_eau_de_parfum', 'stallion_soul_absolute', 'stallion-soul-15-ml']\r\n    },\r\n    'ciel-dorage-trio-bf': {\r\n      name: \"CIEL D'ORAGE TRIO\",\r\n      components: ['ciel_dorage_eau_de_parfum', 'ciel_dorage_absolute', 'ciel-dorage-15ml']\r\n    },\r\n    'kashmir-print-trio-bf': {\r\n      name: 'KASHMIR PRINT TRIO',\r\n      components: ['kashmir_print_eau_de_parfum', 'kashmir_print_absolute', 'kashmir-print-15-ml']\r\n    },\r\n    'epine-du-desert-trio-bf': {\r\n      name: 'EPINE DU DESERT TRIO',\r\n      components: ['epine-du-desert-eau-de-parfum', 'epine-du-desert-absolute', 'epine-du-desert-15-ml']\r\n    },\r\n    'routes-nomades-trio-bf': {\r\n      name: 'ROUTES NOMADES TRIO',\r\n      components: ['routes-nomades-eau-de-parfum', 'routes-nomades-absolute', 'routes-nomades-15ml']\r\n    }\r\n    // ---- Phase 2 bundles (2x100, 3x20 oil, 4x15 travel) added later ----\r\n  };\r\n\r\n  /* ---------------- helpers ---------------- */\r\n  function getBundleHandleFromPage() {\r\n    // Shopify exposes current product handle on the product page\r\n    try {\r\n      if (window.ShopifyAnalytics && window.ShopifyAnalytics.meta &&\r\n          window.ShopifyAnalytics.meta.product && window.ShopifyAnalytics.meta.product.handle) {\r\n        return window.ShopifyAnalytics.meta.product.handle;\r\n      }\r\n    } catch (e) {}\r\n    // Fallback: parse from URL /products/<handle>\r\n    var m = location.pathname.match(/\\/products\\/([a-z0-9\\-_]+)/i);\r\n    return m ? m[1] : null;\r\n  }\r\n\r\n  async function fetchProductByHandle(handle) {\r\n    try {\r\n      var r = await fetch('/products/' + handle + '.js');\r\n      if (!r.ok) return null;\r\n      return await r.json();\r\n    } catch (e) {\r\n      console.error('[OJ Bundle] fetch failed:', handle, e);\r\n      return null;\r\n    }\r\n  }\r\n\r\n  function firstAvailableVariantId(prod) {\r\n    if (!prod || !prod.variants || !prod.variants.length) return null;\r\n    var v = prod.variants.find(function (x) { return x.available; }) || prod.variants[0];\r\n    return v ? v.id : null;\r\n  }\r\n\r\n  /* ---------------- core: add bundle (split) ---------------- */\r\n  async function addBundleToCart(bundleHandle, btn) {\r\n    var cfg = BUNDLE_MAP[bundleHandle];\r\n    if (!cfg) {\r\n      console.warn('[OJ Bundle] No bundle config for handle:', bundleHandle);\r\n      return false;\r\n    }\r\n\r\n    var originalText = btn ? btn.textContent : '';\r\n    if (btn) { btn.disabled = true; btn.textContent = 'ADDING...'; }\r\n\r\n    try {\r\n      var groupId = 'bf-' + Date.now() + '-' + Math.random().toString(36).substr(2, 6);\r\n      var items = [];\r\n\r\n      for (var i = 0; i < cfg.components.length; i++) {\r\n        var prod = await fetchProductByHandle(cfg.components[i]);\r\n        if (!prod) throw new Error('Component not found: ' + cfg.components[i]);\r\n        var vid = firstAvailableVariantId(prod);\r\n        if (!vid) throw new Error('No available variant: ' + cfg.components[i]);\r\n\r\n        items.push({\r\n          id: vid,\r\n          quantity: 1,\r\n          properties: {\r\n            '_bundle': 'true',\r\n            '_bundle_name': cfg.name,\r\n            '_bundle_group_id': groupId,\r\n            '_bundle_discount_percent': BUNDLE_DISCOUNT_PERCENT,\r\n            '_bundle_item_index': (i + 1).toString(),\r\n            '_bundle_total_items': cfg.components.length.toString()\r\n          }\r\n        });\r\n      }\r\n\r\n      var res = await fetch('/cart/add.js', {\r\n        method: 'POST',\r\n        headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\r\n        body: JSON.stringify({\r\n          items: items,\r\n          sections: ['cart-drawer', 'cart-icon-bubble'],\r\n          sections_url: '/cart'\r\n        })\r\n      });\r\n\r\n      if (!res.ok) {\r\n        var err = await res.json().catch(function () { return {}; });\r\n        throw new Error(err.description || 'Add to cart failed');\r\n      }\r\n\r\n      var result = await res.json();\r\n      if (btn) { btn.textContent = 'ADDED \u2713'; }\r\n\r\n      // Open cart drawer (reuse theme's drawer if present)\r\n      openCartDrawer(result.sections);\r\n      return true;\r\n\r\n    } catch (e) {\r\n      console.error('[OJ Bundle] addBundleToCart error:', e);\r\n      if (btn) { btn.textContent = originalText || 'ADD TO CART'; btn.disabled = false; }\r\n      alert('Sorry, could not add this bundle. Please try again or contact support.');\r\n      return false;\r\n    }\r\n  }\r\n\r\n  /* ---------------- cart drawer open (Dawn-style) ----------------\r\n     IMPORTANT: Use the theme's OWN cart-drawer.renderContents() + open()\r\n     methods instead of manually overwriting drawer.innerHTML.\r\n\r\n     Why: overwriting innerHTML wipes the theme's event bindings on the\r\n     drawer's children \u2014 specifically the overlay \"click to close\" handler\r\n     and the bundle-grouping render. That caused two bugs:\r\n       (1) outside/overlay click no longer closed the drawer, and\r\n       (2) bundle items showed ungrouped (only re-grouped on a full reload).\r\n     renderContents() re-binds everything the theme needs, and open() runs\r\n     the theme's normal open flow \u2014 so grouping + outside-click both work. */\r\n  function openCartDrawer(preloadedSections) {\r\n    try {\r\n      var drawer = document.querySelector('cart-drawer');\r\n      if (!drawer) { window.location.replace('/cart?refreshed=' + Date.now()); return; }\r\n\r\n      function themeRender(sections) {\r\n        // Prefer the theme's native renderer (Dawn: renderContents expects\r\n        // an object whose .sections holds the HTML strings).\r\n        if (typeof drawer.renderContents === 'function' && sections) {\r\n          drawer.renderContents({ sections: sections });\r\n          // renderContents adds .active itself; open() ensures focus/overflow.\r\n          if (typeof drawer.open === 'function') { try { drawer.open(); } catch (e) {} }\r\n          return true;\r\n        }\r\n        return false;\r\n      }\r\n\r\n      function fallbackApply(sections) {\r\n        // Last-resort manual apply (only if theme method is missing).\r\n        try {\r\n          var parser = new DOMParser();\r\n          if (sections && sections['cart-drawer']) {\r\n            var doc = parser.parseFromString(sections['cart-drawer'], 'text/html');\r\n            var fresh = doc.querySelector('cart-drawer');\r\n            if (fresh) drawer.innerHTML = fresh.innerHTML;\r\n          }\r\n          if (sections && sections['cart-icon-bubble']) {\r\n            var bubbleDoc = parser.parseFromString(sections['cart-icon-bubble'], 'text/html');\r\n            var bubble = document.querySelector('#cart-icon-bubble');\r\n            var newBubble = bubbleDoc.querySelector('.shopify-section');\r\n            if (bubble && newBubble) bubble.innerHTML = newBubble.innerHTML;\r\n          }\r\n          drawer.classList.add('active', 'animate');\r\n          drawer.removeAttribute('inert');\r\n          document.body.classList.add('overflow-hidden');\r\n          rebindCloseHandlers(drawer); // re-attach overlay/ESC close\r\n        } catch (e) { window.location.replace('/cart?refreshed=' + Date.now()); }\r\n      }\r\n\r\n      function apply(sections) {\r\n        if (!themeRender(sections)) fallbackApply(sections);\r\n        // Nudge the bundle-cart grouper to run right after the drawer renders,\r\n        // so the grouped header shows immediately (not only after a reload).\r\n        try {\r\n          document.dispatchEvent(new CustomEvent('cart:open'));\r\n          document.dispatchEvent(new CustomEvent('oj:bundle-added'));\r\n        } catch (e) {}\r\n      }\r\n\r\n      if (preloadedSections && preloadedSections['cart-drawer']) {\r\n        apply(preloadedSections);\r\n      } else {\r\n        fetch('/?sections=cart-drawer,cart-icon-bubble')\r\n          .then(function (r) { return r.json(); })\r\n          .then(apply)\r\n          .catch(function () { window.location.replace('/cart?refreshed=' + Date.now()); });\r\n      }\r\n    } catch (e) {\r\n      window.location.replace('/cart?refreshed=' + Date.now());\r\n    }\r\n  }\r\n\r\n  /* Safety net: if we ever fall back to manual innerHTML, re-bind the\r\n     theme's close behaviour so outside/overlay click still closes. */\r\n  function rebindCloseHandlers(drawer) {\r\n    try {\r\n      var overlay = drawer.querySelector('#CartDrawer-Overlay, .cart-drawer__overlay');\r\n      if (overlay && !overlay._ojCloseBound) {\r\n        overlay.addEventListener('click', function () {\r\n          if (typeof drawer.close === 'function') drawer.close();\r\n          else { drawer.classList.remove('active'); document.body.classList.remove('overflow-hidden'); }\r\n        });\r\n        overlay._ojCloseBound = true;\r\n      }\r\n      var closeBtn = drawer.querySelector('.drawer__close, [aria-label*=\"Close\"], button[type=\"button\"].drawer__close');\r\n      if (closeBtn && !closeBtn._ojCloseBound) {\r\n        closeBtn.addEventListener('click', function () {\r\n          if (typeof drawer.close === 'function') drawer.close();\r\n          else { drawer.classList.remove('active'); document.body.classList.remove('overflow-hidden'); }\r\n        });\r\n        closeBtn._ojCloseBound = true;\r\n      }\r\n    } catch (e) {}\r\n  }\r\n\r\n  /* ---------------- wire up the bundle product page ---------------- */\r\n  function init() {\r\n    var handle = getBundleHandleFromPage();\r\n    if (!handle || !BUNDLE_MAP[handle]) return; // not a bundle page \u2014 do nothing\r\n\r\n    // Intercept the product form's add-to-cart (capture phase, before theme handler)\r\n    document.addEventListener('submit', function (e) {\r\n      var form = e.target.closest('form[action*=\"/cart/add\"]');\r\n      if (!form) return;\r\n      e.preventDefault();\r\n      e.stopImmediatePropagation();\r\n      var btn = form.querySelector('[type=\"submit\"], [name=\"add\"]');\r\n      addBundleToCart(handle, btn);\r\n    }, true);\r\n\r\n    // Also intercept any standalone add-to-cart buttons\r\n    document.addEventListener('click', function (e) {\r\n      var btn = e.target.closest('[name=\"add\"], .product-form__submit, [data-add-to-cart]');\r\n      if (!btn) return;\r\n      if (btn.closest('form[action*=\"/cart/add\"]')) return; // handled by submit above\r\n      e.preventDefault();\r\n      e.stopImmediatePropagation();\r\n      addBundleToCart(handle, btn);\r\n    }, true);\r\n\r\n    console.log('[OJ Bundle] Active on bundle page:', handle);\r\n  }\r\n\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', init);\r\n  } else {\r\n    init();\r\n  }\r\n})();\r\n"],
  "mappings": "CASC,UAAY,CACX,aAEA,IAAI,wBAA0B,KAS1B,WAAa,CAEf,qBAAsB,CACpB,KAAM,kBACN,WAAY,CAAC,2BAA4B,sBAAuB,kBAAkB,CACpF,EACA,wBAAyB,CACvB,KAAM,qBACN,WAAY,CAAC,8BAA+B,yBAA0B,qBAAqB,CAC7F,EACA,sBAAuB,CACrB,KAAM,oBACN,WAAY,CAAC,4BAA6B,uBAAwB,kBAAkB,CACtF,EACA,wBAAyB,CACvB,KAAM,qBACN,WAAY,CAAC,8BAA+B,yBAA0B,qBAAqB,CAC7F,EACA,0BAA2B,CACzB,KAAM,uBACN,WAAY,CAAC,gCAAiC,2BAA4B,uBAAuB,CACnG,EACA,yBAA0B,CACxB,KAAM,sBACN,WAAY,CAAC,+BAAgC,0BAA2B,qBAAqB,CAC/F,CAEF,EAGA,SAAS,yBAA0B,CAEjC,GAAI,CACF,GAAI,OAAO,kBAAoB,OAAO,iBAAiB,MACnD,OAAO,iBAAiB,KAAK,SAAW,OAAO,iBAAiB,KAAK,QAAQ,OAC/E,OAAO,OAAO,iBAAiB,KAAK,QAAQ,MAEhD,MAAY,CAAC,CAEb,IAAI,EAAI,SAAS,SAAS,MAAM,6BAA6B,EAC7D,OAAO,EAAI,EAAE,CAAC,EAAI,IACpB,CAEA,eAAe,qBAAqB,OAAQ,CAC1C,GAAI,CACF,IAAI,EAAI,MAAM,MAAM,aAAe,OAAS,KAAK,EACjD,OAAK,EAAE,GACA,MAAM,EAAE,KAAK,EADF,IAEpB,OAAS,EAAG,CACV,eAAQ,MAAM,4BAA6B,OAAQ,CAAC,EAC7C,IACT,CACF,CAEA,SAAS,wBAAwB,KAAM,CACrC,GAAI,CAAC,MAAQ,CAAC,KAAK,UAAY,CAAC,KAAK,SAAS,OAAQ,OAAO,KAC7D,IAAI,EAAI,KAAK,SAAS,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,SAAW,CAAC,GAAK,KAAK,SAAS,CAAC,EACnF,OAAO,EAAI,EAAE,GAAK,IACpB,CAGA,eAAe,gBAAgB,aAAc,IAAK,CAChD,IAAI,IAAM,WAAW,YAAY,EACjC,GAAI,CAAC,IACH,eAAQ,KAAK,2CAA4C,YAAY,EAC9D,GAGT,IAAI,aAAe,IAAM,IAAI,YAAc,GACvC,MAAO,IAAI,SAAW,GAAM,IAAI,YAAc,aAElD,GAAI,CAIF,QAHI,QAAU,MAAQ,KAAK,IAAI,EAAI,IAAM,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,EAC3E,MAAQ,CAAC,EAEJ,EAAI,EAAG,EAAI,IAAI,WAAW,OAAQ,IAAK,CAC9C,IAAI,KAAO,MAAM,qBAAqB,IAAI,WAAW,CAAC,CAAC,EACvD,GAAI,CAAC,KAAM,MAAM,IAAI,MAAM,wBAA0B,IAAI,WAAW,CAAC,CAAC,EACtE,IAAI,IAAM,wBAAwB,IAAI,EACtC,GAAI,CAAC,IAAK,MAAM,IAAI,MAAM,yBAA2B,IAAI,WAAW,CAAC,CAAC,EAEtE,MAAM,KAAK,CACT,GAAI,IACJ,SAAU,EACV,WAAY,CACV,QAAW,OACX,aAAgB,IAAI,KACpB,iBAAoB,QACpB,yBAA4B,wBAC5B,oBAAuB,EAAI,GAAG,SAAS,EACvC,oBAAuB,IAAI,WAAW,OAAO,SAAS,CACxD,CACF,CAAC,CACH,CAEA,IAAI,IAAM,MAAM,MAAM,eAAgB,CACpC,OAAQ,OACR,QAAS,CAAE,eAAgB,mBAAoB,OAAU,kBAAmB,EAC5E,KAAM,KAAK,UAAU,CACnB,MACA,SAAU,CAAC,cAAe,kBAAkB,EAC5C,aAAc,OAChB,CAAC,CACH,CAAC,EAED,GAAI,CAAC,IAAI,GAAI,CACX,IAAI,IAAM,MAAM,IAAI,KAAK,EAAE,MAAM,UAAY,CAAE,MAAO,CAAC,CAAG,CAAC,EAC3D,MAAM,IAAI,MAAM,IAAI,aAAe,oBAAoB,CACzD,CAEA,IAAI,OAAS,MAAM,IAAI,KAAK,EAC5B,OAAI,MAAO,IAAI,YAAc,gBAG7B,eAAe,OAAO,QAAQ,EACvB,EAET,OAAS,EAAG,CACV,eAAQ,MAAM,qCAAsC,CAAC,EACjD,MAAO,IAAI,YAAc,cAAgB,cAAe,IAAI,SAAW,IAC3E,MAAM,wEAAwE,EACvE,EACT,CACF,CAaA,SAAS,eAAe,kBAAmB,CACzC,GAAI,CAIF,IAAS,YAAT,SAAqB,SAAU,CAG7B,GAAI,OAAO,OAAO,gBAAmB,YAAc,SAAU,CAG3D,GAFA,OAAO,eAAe,CAAE,QAAmB,CAAC,EAExC,OAAO,OAAO,MAAS,WAAc,GAAI,CAAE,OAAO,KAAK,CAAG,MAAY,CAAC,CAC3E,MAAO,EACT,CACA,MAAO,EACT,EAES,cAAT,SAAuB,SAAU,CAE/B,GAAI,CACF,IAAI,OAAS,IAAI,UACjB,GAAI,UAAY,SAAS,aAAa,EAAG,CACvC,IAAI,IAAM,OAAO,gBAAgB,SAAS,aAAa,EAAG,WAAW,EACjE,MAAQ,IAAI,cAAc,aAAa,EACvC,QAAO,OAAO,UAAY,MAAM,UACtC,CACA,GAAI,UAAY,SAAS,kBAAkB,EAAG,CAC5C,IAAI,UAAY,OAAO,gBAAgB,SAAS,kBAAkB,EAAG,WAAW,EAC5E,OAAS,SAAS,cAAc,mBAAmB,EACnD,UAAY,UAAU,cAAc,kBAAkB,EACtD,QAAU,YAAW,OAAO,UAAY,UAAU,UACxD,CACA,OAAO,UAAU,IAAI,SAAU,SAAS,EACxC,OAAO,gBAAgB,OAAO,EAC9B,SAAS,KAAK,UAAU,IAAI,iBAAiB,EAC7C,oBAAoB,MAAM,CAC5B,MAAY,CAAE,OAAO,SAAS,QAAQ,mBAAqB,KAAK,IAAI,CAAC,CAAG,CAC1E,EAES,MAAT,SAAe,SAAU,CAClB,YAAY,QAAQ,GAAG,cAAc,QAAQ,EAGlD,GAAI,CACF,SAAS,cAAc,IAAI,YAAY,WAAW,CAAC,EACnD,SAAS,cAAc,IAAI,YAAY,iBAAiB,CAAC,CAC3D,MAAY,CAAC,CACf,EA7CA,IAAI,OAAS,SAAS,cAAc,aAAa,EACjD,GAAI,CAAC,OAAQ,CAAE,OAAO,SAAS,QAAQ,mBAAqB,KAAK,IAAI,CAAC,EAAG,MAAQ,CA8C7E,mBAAqB,kBAAkB,aAAa,EACtD,MAAM,iBAAiB,EAEvB,MAAM,yCAAyC,EAC5C,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,KAAK,CAAG,CAAC,EACtC,KAAK,KAAK,EACV,MAAM,UAAY,CAAE,OAAO,SAAS,QAAQ,mBAAqB,KAAK,IAAI,CAAC,CAAG,CAAC,CAEtF,MAAY,CACV,OAAO,SAAS,QAAQ,mBAAqB,KAAK,IAAI,CAAC,CACzD,CACF,CAIA,SAAS,oBAAoB,OAAQ,CACnC,GAAI,CACF,IAAI,QAAU,OAAO,cAAc,4CAA4C,EAC3E,SAAW,CAAC,QAAQ,gBACtB,QAAQ,iBAAiB,QAAS,UAAY,CACxC,OAAO,OAAO,OAAU,WAAY,OAAO,MAAM,GAC9C,OAAO,UAAU,OAAO,QAAQ,EAAG,SAAS,KAAK,UAAU,OAAO,iBAAiB,EAC5F,CAAC,EACD,QAAQ,cAAgB,IAE1B,IAAI,SAAW,OAAO,cAAc,4EAA4E,EAC5G,UAAY,CAAC,SAAS,gBACxB,SAAS,iBAAiB,QAAS,UAAY,CACzC,OAAO,OAAO,OAAU,WAAY,OAAO,MAAM,GAC9C,OAAO,UAAU,OAAO,QAAQ,EAAG,SAAS,KAAK,UAAU,OAAO,iBAAiB,EAC5F,CAAC,EACD,SAAS,cAAgB,GAE7B,MAAY,CAAC,CACf,CAGA,SAAS,MAAO,CACd,IAAI,OAAS,wBAAwB,EACjC,CAAC,QAAU,CAAC,WAAW,MAAM,IAGjC,SAAS,iBAAiB,SAAU,SAAU,EAAG,CAC/C,IAAI,KAAO,EAAE,OAAO,QAAQ,2BAA2B,EACvD,GAAK,KACL,GAAE,eAAe,EACjB,EAAE,yBAAyB,EAC3B,IAAI,IAAM,KAAK,cAAc,+BAA+B,EAC5D,gBAAgB,OAAQ,GAAG,EAC7B,EAAG,EAAI,EAGP,SAAS,iBAAiB,QAAS,SAAU,EAAG,CAC9C,IAAI,IAAM,EAAE,OAAO,QAAQ,yDAAyD,EAC/E,MACD,IAAI,QAAQ,2BAA2B,IAC3C,EAAE,eAAe,EACjB,EAAE,yBAAyB,EAC3B,gBAAgB,OAAQ,GAAG,GAC7B,EAAG,EAAI,EAEP,QAAQ,IAAI,qCAAsC,MAAM,EAC1D,CAEI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,IAAI,EAElD,KAAK,CAET,GAAG",
  "names": []
}
