PageSourceSearch

https://thesaltworkscompany.com/cdn/shop/t/43/assets/BuyFullChoose…?v=101464286655002722001780145408

js thesaltworkscompany.com collected 2026-09-29 16:22:01 UTC 26,304 bytes, 357 lines download raw bytes

1(()=>{const STYLE=`
2html.itb-hide-amp-gift #slidecarthq .free-gifts .free-gifts-body .slick-wrapper{display:none!important}
3
4#itb-add-50ml-card{display:flex;gap:16px;align-items:stretch;padding:12px 0;border-top:1px solid #eee}
5#itb-add-50ml-card.item{margin:0}
6#itb-add-50ml-card .itb-media{flex:0 0 auto;display:flex;align-items:center}
7#itb-add-50ml-card .itb-media img{width:84px;height:84px;object-fit:contain}
8#itb-add-50ml-card .itb-center{display:flex;flex-direction:column;flex:1 1 auto;min-width:0}
9#itb-add-50ml-card .itb-title{font-weight:600;margin:0}
10#itb-add-50ml-card .itb-sub{opacity:.6;margin:4px 0 0;font-size:14px;color:rgba(0,0,0,.4)}
11#itb-add-50ml-card .itb-pick{
12  margin-top:auto;text-decoration:none;background:#fff;border:1px solid #222;
13  color:#616161;font-size:14px;padding:.5rem .75rem;border-radius:0;
14  display:inline-flex;align-items:center;gap:6px;cursor:pointer
15}
16#itb-add-50ml-card .itb-right{margin-left:auto;display:flex;flex-direction:row;align-items:center;justify-content:center;gap: 7px;}
17#itb-add-50ml-card .itb-close{background:none;border:0;color:#A1A1A1;font-size:18px;line-height:1;padding:0;visibility:hidden}
18#itb-add-50ml-card .itb-price-row{display:flex;gap:.4rem;align-items:center}
19#itb-add-50ml-card .itb-price{font-weight:600}
20#itb-add-50ml-card .itb-price-was{color:#717171;text-decoration:line-through;font-weight:600}
21
22/* === FULLSCREEN modal === */
23#itb-add-50ml-modal{position:fixed;inset:0;display:none;z-index:2147483647;isolation:isolate}
24#itb-add-50ml-modal.open{display:block}
25#itb-add-50ml-modal .backdrop{position:absolute;inset:0;background:rgba(0,0,0,.35)}
26#itb-add-50ml-modal .panel{
27  position:relative;margin:0;background:#fff;max-width:none;border-radius:0;
28  width:100vw;height:100vh;max-height:none;
29  padding:clamp(12px,2vw,24px);
30  padding-bottom:calc(max(16px, env(safe-area-inset-bottom)) + 30px);
31  display:flex;flex-direction:column;overflow:auto;
32}
33#itb-add-50ml-modal .itb-modal-container{flex:1 1 auto;display:flex;flex-direction:column;min-height:0}
34#itb-add-50ml-modal [data-role="section-host"]{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;overflow:hidden}
35#itb-add-50ml-modal [data-role="section-host"] iframe{flex:1 1 auto;width:100%;height:100%;border:0;display:block}
36
37#itb-add-50ml-modal .close-btn{
38  position:absolute;top:6px;right:6px;border:0;background:transparent;
39  font-size:24px;line-height:1;cursor:pointer;color:#333
40}
41
42/* block page scroll */
43html.itb-modal-open, html.itb-modal-open body{overflow:hidden}
44`,SECTION_ID="itb-fragrances-grid-buyfullchoose50ml",SECTION_ID_ALT="itb-fragrances-grid-BuyFullChoose50ml",BFG_CSS_URL="//thesaltworkscompany.com/cdn/shop/t/43/assets/BuyFullChoose50ml.css?v=34913057556545305951780057038",BFG_JS_URL="//thesaltworkscompany.com/cdn/shop/t/43/assets/BuyFullChoose50ml.js?v=129302091055485286901780060733";let LAST_CART_CHANGE=0,ITB_SECTION_CACHE=null,ITB_IFRAME=null,ITB_ONMSG_BOUND=!1,CART_CACHE=null,CART_FETCH_PROMISE=null;async function getCart(force=!1){return!force&&CART_CACHE?CART_CACHE:CART_FETCH_PROMISE||(CART_FETCH_PROMISE=fetch("/cart.js",{cache:"no-store",credentials:"same-origin"}).then(r=>r.ok?r.json():{items:[]}).then(c=>(CART_CACHE=c,c)).catch(()=>({items:[]})).finally(()=>{CART_FETCH_PROMISE=null}),CART_FETCH_PROMISE)}
44function invalidateCart(){CART_CACHE=null}function cartHasFullSize(cart){return!cart||!Array.isArray(cart.items)?!1:cart.items.some(it=>{const t=(it.variant_title||it.title||"").toLowerCase(),opts=it.options||it.variant_options||[],o1=String(opts[0]||"").toLowerCase();return t.includes("100ml")||o1.includes("100ml")||t.includes("full size")||o1.includes("full size")})}function cartHas50ml(cart){return!cart||!Array.isArray(cart.items)?!1:cart.items.some(it=>{const t=(it.variant_title||it.title||"").toLowerCase(),opts=it.options||it.variant_options||[],o1=String(opts[0]||"").toLowerCase();return t.includes("50ml")||o1.includes("50ml")})}function cartHasGiftType(cart,type){return!cart||!Array.isArray(cart.items)?!1:cart.items.some(it=>it&&it.properties&&it.properties._amp_gift===type)}async function refreshSlideCart(){await new Promise(resolve=>{if(typeof window.SLIDECART_UPDATE=="function"){let done=!1;try{window.SLIDECART_UPDATE(()=>{done=!0,resolve()})}catch{resolve();return}setTimeout(()=>{done||resolve()},800)}else resolve()}),["cart:updated","itb:cart:refresh"].forEach(ev=>{try{document.dispatchEvent(new CustomEvent(ev,{bubbles:!0,cancelable:!0}))}catch{}})}function addStyle(){if(document.getElementById("itb-add-50ml-style"))return;const s=document.createElement("style");s.id="itb-add-50ml-style",s.textContent=STYLE,document.head.appendChild(s)}function toggleAmpGift(hide=!0){document.documentElement.classList.toggle("itb-hide-amp-gift",!!hide)}function container(){return document.querySelector("#slidecarthq .free-gifts .free-gifts-body")}function ensureCssLink(href,id="itb-bfc50-css"){if(!href)return null;let l=document.getElementById(id);return l||(l=document.createElement("link"),l.id=id,l.rel="stylesheet",l.href=href,l.disabled=!0,document.head.appendChild(l)),l}function ensureJs(src,id="itb-bfc50-js"){if(!src)return Promise.resolve();const existing=document.getElementById(id);return existing&&existing.dataset.loaded==="1"?Promise.resolve():existing?new Promise(res=>existing.addEventListener("load",()=>res(),{once:!0})):new Promise((resolve,reject)=>{const s=document.createElement("script");s.id=id,s.src=src,s.async=!0,s.onload=()=>{s.dataset.loaded="1",resolve()},s.onerror=reject,document.head.appendChild(s)})}async function ensureCard(){const host=container();if(!host)return;const cart=await getCart();if(!cartHasFullSize(cart)){const existing=document.getElementById("itb-add-50ml-card");existing&&existing.remove();return}if(cartHas50ml(cart)){const existing=document.getElementById("itb-add-50ml-card");existing&&existing.remove();return}if(cartHasGiftType(cart,"bfc50")){const existing=document.getElementById("itb-add-50ml-card");existing&&existing.remove();return}let el=document.getElementById("itb-add-50ml-card");el&&el.classList.add("item"),el||(el=document.createElement("div"),el.id="itb-add-50ml-card",el.classList.add("item"),el.innerHTML=`
45        <div class="itb-media">
46          <img src="https://cdn.shopify.com/s/files/1/0653/7091/5035/files/50newSizem.jpg" alt="A second scent, for the launch"/>
47        </div>
48        <div class="itb-center">
49          <div class="itb-title">Add a 50ml for only \xA350 for the launch</div>
50          <div class="itb-sub">Size: 50ml Perfume</div>
51                 
52          <button type="button" class="itb-close" aria-hidden="true">\xD7</button>
53           <div class="itb-price-row">
54           <a href="#" class="itb-pick">Pick Your Fragrance</a> 
55<div class="itb-right">
56
57          <span class="itb-price">\xA350</span>
58          <span class="itb-price-was">\xA375</span>
59
60          
61          </div>
62        </div>
63
64        </div>
65
66        `,el.querySelector(".itb-pick").addEventListener("click",e=>{e.preventDefault(),openModal()})),el.parentElement!==host&&host.prepend(el)}async function fetchSectionHTML(){if(ITB_SECTION_CACHE)return ITB_SECTION_CACHE;const basePath=location.pathname+(location.search?location.search.split("#")[0]:""),tryId=async id=>{try{const url1=`${basePath}${basePath.includes("?")?"&":"?"}sections=${encodeURIComponent(id)}`,res1=await fetch(url1,{headers:{Accept:"application/json"}});if(res1.ok){const html2=(await res1.json())?.[id];if(typeof html2=="string"&&html2.trim())return html2}}catch{}const url2=`${basePath}${basePath.includes("?")?"&":"?"}section_id=${encodeURIComponent(id)}`,res2=await fetch(url2,{headers:{Accept:"text/html"}});if(res2.ok){const html2=await res2.text();if(html2&&html2.trim())return html2}return""};
66let html=await tryId(SECTION_ID);if(html||(html=await tryId(SECTION_ID_ALT)),!html)throw new Error("Section fetch failed: 404");return ITB_SECTION_CACHE=html,html}async function fetchBoostersJSON(){const basePath=location.pathname+(location.search?location.search.split("#")[0]:""),urlA=`${basePath}${basePath.includes("?")?"&":"?"}sections=itb-free-gift-boosters`,urlB=`${basePath}${basePath.includes("?")?"&":"?"}section_id=itb-free-gift-boosters`,parseMaybeWrapped=raw=>{if(!raw)return[];try{const x=JSON.parse(raw);if(Array.isArray(x))return x;if(Array.isArray(x?.boosters))return x.boosters}catch{}try{const host=new DOMParser().parseFromString(raw,"text/html").querySelector("#shopify-section-itb-free-gift-boosters");let txt=host?(host.textContent||"").trim():raw.replace(/<[^>]+>/g,"").trim();if(txt&&(txt.startsWith("[")||txt.startsWith("{"))){const x2=JSON.parse(txt);if(Array.isArray(x2))return x2;if(Array.isArray(x2?.boosters))return x2.boosters}}catch{}return[]},fallbackBoosters=()=>(window.__ITB_FREE_GIFT_BFC50__&&Array.isArray(window.__ITB_FREE_GIFT_BFC50__.boosters)?window.__ITB_FREE_GIFT_BFC50__.boosters:[]).map(b=>({id:b.id,handle:b.handle})).filter(x=>x&&x.handle);try{const resA=await fetch(urlA,{headers:{Accept:"application/json"},cache:"no-store"});if(resA.ok){const raw=(await resA.json())?.["itb-free-gift-boosters"];if(raw){const arr=parseMaybeWrapped(raw);if(arr.length)return arr}}}catch{}try{const resB=await fetch(urlB,{headers:{Accept:"text/html"},cache:"no-store"});if(resB.ok){const rawHTML=await resB.text(),arr=parseMaybeWrapped(rawHTML);if(arr.length)return arr}}catch{}return fallbackBoosters()}function ampRoot(){return document.querySelector("#slidecarthq .free-gifts .free-gifts-body")}function findAmpGiftSelect({variantId,productId}={}){const root=ampRoot();if(!root)return null;if(productId){const sel=root.querySelector(`#productInfoVariant${productId}`);if(sel)return sel}const selects=root.querySelectorAll('.free-gifts-options select[id^="productInfoVariant"]');for(const s of selects)if([...s.options].some(o=>o.value===String(variantId)))return s;return null}async function ampPickGiftAndAdd({variantId,productId}){let sel=null,tries=0;for(;!sel&&tries++<15;)sel=findAmpGiftSelect({variantId,productId}),sel||await new Promise(r=>setTimeout(r,120));if(!sel)return!1;sel.value!==String(variantId)&&(sel.value=String(variantId)),sel.dispatchEvent(new Event("input",{bubbles:!0})),sel.dispatchEvent(new Event("change",{bubbles:!0}));const item=sel.closest('[data-testid="FreeGiftsItem"]')||sel.closest(".free-gifts-item"),addBtn=item?item.querySelector(".free-gifts-add-button"):null;return await new Promise(r=>setTimeout(r,150)),addBtn?(addBtn.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0})),await new Promise(r=>setTimeout(r,350)),!0):!1}async function buildModal(){if(document.getElementById("itb-add-50ml-modal"))return;const wrap=document.createElement("div");wrap.id="itb-add-50ml-modal",wrap.innerHTML=`
67      <div class="backdrop" data-close></div>
68      <div class="panel">
69        <button type="button" class="close-btn" data-close aria-label="Close">\xD7</button>
70        <div class="itb-modal-container">
71          <h3 style="margin-bottom: 15px; text-align:center">Choose another favourite</h3>
72          <div class="section-host" data-role="section-host"></div>
73        </div>
74      </div>`,document.body.appendChild(wrap),wrap.addEventListener("click",e=>{e.target.dataset.close!==void 0&&closeModal()})}async function rebuildIframe(){const shell=document.getElementById("itb-add-50ml-modal");if(!shell)return;const host=shell.querySelector('[data-role="section-host"]');if(!host)return;host.innerHTML="",ITB_IFRAME=null;const html=await fetchSectionHTML(),tmp=document.createElement("div");tmp.innerHTML=html;const links=Array.from(tmp.querySelectorAll('link[rel="stylesheet"]')).map(l=>l.outerHTML).join(`
75`),scriptsSrc=Array.from(tmp.querySelectorAll("script[src]")).map(s=>s.outerHTML).join(`
76`),scriptsInline=Array.from(tmp.querySelectorAll("script:not([src])")).map(s=>s.textContent).join(`
77`),root=tmp.querySelector('[data-grid="full"]')||tmp.querySelector(".itb-fragrances-gri
77d-BuyFullChoose50ml")||tmp.firstElementChild;if(!root)throw new Error("Section root not found");const sectionAlreadyHasModal=!!root.querySelector("#perfumeInfo"),srcdoc=`
78<!doctype html>
79<html>
80<head>
81<meta charset="utf-8">
82<base href="${location.origin}/">
83<meta name="viewport" content="width=device-width, initial-scale=1">
84<style>
85      html,body{margin:0;padding:0}
86      .itb-recommended-only .element-item:not(.is-recommended){ display:none !important; }
87      #itb-iframe-root .recommendationInfo{ display:none !important; }
88      #itb-cta{
89        position: sticky; bottom: 0; z-index: 5;
90        background: linear-gradient(180deg, rgba(255,255,255,0) 0%, #fff 24%);
91        padding: 8px 0 calc(env(safe-area-inset-bottom, 0px) + 10px);
92        display: flex; justify-content: center;
93      }
94      #itb-add-to-cart-iframe{ min-width: 240px; }
95      @media (max-width:480px){ #itb-add-to-cart-iframe{ width:100%; } }
96    </style>
97${links}
98</head>
99<body>
100  <div id="itb-iframe-root">
101    ${root.outerHTML}
102    ${sectionAlreadyHasModal?"":`
103    <div class="modal fade" id="perfumeInfo" tabindex="-1" aria-hidden="true">
104      <div class="modal-dialog modal-lg modal-dialog-centered">
105        <div class="modal-content rounded-0">
106          <div class="modal-header">
107            <h5 class="modal-title text-uppercase mb-0" data-role="title"></h5>
108            <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
109          </div>
110          <div class="modal-body">
111        <div class="container-fluid">
112          <div class="row">
113            <div class="col-5 col-lg-6">
114              <img src="" alt="image" class="img-fluid" data-role="image">
115            </div>
116            <div class="col-7 col-lg-6 mt-3 mt-lg-0 d-flex flex-column h-100">
117                <p class="h6 text-muted mb-1" data-role="families"></p>
118              <div class="sw-modal-prod-desc mb-4">
119                <div class="d-flex flex-column mt-1 row-cols-1">
120                  <div class="mt-2">
121                    <p class="sw-p24 fw-bold mb-0">Top Notes:</p>
122                    <p class="mb-0" data-role="top">top</p>
123                  </div>
124                  <div class="mt-2">
125                    <p class="sw-p24 fw-bold mb-0">Heart Notes:</p>
126                    <p class="mb-0" data-role="heart">heart</p>
127                  </div>
128                  <div class="mt-2">
129                    <p class="sw-p24 fw-bold mb-0">Base Notes:</p>
130                    <p class="mb-0" data-role="base">base</p>
131                  </div>
132                </div>
133              </div>
134              <p class="small text-muted d-none" data-role="booster-desc"></p>
135            </div>
136          </div>
137        </div>
138          </div>
139        </div>
140      </div>
141    </div>`}
142  </div>
143
144  ${scriptsSrc}
145  ${scriptsInline?`<script>(function(){ ${scriptsInline} })();<\/script>`:""}
146  <script>
147(function(){
148  function onReady(fn){
149    if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', fn, { once:true });
150    else fn();
151  }
152
153  function setCTAEnabled(on){
154    var cta = document.getElementById('itb-add-to-cart-iframe');
155    if (!cta) return;
156    if (on) cta.removeAttribute('disabled');
157    else    cta.setAttribute('disabled','true');
158  }
159
160  function forceSectionRefilter(){
161    var sel = document.querySelector('.filters-select');
162    if (sel){
163      const val = sel.value;
164      sel.value = val;
165      sel.dispatchEvent(new Event('change', { bubbles:true }));
166    }
167    try {
168      var grid = document.querySelector('[data-grid="full"] .grid') || document.querySelector('.grid');
169      if (!grid) return;
170      if (window.jQuery && window.jQuery.fn && window.jQuery.fn.isotope){
171        var $g = window.jQuery(grid);
172        if ($g.data('isotope')){
173          $g.isotope('updateSortData');
174          $g.isotope({ sortBy:['reco','titleAZ'], sortAscending:true });
175          $g.isotope('layout');
176        }
177      } else if (window.Isotope && window.Isotope.data){
178        var iso = window.Isotope.data(grid);
179        if (iso){
180          iso.updateSortData();
181          iso.arrange({ sortBy:['reco','titleAZ'], sortAscending:true });
182        }
183      }
184    } catch(_){}
185  }
186
187  function pumpRefilter(times, delay){
188    times = typeof times==='number' ? times : 6;
189    delay = typeof delay==='number' ? delay : 140;
190    let i = 0;
191    (function run(){
192      forceSectionRefilter();
193      if (++i < times) setTimeout(run, delay);
194    })();
195  }
196
197  function bindSmartSearch(){
198    var input = document.getElementById('fullSearch');
199    var sel   = document.querySelector('.filters-select');
200    if (!input || !sel || input.__itbSmartBound) return;
201    input.__itbSmartBound = true;
202
203    var prevSet = null;
204    var inSearch = false;
205
206    var deb = (fn,t)=>{ let id; return function(){ clearTimeout(id); id=setTimeout(fn, t); }; };
207
208    input.addEventListener('input', deb(function(){
209      var q = (input.value || '').trim();
210      if (q && !inSearch){
211        prevSet  = sel.value;
212        inSearch = true;
213        if (sel.value !== '*'){
214          sel.value = '*';
215          sel.dispatchEvent(new Event('change', { bubbles:true }));
216        } else {
217          sel.dispatchEvent(new Event('change', { bubbles:true }));
218        }
219        pumpRefilter(4, 120);
220        return;
221      }
222
223      if (!q && inSearch){
224        inSearch = false;
225        if (prevSet && sel.value !== prevSet){
226          sel.value = prevSet;
227        }
228        sel.dispatchEvent(new Event('change', { bubbles:true }));
229        pumpRefilter(4, 120);
230        return;
231      }
232
233      pumpRefilter(2, 100);
234    }, 80));
235  }
236
237  function findCardByHandle(handleLc){
238    var grid = document.querySelector('[data-grid="full"] .grid') || document.querySelector('.grid');
239    if (!grid) return null;
240    var nodes = grid.querySelectorAll('.fragrance-item[data-handle]');
241    for (var i=0; i<nodes.length; i++){
242      var h = (nodes[i].getAttribute('data-handle') || '').toLowerCase();
243      if (h === handleLc) return nodes[i];
244    }
245    return null;
246  }
247
248  function markBoosters(items){
249    if (!Array.isArray(items) || !items.length) return 0;
250    var count = 0;
251    items.forEach(function(it){
252      var handleLc = (it && it.handle ? String(it.handle) : '').toLowerCase();
253      if (!handleLc) return;
254      var card = findCardByHandle(handleLc);
255      if (!card) return;
256      if (!card.classList.contains('is-recommended')){
257        card.classList.add('is-recommended');
258        count++;
259      }
260      var badge = card.querySelector('.badge-recommended, .badge-reco');
261      if (badge) badge.classList.remove('d-none');
262    });
263    return count;
264  }
265
266  window.addEventListener('message', function(ev){
267    var msg = ev.data || {};
268    if (msg.type === 'itb-append-boosters') {
269      markBoosters(msg.items || []);
270      pumpRefilter(8, 140);
271    }
272    if (msg.type === 'itb-reset') {
273      document.querySelectorAll('[data-grid="full"] .fragrance-item.is-recommended')
274        .forEach(function(el){
275          el.classList.remove('is-recommended');
276          var b = el.querySelector('.badge-recommended, .badge-reco');
277          if (b) b.classList.add('d-none');
278        });
279      setCTAEnabled(false);
280      pumpRefilter(6, 140);
281    }
282  }, { passive:true });
283
284  var _selectedBtn = null, _currentVid = null, _currentPid = null;
285
286  document.addEventListener('click', function(e){
287    var cta = e.target.closest('#itb-add-to-cart-iframe');
288    if (!cta) return;
289    e.preventDefault();
290    if (!_currentVid) return;
291    try {
292      parent.postMessage({
293        type: 'itb-amp-select',
294        variantId: Number(_currentVid),
295        productId: _currentPid ? Number(_currentPid) : undefined
296      }, '*');
297    } catch(_){}
298  });
299
300  function setCardButtonUI(btn, selected){
301    if (!btn) return;
302    if (selected) {
303      btn.classList.remove('btn-outline-dark');
304      btn.classList.add('btn','btn-dark');
305      btn.textContent = 'UNSELECT';
306      btn.dataset.selected = '1';
307    } else {
308      btn.classList.add('btn','btn-outline-dark');
309      btn.classList.remove('btn-dark');
310      btn.textContent = 'SELECT';
311      btn.removeAttribute('data-selected');
312    }
313  }
314
315  document.addEventListener('click', function(e){
316    var btn = e.target.closest('[data-role="select-product"]');
317    if (!btn) return;
318
319    var isOn = btn.dataset.selected === '1';
320    if (isOn){
321      setCardButtonUI(btn, false);
322      _selectedBtn = null;
323      _currentVid = null;
324      _currentPid = null;
325      setCTAEnabled(false);
326      return;
327    }
328
329    if (_selectedBtn && _selectedBtn !== btn) setCardButtonUI(_selectedBtn, false);
330    setCardButtonUI(btn, true);
331    _selectedBtn = btn;
332
333    var root = btn.closest('.element-item,.fragrance-item') || document.body;
334    var vid =
335      btn.getAttribute('data-variant-id') || btn.dataset.variantId ||
336      btn.getAttribute('data-vid')        || btn.dataset.vid        ||
337      root.getAttribute('data-vid')       || (root.dataset ? root.dataset.vid : '') || '';
338    var pid = root.getAttribute('data-pid') || (root.dataset ? root.dataset.pid : '') || '';
339
340    _currentVid = vid ? String(vid) : null;
341    _currentPid = pid ? Number(pid) : null;
342
343    setCTAEnabled(!!_currentVid);
344  });
345
346  onReady(function(){
347    setCTAEnabled(false);
348    bindSmartSearch();
349    pumpRefilter(2, 150);
350  });
351})();
352<\/script>
353
354  <div id="itb-cta"><button type="button" id="itb-add-to-cart-iframe" class="btn btn-dark" disabled>ADD TO CART</button></div>
355</body>
356</html>`.trim(),iframe=document.createElement("iframe");
356iframe.setAttribute("title","Choose another favourite"),iframe.style.width="100%",iframe.style.height="80vh",iframe.style.border="0",iframe.style.display="block",iframe.srcdoc=srcdoc,host.appendChild(iframe),ITB_IFRAME=iframe}function resetIframeState(){if(!(!ITB_IFRAME||!ITB_IFRAME.contentWindow))try{ITB_IFRAME.contentWindow.postMessage({type:"itb-reset"},"*")}catch{}}async function refreshGiftUI(){ensureCard(),toggleAmpGift(!0)}function sleep(ms){return new Promise(r=>setTimeout(r,ms))}async function waitCartIfFreshChange(threshold=800){Date.now()-LAST_CART_CHANGE<threshold&&await sleep(threshold)}async function openModal(){try{const css=ensureCssLink(BFG_CSS_URL,"itb-bfc50-css");await ensureJs(BFG_JS_URL,"itb-bfc50-js"),await waitCartIfFreshChange(900),await buildModal(),await rebuildIframe(),css&&(css.disabled=!1),document.getElementById("itb-add-50ml-modal").classList.add("open"),document.documentElement.classList.add("itb-modal-open"),await new Promise(res=>{if(!ITB_IFRAME||ITB_IFRAME.contentDocument?.readyState==="complete")return res();ITB_IFRAME.addEventListener("load",()=>res(),{once:!0})}),resetIframeState();const boosters=await fetchBoostersJSON();if(boosters&&boosters.length){const items=boosters.map(p=>({handle:String(p.handle||"").toLowerCase()})).filter(x=>x.handle);ITB_IFRAME.contentWindow.postMessage({type:"itb-append-boosters",items},"*")}}catch(e){console.error("[BuyFullChoose50ml] Failed to open modal",e)}}function closeModal(){const m=document.getElementById("itb-add-50ml-modal");if(m){const host=m.querySelector('[data-role="section-host"]');host&&(host.innerHTML=""),ITB_IFRAME=null,m.classList.remove("open")}document.documentElement.classList.remove("itb-modal-open");const css=document.getElementById("itb-bfc50-css");css&&(css.disabled=!0)}async function addGiftDirect({variantId}){try{if(!(await fetch("/cart/add.js",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({items:[{id:Number(variantId),quantity:1,properties:{_amp_gift:"bfc50"}}]}),cache:"no-store",credentials:"same-origin"})).ok)throw new Error("add.js failed");return invalidateCart(),await refreshSlideCart(),!0}catch(e){return console.error("[BuyFullChoose50ml] addGiftDirect failed",e),!1}}ITB_ONMSG_BOUND||(window.addEventListener("message",async ev=>{if(!ITB_IFRAME||ev.source!==ITB_IFRAME.contentWindow)return;const data=ev.data||{};(data.type==="itb-add-to-cart"||data.type==="itb-amp-select")&&data.variantId&&(await addGiftDirect({variantId:Number(data.variantId)}),closeModal(),await refreshGiftUI())},{passive:!0}),ITB_ONMSG_BOUND=!0);function waitForElm(sel){return new Promise(resolve=>{const e=document.querySelector(sel);if(e)return resolve(e);const mo=new MutationObserver(()=>{const n=document.querySelector(sel);n&&(mo.disconnect(),resolve(n))});mo.observe(document.documentElement,{childList:!0,subtree:!0})})}ITB_SECTION_CACHE=null;const debounce=(fn,t=60)=>{let id;return(...a)=>{clearTimeout(id),id=setTimeout(()=>fn(...a),t)}};function reattach(){document.querySelector("#slidecarthq .free-gifts .free-gifts-body")&&(addStyle(),invalidateCart(),ensureCard(),refreshGiftUI())}function boot(){addStyle(),toggleAmpGift(!0),ensureCard(),refreshGiftUI()}waitForElm("#slidecarthq .free-gifts .free-gifts-body").then(()=>{reattach();const target=document.querySelector("#slidecarthq .free-gifts .free-gifts-body");new MutationObserver(debounce(reattach,60)).observe(target,{childList:!0,subtree:!0})}),["itb:cart:refresh","cart:refresh","cart:changed","cart:updated","shopify:cart:refresh","SLIDECARTHQ:updated"].forEach(evt=>{const handler=()=>{ITB_SECTION_CACHE=null,invalidateCart(),refreshGiftUI()};window.addEventListener(evt,handler,{passive:!0}),document.addEventListener(evt,handler,{passive:!0})}),document.addEventListener("click",e=>{e.target.closest("#slidecarthq .free-gifts-add-button")&&(LAST_CART_CHANGE=Date.now(),invalidateCart(),setTimeout(refreshGiftUI,300))}),document.addEventListener("change",e=>{e.target.matches('#slidecarthq .free-gifts-options select[id^="productInfoVariant"]')&&(LAST_CART_CHANGE=Date.now(),invalidateCart(),setTimeout(refreshGiftUI,300))}),(function(){(sel=>new Promise(r=>{const e=document.querySelector(sel);if(e)return r(e);const mo=new MutationObserver(()=>{const n=document.querySelector(sel);n&&(mo.disconnect(),r(n))});mo.observe(document.documentElement,{childList:!0,subtree:!0})}
356))("#slidecarthq").then(drawer=>{let t;new MutationObserver(()=>{clearTimeout(t),t=setTimeout(()=>{reattach()},120)}).observe(drawer,{childList:!0,subtree:!0})})})(),document.addEventListener("shopify:section:load",reattach),document.addEventListener("itb:cart:refresh",reattach),boot()})();
357//# sourceMappingURL=/cdn/shop/t/43/assets/BuyFullChoose50ml-AmpSlideCard.js.map?v=101464286655002722001780145408

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.