1 2 3 <!DOCTYPE html> 4<html lang="en"> <head>
4<script>var _listeners=[];EventTarget.prototype.addEventListenerBase=EventTarget.prototype.addEventListener,EventTarget.prototype.addEventListener=function(e,t,p){_listeners.push({target:this,type:e,listener:t}),this.addEventListenerBase(e,t,p)},EventTarget.prototype.removeEventListeners=function(e){for(var t=0;t!=_listeners.length;t++){var r=_listeners[t],n=r.target,s=r.type,i=r.listener;n==this&&s==e&&this.removeEventListener(s,i)}};</script>
4<script type="text/worker" id="spdnworker">onmessage=function(e){var t=new Request("https://api.speedien.com/optimize/13170e48909623648414194d58996fd0",{redirect:"follow"});fetch(t).then(e=>e.text()).then(e=>{postMessage(e)})};</script>
vendor: 1 bytes, line 4
4
5<script type="text/javascript">var spdnx=new Worker("data:text/javascript;base64,"+btoa(document.getElementById("spdnworker").textContent));spdnx.onmessage=function(t){var e=document.createElement("script");e.type="text/javascript",e.textContent=t.data,document.head.appendChild(e)},spdnx.postMessage("init");</script>
vendor: 1 bytes, line 5
5
6<script type="text/javascript" data-spdn="1"> 7const observer=new MutationObserver(mutations=>{mutations.forEach(({addedNodes})=>{addedNodes.forEach(node=>{ 8if(node.tagName==='SCRIPT'&&node.innerHTML.includes('asyncLoad')){node.type='text/spdnscript'} 9if(node.nodeType===1&&node.tagName==='SCRIPT'&&node.innerHTML.includes('loox.io')){node.type='text/spdnscript'} 10if(node.nodeType===1&&node.tagName==='SCRIPT'&&node.innerHTML.includes('recaptcha')){node.type='text/spdnscript'} 11if(node.nodeType===1&&node.tagName==='SCRIPT'&&node.innerHTML.includes('facebook.net')){node.type='text/spdnscript'} 12if(node.nodeType===1&&node.tagName==='SCRIPT'&&node.innerHTML.includes('gtag')){node.type='text/spdnscript'} 13if(node.nodeType===1&&node.tagName==='SCRIPT'&&node.innerHTML.includes('tagmanager')){node.type='text/spdnscript'} 14if(node.nodeType===1&&node.tagName==='SCRIPT'&&node.innerHTML.includes('gtm')){node.type='text/spdnscript'} 15if(node.nodeType===1&&node.tagName==='SCRIPT'&&node.src.includes('googlet')){node.type='text/spdnscript'} 16if(node.tagName==='SCRIPT'&&node.className=='analytics'){node.type='text/spdnscript'} })})}) 17var ua = navigator.userAgent.toLowerCase();if ((ua.indexOf('chrome') > -1 || ua.indexOf('firefox') > -1) && window.location.href.indexOf("no-optimization") === -1) {observer.observe(document.documentElement,{childList:true,subtree:true})}</script>
17 <meta charset="utf-8"> <meta name="google-site-verification" content="c-Qp6nxUAM6jGt34ZxlSPoFyPph2xWYiI4dsd77bEY0" /> <meta http-equiv="cleartype" content="on"> <meta name="robots" content="index,follow"> <!-- Mobile Specific Metas --> <meta name="HandheldFriendly" content="True"> <meta name="MobileOptimized" content="320"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#ffffff"> <title> 18 Bacon's Heir - Bacon's Heir</title> <link rel="preconnect dns-prefetch" href="https://fonts.shopifycdn.com" /> <link rel="preconnect dns-prefetch" href="https://cdn.shopify.com" /> <link rel="preconnect dns-prefetch" href="https://v.shopify.com" /> <link rel="preconnect dns-prefetch" href="https://cdn.shopifycloud.com" /> <link rel="preload" href="//baconsheir.com/cdn/shop/t/84/assets/styles.scss.css?v=64795224620715278821700515196" as="style"> <link rel="preload" href="https://ro.boldapps.net/v2_ui/js/ro.js" as="script"> <link rel="preload" href="//baconsheir.com/cdn/shop/t/84/assets/jquery.min.js?v=9503732020592794151700515182" as="script"> <link href="//baconsheir.com/cdn/shop/t/84/assets/styles.scss.css?v=64795224620715278821700515196" rel="stylesheet" type="text/css" media="all" />
18<script> 19 var slick = "//baconsheir.com/cdn/shop/t/84/assets/slick.min.css?v=175860740691850480211700515183";</script>
19
vendor: 4,501 bytes, lines 19-26
19<script> 20 window.lazySizesConfig = window.lazySizesConfig || {}; 21 22 lazySizesConfig.expand = 300; 23 lazySizesConfig.loadHidden = false; 24 25 /*! lazysizes - v4.1.4 */ 26 !function(a,b){var c=b(a,a.document);a.lazySizes=c,"object"==typeof module&&module.exports&&(module.exports=c)}(window,function(a,b){"use strict";if(b.getElementsByClassName){var c,d,e=b.documentElement,f=a.Date,g=a.HTMLPictureElement,h="addEventListener",i="getAttribute",j=a[h],k=a.setTimeout,l=a.requestAnimationFrame||k,m=a.requestIdleCallback,n=/^picture$/i,o=["load","error","lazyincluded","_lazyloaded"],p={},q=Array.prototype.forEach,r=function(a,b){return p[b]||(p[b]=new RegExp("(\\s|^)"+b+"(\\s|$)")),p[b].test(a[i]("class")||"")&&p[b]},s=function(a,b){r(a,b)||a.setAttribute("class",(a[i]("class")||"").trim()+" "+b)},t=function(a,b){var c;(c=r(a,b))&&a.setAttribute("class",(a[i]("class")||"").replace(c," "))},u=function(a,b,c){var d=c?h:"removeEventListener";c&&u(a,b),o.forEach(function(c){a[d](c,b)})},v=function(a,d,e,f,g){var h=b.createEvent("Event");return e||(e={}),e.instance=c,h.initEvent(d,!f,!g),h.detail=e,a.dispatchEvent(h),h},w=function(b,c){var e;!g&&(e=a.picturefill||d.pf)?(c&&c.src&&!b[i]("srcset")&&b.setAttribute("srcset",c.src),e({reevaluate:!0,elements:[b]})):c&&c.src&&(b.src=c.src)},x=function(a,b){return(getComputedStyle(a,null)||{})[b]},y=function(a,b,c){for(c=c||a.offsetWidth;c<d.minSize&&b&&!a._lazysizesWidth;)c=b.offsetWidth,b=b.parentNode;return c},z=function(){var a,c,d=[],e=[],f=d,g=function(){var b=f;for(f=d.length?e:d,a=!0,c=!1;b.length;)b.shift()();a=!1},h=function(d,e){a&&!e?d.apply(this,arguments):(f.push(d),c||(c=!0,(b.hidden?k:l)(g)))};return h._lsFlush=g,h}(),A=function(a,b){return b?function(){z(a)}:function(){var b=this,c=arguments;z(function(){a.apply(b,c)})}},B=function(a){var b,c=0,e=d.throttleDelay,g=d.ricTimeout,h=function(){b=!1,c=f.now(),a()},i=m&&g>49?function(){m(h,{timeout:g}),g!==d.ricTimeout&&(g=d.ricTimeout)}:A(function(){k(h)},!0);return function(a){var d;(a=a===!0)&&(g=33),b||(b=!0,d=e-(f.now()-c),0>d&&(d=0),a||9>d?i():k(i,d))}},C=function(a){var b,c,d=99,e=function(){b=null,a()},g=function(){var a=f.now()-c;d>a?k(g,d-a):(m||e)(e)};return function(){c=f.now(),b||(b=k(g,d))}};!function(){var b,c={lazyClass:"lazyload",loadedClass:"lazyloaded",loadingClass:"lazyloading",preloadClass:"lazypreload",errorClass:"lazyerror",autosizesClass:"lazyautosizes",srcAttr:"data-src",srcsetAttr:"data-srcset",sizesAttr:"data-sizes",minSize:40,customMedia:{},init:!0,expFactor:1.5,hFac:.8,loadMode:2,loadHidden:!0,ricTimeout:0,throttleDelay:125};d=a.lazySizesConfig||a.lazysizesConfig||{};for(b in c)b in d||(d[b]=c[b]);a.lazySizesConfig=d,k(function(){d.init&&F()})}();var D=function(){var g,l,m,o,p,y,D,F,G,H,I,J,K,L,M=/^img$/i,N=/^iframe$/i,O="onscroll"in a&&!/(gle|ing)bot/.test(navigator.userAgent),P=0,Q=0,R=0,S=-1,T=function(a){R--,a&&a.target&&u(a.target,T),(!a||0>R||!a.target)&&(R=0)},U=function(a,c){var d,f=a,g="hidden"==x(b.body,"visibility")||"hidden"!=x(a.parentNode,"visibility")&&"hidden"!=x(a,"visibility");for(F-=c,I+=c,G-=c,H+=c;g&&(f=f.offsetParent)&&f!=b.body&&f!=e;)g=(x(f,"opacity")||1)>0,g&&"visible"!=x(f,"overflow")&&(d=f.getBoundingClientRect(),g=H>d.left&&G<d.right&&I>d.top-1&&F<d.bottom+1);return g},V=function(){var a,f,h,j,k,m,n,p,q,r=c.elements;if((o=d.loadMode)&&8>R&&(a=r.length)){f=0,S++,null==K&&("expand"in d||(d.expand=e.clientHeight>500&&e.clientWidth>500?500:370),J=d.expand,K=J*d.expFactor),K>Q&&1>R&&S>2&&o>2&&!b.hidden?(Q=K,S=0):Q=o>1&&S>1&&6>R?J:P;for(;a>f;f++)if(r[f]&&!r[f]._lazyRace)if(O)if((p=r[f][i]("data-expand"))&&(m=1*p)||(m=Q),q!==m&&(y=innerWidth+m*L,D=innerHeight+m,n=-1*m,q=m),h=r[f].getBoundingClientRect(),(I=h.bottom)>=n&&(F=h.top)<=D&&(H=h.right)>=n*L&&(G=h.left)<=y&&(I||H||G||F)&&(d.loadHidden||"hidden"!=x(r[f],"visibility"))&&(l&&3>R&&!p&&(3>o||4>S)||U(r[f],m))){if(ba(r[f]),k=!0,R>9)break}else!k&&l&&!j&&4>R&&4>S&&o>2&&(g[0]||d.preloadAfterLoad)&&(g[0]||!p&&(I||H||G||F||"auto"!=r[f][i](d.sizesAttr)))&&(j=g[0]||r[f]);else ba(r[f]);j&&!k&&ba(j)}},W=B(V),X=function(a){s(a.target,d.loadedClass),t(a.target,d.loadingClass),u(a.target,Z),v(a.target,"lazyloaded")},Y=A(X),Z=function(a){Y({target:a.target})},$=function(a,b){try{a.contentWindow.location.replace(b)}catch(c){a.src=b}},_=function(a){var b,c=a[i](d.srcsetAttr);(b=d.customMedia[a[i]("data-media")||a[i]("media")])&&a.setAttribute("media",b),c&&a.setAttribute("srcset",c)},aa=A(function(a,b,c,e,f){var g,h,j,l,o,p;
26(o=v(a,"lazybeforeunveil",b)).defaultPrevented||(e&&(c?s(a,d.autosizesClass):a.setAttribute("sizes",e)),h=a[i](d.srcsetAttr),g=a[i](d.srcAttr),f&&(j=a.parentNode,l=j&&n.test(j.nodeName||"")),p=b.firesLoad||"src"in a&&(h||g||l),o={target:a},p&&(u(a,T,!0),clearTimeout(m),m=k(T,2500),s(a,d.loadingClass),u(a,Z,!0)),l&&q.call(j.getElementsByTagName("source"),_),h?a.setAttribute("srcset",h):g&&!l&&(N.test(a.nodeName)?$(a,g):a.src=g),f&&(h||l)&&w(a,{src:g})),a._lazyRace&&delete a._lazyRace,t(a,d.lazyClass),z(function(){(!p||a.complete&&a.naturalWidth>1)&&(p?T(o):R--,X(o))},!0)}),ba=function(a){var b,c=M.test(a.nodeName),e=c&&(a[i](d.sizesAttr)||a[i]("sizes")),f="auto"==e;(!f&&l||!c||!a[i]("src")&&!a.srcset||a.complete||r(a,d.errorClass)||!r(a,d.lazyClass))&&(b=v(a,"lazyunveilread").detail,f&&E.updateElem(a,!0,a.offsetWidth),a._lazyRace=!0,R++,aa(a,b,f,e,c))},ca=function(){if(!l){if(f.now()-p<999)return void k(ca,999);var a=C(function(){d.loadMode=3,W()});l=!0,d.loadMode=3,W(),j("scroll",function(){3==d.loadMode&&(d.loadMode=2),a()},!0)}};return{_:function(){p=f.now(),c.elements=b.getElementsByClassName(d.lazyClass),g=b.getElementsByClassName(d.lazyClass+" "+d.preloadClass),L=d.hFac,j("scroll",W,!0),j("resize",W,!0),a.MutationObserver?new MutationObserver(W).observe(e,{childList:!0,subtree:!0,attributes:!0}):(e[h]("DOMNodeInserted",W,!0),e[h]("DOMAttrModified",W,!0),setInterval(W,999)),j("hashchange",W,!0),["focus","mouseover","click","load","transitionend","animationend","webkitAnimationEnd"].forEach(function(a){b[h](a,W,!0)}),/d$|^c/.test(b.readyState)?ca():(j("load",ca),b[h]("DOMContentLoaded",W),k(ca,2e4)),c.elements.length?(V(),z._lsFlush()):W()},checkElems:W,unveil:ba}}(),E=function(){var a,c=A(function(a,b,c,d){var e,f,g;if(a._lazysizesWidth=d,d+="px",a.setAttribute("sizes",d),n.test(b.nodeName||""))for(e=b.getElementsByTagName("source"),f=0,g=e.length;g>f;f++)e[f].setAttribute("sizes",d);c.detail.dataAttr||w(a,c.detail)}),e=function(a,b,d){var e,f=a.parentNode;f&&(d=y(a,f,d),e=v(a,"lazybeforesizes",{width:d,dataAttr:!!b}),e.defaultPrevented||(d=e.detail.width,d&&d!==a._lazysizesWidth&&c(a,f,e,d)))},f=function(){var b,c=a.length;if(c)for(b=0;c>b;b++)e(a[b])},g=C(f);return{_:function(){a=b.getElementsByClassName(d.autosizesClass),j("resize",g)},checkElems:g,updateElem:e}}(),F=function(){F.i||(F.i=!0,E._(),D._())};return c={cfg:d,autoSizer:E,loader:D,init:F,uP:w,aC:s,rC:t,hC:r,fire:v,gW:y,rAF:z}}}); 27 28 /*! lazysizes - v4.1.4 */ 29 !function(a,b){var c=function(){b(a.lazySizes),a.removeEventListener("lazyunveilread",c,!0)};b=b.bind(null,a,a.document),"object"==typeof module&&module.exports?b(require("lazysizes")):a.lazySizes?c():a.addEventListener("lazyunveilread",c,!0)}(window,function(a,b,c){"use strict";function d(){this.ratioElems=b.getElementsByClassName("lazyaspectratio"),this._setupEvents(),this.processImages()}if(a.addEventListener){var e,f,g,h=Array.prototype.forEach,i=/^picture$/i,j="data-aspectratio",k="img["+j+"]",l=function(b){return a.matchMedia?(l=function(a){return!a||(matchMedia(a)||{}).matches})(b):a.Modernizr&&Modernizr.mq?!b||Modernizr.mq(b):!b},m=c.aC,n=c.rC,o=c.cfg;d.prototype={_setupEvents:function(){var a=this,c=function(b){b.naturalWidth<36?a.addAspectRatio(b,!0):a.removeAspectRatio(b,!0)},d=function(){a.processImages()};b.addEventListener("load",function(a){a.target.getAttribute&&a.target.getAttribute(j)&&c(a.target)},!0),addEventListener("resize",function(){var b,d=function(){h.call(a.ratioElems,c)};return function(){clearTimeout(b),b=setTimeout(d,99)}}()),b.addEventListener("DOMContentLoaded",d),addEventListener("load",d)},processImages:function(a){var c,d;a||(a=b),c="length"in a&&!a.nodeName?a:a.querySelectorAll(k);for(d=0;d<c.length;d++)c[d].naturalWidth>36?this.removeAspectRatio(c[d]):this.addAspectRatio(c[d])},getSelectedRatio:function(a){var b,c,d,e,f,g=a.parentNode;if(g&&i.test(g.nodeName||""))for(d=g.getElementsByTagName("source"),b=0,c=d.length;c>b;b++)if(e=d[b].getAttribute("data-media")||d[b].getAttribute("media"),o.customMedia[e]&&(e=o.customMedia[e]),l(e)){f=d[b].getAttribute(j);break}return f||a.getAttribute(j)||""},parseRatio:function(){var a=/^\s*([+\d\.]+)(\s*[\/x]\s*([+\d\.]+))?\s*$/,b={};return function(c){var d;return!b[c]&&(d=c.match(a))&&(d[3]?b[c]=d[1]/d[3]:b[c]=1*d[1]),b[c]}}(),addAspectRatio:function(b,c){var d,e=b.offsetWidth,f=b.offsetHeight;return c||m(b,"lazyaspectratio"),36>e&&0>=f?void((e||f&&a.console)&&console.log("Define width or height of image, so we can calculate the other dimension")):(d=this.getSelectedRatio(b),d=this.parseRatio(d),void(d&&(e?b.style.height=e/d+"px":b.style.width=f*d+"px")))},removeAspectRatio:function(a){n(a,"lazyaspectratio"),a.style.height="",a.style.width="",a.removeAttribute(j)}},f=function(){g=a.jQuery||a.Zepto||a.shoestring||a.$,g&&g.fn&&!g.fn.imageRatio&&g.fn.filter&&g.fn.add&&g.fn.find?g.fn.imageRatio=function(){return e.processImages(this.find(k).add(this.filter(k))),this}:g=!1},f(),setTimeout(f),e=new d,a.imageRatio=e,"object"==typeof module&&module.exports?module.exports=e:"function"==typeof define&&define.amd&&define(e)}}); 30 31 /*! lazysizes - v4.1.5 */ 32 !function(a,b){var c=function(){b(a.lazySizes),a.removeEventListener("lazyunveilread",c,!0)};b=b.bind(null,a,a.document),"object"==typeof module&&module.exports?b(require("lazysizes")):a.lazySizes?c():a.addEventListener("lazyunveilread",c,!0)}(window,function(a,b,c){"use strict";if(a.addEventListener){var d=/\s+/g,e=/\s*\|\s+|\s+\|\s*/g,f=/^(.+?)(?:\s+\[\s*(.+?)\s*\])(?:\s+\[\s*(.+?)\s*\])?$/,g=/^\s*\(*\s*type\s*:\s*(.+?)\s*\)*\s*$/,h=/\(|\)|'/,i={contain:1,cover:1},j=function(a){var b=c.gW(a,a.parentNode);return(!a._lazysizesWidth||b>a._lazysizesWidth)&&(a._lazysizesWidth=b),a._lazysizesWidth},k=function(a){var b;return b=(getComputedStyle(a)||{getPropertyValue:function(){}}).getPropertyValue("background-size"),!i[b]&&i[a.style.backgroundSize]&&(b=a.style.backgroundSize),b},l=function(a,b){if(b){var c=b.match(g);c&&c[1]?a.setAttribute("type",c[1]):a.setAttribute("media",lazySizesConfig.customMedia[b]||b)}},m=function(a,c,g){var h=b.createElement("picture"),i=c.getAttribute(lazySizesConfig.sizesAttr),j=c.getAttribute("data-ratio"),k=c.getAttribute("data-optimumx");c._lazybgset&&c._lazybgset.parentNode==c&&c.removeChild(c._lazybgset),Object.defineProperty(g,"_lazybgset",{value:c,writable:!0}),Object.defineProperty(c,"_lazybgset",{value:h,writable:!0}),a=a.replace(d," ").split(e),h.style.display="none",g.className=lazySizesConfig.lazyClass,1!=a.length||i||(i="auto"),a.forEach(function(a){var c,d=b.createElement("source");i&&"auto"!=i&&d.setAttribute("sizes",i),(c=a.match(f))?(d.setAttribute(lazySizesConfig.srcsetAttr,c[1]),l(d,c[2]),l(d,c[3])):d.setAttribute(lazySizesConfig.srcsetAttr,a),h.appendChild(d)}),i&&(g.setAttribute(lazySizesConfig.sizesAttr,i),c.removeAttribute(lazySizesConfig.sizesAttr),c.removeAttribute("sizes")),k&&g.setAttribute("data-optimumx",k),j&&g.setAttribute("data-ratio",j),h.appendChild(g),c.appendChild(h)}
32,n=function(a){if(a.target._lazybgset){var b=a.target,d=b._lazybgset,e=b.currentSrc||b.src;if(e){var f=c.fire(d,"bgsetproxy",{src:e,useSrc:h.test(e)?JSON.stringify(e):e});f.defaultPrevented||(d.style.backgroundImage="url("+f.detail.useSrc+")")}b._lazybgsetLoading&&(c.fire(d,"_lazyloaded",{},!1,!0),delete b._lazybgsetLoading)}};addEventListener("lazybeforeunveil",function(a){var d,e,f;!a.defaultPrevented&&(d=a.target.getAttribute("data-bgset"))&&(f=a.target,e=b.createElement("img"),e.alt="",e._lazybgsetLoading=!0,a.detail.firesLoad=!0,m(d,f,e),setTimeout(function(){c.loader.unveil(e),c.rAF(function(){c.fire(e,"_lazyloaded",{},!0,!0),e.complete&&n({target:e})})}))}),b.addEventListener("load",n,!0),a.addEventListener("lazybeforesizes",function(a){if(a.detail.instance==c&&a.target._lazybgset&&a.detail.dataAttr){var b=a.target._lazybgset,d=k(b);i[d]&&(a.target._lazysizesParentFit=d,c.rAF(function(){a.target.setAttribute("data-parent-fit",d),a.target._lazysizesParentFit&&delete a.target._lazysizesParentFit}))}},!0),b.documentElement.addEventListener("lazybeforesizes",function(a){!a.defaultPrevented&&a.target._lazybgset&&a.detail.instance==c&&(a.detail.width=j(a.target._lazybgset))})}});</script>
32 <link rel="shortcut icon" type="image/x-icon" href="//baconsheir.com/cdn/shop/files/favicon_180x180.png?v=1613673148"> <link rel="apple-touch-icon" href="//baconsheir.com/cdn/shop/files/favicon_180x180.png?v=1613673148"/> <link rel="apple-touch-icon" sizes="57x57" href="//baconsheir.com/cdn/shop/files/favicon_57x57.png?v=1613673148"/> <link rel="apple-touch-icon" sizes="60x60" href="//baconsheir.com/cdn/shop/files/favicon_60x60.png?v=1613673148"/> <link rel="apple-touch-icon" sizes="72x72" href="//baconsheir.com/cdn/shop/files/favicon_72x72.png?v=1613673148"/> <link rel="apple-touch-icon" sizes="76x76" href="//baconsheir.com/cdn/shop/files/favicon_76x76.png?v=1613673148"/> <link rel="apple-touch-icon" sizes="114x114" href="//baconsheir.com/cdn/shop/files/favicon_114x114.png?v=1613673148"/> <link rel="apple-touch-icon" sizes="180x180" href="//baconsheir.com/cdn/shop/files/favicon_180x180.png?v=1613673148"/> <link rel="apple-touch-icon" sizes="228x228" href="//baconsheir.com/cdn/shop/files/favicon_228x228.png?v=1613673148"/> <link rel="canonical" href="https://baconsheir.com/apps/store-locator" /> 33 34 35 36 37 38 39 40
40<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script>
40<meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/8934036/digital_wallets/dialog"> 41<meta id="in-context-paypal-metadata" data-shop-id="8934036" data-venmo-supported="false" data-environment="production" data-locale="en_US" data-paypal-v4="true" data-currency="USD"> 42<link rel="ucp" href="/.well-known/ucp" version="2026-08-25">
42<script async="async" data-src="/checkouts/internal/preloads.js?locale=en-US"></script>
42 43<link rel="preconnect" href="https://shop.app" crossorigin="anonymous">
44<script async="async" data-src="https://shop.app/checkouts/internal/preloads.js?locale=en-US&shop_id=8934036" crossorigin="anonymous"></script>
vendor: 1 bytes, line 44
44
45<script id="apple-pay-shop-capabilities" type="application/json">{"shopId":8934036,"countryCode":"US","currencyCode":"USD","merchantCapabilities":["supports3DS"],"merchantId":"gid:\/\/shopify\/Shop\/8934036","merchantName":"Bacon's Heir","requiredBillingContactFields":["postalAddress","email"],"requiredShippingContactFields":["postalAddress","email"],"shippingType":"shipping","supportedNetworks":["visa","masterCard","amex","discover","elo","jcb"],"total":{"type":"pending","label":"Bacon's Heir","amount":"1.00"},"shopifyPaymentsEnabled":true,"supportsSubscriptions":true}</script>
vendor: 1 bytes, line 45
45
46<script id="shopify-features" type="application/json">{"accessToken":"e9c23d0f6b8b03036d15a3c280cff6f7","betas":["rich-media-storefront-analytics"],"domain":"baconsheir.com","predictiveSearch":true,"shopId":8934036,"locale":"en"}</script>
vendor: 1 bytes, line 46
46
47<script>var Shopify = Shopify || {}; 48Shopify.shop = "bacons-heir.myshopify.com"; 49Shopify.locale = "en"; 50Shopify.currency = {"active":"USD","rate":"1.0"}; 51Shopify.country = "US"; 52Shopify.theme = {"name":"Live theme [awt 23-11-20]","id":125852352560,"schema_name":"Turbo","schema_version":"4.1.2","theme_store_id":null,"role":"main"}; 53Shopify.theme.handle = "null"; 54Shopify.theme.style = {"id":null,"handle":null}; 55Shopify.cdnHost = "baconsheir.com/cdn"; 56Shopify.routes = Shopify.routes || {}; 57Shopify.routes.root = "/"; 58Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js"; 59Shopify.SignInWithShop = Shopify.SignInWithShop || {}; 60Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {}; 61Shopify.SignInWithShop.User.recognized = false;</script>
vendor: 1 bytes, line 61
61
62<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
vendor: 1 bytes, line 62
62
63<script>!function(o){function n(){var o=[];function n(){o.push(Array.prototype.slice.apply(arguments))}return n.q=o,n}var t=o.Shopify=o.Shopify||{};t.loadFeatures=n(),t.autoloadFeatures=n()}(window);</script>
vendor: 1 bytes, line 63
63
64<script> 65 window.ShopifyPay = window.ShopifyPay || {}; 66 window.ShopifyPay.apiHost = "shop.app\/pay"; 67 window.ShopifyPay.redirectState = null; 68</script>
vendor: 1 bytes, line 68
68
69<script> 70 window.Shopify = window.Shopify || {}; 71 window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {}; 72 window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.25 }; 73 window.Shopify.SignInWithShop.eligible = true; 74</script>
vendor: 1 bytes, line 74
74
75<script type="no-load" async type="module" data-src="https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"></script>
vendor: 1 bytes, line 75
75
76<script type="module"> 77 await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"); 78 79 window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true}); 80 81</script>
vendor: 1 bytes, line 81
81
82<script> 83 window.Shopify = window.Shopify || {}; 84 if (!window.Shopify.featureAssets) window.Shopify.featureAssets = {}; 85 window.Shopify.featureAssets['shop-js'] = {"avatar":["modules/v2/loader.avatar.en.esm.js"],"checkout-modal":["modules/v2/loader.checkout-modal.en.esm.js"],"init-customer-accounts-sign-up":["modules/v2/loader.init-customer-accounts-sign-up.en.esm.js"],"init-customer-accounts":["modules/v2/loader.init-customer-accounts.en.esm.js"],"init-fed-cm":["modules/v2/loader.init-fed-cm.en.esm.js"],"init-shop-cart-sync":["modules/v2/loader.init-shop-cart-sync.en.esm.js"],"init-shop-email-lookup-coordinator":["modules/v2/loader.init-shop-email-lookup-coordinator.en.esm.js"],"init-shop-for-new-customer-accounts":["modules/v2/loader.init-shop-for-new-customer-accounts.en.esm.js"],"init-shop-user-recognition":["modules/v2/loader.init-shop-user-recognition.en.esm.js"],"init-windoid":["modules/v2/loader.init-windoid.en.esm.js"],"lead-capture":["modules/v2/loader.lead-capture.en.esm.js"],"listener":["modules/v2/loader.listener.en.esm.js"],"pay-button":["modules/v2/loader.pay-button.en.esm.js"],"payment-terms":["modules/v2/loader.payment-terms.en.esm.js"],"shop-button":["modules/v2/loader.shop-button.en.esm.js"],"shop-cart-sync":["modules/v2/loader.shop-cart-sync.en.esm.js"],"shop-cash-offers":["modules/v2/loader.shop-cash-offers.en.esm.js"],"shop-follow-button":["modules/v2/loader.shop-follow-button.en.esm.js"],"shop-login-button":["modules/v2/loader.shop-login-button.en.esm.js"],"shop-login":["modules/v2/loader.shop-login.en.esm.js"],"shop-toast-manager":["modules/v2/loader.shop-toast-manager.en.esm.js"],"shop-user-recognition":["modules/v2/loader.shop-user-recognition.en.esm.js"]}; 86</script>
vendor: 1 bytes, line 86
86
87<script>(function() { 88 var isLoaded = false; 89 function asyncLoad() { 90 if (isLoaded) return; 91 isLoaded = true; 92 var urls = ["https:\/\/static.klaviyo.com\/onsite\/js\/klaviyo.js?company_id=Jcz7Sj\u0026shop=bacons-heir.myshopify.com","https:\/\/storelocator.w3apps.co\/js\/include.js?shop=bacons-heir.myshopify.com","https:\/\/shapp.bundlepayments.com\/widget-script?shop=bacons-heir.myshopify.com"]; 93 for (var i = 0; i <urls.length; i++) { 94 var s = document.createElement('script'); 95 s.type = 'text/javascript'; 96 s.async = true; 97 s.src = urls[i]; 98 var x = document.getElementsByTagName('script')[0]; 99 x.parentNode.insertBefore(s, x); 100 } 101 }; 102 if(window.attachEvent) { 103 window.attachEvent('onload', asyncLoad); 104 } else { 105 window.addEventListener('ks_load', asyncLoad, false); 106 } 107})();</script>
vendor: 1 bytes, line 107
107
108<script id="__st">var __st={"a":8934036,"offset":-18000,"reqid":"dc34833c-b513-47f9-9893-2f5ad4c6d366-1791136217","pageurl":"baconsheir.com\/apps\/store-locator","u":"ac5c197dc072"};</script>
vendor: 1 bytes, line 108
108
109<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
vendor: 1 bytes, line 109
109
110<script id="captcha-bootstrap">!function(){'use strict';const t='contact',e='account',n='new_comment',o=[[t,t],['blogs',n],['comments',n],[t,'customer']],c=[[e,'customer_login'],[e,'guest_login'],[e,'recover_customer_password'],[e,'create_customer']],r=t=>t.map((([t,e])=>`form[action*='/${t}']:not([data-nocaptcha='true']) input[name='form_type'][value='${e}']`)).join(','),a=t=>()=>t?[...document.querySelectorAll(t)].map((t=>t.form)):[];function s(){const t=[...o],e=r(t);return a(e)}const i='password',u='form_key',d=['recaptcha-v3-token','g-recaptcha-response','h-captcha-response',i],f=()=>{try{return window.sessionStorage}catch{return}},m='__shopify_v',_=t=>t.elements[u];function p(t,e,n=!1){try{const o=window.sessionStorage,c=JSON.parse(o.getItem(e)),{data:r}=function(t){const{data:e,action:n}=t;return t[m]||n?{data:e,action:n}:{data:t,action:n}}(c);for(const[e,n]of Object.entries(r))t.elements[e]&&(t.elements[e].value=n);n&&o.removeItem(e)}catch(o){console.error('form repopulation failed',{error:o})}}const l='form_type',E='cptcha';function T(t){t.dataset[E]=!0}const w=window,h=w.document,L='Shopify',v='ce_forms',y='captcha';let A=!1;((t,e)=>{const n=(g='f06e6c50-85a8-45c8-87d0-21a2b65856fe',I='https://cdn.shopify.com/shopifycloud/storefront-forms-hcaptcha/ce_storefront_forms_captcha_hcaptcha.v1.5.3.iife.js',D={infoText:'Protected by hCaptcha',privacyText:'Privacy',termsText:'Terms'},(t,e,n)=>{const o=w[L][v],c=o.bindForm;if(c)return c(t,g,e,D).then(n);var r;o.q.push([[t,g,e,D],n]),r=I,A||(h.body.append(Object.assign(h.createElement('script'),{id:'captcha-provider',async:!0,src:r})),A=!0)});var g,I,D;w[L]=w[L]||{},w[L][v]=w[L][v]||{},w[L][v].q=[],w[L][y]=w[L][y]||{},w[L][y].protect=function(t,e){n(t,void 0,e),T(t)},Object.freeze(w[L][y]),function(t,e,n,w,h,L){const[v,y,A,g]=function(t,e,n){const i=e?o:[],u=t?c:[],d=[...i,...u],f=r(d),m=r(i),_=r(d.filter((([t,e])=>n.includes(e))));return[a(f),a(m),a(_),s()]}(w,h,L),I=t=>{const e=t.target;return e instanceof HTMLFormElement?e:e&&e.form},D=t=>v().includes(t);t.addEventListener('submit',(t=>{const e=I(t);if(!e)return;const n=D(e)&&!e.dataset.hcaptchaBound&&!e.dataset.recaptchaBound,o=_(e),c=g().includes(e)&&(!o||!o.value);(n||c)&&t.preventDefault(),c&&!n&&(function(t){try{if(!f())return;!function(t){const e=f();if(!e)return;const n=_(t);if(!n)return;const o=n.value;o&&e.removeItem(o)}(t);const e=Array.from(Array(32),(()=>Math.random().toString(36)[2])).join('');!function(t,e){_(t)||t.append(Object.assign(document.createElement('input'),{type:'hidden',name:u})),t.elements[u].value=e}(t,e),function(t,e){const n=f();if(!n)return;const o=[...t.querySelectorAll(`input[type='${i}']`)].map((({name:t})=>t)),c=[...d,...o],r={};for(const[a,s]of new FormData(t).entries())c.includes(a)||(r[a]=s);n.setItem(e,JSON.stringify({[m]:1,action:t.action,data:r}))}(t,e)}catch(e){console.error('failed to persist form',e)}}(e),e.submit())}));const S=(t,e)=>{t&&!t.dataset[E]&&(n(t,e.some((e=>e===t))),T(t))};for(const o of['focusin','change'])t.addEventListener(o,(t=>{const e=I(t);D(e)&&S(e,y())}));const B=e.get('form_key'),M=e.get(l),P=B&&M;t.addEventListener('',(()=>{const t=y();if(P)for(const e of t)e.elements[l].value===M&&p(e,B);[...new Set([...A(),...v().filter((t=>'true'===t.dataset.shopifyCaptcha))])].forEach((e=>S(e,t)))}))}(h,new URLSearchParams(w.location.search),n,t,e,['guest_login'])})(!0,!0)}();</script>
vendor: 1 bytes, line 110
110
111<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" type="no-load" data-src="//baconsheir.com/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
vendor: 1 bytes, line 111
111
112<script>(function () {var userAgent = navigator.userAgent;var platform = navigator.platform;var maxTouchPoints = navigator.maxTouchPoints || 0;var isIOS = /iPad|iPhone|iPod/.test(platform) || (platform === 'MacIntel' && maxTouchPoints > 1);var isMacSafari = platform.indexOf('Mac') === 0 && /Safari/.test(userAgent) && !/Chrome|Chromium|CriOS|FxiOS|Edg|OPR|Android/.test(userAgent);var isAppleSafari = isIOS || isMacSafari;if (isAppleSafari) {fetch('/sf_private_access_tokens' + location.search).catch(function () {});}function browserMajorVersion(pattern) {var match = userAgent.match(pattern);return match ? parseInt(match[1], 10) : null;}function shouldLoadAutosizesPolyfill() {if (!window.PerformanceObserver?.supportedEntryTypes?.includes('paint')) {return false;}var chromeVersion = browserMajorVersion(/Chrome\/(\d+)/);if (chromeVersion !== null) {return chromeVersion <126;}var firefoxVersion = browserMajorVersion(/Firefox\/(\d+)/);if (firefoxVersion !== null) {return firefoxVersion <150;}var safariVersion = isAppleSafari ? browserMajorVersion(/Version\/(\d+).*Safari\//) : null;if (safariVersion !== null) {return safariVersion <27;}return true;}if (shouldLoadAutosizesPolyfill()) {var autosizesScript = document.createElement('script');autosizesScript.async = true;autosizesScript.crossOrigin = 'anonymous';autosizesScript.src = "//baconsheir.com/cdn/shopifycloud/storefront/assets/storefront/autosizes-84416378.js";(document.head || document.documentElement).appendChild(autosizesScript);}window.ShopifyAnalytics = window.ShopifyAnalytics || {};window.ShopifyAnalytics.performance = window.ShopifyAnalytics.performance || {};(function () {var LONG_FRAME_THRESHOLD = 50;var longAnimationFrames = [];var activeRafId = null;function collectLongFrames() {var previousTime = null;function rafMonitor(now) {if (activeRafId === null) {return;}var delta = now - previousTime;if (delta > LONG_FRAME_THRESHOLD) {longAnimationFrames.push({startTime: previousTime,endTime: now,});}previousTime = now;activeRafId = requestAnimationFrame(rafMonitor);}previousTime = performance.now();activeRafId = requestAnimationFrame(rafMonitor);}if (!window.PerformanceObserver?.supportedEntryTypes?.includes('long-animation-frame')) {collectLongFrames();var timeoutId = setTimeout(function () {cancelAnimationFrame(activeRafId);}, 10000);window.ShopifyAnalytics.performance.getLongAnimationFrames = function (stopCollection) {if (stopCollection === undefined) {stopCollection = false;}if (stopCollection) {clearTimeout(timeoutId);cancelAnimationFrame(activeRafId);}return longAnimationFrames;};}})();})();</script>
112<script crossorigin="anonymous" type="no-load" data-src="//baconsheir.com/cdn/shopifycloud/storefront/assets/shopify_pay/storefront-616277c7.js?v=20250812"></script>
vendor: 1 bytes, line 112
112
113<script id="shopify-origin-trials" async="async" integrity="sha256-qJbe/jEZBHtr5W/BlA2cKAz3vkXu6vJQyLjgvgCC86g=" data-src="//cdn.shopify.com/shopifycloud/storefront/assets/storefront/origin_trials-318ab40a.js" crossorigin="anonymous" onload="window.__shopifyOriginTrialsDone = true" onerror="window.__shopifyOriginTrialsDone = true"></script>
vendor: 1 bytes, line 113
113
114<script> 115 window.Shopify = window.Shopify || {}; 116 window.Shopify.MCP = window.Shopify.MCP || {}; 117 window.Shopify.MCP.enabled = true; 118 window.Shopify.MCP.shop = "bacons-heir.myshopify.com"; 119 window.Shopify.MCP.mcpEndpoint = "https:\/\/baconsheir.com\/api\/mcp"; 120 window.Shopify.MCP.tools = [{"name":"search_shop_policies_and_faqs","description":"Used to get facts about the stores policies, products, or services.\nSome examples of questions you can ask are:\n - What is your return policy?\n - What is your shipping policy?\n - What is your phone number?\n - What are your hours of operation?\"\n","inputSchema":{"$schema":"https:\/\/json-schema.org\/draft\/2020-12\/schema","type":"object","properties":{"query":{"type":"string","description":"A natural language query."},"context":{"type":"string","description":"Additional information about the request such as user demographics, mood, location, or other relevant details that could help in tailoring the response appropriately."}},"required":["query"]}}]; 121</script>
vendor: 1 bytes, line 121
121
122<script>(()=>{var d="shopify:webmcp_adapter_loaded",n=Symbol.for("shopify.webmcp_adapter_loading");function s(c,a,{win:r=window,doc:o=document}={}){function p(){try{return r.localStorage.getItem(d)==="true"}catch{return!1}}function l(){try{r.localStorage.setItem(d,"true")}catch{}}function u(){return typeof(o.modelContext||r.navigator?.modelContext)?.registerTool=="function"}function f(){if(r[n]||!u())return;let t=o.head||o.getElementsByTagName("head")[0];if(!t)return;let e=o.createElement("script");e.type="module",e.crossOrigin="anonymous",a&&(e.integrity=a),e.src=c,e.addEventListener("load",l,{once:!0}),e.addEventListener("error",()=>{r[n]=!1},{once:!0}),t.appendChild(e),r[n]=!0}function _(t){let e=o.getElementById("shopify-origin-trials");if(!e||r.__shopifyOriginTrialsDone){t();return}e.addEventListener("load",t,{once:!0}),e.addEventListener("error",t,{once:!0})}function i(){_(()=>r.setTimeout(f,0))}function m(){o.addEventListener("",i,{once:!0})}p()?i():m()}s("\/\/baconsheir.com\/cdn\/shopifycloud\/storefront\/assets\/storefront\/webmcp-c6b62ece.js","sha256-ke4DDuBjdvea3vxLWxHc9E9nq8zihuG4IfYEGbb77ys=");})(); 123</script>
vendor: 1 bytes, line 123
123
124<script data-source-attribution="shopify.dynamic_checkout.dynamic.init">var Shopify=Shopify||{};Shopify.PaymentButton=Shopify.PaymentButton||{isStorefrontPortableWallets:!0,init:function(){window.Shopify.PaymentButton.init=function(){};var t=document.createElement("script");t.src="https://baconsheir.com/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}}; 125</script>
vendor: 1 bytes, line 125
125
126<script data-source-attribution="shopify.dynamic_checkout.buyer_consent"> 127 function portableWalletsHideBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.add("hidden"),t.setAttribute("aria-hidden","true"),n.removeEventListener("click",e))}function portableWalletsShowBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.remove("hidden"),t.removeAttribute("aria-hidden"),n.addEventListener("click",e))}window.Shopify?.PaymentButton&&(window.Shopify.PaymentButton.hideBuyerConsent=portableWalletsHideBuyerConsent,window.Shopify.PaymentButton.showBuyerConsent=portableWalletsShowBuyerConsent); 128</script>
vendor: 1 bytes, line 128
128
129<script data-source-attribution="shopify.dynamic_checkout.cart.bootstrap">document.addEventListener("",(function(){function t(){return document.querySelector("shopify-accelerated-checkout-cart, shopify-accelerated-checkout")}if(t())Shopify.PaymentButton.init();else{new MutationObserver((function(e,n){t()&&(Shopify.PaymentButton.init(),n.disconnect())})).observe(document.body,{childList:!0,subtree:!0})}})); 130</script>
130 131<link id="shopify-accelerated-checkout-styles" rel="stylesheet" media="screen" href="https://baconsheir.com/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css" crossorigin="anonymous"> 132<style id="shopify-accelerated-checkout-cart"> 133 #shopify-buyer-consent { 134 margin-top: 1em; 135 display: inline-block; 136 width: 100%; 137} 138 139#shopify-buyer-consent.hidden { 140 display: none; 141} 142 143#shopify-subscription-policy-button { 144 background: none; 145 border: none; 146 padding: 0; 147 text-decoration: underline; 148 font-size: inherit; 149 cursor: pointer; 150} 151 152#shopify-subscription-policy-button::before { 153 box-shadow: none; 154} 155 156 </style> 157
158<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
158 159 160 161 162 163 164<meta name="author" content="Bacon's Heir"> 165<meta property="og:url" content="https://baconsheir.com/apps/store-locator"> 166<meta property="og:site_name" content="Bacon's Heir"> <meta property="og:type" content="website"> <meta property="og:title" content="Bacon's Heir"> <meta name="twitter:site" content="@baconsheir"> 167 168<meta name="twitter:card" content="summary">
168<script>var loox_global_hash = '1736011156246';</script>
168<script>var loox_pop_active = true;var loox_pop_display = {"home_page":true,"product_page":true,"cart_page":true,"other_pages":true};</script>
168<script>var loox_floating_widget = {"active":true,"rtl":false,"position":"left","button_text":"Reviews","button_bg_color":"333333","button_text_color":"FFFFFF","display_on_home_page":true,"display_on_product_page":true,"display_on_cart_page":false,"display_on_other_pages":true,"hide_on_mobile":false,"orientation":"default"}; 169</script>
169<style>.loox-reviews-default { max-width: 1200px; margin: 0 auto; }.loox-rating .loox-icon { color:#ffd700; } 170:root { --lxs-rating-icon-color: #ffd700; }</style> <!-- Hotjar Tracking Code for https://baconsheir.com/ -->
170<script type="lazyload2">
vendor: 127 bytes, lines 170-173
170 171 (function(h,o,t,j,a,r){ 172 h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)}; 173 h._hjSettings={hjid:
1732759034
vendor: 259 bytes, lines 173-178
173,hjsv:6}; 174 a=o.getElementsByTagName('head')[0]; 175 r=o.createElement('script');r.async=1; 176 r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv; 177 a.appendChild(r); 178 })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');
178</script>
178 <!-- Pinterest Pixel Base Code -->
178<script type="lazyload2"> 179 !function(e){if(!window.pintrk){window.pintrk=function(){window.pintrk.queue.push( 180 Array.prototype.slice.call(arguments))};var 181 n=window.pintrk;n.queue=[],n.version="3.0";var 182 t=document.createElement("script");t.async=!0,t.src=e;var 183 r=document.getElementsByTagName("script")[0];r.parentNode.insertBefore(t,r)}}("https://s.pinimg.com/ct/core.js"); 184 pintrk('load','2613130872638', { em: '', }); 185 pintrk('page');</script>
185 <noscript> <img height="1" width="1" style="display:none;" alt="" src="https://ct.pinterest.com/v3/?tid=2613130872638&noscript=1" /></noscript> <!-- End Pinterest Pixel Base Code --> <!-- bold subscriptions app -->
185<script>window.BOLD = window.BOLD || {}; 186 window.BOLD.common = window.BOLD.common || {}; 187 window.BOLD.common.Shopify = window.BOLD.common.Shopify || {}; 188 window.BOLD.common.Shopify.shop = { 189 domain: 'baconsheir.com', 190 permanent_domain: 'bacons-heir.myshopify.com', 191 url: 'https://baconsheir.com', 192 secure_url: 'https://baconsheir.com', 193 money_format: "$ {{amount}}", 194 currency: "USD" 195 }; 196 window.BOLD.common.Shopify.customer = { 197 id: null, 198 tags: null, 199 }; 200 window.BOLD.common.Shopify.cart = {"note":null,"attributes":{},"original_total_price":0,"total_price":0,"total_discount":0,"total_weight":0.0,"item_count":0,"items":[],"requires_shipping":false,"currency":"USD","items_subtotal_price":0,"cart_level_discount_applications":[],"checkout_charge_amount":0}; 201 window.BOLD.common.template = '';window.BOLD.common.Shopify.formatMoney = function(money, format) { 202 function n(t, e) { 203 return "undefined" == typeof t ? e : t 204 } 205 function r(t, e, r, i) { 206 if (e = n(e, 2), 207 r = n(r, ","), 208 i = n(i, "."), 209 isNaN(t) || null == t) 210 return 0; 211 t = (t / 100).toFixed(e); 212 var o = t.split(".") 213 , a = o[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1" + r) 214 , s = o[1] ? i + o[1] : ""; 215 return a + s 216 } 217 "string" == typeof money && (money = money.replace(".", "")); 218 var i = "" 219 , o = /\{\{\s*(\w+)\s*\}\}/ 220 , a = format || window.BOLD.common.Shopify.shop.money_format || window.Shopify.money_format || "$ {{ amount }}"; 221 switch (a.match(o)[1]) { 222 case "amount": 223 i = r(money, 2, ",", "."); 224 break; 225 case "amount_no_decimals": 226 i = r(money, 0, ",", "."); 227 break; 228 case "amount_with_comma_separator": 229 i = r(money, 2, ".", ","); 230 break; 231 case "amount_no_decimals_with_comma_separator": 232 i = r(money, 0, ".", ","); 233 break; 234 case "amount_with_space_separator": 235 i = r(money, 2, " ", ","); 236 break; 237 case "amount_no_decimals_with_space_separator": 238 i = r(money, 0, " ", ","); 239 break; 240 case "amount_with_apostrophe_separator": 241 i = r(money, 2, "'", "."); 242 break; 243 } 244 return a.replace(o, i); 245 }; 246 window.BOLD.common.Shopify.saveProduct = function (handle, product) { 247 if (typeof handle === 'string' && typeof window.BOLD.common.Shopify.products[handle] === 'undefined') { 248 if (typeof product === 'number') { 249 window.BOLD.common.Shopify.handles[product] = handle; 250 product = { id: product }; 251 } 252 window.BOLD.common.Shopify.products[handle] = product; 253 } 254 }; 255 window.BOLD.common.Shopify.saveVariant = function (variant_id, variant) { 256 if (typeof variant_id === 'number' && typeof window.BOLD.common.Shopify.variants[variant_id] === 'undefined') { 257 window.BOLD.common.Shopify.variants[variant_id] = variant; 258 } 259 };window.BOLD.common.Shopify.products = window.BOLD.common.Shopify.products || {}; 260 window.BOLD.common.Shopify.variants = window.BOLD.common.Shopify.variants || {}; 261 window.BOLD.common.Shopify.handles = window.BOLD.common.Shopify.handles || {};window.BOLD.common.Shopify.saveProduct(null, null);window.BOLD.apps_installed = {"Product Upsell":3,"Recurring Orders":1} || {};window.BOLD.common.Shopify.metafields = window.BOLD.common.Shopify.metafields || {};window.BOLD.common.Shopify.metafields["bold_rp"] = {"recurring_type":0};window.BOLD.common.Shopify.metafields["bold_csp_defaults"] = {};window.BOLD.common.cacheParams = window.BOLD.common.cacheParams || {}; 262 window.BOLD.common.cacheParams.recurring_orders = 1608659583; 263</script>
263<script src="https://ro.boldapps.net/v2_ui/js/ro.js" type="text/javascript"></script>
263<script>var BOLD = BOLD || {}; 264 BOLD.products = BOLD.products || {}; 265 BOLD.variant_lookup = BOLD.variant_lookup || {};BOLD.products[null] ={"id":null,"title":null,"handle":null,"description":null,"published_at":"T","created_at":"T","vendor":null,"type":null,"tags":null,"price":"NaN","price_min":"NaN","price_max":"NaN","price_varies":false,"compare_at_price":"NaN","compare_at_price_min":"NaN","compare_at_price_max":"NaN","compare_at_price_varies":false,"all_variant_ids":[],"variants":[],"available":false,"images":null,"featured_image":null,"options":null,"url":null}</script>
265<script> 266 267 var BOLD = BOLD || {}; 268 BOLD.recurring_orders = BOLD.recurring_orders || {}; 269 if(typeof BOLD.recurring_orders.setSettings !== 'undefined') { 270 BOLD.recurring_orders.setSettings({ 271 loadingEnabled: true 272 },true); 273 } else { 274 BOLD.recurring_orders.settings = { 275 loadingEnabled: true 276 }; 277 } 278 279 BOLD.recurring_orders.modes = { 280 current_mode:0, 281 recurring_cart:0, 282 single_product:1, 283 mixed_cart:2 284 }; 285 286 BOLD.customer = BOLD.customer || {}; 287 BOLD.customer.id = null || ''; 288 BOLD.customer.email= null || ''; 289 BOLD.customer.address1= null || ''; 290 BOLD.customer.address = null || ''; 291 BOLD.customer.city = null || ''; 292 BOLD.customer.company = null || ''; 293 BOLD.customer.country = null || ''; 294 BOLD.customer.first_name = null || ''; 295 BOLD.customer.last_name = null || ''; 296 BOLD.customer.phone = null || ''; 297 BOLD.customer.province = null || ''; 298 BOLD.customer.zip = null || ''; 299 BOLD.customer.tags = null || ''; 300 301 302 303 304 window.mixed_cart = null; 305</script>
305 306 307 308 309
310<script> 311 var TRANSLATIONS = { 312 en: { 313 translation: { 314 titles: { 315 return_to_account: "Return to account details", 316 subscription: "Subscription", 317 subscriptions: "Subscriptions", 318 loading: "Loading...", 319 cancel: "Cancel", 320 save: "Save", 321 continue: "Continue", 322 pause: "Pause", 323 edit: "Edit", 324 my_subscriptions: "My Subscriptions", 325 frequency: "Frequency", 326 next_order: "Next Order", 327 confirm: "Confirm", 328 remove: "Remove", 329 description: "Description", 330 add: "Add", 331 }, 332 email_gate: { 333 no_subs: "You do not have any subscriptions yet", 334 check_email: "Check your email to access your subscriptions, {{email}}", 335 cta_access_link: "Email me an access link", 336 }, 337 subscriptions: { 338 error: "There was an error loading your subscriptions", 339 no_subs: "You do not have any subscriptions yet", 340 link_to_account: "Return to Account Details", 341 }, 342 subscription: { 343 fetch_error: "There was an error fetching the detail subscription", 344 auth_error: "There was authorization error, please login again", 345 plan: "Plan", 346 active: "Active", 347 activate: "Activate", 348 pause: "Pause", 349 paused: "Paused", 350 cancel: "Cancel", 351 cancelled: "Cancelled", 352 shipment_info: "Shipment info", 353 update_shipping: "Update shipping", 354 payment_method: "Payment method", 355 pay_pal_payment_method: "PayPal", 356 ending_in: "ending in", 357 expires: "Expires", 358 add_phone: "Enter a phone number", 359 add_name: "Enter your name", 360 add_lastName: "Enter your last name", 361 billing_attepts: "Billing Attempts", 362 percentage_dynamic_discount: "{{discount}} % off", 363 fixed_amount_dynamic_discount: 364 "{{discount}} off", 365 then_dynamic_discount: " then {{discount}}", 366 orders_dynamic_discount: " for {{orderQty}} orders,", 367 billing_attepts_empty: "There are no billing attempts", 368 billing_attepts_error: "There was an error loading the billing attempts", 369 subs_details: "Subscription Details", 370 update_payment_btn: "Update payment", 371 cancel_prompt_title: "Canceling subscription cannot be undone. If you want to resume shipments, you will need to create a new order in the store.", 372 cancel_error: "There was an error trying to cancel your subscription", 373 no_payment_method_error: "Payment method missing from subscripiton.", 374 no_payment_method_error_add: "Please add a new card.", 375 new_payment_method_success: "Succesfully updated the payment method.", 376 new_payment_method_error: "Unknown error adding your payment method. Please try again.", 377 remove_line_error: "There was an error trying to remove the product", 378 remove_line_success: "Succesfully removed the product", 379 ships_to: "Ships to", 380 update_payment_success: "An email was sent to {{email}} with a secure link to update payment information.", 381 update_payment_success_dunning: 382 "An email was sent to {{email}} with a secure link to update payment information. After payment information is updated we will retry the order.", 383 update_payment_success_payment_error: 384 "Unable to add payment method. An email was sent to {{email}} with a secure link to update payment.", 385 update_payment_error: "There was an error updating your payment information", 386 sales_tax: "Sales tax (if applicable) is not displayed because it is calculated with each new order.", 387 skip_billing_interval_prompt: 388 "Are you sure you want to skip?", 389 skip_billing_interval_success: 390 "Your next order has been rescheduled to {{date}}", 391 skip_billing_interval_error: "There was an error skipping your next order", 392 skip_until: "Skip until", 393 skip_next: "Skip next", 394 order_now: "Order now", 395 next_order_success: "Your next order has been rescheduled to {{date}}", 396 next_order_error: "There was an error setting the subscription's next order date.", 397 add_new_address: "Add new address", 398 address_update_success: "Address updated successfully", 399 address_update_failed: "We encountered an unknown error. Please try again.", 400 pause_subscription: "Pause subscription", 401 cancel_subscription: "Cancel subscription", 402 pause_disclaimer_date: "We will postpone your subscription. Your subscription will remain active, but you will not be charged until {{date}}
402. You can pause indefinitely or reschedule anytime.", 403 pause_disclaimer_indefinitely: 404 "You will not be charged while your subscription is paused. Reactivate your subscription anytime in your account.", 405 pause_success: "Your subscription was paused successfully", 406 reactivate_btn: "Reactivate now", 407 reactivate: "Reactivate", 408 reactivate_success: "Your subscription has been successfully reactivated.", 409 reactivate_error: "Something went wrong while reactivating your subscription. Please try again", 410 frequency_days: "day(s)", 411 frequency_weeks: "week(s)", 412 frequency_months: "month(s)", 413 order_now_modal_body: "You will be charged {{amount}} and your shipment will go out as soon as possible.", 414 amount: "Amount", 415 frequency_update_success: "Delivery frequency updated to {{ frequency }}.", 416 frequency_update_error: "Unknown error. Delivery frequency could not be updated.", 417 customer_update_success: "Customer information has been updated", 418 customer_update_error: "Unknown error. Customer information could not be updated.", 419 customer_update_info: "Adding your phone number, you will receive free SMS with information about your next subscription, allowing you to skip it,or editing it through your phone", 420 verified_phone: "Phone verified", 421 not_verified_phone: "Phone not verified", 422 verify_phone: "Verify", 423 enter_code: "Enter the verification code", 424 verify_code_error: "There was an error verifying your phone number.", 425 verify_code_retry_error: "You have tried to verify your phone number too many times. Please, try it later.", 426 verify_code_success: "Phone number verified successfully", 427 code_received: "You must have received a confirmation code in the provided phone number.", 428 code_enter: "Please enter the code below to verify your phone number.", 429 code_send: "Send code", 430 qty: "Qty", 431 manage: "Manage", 432 your_next_order: "Your next order", 433 swap_product: "Swap products", 434 swap_product_cta: "Swap for another product...", 435 or: "Or", 436 update_variant: "Change selection", 437 update_bundle: "Update Box", 438 save: "Save {{percentage}}%", 439 failed_payment_message: "Failed payment with saved method. We will automatically retry payment.", 440 failed_payment_cta: "Update Payment method", 441 order_now_success: "Order placed successfully", 442 order_now_error: "Unknown error. Please try again.", 443 update_current_payment_method: 444 "Update current payment method", 445 add_new_card: "Add new card", 446 delayed: "Delayed", 447 delayedNotification: "Subscription delayed due to inventory. Order will ship when item becomes available. To receive order more quickly, please update selection below.", 448 update_success: "Your subscription has been updated successfully.", 449 update_line_success: "Subscription updated. The order will ship out as soon as possible.", 450 update_error: "Something went wrong. Your subscription has not been changed.", 451 }, 452 new_payment_method: { 453 title: "Enter payment method", 454 payment_info: "Payment information", 455 card_number: "Card number", 456 exp_date: "Exp date", 457 security_code: "CVV", 458 first_name: "First Name", 459 last_name: "Last Name", 460 billing_address: "Billing address", 461 address1: "Address", 462 address2: "Apartment, suite, etc. (optional)", 463 city: "City", 464 country: "Country/Region", 465 state: "State/Province", 466 zip: "Zip code", 467 phone: "Phone (optional)", 468 }, 469 tables: { 470 ID: "ID", 471 status: "Status", 472 item: "Item", 473 created: "Created", 474 next_order: "Next Order", 475 skip: "Skip", 476 product: "Product", 477 quantity: "Quantity", 478 price: "Price", 479 total: "Total", 480 shipping: "Shipping", 481 originated: "Originated", 482 frequency: "Frequency", 483 phone: "Phone", 484 name: "Name", 485 lastName: "Last name", 486 date: "Date", 487 sold_out: "Sold out", 488 partial_inventory: "Partial inventory", 489 qty_sold_out: " • {{quantity}} sold out", 490 order_number: "Order Number", 491 subtotal: "Subtotal", 492 loading_fulfillments: "Loading...", 493 last_fulfillment: "Last fulfillment", 494 next_fulfillment: "Next fulfillment", 495 merchant_discount: "Discount", 496 one_time_discount_label: "(One-time)", 497 finite_discount_label: "({{times}} left)", 498 }, 499 login: { 500 start_intro: "Enter your email address to get started", 501 welcome: "Welcome", 502 send_link: "We'll email you a secure link to sign in.", 503 email_address: "Email address", 504 continue: "Continue", 505 welcome_back: "Welcome back", 506 choose_login: "Choose how to login for", 507 send_secure_link: "Send me secure link", 508 login_password: "Login with password", 509 check_email: "Check your email for login link", 510 secure_email_sent: "We've sent a secure email to {{email}}. The link expires in 24 hours.", 511 not_received: "Didn't receive it?", 512 new_link: "Send me a new link", 513 different_email: "Try different email",
514 no_subscriptions: "No subscriptions found", 515 invalid_email: "Invalid Email", 516 no_subscriptions_message: "We couldn't find any subscriptions associated with", 517 }, 518 product_swap: { 519 title_select: "Choose replacement item", 520 title_confirm: "Confirm", 521 sold_out: "Sold out", 522 choose: "Choose", 523 back: "Back", 524 confirm: "Confirm", 525 save: "Save", 526 update: "Update", 527 original_item: "Original item", 528 replacement_item: "Replacement item", 529 update_success: "Successfully swapped items for the next order.", 530 update_error: "Something went wrong. Your subscription has not been changed.", 531 }, 532 bundles: { 533 build_box: "Build your box", 534 of: "of", 535 back: "Back", 536 continue: "Continue", 537 add_cart: "Add to cart", 538 select_plan: "Select plan", 539 build_your_box: "Build your box", 540 addons: "Add-ons", 541 checkout: "Checkout", 542 edit_my_box: "Edit my box", 543 box_size: "Box size", 544 add_cart_error: "There was an error updating your cart.", 545 update_price: "Cost of the box has changed from {{prevBasePrice}} to {{basePrice}}", 546 update_success: "Box successfully updated", 547 update_error: "Something went wrong trying to update the box", 548 delivery_options: "Delivery options", 549 one_time_delivery: "One time", 550 additional_products: "Additional products", 551 }, 552 addons: { 553 title: "Add Items", 554 selection_unavailable: "Selection unavailable", 555 success_added: "Successfully added items to your subscription.", 556 subtitle: "Add items to your upcoming order", 557 subscribe: "Subscribe", 558 select: "Add", 559 see_products: "See all products", 560 modal_title: "Add products to your next order", 561 save: "Save", 562 type: "Type", 563 }, 564 sms: { 565 title: "Text updates", 566 enable: "Enable", 567 edit_phone: "Edit phone number", 568 enable_phone: "Enable text updates", 569 phone_placeholder: "Enter phone number", 570 enable_phone_text: "Text messages allow you to update subscriptions on the go. Message and. data rates may apply.", 571 phone: "Phone number", 572 invalid_phone: "Invalid phone number", 573 invalid_country: "Only US and CA phone numbers are supported.", 574 duplicated_phone_error: "Phone number already in use", 575 }, 576 cancelModal: { 577 header: "Reason for cancelling", 578 neverMind: "Never mind", 579 back: "Back", 580 continue: "Continue", 581 continueWithCancellation: "Continue with cancellation", 582 continueCancel: "Continue cancel", 583 confirmCancellation: "Confirm cancellation", 584 error: "There was an unknown error", 585 tryAgain: "Try again.", 586 TOO_MUCH: "I have too much", 587 MOVING: "Moving to a new place", 588 COMPETITOR: "Switching to a competitor", 589 BUDGET: "Doesn’t fit my budget", 590 NOT_ENJOY: "I didn’t enjoy the product", 591 NO_NEED: "No longer need this", 592 TRAVELLING: "I’m traveling", 593 OTHER: "Other", 594 frequency: { 595 modalTitle: "Frequency update available", 596 title: "Update frequency instead of losing subscription", 597 subtitle: "By updating your delivery frequency, you can control how often you recieve shipments.", 598 updateFrequency: "Update frequency", 599 formModalTitle: "Edit frequency", 600 formTitle: "You control how often your receive deliveries. Upcoming orders will be delivered on the frequency selected below.", 601 formDelivery: "Delivery every", 602 setFrequency: "Set frequency", 603 }, 604 address: { 605 modalPromptTitle: "Address update available", 606 promptTitle: "Moving doesn’t have to mean cancellation", 607 promptSubtitle: "By updating your address, you have the option of keeping your subscription with you wherever you go!", 608 promptUpdateAddress: "Update address", 609 modalFormTitle: "Enter address", 610 noShippingOptions: "There are no shipping options available for that address.", 611 confirmModalTitle: "Shipping confirmation", 612 confirmTitle: "The price of shipping for your subscription will change from {{oldPrice}} to {{newPrice}} because your new address is in a different delivery zone.", 613 confirmAcceptShipping: "Accept shipping", 614 newAddress: "New address:", 615 oldAddress: "Old address:", 616 }, 617 pause: { 618 header: "Pause available", 619 title: "Did you know you can pause instead?", 620 description: "Instead of cancelling, pausing your subscription allows you to keep billing and shipping details saved when you’re ready to reactivate your subscription.", 621 cta: "Pause subscription", 622 success: "Your subscription was paused successfully", 623 }, 624 skip: { 625 header: "Skip available", 626 title: "You can skip or reschedule your next order", 627 description: "Keep your shipments coming once you’re back from your trip. Consider skipping or rescheduling instead of canceling.",
628 ctaReschedule: "Reschedule next order", 629 ctaSkip: "Skip next", 630 success: "Your next order has been rescheduled to {{date}}", 631 }, 632 reschedule: { 633 header: "Schedule next order", 634 confirmReschedule: "Reschedule", 635 dateFormat: "mm/dd/yyyy", 636 inputLabel: "Next order", 637 description: "Your subscription will remain active, but we will postpone your subscription until the date you select below.", 638 }, 639 confirm: { 640 header: "Translation missing: en.awtomatic.customer_portal.cancelModal.confirm.header", 641 modalTitle: "Additional feedback", 642 title: "Please provide additional feedback (optional)", 643 button: "Confirm cancellation", 644 success: "Subscription cancelled", 645 }, 646 }, 647 drawers: { 648 updateAddress: { 649 title: "Enter address", 650 }, 651 }, 652 }, 653 }, 654 }; 655 656 window.bundleapp = window.bundleapp || {}; 657 window.bundleapp.settings = { 658 ...window.bundleapp.settings, 659 translations: TRANSLATIONS, 660 }; 661</script>
661 662 663 664 665 666<meta property="og:image" content="https://cdn.shopify.com/s/files/1/0893/4036/files/BH-Bacons-Heir-Checkout-Logo.png?height=628&pad_color=fff&v=1640013898&width=1200" /> 667<meta property="og:image:secure_url" content="https://cdn.shopify.com/s/files/1/0893/4036/files/BH-Bacons-Heir-Checkout-Logo.png?height=628&pad_color=fff&v=1640013898&width=1200" /> 668<meta property="og:image:width" content="1200" /> 669<meta property="og:image:height" content="628" /> 670<link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
671<script>(function(){if ("sendBeacon" in navigator && "performance" in window) {try {var session_token_from_headers = performance.getEntriesByType('navigation')[0].serverTiming.find(x => x.name == '_s').description;} catch {var session_token_from_headers = undefined;}var session_cookie_matches = document.cookie.match(/_shopify_s=([^;]*)/);var session_token_from_cookie = session_cookie_matches && session_cookie_matches.length === 2 ? session_cookie_matches[1] : "";var session_token = session_token_from_headers || session_token_from_cookie || "";function handle_abandonment_event(e) {var entries = performance.getEntries().filter(function(entry) {return /monorail-edge.shopifysvc.com/.test(entry.name);});if (!window.abandonment_tracked && entries.length === 0) {window.abandonment_tracked = true;var currentMs = Date.now();var navigation_start = performance.timing.navigationStart;var payload = {shop_id: 8934036,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token,page_type: ""};window.navigator.sendBeacon("https://monorail-edge.shopifysvc.com/v1/produce", JSON.stringify({schema_id: "online_store_buyer_site_abandonment/1.1",payload: payload,metadata: {event_created_at_ms: currentMs,event_sent_at_ms: currentMs}}));}}window.addEventListener('pagehide', handle_abandonment_event);}}());</script>
vendor: 1 bytes, line 671
671
672<script> 673 window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || []; 674</script>
vendor: 1 bytes, line 674
674
675<script>(function(){var wpmLoader=function(){"use strict";var e=/Googlebot|Storebot-Google|bingbot|Baiduspider|YandexBot|DuckDuckBot|Slurp|facebookexternalhit|Twitterbot|LinkedInBot|Applebot|AdsBot-Google|Mediapartners-Google|APIs-Google|PetalBot|SemrushBot|AhrefsBot|MJ12bot|DotBot|Acunetix|PerplexityBot|Perplexity-User/i,t=/bytedance/i;function i(){try{var e=document.cookie;if(!e||"string"!=typeof e)return;for(var t=0,i=e.split(";");t<i.length;t++){var n=i[t],r=n.indexOf("=");if(-1!==r){var o=n.slice(0,r).trim();if(o){var a=void 0;try{a=decodeURIComponent(o)}catch(e){a=o}if("_shopify_s"===a){var d=n.slice(r+1).trim();try{return decodeURIComponent(d)}catch(e){return d}}}}}return}catch(e){return}}function n(e){try{"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn(e)}catch(e){}}function r(e,t){return"string"==typeof e&&e.length>0&&e.length<=t?e:void 0}function o(e){var t;switch(null==(t=null==e?void 0:e.navigation)?void 0:t.type){case 0:return"navigate";case 1:return"reload";case 2:return"back_forward";default:return}}function a(){var e,t,i;try{var n=null==(i=null==(t=null==(e=self.ShopifyAnalytics)?void 0:e.lib)?void 0:t.trekkie)?void 0:i.state;return"awaiting-consent"===n||"initialized"===n?n:void 0}catch(e){return}}return function(d,s,u,l){var c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};try{var p=c.trekkieShim;!0!==p&&"true"!==p||null!=window.__TREKKIE_SHIM_QUEUE||(window.__TREKKIE_SHIM_QUEUE=[])}catch(e){}var f,v,h,y,g=(v=(f={modern:/Edge?\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Firefox\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Chrom(ium|e)\/(9{2}|\d{3,})\.\d+(\.\d+|)|(Maci|X1{2}).+ Version\/(15\.\d+|(1[6-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(9{2}|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(15[._]\d+|(1[6-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|SamsungBrowser\/([2-9]\d|\d{3,})\.\d+/,legacy:/Edge?\/(1[6-9]|[2-9]\d|\d{3,})\.\d+(\.\d+|)|Firefox\/(5[4-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)|Chrom(ium|e)\/(5[1-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)([\d.]+$|.*Safari\/(?![\d.]+ Edge\/[\d.]+$))|(Maci|X1{2}).+ Version\/(10\.\d+|(1[1-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(3[89]|[4-9]\d|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(10[._]\d+|(1[1-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Mobile Safari.+OPR\/([89]\d|\d{3,})\.\d+\.\d+|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+(UC? ?Browser|UCWEB|U3)[ /]?(15\.([5-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})\.\d+)\.\d+|SamsungBrowser\/(5\.\d+|([6-9]|\d{2,})\.\d+)|Android.+MQ{2}Browser\/(14(\.(9|\d{2,})|)|(1[5-9]|[2-9]\d|\d{3,})(\.\d+|))(\.\d+|)|K[Aa][Ii]OS\/(3\.\d+|([4-9]|\d{2,})\.\d+)(\.\d+|)/}).modern,h=f.legacy,(y=navigator.userAgent).match(e)?"bot":y.match(v)?"modern":y.match(h)?"legacy":y.match(t)?"bot":"unknown"),m=function(e){var t,i,n=r(e,128);try{var a=window.performance,d=null==(t=null==a?void 0:a.getEntriesByType)?void 0:t.call(a,"navigation")[0];if(!d)return{requestId:n,navigationType:o(a)};var s="type"in d?r(d.type,64):void 0,u="serverTiming"in d&&Array.isArray(d.serverTiming)?d.serverTiming:[];return{requestId:null!=n?n:r(null==(i=u.find(function(e){return"requestID"===e.name}))?void 0:i.description,128),navigationType:s}}catch(e){return{requestId:n}}}(c.requestId),w=function(e){var t=e.version,r=e.browserTarget,o=e.surface,a=e.shopId,d=e.monorailEndpoint,s=window.location.href;return{emit:function(e){var u=e.status,l=e.errorMsg,c=e.failureReason,p=e.useKeepaliveFallback,f=void 0!==p&&p,v=e.navigationType,h=e.pagehidePersisted,y=e.requestId,g=e.trekkieState;if(d){var m,w;try{var b=(new Date).getTime();m=JSON.stringify({metadata:{event_sent_at_ms:b},events:[{schema_id:"web_pixels_manager_load/3.3",payload:{version:t,bundle_target:r,page_url:s,status:u,surface:o,error_msg:l,failure_reason:c,navigation_type:v,pagehide_persisted:h,request_id:y,trekkie_state:g,shop_id:a,visit_token:i()},metadata:{event_created_at_ms:b}}]})}catch(e){return}try{if("function"==typeof window.navigator.sendBeacon&&-1===(w=window.navigator.userAgent).indexOf("iPhone; CPU iPhone OS 12_")&&-1===w.indexOf("iPad; CPU OS 12_")&&-1===w.indexOf("iPod touch; CPU iPhone OS 12_")&&window.navigator.sendBeacon.bind(window.navigator)(d,m))return}catch(e){}if(f)try{"function"==typeof window.fetch&&window.fetch(d,{method:"POST",headers:{"Content-Type":"text/plain"},body:m,keepalive:!0}
675).catch(function(){})}catch(e){}else try{var _=new XMLHttpRequest;_.open("POST",d,!0),_.setRequestHeader("Content-Type","text/plain"),_.send(m)}catch(e){n("[Web Pixels Manager] Got an unhandled error while logging to Monorail.")}}else n("[Web Pixels Manager] No Monorail endpoint provided, skipping logging.")}}}({version:u,browserTarget:g,surface:d.surface,shopId:d.shopId,monorailEndpoint:d.monorailEndpoint});if(Boolean(null==(_=null==(b=window.Shopify)?void 0:b.analytics)?void 0:_.replayQueue))w.emit({status:"setup-skipped",errorMsg:"replay queue already initialized."});else{var b,_;w.emit({status:"setup-started"}),window.Shopify=window.Shopify||{};var S=window.Shopify;S.analytics=S.analytics||{};var P=S.analytics;P.replayQueue=[],P.publish=function(e,t,i){return P.replayQueue.push([e,t,i]),!0};try{self.performance.mark("wpm:start")}catch(e){}var k,C="modern"===g?"modern":"legacy",E=(null!=l?l:{modern:"",legacy:""})[C],I=[(k={baseUrl:s,hashVersion:u,buildTarget:C}).baseUrl,"/wpm","/b",k.hashVersion,"modern"===k.buildTarget?"m":"l",".js"].join(""),O=!1,T=!1;try{c.browserTarget=g,function(){O=!0;try{window.addEventListener("pagehide",M)}catch(e){O=!1}}(),R(function(){try{R(x)}catch(e){D(e)}}),w.emit({status:"loading",requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()})}catch(e){D(e)}}function U(){var e;if(q(),!function(){var e,t;return Boolean(null==(t=null==(e=window.Shopify)?void 0:e.analytics)?void 0:t.initialized)}()){var t,i,n;try{if("function"!=typeof(null==(e=window.webPixelsManager)?void 0:e.init))return void A();if(!(null!==(n=i=t=window.webPixelsManager.init(d))&&"function"!=typeof n&&Object(n)===n&&"publish"in i&&"function"==typeof i.publish&&"publishCustomEvent"in i&&"function"==typeof i.publishCustomEvent&&"visitor"in i&&"function"==typeof i.visitor))return void A()}catch(e){return void A(e)}var r=window.Shopify.analytics;r.replayQueue.forEach(function(e){var i=e[0],n=e[1],r=e[2];t.publishCustomEvent(i,n,r)}),r.replayQueue=[],r.publish=t.publishCustomEvent,r.visitor=t.visitor,r.initialized=!0}}function A(e){B("manager_api_unavailable",void 0===e?void 0:Q(e))}function x(){B("script_load_failed","".concat(I," has failed to load"))}function B(e,t){T||(T=!0,q(),w.emit({status:"failed",errorMsg:t,failureReason:e,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function M(e){O&&(q(),w.emit({status:"pagehide-while-loading",useKeepaliveFallback:!0,pagehidePersisted:e.persisted,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function q(){O=!1;try{window.removeEventListener("pagehide",M)}catch(e){}}function R(e){var t;!function(e){var t=e.src,i=e.async,n=void 0===i||i,r=e.onload,o=e.onerror,a=e.sri,d=e.scriptDataAttributes,s=void 0===d?{}:d,u=document.createElement("script"),l=document.querySelector("head"),c=document.querySelector("body");if(u.async=n,u.src=t,a&&(u.integrity=a,u.crossOrigin="anonymous"),s)for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))try{u.dataset[p]=String(s[p])}catch(e){}if(r&&u.addEventListener("load",r),o&&u.addEventListener("error",o),l)l.appendChild(u);else{if(!c)throw new Error("Did not find a head or body element to append the script");c.appendChild(u)}}({src:I,async:!0,onload:U,onerror:e,sri:(t=E,"string"==typeof t&&/^sha384-[A-Za-z0-9+/=]+$/.test(t)?E:""),scriptDataAttributes:c})}function D(e){B("script_append_failed",Q(e))}function Q(e){return e instanceof Error?e.message:"Unknown error"}}}();wpmLoader({shopId: 8934036,storefrontBaseUrl: "https://baconsheir.com",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://baconsheir.com/.well-known/shopify/monorail/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["4c64608a","16072cab","8450a54b","7ee89bf1"],webPixelsConfigList: [{"id":"254869552","configuration":"{\"pixelCode\":\"C3IVA1SS6SQO8TG3UB30\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"22e92c2ad45662f435e4801458fb78cc","type":"APP","apiClientId":4383523,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"}
675,{"id":"146636848","configuration":"{\"pixel_id\":\"1190255414393889\",\"pixel_type\":\"facebook_pixel\",\"metaapp_system_user_token\":\"-\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"96420dbe9ea96c426a1b7f364f977719","type":"APP","apiClientId":2329312,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"66682928","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"1","type":"CUSTOM","privacyPurposes":["ANALYTICS"],"name":"Google Analytics tag (migrated)"},{"id":"shopify-app-pixel","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"APP","privacyPurposes":["ANALYTICS","MARKETING"]},{"id":"shopify-custom-pixel","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING"]}],isMerchantRequest: false,initData: {"shop":{"name":"Bacon's Heir","paymentSettings":{"currencyCode":"USD"},"myshopifyDomain":"bacons-heir.myshopify.com","countryCode":"US","storefrontUrl":"https:\/\/baconsheir.com"},"customer":null,"cart":null,"checkout":null,"productVariants":[],"products":[],"purchasingCompany":null},},"https://baconsheir.com/cdn","5982071ew7ea472e3p69b68784m2150dfea",{"modern":"","legacy":""},{"trekkieShim":true,"agentContext":true,"apiClientId":"580111","facebookCapiEnabled":"true","themeId":"125852352560","themePublished":"true","eventMetadataId":"1a5d0da9-688e-498f-85e1-cc5833519c30","shopId":"8934036","storefrontBaseUrl":"https:\/\/baconsheir.com","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"4c64608a\", \"16072cab\", \"8450a54b\", \"7ee89bf1\"]","isMerchantRequest":"false","hashVersion":"5982071ew7ea472e3p69b68784m2150dfea","publish":"custom","events":"[[\"page_viewed\",{}]]"});})();</script>
675<script> 676 window.ShopifyAnalytics = window.ShopifyAnalytics || {}; 677 window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {}; 678 window.ShopifyAnalytics.meta.currency = 'USD'; 679 var meta = {"page":{"requestId":"dc34833c-b513-47f9-9893-2f5ad4c6d366-1791136217"}}; 680 for (var attr in meta) { 681 window.ShopifyAnalytics.meta[attr] = meta[attr]; 682 } 683</script>
vendor: 1 bytes, line 683
683
684<script class="analytics"> 685 (function () { 686 var customDocumentWrite = function(content) { 687 var jquery = null; 688 689 if (window.jQuery) { 690 jquery = window.jQuery; 691 } else if (window.Checkout && window.Checkout.$) { 692 jquery = window.Checkout.$; 693 } 694 695 if (jquery) { 696 jquery('body').append(content); 697 } 698 }; 699 700 var hasLoggedConversion = function(token) { 701 if (token) { 702 return document.cookie.indexOf('loggedConversion=' + token) !== -1; 703 } 704 return false; 705 } 706 707 var setCookieIfConversion = function(token) { 708 if (token) { 709 var twoMonthsFromNow = new Date(Date.now()); 710 twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2); 711 712 document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow; 713 } 714 } 715 716 var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || []; 717 window.ShopifyAnalytics.lib.trekkie = window.trekkie; 718 if (trekkie.integrations) { 719 return; 720 } 721 trekkie.methods = [ 722 'identify', 723 'page', 724 'ready', 725 'track', 726 'trackForm', 727 'trackLink' 728 ]; 729 trekkie.factory = function(method) { 730 return function() { 731 var args = Array.prototype.slice.call(arguments); 732 args.unshift(method); 733 trekkie.push(args); 734 if (method == 'track' || method == 'page') { 735 var pageUrl; 736 try { 737 pageUrl = window.location.href; 738 } catch (e) {} 739 var pageReferrer; 740 try { 741 pageReferrer = document.referrer; 742 } catch (e) {} 743 try { 744 if (window.__TREKKIE_SHIM_QUEUE == null) { 745 window.__TREKKIE_SHIM_QUEUE = []; 746 } 747 window.__TREKKIE_SHIM_QUEUE.push({ 748 from: 'trekkie-stub', 749 method: method, 750 args: args.slice(1), 751 pageContext: { 752 url: pageUrl, 753 referrer: pageReferrer 754 } 755 }); 756 } catch (e) { 757 // no-op 758 } 759 } 760 return trekkie; 761 }; 762 }; 763 for (var i = 0; i < trekkie.methods.length; i++) { 764 var key = trekkie.methods[i]; 765 trekkie[key] = trekkie.factory(key); 766 } 767 trekkie.load = function(config) { 768 trekkie.config = config || {}; 769 trekkie.config.initialDocumentCookie = document.cookie; 770 var first = document.getElementsByTagName('script')[0]; 771var script = document.createElement('script'); 772script.type = 'text/javascript'; 773script.onerror = function(e) { 774 var scriptFallback = document.createElement('script'); 775 scriptFallback.type = 'text/javascript'; 776 scriptFallback.onerror = function(error) { 777 var Monorail = { 778 produce: function produce(monorailDomain, schemaId, payload) { 779 var currentMs = new Date().getTime(); 780 var event = { 781 schema_id: schemaId, 782 payload: payload, 783 metadata: { 784 event_created_at_ms: currentMs, 785 event_sent_at_ms: currentMs 786 } 787 }; 788 return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event)); 789 }, 790 sendRequest: function sendRequest(endpointUrl, payload) { 791 // Try the sendBeacon API 792 if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) { 793 var blobData = new window.Blob([payload], { 794 type: 'text/plain' 795 }); 796 797 if (window.navigator.sendBeacon(endpointUrl, blobData)) { 798 return true; 799 } // sendBeacon was not successful 800 801 } // XHR beacon 802 803 var xhr = new XMLHttpRequest(); 804 805 try { 806 xhr.open('POST', endpointUrl); 807 xhr.setRequestHeader('Content-Type', 'text/plain'); 808 xhr.send(payload); 809 } catch (e) { 810 console.log(e); 811 } 812 813 return false; 814 }, 815 isIos12: function isIos12() { 816 return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1; 817 } 818 }; 819 Monorail.produce('monorail-edge.shopifysvc.com', 820 'trekkie_storefront_load_errors/1.1', 821 {shop_id: 8934036, 822 theme_id: 125852352560, 823 app_name: "storefront", 824 context_url: window.location.href, 825 source_url: "//baconsheir.com/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js"}); 826 827 }; 828 scriptFallback.async = true; 829 scriptFallback.src = '//baconsheir.com/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js'; 830 first.parentNode.insertBefore(scriptFallback, first); 831}; 832script.async = true; 833script.src = '//baconsheir.com/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js'; 834first.parentNode.insertBefore(script, first); 835 836 }; 837 trekkie.load( 838 {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":8934036,"isMerchantRequest":null,"themeId":125852352560,"themeCityHash":"14929622396541519896","contentLanguage":"en","currency":"USD","eventMetadataId":"1a5d0da9-688e-498f-85e1-cc5833519c30"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["764d78cb","8450a54b","7ee89bf1","4c64608a"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":true,"source":"trekkie-storefront-renderer","apiClientId":580111}} 839 ); 840 841 var loaded = false;
842 trekkie.ready(function() { 843 if (loaded) return; 844 loaded = true; 845 846 window.ShopifyAnalytics.lib = window.trekkie; 847 848 var originalDocumentWrite = document.write; 849 document.write = customDocumentWrite; 850 try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {}; 851 document.write = originalDocumentWrite; 852 853 var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/) 854 var token = match? match[1]: undefined; 855 if (!hasLoggedConversion(token)) { 856 setCookieIfConversion(token); 857 858 } 859 }); 860 861 window.ShopifyAnalytics.lib.page(null,{"requestId":"dc34833c-b513-47f9-9893-2f5ad4c6d366-1791136217","shopifyEmitted":true}); 862 863 var eventsListenerScript = document.createElement('script'); 864 eventsListenerScript.async = true; 865 eventsListenerScript.src = "//baconsheir.com/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js"; 866 document.getElementsByTagName('head')[0].appendChild(eventsListenerScript); 867})();</script>
867 868
868<script> 869 if (!window.ga || (window.ga && typeof window.ga !== 'function')) { 870 window.ga = function ga() { 871 (window.ga.q = window.ga.q || []).push(arguments); 872 if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') { 873 window.Shopify.analytics.publish("ga_stub_called", {}, {sendTo: "google_osp_migration"}); 874 } 875 console.error("Shopify's Google Analytics stub called with:", Array.from(arguments), "\nSee https://help.shopify.com/manual/promoting-marketing/pixels/pixel-migration#google for more information."); 876 }; 877 if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') { 878 window.Shopify.analytics.publish("ga_stub_initialized", {}, {sendTo: "google_osp_migration"}); 879 } 880 } 881</script>
vendor: 1 bytes, line 881
881
882<script 883 defer 884 src="https://baconsheir.com/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.9.4.min.js" 885 data-application="storefront-renderer" 886 data-shop-id="8934036" 887 data-render-region="gcp-us-central1" 888 data-page-type="" 889 data-theme-instance-id="125852352560" 890 data-theme-name="Turbo" 891 data-theme-version="4.1.2" 892 data-monorail-region="shop_domain" 893 data-resource-timing-sampling-rate="10" 894 data-shs="true" 895 data-shs-beacon="true" 896 data-shs-export-with-fetch="true" 897 data-shs-logs-sample-rate="1" 898 data-shs-beacon-endpoint="https://baconsheir.com/api/collect" 899></script>
899 900<meta name="shopify-y" content="609262e0-d422-4033-b24f-d5e2da2a68b9" data-expiration="1822693817000"><meta name="shopify-s" content="8f25ef74-d53a-4ba5-849a-0c330b0064db" data-expiration="1791138017000"><meta name="new-cookie-storage-activated" content="t"></head> <noscript> <style> 901 .product_section .product_form, 902 .product_gallery { 903 opacity: 1; 904 } 905 906 .multi_select, 907 form .select { 908 display: block !important; 909 } 910 911 .image-element__wrap { 912 display: none; 913 }</style></noscript> <body class="" 914 data-money-format="$ {{amount}}" data-shop-url="https://baconsheir.com"> <div id="CartDrawer" class="ajaxcart-popup"> <div class="drawer__header"> <div class="table-cell"> <h3>My Cart</h3></div> <div class="table-cell"> <span class="close-cart"> <svg class="icon" id="icon-close" viewBox="0 0 32 32"> <title>close</title> <path class="path1" d="M28.095 5.795l-1.845-1.85-10.21 10.205-10.205-10.205-1.85 1.85 10.21 10.205-10.21 10.205 1.85 1.85 10.205-10.205 10.21 10.205 1.845-1.85-10.205-10.205 10.205-10.205z"></path></svg></span></div></div> <div id="CartContainer"></div> 915</div> <div id="shopify-section-header" class="shopify-section header-section"> 916 917 918<header id="header" class="mobile_nav-fixed--true"> <div class="promo_banner"> <div class="promo_banner__content"> <p><strong>MADE IN THE USA | FREE SHIPPING IN THE USA</strong></p> <img class="lazyload" data-src="//cdn.shopify.com/s/files/1/0893/4036/files/flag-us.svg?v=1634956895" width="24" height="15" alt="USA FLAG" /></div> 919<!-- <div class="promo_banner-close"></div> --></div> <div class="top_bar clearfix"> <a class="mobile_nav dropdown_link" data-dropdown-rel="menu" data-no-instant="true"> <div> <span></span> <span></span> <span></span> <span></span></div></a> <a href="https://baconsheir.com" title="Bacon's Heir" class="mobile_logo logo"> <img src="//cdn.shopify.com/s/files/1/0893/4036/files/Pork-Panko-Logo-Tagline-WHITE-04.svg?v=1643894891" alt="Bacon's Heir" class="lazyload" width="120" height="45" /></a> <div class="top_bar--right"> <a href="/account" class="custom-header-icon" title="My Account "> <img class="lazyload" data-src="//cdn.shopify.com/s/files/1/0893/4036/files/user-icons.png?v=1608645122" alt="My Account " /></a> <a class="site-header__cart custom-header-icon" data-no-instant> <img class="lazyload" data-src="//cdn.shopify.com/s/files/1/0893/4036/files/cart-icons.png?v=1608645122" alt="My cart" /></a></div></div> <div class="dropdown_container" data-dropdown="menu"> <div class="dropdown"> <ul class="menu" id="mobile_menu"> <li data-mobile-dropdown-rel="shop"> <a data-no-instant href="/collections" class="parent-link--true"> 920 Shop</a></li> <li data-mobile-dropdown-rel="explore" class="sublink"> <a data-no-instant href="/" class="parent-link--false"> 921 Explore <span class="right icon-down-arrow"></span></a> <ul> <li><a href="/pages/pork-panko-pork-rind-breadcrumbs">Pork Panko</a></li> <li><a href="/pages/pork-panko-foodservice">Restaurants and Foodservice</a></li></ul></li> <li data-mobile-dropdown-rel="about" class="sublink"> <a data-no-instant href="/pages/press" class="parent-link--true"> 922 About <span class="right icon-down-arrow"></span></a> <ul> <li><a href="/pages/where-to-buy">Where To Buy</a></li> <li><a href="/pages/contact-us">Contact</a></li></ul></li> <li data-mobile-dropdown-rel="recipes" class="sublink"> <a data-no-instant href="/blogs/recipe-landing" class="parent-link--true"> 923 Recipes <span class="right icon-down-arrow"></span></a> <ul> <li><a href="/blogs/recipes">Pork Panko Recipes</a></li> <li><a href="/blogs/holidays">Holidays Favorites</a></li> <li><a href="/pages/how-to-make-pork-rinds">How To Make Pork Rinds</a></li></ul></li> <li data-no-instant> <a href="/account/login" id="customer_login_link">Login</a></li></ul></div></div> 924</header> 925 926 927 928 929<header class=" secondary_logo--true"> <div class="header header-fixed--true header-background--solid"> <div class="promo_banner"> <div class="promo_banner__content"> <p><strong>MADE IN THE USA | FREE SHIPPING IN THE USA</strong></p> <img class="lazyload" data-src="//cdn.shopify.com/s/files/1/0893/4036/files/flag-us.svg?v=1634956895" width="24" height="15" alt="USA FLAG" /></div> 930<!-- <div class="promo_banner-close"></div> --></div> <div class="main_nav_wrapper">
930 <div class="main_nav clearfix menu-position--inline logo-align--left"> <div class="logo text-align--left"> <a href="https://baconsheir.com" title="Bacon's Heir"> <img src="//cdn.shopify.com/s/files/1/0893/4036/files/Pork-Panko-Logo-Tagline-WHITE-04.svg?v=1643894891" class="secondary_logo" alt="Bacon's Heir" /> <img src="//cdn.shopify.com/s/files/1/0893/4036/files/Pork-Panko-Logo-Tagline-WHITE-04.svg?v=1643894891" class="primary_logo lazyload" alt="Bacon's Heir" /></a></div> <div class="nav"> <ul class="menu align_right clearfix"> <div class="vertical-menu"> <li><a href="/collections" class="top_link " data-dropdown-rel="shop">Shop</a></li> <li class="sublink"> <a data-no-instant href="/" class="dropdown_link--vertical " data-dropdown-rel="explore" data-click-count="0">Explore <span class="icon-down-arrow"></span></a> <ul class="vertical-menu_submenu"> <li><a href="/pages/pork-panko-pork-rind-breadcrumbs">Pork Panko</a></li> <li><a href="/pages/pork-panko-foodservice">Restaurants and Foodservice</a></li></ul></li> <li class="sublink"> <a data-no-instant href="/pages/press" class="dropdown_link--vertical " data-dropdown-rel="about" data-click-count="0">About <span class="icon-down-arrow"></span></a> <ul class="vertical-menu_submenu"> <li><a href="/pages/where-to-buy">Where To Buy</a></li> <li><a href="/pages/contact-us">Contact</a></li></ul></li> <li class="sublink"> <a data-no-instant href="/blogs/recipe-landing" class="dropdown_link--vertical " data-dropdown-rel="recipes" data-click-count="0">Recipes <span class="icon-down-arrow"></span></a> <ul class="vertical-menu_submenu"> <li><a href="/blogs/recipes">Pork Panko Recipes</a></li> <li><a href="/blogs/holidays">Holidays Favorites</a></li> <li><a href="/pages/how-to-make-pork-rinds">How To Make Pork Rinds</a></li></ul></li> 931 932 933</div> <div class="vertical-menu"> 934 935</div> <li class="customer-account-icon"> <a href="/account" class="custom-header-icon" title="My Account "> <img class="lazyload" data-src="//cdn.shopify.com/s/files/1/0893/4036/files/user-icons.png?v=1608645122" alt="My Account " /></a></li> <li class="ajax-cart-part"> <a class="site-header__cart custom-header-icon" data-no-instant> <img class="lazyload" data-src="//cdn.shopify.com/s/files/1/0893/4036/files/cart-icons.png?v=1608645122" alt="My cart" /></a></li></ul></div> <div class="dropdown_container" data-dropdown="explore"> <div class="dropdown menu"> <div class="dropdown_content dropdown_narrow"> <div class="dropdown_column"> <ul class="dropdown_item"> <li> <a href="/pages/pork-panko-pork-rind-breadcrumbs">Pork Panko</a></li></ul></div> <div class="dropdown_column"> <ul class="dropdown_item"> <li> <a href="/pages/pork-panko-foodservice">Restaurants and Foodservice</a></li></ul></div></div></div></div> <div class="dropdown_container" data-dropdown="about"> <div class="dropdown menu"> <div class="dropdown_content dropdown_narrow"> <div class="dropdown_column"> <ul class="dropdown_item"> <li> <a href="/pages/where-to-buy">Where To Buy</a></li></ul></div> <div class="dropdown_column"> <ul class="dropdown_item"> <li> <a href="/pages/contact-us">Contact</a></li></ul></div></div></div></div> <div class="dropdown_container" data-dropdown="recipes"> <div class="dropdown menu"> <div class="dropdown_content dropdown_narrow"> <div class="dropdown_column"> <ul class="dropdown_item"> <li> <a href="/blogs/recipes">Pork Panko Recipes</a></li></ul></div> <div class="dropdown_column"> <ul class="dropdown_item"> <li> <a href="/blogs/holidays">Holidays Favorites</a></li></ul></div> <div class="dropdown_column"> <ul class="dropdown_item"> <li> <a href="/pages/how-to-make-pork-rinds">How To Make Pork Rinds</a></li></ul></div></div></div></div></div></div></div> 936</header> 937 938<style> 939 .main_nav div.logo a { 940 padding-top: 25px; 941 padding-bottom: 25px; 942 } 943 944 div.logo img { 945 max-width: 250px; 946 } 947 948 .nav { 949 950 width: 84%; 951 float: left; 952 953 } 954 955 956 .nav ul.menu { 957 padding-top: 40px; 958 padding-bottom: 40px; 959 } 960 961 .sticky_nav ul.menu, .sticky_nav .mini_cart { 962 padding-top: 20px; 963 padding-bottom: 20px; 964 } 965 966 967 968 969 970 body { 971 overscroll-behavior-y: none; 972 } 973 974 975</style> 976 977 978</div> <div class="mega-menu-container"></div> <div class="container main content"> 979 980 981 982 983
984<script src="https://code.jquery.com/jquery-1.12.4.min.js" type="text/javascript"></script>
984 985
986<script src="https://storelocator.w3apps.co/js/iframe/iframeResizer.min.js" type="text/javascript"></script>
986 987
988<script type="text/javascript"> 989 990 var jqSL = jQuery.noConflict(true); 991 992 (function (j2) { 993 994 var domainUrl = 'https://storelocator.w3apps.co'; 995 996 if (!String.prototype.startsWith) { 997 String.prototype.startsWith = function(searchString, position) { 998 position = position || 0; 999 return this.indexOf(searchString, position) === position; 1000 }; 1001 } 1002 1003 j2(function () { 1004 1005 var src = "https://storelocator.w3apps.co/map.aspx"; 1006 1007 src = src + "?shop=" + encodeURIComponent("bacons-heir"); 1008 1009 1010 if (j2('#store-locator-iframe').width() === j2("body").width()) { 1011 src = src + "&container=true"; 1012 } else { 1013 src = src + "&container=false"; 1014 } 1015 1016 j2('#store-locator-iframe').attr("src", src); 1017 1018 var heightCalculationMethod = 'taggedElement'; 1019 1020 if(typeof(storeLocatorIframeHeightMethod) != "undefined") { 1021 heightCalculationMethod = storeLocatorIframeHeightMethod; 1022 } 1023 1024 if(typeof(storeLocatorDebug) != "undefined") { 1025 j2('#store-locator-iframe').iFrameResize({ 1026 heightCalculationMethod: heightCalculationMethod, 1027 checkOrigin: false, 1028 log: true 1029 }); 1030 } else { 1031 j2('#store-locator-iframe').iFrameResize({ 1032 heightCalculationMethod: heightCalculationMethod, 1033 checkOrigin: false 1034 }); 1035 } 1036 1037 1038 1039 setTimeout(function() { 1040 j2('#store-locator-iframe')[0].iFrameResizer.resize(); 1041 }, 100); 1042 1043 }); 1044 1045 1046 1047 1048 1049 1050 setTimeout(function () { 1051 j2("#store-locator-iframe").load(function () { 1052 1053 var cssLinks = j2("head link"); 1054 1055 j2.each(cssLinks, function (index, value) { 1056 1057 if (value.rel == "stylesheet" || value.type == "text/css") { 1058 var href = value.href; 1059 1060 var iframeWindow = j2('#store-locator-iframe')[0].contentWindow; 1061 1062 1063 1064 iframeWindow.postMessage("[addLinkHref]" + href, "*"); 1065 } 1066 }); 1067 }); 1068 1069 1070 }, 1); 1071 1072 })(jqSL); 1073 1074</script>
1074 1075 1076<div class="store-locator-container" style="display:block; position:static;"> 1077 1078<!-- title required for ADA compliance? --> 1079<iframe title="Store Locator App" id="store-locator-iframe" allow="geolocation" frameborder="0" style="width:100%; padding-top:1px;" allowfullscreen></iframe> 1080 1081</div></div> <div id="shopify-section-footer" class="shopify-section footer-section"> 1082 1083<footer class="footer"> <div class="container footer-menu-wrap"> <div class="four columns medium-down--one-whole" > <div class="text-align--left"> <img alt="" 1084 class="footer-logo lazyload blur-up" 1085 data-sizes="25vw" 1086 style="max-width:160px" 1087 data-src="//baconsheir.com/cdn/shop/files/main-new-logo_2048x.png?v=1632791358" 1088 data-srcset=" //baconsheir.com/cdn/shop/files/main-new-logo_200x.png?v=1632791358 200w, 1089 //baconsheir.com/cdn/shop/files/main-new-logo_300x.png?v=1632791358 300w, 1090 //baconsheir.com/cdn/shop/files/main-new-logo_400x.png?v=1632791358 400w, 1091 //baconsheir.com/cdn/shop/files/main-new-logo_500x.png?v=1632791358 500w, 1092 //baconsheir.com/cdn/shop/files/main-new-logo_600x.png?v=1632791358 600w, 1093 //baconsheir.com/cdn/shop/files/main-new-logo_1000x.png?v=1632791358 1000w" 1094 width="160" height="63" 1095 /></div> <div class="footer-social-icons"> <ul class="social_icons"> <li><a href="https://www.instagram.com/BaconsHeir" title="Bacon's Heir on Instagram" rel="me" target="_blank" class="icon-instagram"></a></li> <li><a href="https://www.pinterest.com/baconsheir" title="Bacon's Heir on Pinterest" rel="me" target="_blank" class="icon-pinterest"></a></li> <li><a href="https://twitter.com/baconsheir" title="Bacon's Heir on Twitter" rel="me" target="_blank" class="icon-twitter"></a></li> <li><a href="https://www.facebook.com/PorkClouds" title="Bacon's Heir on Facebook" rel="me" target="_blank" class="icon-facebook"></a></li> 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111</ul></div></div> <div class="four columns medium-down--one-whole" > <div class="footer_menu"> <h6>Explore<span class="right icon-down-arrow"></span></h6> <div class="toggle_content"> <ul> <li><p><a href="/blogs/recipes">Recipes</a></p></li> <li><p><a href="/pages/how-to-make-pork-rinds">Videos</a></p></li></ul></div></div></div> <div class="four columns medium-down--one-whole" > <div class="footer_menu"> <h6>Info<span class="right icon-down-arrow"></span></h6> <div class="toggle_content"> <ul> <li><p><a href="/pages/press">The Story</a></p></li> <li><p><a href="/apps/store-locator">Where to Buy</a></p></li> <li><p><a href="/pages/contact-us">Contact</a></p></li></ul></div></div></div> <div class="four columns medium-down--one-whole" > <div class="newsletter_section"> <h6>Connect</h6> <p>Sign up for recipes, updates, deals and more!</p> <div class="newsletter"> <span class="message"></span> <form action="https://manage.kmail-lists.com/subscriptions/subscribe?a=Jcz7Sj&g=QeCcx2" method="post" name="mc-embedded-subscribe-form" id="contact_form" target="_blank"> <label for="Email-footer" class="hide" aria-label="Email">Email</label> <input type="email" value="" name="EMAIL" id="Email-footer" class="contact_email" placeholder="Email"> <input type="submit" value="Join" class="action_button sign_up" name="subscribe" /></form></div></div></div> <p class="footer-extra-text mobile-only">Keep it crispy.</p> <div class="footer-social-icons--mobile sixteen columns"> <ul class="social_icons"> <li><a href="https://www.instagram.com/BaconsHeir" title="Bacon's Heir on Instagram" rel="me" target="_blank" class="icon-instagram"></a></li> <li><a href="https://www.pinterest.com/baconsheir" title="Bacon's Heir on Pinterest" rel="me" target="_blank" class="icon-pinterest"></a></li> <li><a href="https://twitter.com/baconsheir" title="Bacon's Heir on Twitter" rel="me" target="_blank" class="icon-twitter"></a></li> <li><a href="https://www.facebook.com/PorkClouds" title="Bacon's Heir on Facebook" rel="me" target="_blank" class="icon-facebook"></a></li> 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127</ul></div> <div class="sixteen columns row footer_credits"> <div class="footer-extra-nav"> <p class="footer-extra-text desktop-only">Keep it crispy.</p> <ul> <li><a href="/pages/privacy-policy">Privacy Policy</a></li> <li>| Copyright 1128 © 2026 <a href="/" title="">Bacon's Heir</a>, INC.</li></ul></div></div><!--end footer_credits--></div></div> 1129</footer> 1130 1131</div>
1131<script src="//baconsheir.com/cdn/shop/t/84/assets/jquery.min.js?v=9503732020592794151700515182"></script>
1131
1131<script type="lazyload2" data-src="//baconsheir.com/cdn/shop/t/84/assets/vendors.js?v=64406799660333671781700515182" async="async"></script>
1131
1131<script type="lazyload2" data-src="//baconsheir.com/cdn/shop/t/84/assets/sections.js?v=57129191927433064001700515183" async="async"></script>
1131
1131<script type="lazyload2" data-src="//baconsheir.com/cdn/shop/t/84/assets/utilities.js?v=69464337000709086621700515197" async="async"></script>
1131
1131<script type="lazyload2" data-src="//baconsheir.com/cdn/shop/t/84/assets/app.js?v=7275200813813256311700515183" async="async"></script>
1131
1131<script type="lazyload2" data-src="//baconsheir.com/cdn/shop/t/84/assets/slick.min.js?v=86595272622966071931700515182" async="async"></script>
1131
1131<script type="lazyload2" data-src="//baconsheir.com/cdn/shop/t/84/assets/custom.js?v=178324571471027900671700515182" async="async"></script>
1131
1131<script type="lazyload2" data-src="//baconsheir.com/cdn/shop/t/84/assets/handlebars.min.js?v=34659044619744043361700515182"></script>
1131 1132<!-- /snippets/ajax-cart-template.liquid -->
1132<script id="CartTemplate" type="text/template"> <form action="/cart" method="post" novalidate class="cart ajaxcart"> <div class="ajaxcart__inner"> 1133 {{#items}} <div class="ajaxcart__product"> <div class="ajaxremove"> <a href="/cart/change?line={{line}}&quantity=0" class="ajaxifyCartremove" data-line="{{line}}"> <svg class="icon" id="icon-close" viewBox="0 0 32 32"> <title>close</title> <path class="path1" d="M28.095 5.795l-1.845-1.85-10.21 10.205-10.205-10.205-1.85 1.85 10.21 10.205-10.21 10.205 1.85 1.85 10.205-10.205 10.21 10.205 1.845-1.85-10.205-10.205 10.205-10.205z"></path></svg></a></div> <div class="ajaxcart row" data-line="{{line}}"> <div class="two-sixths columns"> <a href="{{url}}" class="ajaxcart__product-image"><img src="{{img}}" alt=""></a></div> <div class="four-sixths columns"> <p> <a href="{{url}}" class="ajaxcart__product-name">{{name}}</a> 1134 {{#if variation}} <span class="ajaxcart__product-meta">{{variation}}{{{recurring}}}</span> 1135 {{/if}} 1136 {{#properties}} 1137 {{#each this}} 1138 {{#if this}} <span class="ajaxcart__product-meta">{{@key}}: {{this}}</span> 1139 {{/if}} 1140 {{/each}} 1141 {{/properties}}</p> <p><strong>{{{price}}}</strong></p> <div class="display-table"> <div class="ajaxcart__qty"> <button type="button" class="ajaxcart__qty-adjust ajaxcart__qty--minus quantity-increment" data-id="{{id}}" data-qty="{{itemMinus}}" data-line="{{line}}"> <span>−
1141</span></button> <input type="text" name="updates[]" class="ajaxcart__qty-num" value="{{itemQty}}" min="0" data-id="{{id}}" data-line="{{line}}" aria-label="quantity" pattern="[0-9]*"> <button type="button" class="ajaxcart__qty-adjust ajaxcart__qty--plus quantity-increment" data-id="{{id}}" data-line="{{line}}" data-qty="{{itemAdd}}"> <span>+</span></button></div></div></div></div></div> 1142 {{/items}}</div> <div class="ajaxcart__footer row"> <div class="one-half columns"> <p><strong>Subtotal</strong></p></div> <div class="one-half columns"> <p class="text-right"><strong>{{{totalPrice}}}</strong></p></div> <p class="text-center">Shipping calculated at check out</p> <div class="product_rp_cart_div"></div> <button type="submit" class="cart__checkout" name="checkout"> 1143 Checkout →</button> <div class="additional-checkout-buttons"><div class="dynamic-checkout__content" id="dynamic-checkout-cart" data-shopify="dynamic-checkout-cart"> <shopify-accelerated-checkout-cart wallet-configs="[{"supports_subs":true,"supports_def_opts":false,"name":"shop_pay","wallet_params":{"shopId":8934036,"merchantName":"Bacon's Heir","personalized":true}},{"supports_subs":true,"supports_def_opts":false,"name":"paypal","wallet_params":{"shopId":8934036,"countryCode":"US","merchantName":"Bacon's Heir","phoneRequired":false,"companyRequired":false,"shippingType":"shipping","shopifyPaymentsEnabled":true,"hasManagedSellingPlanState":false,"requiresBillingAgreement":false,"gatewayType":"MANAGED","merchantId":"NJWA2K7YWMUM2","sdkUrl":"https://www.paypal.com/sdk/js?components=buttons\u0026commit=false\u0026currency=USD\u0026locale=en_US\u0026client-id=AbasDhzlU0HbpiStJiN1KRJ_cNJJ7xYBip7JJoMO0GQpLi8ePNgdbLXkC7_KMeyTg8tnAKW4WKrh9qmf\u0026merchant-id=NJWA2K7YWMUM2\u0026intent=authorize","serviceableCountryCodes":["US"]}}]" access-token="e9c23d0f6b8b03036d15a3c280cff6f7" buyer-country="US" buyer-locale="en" buyer-currency="USD" shop-id="8934036" cart-id="1e6d6710faf0a115628839f8c691ab75" enabled-flags="["1172c16a","a1d1f9a1","f5afabb3","370070f3"]" > <div class="wallet-button-wrapper"> <ul class='wallet-cart-grid wallet-cart-grid--skeleton' role="list" data-shopify-buttoncontainer="true"> <li data-testid='grid-cell' class='wallet-cart-button-container'><div class='wallet-cart-button wallet-cart-button__skeleton' role='button' disabled aria-hidden='true'> </div></li><li data-testid='grid-cell' class='wallet-cart-button-container'><div class='wallet-cart-button wallet-cart-button__skeleton' role='button' disabled aria-hidden='true'> </div></li></ul></div></shopify-accelerated-checkout-cart></div></div></div> <div id="cart-upsell-product" data-id=""> <div class="upsell-product-image"> <img src="//baconsheir.com/cdn/shopifycloud/storefront/assets/no-image-2048-a2addb12.gif" /></div> <div class="upsell-product-content"> <div class="offer-content"> <h6></h6></div> <span class="variants-wrapper"> <select name="id" data-productid="" class="upsell-variants"></select></span> <input name="quantity" type="hidden" class="upsell-qty" value="1"> <a name="add" class="btn ajax-upsell-button">Add to Cart</a></div></div></form></script>
1143
1143<script id="AjaxQty" type="text/template"> <div class="ajaxcart__qty"> <button type="button" class="ajaxcart__qty-adjust ajaxcart__qty--minus icon-fallback-text" data-id="{{id}}" data-qty="{{itemMinus}}"> <span class="icon icon-minus" aria-hidden="true"></span> <span class="fallback-text">−</span></button> <input type="text" class="ajaxcart__qty-num" value="{{itemQty}}" min="0" data-id="{{id}}" aria-label="quantity" pattern="[0-9]*"> <button type="button" class="ajaxcart__qty-adjust ajaxcart__qty--plus icon-fallback-text" data-id="{{id}}" data-qty="{{itemAdd}}"> <span class="icon icon-plus" aria-hidden="true"></span> <span class="fallback-text">+</span></button></div></script>
1143
1143<script id="JsQty" type="text/template"> <div class="js-qty"> <button type="button" class="js-qty__adjust js-qty__adjust--minus quantity-increment" data-id="{{id}}" data-qty="{{itemMinus}}"> <span>−</span></button> <input type="text" class="js-qty__num" value="{{itemQty}}" min="1" data-id="{{id}}" aria-label="quantity" pattern="[0-9]*" name="{{inputName}}" id="{{inputId}}"> <button type="button" class="js-qty__adjust js-qty__adjust--plus quantity-increment" data-id="{{id}}" data-qty="{{itemAdd}}"> <span>+</span></button></div></script>
vendor: 1 bytes, line 1143
1143
1144<script type="lazyload2" data-src="//baconsheir.com/cdn/shop/t/84/assets/ajax-cart.js?v=142930791738274788111700515183"></script>
1144 1145
1146<script type="lazyload2"> 1147 jQuery(function($) { 1148 ajaxCart.init({ 1149 formSelector: '.AddToCartForm', 1150 cartContainer: '#CartContainer', 1151 addToCartSelector: '.AddToCart', 1152 cartCountSelector: '.CartCount', 1153 cartCostSelector: '.CartCost', 1154 moneyFormat: "$ {{amount}}", 1155 onToggleCallback: function(cart) { 1156 Currency.convertAll(shopCurrency, Currency.currentCurrency); 1157 jQuery('.selected-currency').text(Currency.currentCurrency); 1158 } 1159 }); 1160 }); 1161// jQuery('body').on('ajaxCart.afterCartLoad', function(evt, cart) { 1162// // Bind to 'ajaxCart.afterCartLoad' to run any javascript after the cart has loaded in the DOM 1163// timber.RightDrawer.open(); 1164// }); 1165</script>
1165 1166
1167<script type="lazyload2"> 1168 1169 $('body').on('click', '.site-header__cart', function(e){ 1170 ajaxCart.load(); 1171 $('body').toggleClass("iscartpopup"); 1172 $('body').parents('html').toggleClass('iscartpopup'); 1173 e.preventDefault(); 1174 }); 1175 1176 $('.close-cart').click(function(e){ 1177 $('body').toggleClass("iscartpopup"); 1178 $('body').parents('html').toggleClass('iscartpopup'); 1179 }); 1180 1181 $('body').click(function(e){ 1182 if( $(e.target).is('.iscartpopup') ) { 1183 e.preventDefault(); 1184 $(this).removeClass('iscartpopup'); 1185 $(this).parents('html').removeClass('iscartpopup'); 1186 } 1187 }); 1188 1189 $('.AddToCart').click(function(){ 1190 if(!$('body').hasClass("iscartpopup")){ 1191 $('body').toggleClass("iscartpopup"); 1192 $('body').parents('html').toggleClass('iscartpopup'); 1193 } 1194 }); 1195 1196</script>
1196
1196<script> 1197 $(document).on('change', '.fancybox-skin', function(){ 1198 if(BOLD && BOLD.recurring_orders && BOLD.recurring_orders.app && BOLD.recurring_orders.app.productForms){ 1199 if(BOLD.recurring_orders.app.productForms.indexOf(this) === -1){ 1200 if (typeof BOLD.recurring_orders.app.reboot === 'function'){ 1201 BOLD.recurring_orders.app.reboot(); 1202 } 1203 } 1204 } 1205 });</script>
1205
1205<script></script>
1205 1206 1207
1207<script async src="https://loox.io/widget/4ygBeWDOSO/loox.1584361940284.js?shop=bacons-heir.myshopify.com"></script>
1207
1207<script> 1208 var STYLE_VAR_MAP = { 1209 FreqButtonBackgroundColor: { 1210 cssVar: '--awt-freq-button-background', 1211 defaultVal: '#F0F0F0', 1212 }, 1213 FreqButtonBackgroundColorHover: { 1214 cssVar: '--awt-freq-button-background-hover', 1215 defaultVal: '#DDD', 1216 }, 1217 FreqButtonColor: { 1218 cssVar: '--awt-freq-button-color', 1219 defaultVal: '#000', 1220 }, 1221 FreqButtonColorHover: { 1222 cssVar: '--awt-freq-button-color-hover', 1223 defaultVal: '#000', 1224 }, 1225 FreqButtonBorder: { 1226 cssVar: '--awt-freq-button-border', 1227 defaultVal: '1px solid #000', 1228 }, 1229 FreqButtonBorderHover: { 1230 cssVar: '--awt-freq-button-border-hover', 1231 defaultVal: '1px solid #000', 1232 }, 1233 FreqButtonBorderRadius: { 1234 cssVar: '--awt-freq-button-border-radius', 1235 defaultVal: '0', 1236 }, 1237 FreqButtonBackgroundColorSelected: { 1238 cssVar: '--awt-freq-button-background-selected', 1239 defaultVal: '#000', 1240 }, 1241 FreqButtonBackgroundColorHoverSelected: { 1242 cssVar: '--awt-freq-button-background-hover-selected', 1243 defaultVal: '#000', 1244 }, 1245 FreqButtonColorSelected: { 1246 cssVar: '--awt-freq-button-color-selected', 1247 defaultVal: '#FFF', 1248 }, 1249 FreqButtonColorHoverSelected: { 1250 cssVar: '--awt-freq-button-color-hover-selected', 1251 defaultVal: '#FFF', 1252 }, 1253 FreqButtonBorderSelected: { 1254 cssVar: '--awt-freq-button-border-selected', 1255 defaultVal: '1px solid #000', 1256 }, 1257 FreqButtonBorderHoverSelected: { 1258 cssVar: '--awt-freq-button-border-hover-selected', 1259 defaultVal: '1px solid #000', 1260 }, 1261 PrimaryButtonBackgroundColor: { 1262 cssVar: '--awt-primary-button-background', 1263 defaultVal: '#000', 1264 }, 1265 PrimaryButtonBackgroundColorHover: { 1266 cssVar: '--awt-primary-button-background-hover', 1267 defaultVal: '#000', 1268 }, 1269 PrimaryButtonColor: { 1270 cssVar: '--awt-primary-button-color', 1271 defaultVal: '#FFF', 1272 }, 1273 PrimaryButtonColorHover: { 1274 cssVar: '--awt-primary-button-color-hover', 1275 defaultVal: '#FFF', 1276 }, 1277 PrimaryButtonBorder: { 1278 cssVar: '--awt-primary-button-border', 1279 defaultVal: '0px solid #FFF', 1280 }, 1281 PrimaryButtonBorderHover: { 1282 cssVar: '--awt-primary-button-border-hover', 1283 defaultVal: '0px solid #FFF', 1284 }, 1285 PrimaryButtonBorderRadius: { 1286 cssVar: '--awt-primary-button-border-radius', 1287 defaultVal: '4px', 1288 }, 1289 RadioButtonBackgroundColor: { 1290 cssVar: '--awt-radio-button-background', 1291 defaultVal: '#000', 1292 }, 1293 BorderColor: { 1294 cssVar: '--awt-border-color', 1295 defaultVal: '#e6e6e6', 1296 }, 1297 BorderRadius: { 1298 cssVar: '--awt-border-radius', 1299 defaultVal: '3px', 1300 }, 1301 SelectedPlanBackgroundColor: { 1302 cssVar: '--awt-selected-plan-background', 1303 defaultVal: '#EEE', 1304 }, 1305 SelectedPlanBorderColor: { 1306 cssVar: '--awt-selected-plan-border-color', 1307 defaultVal: '#000', 1308 },
1309 ProgressBarBackgroundColor: { 1310 cssVar: '--awt-progress-bar-background', 1311 defaultVal: '#000', 1312 }, 1313 ProgressBarColor: { 1314 cssVar: '--awt-progress-bar-color', 1315 defaultVal: '#FFF', 1316 }, 1317 AccentBackgroundColor: { 1318 cssVar: '--awt-accent-background', 1319 defaultVal: '#000', 1320 }, 1321 AccentColor: { 1322 cssVar: '--awt-accent-color', 1323 defaultVal: '#FFF', 1324 }, 1325 }; 1326 1327 (function () { 1328 window.bundleapp = window.bundleapp || {}; 1329 window.bundleapp.settings = Object.assign( 1330 {}, 1331 window.bundleapp.settings || {}, 1332 // All configs that where here have been moved to other places 1333 // the moneyFormat is now fetched below via ajax 1334 // other settings are set to the global namespace on the script tag handler 1335 // So this code here is only a reminder that the attribute exists 1336 1337 /** 1338 * Theme specific settings: 1339 * This is a quick and dirty way to get some theme specific settings into the app. 1340 * 1341 * priceContainerSel Array<String> selector string for the price container 1342 * comparePriceContainerSel Array<String> selector string for compare at price container 1343 * priceBadgeContainer Array<String> selector string for the price Badge container 1344 * hideIfUnavailable Boolean hides selling plans if variant is unavailable/out of stock 1345 * containerClass String Adds a class to the container where the widget renders 1346 * renderInsideSel String Selector to render the widget inside 1347 * renderAfterSel String Selector to render the widget after 1348 * renderBeforeSel String Selector to render the widget before 1349 * useRadioButtonFrequencySelector Boolean use radio buttons instead of a select 1350 * addToCartButtonSel Selector string to locale the add to cart button inside form[action='/cart/add'] 1351 * formDomChangeElementsSel String selector for items to listen to and trigger handleFormDomChanged (ex: 'li.variantSwatch' or 'li.variantSwatch, button.variantItem') 1352 * - use this when the items to select variant are not input fields and as such would not be listened to by our script naturally 1353 * */ 1354 { 1355 hideIfUnavailable: false, 1356 proxy: '/tools/bundle-subscriptions', 1357 appPublic: true, 1358 moneyFormat: '$\{\{amount\}\}', 1359 shopStyleSettings: {}, 1360 defaultSubscription: true, 1361 }, 1362 ); 1363 1364 window.bundleapp.setThemeConfigs = (obj) => { 1365 window.bundleapp.settings = Object.assign( 1366 {}, 1367 window.bundleapp.settings, 1368 obj, 1369 ); 1370 }; 1371 1372 var showPreviewModeControl = function () { 1373 const previewModeControlHtml = ` <div id="awt-preview-mode-control"> <div class="awt-logo"> <div class="awt-logo--image"></div> <span>Preview</span> <a href="https://help.awtomatic.app/en/articles/5593674-previewing-and-testing-your-subscriptions" target="_blank"><div class="awt-logo--info-icon"></div></a></div> <div> <!-- <button id="awt-preview-mode-control__hide">Hide</button> --> <button id="awt-preview-mode-control__close">Close</button></div></div> 1374 `; 1375 const $previewModelEl = document.createElement('div'); 1376 $previewModelEl.innerHTML = previewModeControlHtml; 1377 document.querySelector('body').appendChild($previewModelEl); 1378 1379 // not removing this yet bc its set to be used in a v2 version of the preview mode controls 1380 const hidePreviewControl = function () { 1381 document 1382 .querySelector('#awt-preview-mode-control') 1383 .classList.add('hidden'); 1384 }; 1385 const closePreviewMode = function () { 1386 window.localStorage.removeItem(PREVIEW_MODE_STORAGE_KEY); 1387 insertUrlParam('awt-preview'); 1388 window.location.reload(); 1389 }; 1390 // document 1391 // .querySelector('#awt-preview-mode-control__hide') 1392 // .addEventListener('click', hidePreviewControl); 1393 document 1394 .querySelector('#awt-preview-mode-control__close') 1395 .addEventListener('click', closePreviewMode); 1396 }; 1397 1398 var getShopInfo = function () { 1399 const moneyFormat = 1400 window.moneyFormat || 1401 (window.theme && window.theme.moneyFormat) || 1402 (window.theme && 1403 window.theme.strings && 1404 window.theme.strings.moneyFormat) || 1405 (window.theme && 1406 window.theme.settings && 1407 window.theme.settings.moneyFormat) || 1408 (window.bundleapp && window.bundleapp.settings && window.bundleapp.settings.moneyFormat); 1409 if (moneyFormat) { 1410 window.bundleapp.settings = Object.assign({}, window.bundleapp.settings, { 1411 moneyFormat: moneyFormat, 1412 }); 1413 return Promise.resolve(); 1414 } 1415 1416 return fetch(window.bundleapp.settings.proxy + '/shop-info') 1417 .then(function (res) { 1418 return res.json(); 1419 }) 1420 .then(function (data) { 1421 window.bundleapp.settings = Object.assign( 1422 {}, 1423 window.bundleapp.settings, 1424 data, 1425 ); 1426 }); 1427 }; 1428 1429 var setCssVars = function (styleSettings) { 1430 if (styleSettings) { 1431 // update CSS vars 1432 var root = document.querySelector(':root'); 1433 for (var styleSettingsKey in STYLE_VAR_MAP) { 1434 styleSettings[styleSettingsKey] && 1435 root.style.setProperty( 1436 STYLE_VAR_MAP[styleSettingsKey].cssVar, 1437 styleSettings[styleSettingsKey], 1438 ); 1439 } 1440 } 1441 }; 1442 1443 var insertUrlParam = function (key, value) { 1444 if (history.replaceState) { 1445 let searchParams = new URLSearchParams(window.location.search); 1446 if (value) { 1447 searchParams.set(key, value); 1448 } else { 1449 searchParams.delete(key); 1450 } 1451 let newurl = 1452 window.location.protocol + 1453 '//' + 1454 window.location.host + 1455 window.location.pathname + 1456 '?' + 1457 searchParams.toString(); 1458 window.history.replaceState({ path: newurl }, '', newurl); 1459 } 1460 }; 1461 1462 var formatMoney = function (cents, format) { 1463 if (typeof cents == 'string') { 1464 cents = cents.replace('.', ''); 1465 } 1466 var value = ''; 1467 var placeholderRegex = /\{\{\s*(\w+)\s*\}\}/; 1468 var formatString = format || window.bundleapp.settings.moneyFormat; 1469 1470 function defaultOption(opt, def) { 1471 return typeof opt == 'undefined' ? def : opt; 1472 } 1473 1474 function formatWithDelimiters(number, precision, thousands, decimal) { 1475 precision = defaultOption(precision, 2); 1476 thousands = defaultOption(thousands, ','); 1477 decimal = defaultOption(decimal, '.'); 1478 1479 if (isNaN(number) || number == null) { 1480 return 0; 1481 } 1482 1483 number = (number / 100.0).toFixed(precision); 1484 1485 var parts = number.split('.'), 1486 dollars = parts[0].replace( 1487 /(\d)(?=(\d\d\d)+(?!\d))/g, 1488 '$1' + thousands, 1489 ), 1490 cents = parts[1] ? decimal + parts[1] : ''; 1491 1492 return dollars + cents; 1493 } 1494 1495 switch (formatString.match(placeholderRegex)[1]) { 1496 case 'amount': 1497 value = formatWithDelimiters(cents, 2); 1498 break; 1499 case 'amount_no_decimals': 1500 value = formatWithDelimiters(cents, 0); 1501 break; 1502 case 'amount_with_comma_separator': 1503 value = formatWithDelimiters(cents, 2, '.', ','); 1504 break; 1505 case 'amount_no_decimals_with_comma_separator': 1506 value = formatWithDelimiters(cents, 0, '.', ','); 1507 break; 1508 } 1509 1510 return formatString.replace(placeholderRegex, value); 1511 }; 1512 // FIXME eslint error 1513 // eslint-disable-next-line no-undef 1514 debounce = function (func, wait, immediate) { 1515 var timeout; 1516 return function () { 1517 var context = this, 1518 args = arguments; 1519 var later = function () { 1520 timeout = null;
1521 if (!immediate) func.apply(context, args); 1522 }; 1523 var callNow = immediate && !timeout; 1524 clearTimeout(timeout); 1525 timeout = setTimeout(later, wait); 1526 if (callNow) func.apply(context, args); 1527 }; 1528 }; 1529 // Method to get closes matching parent source: https://gomakethings.com/a-native-vanilla-javascript-way-to-get-the-closest-matching-parent-element/ 1530 if (window.Element && !Element.prototype.closest) { 1531 Element.prototype.closest = function (s) { 1532 var matches = (this.document || this.ownerDocument).querySelectorAll(s), 1533 i, 1534 el = this; 1535 do { 1536 i = matches.length; 1537 // FIXME eslint error 1538 // eslint-disable-next-line no-empty 1539 while (--i >= 0 && matches.item(i) !== el) {} 1540 } while (i <0 && (el = el.parentElement)); 1541 return el; 1542 }; 1543 } 1544 1545 var priceBadgeContainer = () => 1546 [ 1547 'form.product__form--add-to-cart .product__price', // Boundless 1548 '.product-single__meta .price-container', //Brooklyn 1549 '.product__price .price__pricing-group', // Debut 1550 '.product__content .price__pricing-group', // Express 1551 '.product-single__prices', // Minimal, Simple 1552 '.product__content-header .product__price', // Narrative 1553 '.inline-list.product-meta', // Supply 1554 '.product-single__meta-list', // Venture 1555 ] 1556 .concat(window.bundleapp.settings.priceBadgeContainer || []) 1557 .join(', '); 1558 1559 const priceContainerSel = () => 1560 [ 1561 '.price__regular', // debut, express 1562 '.product-single__price', // brooklin, minimal 1563 '.product__current-price', // narrative 1564 '#productPrice-product-template', // supply, venture 1565 '.product__price--reg', // boundless 1566 ] 1567 .concat(window.bundleapp.settings.priceContainerSel || []) 1568 .join(', '); 1569 1570 const comparePriceContainerSel = () => 1571 [ 1572 '.price--on-sale .price__sale', // debut, express 1573 '.product-single__price--compare-at', // brooklin 1574 '.product-single__sale-price', // minimal 1575 '.product__compare-price', //narrative 1576 '.product-single__price--compare', // simple, venture 1577 '.product__price .product__price--sale', // boundless 1578 '.product-meta .sale-tag', // supply 1579 ] 1580 .concat(window.bundleapp.settings.comparePriceContainerSel || []) 1581 .join(', '); 1582 1583 const planSelectorSel = '.bundleapp-plan-selector-plan'; 1584 1585 const addToCartButtonSel = () => 1586 ['button[type=submit]'] 1587 .concat(window.bundleapp.settings.addToCartButtonSel || []) 1588 .join(', '); 1589 1590 const PREVIEW_MODE_STORAGE_KEY = 'awtomatic-preview-mode'; 1591 1592 /* Functions for gift form data validation */ 1593 const getField = (fieldId) => document.getElementById(fieldId); 1594 const getFieldValue = (fieldId) => getField(fieldId).value; 1595 const isEmpty = (str) => str === ''; 1596 const emailIsValid = (email) => 1597 /^[A-Z0-9._%+-]+@([A-Z0-9-]+\.)+[A-Z0-9]+$/i.test(email); 1598 const isFieldValid = (fieldId) => 1599 getField(fieldId).getAttribute('data-invalid') == undefined; 1600 const toggleAddToCart = (target, isValidForm) => { 1601 const form = target.closest('form'); 1602 const addToCartBtn = form.querySelector(addToCartButtonSel()); 1603 if (addToCartBtn) { 1604 if (isValidForm) { 1605 addToCartBtn.removeAttribute('disabled'); 1606 } else { 1607 addToCartBtn.setAttribute('disabled', true); 1608 } 1609 } 1610 const customizeBtn = form.querySelector('#awt-customize-box-btn'); 1611 if (customizeBtn) { 1612 if (isValidForm) { 1613 customizeBtn.removeAttribute('disabled'); 1614 } else { 1615 customizeBtn.setAttribute('disabled', true); 1616 } 1617 } 1618 }; 1619 1620 const toggleFieldValid = (field, isInvalid, message) => { 1621 const msg = field.parentElement.getElementsByClassName('awt-error-msg'); 1622 if (isInvalid) { 1623 field.classList.add('awt-input-error'); 1624 field.classList.add('awt-error'); 1625 1626 field.setAttribute('data-invalid', true); 1627 if (msg.length === 0) { 1628 const errorLabel = document.createElement('div'); 1629 errorLabel.classList.add('awt-error-msg'); 1630 errorLabel.innerText = message; 1631 field.parentElement.insertBefore( 1632 errorLabel, 1633 field.parentElement.lastElementChild, 1634 ); 1635 } 1636 } else { 1637 field.classList.remove('awt-input-error'); 1638 field.classList.remove('awt-error'); 1639 1640 if (msg.length > 0) { 1641 msg[0].remove(); 1642 } 1643 field.removeAttribute('data-invalid'); 1644 } 1645 }; 1646 1647 const isGiftFormValid = () => 1648 isFieldValid('awtGiftInfoFirstName') && 1649 isFieldValid('awtGiftInfoLastName') && 1650 isFieldValid('awtGiftInfoEmail'); 1651 1652 const validateRequiredField = (event) => { 1653 const isFieldEmpty = isEmpty(getFieldValue(event.target.id)); 1654 toggleFieldValid(event.target, isFieldEmpty, 'Required'); 1655 toggleAddToCart(event.target, isGiftFormValid()); 1656 }; 1657 1658 const validateEmailField = (event) => { 1659 const isValidEmail = emailIsValid(getFieldValue(event.target.id)); 1660 toggleFieldValid(event.target, !isValidEmail, 'Invalid email'); 1661 toggleAddToCart(event.target, isGiftFormValid()); 1662 }; 1663 1664 /** 1665 * Awtomatic Selector Widget 1666 * */ 1667 1668 function BundleAppWidget($selector, product) { 1669 this.product = product; 1670 this.isGiftSelected = false;
1671 this.$selector = $selector; 1672 this.$sellingPlanField = this.$selector.querySelector( 1673 'input[name=selling_plan]', 1674 ); 1675 this.$wrapper = this.$selector.closest( 1676 'div[data-section-type], .shopify-section, body', 1677 ); 1678 this.$planGroups = this.$selector.querySelectorAll( 1679 '.bundleapp-plan-selector-group', 1680 ); 1681 this.$form = this.$selector.closest('form'); 1682 this.$variantSelect = this.$form.querySelector('[name=id]'); 1683 this.$badgePriceEl = this.$wrapper.querySelector(priceBadgeContainer()); 1684 if (!this.$badgePriceEl) 1685 console.warn('Did not find a badge container element'); 1686 // FIXME eslint error 1687 // eslint-disable-next-line no-undef 1688 this.setPlansVisibility = debounce( 1689 this._baseSetPlansVisibility.bind(this), 1690 50, 1691 ); 1692 1693 this.init(); 1694 this.setPlansVisibility(); 1695 if (window.bundleapp.settings.onInit) { 1696 window.bundleapp.settings.onInit.call(this); 1697 } 1698 if (window.bundleapp.onInit) { 1699 console.warn( 1700 'onInit will be deprecated soon. Please use bundleapp.settings.onInit instead', 1701 ); 1702 window.bundleapp.onInit.call(this); 1703 } 1704 } 1705 1706 Object.assign(BundleAppWidget.prototype, { 1707 init: function () { 1708 this.$selector.style.display = 'block'; 1709 this.$planGroups.forEach( 1710 function (elem) { 1711 var $planGroupRadio = elem.querySelector( 1712 "input[name='bundleapp-plan-selector-group']", 1713 ); 1714 var groupId = $planGroupRadio.value; 1715 var selectedPlanGroup = this.product.selling_plans_by_id[ 1716 this.product.selected_selling_plan 1717 ? this.product.selected_selling_plan.id 1718 : null 1719 ]; 1720 var isSelectedGroup = !!( 1721 selectedPlanGroup && 1722 selectedPlanGroup.selling_plan_group_id === groupId 1723 ); 1724 1725 this.handleGiftVisibility(isSelectedGroup); 1726 1727 $planGroupRadio.addEventListener( 1728 'change', 1729 this.handlePlanRadioChange.bind(this), 1730 ); 1731 elem 1732 .querySelector('select') 1733 .addEventListener( 1734 'change', 1735 this.handlePlanOptionsChange.bind(this), 1736 ); 1737 var $radioButtonsfrequencySelector = elem.querySelectorAll( 1738 '.bundleapp-plan-selector-radio__input', 1739 ); 1740 for ( 1741 let index = 0; 1742 index <$radioButtonsfrequencySelector.length; 1743 index++ 1744 ) { 1745 $radioButtonsfrequencySelector[index].addEventListener( 1746 'change', 1747 this.handlePlanOptionsChange.bind(this), 1748 ); 1749 } 1750 }.bind(this), 1751 ); 1752 1753 //Ads an event listener to every element in the form 1754 const $selectorElements = Array.from( 1755 this.$selector.querySelectorAll('input, select'), 1756 ); 1757 Array.from(this.$form.elements).forEach( 1758 function (el) { 1759 if ( 1760 !$selectorElements.includes(el) && 1761 el.tagName !== 'BUTTON' && 1762 el.type !== 'hidden' 1763 ) { 1764 el.addEventListener('change', this.handleFormDomChanged.bind(this)); 1765 } 1766 }.bind(this), 1767 ); 1768 1769 if (window.bundleapp.settings.defaultSubscription) { 1770 const $oneTimeRadio = this.$selector.querySelector('[data-one-time]'); 1771 1772 // Only if one time is available and defaultSubscription enabled we set checked 1773 // the first selling plan group. If there is no one-time option, we already 1774 // mark the first selling plan checked 1775 if ($oneTimeRadio) { 1776 const $firstSellingPlanGroup = this.$selector.querySelector( 1777 '[data-one-time] + .bundleapp-plan-selector-group input', 1778 ); 1779 $firstSellingPlanGroup.dispatchEvent(new Event('change')); 1780 } 1781 } 1782 1783 if (window.bundleapp.settings.formDomChangeElementsSel) { 1784 const $variantEls = document.querySelectorAll( 1785 window.bundleapp.settings.formDomChangeElementsSel, 1786 );
1787 $variantEls.forEach( 1788 function (el) { 1789 el.addEventListener('click', this.handleFormDomChanged.bind(this)); 1790 }.bind(this), 1791 ); 1792 } 1793 }, 1794 1795 getTranslation: function (key, fallback) { 1796 let translation = this.product?.translations[key]; 1797 if (translation.includes('translation missing')) { 1798 translation = fallback; 1799 } 1800 return translation; 1801 }, 1802 1803 handleGiftVisibility: function (isSelectedGroup) { 1804 let isGiftable = 1805 this.product && 1806 this.product.gift_selling_plans && 1807 this.product.gift_selling_plans.includes( 1808 this.product.selected_selling_plan && 1809 this.product.selected_selling_plan.id, 1810 ); 1811 const giftCheckBox = document.querySelector('input[name="awt-is-gift"]'); 1812 1813 if (isGiftable && !giftCheckBox && isSelectedGroup) { 1814 this.isGiftSelected = true; 1815 let isGiftCheckboxLabel = document.createElement('label'); 1816 isGiftCheckboxLabel.classList.add('awt-checkbox'); 1817 let isGiftCheckbox = document.createElement('input'); 1818 const giftTitle = this.getTranslation( 1819 'gift_recipient_info_title', 1820 'Recipient info', 1821 ); 1822 const giftFirstNameLabel = this.getTranslation( 1823 'gift_first_name_label', 1824 'First name', 1825 ); 1826 const giftFirstNamePlaceholder = this.getTranslation( 1827 'gift_first_name_placeholder', 1828 'First name', 1829 ); 1830 const giftLastNameLabel = this.getTranslation( 1831 'gift_last_name_label', 1832 'Last name', 1833 ); 1834 const giftLastNamePlaceholder = this.getTranslation( 1835 'gift_last_name_placeholder', 1836 'Last name', 1837 ); 1838 const giftEmailLabel = this.getTranslation( 1839 'gift_email_label', 1840 'Email address', 1841 ); 1842 const giftEmailPlaceholder = this.getTranslation( 1843 'gift_email_placeholder', 1844 'Email address', 1845 ); 1846 const giftEmailWarning = this.getTranslation( 1847 'gift_email_warning', 1848 'Important: Gift emails will be sent here', 1849 ); 1850 const giftNoteLabel = this.getTranslation('gift_note_label', 'Note'); 1851 const giftNotePlaceholder = this.getTranslation( 1852 'gift_note_placeholder', 1853 'Note', 1854 ); 1855 1856 isGiftCheckbox.addEventListener('change', function (event) { 1857 const isGiftSelected = event.currentTarget.checked; 1858 this.isGiftSelected = isGiftSelected; 1859 1860 if (isGiftSelected) { 1861 const giftsMarkUp = `<div class="gift"> <p class="awt-gift-info-title">${giftTitle}</p> <div class="awt-form-group"> <label for="awtGiftInfoFirstName" class="awt-floating-label"> <input type="text" id="awtGiftInfoFirstName" class="awt-gift-input" required name="properties[_giftFirstName]" placeholder="${giftFirstNamePlaceholder}" data-invalid> <span class="awt-gift-label">${giftFirstNameLabel}*</span></label> <label for="awtGiftInfoLastName" class="awt-floating-label"> <input type="text" id="awtGiftInfoLastName" class="awt-gift-input" required name="properties[_giftLastName]" placeholder="${giftLastNamePlaceholder}" data-invalid> <span class="awt-gift-label">${giftLastNameLabel}*</span></label></div> <div class="awt-gift-input-container"> <label for="awtGiftInfoEmail" class="awt-floating-label"> <input type="email" id="awtGiftInfoEmail" class="awt-gift-input" required name="properties[_giftEmail]" placeholder="${giftEmailPlaceholder}" data-invalid> <span class="awt-gift-label">${giftEmailLabel}*</span> <div class="awt-floating-label-warning">${giftEmailWarning}</div></label></div> <div class="awt-gift-input-container"> <label for="awtGiftInfoNote" class="awt-floating-label"> <textarea id="awtGiftInfoNote" class="awt-gift-input" placeholder="${giftNotePlaceholder}" name="properties[_giftNote]"></textarea> <span class="awt-gift-label">${giftNoteLabel}</span></label></div></div>`; 1862 1863 let giftInfoContainer = document.createElement('div'); 1864 giftInfoContainer.setAttribute('name', 'awt-gift-info-container'); 1865 giftInfoContainer.classList.add('awt-gift-info-container'); 1866 1867 giftInfoContainer.innerHTML = giftsMarkUp; 1868 isGiftCheckboxLabel.parentElement.appendChild(giftInfoContainer); 1869 getField('awtGiftInfoFirstName').addEventListener( 1870 'blur', 1871 validateRequiredField, 1872 ); 1873 getField('awtGiftInfoLastName').addEventListener( 1874 'blur', 1875 validateRequiredField, 1876 ); 1877 getField('awtGiftInfoEmail').addEventListener( 1878 'blur', 1879 validateEmailField, 1880 ); 1881 toggleAddToCart(getField('awtGiftInfoEmail'), isGiftFormValid()); 1882 } else { 1883 const giftInfoContainer = document.querySelector( 1884 'div[name="awt-gift-info-container"]', 1885 ); 1886 getField('awtGiftInfoFirstName').removeEventListener( 1887 'blur', 1888 validateRequiredField, 1889 ); 1890 getField('awtGiftInfoLastName').removeEventListener( 1891 'blur', 1892 validateRequiredField, 1893 ); 1894 getField('awtGiftInfoEmail').removeEventListener( 1895 'blur', 1896 validateEmailField, 1897 ); 1898 toggleAddToCart(getField('awtGiftInfoEmail'), true); 1899 giftInfoContainer && 1900 giftInfoContainer.parentNode && 1901 giftInfoContainer.parentNode.removeChild(giftInfoContainer); 1902 } 1903 }); 1904 isGiftCheckbox.type = 'checkbox'; 1905 isGiftCheckbox.name = 'awt-is-gift'; 1906 isGiftCheckboxLabel.appendChild(isGiftCheckbox); 1907 isGiftCheckboxLabel.appendChild( 1908 document.createTextNode( 1909 this.getTranslation('gift_checkbox_label', 'This is a gift'), 1910 ), 1911 ); 1912 const planDescription = document.querySelector( 1913 '.bundleapp-plan-selector-description', 1914 ); 1915 planDescription && 1916 planDescription.parentNode.insertBefore( 1917 isGiftCheckboxLabel, 1918 planDescription.nextSibling, 1919 ); 1920 } 1921 if (!isGiftable) { 1922 if (giftCheckBox) { 1923 const giftCheckBoxLabel = giftCheckBox.parentNode; 1924 giftCheckBoxLabel.parentNode.removeChild(giftCheckBoxLabel); 1925 const giftInfoContainer = document.querySelector( 1926 'div[name="awt-gift-info-container"]', 1927 ); 1928 1929 giftInfoContainer && 1930 giftInfoContainer.parentNode && 1931 giftInfoContainer.parentNode.removeChild(giftInfoContainer); 1932 } 1933 } 1934 }, 1935 1936 // This is marked as a private function because this is not intended to be used 1937 // directly. Use the debounced version of it this.setPlansVisibility() 1938 _baseSetPlansVisibility: function () { 1939 if (window.bundleapp.settings.hideIfUnavailable) { 1940 //If variant is not available hide the whole widget 1941 this.$selector.style.display = this.product.selected_variant.available 1942 ? 'block' 1943 : 'none'; 1944 } 1945 1946 var selling_plan_group_ids = this.product.selected_variant.selling_plan_allocations.map( 1947 function (i) { 1948 return i.selling_plan_group_id; 1949 }, 1950 ); 1951 var planId = ''; 1952 const hasPlanWithMultipleDeliveries = this.product.selected_variant.selling_plan_allocations.some( 1953 (sp) => sp.price !== sp.per_delivery_price, 1954 ); 1955 // @TODO: translate suffix 1956 const suffix = hasPlanWithMultipleDeliveries 1957 ? this.getTranslation('delivery_suffix', '/delivery') 1958 : ''; 1959 this.$planGroups.forEach( 1960 function (elem) { 1961 var bundleAppSettings = window.bundleapp.settings || {}; 1962 var $planGroupRadio = elem.querySelector( 1963 "input[name='bundleapp-plan-selector-group']", 1964 ); 1965 var groupId = $planGroupRadio.value; 1966 elem.style.display = 1967 selling_plan_group_ids.includes(groupId) || !groupId 1968 ? 'block' 1969 : 'none'; 1970 var selectedPlanGroup = this.product.selling_plans_by_id[ 1971 this.product.selected_selling_plan 1972 ? this.product.selected_selling_plan.id 1973 : null 1974 ]; 1975 var isSelectedGroup = !!( 1976 selectedPlanGroup && 1977 selectedPlanGroup.selling_plan_group_id === groupId 1978 ); 1979 1980 this.handleGiftVisibility(isSelectedGroup); 1981 1982 var $selectorPlan = elem.querySelector(planSelectorSel); 1983 $selectorPlan.style.display = isSelectedGroup ? 'block' : 'none'; 1984 1985 if (!$planGroupRadio.value && !isSelectedGroup) { 1986 // If value is falsy a.k.a one-time purchase 1987 $planGroupRadio.checked = true; 1988 } else { 1989 $planGroupRadio.checked = isSelectedGroup; 1990 1991 if (this.$planGroups.length === 1) { 1992 elem.classList.add('bundleapp-plan-selector-group--single-group'); 1993 } 1994 1995 // if this is the selected group add the selected class 1996 if (isSelectedGroup) { 1997 elem.classList.add('bundleapp-plan-selector-group--selected'); 1998 if (bundleAppSettings.useRadioButtonFrequencySelector) {
1999 const selectedGroupPlans = elem 2000 .querySelector('.bundleapp-plan-selector-radio') 2001 .getElementsByTagName('input'); 2002 const isPlanChecked = Array.from(selectedGroupPlans).some( 2003 ({ checked }) => checked, 2004 ); 2005 if (!isPlanChecked) { 2006 // if no plan is checked, select the first one 2007 selectedGroupPlans[0].checked = true; 2008 elem 2009 .querySelector('.bundleapp-plan-selector-radio label') 2010 .classList.add( 2011 'bundleapp-plan-selector-radio__label--selected', 2012 ); 2013 } 2014 } 2015 } 2016 } 2017 2018 if (bundleAppSettings.useRadioButtonFrequencySelector) { 2019 let $radioButtonPlanSelector = elem.querySelector( 2020 '.bundleapp-plan-selector-radio', 2021 ); 2022 2023 $radioButtonPlanSelector.style.display = isSelectedGroup 2024 ? 'block' 2025 : 'none'; 2026 let $selectPlanSelector = elem.querySelector( 2027 '.bundleapp-plan-selector-select', 2028 ); 2029 $selectPlanSelector.style.display = 'none'; 2030 } else { 2031 let $radioButtonPlanSelector = elem.querySelector( 2032 '.bundleapp-plan-selector-radio', 2033 ); 2034 $radioButtonPlanSelector.style.display = 'none'; 2035 let $selectPlanSelector = elem.querySelector( 2036 '.bundleapp-plan-selector-select', 2037 ); 2038 $selectPlanSelector.style.display = 2039 isSelectedGroup && $selectPlanSelector.options.length > 1 2040 ? 'block' 2041 : 'none'; 2042 } 2043 2044 if (isSelectedGroup) { 2045 const planSel = bundleAppSettings.useRadioButtonFrequencySelector 2046 ? `${planSelectorSel} .bundleapp-plan-selector-radio input:checked` 2047 : `${planSelectorSel} select`; 2048 2049 planId = 2050 elem.querySelector(planSel) && elem.querySelector(planSel).value; 2051 } 2052 2053 //update pricing label of each group 2054 const planGroup = this.product.selling_plan_groups.find( 2055 (p) => p.id === groupId, 2056 ); 2057 const $priceLabel = elem.querySelector( 2058 '.bundleapp-plan-selector-group-pricing', 2059 ); 2060 2061 const currentVariant = this.product.variants.find( 2062 (variant) => variant.id === this.product.selected_variant.id, 2063 ); 2064 2065 if (planGroup && $priceLabel) { 2066 const values = planGroup.selling_plans.map(function (i) { 2067 return parseInt(i.price_adjustments[0]?.value); 2068 }); 2069 2070 const sellingPlansFromCurrentGroup = currentVariant.selling_plan_allocations.filter( 2071 (sp) => sp.selling_plan_group_id === planGroup.id, 2072 ); 2073 if (sellingPlansFromCurrentGroup && values) { 2074 const lowestPriceInGroup = Math.min.apply( 2075 null, 2076 sellingPlansFromCurrentGroup.map((sp) => sp.per_delivery_price), 2077 ); 2078 const isSame = values.every(function (val) { 2079 return val === values[0]; 2080 }); 2081 const prefix = isSame ? '' : this.getTranslation('from', 'from'); 2082 $priceLabel.innerHTML = `${prefix} ${formatMoney( 2083 lowestPriceInGroup, 2084 )}${suffix}`; 2085 $priceLabel.dataset.test = `planPriceInSelector-${ 2086 sellingPlansFromCurrentGroup?.selling_plan_group_id || 2087 sellingPlansFromCurrentGroup[0]?.selling_plan_group_id 2088 }`; 2089 } 2090 } 2091 2092 if (this.product?.selling_plan_groups?.length === 1) { 2093 // check to see. IF just one selling plan group, and does not offer discount 2094 // then we wont display itemized prices. 2095 const $itemizedPrices = this.$selector.querySelectorAll( 2096 '.bundleapp-plan-selector-group-pricing', 2097 ); 2098 2099 const oneTimePurchasePrice = currentVariant?.price; 2100 2101 const pricesInSellingPlans = currentVariant.selling_plan_allocations.map( 2102 (sp) => sp.price, 2103 );
2104 const allEqual = (arr) => arr.every((val) => val === arr[0]); 2105 2106 if (allEqual([oneTimePurchasePrice, ...pricesInSellingPlans])) { 2107 $itemizedPrices.forEach((price) => { 2108 price.style.display = 'none'; 2109 }); 2110 } 2111 } 2112 }.bind(this), 2113 ); 2114 2115 //check if theres a visible option selected 2116 //If not: check first 2117 if ( 2118 !Array.from(this.$planGroups).filter( 2119 (el) => el.offsetParent && el.querySelector('input').checked, 2120 ).length 2121 ) { 2122 // get first input that's visible 2123 const firstVisibleGroup = Array.from(this.$planGroups).filter( 2124 (el) => el.offsetParent, 2125 )[0]; 2126 if (firstVisibleGroup) { 2127 const $firstRadio = firstVisibleGroup.querySelector('input'); 2128 if (!$firstRadio.checked) { 2129 $firstRadio.checked = true; 2130 $firstRadio.dispatchEvent(new Event('change')); 2131 // if we are using radio buttons get the first plan and check it 2132 if (window.bundleapp.settings.useRadioButtonFrequencySelector) { 2133 let $radioButtonPlanSelector = firstVisibleGroup.querySelector( 2134 '.bundleapp-plan-selector-radio', 2135 ); 2136 const firstPlan = $radioButtonPlanSelector.querySelector('input'); 2137 if (!firstPlan.checked) { 2138 firstPlan.checked = true; 2139 firstPlan.dispatchEvent(new Event('change')); 2140 } 2141 } 2142 } 2143 } 2144 } 2145 2146 //Updates input field 2147 if (this.$sellingPlanField) { 2148 this.$sellingPlanField.value = planId ? planId : ''; 2149 } 2150 //Update url only if we are in the product page 2151 if (window.location.pathname.includes('/products/')) { 2152 insertUrlParam('selling_plan', planId); 2153 } 2154 2155 //Updates one-time purchase price 2156 const $oneTimePrice = this.$selector.querySelector( 2157 '[data-one-time].bundleapp-plan-selector-group .bundleapp-plan-selector-group-pricing', 2158 ); 2159 if ($oneTimePrice) { 2160 $oneTimePrice.innerHTML = `${formatMoney( 2161 this.product.selected_variant.price, 2162 )}${suffix}`; 2163 // data-test attribute for testing 2164 $oneTimePrice.dataset.test = 'oneTimePriceInSelector'; 2165 } 2166 2167 // do not update prices if there are no selling plans groups on the product 2168 if (this.product?.selling_plan_groups?.length) { 2169 this.updatePrice(planId); 2170 this.updateBadgePrice(planId); 2171 } 2172 this.replaceAddBtnForBundles(); 2173 }, 2174 2175 replaceAddBtnForBundles: function () { 2176 // only replace button on BaB bundle 2177 if ( 2178 !this.product?.metafields?.isBundle || 2179 this.product?.metafields?.type === 'shuffle' 2180 ) { 2181 return; 2182 } 2183 2184 const $btn = this.$form.querySelector(addToCartButtonSel()); 2185 2186 // remove "buy it now" button 2187 const $shopifyPaymentBtn = $btn.parentElement.querySelector( 2188 '.shopify-payment-button', 2189 ); 2190 if ($shopifyPaymentBtn) { 2191 $shopifyPaymentBtn.remove(); 2192 } 2193 2194 let $clonedBtn = this.$form.querySelector('#awt-customize-box-btn'); 2195 if (!$clonedBtn) { 2196 $clonedBtn = $btn.cloneNode(true); 2197 $clonedBtn.id = 'awt-customize-box-btn'; 2198 $clonedBtn.type = 'button'; 2199 $clonedBtn.innerText = this.getTranslation( 2200 'customize_my_box', 2201 'Customize my box', 2202 ); 2203 $clonedBtn.classList.remove('btn--secondary-accent'); 2204 $clonedBtn.classList.add('btn--primary-accent'); 2205 $clonedBtn.removeAttribute('@click.prevent'); 2206 $clonedBtn.removeAttribute('x-show:'); 2207 $clonedBtn.removeAttribute(':disabled'); 2208 $clonedBtn.removeAttribute(':class'); 2209 // remove any href in case the theme has been customized and isn't a standard add-to-cart button 2210 $clonedBtn.removeAttribute('href'); 2211 2212 $btn.style.display = 'none'; 2213 $btn.classList.add('awt-hidden-add-to-cart-button'); 2214 $btn.parentNode.insertBefore($clonedBtn, $btn.nextSibling); 2215 } else { 2216 // clone the previous clone and replace 2217 var secondClone = $clonedBtn.cloneNode(true); 2218 $clonedBtn.parentNode.replaceChild(secondClone, $clonedBtn); 2219 2220 // reference new button so we can add event listener 2221 $clonedBtn = secondClone; 2222 } 2223 2224 var handleCustomizeBoxButtonClick = function (event) { 2225 event.stopPropagation(); 2226 2227 let params = new URLSearchParams(window.location.search); 2228 let search = window.location.search; 2229 // only use product.selected_variant.id arg if variant is not already in the 2230 // url params. Otherwise we might be overriding the latest selection 2231 if (!search.includes('variant') && this.product?.selected_variant?.id) { 2232 params.append('variant', this.product?.selected_variant?.id); 2233 } 2234 2235 // only use selectedSellingPlanId arg if variant is not already in the 2236 // url params. Otherwise we might be overriding the latest selection 2237 let selectedSellingPlanId = this.product?.selected_selling_plan?.id; 2238 if (!selectedSellingPlanId) { 2239 // if selectedSellingPlanId wasn't on the product check for the hidden input 2240 selectedSellingPlanId = document.querySelector( 2241 'input[name="selling_plan"]', 2242 )?.value; 2243 } 2244 if (!search.includes('selling_plan') && selectedSellingPlanId) { 2245 params.append('selling_plan', selectedSellingPlanId); 2246 } 2247 2248 let priceAdjustments = this.product?.selected_selling_plan 2249 ?.price_adjustments; 2250 if ( 2251 priceAdjustments && 2252 priceAdjustments[0] && 2253 priceAdjustments[0].value 2254 ) { 2255 params.append( 2256 'd', 2257 `${priceAdjustments[0].value}-${ 2258 priceAdjustments[0].value_type === 'percentage' ? 'p' : 'q' 2259 }`, 2260 ); 2261 } 2262 2263 let url = new URL( 2264 `${window.location.origin}${window.bundleapp.settings.proxy}/bundle/${this.product.id}`, 2265 ); 2266 url.search = params.toString(); 2267 let isGiftable = this.product.gift_selling_plans.includes( 2268 this.product.selected_selling_plan?.id, 2269 ); 2270 if (isGiftable && this.isGiftSelected) { 2271 const giftFirstName = document.getElementById('awtGiftInfoFirstName'); 2272 const giftLastName = document.getElementById('awtGiftInfoLastName'); 2273 const giftEmail = document.getElementById('awtGiftInfoEmail'); 2274 const giftNote = document.getElementById('awtGiftInfoNote'); 2275 const giftInformation = { 2276 firstName: giftFirstName?.value, 2277 lastName: giftLastName?.value, 2278 email: giftEmail?.value,
2279 note: giftNote?.value, 2280 }; 2281 sessionStorage && 2282 sessionStorage.setItem( 2283 'awt-gift-information', 2284 JSON.stringify(giftInformation), 2285 ); 2286 } 2287 2288 window.location.href = url.toString(); 2289 }; 2290 $clonedBtn.addEventListener( 2291 'click', 2292 handleCustomizeBoxButtonClick.bind(this), 2293 ); 2294 }, 2295 2296 updatePrice: function (planId) { 2297 var planAllocation = this.product.selected_variant.selling_plan_allocations.find( 2298 (allo) => allo.selling_plan_id == planId, 2299 ); 2300 2301 // var planOption = this.product.selling_plans_by_id[planId]; 2302 let $comparePriceSpan = this.$wrapper.querySelector( 2303 '.bundleapp-compareAtPrice', 2304 ); 2305 const $priceRegular = this.$wrapper.querySelector(priceContainerSel()); 2306 2307 const $priceSale = this.$wrapper.querySelector( 2308 comparePriceContainerSel(), 2309 ); 2310 2311 if (!$priceRegular) console.warn('Did not find a price element'); 2312 if (!$priceSale) console.warn('Did not find a compare price element'); 2313 2314 if (!$comparePriceSpan) { 2315 $comparePriceSpan = document.createElement('span'); 2316 $comparePriceSpan.classList.add('bundleapp-compareAtPrice'); 2317 if ($priceRegular) { 2318 const priceStyles = window.getComputedStyle($priceRegular); 2319 Array.from(priceStyles).forEach((key) => 2320 $comparePriceSpan.style.setProperty( 2321 key, 2322 priceStyles.getPropertyValue(key), 2323 priceStyles.getPropertyPriority(key), 2324 ), 2325 ); 2326 $priceRegular.after($comparePriceSpan); 2327 } 2328 $comparePriceSpan.style.textDecoration = 'line-through'; 2329 $comparePriceSpan.style.webkitTextDecorationLine = 'line-through'; 2330 $comparePriceSpan.style.marginLeft = '10px'; 2331 2332 // for testing purpose 2333 if ($comparePriceSpan) 2334 $comparePriceSpan.dataset.test = 'bundlePriceOnSale'; 2335 } 2336 2337 setTimeout( 2338 function () { 2339 // Since the theme wants to change the price we need to wait a bit to make our changes, 2340 // hence, the timeout 2341 if (planAllocation) { 2342 if ($priceRegular) { 2343 $priceRegular.innerHTML = `${formatMoney(planAllocation.price)}`; 2344 2345 if ( 2346 planAllocation.compare_at_price && 2347 planAllocation.compare_at_price !== planAllocation.price 2348 ) { 2349 $comparePriceSpan.innerHTML = `${formatMoney( 2350 planAllocation.compare_at_price, 2351 )}`; 2352 $comparePriceSpan.style.display = 'inline'; 2353 } else if ( 2354 product.compare_at_price && 2355 product.compare_at_price !== planAllocation.price 2356 ) { 2357 $comparePriceSpan.innerHTML = `${formatMoney( 2358 product.compare_at_price, 2359 )}`; 2360 $comparePriceSpan.style.display = 'inline'; 2361 } 2362 else { 2363 $comparePriceSpan.style.display = 'none'; 2364 } 2365 } 2366 } else { 2367 if ($priceRegular) { 2368 $priceRegular.innerHTML = `${formatMoney( 2369 this.product.selected_variant.price, 2370 )}`; 2371 } 2372 if (this.product.selected_variant.compare_at_price) { 2373 $comparePriceSpan.innerHTML = formatMoney( 2374 this.product.selected_variant.compare_at_price, 2375 ); 2376 $comparePriceSpan.style.display = 'inline'; 2377 } else { 2378 $comparePriceSpan.style.display = 'none'; 2379 } 2380 } 2381 2382 // make sure theme did not try to display=block 2383 if ($priceRegular) $priceRegular.style.display = 'inline'; 2384 2385 //for testing purposes 2386 if ($priceRegular) $priceRegular.dataset.test = 'priceRegular'; 2387 2388 // hide this because we are not longer using this elements. 2389 if ($priceSale) $priceSale.style.display = 'none'; 2390 //for testing purposes 2391 if ($priceSale) $priceSale.dataset.test = 'priceOnSale'; 2392
2393 // make sure theme did not tried to decorate text 2394 if ($priceRegular) $priceRegular.style.textDecoration = 'none'; 2395 2396 if ( 2397 this.product?.selected_variant?.compare_at_price === 2398 this.product.selected_variant.price || 2399 this.product?.selected_variant?.compare_at_price === 2400 planAllocation?.price || 2401 this.product?.selected_variant?.price === planAllocation?.price 2402 ) { 2403 if ($comparePriceSpan) $comparePriceSpan.style.display = 'none'; 2404 } 2405 }.bind(this), 2406 100, 2407 ); 2408 }, 2409 2410 updateBadgePrice: function (planId) { 2411 var planAllocation = this.product.selected_variant.selling_plan_allocations.find( 2412 (allo) => allo.selling_plan_id == planId, 2413 ); 2414 var planOption = this.product.selling_plans_by_id[planId]; 2415 2416 var $priceAdjustment = this.$wrapper.querySelector( 2417 '.bundleapp-price-adjustment', 2418 ); 2419 2420 if (planAllocation) { 2421 var value_type = planOption.price_adjustments[0].value_type; 2422 var value = planOption.price_adjustments[0].value; 2423 2424 var symbol = value_type === 'percentage' ? '%' : ''; 2425 var strValue = value_type === 'percentage' ? value : formatMoney(value); 2426 2427 var discount = value > 0 ? `${strValue}${symbol}` : ''; 2428 2429 // find out if this selling plan is part of a selling plan group with multiple selling plans/frequencies 2430 const planAllocationBrothers = this.product.selected_variant.selling_plan_allocations.reduce( 2431 (acc, curr) => { 2432 if ( 2433 curr.selling_plan_group_id === 2434 planAllocation.selling_plan_group_id && 2435 curr.selling_plan_id !== planAllocation.selling_plan_id 2436 ) { 2437 acc.brothers = acc.brothers + 1; 2438 2439 if (curr.price !== planAllocation.price) { 2440 acc.dynamicSavings = acc.dynamicSavings + 1; 2441 } 2442 } 2443 2444 return acc; 2445 }, 2446 { brothers: 0, dynamicSavings: 0 }, 2447 ); 2448 2449 const subscriptionLabel = `<span data-test="subscriptionLabel">${this.getTranslation( 2450 'subscription', 2451 'SUBSCRIPTION', 2452 )}</span>`; 2453 const dotSeparatorLabel = 2454 '<span data-test="dotSeparatorLabel"> ·</span>'; 2455 const saveLabel = `<span data-test="saveLabel">${this.getTranslation( 2456 'save', 2457 'Save', 2458 )} ${discount}</span>`; 2459 const extraDiscountLabel = `<span data-test="extraDiscountLabel">${this.getTranslation( 2460 'extra', 2461 'Extra', 2462 )} ${discount} ${this.getTranslation('off', 'off')}</span>`; 2463 2464 let badgeLabel = subscriptionLabel + dotSeparatorLabel + saveLabel; 2465 2466 if (!discount) { 2467 badgeLabel = subscriptionLabel; 2468 } 2469 2470 if ( 2471 this.product.selected_variant.compare_at_price && 2472 this.product.selected_variant.price != planAllocation.price 2473 ) { 2474 badgeLabel = extraDiscountLabel; 2475 } 2476 2477 const html = `<span data-test="subscriptionBadge">${badgeLabel}</span>`; 2478 2479 if (this.$badgePriceEl) { 2480 if ($priceAdjustment) { 2481 $priceAdjustment.innerHTML = html; 2482 } else { 2483 var div = document.createElement('div'); 2484 div.classList.add('bundleapp-price-adjustment'); 2485 div.innerHTML = html; 2486 this.$badgePriceEl.appendChild(div); 2487 } 2488 } 2489 } else { 2490 if ($priceAdjustment) { 2491 $priceAdjustment.remove(); 2492 } 2493 } 2494 }, 2495 2496 setSupportInformation: function () { 2497 var $description = this.$selector.querySelector( 2498 '.bundleapp-plan-selector-description', 2499 ); 2500 2501 if ($description) { 2502 if ( 2503 this.product.selected_selling_plan && 2504 this.product.selected_selling_plan.description 2505 ) { 2506 $description.innerHTML = `<span>${this.product.selected_selling_plan.description}</span>`;
2507 } else { 2508 $description.innerHTML = ''; 2509 } 2510 } 2511 }, 2512 2513 handlePlanRadioChange: function (e) { 2514 var target = e.currentTarget || e.target; 2515 var $planGroup = target.closest('.bundleapp-plan-selector-group'); 2516 2517 // remove selected class from previously selected group 2518 var $previouslySelected = this.$form.querySelectorAll( 2519 '.bundleapp-plan-selector-group--selected', 2520 ); 2521 $previouslySelected.forEach((selectedGroup) => 2522 selectedGroup.classList.remove( 2523 'bundleapp-plan-selector-group--selected', 2524 ), 2525 ); 2526 2527 // add selected class to newly selected group 2528 $planGroup.classList.add('bundleapp-plan-selector-group--selected'); 2529 2530 var $planSelect = $planGroup.querySelector('select'); 2531 var planId = $planSelect.value; 2532 this.product.selected_selling_plan = this.product.selling_plans_by_id[ 2533 planId 2534 ]; 2535 2536 this.setPlansVisibility(); 2537 this.setSupportInformation(); 2538 }, 2539 2540 handlePlanOptionsChange: function (e) { 2541 var target = e.currentTarget || e.target; 2542 var planId = target.value; 2543 2544 if (window.bundleapp.settings.useRadioButtonFrequencySelector) { 2545 // remove selected class from previously selected plan label 2546 var $previouslySelectedLabels = document.querySelectorAll( 2547 '.bundleapp-plan-selector-radio__label--selected', 2548 );
2549 $previouslySelectedLabels.forEach((selectedLabel) => 2550 selectedLabel.classList.remove( 2551 'bundleapp-plan-selector-radio__label--selected', 2552 ), 2553 ); 2554 2555 // add selected class to selected label 2556 var $label = document.querySelector( 2557 `.bundleapp-plan-selector-radio__label[for="${planId}"]`, 2558 ); 2559 if ($label) { 2560 $label.classList.add( 2561 'bundleapp-plan-selector-radio__label--selected', 2562 ); 2563 } 2564 } 2565 2566 this.product.selected_selling_plan = this.product.selling_plans_by_id[ 2567 planId 2568 ]; 2569 this.setPlansVisibility(); 2570 }, 2571 2572 handleFormDomChanged: function (e) { 2573 setTimeout( 2574 function () { 2575 var variantId = this.$form.querySelector('[name=id]').value; 2576 this.product.selected_variant = this.product.variants.find( 2577 (v) => v.id == variantId, 2578 ); 2579 this.setPlansVisibility(); 2580 }.bind(this), 2581 20, 2582 ); 2583 }, 2584 }); 2585 2586 //Validates app is public 2587 const inPreviewMode = !!( 2588 window.location.search.includes('awt-preview') || 2589 window.localStorage.getItem(PREVIEW_MODE_STORAGE_KEY) === 'true' 2590 ); 2591 2592 // make sure preview mode is set in local storage if in preview mode 2593 inPreviewMode && 2594 window.localStorage.setItem(PREVIEW_MODE_STORAGE_KEY, inPreviewMode); 2595 2596 // if we're in preview mode we can get rid of the URL param 2597 inPreviewMode && insertUrlParam('awt-preview'); 2598 2599 // show preview control if !appPublic and inPreviewMode 2600 if (inPreviewMode && !window.bundleapp.settings.appPublic) { 2601 showPreviewModeControl(); 2602 } 2603 2604 // update CSS vars 2605 setCssVars(window.bundleapp.settings.shopStyleSettings); 2606 2607 if (window.bundleapp.settings.appPublic || inPreviewMode) { 2608 window.bundleapp.BundleAppWidget = BundleAppWidget; 2609 document.dispatchEvent(new Event('bundleapp:ready')); 2610 } 2611 2612 /** 2613 * Iterating over forms 2614 */ 2615 var shopInfoPromise = getShopInfo(); 2616 2617 window.bundleapp.initializeForms = function () { 2618 var $forms = document.querySelectorAll("form[action='/cart/add']"); 2619 $forms.forEach(function (el) { 2620 // if we found more than one form, lets make sure we're adding only to the 2621 // forms that we want to.. 2622 if ($forms.length > 1) { 2623 // check if this is the installments form (from Dawn theme) before 2624 // initializing the plan selector widget 2625 if (el.getAttribute('id') && el.getAttribute('id').includes('product-form-installment')) { 2626 return; 2627 } 2628 2629 // additional checks will go here 2630 } 2631 var settings = window.bundleapp.settings; 2632 var $variantEl = el.querySelector('[name=id]'); 2633 2634 // Checking if the widget has been initialized already 2635 if (el.querySelector('[data-bundleapp-wrapper]')) { 2636 console.warn('Bundleapp: Form already initialized'); 2637 return; 2638 } 2639 if ($variantEl) { 2640 var pathname = window.location.pathname; 2641 var search = window.location.search; 2642 var searchParams = new URLSearchParams(search); 2643 var reqParams = new URLSearchParams(); 2644 2645 //gets product handle if in a product page 2646 let productHandle = pathname.includes('/products/') 2647 ? pathname.split('/').filter(Boolean).pop() 2648 : null; 2649 2650 // If there is a container selector we want to try to get the handle from it. 2651 // This because in collection pages or product pages with recommended products it 2652 // will be easier: ie <div data-bundleapp-widget=""/> 2653 2654 var $containerSel = el.querySelector( 2655 settings.containerSel || '[data-bundleapp-widget]', 2656 ); 2657 2658 if ( 2659 $containerSel && 2660 $containerSel.dataset && 2661 $containerSel.dataset.bundleappWidget 2662 ) { 2663 productHandle = $containerSel.dataset.bundleappWidget; 2664 } 2665 2666 if (productHandle) {
2667 reqParams.append('productHandle', productHandle); 2668 } 2669 var getProductSelector = function () { 2670 return; 2671 return fetch( 2672 settings.productSelectorUrl 2673 ? settings.productSelectorUrl + 2674 productHandle + 2675 '?view=selector&' + 2676 reqParams.toString() 2677 : settings.proxy + '/product-selector?' + reqParams.toString(), 2678 ).then(function (res) { 2679 if (!res.ok) { 2680 throw new Error(res.statusText); 2681 } 2682 return res.text(); 2683 }); 2684 }; 2685 2686 // gets selected variant 2687 var variantId = $variantEl.value; 2688 if (variantId) { 2689 reqParams.append('variant', variantId); 2690 } 2691 2692 // gets selected selling plan 2693 var sellingPlan = searchParams.get('selling_plan'); 2694 if (sellingPlan) { 2695 reqParams.append('selling_plan', sellingPlan); 2696 } 2697 2698 var compareHtmlStrings = function (html1, html2) { 2699 // We need to remove this uuid from the string since it is always different 2700 // This is used to uniquely identify each widget. and it cannot be any product related 2701 // attribute because we could have multiple selectors for the same product 2702 var regexWrapperIdHtml = /data-bundleapp-wrapper=["|']\d+["|']/gm; 2703 var regexWrapperIdJs = /"widget_id":\s?"\d+"/gm; 2704 2705 var str1 = (html1 || '') 2706 .replace(regexWrapperIdHtml, '') 2707 .replace(regexWrapperIdJs, ''); 2708 var str2 = (html2 || '') 2709 .replace(regexWrapperIdHtml, '') 2710 .replace(regexWrapperIdJs, ''); 2711 return str1 === str2; 2712 }; 2713 2714 var cachedSelector; 2715 var selectorStorageKey = `bundleSelector1${productHandle + variantId}`; 2716 2717 // We check first if there is a cached selector in local storage 2718 // to speed the render time 2719 try { 2720 cachedSelector = window.localStorage.getItem(selectorStorageKey); 2721 if (cachedSelector && cachedSelector !== 'undefined') { 2722 Promise.all([shopInfoPromise]).then(function () { 2723 if (window.bundleapp.settings.appPublic || inPreviewMode) { 2724 addAndInitiateSelector( 2725 cachedSelector, 2726 window.bundleapp.settings.shopStyleSettings, 2727 ); 2728 } 2729 }); 2730 } 2731 } catch (err) { 2732 console.error(err); 2733 } 2734 2735 // we want to store the selector in a cache 2736 // in case there is a new version we can remove it and 2737 // create and initiate a new one 2738 var cachedDivContainer; 2739 var addAndInitiateSelector = function (htmlString, styleSettings) { 2740 var addSelector = function ($el) { 2741 // if selector style is selected use that 2742 if (styleSettings && styleSettings.SelectorStyle) { 2743 $el.classList.add(styleSettings.SelectorStyle); 2744 } 2745 // if a container class has been set in the settings this means 2746 // that we've manually set them up, use this class 2747 else if (settings.containerClass) { 2748 $el.classList.add(settings.containerClass); 2749 } 2750 // if styleSettings exist but no selector style has been chosen, default to awt-style-1 2751 else if (styleSettings && !styleSettings.SelectorStyle) { 2752 $el.classList.add('awt-style-1'); 2753 } 2754 // final default is bundleapp-container 2755 else { 2756 $el.classList.add('bundleapp-container'); 2757 } 2758 2759 $el.innerHTML = htmlString.trim(); 2760 2761 var $renderBeforeEl, $renderAfterEl, $renderInsideEl; 2762 if ( 2763 settings.renderAfterSel || 2764 (styleSettings && styleSettings.RenderAfterSel) 2765 ) { 2766 $renderAfterEl = el.querySelector( 2767 settings.renderAfterSel || styleSettings.RenderAfterSel, 2768 ); 2769 } else if ( 2770 settings.renderBeforeEl || 2771 (styleSettings && styleSettings.RenderBeforeSel) 2772 ) { 2773 $renderBeforeEl = el.querySelector( 2774 settings.renderBeforeEl || styleSettings.RenderBeforeSel, 2775 ); 2776 } else if ( 2777 settings.renderInsideSel || 2778 (styleSettings && styleSettings.RenderInsideSel) 2779 ) { 2780 $renderInsideEl = el.querySelector( 2781 settings.renderInsideSel || styleSettings.RenderInsideSel, 2782 ); 2783 } 2784 2785 // If there is a custom selector to render the widget 2786 if ($renderInsideEl) { 2787 $renderInsideEl.append($el); 2788 } else if ($containerSel) { 2789 // if the default container selector is available 2790 $containerSel.append($el); 2791 } else if ($renderAfterEl) { 2792 // else if renderAfterSel is set, render widget after that 2793 $renderAfterEl.parentNode.insertBefore( 2794 $el, 2795 $renderAfterEl.nextSibling, 2796 ); 2797 } else if ($renderBeforeEl) { 2798 // else if renderBeforeSel is set, render widget after that 2799 $renderBeforeEl.parentNode.insertBefore($el, $renderBeforeEl); 2800 } else if ($variantEl) { 2801 // else render the widget after the input field 2802 $variantEl.parentNode.insertBefore($el, $variantEl.nextSibling); 2803 } 2804 }; 2805 2806 if (cachedDivContainer) { 2807 var newEl = document.createElement('div'); 2808 addSelector(newEl); 2809 cachedDivContainer.parentNode.removeChild(cachedDivContainer); 2810 } else { 2811 cachedDivContainer = document.createElement('div'); 2812 addSelector(cachedDivContainer); 2813 } 2814 2815 const scriptMatches = [ 2816 ...htmlString.matchAll(/
2816<script type=.*>(.+)<\/script>/gims), 2817 ]; 2818 if (scriptMatches.length && scriptMatches[0] && scriptMatches[0][1]) { 2819 try { 2820 var product = JSON.parse(scriptMatches[0][1]); 2821 /** 2822 * Initiates the widget selector 2823 */ 2824 var $selector = document.querySelector( 2825 "[data-bundleapp-wrapper='" + product.widget_id + "']", 2826 ); 2827 new window.bundleapp.BundleAppWidget($selector, product); 2828 } catch (err) { 2829 console.warn('Bundle: Could not parse and initiate widget', err); 2830 } 2831 } 2832 }; 2833 2834 try { 2835 var prodSelectorPromise = getProductSelector(); 2836 Promise.all([prodSelectorPromise, shopInfoPromise]).then((values) => { 2837 const responseText = values[0]; 2838 // replaces to minify a bit the html string 2839 // .replace(/\n|\t/g, ' ') // replaces newlines and tabs 2840 // .replace(/>[\s]*?</g, '><') // removes spaces between open and close brackets 2841 // .replace(/[\s]*?</g, '<'); // removes spaces at start 2842 2843 if ( 2844 (window.bundleapp.settings.appPublic || inPreviewMode) && 2845 !compareHtmlStrings(responseText, cachedSelector) 2846 ) { 2847 window.localStorage.setItem(selectorStorageKey, responseText); 2848 addAndInitiateSelector( 2849 responseText, 2850 window.bundleapp.settings.shopStyleSettings, 2851 ); 2852 } 2853 }); 2854 } catch (err) { 2855 console.error( 2856 'Something went wrong while fetching and parsing the product', 2857 err, 2858 ); 2859 } 2860 } 2861 }); 2862 }; 2863 2864 window.bundleapp.initializeForms(); 2865 })(); 2866 2867 (function () { 2868 function addStyle(styleString) { 2869 const style = document.createElement('style'); 2870 style.textContent = styleString; 2871 document.head.append(style); 2872 } 2873 const rootStyles = Object.values(STYLE_VAR_MAP).reduce( 2874 (accum, { cssVar, defaultVal = '' } = {}) => { 2875 return `${accum}${cssVar}: ${defaultVal};`; 2876 }, 2877 '', 2878 ); 2879 2880 addStyle(` 2881 /**** CUSTOM COLORS ****/ 2882 :root { 2883 ${rootStyles} 2884 } 2885 /**** END CUSTOM COLORS ****/ 2886 `); 2887 })(); 2888</script>
2888 2889 2890<style> 2891 2892 .bundleapp-wrapper { 2893 border: none; 2894 padding: 0; 2895 margin-bottom: 20px; 2896 width: 100%; 2897 } 2898 .bundleapp-wrapper legend { 2899 font-size: 90%; 2900 margin-bottom: 5px; 2901 } 2902 .bundleapp-wrapper .bundleapp-plan-selector-group { 2903 margin-bottom: 5px; 2904 } 2905 .bundleapp-wrapper .bundleapp-plan-selector-group > label { 2906 display: flex; 2907 align-items: center; 2908 font-size: 90%; 2909 } 2910 .bundleapp-wrapper .bundleapp-plan-selector-group label > input { 2911 min-height: 30px; 2912 margin-right: 10px; 2913 } 2914 .bundleapp-wrapper .bundleapp-plan-selector-group select { 2915 width: 100%; 2916 margin-bottom: 20px; 2917 } 2918 .bundleapp-wrapper .bundleapp-plan-selector-group-pricing { 2919 margin-left: auto; 2920 } 2921 .bundleapp-wrapper .bundleapp-plan-selector-plan { 2922 margin-left: 23px; 2923 } 2924 .bundleapp-wrapper .bundleapp-plan-selector-plan > label { 2925 font-size: 80%; 2926 display: block; 2927 text-align: left; 2928 } 2929 .bundleapp-wrapper .bundleapp-plan-selector-description span { 2930 border: solid 1px #dfe3e8; 2931 padding: 16px; 2932 height: auto; 2933 margin-top: 16px; 2934 border-radius: 0px; 2935 font-size: 90%; 2936 margin-left: 23px; 2937 display: block; 2938 } 2939 .bundleapp-price-adjustment { 2940 display: inline-block; 2941 margin-left: 10px; 2942 border: 1px solid; 2943 border-color: inherit; 2944 font-size: 80%; 2945 padding-left: 10px; 2946 padding-right: 10px; 2947 border-radius: 3px; 2948 } 2949 .bundleapp-legend { 2950 text-align: left; 2951 margin-bottom: 5px; 2952 } 2953 .awt-hidden-add-to-cart-button { 2954 display: none !important; 2955 } 2956 /**** PLAN SELECTOR BASICS ****/ 2957 .awt-style-1, .awt-style-2 { 2958 width: 100%; 2959 margin-top: 20px; 2960 margin-bottom: 20px; 2961 } 2962 .awt-style-1 .bundleapp-wrapper, .awt-style-2 .bundleapp-wrapper { 2963 margin-bottom: 0; 2964 } 2965 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-description span, .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-description span { 2966 margin-left: 0; 2967 } 2968 /**** PLAN SELECTOR BASICS ****/ 2969 /**** CUSTOM DROP DOWN ****/ 2970 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-group select.bundleapp-plan-selector-select, .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-group select.bundleapp-plan-selector-select { 2971 padding: 14px 50px 14px 17px; 2972 margin-bottom: 8px; 2973 appearance: none; 2974 -webkit-appearance: none; 2975 background-repeat: no-repeat; 2976 background-position: center right; 2977 background-image: url("data:image/svg+xml,%3Csvg width='44' height='24' xmlns='http://www.w3.org/2000/svg' role='presentation' focusable='false' aria-hidden='true' class='icon-chevron '%3E%3Cg%3E%3Ctitle%3ELayer 1%3C/title%3E%3Cpath transform='rotate(90 12.414 12.4145)' stroke='null' id='svg_1' d='m10.121,19.122l6,-6a1,1 0 0 0 0,-1.415l-6,-6a1,1 0 0 0 -1.414,0a1,1 0 0 0 0,1.415l5.293,5.292l-5.293,5.293a1,1 0 1 0 1.414,1.415z' fill-rule='evenodd' fill='currentColor'/%3E%3C/g%3E%3C/svg%3E"); 2978 background-size: 35px; 2979 background-color: #fff; 2980 border: 1px solid var(--awt-border-color); 2981 outline: 0; 2982 height: auto; 2983 } 2984 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-group select.bundleapp-plan-selector-select:focus-visible, .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-group select.bundleapp-plan-selector-select:focus-visible { 2985 box-shadow: none; 2986 } 2987 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-group select.bundleapp-plan-selector-select:hover, .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-group select.bundleapp-plan-selector-select:hover { 2988 cursor: pointer; 2989 } 2990 /**** END CUSTOM DROP DOWN ****/ 2991 /**** CUSTOM RADIO BUTTON ****/ 2992 .awt-style-1 .bundleapp-wrapper input[type='radio'], .awt-style-2 .bundleapp-wrapper input[type='radio'] { 2993 /* Add if not using autoprefixer */ 2994 -webkit-appearance: none; 2995 /* Remove most all native input styles */ 2996 appearance: none; 2997 /* For iOS <15 */ 2998 background-color: #fff; 2999 /* Not removed via appearance */ 3000 margin: 0 10px 0 0; 3001 color: currentColor;
3002 width: 20px; 3003 height: 20px; 3004 border: 1px solid currentColor; 3005 border-radius: 50%; 3006 /* transform: translateY(-0.075em); 3007 */ 3008 display: grid; 3009 place-content: center; 3010 min-height: 0 !important; 3011 min-width: 20px; 3012 outline: none; 3013 padding: 0; 3014 } 3015 .awt-style-1 .bundleapp-wrapper input[type='radio']:focus .awt-style-2 .bundleapp-wrapper input[type='radio']:focus { 3016 /* remove outline */ 3017 outline: none; 3018 } 3019 .awt-style-1 .bundleapp-wrapper input[type='radio']::before, .awt-style-2 .bundleapp-wrapper input[type='radio']::before { 3020 content: ''; 3021 width: 10px; 3022 height: 10px; 3023 border-radius: 50%; 3024 transform: scale(0); 3025 transition: 120ms transform ease-in-out; 3026 background-color: var(--awt-radio-button-background); 3027 transition: background-color 0.3s; 3028 } 3029 .awt-style-1 .bundleapp-wrapper input[type='radio']:checked::before, .awt-style-2 .bundleapp-wrapper input[type='radio']:checked::before { 3030 transform: scale(1); 3031 } 3032 /**** END CUSTOM RADIO BUTTON ****/ 3033 /**** CUSTOM FREQUENCY BUTTONS ****/ 3034 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-radio input, .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-radio input { 3035 clip: rect(0, 0, 0, 0); 3036 overflow: hidden; 3037 position: absolute; 3038 height: 1px; 3039 width: 1px; 3040 } 3041 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-radio__label, .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-radio__label { 3042 display: inline-block; 3043 text-align: center; 3044 min-width: 36px; 3045 padding: 6px 10px; 3046 border: var(--awt-freq-button-border); 3047 color: var(--awt-freq-button-color); 3048 background-color: var(--awt-freq-button-background); 3049 cursor: pointer; 3050 border-radius: var(--awt-freq-button-border-radius); 3051 margin: 6px 8px 6px 0; 3052 transition: border 0.3s, color 0.3s, background-color 0.3s; 3053 } 3054 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-radio__label:hover, .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-radio__label:hover { 3055 color: var(--awt-freq-button-color-hover); 3056 background-color: var(--awt-freq-button-background-hover); 3057 border: var(--awt-freq-button-border-hover); 3058 } 3059 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-radio__label.bundleapp-plan-selector-radio__label--selected, .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-radio__label.bundleapp-plan-selector-radio__label--selected { 3060 background-color: var(--awt-freq-button-background-selected); 3061 color: var(--awt-freq-button-color-selected); 3062 border: var(--awt-freq-button-border-selected); 3063 transition: border 0.3s, color 0.3s, background-color 0.3s; 3064 } 3065 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-radio__label.bundleapp-plan-selector-radio__label--selected:hover, .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-radio__label.bundleapp-plan-selector-radio__label--selected:hover { 3066 background-color: var(--awt-freq-button-background-hover-selected); 3067 color: var(--awt-freq-button-color-hover-selected); 3068 border: var(--awt-freq-button-border-hover-selected); 3069 } 3070 /**** END CUSTOM FREQUENCY BUTTONS ****/ 3071 /**** CUSTOM LABEL ACCENT ****/ 3072 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-group > label .awt-accent, .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-group > label .awt-accent { 3073 background-color: var(--awt-accent-background); 3074 padding: 2px 8px; 3075 border-radius: 20px; 3076 font-size: 12px; 3077 display: inline-block; 3078 color: var(--awt-accent-color); 3079 } 3080 /**** END CUSTOM LABEL ACCENT ****/ 3081 /*****************************************/ 3082 /*****************************************/ 3083 /**************** STYLE 1 ****************/ 3084 /*****************************************/ 3085 /*****************************************/ 3086 /**** CUSTOM PLAN SELECTOR ****/ 3087 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-group > label { 3088 font-weight: 400; 3089 margin-bottom: 0; 3090 } 3091 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-group > label:hover { 3092 cursor: pointer; 3093 } 3094 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-group { 3095 margin-bottom: 10px; 3096 padding: 10px 15px; 3097 border-radius: var(--awt-border-radius); 3098 border: 1px solid var(--awt-border-color); 3099 transition: border 0.3s, color 0.3s, background-color 0.3s; 3100 } 3101 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-group .bundleapp-plan-selector-select { 3102 margin-bottom: 0; 3103 } 3104 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-group .bundleapp-plan-selector-plan { 3105 margin-top: 10px; 3106 } 3107 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-group .bundleapp-plan-selector-plan > label { 3108 margin-bottom: 8px; 3109 } 3110 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-group.bundleapp-plan-selector-group--selected { 3111 border-color: var(--awt-selected-plan-border-color); 3112 background-color: var(--awt-selected-plan-background); 3113 } 3114 .awt-style-1 .bundleapp-wrapper .bundleapp-plan-selector-group.bundleapp-plan-selector-group--single-group { 3115 //border: none; 3116 background-color: initial; 3117 border-color: var(--awt-border-color); 3118 transition: border 0.3s, color 0.3s, background-color 0.3s; 3119 } 3120 /**** END CUSTOM PLAN SELECTOR ****/ 3121 /*****************************************/ 3122 /*****************************************/ 3123 /**************** STYLE 2 ****************/ 3124 /*****************************************/ 3125 /*****************************************/ 3126 /**** CUSTOM PLAN SELECTOR ****/ 3127 .awt-style-2 .bundleapp-wrapper { 3128 border: 1px solid var(--awt-border-color); 3129 } 3130 .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-group:not(:last-child) { 3131 border-bottom: 1px solid var(--awt-border-color); 3132 } 3133 .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-group > label { 3134 font-weight: 400; 3135 margin-bottom: 0; 3136 } 3137 .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-group > label:hover { 3138 cursor: pointer; 3139 } 3140 .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-group .bundleapp-plan-selector-plan { 3141 margin-top: 10px; 3142 } 3143 .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-group .bundleapp-plan-selector-plan > label { 3144 margin-bottom: 8px; 3145 } 3146 .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-group { 3147 margin-bottom: 0; 3148 padding: 8px 20px; 3149 transition: border 0.3s, color 0.3s, background-color 0.3s; 3150 } 3151 .awt-style-2 .bundleapp-wrapper .bundleapp-plan-selector-group.bundleapp-plan-selector-group--selected { 3152 border-color: var(--awt-selected-plan-border-color); 3153 background-color: var(--awt-selected-plan-background); 3154 border-bottom: 0; 3155 } 3156 /**** END CUSTOM PLAN SELECTOR ****/ 3157 /**** CUSTOMIZE CP ****/ 3158 .bundle-button.button--primary:enabled { 3159 background-color: var(--awt-primary-button-background); 3160 color: var(--awt-primary-button-color); 3161 border-style: solid; 3162 border: var(--awt-primary-button-border); 3163 border-radius: var(--awt-primary-button-border-radius); 3164 transition: color 0.3s, background-color 0.3s, border-color 0.3s, border-width 0.3s; 3165 } 3166 .bundle-button.button--primary:enabled:hover { 3167 background-color: var(--awt-primary-button-background-hover); 3168 color: var(--awt-primary-button-color-hover); 3169 border: var(--awt-primary-button-border-hover); 3170 } 3171 /**** END CUSTOMIZE CP ****/ 3172 /**** BaB UI ****/ 3173 .bundleapp-modal__logo { 3174 background-image: url(); 3175 background-position: center; 3176 } 3177 .awtomatic-progress-item { 3178 transition: border 0.3s, color 0.3s, background-color 0.3s; 3179 } 3180 .awtomatic-progress-item.awtomatic-progress-item--completed { 3181 background-color: var(--awt-progress-bar-background); 3182 } 3183 .awtomatic-progress-item.awtomatic-progress-item--completed .bundle-text--subheading { 3184 color: var(--awt-progress-bar-color); 3185 } 3186 .bundle-stepper-counter--complete { 3187 background-color: var(--awt-progress-bar-background); 3188 color: var(--awt-progress-bar-color); 3189 } 3190 .bundle-stepper-item:after { 3191 transition: border-color 0.3s; 3192 } 3193 .bundle-stepper-item--complete:after { 3194 border-bottom-color: var(--awt-progress-bar-background); 3195 } 3196 /**** End BaB UI ****/ 3197 3198 /**** Gift styling ****/ 3199 .awt-gift-info-title { 3200 font-weight: 400; 3201 font-size: 16px; 3202 text-align: start; 3203 } 3204 .awt-error-msg { 3205 color: #ff2a51; 3206 text-align: start; 3207 } 3208 .awt-input-error.awt-error { 3209 background-color: rgba(255,42,81,.1); 3210 border: 2px solid #ff2a51; 3211 } 3212 .awt-floating-label { 3213 display: block; 3214 position: relative; 3215 border-radius: 5px; 3216 width: 100%; 3217 } 3218 .awt-floating-label:last-child { 3219 margin-bottom: 0; 3220 } 3221 .awt-floating-label input, .awt-floating-label textarea { 3222 font-family: inherit; 3223 width: 100%; 3224 height: 40px; 3225 border: none; 3226 outline: none; 3227 background-color: #f8f8f8; 3228 border-radius: 8px; 3229 padding: 0 12px; 3230 font-size: 16px; 3231 margin: 0px; 3232 font-family: inherit; 3233 } 3234 .awt-floating-label textarea { 3235 height: 120px; 3236 padding: 12px; 3237 } 3238 .awt-floating-label input::placeholder, .awt-floating-label textarea::placeholder { 3239 opacity: 0; 3240 } 3241 .awt-floating-label span { 3242 position: absolute; 3243 top: 20px; 3244 left: 8px; 3245 transform: translateY(-50%); 3246 font-size: 16px; 3247 padding: 0 4px; 3248 transition-duration: 300ms; 3249 border-radius: 5px; 3250 } 3251 label.awt-floating-label:focus-within > span, .awt-floating-label input:not(:placeholder-shown) + span, .awt-floating-label textarea:not(:placeholder-shown) + span { 3252 transform: translateY(-150%); 3253 font-size: 11px; 3254 background-color: rgba(255, 255, 255); 3255 } 3256 .awt-floating-label-warning { 3257 font-size: 14px; 3258 padding: 0 2px; 3259 text-align: start; 3260 } 3261 /*! form field group in 2 columns */ 3262 .awt-form-group { 3263 display: flex; 3264 justify-content: space-between; 3265 } 3266 .awt-form-group > * { 3267 width: calc(50% - 4px); 3268 padding-bottom: 16px; 3269 } 3270 .awt-gift-input-container { 3271 padding-bottom:16px 3272 } 3273 /*! custom checkbox */ 3274 .awt-checkbox { 3275 display: flex; 3276 align-items: center; 3277 margin: 16px 0; 3278 } 3279 .awt-checkbox input[type="checkbox"] { 3280 /* Add if not using autoprefixer */ 3281 -webkit-appearance: none; 3282 /* Remove most all native input styles */ 3283 appearance: none; 3284 /* For iOS <15 */ 3285 background-color: #fff; 3286 width: 18px; 3287 height: 18px; 3288 margin-right: 4px; 3289 position: relative; 3290 border-radius: 2px; 3291 box-shadow: 0 0 0 1px inset #000; 3292 } 3293 .awt-checkbox input[type="checkbox"]:checked { 3294 /* For iOS <15 */ 3295 background-color: #000000; 3296 } 3297 .awt-checkbox input[type="checkbox"]:checked::before { 3298 content: ""; 3299 position: absolute; 3300 left: 4px; 3301 top: 8px; 3302 background: white; 3303 width: 2px; 3304 height: 2px; 3305 box-shadow: 2px 0 0 white, 4px 0 0 white, 4px -2px 0 white, 4px -4px 0 white, 4px -6px 0 white, 4px -8px 0 white; 3306 transform: rotate(45deg); 3307 } 3308 .awt-checkbox input[type="checkbox"]:disabled { 3309 background-color: #f8f8f8;
3310 cursor: not-allowed; 3311 } 3312 /**** End Gift styling ****/ 3313 3314 /*** PREVIEW CONTROL ***/ 3315 #awt-preview-mode-control { 3316 position: fixed; 3317 bottom: 15px; 3318 left: 50%; 3319 transform: translateX(-50%); 3320 height: 75px; 3321 z-index: 2147483647; 3322 background-color: #fff; 3323 color: #222; 3324 padding: 17px; 3325 display: flex; 3326 justify-content: space-between; 3327 align-content: center; 3328 box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.08); 3329 border-radius: 8px; 3330 box-sizing: border-box; 3331 } 3332 #awt-preview-mode-control.hidden { 3333 display: none; 3334 } 3335 #awt-preview-mode-control div.awt-logo { 3336 display: flex; 3337 height: 100%; 3338 align-items: center; 3339 flex-wrap: nowrap; 3340 } 3341 #awt-preview-mode-control div.awt-logo span { 3342 margin-top: 3px; 3343 font-size: 16px; 3344 font-family: sans-serif; 3345 color: #3700ff; 3346 } 3347 #awt-preview-mode-control div.awt-logo .awt-logo--image { 3348 display: block; 3349 background-image: url('https://bundle-public-assets.s3.amazonaws.com/customerPortal/awtomatic-no-dot.svg'); 3350 background-repeat: no-repeat; 3351 background-size: contain; 3352 background-position: center; 3353 width: 95px; 3354 height: 100%; 3355 margin-right: 6px; 3356 } 3357 #awt-preview-mode-control div.awt-logo .awt-logo--info-icon { 3358 display: block; 3359 background-image: url('https://bundle-public-assets.s3.amazonaws.com/customerPortal/info-icon.svg'); 3360 background-repeat: no-repeat; 3361 background-size: contain; 3362 background-position: center; 3363 width: 15px; 3364 height: 15px; 3365 margin: 5px 25px 0 9px; 3366 } 3367 #awt-preview-mode-control button { 3368 display: inline-block; 3369 border: 1px solid #eee; 3370 background-color: #fff; 3371 border-radius: 4px; 3372 padding: 5px 15px; 3373 margin: 0; 3374 text-decoration: none; 3375 color: #000; 3376 font-family: sans-serif; 3377 font-size: 15px; 3378 cursor: pointer; 3379 text-align: center; 3380 transition: background 250ms ease-in-out, transform 150ms ease; 3381 -webkit-appearance: none; 3382 -moz-appearance: none; 3383 font-weight: bold; 3384 height: 100%; 3385 outline: none; 3386 box-shadow: none; 3387 } 3388 #awt-preview-mode-control button:hover, #awt-preview-mode-control button:focus { 3389 background-color: #fbfbfb; 3390 } 3391 #awt-preview-mode-control button:focus { 3392 outline: none; 3393 } 3394 #awt-preview-mode-control button:active { 3395 transform: scale(0.99); 3396 } 3397 button#awt-preview-mode-control__hide { 3398 background-color: #fff; 3399 color: #000; 3400 } 3401 #awt-preview-mode-control button#awt-preview-mode-control__hide:hover, #awt-preview-mode-control button#awt-preview-mode-control__hide:focus { 3402 background: #eee; 3403 } 3404 @media only screen and (max-width: 480px) { 3405 #awt-preview-mode-control button#awt-preview-mode-control__hide { 3406 display: none; 3407 } 3408 } 3409 /*** END PREVIEW CONTROL ***/ 3410 3411</style>
3411<script> 3412 window.bundleapp = window.bundleapp || {}; 3413 window.bundleapp.settings = Object.assign({}, window.bundleapp.settings || {}, { 3414 bab: { 3415 productImage: 600, 3416 }, 3417 }); 3418</script>
3418 3419 3420<style> 3421 /** custom colors */ 3422 :root { 3423 --logo-image-url: url(); 3424 --primary-btn-bg-color: #000; 3425 --primary-btn-color: #fff; 3426 --primary-btn-border: 1px solid #000; 3427 --primary-btn-bg-color-hover: #222; 3428 --primary-btn-color-hover: #fff; 3429 --primary-btn-border-hover: 1px solid #222; 3430 --primary-btn-disabled-color: #828282; 3431 --primary-btn-disabled-bg-color: #e9e9e9; 3432 --primary-btn-disabled-border: 1px solid #e9e9e9; 3433 --primary-btn-disabled-bg-color-hover: #e9e9e9; 3434 --primary-btn-disabled-color-hover: #828282; 3435 --primary-btn-disabled-border-hover: 1px solid #e9e9e9; 3436 --btn-border-radius: 0; 3437 --unselected-btn-border: 1px solid var(--primary-btn-disabled-color); 3438 --unselected-btn-color: var(--primary-btn-disabled-color); 3439 --unselected-btn-bg-color: transparent; 3440 --progress-bar-bg-color: #EEEEEE; 3441 --progress-bar-completed-bg-color: #000; 3442 --progress-bar-color: #000; 3443 --progress-bar-completed-color: #FFF; 3444 } 3445 /** end custom colors */ 3446 3447 .awtomatic-progress-item.awtomatic-progress-item { 3448 background-color: var(--progress-bar-bg-color); 3449 } 3450 .awtomatic-progress-item.awtomatic-progress-item--completed { 3451 background-color: var(--progress-bar-completed-bg-color); 3452 } 3453 .bundle-stepper-item--complete:after { 3454 border-bottom-color: var(--progress-bar-completed-bg-color); 3455 } 3456 .bundle-stepper-item:after { 3457 border-bottom-color: var(--progress-bar-bg-color); 3458 } 3459 3460 .bundle-stepper-counter--complete { 3461 color: var(--progress-bar-completed-color); 3462 background-color: var(--progress-bar-completed-bg-color); 3463 } 3464 3465 .bundle-stepper-counter--incomplete { 3466 background-color: var(--progress-bar-bg-color); 3467 color: var(--progress-bar-color); 3468 } 3469 3470 /* CUSTOM PROGRESS BAR */ 3471 @media only screen and (min-width: 750px) { 3472 3473 .awtomatic-progress-item--completed button.awtomatic-progress-remove-button { 3474 display: inline-block; 3475 position: absolute; 3476 top: -8px; 3477 right: -8px; 3478 height: 20px; 3479 width: 20px; 3480 min-height: 0; 3481 border-radius: 50%; 3482 background-color: #fff; 3483 padding: 0; 3484 border-radius: 50%; 3485 box-shadow: 0px 0px 1px #000000d6; 3486 background-image: url(https://bundle-public-assets.s3.amazonaws.com/closeIcons/close-svgrepo-com.svg); 3487 background-size: 16px; 3488 transition: box-shadow .2s; 3489 background-position: center; 3490 } 3491 .awtomatic-progress-item--completed button.awtomatic-progress-remove-button:hover { 3492 box-shadow: 0px 0px 1px 1px #0000006e; 3493 } 3494 3495 3496 .awtomatic-progress-item--completed button.awtomatic-progress-remove-button:after { 3497 content: none; 3498 } 3499 3500 3501 .awtomatic-progress-count-label { 3502 display:none; 3503 } 3504 3505 .bundle-container .awtomatic-progress-container { 3506 margin-left: auto; 3507 padding-bottom: 20px; 3508 } 3509 3510 .bundleapp-modal__container--complete-screen footer { /* BaB Footer */ 3511 height: 80px; 3512 } 3513 3514 .bundleapp-modal__container--complete-screen .bundle-container { /* BaB content */ 3515 padding-top: 10px; 3516 } 3517 3518 .bundle-container .awtomatic-bab-options-container { 3519 order: 0; 3520 } 3521 .bundle-container .bundle-scrollable-section { 3522 order: 2; 3523 row-gap: 1rem; 3524 } 3525 .bundle-container .awtomatic-progress-container { 3526 order: 1; 3527 } 3528 .bundle-container footer { 3529 order: 3; 3530 } 3531 3532 3533 .awtomatic-progress-item--completed .awtomatic-progress-product-count-container .bundle-text--subheading { 3534 margin-right: 10px; 3535 } 3536 3537 .awtomatic-progress-item.awtomatic-progress-item--pending .bundle-text--subheading { 3538 color: #000; 3539 } 3540 3541 .awtomatic-progress-item.awtomatic-progress-item--completed { 3542 background-color: #fff; 3543 } 3544 3545 .awtomatic-progress-item .bundle-text--subheading { 3546 min-width: 50px; 3547 display: block; 3548 color: #fff; 3549 } 3550 3551 .awtomatic-progress-container { 3552 display: block; 3553 text-align: center; 3554 max-width: 80%; 3555 margin: 0 auto; 3556 } 3557 div.awtomatic-progress-item { 3558 width: 45px; 3559 height: 45px; 3560 display: inline-block; 3561 background-image: url(); 3562 background-size: cover; 3563 background-repeat: no-repeat; 3564 background-position: center; 3565 background-color: #eee; 3566 margin: 0 5px; 3567 border-radius: 5px; 3568 border: 2px solid #ddd; 3569 } 3570 3571 /* CUSTOM PROGRESS IMAGES */ 3572 div.awtomatic-progress-item.awtomatic-progress-item--completed { 3573 background-color: #eee; 3574 background-image: var(--awt-pb-img); 3575 } 3576 3577 3578 } 3579 /* END CUSTOM PROGRESS BAR */ 3580 3581 /* buttons */ 3582 .bundle-button.button--primary { 3583 background-color: var(--primary-btn-disabled-bg-color); 3584 color: var(--primary-btn-disabled-color); 3585 border: var(--primary-btn-disabled-border); 3586 border-radius: var(--btn-border-radius); 3587 transition: background-color .3s, color .3s; 3588 } 3589 .awtomatic-bab-options-container .bundle-button { 3590 background-color: var(--unselected-btn-bg-color); 3591 color: var(--unselected-btn-color); 3592 border: var(--unselected-btn-border); 3593 border-radius: var(--btn-border-radius); 3594 transition: background-color .3s, color .3s; 3595 } 3596 .awtomatic-bab-options-container .bundle-button span { 3597 background-color: transparent; 3598 color: var(--primary-btn-disabled-color); 3599 transition: color .3s; 3600 } 3601 .bundle-button.button--primary:hover, 3602 .awtomatic-bab-options-container .bundle-button:hover { 3603 background-color: var(--primary-btn-disabled-bg-color-hover); 3604 color: var(--primary-btn-disabled-color-hover); 3605 border: var(--primary-btn-disabled-border-hover); 3606 } 3607 .awtomatic-bab-options-container .bundle-button:hover span { 3608 color: var(--primary-btn-disabled-color-hover); 3609 } 3610 .bundle-button.button--primary:enabled, 3611 .awtomatic-bab-options-container .bundle-button.selected { 3612 background-color: var(--primary-btn-bg-color); 3613 color: var(--primary-btn-color); 3614 border: var(--primary-btn-border); 3615 border-radius: var(--btn-border-radius); 3616 transition: background-color .3s, color .3s; 3617 } 3618 .bundle-product-card__quantity-button-container--button svg { 3619 fill: var(--primary-btn-color) !important; 3620 } 3621 .bundle-product-card__quantity-button-container--button:hover svg { 3622 fill: var(--primary-btn-color-hover); 3623 } 3624 .awtomatic-bab-options-container .bundle-button.selected span { 3625 color: var(--primary-btn-color); 3626 } 3627 .bundle-button.button--primary:enabled:hover, 3628 .awtomatic-bab-options-container .bundle-button:hover { 3629 cursor: pointer; 3630 background-color: var(--primary-btn-bg-color-hover); 3631 color: var(--primary-btn-color-hover); 3632 border: var(--primary-btn-border-hover); 3633 } 3634 .awtomatic-bab-options-container .bundle-button:hover span { 3635 color: var(--primary-btn-color-hover); 3636 } 3637 /* end buttons*/ 3638 3639 /* Customer quantity button */
3640 .bundle-product-card__quantity-button-container--unavailable button.bundle-product-card__quantity-button-container--button { 3641 padding: 0; 3642 width: 0; 3643 } 3644 3645 div.bundle-product-card__quantity-button-container { 3646 /*border-color: #000586;*/ 3647 border-width: 0; 3648 border-radius: var(--btn-border-radius); 3649 background-color: var(--primary-btn-bg-color); 3650 color: var(--primary-btn-color); 3651 font-weight: bold; 3652 line-height: 15px; 3653 padding: 0; 3654 } 3655 3656 .bundle-product-card__quantity-button-container span { 3657 padding: 14px 10px; 3658 } 3659 3660 .bundle-product-card__quantity-button-container--button { 3661 padding: 14px 10px; 3662 border-radius: 0; 3663 transition: background-color 0.3s; 3664 } 3665 3666 .bundle-product-card__quantity-button-container--button:first-child { 3667 border-top-left-radius: var(--btn-border-radius); 3668 border-bottom-left-radius: var(--btn-border-radius); 3669 } 3670 .bundle-product-card__quantity-button-container--button:last-child { 3671 border-top-right-radius: var(--btn-border-radius); 3672 border-bottom-right-radius: var(--btn-border-radius); 3673 } 3674 3675 button.bundle-product-card__quantity-button-container--button:hover { 3676 background-color: var(--primary-btn-bg-color-hover); 3677 } 3678 3679 .bundle-product-card__quantity-button-container--button svg { 3680 fill: var(--primary-btn-color); 3681 } 3682 /* End Customer quantity button */ 3683 3684 /* 2 items per row in BaB */ 3685 @media only screen and (max-width: 750px) { 3686 main.bundle-scrollable-section, 3687 main .bundle-section { 3688 grid-template-columns: repeat(auto-fit, minmax(50%, 1fr)); 3689 row-gap: 0; 3690 } 3691 3692 .bundleapp-modal__container--complete-screen .bundle-product-card { 3693 width: 100%; 3694 } 3695 3696 .bundle-lazy-image-container { 3697 width: 100%; 3698 } 3699 3700 .bundle-product-card__quantity-button-container { 3701 width: 100%; 3702 } 3703 } 3704 /* end 2 items per row in BaB */ 3705 3706 /* square images */ 3707 .bundleapp-modal__container--complete-screen .bundle-product-card { 3708 width: 300px; 3709 height: 100%; 3710 } 3711 @media screen and (max-width: 768px) { 3712 .bundleapp-modal__container--complete-screen .bundle-product-card { 3713 width: 300px; 3714 } 3715 } 3716 @media screen and (max-width: 758px) { 3717 .bundleapp-modal__container--complete-screen .bundle-product-card { 3718 width: 100%; 3719 } 3720 } 3721 3722 .bundle-lazy-image-container { 3723 padding-bottom: 100%; 3724 border-radius: 0; 3725 } 3726 /* end square images */ 3727 3728 body.awt-bab-open .bundleapp-modal__logo { 3729 background-image: var(--logo-image-url); 3730 } 3731
3732 body.awt-bab-open #dummy-chat-button-iframe { 3733 display: none !important; 3734 } 3735 3736 3737 3738 body.awt-bab-open .bundleapp-modal__container--complete-screen { 3739 top: 105px; 3740 top: 0; 3741 } 3742 body.awt-bab-open .bundleapp-modal { 3743 background: none; 3744 } 3745 3746 body.awt-bab-open .bundleapp-modal__container--complete-screen:focus-visited { 3747 outline: none; 3748 } 3749 3750 body.awt-bab-open .bundle-product-card.selected { 3751 position: relative; 3752 } 3753 3754 body.awt-bab-open .bundle-product-card.selected:before { 3755 content: "IN BOX"; 3756 position: absolute; 3757 top: 35px; 3758 right: 35px; 3759 font-size: 14px; 3760 z-index: 9; 3761 padding: 3px 9px; 3762 background-color: var(--primary-btn-bg-color); 3763 color: var(--primary-btn-color); 3764 border: var(--primary-btn-border); 3765 border-radius: var(--btn-border-radius); 3766 transition: background-color 0.3s, color 0.3s; 3767 } 3768 3769 3770 body.awt-bab-open .bundleapp-modal { 3771 background: none; 3772 top: 105px; 3773 z-index: 999; 3774 } 3775 3776 body.awt-bab-open #bundleapp-subscriptions-portal *:focus-visible { 3777 outline: none; 3778 } 3779 3780 body.awt-bab-open .bundle-product-card.selected { 3781 position: relative; 3782 } 3783 3784 body.awt-bab-open .bundle-product-card.selected:before { 3785 content: "IN BOX"; 3786 position: absolute; 3787 top: 35px; 3788 right: 35px; 3789 font-size: 14px; 3790 z-index: 9; 3791 padding: 3px 9px; 3792 background-color: var(--primary-btn-bg-color); 3793 color: var(--primary-btn-color); 3794 border: var(--primary-btn-border); 3795 border-radius: var(--btn-border-radius); 3796 transition: background-color 0.3s, color 0.3s; 3797 } 3798 3799 body.list-collections .awt-style-1 { 3800 max-width: 540px; 3801 margin-top: 0; 3802 } 3803 3804 #bundleapp-subscriptions-root .bundle-subs-detail-layout .bundle-table__header td { 3805 background: #f9f9f9; 3806 } 3807 3808 #bundleapp-subscriptions-root .bundle-subs-detail-layout tr > * { 3809 border-right: none; 3810 } 3811 3812 h4.bundle-card__title { 3813 font-size: initial; 3814 margin: initial; 3815 padding: initial; 3816 line-height: initial; 3817 } 3818 button.bundle-card__button { 3819 color: initial; 3820 } 3821 .awt-nbd-code-container button.bundleapp-btn--text { 3822 line-height: initial; 3823 padding: initial; 3824 font-size: initial; 3825 margin: initial; 3826 height: 28px; 3827 min-height: initial; 3828 } 3829 3830 button.bundleapp-btn--text:before, button.bundleapp-btn--text:after { 3831 content: initial; 3832 } 3833</style> 3834 3835 3836
3837<script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
3837 3838</body> <!-- bold subscriptions app -->
3838<script type="lazyload2" data-src="//baconsheir.com/cdn/shop/t/84/assets/bold-helper-functions.js?v=109594920164983513461700515168" async="async"></script>
3838 3839 3840
3841<script> 3842 jQuery(document).on('click', '[name="checkout"]', function(){bold_ro_checkout(this)}); 3843 function bold_ro_checkout(target) { 3844 var ro_from = jQuery(target).closest('form'); 3845 if (typeof mixed_cart != "undefined" && mixed_cart) 3846 { 3847 jQuery.ajax({ 3848 type: 'GET', 3849 url: '/cart.json', 3850 dataType: 'jsonp', 3851 async: false, 3852 success: function (data) { 3853 if (data.hasOwnProperty("items")) { 3854 for (var key in data.items) { 3855 if (data.items[key].hasOwnProperty('product_description')) { 3856 data.items[key].product_description = ''; 3857 } 3858 } 3859 } 3860 ro_from.append('<input type="hidden" name="shopify_cart" value="' + encodeURIComponent(JSON.stringify(data)) + '">'); 3861 ro_from.append('<input type="hidden" name="csrf_bold_token" value="775e4634405371661f03beaac36d1c1b" />'); 3862 ro_from.attr('action', "https://recurringcheckout.com/s/bacons-heir/checkout/recurring/" + data.token + "?shop_url=bacons-heir.myshopify.com" + google_analytics_get_param_string()); 3863 } 3864 }); 3865 } 3866 } 3867 function show_promotional_modal() { 3868 $('.hover_modal').tooltip({ 3869 title: "<div align=\"left\">\n<div><strong>Subscription Details<\/strong><\/div>\n<div>\n<ul>\n<li>Set it and forget it!<\/li>\n<li>Pause, edit or cancel anytime.<\/li>\n<\/ul>\n<\/div>\n<\/div>", 3870 html: true, 3871 placement: "bottom" 3872 }); 3873 } 3874 function google_analytics_get_param_string() { 3875 var google_analytics_get_param_string = ''; 3876 var get_param_string = decodeURIComponent(window.location.search.substring(1)); 3877 var get_param_array = get_param_string.split('&'); 3878 for (var i = 0; i <get_param_array.length; i++) { 3879 var get_param_pair = get_param_array[i].split('='); 3880 if (get_param_pair[0] === 'utm_source' || get_param_pair[0] === 'utm_medium' || get_param_pair[0] === 'utm_term' || get_param_pair[0] === 'utm_content' || get_param_pair[0] === 'utm_campaign') { 3881 google_analytics_get_param_string = google_analytics_get_param_string + "&" + get_param_pair[0] + '=' + get_param_pair[1]; 3882 } 3883 } 3884 return google_analytics_get_param_string; 3885 } 3886</script>
3886
3886<script> 3887 var windowWidth,lazyImages,lazyBackground,lazyIframe,lazyScripts,navigator_platform,src,style,datasrc,urls,analytics,s,x,i,j,flag;function ks_init(){flag&&(flag=0,lazyLoadImg(),lazyLoadBackground(),lazyLoadIframe(),load_all_js())}function isElementInViewport(t){var a=t.getBoundingClientRect();return a.top>=0&&a.left>=0&&a.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&a.right<=(window.innerWidth||document.documentElement.clientWidth)}function lazyLoadImg(){lazyImages.forEach(function(t){null!=(src=windowWidth<600?null==t.dataset.mobsrc?t.dataset.src:t.dataset.mobsrc:t.dataset.src)&&(t.src=src),t.classList.remove("lazy2")})}function lazyLoadImg2(){lazyImages.forEach(function(t){isElementInViewport(t)&&(null!=(src=windowWidth<600?null==t.dataset.mobsrc?t.dataset.src:t.dataset.mobsrc:t.dataset.src)&&(t.src=src),t.classList.remove("lazy"))})}function lazyLoadBackground(){lazyBackground.forEach(function(t){lazybg=windowWidth<600?null==t.dataset.mobstyle?t.dataset.style:t.dataset.mobstyle:t.dataset.style,null!=lazybg&&(t.style=lazybg),t.classList.remove("lazybg")})}function lazyLoadIframe(){lazyIframe.forEach(function(t){null!=t.dataset.src&&(t.src=t.dataset.src)})}function lazyLoadScripts(){j!=lazyScripts.length&&("lazyload2"==lazyScripts[j].getAttribute("type")?(lazyScripts[j].setAttribute("type","lazyloaded"),void 0!==lazyScripts[j].dataset.src?((s=document.createElement("script")).src=lazyScripts[j].dataset.src,document.body.appendChild(s),s.onload=function(){j++,lazyLoadScripts()}):((s=document.createElement("script")).innerHTML=lazyScripts[j].innerHTML,document.body.appendChild(s),j++,lazyLoadScripts())):(j++,lazyLoadScripts()))}function lazyLoadCss(t){(s=document.createElement("link")).rel="stylesheet",s.href=t,document.getElementsByTagName("head")[0].appendChild(s)}function lazyLoadJS(t){(s=document.createElement("script")).src=t,document.body.appendChild(s)}function load_all_js(){document.body.click(),lazyLoadCss("https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.5.6/jquery.fancybox.css"),lazyLoadCss(slick),window.location.href.indexOf("bacons-heir.myshopify.com")>-1||window.location.href.indexOf("/cart")>-1||window.location.href.indexOf("/checkout")>-1?console.log("No-Optimization"):(console.log("No-Optimization"),setTimeout(function(){const t=new Event("ks_load");window.dispatchEvent(t)},200),lazyLoadJS("https://cdn.shopify.com/shopifycloud/shopify/assets/storefront/load_feature-a55261a7a987674749989983b5889eadaac6795d8d48548fb61470a96edb9524.js"),lazyLoadJS("https://cdn.shopify.com/shopifycloud/shopify/assets/shopify_pay/storefront-b61f50798075db890698930c4405673937fe89353f7fea7be88b5ce16a9c0af8.js?v=20210208"),lazyLoadJS("https://cdn.shopify.com/shopifycloud/shopify/assets/storefront/features-87e8399988880142f2c62771b9d8f2ff6c290b3ff745dd426eb0dfe0db9d1dae.js")),j=0,lazyScripts=document.getElementsByTagName("script"),lazyLoadScripts(),setInterval(function(){lazyImages=document.querySelectorAll("img.lazy2"),lazyBackground=document.querySelectorAll(".lazybg"),lazyLoadImg(),lazyLoadBackground()},2e3)}document.addEventListener("DOMContentLoaded",function(){windowWidth=screen.width,lazyImages=document.querySelectorAll("img.lazy2"),nolazyImages=document.querySelectorAll("img.lazy"),lazyBackground=document.querySelectorAll(".lazybg"),lazyIframe=document.querySelectorAll("iframe"),lazyScripts=document.getElementsByTagName("script"),navigator_platform=navigator.platform,i=0,j=0,flag=1,window.addEventListener("scroll",function(){ks_init()}),window.addEventListener("mousemove",function(){ks_init()}),window.addEventListener("touchstart",function(){ks_init()}),"Linux x86_64"!=navigator_platform&&ks_init()});</script>
3887 3888 3889</html> 3890 3891 3892
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.