Outiref
<!doctype html><html
 lang="fr"><head>
<!-- Start of Shoplift scripts -->
<!-- 2026-06-25T15:09:41.5405807Z -->
<style>.shoplift-hide { opacity: 0 !important; }</style>
<style id="sl-preview-bar-hide">#preview-bar-iframe, #PBarNextFrameWrapper { display: none !important; }</style>
<script type="text/javascript">(function(rootPath, template, themeRole, themeId, isThemePreview){ /* Generated on 2026-06-29T15:03:03.2984985Z */(function(){"use strict";var tt=document.createElement("style");tt.textContent=`#shoplift-preview-control{position:fixed;max-width:332px;height:56px;background-color:#141414;z-index:9999;bottom:20px;display:flex;border-radius:8px;box-shadow:13px 22px 7px #0000,9px 14px 7px #00000003,5px 8px 6px #0000000d,2px 4px 4px #00000017,1px 1px 2px #0000001a,0 0 #0000001a;align-items:center;margin:0 auto;left:16px;right:16px;opacity:0;transform:translateY(20px);visibility:hidden;transition:opacity .4s ease-in-out,transform .4s ease-in-out,visibility 0s .4s}#shoplift-preview-control.visible{opacity:1;transform:translateY(0);visibility:visible;transition:opacity .4s ease-in-out,transform .4s ease-in-out,visibility 0s 0s}#shoplift-preview-control *{font-family:Inter,sans-serif;color:#fff;box-sizing:border-box;font-size:16px}#shoplift-preview-variant-title{font-weight:400;line-height:140%;font-size:16px;text-align:start;letter-spacing:-.16px;flex-grow:1;text-wrap:nowrap;overflow:hidden;text-overflow:ellipsis}#shoplift-preview-variant-selector{position:relative;display:block;padding:6px 0;height:100%;min-width:0;flex:1 1 auto}#shoplift-preview-variant-menu-trigger{border:none;cursor:pointer;width:100%;background-color:transparent;padding:0 16px;border-left:1px solid #333;border-right:1px solid #333;height:100%;display:flex;align-items:center;justify-content:start;gap:8px}#shoplift-preview-variant-selector .menu-variant-label{width:24px;height:24px;border-radius:50%;padding:6px;display:flex;justify-content:center;align-items:center;font-size:12px;font-style:normal;font-weight:600;line-height:100%;letter-spacing:-.12px;flex-shrink:0}#shoplift-preview-variant-selector .preview-variant-menu{position:absolute;bottom:110%;transform:translate3d(0,20px,0);visibility:hidden;pointer-events:none;opacity:0;cursor:pointer;background-color:#141414;border:1px solid #141414;border-radius:6px;width:100%;max-height:156px;overflow-y:auto;box-shadow:0 8px 16px #0003;z-index:1;transition:opacity .3s ease-in-out,transform .3s ease-in-out,visibility 0s .3s}#shoplift-preview-variant-selector .preview-variant-menu.preview-variant-menu__visible{visibility:visible;pointer-events:auto;opacity:100;transform:translateZ(0);transition:opacity .3s ease-in-out,transform .3s ease-in-out,visibility 0s 0s}@media screen and (max-width:400px){#shoplift-preview-variant-selector .preview-variant-menu{position:fixed;left:0;right:0;width:auto;bottom:110%}}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item{padding:12px 16px;display:flex;overflow:hidden}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item .menu-variant-label{margin-right:6px}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item span{overflow:hidden;text-overflow:ellipsis;text-wrap:nowrap;white-space:nowrap;color:#f6f6f6;font-size:14px;font-style:normal;font-weight:500}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:hover{background-color:#545454}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:last-of-type{border-bottom-left-radius:6px;border-bottom-right-radius:6px}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:first-of-type{border-top-left-radius:6px;border-top-right-radius:6px}#shoplift-preview-control div:has(#shoplift-exit-preview-button){padding:0 16px}#shoplift-exit-preview-button{padding:6px 8px;font-weight:500;line-height:75%;border-radius:4px;background-color:transparent;border:none;text-decoration:none}#shoplift-exit-preview-button:hover{cursor:pointer;background-color:#333}#shoplift-preview-subscription-warning{position:relative;display:flex;align-items:center;gap:6px;padding:6px 10px;margin:0 4px;border-left:1px solid #333;cursor:help;outline:none}#shoplift-preview-subscription-warning__icon{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background-color:#f59e0b;color:#141414!important;font-weight:700;font-size:12px!important;line-height:1;flex-shrink:0}#shoplift-preview-subscription-warning__label{font-size:13px!important;font-weight:500;color:#fbbf24!important;text-wrap:nowrap;white-space:nowrap}#shoplift-preview-subscription-warning__tooltip{position:absolute;bottom:calc(100% + 8px);right:0;max-width:320px;width:max-content;padding:10px 12px;border-radius:6px;background-color:#1f1f1f;color:#fff!important;font-size:12px!important;line-height:1.4!important;box-shadow:0 8px 16px #0000004d;z-index:10000;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .2s ease-in-out,transform .2s ease-in-out,visibility 0s .2s;pointer-events:none}#shoplift-preview-subscription-warning__tooltip.shoplift-preview-subscription-warning__tooltip--visible{opacity:1;visibility:visible;transform:translateY(0);transition:opacity .2s ease-in-out,transform .2s ease-in-out,visibility 0s 0s}#shoplift-preview-subscription-warning:focus-visible{box-shadow:inset 0 0 0 2px #f59e0b;border-radius:4px}#shoplift-preview-control:has(#shoplift-preview-subscription-warning){max-width:480px}/*$vite$:1*/`,document.head.appendChild(tt);var ht=" daum[ /]| deusu/| yadirectfetcher|(?:^|[^g])news(?!sapphire)|(?<! (?:channel/|google/))google(?!(app|/google| pixel))|(?<! cu)bots?(?:\\b|_)|(?<!(?: ya| yandex|^job|inapp;) ?)search|(?<!(?:lib))http|(?<![hg]m)score|@[a-z][\\w-]+\\.|\\(\\)|\\.com|\\b\\d{13}\\b|^<|^[\\w \\.\\-\\(?:\\):]+(?:/v?\\d+(?:\\.\\d+)?(?:\\.\\d{1,10})*?)?(?:,|$)|^[^ ]{50,}$|^\\d+\\b|^\\w+/[\\w\\(\\)]*$|^active|^ad muncher|^amaya|^avsdevicesdk/|^biglotron|^bot|^bw/|^clamav[ /]|^client/|^cobweb/|^custom|^ddg[_-]android|^discourse|^dispatch/\\d|^downcast/|^duckduckgo|^facebook|^getright/|^gozilla/|^hobbit|^hotzonu|^hwcdn/|^jeode/|^jetty/|^jigsaw|^microsoft bits|^movabletype|^mozilla/\\d\\.\\d \\(compatible;?\\)$|^mozilla/\\d\\.\\d \\w*$|^navermailapp|^netsurf|^offline|^owler|^postman|^python|^rank|^read|^reed|^rest|^rss|^snapchat|^space bison|^svn|^swcd |^taringa|^thumbor/|^track|^valid|^w3c|^webbandit/|^webcopier|^wget|^whatsapp|^wordpress|^xenu link sleuth|^yahoo|^yandex|^zdm/\\d|^zoom marketplace/|^{{.*}}$|admin|analyzer|archive|ask jeeves/teoma|bit\\.ly/|bluecoat drtr|browsex|burpcollaborator|capture|catch|check|chrome-lighthouse|chromeframe|classifier|clean|cloud|crawl|cypress/|dareboost|datanyze|dejaclick|detect|dmbrowser|download|evc-batch/|feed|firephp|gomezagent|headless|httrack|hubspot marketing grader|hydra|ibisbrowser|images|insight|inspect|iplabel|ips-agent|java(?!;)|library|mail\\.ru/|manager|measure|neustar wpm|node|nutch|offbyone|optimize|pageburst|pagespeed|parser|perl|phantomjs|pingdom|powermarks|preview|proxy|ptst[ /]\\d|reputation|resolver|retriever|rexx;|rigor|rss\\b|scan|scrape|server|sogou|sparkler/|speedcurve|spider|splash|statuscake|synapse|synthetic|tools|torrent|trace|transcoder|url|virtuoso|wappalyzer|watch|webglance|webkit2png|whatcms/|zgrab",ft=/bot|spider|crawl|http|lighthouse/i,z;function gt(){if(z instanceof RegExp)return z;try{z=new RegExp(ht,"i")}catch{z=ft}return z}function mt(a){return!!a&&gt().test(a)}class Q{timestamp;constructor(){this.timestamp=new Date}}class yt extends Q{type;testId;hypothesisId;constructor(t,e,i){super(),this.type=3,this.testId=t,this.hypothesisId=e,this.timestamp=i}}class vt extends Q{type;path;constructor(t){super(),this.type=4,this.path=t}}class wt extends Q{type;cart;constructor(t){super(),this.type=5,this.cart=t}}class et extends Error{isBot;constructor(){super(),this.isBot=!0}}function bt(a,t,e){for(const i of t.selectors){const s=a.querySelectorAll(i.cssSelector);for(let r=0;r<s.length;r++)e(t.testId,t.hypothesisId)}st(a,t,(i,s,r,n,o)=>o(s,r),e)}function N(a,t,e){for(const i of t.selectors)rt(a,t.testId,t.hypothesisId,i,e??(()=>{}));st(a,t,rt,e??(()=>{}))}function it(a){return a.urlPatterns.reduce((t,e)=>{switch(e.operator){case"contains":return t+`.*${e}.*`;case"endsWith":return t+`.*${e}`;case"startsWith":return t+`${e}.*`}},"")}function st(a,t,e,i){new MutationObserver(()=>{for(const r of t.selectors)e(a,t.testId,t.hypothesisId,r,i)}).observe(a.documentElement,{childList:!0,subtree:!0})}function rt(a,t,e,i,s){const r=a.querySelectorAll(i.cssSelector);for(let n=0;n<r.length;n++){let o=r.item(n);if(o instanceof HTMLElement&&o.dataset.shoplift!==""){o.dataset.shoplift="";for(const l of i.actions.sort(kt))o=St(a,i.cssSelector,o,l)}}return r.length>0&&s?(s(t,e),!0):!1}function St(a,t,e,i){switch(i.type){case"innerHtml":e.innerHTML=i.value;break;case"attribute":Ct(e,i.scope,i.value);break;case"css":Tt(a,t,i.value);break;case"js":It(a,e,i);break;case"copy":return Pt(e);case"remove":At(e);break;case"move":Et(e,parseInt(i.value));break}return e}function Ct(a,t,e){a.setAttribute(t,e)}function Tt(a,t,e){const i=a.createElement("style");i.innerHTML=`${t} { ${e} }`,a.getElementsByTagName("head")[0]?.appendChild(i)}function It(a,t,e){Function("document","element",`"use strict"; ${e.value}`)(a,t)}function Pt(a){const t=a.cloneNode(!0);if(!a.parentNode)throw"Can't copy node outside of DOM";return a.parentNode.insertBefore(t,a.nextSibling),t}function At(a){a.remove()}function Et(a,t){if(t===0)return;const e=Array.prototype.slice.call(a.parentElement.children).indexOf(a),i=Math.min(Math.max(e+t,0),a.parentElement.children.length-1);a.parentElement.children.item(i).insertAdjacentElement(t>0?"afterend":"beforebegin",a)}function kt(a,t){return nt(a)-nt(t)}function nt(a){return a.type==="copy"||a.type==="remove"?0:1}var M=(a=>(a[a.Template=0]="Template",a[a.Theme=1]="Theme",a[a.UrlRedirect=2]="UrlRedirect",a[a.Script=3]="Script",a[a.Dom=4]="Dom",a[a.Price=5]="Price",a))(M||{});const xt="data:image/svg+xml,%3csvg%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M9.96001%207.90004C9.86501%207.90004%209.77001%207.86504%209.69501%207.79004L6.43501%204.53004C6.19501%204.29004%205.80501%204.29004%205.56501%204.53004L2.30501%207.79004C2.16001%207.93504%201.92001%207.93504%201.77501%207.79004C1.63001%207.64504%201.63001%207.40504%201.77501%207.26004L5.03501%204.00004C5.56501%203.47004%206.43001%203.47004%206.96501%204.00004L10.225%207.26004C10.37%207.40504%2010.37%207.64504%2010.225%207.79004C10.15%207.86004%2010.055%207.90004%209.96001%207.90004Z'%20fill='white'/%3e%3c/svg%3e",_t="data:image/svg+xml,%3csvg%20width='14'%20height='24'%20viewBox='0%200%2014%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M12.3976%2014.5255C12.2833%2013.8788%2012.0498%2013.3024%2011.6952%2012.7961C11.3416%2012.2898%2010.9209%2011.8353%2010.4353%2011.4317C9.94868%2011.0291%209.43546%2010.6488%208.89565%2010.292C8.48487%2010.049%208.09577%209.78565%207.72637%209.50402C7.35697%209.2224%207.08016%208.89503%206.89694%208.51987C6.71273%208.14471%206.67826%207.69533%206.79055%207.1697C6.86345%206.83216%206.97476%206.54647%207.12351%206.31162C7.27324%206.07778%207.47124%205.89986%207.7175%205.77684C7.96377%205.65483%208.21989%205.59383%208.48389%205.59383C8.88087%205.59383%209.17639%205.7016%209.3734%205.91714C9.56943%206.13268%209.68271%206.42345%209.71424%206.78946C9.74576%207.15547%209.72015%207.55401%209.63839%207.98509C9.55663%208.41617%209.43645%208.84724%209.27687%209.27934L13.5127%208.80149C13.9638%207.52656%2014.1017%206.42447%2013.9264%205.49725C13.751%204.56901%2013.2664%203.85122%2012.4724%203.34491C12.239%203.19648%2011.9779%203.07041%2011.6893%202.96569L12.0026%201.50979L9.86397%200L7.3875%201.50979L7.11169%202.78878C6.65166%202.8874%206.21724%203.01957%205.8114%203.19038C4.85292%203.594%204.06684%204.15115%203.45117%204.86385C2.83452%205.57655%202.42571%206.40108%202.22378%207.33847C2.06616%208.06947%202.04942%208.70796%202.17551%209.25087C2.30061%209.7948%202.52028%2010.2828%202.8355%2010.7139C3.14974%2011.145%203.51816%2011.5344%203.93977%2011.881C4.36039%2012.2288%204.782%2012.5521%205.20164%2012.851C5.68334%2013.1702%206.13844%2013.5169%206.56497%2013.8921C6.99052%2014.2672%207.31954%2014.7125%207.55004%2015.228C7.78055%2015.7445%207.81502%2016.3769%207.65347%2017.1262C7.56482%2017.5389%207.43676%2017.8765%207.27028%2018.1388C7.10381%2018.4011%206.89596%2018.5983%206.64772%2018.7295C6.3985%2018.8606%206.12071%2018.9267%205.8114%2018.9267C5.21641%2018.9267%204.79776%2018.6034%204.62833%2018.1632C4.4589%2017.7229%204.47367%2017.2583%204.60075%2016.5639C4.72782%2015.8705%205.05092%2015.1395%205.37107%2014.3699H1.17665C1.17665%2014.3699%200.207341%2016.1115%200.0310135%2017.6762C-0.0655232%2018.5302%200.0635208%2019.2653%200.41519%2019.8844C0.76686%2020.5036%201.33032%2020.9814%202.10655%2021.319C2.39222%2021.443%202.7104%2021.5447%203.05813%2021.623L2.54589%2024H7.17473L7.7047%2021.5386C8.08493%2021.442%208.43857%2021.3231%208.76562%2021.1787C9.73985%2020.7476%2010.52%2020.1427%2011.1071%2019.3649C11.6932%2018.5871%2012.0873%2017.7291%2012.2892%2016.7917C12.4744%2015.9295%2012.5099%2015.1741%2012.3966%2014.5275L12.3976%2014.5255Z'%20fill='white'/%3e%3c/svg%3e";async function Rt(a){let t=a.replace(/-/g,"+").replace(/_/g,"/");for(;t.length%4;)t+="=";const e=atob(t),i=Uint8Array.from(e,n=>n.charCodeAt(0)),s=new Blob([i]).stream().pipeThrough(new DecompressionStream("gzip")),r=await new Response(s).text();return JSON.parse(r)}function F(a,t){return typeof t=="string"&&/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+(?:Z|[+-]\d+)/.test(t)?new Date(t):t}function X(a,t){return t}function q(a,t=!1,e=!1,i=","){const s=a/100;if(e){const n=Math.round(s).toLocaleString("en-US");return i!==","?n.replace(/,/g,i):n}else{const r=t?",":".",n=s.toFixed(2).split("."),o=parseInt(n[0],10),l=n[1]??"00",c=o.toLocaleString("en-US");return i!==","?`${c.replace(/,/g,i)}${r}${l}`:t?`${c.replace(/,/g,".")}${r}${l}`:`${c}${r}${l}`}}function H(a,t,e,i){const s=t.replace("{{amount}}",q(a,!1,!1)).replace("{{amount_no_decimals}}",q(a,!1,!0)).replace("{{amount_with_comma_separator}}",q(a,!0,!1)).replace("{{amount_no_decimals_with_comma_separator}}",q(a,!0,!0)).replace("{{amount_with_space_separator}}",q(a,!1,!1," ")).replace("{{amount_no_decimals_with_space_separator}}",q(a,!1,!0," ")).replace("{{amount_with_apostrophe_separator}}",q(a,!1,!1,"'")).replace("{{amount_no_decimals_with_apostrophe_separator}}",q(a,!1,!0,"'")).replace("{{amount_with_period_and_space_separator}}",q(a,!1,!1,". ")).replace("{{amount_no_decimals_with_period_and_space_separator}}",q(a,!1,!0,". "));return i?`${s} ${e}`:s}function ot(a){return a.replace(/[^\d.,\s-]/g,"").trim()}function j(a){const t=new Map;for(const[e,i,s]of a.variants)t.set(e,{priceInCents:i,compareAtPriceInCents:s});return t}function Dt(a,t,e,i){const{priceInCents:s,compareAtPriceInCents:r}=e,{moneyFormat:n,currency:o,currencyCodeEnabled:l}=i;if(a.getAttribute("data-sl-attribute-p")===t)a.innerHTML=H(s,n,o,l);else if(a.getAttribute("data-sl-attribute-cap")===t)r<=0||r<=s?a.remove():a.innerHTML=H(r,n,o,l);else if(a.getAttribute("data-sl-attribute-discount")===t&&!(r<=0||r<=s)){const d=Math.round((r-s)/r*100),p=ot(H(r-s,n,o,!1)),h=a.getAttribute("data-sl-format")||"percent";h==="percent"?a.textContent=`-${d}%`:h==="amount"?a.textContent=`-${p}`:h==="both"&&(a.textContent=`-${d}% (-${p})`)}}function Ot(a){const t=[],e={id:"url-pattern",operator:"contains",value:"/"};for(const[i,s,r]of a.variants){t.push({id:`p-${i}`,cssSelector:`[data-sl-attribute-p="${i}"]`,urlPatterns:[e],actions:[{id:`p-action-${i}`,type:"innerHtml",scope:"price",value:H(s,a.moneyFormat,a.currency,a.currencyCodeEnabled)}]});const n=r<=0||r<=s;if(t.push({id:`cap-${i}`,cssSelector:`[data-sl-attribute-cap="${i}"]`,urlPatterns:[e],actions:[{id:`cap-action-${i}`,type:n?"remove":"innerHtml",scope:"compare-at-price",value:n?"":H(r,a.moneyFormat,a.currency,a.currencyCodeEnabled)}]}),!n&&r>s){const o=Math.round((r-s)/r*100),l=ot(H(r-s,a.moneyFormat,a.currency,!1));t.push({id:`d-${i}`,cssSelector:`[data-sl-attribute-discount="${i}"]`,urlPatterns:[e],actions:[{id:`d-action-${i}`,type:"js",scope:null,value:`var format = element.getAttribute('data-sl-format') || 'percent';                    if (format === 'percent') {                      element.textContent = '-${o}%';                    } else if (format === 'amount') {                      element.textContent = '-${l}';                    } else if (format === 'both') {                      element.textContent = '-${o}% (-${l})';                    }`}]})}}return t}const Jt="modulepreload",Yt=function(a){return"/"+a},Zt={},Vt=function(t,e,i){let s=Promise.resolve();function r(n){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=n,window.dispatchEvent(o),!o.defaultPrevented)throw n}return s.then(n=>{for(const o of n||[])o.status==="rejected"&&r(o.reason);return t().catch(r)})};function at(a,t,e){const i=e?a.plans.filter(c=>!c.variantId||c.variantId===e):a.plans,s=[],r=[];for(const c of i)c.direction==="decrease"?(s.push(c.existingShopifyPlanId),r.push(c.createdShopifyPlanId)):(s.push(c.createdShopifyPlanId),r.push(c.existingShopifyPlanId));const n=t?s:r,o=t?r:s;if(e)for(const c of a.plans)for(const d of[c.existingShopifyPlanId,c.createdShopifyPlanId])d&&!n.includes(d)&&!o.includes(d)&&o.push(d);const l={};for(let c=0;c<o.length;c++){const d=o[c],p=n[c];d&&p&&(l[d]=p)}return{showPlanIds:n,hidePlanIds:o,swapMap:l}}function lt(a,t,e){const i=t?a.plans.find(r=>r.variantId===t):void 0;if(i)return i.direction;if(e){const r=a.plans.find(n=>n.productId===e);if(r)return r.direction}return a.plans.find(r=>!r.variantId)?.direction??null}function K(a,t){const e=t?a.plans.filter(r=>!r.productId||r.productId===t):a.plans,i={};for(const r of e)i[r.existingShopifyPlanId]=r.existingDiscountAmount,i[r.createdShopifyPlanId]=r.existingDiscountAmount;const s=Math.max(...Object.values(i),0);return{discountMap:i,maxDiscount:s}}function W(a){const t=document.querySelector('form[action*="/cart/add"] input[name="product-id"]')?.value;if(t)return t;if(a){for(const r of Array.from(document.querySelectorAll("[data-sl-attribute-p]"))){const n=r.getAttribute("data-sl-attribute-p");if(!n)continue;const o=a.variants.find(l=>l[0]===n);if(o?.[3])return o[3]}const s=document.querySelector('form[action*="/cart/add"] input[name="id"]')?.value;if(s){const r=a.variants.find(n=>n[0]===s);if(r?.[3])return r[3]}}const e=window,i=e.ShopifyAnalytics?.meta?.product?.id??e.meta?.product?.id;return i!=null?String(i):null}function D(a,t){return a.widget.selectors[t]??[]}function U(a,t){return a.replace(/[\d.]+%/,`${t}%`)}function $(a,t){const e=document.createTreeWalker(a,NodeFilter.SHOW_TEXT);let i=e.nextNode();for(;i;){if(i.nodeValue!==null){const s=t(i.nodeValue);if(s!==i.nodeValue){i.nodeValue=s;return}}i=e.nextNode()}}function ct(a,t){return a===null?!1:a==="decrease"?!t:t}async function Lt(a){if(a.subscriptionSwapDone)return;const t=a.getActiveAssignment();if(!t)return;const e=a.getHypothesis(t.hypothesisId);if(!e?.subscriptionData)return;a.subscriptionSwapDone=!0;const i=e.subscriptionData,s=e.isControl,r=[...new Set(i.plans.map(d=>d.direction))].join(",");a.log(`[SUB-SWAP] ${s?"A":"B"} side, directions=${r}`);const n=i.plans.some(d=>d.variantId);let o=!1,l=!1;function c(){if(!l){l=!0;try{const d=n?document.querySelector("select[name='id'], input[name='id']")?.value:void 0,{showPlanIds:p,hidePlanIds:h,swapMap:u}=at(i,s,d);a.swapMap=u;const b=D(i,"widgetParent"),k=D(i,"subscriptionPlans"),S=D(i,"subscriptionInput");if(!b.length||!k.length||!S.length)return;const P=document.querySelector(b[0].selector);if(!P?.shadowRoot)return;const _=P.shadowRoot.querySelector(k[0].selector);if(!_?.shadowRoot)return;const C=S[0].selector;let m=null;if(i.widget.widgetType==="buttons"||i.widget.widgetType==="radio"){const y=Array.from(_.shadowRoot.querySelectorAll(C));if(!y.length)return;for(const v of y){const g=v.closest("label");g&&(p.includes(v.value)?g.style.display="":h.includes(v.value)&&(g.style.display="none"))}const w=y.some(v=>p.includes(v.value)&&v.checked),T=y.some(v=>h.includes(v.value)&&v.checked);if((w||T)&&(o=!1),!w&&!o){o=!0;for(const v of y)if(p.includes(v.value)){v.closest("label")?.click(),v.dispatchEvent(new Event("change",{bubbles:!0}));break}}const f=y.find(v=>v.checked);m=f&&p.includes(f.value)?f.value:p[0]??null}else if(i.widget.widgetType==="dropdown"){const y=_.shadowRoot.querySelector("select");if(!y)return;for(const w of Array.from(y.options))h.includes(w.value)&&(w.style.display="none",w.disabled=!0);if(h.includes(y.value)){const w=Array.from(y.options).find(T=>p.includes(T.value));w&&(y.value=w.value,y.dispatchEvent(new Event("change",{bubbles:!0})))}m=p.includes(y.value)?y.value:p[0]??null}if(m){const y=Array.from(document.querySelectorAll('input[name="selling_plan"]'));for(const w of y)w.value!==m&&(w.value=m)}}finally{l=!1}}}if(a.subscriptionHideWrongPlans=c,a.swapMap=at(i,s).swapMap,c(),n){const d=document.querySelector("select[name='id'], input[name='id']");d&&d.addEventListener("change",c)}}function B(a){const t=D(a,"widgetParent");return t.length?document.querySelector(t[0].selector)?.shadowRoot??null:null}function J(a,t){const e=D(a,"subscriptionPlans");return e.length?t.querySelector(e[0].selector)?.shadowRoot??null:null}function Y(a,t){const e=new URLSearchParams(window.location.search).get("variant");if(e)return e;{const i=document.querySelector('form[action*="/cart/add"] input[name="id"]')?.value;if(i)return i}return a.size>0?[...a.keys()][0]:void 0}function G(a,t){return H(a,t.moneyFormat,t.currency,t.currencyCodeEnabled)}function $t({originalFetch:a,swapMap:t,slptValue:e,getSelectedPlanId:i,log:s}){if(window.fetch.__shoplift_intercepted)return s("[SUB-INTERCEPT] already installed — skipping"),()=>{};function r(o){if(i){const l=i();if(l)return t[l]??l}return t[o]??o}const n=function(o,l){if((typeof o=="string"?o:o instanceof URL?o.href:o.url).includes("/cart/add")&&l?.body)try{if(l.body instanceof FormData){const d=l.body.get("selling_plan");d?l.body.set("selling_plan",r(String(d))):(!d||d==="")&&e&&l.body.set("properties[_slpt]",e)}else if(typeof l.body=="string"){const d=JSON.parse(l.body);if(d.items)for(const p of d.items){const h=String(p.selling_plan??"");h?p.selling_plan=r(h):!p.selling_plan&&e&&(p.properties||(p.properties={}),p.properties._slpt=e)}else if(d.id){const p=String(d.selling_plan??"");p?d.selling_plan=r(p):!d.selling_plan&&e&&(d.properties||(d.properties={}),d.properties._slpt=e)}l.body=JSON.stringify(d)}}catch(d){s("[SUB-INTERCEPT] body parse failed; cart-add proceeds with un-swapped plan",d)}return a.call(window,o,l)};return n.__shoplift_intercepted=!0,window.fetch=n,function(){window.fetch===n&&(window.fetch=a)}}function Mt({log:a}){if(window.fetch.__shoplift_intercepted)return a("[SUB-PREVIEW-BLOCK] already installed — skipping"),()=>{};const t=window.fetch,e=function(i,s){const r=typeof i=="string"?i:i instanceof URL?i.href:i.url;return r.includes("/cart/add")?(a("[SUB-PREVIEW-BLOCK] cart-add blocked in preview mode",{url:r}),Promise.resolve(new Response(JSON.stringify({id:0,properties:{},quantity:0,variant_id:0,key:"preview",title:"Preview — cart-add blocked",price:0,original_price:0,line_price:0,original_line_price:0,total_discount:0,discounts:[],preview:!0}),{status:200,headers:{"Content-Type":"application/json"}}))):t.call(window,i,s)};return e.__shoplift_intercepted=!0,window.fetch=e,function(){window.fetch===e&&(window.fetch=t)}}function dt({data:a,runUpdates:t,debounceMs:e=150}){let i=null;function s(){i&&clearTimeout(i),t(),i=setTimeout(t,e)}let r=null;const n=[],o={childList:!0,subtree:!0,characterData:!0,attributes:!0};function l(h){for(const u of n)u.disconnect();n.length=0;for(const u of Array.from(h.querySelectorAll("*")))if(u.shadowRoot){const b=new MutationObserver(s);b.observe(u.shadowRoot,o),n.push(b)}}function c(){const h=B(a);return h?(r&&r.disconnect(),l(h),r=new MutationObserver(u=>{u.some(b=>b.type==="childList"&&b.addedNodes.length>0)&&l(h),s()}),r.observe(h,o),!0):!1}const d=document.body||document.documentElement,p=new MutationObserver(()=>{c()&&s()});return p.observe(d,{childList:!0,subtree:!0}),c()&&s(),t(),function(){i&&(clearTimeout(i),i=null),p.disconnect(),r&&(r.disconnect(),r=null);for(const u of n)u.disconnect();n.length=0}}async function qt(a){if(a.subscriptionPriceDone)return;const t=a.getActiveAssignment(),e=t?a.getHypothesis(t.hypothesisId):void 0,i=e?.subscriptionData?null:a.findActiveSubscriptionTestControl(),s=e?.subscriptionData?e:i?.hypothesis;if(!s?.subscriptionData)return;const r=e?.subscriptionData?t.testId:i.testId;a.subscriptionPriceDone=!0;const n=s.subscriptionData,o=s.isControl,l=s.priceData,c=n.widget.widgetType;let d=W(l),p=K(n,d),h=p.discountMap,u=p.maxDiscount;function b(){const g=W(l);g!==d&&(d=g,p=K(n,d),h=p.discountMap,u=p.maxDiscount,a.log(`[SUB-PRICE] scope refreshed side=${o?"A":"B"}, currentProductId=${d??"n/a"}, maxDiscount=${u}`))}a.log(`[SUB-PRICE] side=${o?"A":"B"}, currentProductId=${d??"n/a"}, maxDiscount=${u}`),a.updatePriceTestHiddenInputs(r,o?"control":"variant",!1);function k(){if(!l)return null;const g=j(l),I=Y(g),A=lt(n,I,d);if(!ct(A,o))return null;const E=I?g.get(I):void 0;return E?{formattedVariantPrice:G(E.priceInCents,l),formattedDiscounted:G(E.priceInCents*(1-u/100),l)}:null}$t({originalFetch:a.fetch,swapMap:a.swapMap??{},slptValue:a.slptValue??void 0,log:a.log,getSelectedPlanId:()=>{const g=B(n);if(!g)return null;const I=J(n,g);if(!I)return null;const A=D(n,"subscriptionInput"),E=A.length?A[0].selector:'input[name="rc_plan"]';return I.querySelector(`${E}:checked`)?.value??null}});function S(g){const I=D(n,"subscriptionDiscount");for(const A of I)if(A.selector.includes("badge")||A.selector.includes("__badge")){const E=g.querySelector(A.selector);E?.textContent&&!E.textContent.includes(`${u}%`)&&$(E,x=>U(x,u))}}function P(g){const I=k();if(!I)return;const A=D(n,"subscriptionCompareAt");for(const E of A){const x=g.querySelector(E.selector)||g.querySelector(`[part~="${E.selector}"]`);x?.textContent&&!x.textContent.includes(I.formattedVariantPrice)&&$(x,R=>/\d/.test(R)?I.formattedVariantPrice:R)}}function _(g,I){const A=D(n,"subscriptionCompareAt"),E=I===0?"none":"";for(const x of A){const R=g.querySelector(x.selector)||g.querySelector(`[part~="${x.selector}"]`);R&&(E==="none"?R.style.display!=="none"&&(R.style.display="none"):R.style.display==="none"&&(R.style.display=""))}}function C(g){const I=D(n,"subscriptionInput"),A=I.length?I[0].selector:'input[name="rc_plan"]',E=D(n,"subscriptionPlanDiscount"),x=E.length?E[0].selector:".rc-plans-button__discount";for(const R of Array.from(g.querySelectorAll("label"))){const V=R.querySelector(A),O=R.querySelector(x);if(V&&O){const L=h[V.value];if(L!==void 0){if(L===0)O.style.display!=="none"&&(O.style.display="none");else if(O.style.display==="none"&&(O.style.display=""),O.textContent){const Z=O.textContent.match(/[\d.]+%/)?.[0];Z&&Z!==`${L}%`&&$(O,Kt=>U(Kt,L))}}}}}function m(g){const I=g.querySelector("select");if(I)for(const A of Array.from(I.options)){const E=h[A.value];if(E!==void 0&&A.textContent){const x=A.textContent.match(/[\d.]+%/)?.[0];x&&x!==`${E}%`&&(A.textContent=U(A.textContent,E))}}}function y(g,I){const E=D(n,"subscriptionDiscount").filter(x=>x.selector.includes("benefit")||x.selector==="rc-benefits");for(const x of E){const R=g.querySelector(x.selector);if(R?.shadowRoot){for(const V of Array.from(R.shadowRoot.querySelectorAll("li")))if(V.textContent?.includes("Save")){const O=V;if(I===0)O.style.display!=="none"&&(O.style.display="none");else{O.style.display==="none"&&(O.style.display="");const L=V.textContent.match(/[\d.]+%/)?.[0];L&&L!==`${I}%`&&$(V,Z=>U(Z,I))}}}}}let w=!1;function T(){if(!w){w=!0;try{if(b(),d!==null&&Object.keys(h).length===0)return;const g=B(n);if(!g)return;S(g),l&&P(g);const I=J(n,g);let A=u;if(I){const E=D(n,"subscriptionInput"),x=E.length?E[0].selector:'input[name="rc_plan"]',R=I.querySelector(`${x}:checked`);if(R){const V=h[R.value];V!==void 0&&(A=V)}c==="buttons"||c==="radio"?C(I):m(I)}_(g,A),y(g,A)}finally{w=!1}}}function f(){const g=k();if(!g)return;const I=B(n);if(!I)return;const A=D(n,"onetimeToggle"),E=A.length?A[0].selector:'input[value="onetime"]';if(!I.querySelector(E)?.checked)return;const R=D(n,"subscriptionPrice");for(const V of R){const O=I.querySelector(V.selector)||I.querySelector(`[part~="${V.selector}"]`);O?.textContent&&!O.textContent.includes(g.formattedDiscounted)&&$(O,L=>/\d/.test(L)?g.formattedDiscounted:L)}}function v(){a.subscriptionHideWrongPlans&&a.subscriptionHideWrongPlans(),T(),a.subscriptionUpdateOneTime&&a.subscriptionUpdateOneTime(),f()}dt({data:n,runUpdates:v})}async function Ht(a){if(a.subscriptionOneTimeDone)return;const t=a.getActiveAssignment(),e=t?a.getHypothesis(t.hypothesisId):void 0,i=!!(e?.subscriptionData&&e.priceData),s=i?null:a.findActiveSubscriptionTestControl(),r=i?e:s?.hypothesis;if(!r?.subscriptionData||!r.priceData)return;const n=i?t.testId:s.testId;a.subscriptionOneTimeDone=!0;const o=r.subscriptionData,l=r.priceData,c=j(l),d=r.isControl,p=d?"control":"variant";a.slptValue=`${n}:${p}:f`,a.updatePriceTestHiddenInputs(n,p,!1);function h(){const u=B(o);if(!u)return;const b=Y(c);if(!b)return;const k=W(l),S=lt(o,b,k);if(!ct(S,d))return;const P=c.get(b);if(!P)return;const _=H(P.priceInCents,l.moneyFormat,l.currency,l.currencyCodeEnabled),C=D(o,"onetimePrice");if(!C.length)return;const m=D(o,"onetimeContainer"),y=m.length?m[0].selector:'[part~="rc-purchase-option__onetime"]',T=u.querySelector(y)??u;for(const f of C){let v=null;try{v=T.querySelector(f.selector)}catch{v=null}v??=T.querySelector(`[part~="${f.selector}"]`),v&&v.textContent&&!v.textContent.includes(_)&&$(v,g=>/\d/.test(g)?_:g)}}a.subscriptionUpdateOneTime=h,h()}async function Ut(a,t){const{subscriptionPreviewRender:e}=await Vt(async()=>{const{subscriptionPreviewRender:i}=await Promise.resolve().then(()=>jt);return{subscriptionPreviewRender:i}},void 0);return e(a.subscriptionData,a.priceData,a.isControl,t)}function Nt(a,t){const e=a.widget.selectors.widgetParent??[],i=a.widget.selectors.subscriptionPlans??[],s=a.widget.selectors.subscriptionInput??[];if(!e.length||!i.length||!s.length){t("[SUB-GLOBAL-HIDE] Missing required selectors — skipping");return}const r=e[0].selector,n=i[0].selector,o=s[0].selector;let l=!1,c=null,d=!1;function p(){if(!d){d=!0;try{h()}finally{d=!1}}}function h(){const P=document.querySelector(r);if(!P?.shadowRoot)return;const _=P.shadowRoot.querySelector(n);if(!_?.shadowRoot)return;_.shadowRoot!==c&&(c=_.shadowRoot,l=!1);let C=0;if(a.widget.widgetType==="buttons"||a.widget.widgetType==="radio"){const m=Array.from(_.shadowRoot.querySelectorAll(o));for(const f of m)if(a.planIds.includes(f.value)){f.disabled||(f.disabled=!0);const v=f.closest("label");v&&v.style.display!=="none"&&(v.style.display="none",C++)}const y=m.filter(f=>!a.planIds.includes(f.value));if(!y.some(f=>f.checked)&&!l&&y.length>0){l=!0;const f=y[0];f.closest("label")?.click(),f.dispatchEvent(new Event("change",{bubbles:!0})),t(`[SUB-GLOBAL-HIDE] Preselected first visible plan input=${f.value}`)}const T=y.find(f=>f.checked)??y[0];if(T){const f=Array.from(document.querySelectorAll('input[name="selling_plan"]'));for(const v of f)v.value!==T.value&&(v.value=T.value,t(`[SUB-GLOBAL-HIDE] Mirrored plan id ${T.value} to form selling_plan input`))}}else if(a.widget.widgetType==="dropdown"){const m=_.shadowRoot.querySelector("select");if(!m)return;for(const T of Array.from(m.options))a.planIds.includes(T.value)&&(T.style.display!=="none"&&(T.style.display="none"),T.disabled||(T.disabled=!0),C++);const y=Array.from(m.options).filter(T=>!a.planIds.includes(T.value)),w=y.some(T=>T.value===m.value);y.length>0&&!w&&!l&&(l=!0,m.value=y[0].value,m.dispatchEvent(new Event("change",{bubbles:!0})),t(`[SUB-GLOBAL-HIDE] Preselected first visible option=${y[0].value}`))}C>0&&t(`[SUB-GLOBAL-HIDE] Hidden ${C} B-side plan buttons`)}const u={childList:!0,subtree:!0,characterData:!0};let b=null;function k(P){b?.disconnect(),b=new MutationObserver(()=>p()),b.observe(P,u)}function S(){const P=document.querySelector(r);if(!P?.shadowRoot)return!1;p(),new MutationObserver(()=>{p();const m=P.shadowRoot.querySelector(n);m?.shadowRoot&&k(m.shadowRoot)}).observe(P.shadowRoot,u);const C=P.shadowRoot.querySelector(n);return C?.shadowRoot&&k(C.shadowRoot),!0}if(!S()){t("[SUB-GLOBAL-HIDE] Widget not in DOM yet — waiting via MutationObserver");const P=new MutationObserver(()=>{S()&&P.disconnect()});P.observe(document.body??document.documentElement,{childList:!0,subtree:!0})}}const ut="Limited preview",Ft="Add-to-cart and checkout prices won't reflect this test until it launches — test selling plans are not created in your subscription app until after a test is launched.",Bt=5e3;function zt(){const a=document.createElement("div");a.id="shoplift-preview-subscription-warning";const t=document.createElement("span");t.id="shoplift-preview-subscription-warning__icon",t.setAttribute("aria-hidden","true"),t.textContent="!";const e=document.createElement("span");e.id="shoplift-preview-subscription-warning__label",e.textContent=ut;const i=document.createElement("div");i.id="shoplift-preview-subscription-warning__tooltip",i.setAttribute("role","tooltip"),i.textContent=Ft,a.appendChild(t),a.appendChild(e),a.appendChild(i),a.setAttribute("tabindex","0"),a.setAttribute("aria-describedby",i.id),a.setAttribute("aria-label",ut);let s=null;function r(){s!==null&&(clearTimeout(s),s=null)}function n(){i.classList.add("shoplift-preview-subscription-warning__tooltip--visible")}function o(){i.classList.remove("shoplift-preview-subscription-warning__tooltip--visible")}function l(){n(),r(),s=setTimeout(()=>{o(),s=null},Bt)}function c(){r(),n()}function d(){s===null&&o()}a.addEventListener("mouseenter",c),a.addEventListener("mouseleave",d),a.addEventListener("focus",c),a.addEventListener("blur",d);function p(u){try{const b=u.target;if(!(b instanceof Element))return;(b.closest('form[action*="/cart/add"] button[type="submit"], form[action*="/cart/add"] input[type="submit"]')!==null||b.closest('[name="add"], button[name="add"], [data-add-to-cart], button[data-add-to-cart]')!==null)&&l()}catch{}}document.addEventListener("click",p,!0);function h(){r(),document.removeEventListener("click",p,!0),a.removeEventListener("mouseenter",c),a.removeEventListener("mouseleave",d),a.removeEventListener("focus",c),a.removeEventListener("blur",d),a.remove()}return{root:a,tooltip:i,cleanup:h}}let pt=!1;class Wt{constructor(t,e,i,s,r,n,o,l,c,d,p,h,u){this.shop=t,this.host=e,this.eventHost=i,this.disableReferrerOverride=l,this.logHistory=[],this.legacySessionKey=`SHOPLIFT_SESSION_${this.shop}`,this.cssHideClass=s?"shoplift-hide":"",this.testConfigs=p.map(k=>({...k,startAt:new Date(k.startAt),statusHistory:k.statusHistory.map(S=>({...S,createdAt:new Date(S.createdAt)}))})),this.inactiveTestConfigs=h,this.hiddenSubscriptionPlans=u,this.sendPageView=!!r,this.shopliftDebug=n===!0,this.telemetryEnabled=c===!0,this.gaConfig=o!=={"sendEvents":false,"mode":"gtag"}?o:{sendEvents:!1},this.fetch=window.fetch.bind(window),this.localStorageSet=window.localStorage.setItem.bind(window.localStorage),this.localStorageGet=window.localStorage.getItem.bind(window.localStorage);const b=this.getDeviceType();this.device=b!=="tablet"?b:"mobile",this.state=this.loadState(),this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.testsFilteredByAudience=p.filter(k=>k.status=="active"),this.getCountryTimeout=d===1000?1e3:d,this.log("State Loaded",JSON.stringify(this.state))}DATA_SL_ATTRIBUTE_P="data-sl-attribute-p";DATA_SL_TEST_ID="data-sl-test-id";VIEWPORT_TRACK_THRESHOLD=.5;temporarySessionKey="Shoplift_Session";essentialSessionKey="Shoplift_Essential";analyticsSessionKey="Shoplift_Analytics";priceSelectorsSessionKey="Shoplift_PriceSelectors_v2";legacySessionKey;cssHideClass;testConfigs;inactiveTestConfigs;hiddenSubscriptionPlans;testsFilteredByAudience;sendPageView;shopliftDebug;gaConfig;telemetryEnabled;getCountryTimeout;state;subscriptionPreviewWarningCleanup=null;shopifyAnalyticsId;cookie=document.cookie;isSyncing=!1;isSyncingGA=!1;fetch;localStorageSet;localStorageGet;sessionStorageSet=window.sessionStorage.setItem.bind(window.sessionStorage);sessionStorageGet=window.sessionStorage.getItem.bind(window.sessionStorage);urlParams=new URLSearchParams(window.location.search);device;logHistory;activeViewportObservers=new Map;clientIdRetryCount=0;deriveCategoryFromExistingTests(){if(!this.state.temporary.testCategory&&this.state.essential.visitorTests.length>0){const t=this.state.essential.visitorTests.some(e=>{if(!e.hypothesisId)return!1;const i=this.getHypothesis(e.hypothesisId);return i&&["theme","basicScript","price"].includes(i.type)});this.state.temporary.testCategory=t?"global":"conditional",this.persistTemporaryState(),this.log("Derived test category from existing visitorTests: %s",this.state.temporary.testCategory)}}async init(){try{if(this.log("Shoplift script initializing"),window.Shopify&&window.Shopify.designMode){this.log("Skipping script for design mode");return}if(window.location.href.includes("slScreenshot=true")){this.log("Skipping script for screenshot");return}if(window.location.hostname.endsWith(".edgemesh.com")){this.log("Skipping script for preview");return}if(window.location.href.includes("isShopliftMerchant")){const s=this.urlParams.get("isShopliftMerchant")==="true";this.log("Setting merchant session to %s",s),this.state.temporary.isMerchant=s,this.persistTemporaryState()}if(this.state.temporary.isMerchant){this.log("Setting up preview for merchant"),typeof window.shoplift!="object"&&this.setShopliftStub(),this.state.temporary.previewConfig||this.hidePage(),await this.initPreview(),document.querySelector("#sl-preview-bar-hide")?.remove();return}if(this.state.temporary.previewConfig=void 0,mt(navigator.userAgent))return;const t=this.state.essential.visitorTests.filter(s=>s.hypothesisId&&+s.createdAt>Date.now()-6e4);if(t.length===0)this.sendDiagnosticTelemetry("page-landed",null);else for(const s of t)this.sendDiagnosticTelemetry("page-landed",s.testId,{hypothesisId:s.hypothesisId,isControl:s.assignedTo==="control",testType:s.testType??"unknown"});if(navigator.userAgent.includes("Chrome/118")){this.log("Random: %o",[Math.random(),Math.random(),Math.random()]);const s=await this.makeRequest({url:`${this.eventHost}/api/v0/events/ip`,method:"get"}).then(r=>r?.json());this.log(`IP: ${s}`),this.makeRequest({url:`${this.eventHost}/api/v0/logs`,method:"post",data:JSON.stringify(this.debugState(),X)}).catch()}if(this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.monitorConsentChange(),this.checkForThemePreview())return;if(!this.disableReferrerOverride&&this.state.temporary.originalReferrer!=null){this.log(`Overriding referrer from '${document.referrer}' to '${this.state.temporary.originalReferrer}'`);const s=this.state.temporary.originalReferrer;delete this.state.temporary.originalReferrer,this.persistTemporaryState(),Object.defineProperty(document,"referrer",{get:()=>s,enumerable:!0,configurable:!0})}if(await this.refreshVisitor(this.shopifyAnalyticsId),await this.handleVisitorTest()){this.log("Redirecting for visitor test");return}this.setShoplift(),this.showPage(),this.ensureCartAttributesForExistingPriceTests(!1);const i=this.state.essential.visitorTests.some(s=>(s.hypothesisId?this.getHypothesis(s.hypothesisId):void 0)?.subscriptionData!=null)||Object.values(this.state.temporary.testReservations??{}).some(s=>this.getHypothesis(s.hypothesisId)?.subscriptionData!=null);this.hiddenSubscriptionPlans&&!i&&(this.log(`[SUB-GLOBAL] Visitor not in subscription test — hiding ${this.hiddenSubscriptionPlans.planIds.length} B-side plans`),Nt(this.hiddenSubscriptionPlans,s=>this.log(s))),await this.subscriptionSwap(),await this.subscriptionOneTimePrice(),await this.subscriptionPriceChange(),await this.finalize(),console.log("SHOPLIFT SCRIPT INITIALIZED!")}catch(t){if(t instanceof et)return;throw t}finally{typeof window.shoplift!="object"&&this.setShopliftStub()}}getVariantColor(t){switch(t){case"a":return{text:"#141414",bg:"#E2E2E2"};case"b":return{text:"rgba(255, 255, 255, 1)",bg:"rgba(37, 99, 235, 1)"}}}getDefaultVariantTitle(t){return t.title?t.title:t.type==="price"?t.isControl?"Original prices":"Variant prices":t.isControl?"Original":"Untitled variant "+t.label.toUpperCase()}async initPreview(){const t=this.urlParams.get("previewConfig");if(t){this.state.temporary.previewConfig=void 0,this.log("Setting up the preview"),this.log("Found preview config, writing to temporary state");const e=await Rt(t);if(this.state.temporary.previewConfig=e,this.state.temporary.previewConfig.testTypeCategory===M.Price){this.hidePage(!0);const s=this.state.temporary.previewConfig;let r=`${this.host}/api/dom-selectors/${s.storeId}/${s.testId}/${s.isDraft||!1}`;s.shopifyProductId&&(r+=`?productId=${s.shopifyProductId}`);const n=await this.makeJsonRequest({method:"get",url:r}).catch(o=>(this.log("Error getting domSelectors",o),null));if(s.variants.forEach(o=>o.domSelectors=n[o.id]?.domSelectors),s.isDraft){const o=`${this.host}/api/dom-selectors/${s.storeId}/${s.testId}/subscription-preview`,l=await this.makeJsonRequest({method:"get",url:o}).catch(c=>(this.log("No subscription preview data for draft (test may not have a subscription widget)",c),null));l?.subscriptionData&&s.variants.forEach(c=>{c.subscriptionData=l.subscriptionData,c.priceData=l.priceData})}}this.persistTemporaryState();const i=new URL(window.location.toString());i.searchParams.delete("previewConfig"),this.queueRedirect(i)}else if(this.state.temporary.previewConfig){this.showPage();const e=this.state.temporary.previewConfig;if(e.testTypeCategory===M.Template&&this.handleTemplatePreview(e)&&this.initPreviewControls(e),e.testTypeCategory===M.UrlRedirect&&this.handleUrlPreview(e)&&this.initPreviewControls(e),e.testTypeCategory===M.Script&&this.handleScriptPreview(e)&&this.initPreviewControls(e),e.testTypeCategory===M.Price){const i=await this.handlePricePreview(e);e.isDraft?await this.handleSubscriptionPricePreview(e):await this.handleSubscriptionLivePreview(e),i&&this.initPreviewControls(e)}}}initPreviewControls(t){document.addEventListener("DOMContentLoaded",()=>{const e=t.variants.find(b=>b.id===t.currentVariant),i=e?.label||"a",s=t.variants,r=document.createElement("div");r.id="shoplift-preview-control";const n=document.createElement("div"),o=document.createElement("img");o.src=_t,o.height=24,o.width=14,n.style.padding="0 16px",n.style.lineHeight="100%",n.appendChild(o),r.appendChild(n);const l=document.createElement("div");l.id="shoplift-preview-variant-selector";const c=document.createElement("button");c.id="shoplift-preview-variant-menu-trigger";const d=document.createElement("div");d.className="menu-variant-label",d.style.backgroundColor=this.getVariantColor(i).bg,d.style.color=this.getVariantColor(i).text,d.innerText=i.toUpperCase(),c.appendChild(d);const p=document.createElement("span");if(p.id="shoplift-preview-variant-title",p.innerText=e?this.getDefaultVariantTitle(e):"Untitled variant "+i.toUpperCase(),c.appendChild(p),s.length>1){const b=document.createElement("img");b.src=xt,b.width=12,b.height=12,b.style.height="12px",b.style.width="12px",c.appendChild(b);const k=document.createElement("div");k.className="preview-variant-menu";for(const S of t.variants.filter(P=>P.id!==t.currentVariant)){const P=document.createElement("div");P.className="preview-variant-menu--item";const _=document.createElement("div");_.className="menu-variant-label",_.style.backgroundColor=this.getVariantColor(S.label).bg,_.style.color=this.getVariantColor(S.label).text,_.style.flexShrink="0",_.innerText=S.label.toUpperCase(),P.appendChild(_);const C=document.createElement("span");C.innerText=this.getDefaultVariantTitle(S),P.appendChild(C),P.addEventListener("click",()=>{this.pickVariant(S.id)}),k.appendChild(P)}l.appendChild(k),c.addEventListener("click",()=>{k.className!=="preview-variant-menu preview-variant-menu__visible"?k.classList.add("preview-variant-menu__visible"):k.classList.remove("preview-variant-menu__visible")}),document.addEventListener("click",S=>{S.target instanceof Element&&!c.contains(S.target)&&k.className==="preview-variant-menu preview-variant-menu__visible"&&k.classList.remove("preview-variant-menu__visible")})}else c.style.pointerEvents="none",d.style.margin="0";if(l.appendChild(c),r.appendChild(l),t.hasSubscription){this.subscriptionPreviewWarningCleanup?.();const b=zt();r.appendChild(b.root),this.subscriptionPreviewWarningCleanup=b.cleanup}const h=document.createElement("div"),u=document.createElement("button");u.id="shoplift-exit-preview-button",u.innerText="Exit",h.appendChild(u),u.addEventListener("click",()=>{this.exitPreview()}),r.appendChild(h),document.body.appendChild(r),requestAnimationFrame(()=>{r.classList.add("visible")})}),this.ensureCartAttributesForExistingPriceTests(!0)}pickVariant(t){if(this.state.temporary.previewConfig){const e=this.state.temporary.previewConfig,i=new URL(window.location.toString());if(e.testTypeCategory===M.UrlRedirect){const s=e.variants.find(r=>r.id===e.currentVariant)?.redirectUrl;if(i.pathname===s){const r=e.variants.find(n=>n.id===t)?.redirectUrl;r&&(i.pathname=r)}}if(e.testTypeCategory===M.Template){const s=e.variants.find(r=>r.id===e.currentVariant)?.pathName;if(s&&i.pathname===s){const r=e.variants.find(n=>n.id===t)?.pathName;r&&r!==s&&(i.pathname=r)}}e.currentVariant=t,this.persistTemporaryState(),this.queueRedirect(i)}}exitPreview(){const t=new URL(window.location.toString());if(this.state.temporary.previewConfig?.testTypeCategory===M.Template&&t.searchParams.delete("view"),this.state.temporary.previewConfig?.testTypeCategory===M.Script&&t.searchParams.delete("slVariant"),this.state.temporary.previewConfig?.testTypeCategory===M.UrlRedirect){const i=this.state.temporary.previewConfig.variants.filter(r=>!r.isControl&&r.redirectUrl!==null).map(r=>r.redirectUrl),s=this.state.temporary.previewConfig.variants.find(r=>r.label==="a")?.redirectUrl;i.includes(t.pathname)&&s&&(t.pathname=s)}this.state.temporary.isMerchant=!1,t.searchParams.delete("isShopliftMerchant"),this.state.temporary.previewConfig=void 0,this.persistTemporaryState(),this.subscriptionPreviewWarningCleanup?.(),this.subscriptionPreviewWarningCleanup=null,this.hidePage(),this.queueRedirect(t)}handleTemplatePreview(t){const e=t.currentVariant,i=t.variants.find(l=>l.id===e);if(!i)return!1;const s=t.variants.find(l=>l.isControl);if(!s)return!1;this.log("Setting up template preview for type",s.type);const r=new URL(window.location.toString()),n=r.searchParams.get("view"),o=i.type===s.type;return!o&&!i.isControl&&template.suffix===s.affix&&this.typeFromTemplate()===s.type&&i.pathName!==null?(this.log("Hit control template type, redirecting to the variant url"),this.hidePage(),r.pathname=i.pathName,this.queueRedirect(r),!0):(!i.isControl&&this.typeFromTemplate()==i.type&&template.suffix===s.affix&&o&&n!==(i.affix||"__DEFAULT__")&&(this.log("Template type and affix match control, updating the view param"),r.searchParams.delete("view"),this.log("Setting the new viewParam to",i.affix||"__DEFAULT__"),this.hidePage(),r.searchParams.set("view",i.affix||"__DEFAULT__"),this.queueRedirect(r)),n!==null&&n!==(i.affix||"__DEFAULT__")&&(r.searchParams.delete("view"),this.hidePage(),this.queueRedirect(r)),!0)}handleUrlPreview(t){const e=t.currentVariant,i=t.variants.find(n=>n.id===e),s=t.variants.find(n=>n.isControl)?.redirectUrl;if(!i)return!1;this.log("Setting up URL redirect preview");const r=new URL(window.location.toString());return r.pathname===s&&!i.isControl&&i.redirectUrl!==null&&(this.log("Url matches control, redirecting"),this.hidePage(),r.pathname=i.redirectUrl,this.queueRedirect(r)),!0}handleScriptPreview(t){const e=t.currentVariant,i=t.variants.find(n=>n.id===e);if(!i)return!1;this.log("Setting up script preview");const s=new URL(window.location.toString());return s.searchParams.get("slVariant")!==i.id&&(this.log("current id doesn't match the variant, redirecting"),s.searchParams.delete("slVariant"),this.log("Setting the new slVariantParam"),this.hidePage(),s.searchParams.set("slVariant",i.id),this.queueRedirect(s)),!0}async handlePricePreview(t){const e=t.currentVariant,i=t.variants.find(s=>s.id===e);return i?(this.log("Setting up price preview"),i.domSelectors&&i.domSelectors.length>0&&(N(document,{testId:t.testId,hypothesisId:i.id,selectors:i.domSelectors}),this.ensureCartAttributesForExistingPriceTests(!0)),!0):!1}async handleSubscriptionPricePreview(t){const e=t.variants.find(i=>i.id===t.currentVariant);e?.subscriptionData&&(this.log("Setting up subscription price preview"),await Ut({id:e.id,isControl:e.isControl,subscriptionData:e.subscriptionData,priceData:e.priceData},(i,...s)=>this.log(i,...s)))}async handleSubscriptionLivePreview(t){this.testConfigs.find(s=>s.id===t.testId)?.hypotheses.find(s=>s.id===t.currentVariant)?.subscriptionData&&(this.log("Setting up subscription live preview"),this.subscriptionSwapDone=!1,this.subscriptionOneTimeDone=!1,this.subscriptionPriceDone=!1,await this.subscriptionSwap(),await this.subscriptionOneTimePrice(),await this.subscriptionPriceChange())}async finalize(){const t=await this.getCartState();t!==null&&this.queueCartUpdate(t),this.pruneStateAndSave(),await this.syncAllEvents()}setShoplift(){this.log("Setting up public API");const e=this.urlParams.get("slVariant")==="true",i=e?null:this.urlParams.get("slVariant");window.shoplift={isHypothesisActive:async s=>{if(this.log("Script checking variant for hypothesis '%s'",s),e)return this.log("Forcing variant for hypothesis '%s'",s),!0;if(i!==null)return this.log("Forcing hypothesis '%s'",i),s===i;const r=this.testConfigs.find(o=>o.hypotheses.some(l=>l.id===s));if(!r)return this.log("No test found for hypothesis '%s'",s),!1;const n=this.state.essential.visitorTests.find(o=>o.testId===r.id);return n?(this.log("Active visitor test found",s),n.hypothesisId===s):(await this.manuallySplitVisitor(r),this.testConfigs.some(o=>o.hypotheses.some(l=>l.id===s&&this.state.essential.visitorTests.some(c=>c.hypothesisId===l.id))))},setAnalyticsConsent:async s=>{await this.onConsentChange(s,!0)},getVisitorData:()=>({visitor:this.state.analytics.visitor,visitorTests:this.state.essential.visitorTests.filter(s=>!s.isInvalid).map(s=>{const{shouldSendToGa:r,savedAt:n,...o}=s;return o})})}}setShopliftStub(){this.log("Setting up stubbed public API");const e=this.urlParams.get("slVariant")==="true",i=e?null:this.urlParams.get("slVariant");window.shoplift={isHypothesisActive:s=>Promise.resolve(e||s===i),setAnalyticsConsent:()=>Promise.resolve(),getVisitorData:()=>({visitor:null,visitorTests:[]})}}async manuallySplitVisitor(t){this.log("Starting manual split for test '%s'",t.id),await this.handleVisitorTest([t]);const e=this.getReservationForTest(t.id);e&&!e.isRealized&&e.entryCriteriaKey&&(this.log("Realizing manual API reservation for test '%s'",t.id),this.realizeReservationForCriteria(e.entryCriteriaKey)),this.saveState(),this.syncAllEvents()}async handleVisitorTest(t){await this.filterTestsByAudience(this.testConfigs,this.state.analytics.visitor??this.buildBaseVisitor(),this.state.essential.visitorTests),this.pruneStaleVisitorTests(),this.deriveCategoryFromExistingTests(),this.clearStaleReservations();let e=t?t.filter(i=>this.testsFilteredByAudience.some(s=>s.id===i.id)):[...this.testsForUrl(this.testsFilteredByAudience),...this.domTestsForUrl(this.testsFilteredByAudience)];try{if(e.length===0)return this.log("No tests found"),!1;this.log("Checking for existing visitor test on page");const i=this.getCurrentVisitorHypothesis(e);if(i){this.log("Found current visitor test");const l=this.considerRedirect(i);return l&&(this.log("Redirecting for current visitor test"),this.redirect(i)),l}const s=this.getReservationForCurrentPage();if(s){this.log("Found matching reservation for current page: %s",s.testId);const l=this.getHypothesis(s.hypothesisId);if(l){l.type!=="price"&&this.realizeReservationForCriteria(s.entryCriteriaKey);const c=this.considerRedirect(l);return c&&this.redirect(l),c}}this.log("No active test relation for test page");const r=this.testsForUrl(this.inactiveTestConfigs.filter(l=>this.testIsPaused(l)&&l.hypotheses.some(c=>this.state.essential.visitorTests.some(d=>d.hypothesisId===c.id)))).map(l=>l.id);if(r.length>0)return this.log("Visitor has paused tests for test page, skipping test assignment: %o",r),!1;if(!this.state.temporary.testCategory){const l=this.testsFilteredByAudience.filter(d=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(d))),c=this.testsFilteredByAudience.filter(d=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(d)));if(this.log("Category dice roll - global tests: %o, conditional tests: %o",l.map(d=>({id:d.id,title:d.title,criteria:this.getEntryCriteriaKey(d)})),c.map(d=>({id:d.id,title:d.title,criteria:this.getEntryCriteriaKey(d)}))),l.length>0&&c.length>0){const d=l.length,p=c.length,h=d+p,u=Math.random()*h;this.state.temporary.testCategory=u<d?"global":"conditional",this.log("Category dice roll: rolled %.2f of %d (global weight: %d, conditional weight: %d), selected '%s'",u,h,d,p,this.state.temporary.testCategory)}else l.length>0?(this.state.temporary.testCategory="global",this.log("Only global tests available, setting category to global")):(this.state.temporary.testCategory="conditional",this.log("Only conditional tests available, setting category to conditional"));this.persistTemporaryState()}const n=this.state.temporary.testCategory;if(this.log("Visitor test category: %s",n),n==="global"){const l=this.testsFilteredByAudience.filter(c=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)));for(const c of l)this.markTestAsBlocked(c,"category:global");e=e.filter(c=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)))}else{const l=this.testsFilteredByAudience.filter(c=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)));for(const c of l)this.markTestAsBlocked(c,"category:conditional");e=e.filter(c=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)))}if(e.length===0)return this.log("No tests remaining after category filter"),!1;this.createReservations(e);const o=this.getReservationForCurrentPage();if(o&&!o.isRealized){const l=this.getHypothesis(o.hypothesisId);if(l){l.type!=="price"&&this.realizeReservationForCriteria(o.entryCriteriaKey);const c=this.considerRedirect(l);return c&&(this.log("Redirecting for new test"),this.redirect(l)),c}}return!1}finally{this.includeInDomTests(),this.saveState()}}includeInDomTests(){this.applyControlForAudienceFilteredPriceTests();const t=this.getDomTestsForCurrentUrl(),e=this.getVisitorDomHypothesis(t);for(const i of t){this.log("Evaluating dom test '%s'",i.id);const s=i.hypotheses.some(u=>u.type==="price");if(this.state.essential.visitorTests.find(u=>u.testId===i.id&&u.isInvalid&&!u.hypothesisId)){if(this.log("Visitor is blocked from test '%s', applying control prices if price test",i.id),s){const u=i.hypotheses.find(b=>b.isControl);u?.priceData&&(this.applyPriceTestWithMapLookup(i.id,u,[u],()=>{this.log("Control prices applied for blocked visitor, no metrics tracked")}),this.updatePriceTestHiddenInputs(i.id,"control",!1))}continue}const n=this.getReservationForTest(i.id);let o=null,l=!1;const c=e.find(u=>i.hypotheses.some(b=>u.id===b.id));if(n)o=this.getHypothesis(n.hypothesisId)??null,this.log("Using reserved hypothesis '%s' for test '%s'",n.hypothesisId,i.id);else if(c)o=c,this.log("Using existing hypothesis assignment for test '%s'",i.id);else if(s){const u=this.visitorActiveTestTypeWithReservations();u?(l=!0,this.log("Visitor already in test type '%s', treating as non-test for price test '%s'",u,i.id)):o=this.pickHypothesis(i)}else o=this.pickHypothesis(i);if(l&&s){const u=i.hypotheses.find(b=>b.isControl);u?.priceData&&(this.log("Applying control prices for non-test visitor on price test '%s' (Map-based)",i.id),this.applyPriceTestWithMapLookup(i.id,u,[u],()=>{this.log("Control prices applied for non-test visitor, no metrics tracked")}),this.updatePriceTestHiddenInputs(i.id,"control",!1));continue}if(!o){this.log("Failed to pick hypothesis for test");continue}this.sendDiagnosticTelemetry("assignment",i.id,{hypothesisId:o.id,isControl:o.isControl,testType:o.type});const d=i.bayesianRevision??4,p=o.type==="price",h=d>=5;if(p&&h){if(this.log(`Price test with Map-based lookup (v${d}): ${i.id}`),!o.priceData){this.log("No price data for hypothesis '%s', skipping",o.id);continue}const u=o.isControl?"control":"variant";this.log(`Setting up Map-based price test for ${u} (test: ${i.id})`),this.applyPriceTestWithMapLookup(i.id,o,i.hypotheses,b=>{const k=this.getReservationForTest(b);k&&!k.isRealized&&k.entryCriteriaKey?this.realizeReservationForCriteria(k.entryCriteriaKey):this.queueAddVisitorToTest(b,o),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()});continue}if(p&&!h){this.log(`Price test without viewport tracking (v${d}): ${i.id}`);const u=this.getDomSelectorsForHypothesis(o);if(u.length===0)continue;N(document,{testId:i.id,hypothesisId:o.id,selectors:u},b=>{this.queueAddVisitorToTest(b,o),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()});continue}if(!o.domSelectors||o.domSelectors.length===0){this.log("No selectors found, skipping hypothesis");continue}N(document,{testId:i.id,hypothesisId:o.id,selectors:o.domSelectors},u=>{this.queueAddVisitorToTest(u,o),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()})}}considerRedirect(t){if(this.log("Considering redirect for hypothesis '%s'",t.id),t.isControl)return this.log("Skipping redirect for control"),!1;if(t.type==="basicScript"||t.type==="manualScript")return this.log("Skipping redirect for script test"),!1;const e=this.state.essential.visitorTests.find(n=>n.hypothesisId===t.id),i=new URL(window.location.toString()),r=new URLSearchParams(window.location.search).get("view");if(t.type==="theme"){if(!(t.themeId===themeId)){if(this.log("Theme id '%s' is not hypothesis theme ID '%s'",t.themeId,themeId),this.isAppProxyPath())return this.log("On App Proxy path, skipping theme redirect to avoid infinite loop"),!1;if(e&&e.themeId!==t.themeId&&(e.themeId===themeId||!this.isThemePreview()))this.log("On old theme, redirecting and updating local visitor"),e.themeId=t.themeId;else if(this.isThemePreview())return this.log("On non-test theme, skipping redirect"),!1;return this.log("Hiding page to redirect for theme test"),this.hidePage(),!0}return!1}else if(t.type!=="dom"&&t.type!=="price"&&t.affix!==template.suffix&&t.affix!==r||t.redirectPath&&!i.pathname.endsWith(t.redirectPath))return this.log("Hiding page to redirect for template test"),this.hidePage(),!0;return this.log("Not redirecting"),!1}redirect(t){if(this.log("Redirecting to hypothesis '%s'",t.id),t.isControl)return;const e=new URL(window.location.toString());if(e.searchParams.delete("view"),t.redirectPath){const s=RegExp("^(/w{2}-w{2})/").exec(e.pathname);if(s&&s.length>1){const r=s[1];e.pathname=`${r}${t.redirectPath}`}else e.pathname=t.redirectPath}else t.type==="theme"?(e.searchParams.set("_ab","0"),e.searchParams.set("_fd","0"),e.searchParams.set("_sc","1"),e.searchParams.set("preview_theme_id",t.themeId.toString())):t.type!=="urlRedirect"&&e.searchParams.set("view",t.affix);const i=this.state.essential.visitorTests.find(s=>s.hypothesisId===t.id)?.testId;if(i){const s=new Date(Date.now()+5e3).toUTCString();document.cookie=`shoplift_redirect=${i};domain=.${window.location.hostname};path=/;SameSite=Strict;expires=${s}`}this.queueRedirect(e)}async refreshVisitor(t){if(t===null||!this.state.essential.isFirstLoad||!this.testConfigs.some(i=>i.visitorOption!=="all"))return;this.log("Refreshing visitor"),this.hidePage();const e=await this.getVisitor(t);e&&e.id&&this.updateLocalVisitor(e)}buildBaseVisitor(){return{shopifyAnalyticsId:this.shopifyAnalyticsId,device:this.device,country:null,...this.state.essential.initialState}}getInitialState(){const t=this.getUTMValue("utm_source")??"",e=this.getUTMValue("utm_medium")??"",i=this.getUTMValue("utm_campaign")??"",s=this.getUTMValue("utm_content")??"",r=window.document.referrer,n=this.device;return{createdAt:new Date,utmSource:t,utmMedium:e,utmCampaign:i,utmContent:s,referrer:r,device:n}}checkForThemePreview(){return this.log("Checking for theme preview"),window.location.hostname.endsWith(".shopifypreview.com")?(this.log("on shopify preview domain"),this.clearThemeBar(!0,!1,this.state),document.querySelector("#sl-preview-bar-hide")?.remove(),!1):this.isThemePreview()?this.state.essential.visitorTests.some(t=>t.isThemeTest&&t.hypothesisId!=null&&this.getHypothesis(t.hypothesisId)&&t.themeId===themeId)?(this.log("On active theme test, removing theme bar"),this.clearThemeBar(!1,!0,this.state),!1):this.state.essential.visitorTests.some(t=>t.isThemeTest&&t.hypothesisId!=null&&!this.getHypothesis(t.hypothesisId)&&t.themeId===themeId)?(this.log("Visitor is on an inactive theme test, redirecting to main theme"),this.redirectToMainTheme(),!0):this.state.essential.isFirstLoad?(this.log("No visitor found on theme preview, redirecting to main theme"),this.redirectToMainTheme(),!0):this.inactiveTestConfigs.some(t=>t.hypotheses.some(e=>e.themeId===themeId))?(this.log("Current theme is an inactive theme test, redirecting to main theme"),this.redirectToMainTheme(),!0):this.testConfigs.some(t=>t.hypotheses.some(e=>e.themeId===themeId))?(this.log("Falling back to clearing theme bar"),this.clearThemeBar(!1,!0,this.state),!1):(this.log("No tests on current theme, skipping script"),this.clearThemeBar(!0,!1,this.state),document.querySelector("#sl-preview-bar-hide")?.remove(),!0):(this.log("Not on theme preview"),this.clearThemeBar(!0,!1,this.state),!1)}redirectToMainTheme(){this.hidePage();const t=new URL(window.location.toString());t.searchParams.set("preview_theme_id",""),this.queueRedirect(t)}testsForUrl(t){const e=new URL(window.location.href),i=this.typeFromTemplate();return t.filter(s=>s.hypotheses.some(r=>r.type!=="dom"&&r.type!=="price"&&(r.isControl&&r.type===i&&r.affix===template.suffix||r.type==="theme"||r.isControl&&r.type==="urlRedirect"&&r.redirectPath&&e.pathname.endsWith(r.redirectPath)||r.type==="basicScript"))&&(s.ignoreTestViewParameterEnforcement||!e.searchParams.has("view")||s.hypotheses.map(r=>r.affix).includes(e.searchParams.get("view")??"")))}domTestsForUrl(t){const e=new URL(window.location.href);return t.filter(i=>i.hypotheses.some(s=>s.type!=="dom"&&s.type!=="price"?!1:s.type==="price"&&s.priceData&&s.priceData.variants.length>0?!0:s.domSelectors&&s.domSelectors.some(r=>new RegExp(it(r)).test(e.toString()))))}async filterTestsByAudience(t,e,i){const s=[];let r=e.country;!r&&t.some(n=>n.requiresCountry&&!i.some(o=>o.testId===n.id))&&(this.log("Hiding page to check geoip"),this.hidePage(),r=await this.makeJsonRequest({method:"get",url:`${this.eventHost}/api/v0/visitors/get-country`,signal:AbortSignal.timeout(this.getCountryTimeout)}).catch(n=>(this.log("Error getting country",n),null)));for(const n of t){if(this.log("Checking audience for test '%s'",n.id),this.state.essential.visitorTests.some(c=>c.testId===n.id&&c.hypothesisId==null)){console.log(`Skipping blocked test '${n.id}'`);continue}const o=this.visitorCreatedDuringTestActive(n.statusHistory);(i.some(c=>c.testId===n.id&&(n.device==="all"||n.device===e.device&&n.device===this.device))||this.isTargetAudience(n,e,o,r))&&(this.log("Visitor is in audience for test '%s'",n.id),s.push(n))}this.testsFilteredByAudience=s}isTargetAudience(t,e,i,s){const r=this.getChannel(e);return(t.device==="all"||t.device===e.device&&t.device===this.device)&&(t.visitorOption==="all"||t.visitorOption==="new"&&i||t.visitorOption==="returning"&&!i)&&(t.targetAudiences.length===0||t.targetAudiences.reduce((n,o)=>n||o.reduce((l,c)=>l&&c(e,i,r,s),!0),!1))}visitorCreatedDuringTestActive(t){let e="";for(const i of t){if(this.state.analytics.visitor!==null&&this.state.analytics.visitor.createdAt<i.createdAt||this.state.essential.initialState.createdAt<i.createdAt)break;e=i.status}return e==="active"}getDomTestsForCurrentUrl(){return this.domTestsForUrl(this.testsFilteredByAudience)}getCurrentVisitorHypothesis(t){return t.flatMap(e=>e.hypotheses).find(e=>e.type!=="dom"&&e.type!=="price"&&this.state.essential.visitorTests.some(i=>i.hypothesisId===e.id))}getVisitorDomHypothesis(t){return t.flatMap(e=>e.hypotheses).filter(e=>(e.type==="dom"||e.type==="price")&&this.state.essential.visitorTests.some(i=>i.hypothesisId===e.id))}getHypothesis(t){return this.testConfigs.filter(e=>e.hypotheses.some(i=>i.id===t)).map(e=>e.hypotheses.find(i=>i.id===t))[0]}getActiveAssignment(){if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const e=this.state.temporary.previewConfig;return e.currentVariant&&e.testId?{testId:e.testId,hypothesisId:e.currentVariant}:null}const t=this.state.essential.visitorTests.find(e=>e.hypothesisId);return t?.hypothesisId?{testId:t.testId,hypothesisId:t.hypothesisId}:null}findActiveSubscriptionTestControl(){for(const t of this.testConfigs){const e=t.hypotheses.find(i=>i.isControl);if(e?.subscriptionData)return{testId:t.id,hypothesis:e}}return null}getDomSelectorsForHypothesis(t){if(!t)return[];if(t.domSelectors&&t.domSelectors.length>0)return t.domSelectors;if(t.priceData){const e=`${this.priceSelectorsSessionKey}_${t.id}`;try{const s=sessionStorage.getItem(e);if(s){const r=JSON.parse(s);return t.domSelectors=r,this.log("Loaded %d price selectors from cache for hypothesis '%s'",r.length,t.id),r}}catch{}const i=Ot(t.priceData);t.domSelectors=i;try{sessionStorage.setItem(e,JSON.stringify(i)),this.log("Generated and cached %d price selectors for hypothesis '%s'",i.length,t.id)}catch{this.log("Generated %d price selectors for hypothesis '%s' (cache unavailable)",i.length,t.id)}return i}return[]}hasThemeTest(t){return t.some(e=>e.hypotheses.some(i=>i.type==="theme"))}hasTestThatIsNotThemeTest(t){return t.some(e=>e.hypotheses.some(i=>i.type!=="theme"&&i.type!=="dom"&&i.type!=="price"))}hasThemeAndOtherTestTypes(t){return this.hasThemeTest(t)&&this.hasTestThatIsNotThemeTest(t)}testIsPaused(t){return t.status==="paused"||t.status==="incompatible"||t.status==="suspended"}visitorActiveTestType(){const t=this.state.essential.visitorTests.filter(e=>this.testConfigs.some(i=>i.hypotheses.some(s=>s.id==e.hypothesisId)));return t.length===0?null:t.some(e=>e.isThemeTest)?"theme":"templateOrUrlRedirect"}getReservationType(t){return t==="price"||this.isTemplateTestType(t)?"deferred":"immediate"}isTemplateTestType(t){return["product","collection","landing","index","cart","search","blog","article","collectionList"].includes(t)}getEntryCriteriaKey(t){const e=t.hypotheses.find(i=>i.isControl);if(!e)return`unknown:${t.id}`;switch(e.type){case"theme":return"global:theme";case"basicScript":return"global:autoApi";case"price":return"global:price";case"manualScript":return`conditional:manualApi:${t.id}`;case"urlRedirect":return`conditional:url:${e.redirectPath||"unknown"}`;default:return`conditional:template:${e.type}`}}isGlobalEntryCriteria(t){return t.startsWith("global:")}groupTestsByEntryCriteria(t){const e=new Map;for(const i of t){const s=this.getEntryCriteriaKey(i),r=e.get(s)||[];r.push(i),e.set(s,r)}return e}doesCurrentPageMatchEntryCriteria(t){if(this.isGlobalEntryCriteria(t))return!0;if(t==="conditional:manualApi")return!1;if(t.startsWith("conditional:url:")){const e=t.replace("conditional:url:","");return window.location.pathname.endsWith(e)}if(t.startsWith("conditional:template:")){const e=t.replace("conditional:template:","");return this.typeFromTemplate()===e}return!1}hasActiveReservation(){const t=this.getActiveReservations();return Object.values(t).some(e=>!e.isRealized)}getActiveReservation(){const t=this.getActiveReservations();return Object.values(t).find(e=>!e.isRealized)??null}clearStaleReservations(){const t=this.state.temporary.testReservations;if(!t)return;let e=!1;for(const[i,s]of Object.entries(t)){const r=this.testConfigs.find(o=>o.id===s.testId);if(!r){this.log("Test '%s' no longer in config, clearing reservation for criteria '%s'",s.testId,i),delete t[i],e=!0;continue}if(r.status!=="active"){this.log("Test '%s' status is '%s', clearing reservation for criteria '%s'",s.testId,r.status,i),delete t[i],e=!0;continue}this.testsFilteredByAudience.some(o=>o.id===s.testId)||(this.log("Visitor no longer passes audience for test '%s', clearing reservation for criteria '%s'",s.testId,i),delete t[i],e=!0)}e&&this.persistTemporaryState()}createReservations(t){if(this.state.temporary.testReservations||(this.state.temporary.testReservations={}),this.state.temporary.rolledEntryCriteria||(this.state.temporary.rolledEntryCriteria=[]),this.state.temporary.testCategory==="global"){this.createSingleReservation(t,"global");return}const i=t.filter(o=>this.doesCurrentPageMatchEntryCriteria(this.getEntryCriteriaKey(o))),s=t.filter(o=>!this.doesCurrentPageMatchEntryCriteria(this.getEntryCriteriaKey(o)));this.log("Conditional tests split - matching current page: %d, not matching: %d",i.length,s.length),i.length>0&&this.log("Tests matching current page (same pool): %o",i.map(o=>({id:o.id,title:o.title,criteria:this.getEntryCriteriaKey(o)})));const r=`conditional:current-page:${this.typeFromTemplate()}`;if(i.length>0&&!this.state.temporary.rolledEntryCriteria.includes(r)){this.createSingleReservation(i,r);for(const o of i){const l=this.getEntryCriteriaKey(o);this.state.temporary.rolledEntryCriteria.includes(l)||this.state.temporary.rolledEntryCriteria.push(l)}}const n=this.groupTestsByEntryCriteria(s);for(const[o,l]of n){if(this.state.temporary.rolledEntryCriteria.includes(o)){this.log("Already rolled for criteria '%s', skipping",o);continue}if(l.some(S=>this.state.essential.visitorTests.some(P=>P.testId===S.id))){this.log("Visitor already has VT for criteria '%s', skipping",o),this.state.temporary.rolledEntryCriteria.push(o);continue}const d=[...l].sort((S,P)=>S.id.localeCompare(P.id));this.log("Test dice roll for criteria '%s' - available tests: %o",o,d.map(S=>({id:S.id,title:S.title})));const p=Math.floor(Math.random()*d.length),h=d[p];this.log("Test dice roll: picked index %d of %d, selected test '%s' (%s)",p+1,l.length,h.id,h.title);const u=this.pickHypothesis(h);if(!u){this.log("No hypothesis picked for test '%s'",h.id);continue}this.sendDiagnosticTelemetry("assignment",h.id,{hypothesisId:u.id,isControl:u.isControl,testType:u.type});const b=this.getReservationType(u.type),k={testId:h.id,hypothesisId:u.id,testType:u.type,reservationType:b,isThemeTest:u.type==="theme",themeId:u.themeId,createdAt:new Date,isRealized:!1,entryCriteriaKey:o};this.state.temporary.testReservations[o]=k,this.state.temporary.rolledEntryCriteria.push(o),this.log("Created %s reservation for test '%s' (criteria: %s)",b,h.id,o);for(const S of l)S.id!==h.id&&this.markTestAsBlocked(S,o)}this.persistTemporaryState()}createSingleReservation(t,e){if(this.state.temporary.rolledEntryCriteria.includes(e)){this.log("Already rolled for pool '%s', skipping",e);return}if(t.some(p=>this.state.essential.visitorTests.some(h=>h.testId===p.id&&!h.isInvalid))){this.log("Visitor already has VT for pool '%s', skipping",e),this.state.temporary.rolledEntryCriteria.push(e);return}if(t.length===0){this.log("No tests in pool '%s'",e);return}const s=[...t].sort((p,h)=>p.id.localeCompare(h.id));this.log("Test dice roll for pool '%s' - available tests: %o",e,s.map(p=>({id:p.id,title:p.title,criteria:this.getEntryCriteriaKey(p)})));const r=Math.floor(Math.random()*s.length),n=s[r];this.log("Test dice roll: picked index %d of %d, selected test '%s' (%s)",r,t.length,n.id,n.title);const o=this.pickHypothesis(n);if(!o){this.log("No hypothesis picked for test '%s'",n.id);return}this.sendDiagnosticTelemetry("assignment",n.id,{hypothesisId:o.id,isControl:o.isControl,testType:o.type});const l=this.getReservationType(o.type),c=this.getEntryCriteriaKey(n),d={testId:n.id,hypothesisId:o.id,testType:o.type,reservationType:l,isThemeTest:o.type==="theme",themeId:o.themeId,createdAt:new Date,isRealized:!1,entryCriteriaKey:c};this.state.temporary.testReservations[c]=d,this.state.temporary.rolledEntryCriteria.push(e),this.log("Created %s reservation for test '%s' from pool '%s' (criteria: %s)",l,n.id,e,c);for(const p of t)p.id!==n.id&&this.markTestAsBlocked(p,`pool:${e}`);this.persistTemporaryState()}markTestAsBlocked(t,e){this.state.essential.visitorTests.some(i=>i.testId===t.id)||(this.log("Blocking visitor from test '%s' (reason: %s)",t.id,e),this.state.essential.visitorTests.push({createdAt:new Date,testId:t.id,hypothesisId:null,isThemeTest:t.hypotheses.some(i=>i.type==="theme"),shouldSendToGa:!1,isSaved:!0,isInvalid:!0,themeId:void 0}))}realizeReservationForCriteria(t){const e=this.state.temporary.testReservations?.[t];if(!e)return this.log("No reservation found for criteria '%s'",t),!1;if(e.isRealized)return this.log("Reservation already realized for criteria '%s'",t),!1;if(this.state.essential.visitorTests.some(s=>s.testId===e.testId&&!s.isInvalid))return this.log("Visitor already assigned to test '%s'",e.testId),!1;const i=this.getHypothesis(e.hypothesisId);return i?(e.isRealized=!0,this.persistTemporaryState(),this.queueAddVisitorToTest(e.testId,i),this.saveState(),this.log("Realized reservation for test '%s' (criteria: %s)",e.testId,t),!0):(this.log("Hypothesis '%s' not found",e.hypothesisId),!1)}getActiveReservations(){return this.state.temporary.testReservations??{}}getReservationForCurrentPage(){const t=this.getActiveReservations();for(const[e,i]of Object.entries(t)){if(i.isRealized)continue;const s=this.testConfigs.find(r=>r.id===i.testId);if(!(!s||s.status!=="active")&&this.doesCurrentPageMatchEntryCriteria(e))return i}return null}getReservationForTest(t){const e=this.getActiveReservations();return Object.values(e).find(i=>i.testId===t)??null}getReservationTestType(){const t=this.getActiveReservations(),e=Object.values(t);if(e.length===0)return null;for(const i of e)if(i.isThemeTest)return"theme";for(const i of e)if(i.testType==="price")return"price";return e.some(i=>!i.isRealized)?"templateOrUrlRedirect":null}hasPriceTests(t){return t.some(e=>e.hypotheses.some(i=>i.type==="price"))}_priceTestProductIds=null;getPriceTestProductIds(){if(this._priceTestProductIds)return this._priceTestProductIds;const t=new Set;for(const e of this.testConfigs)for(const i of e.hypotheses)if(i.type==="price"){for(const s of i.domSelectors||[]){const r=s.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);r?.[1]&&t.add(r[1])}if(i.priceData?.variants)for(const[s]of i.priceData.variants)t.add(s)}return this._priceTestProductIds=t,this.log("Built price test product ID cache with %d products",t.size),t}isProductInAnyPriceTest(t){return this.getPriceTestProductIds().has(t)}visitorActiveTestTypeWithReservations(){const t=this.getActiveReservations();for(const r of Object.values(t)){if(r.isThemeTest)return"theme";if(r.testType==="price")return"price"}if(Object.values(t).some(r=>!r.isRealized)){if(this.state.temporary.testCategory==="global")for(const n of Object.values(t)){if(n.testType==="theme")return"theme";if(n.testType==="price")return"price";if(n.testType==="basicScript")return"theme"}return"templateOrUrlRedirect"}const i=this.state.essential.visitorTests.filter(r=>!r.isInvalid&&this.testConfigs.some(n=>n.hypotheses.some(o=>o.id===r.hypothesisId)));return i.length===0?null:i.some(r=>this.getHypothesis(r.hypothesisId)?.type==="price")?"price":i.some(r=>r.isThemeTest)?"theme":"templateOrUrlRedirect"}applyControlForAudienceFilteredPriceTests(){const t=this.testConfigs.filter(s=>s.status==="active"&&s.hypotheses.some(r=>r.type==="price"));if(t.length===0)return;const e=this.testsFilteredByAudience.filter(s=>s.hypotheses.some(r=>r.type==="price")),i=t.filter(s=>!e.some(r=>r.id===s.id));if(i.length!==0){this.log("Found %d price tests filtered by audience, applying control selectors",i.length);for(const s of i){const r=s.hypotheses.find(c=>c.isControl),n=this.getDomSelectorsForHypothesis(r);if(n.length===0){this.log("No control selectors for audience-filtered price test '%s'",s.id);continue}const o=new URL(window.location.href);n.some(c=>{try{return new RegExp(it(c)).test(o.toString())}catch{return!1}})&&(this.log("Applying control selectors for audience-filtered price test '%s'",s.id),N(document,{testId:s.id,hypothesisId:r.id,selectors:n},()=>{}),this.updatePriceTestHiddenInputs(s.id,"control",!1))}}}pickHypothesis(t){let e=Math.random();const i=t.hypotheses.reduce((r,n)=>r+n.visitorCount,0);return t.hypotheses.sort((r,n)=>r.isControl?n.isControl?0:-1:n.isControl?1:0).reduce((r,n)=>{if(r!==null)return r;const l=t.hypotheses.reduce((c,d)=>c&&d.visitorCount>20,!0)?n.visitorCount/i-n.trafficPercentage:0;return e<=n.trafficPercentage-l?n:(e-=n.trafficPercentage-l,null)},null)}typeFromTemplate(){switch(template.type){case"list-collections":return"collectionList";case"page":return"landing";case"article":case"blog":case"cart":case"collection":case"index":case"product":case"search":return template.type;default:return null}}queueRedirect(t){this.saveState(),this.disableReferrerOverride||(this.log(`Saving temporary referrer override '${document.referrer}'`),this.state.temporary.originalReferrer=document.referrer,this.persistTemporaryState()),window.setTimeout(()=>window.location.assign(t),0),window.setTimeout(()=>{this.syncAllEvents()},2e3)}scheduleRetrySync(){this.clientIdRetryCount>=5||(this.clientIdRetryCount++,window.setTimeout(()=>{this.syncAllEvents()},500))}async syncAllEvents(){const t=async()=>{if(this.isSyncing){window.setTimeout(()=>{(async()=>await t())()},500);return}try{if(this.isSyncing=!0,this.syncGAEvents(),this.shopifyAnalyticsId||(this.shopifyAnalyticsId=this.getShopifyAnalyticsId()),!this.shopifyAnalyticsId){this.scheduleRetrySync();return}await this.syncEvents()}finally{this.isSyncing=!1}};await t()}async syncEvents(){if(!this.state.essential.consentApproved||!this.shopifyAnalyticsId||this.state.analytics.queue.length===0)return;const t=this.state.analytics.queue.length,e=this.state.analytics.queue.splice(0,t);this.log("Syncing %s events",t);try{const i={shop:this.shop,visitorDetails:{shopifyAnalyticsId:this.shopifyAnalyticsId,device:this.state.analytics.visitor?.device??this.device,country:this.state.analytics.visitor?.country??null,...this.state.essential.initialState},events:this.state.essential.visitorTests.filter(r=>!r.isInvalid&&!r.isSaved&&r.hypothesisId!=null).map(r=>new yt(r.testId,r.hypothesisId,r.createdAt)).concat(e)};await this.sendEvents(i);for(const r of this.state.essential.visitorTests.filter(n=>!n.isInvalid&&!n.isSaved&&n.hypothesisId!=null))this.sendDiagnosticTelemetry("event-delivered",r.testId,{hypothesisId:r.hypothesisId,isControl:r.assignedTo==="control",testType:r.testType??"unknown"});const s=await this.getVisitor(this.shopifyAnalyticsId);s!==null&&this.updateLocalVisitor(s);for(const r of this.state.essential.visitorTests.filter(n=>!n.isInvalid&&!n.isSaved))r.isSaved=!0,r.savedAt=Date.now()}catch{this.state.analytics.queue.splice(0,0,...e)}finally{this.saveState()}}syncGAEvents(){if(!this.gaConfig.sendEvents){if(pt)return;pt=!0,this.log("UseGtag is false — skipping GA Events");return}if(this.isSyncingGA){this.log("Already syncing GA - skipping GA events");return}const t=this.state.essential.visitorTests.filter(e=>e.shouldSendToGa);t.length!==0&&(this.isSyncingGA=!0,this.log("Syncing %s GA Events",t.length),Promise.allSettled(t.map(e=>this.sendGAEvent(e))).then(()=>this.log("All gtag events sent")).finally(()=>this.isSyncingGA=!1))}sendGAEvent(t){return new Promise(e=>{this.log("Sending GA Event for test %s, hypothesis %s",t.testId,t.hypothesisId);const i=()=>{this.log("GA acknowledged event for hypothesis %s",t.hypothesisId),t.shouldSendToGa=!1,this.persistEssentialState(),e()},s={exp_variant_string:`SL-${t.testId}-${t.hypothesisId}`};this.shopliftDebug&&Object.assign(s,{debug_mode:!0});function r(n,o,l){window.dataLayer=window.dataLayer||[],window.dataLayer.push(arguments)}this.gaConfig.mode==="gtag"?r("event","experience_impression",{...s,event_callback:i}):(window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"experience_impression",...s,eventCallback:i}))})}updateLocalVisitor(t){let e;({visitorTests:e,...this.state.analytics.visitor}=t),this.log("updateLocalVisitor - server returned %d tests: %o",e.length,e.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isInvalid:s.isInvalid}))),this.log("updateLocalVisitor - local has %d tests: %o",this.state.essential.visitorTests.length,this.state.essential.visitorTests.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isSaved:s.isSaved,isInvalid:s.isInvalid})));const i=300*1e3;for(const s of this.state.essential.visitorTests.filter(r=>r.isSaved&&(!r.savedAt||Date.now()-r.savedAt>i)&&!e.some(n=>n.testId===r.testId)))this.log("updateLocalVisitor - marking LOCAL test as INVALID (isSaved && not in server): testId=%s, hypothesisId=%s",s.testId,s.hypothesisId),s.isInvalid=!0;for(const s of e){const r=this.state.essential.visitorTests.findIndex(o=>o.testId===s.testId);if(!(r!==-1))this.log("updateLocalVisitor - ADDING server test (not found locally): testId=%s, hypothesisId=%s",s.testId,s.hypothesisId),this.state.essential.visitorTests.push(s);else{const o=this.state.essential.visitorTests.at(r);this.log("updateLocalVisitor - REPLACING local test with server test: testId=%s, local hypothesisId=%s -> server hypothesisId=%s, local isInvalid=%s -> false",s.testId,o?.hypothesisId,s.hypothesisId,o?.isInvalid),s.isInvalid=!1,s.shouldSendToGa=o?.shouldSendToGa??!1,s.testType=o?.testType,s.assignedTo=o?.assignedTo,s.testTitle=o?.testTitle,this.state.essential.visitorTests.splice(r,1,s)}}this.log("updateLocalVisitor - FINAL local tests: %o",this.state.essential.visitorTests.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isSaved:s.isSaved,isInvalid:s.isInvalid}))),this.state.analytics.visitor.storedAt=new Date}async getVisitor(t){try{return await this.makeJsonRequest({method:"get",url:`${this.eventHost}/api/v0/visitors/by-key/${this.shop}/${t}`})}catch{return null}}async sendEvents(t){await this.makeRequest({method:"post",url:`${this.eventHost}/api/v0/events`,data:JSON.stringify(t)})}sendDiagnosticTelemetry(t,e,i){if(!this.telemetryEnabled||!navigator.sendBeacon)return;const s=this.state.essential.consentApproved,r=JSON.stringify({shop:this.shop,testId:e,checkpoint:t,device:this.device,...s?{visitorId:this.shopifyAnalyticsId??"unknown"}:{},clientTimestamp:Date.now(),consentApproved:s,hasConsentInteraction:this.state.essential.hasConsentInteraction,...i});navigator.sendBeacon(`${this.eventHost}/api/v0/telemetry`,new Blob([r],{type:"text/plain"}))}getUTMValue(t){const i=decodeURIComponent(window.location.search.substring(1)).split("&");for(let s=0;s<i.length;s++){const r=i[s].split("=");if(r[0]===t)return r[1]||null}return null}hidePage(t){this.log("Hiding page"),this.cssHideClass&&!window.document.documentElement.classList.contains(this.cssHideClass)&&(window.document.documentElement.classList.add(this.cssHideClass),t||setTimeout(this.removeAsyncHide(this.cssHideClass),2e3))}showPage(){this.cssHideClass&&this.removeAsyncHide(this.cssHideClass)()}getDeviceType(){function t(){let i=!1;return(function(s){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(s)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(s.substr(0,4)))&&(i=!0)})(navigator.userAgent||navigator.vendor),i}function e(){let i=!1;return(function(s){(/android|ipad|playbook|silk/i.test(s)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(s.substr(0,4)))&&(i=!0)})(navigator.userAgent||navigator.vendor),i}return t()?"mobile":e()?"tablet":"desktop"}removeAsyncHide(t){return()=>{t&&window.document.documentElement.classList.remove(t)}}async getCartState(){try{let t=await this.makeJsonRequest({method:"get",url:`${window.location.origin}/cart.js`});return t===null||(t.note===null&&(t=await this.makeJsonRequest({method:"post",url:`${window.location.origin}/cart/update.js`,data:JSON.stringify({note:""})})),t==null)?null:{token:t.token,total_price:t.total_price,total_discount:t.total_discount,currency:t.currency,items_subtotal_price:t.items_subtotal_price,items:t.items.map(e=>({quantity:e.quantity,variant_id:e.variant_id,key:e.key,price:e.price,final_line_price:e.final_line_price,sku:e.sku,product_id:e.product_id}))}}catch(t){return this.log("Error sending cart info",t),null}}ensureCartAttributesForExistingPriceTests(t){try{if(this.log("Checking visitor assignments for active price tests"),t&&this.state.temporary.previewConfig){const e=this.state.temporary.previewConfig;this.log("Using preview config for merchant:",e.testId);let i="variant";if(e.variants&&e.variants.length>0){const s=e.variants.find(r=>r.id===e.currentVariant);s&&s.isControl&&(i="control")}this.log("Merchant preview - updating hidden inputs:",e.testId,i),this.updatePriceTestHiddenInputs(e.testId,i,!0);return}for(const e of this.state.essential.visitorTests){const i=this.testConfigs.find(n=>n.id===e.testId);if(!i){this.log("Test config not found:",e.testId);continue}const s=i.hypotheses.find(n=>n.id===e.hypothesisId);if(!s||s.type!=="price")continue;const r=s.isControl?"control":"variant";this.log("Updating hidden inputs for price test:",e.testId,r),this.updatePriceTestHiddenInputs(e.testId,r,t)}}catch(e){this.log("Error ensuring cart attributes for existing price tests:",e)}}subscriptionSwapDone=!1;subscriptionHideWrongPlans=null;subscriptionPriceDone=!1;subscriptionUpdateOneTime=null;subscriptionOneTimeDone=!1;swapMap=null;slptValue=null;async subscriptionSwap(){await Lt(this)}async subscriptionPriceChange(){await qt(this)}async subscriptionOneTimePrice(){await Ht(this)}updatePriceTestHiddenInputs(t,e,i){try{this.cleanupPriceTestObservers();const s=`${t}:${e}:${i?"t":"f"}`,r=C=>{const m=C.getAttribute("data-sl-pid");if(!m)return!0;if(i&&this.state.temporary.previewConfig){const w=this.state.temporary.previewConfig,T=e==="control"?"a":"b",f=w.variants.find(v=>v.label===T);if(!f)return!1;for(const v of f.domSelectors||[]){const g=v.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);if(g){const I=g[1];if(this.log(`Extracted ID from selector: ${I}, comparing to: ${m}`),I===m)return this.log("Product ID match found in preview config:",m,"variant:",f.label),!0}else this.log(`Could not extract ID from selector: ${v.cssSelector}`)}return this.log("No product ID match in preview config for:",m,"variant:",T),!1}const y=this.testConfigs.find(w=>w.id===t);if(!y)return this.log("Test config not found for testId:",t),!1;for(const w of y.hypotheses||[]){for(const T of w.domSelectors||[]){const f=T.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);if(f&&f[1]===m)return this.log("Product ID match found in domSelectors:",m,"for test:",t),!0}if(w.priceData?.variants){for(const T of w.priceData.variants)if(T[0]===m)return this.log("Product ID match found in priceData:",m,"for test:",t),!0}}return this.log("No product ID match for:",m,"in test:",t),!1},n=new Set;let o=!1,l=null;const c=(C,m)=>{if(document.querySelectorAll("[data-sl-attribute-p]").forEach(w=>{if(w instanceof Element&&w.nodeType===Node.ELEMENT_NODE&&w.isConnected&&document.contains(w))try{C.observe(w,{childList:!0,subtree:!0,characterData:!0,characterDataOldValue:!0,attributes:!1})}catch(T){this.log(`Failed to observe element (${m}):`,T)}}),document.body&&document.body.isConnected)try{C.observe(document.body,{childList:!0,subtree:!0,characterData:!0,characterDataOldValue:!0,attributes:!1})}catch(w){this.log(`Failed to observe document.body (${m}):`,w)}},d=(C,m,y,w)=>{const T=C.filter(f=>{const v=f.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);return v&&v[1]===w});this.log(`Applying ${y} DOM selectors, total: ${C.length}, filtered: ${T.length}`),T.length>0&&N(document,{testId:t,hypothesisId:m,selectors:T})},p=(C,m)=>{this.log(`Applying DOM selector changes for product ID: ${C}`),m.disconnect(),o=!0;try{if(i&&this.state.temporary.previewConfig){const y=e==="control"?"a":"b",w=this.state.temporary.previewConfig.variants.find(T=>T.label===y);if(!w?.domSelectors){this.log(`No DOM selectors found for preview variant: ${y}`);return}d(w.domSelectors,w.id,"preview config",C)}else{const y=this.testConfigs.find(T=>T.id===t);if(!y){this.log(`No test config found for testId: ${t}`);return}const w=y.hypotheses.find(T=>e==="control"?T.isControl:!T.isControl);if(!w?.domSelectors){this.log(`No DOM selectors found for assignment: ${e}`);return}d(w.domSelectors,w.id,"live config",C)}}finally{l!==null&&clearTimeout(l),l=window.setTimeout(()=>{o=!1,l=null,c(m,"reconnection"),this.log("Re-established innerHTML observer after DOM changes")},50)}},h=new MutationObserver(C=>{if(!o)for(const m of C){if(m.type!=="childList"&&m.type!=="characterData")continue;let y=m.target;m.type==="characterData"&&(y=m.target.parentElement||m.target.parentNode);let w=y,T=w.getAttribute("data-sl-attribute-p");for(;!T&&w.parentElement;)w=w.parentElement,T=w.getAttribute("data-sl-attribute-p");if(!T)continue;const f=w.innerHTML||w.textContent||"";let v="";m.type==="characterData"&&m.oldValue!==null&&(v=m.oldValue),this.log(`innerHTML changed on element with data-sl-attribute-p="${T}"`),v&&this.log(`Previous content: "${v}"`),this.log(`Current content: "${f}"`),p(T,h)}});c(h,"initial setup"),n.add(h);const u=new MutationObserver(C=>{C.forEach(m=>{m.addedNodes.forEach(y=>{if(y.nodeType===Node.ELEMENT_NODE){const w=y;k(w);const T=w.matches('input[name="properties[_slpt]"]')?[w]:w.querySelectorAll('input[name="properties[_slpt]"]');T.length>0&&this.log(`MutationObserver found ${T.length} new hidden input(s)`),T.forEach(f=>{const v=f.getAttribute("data-sl-pid");if(this.log(`MutationObserver checking new input with data-sl-pid="${v}"`),r(f))f.value!==s&&(f.value=s,this.log("Updated newly added hidden input:",s)),S(f);else{const g=f.getAttribute("data-sl-pid");g&&this.isProductInAnyPriceTest(g)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",g):(f.remove(),this.log("Removed newly added non-matching hidden input for product ID:",g))}})}})})});n.add(u);const b=new MutationObserver(C=>{C.forEach(m=>{if(m.type==="attributes"&&m.attributeName==="data-sl-pid"){const y=m.target;if(this.log("AttributeObserver detected data-sl-pid attribute change on:",y.tagName),y.matches('input[name="properties[_slpt]"]')){const w=y,T=m.oldValue,f=w.getAttribute("data-sl-pid");this.log(`data-sl-pid changed from "${T}" to "${f}" - triggering payment placement updates`),r(w)?(w.value!==s&&(w.value=s,this.log("Updated hidden input after data-sl-pid change:",s)),f&&p(f,h),this.log("Re-running payment placement updates after variant change"),k(document.body)):f&&this.isProductInAnyPriceTest(f)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",f):(w.remove(),this.log("Removed non-matching hidden input after data-sl-pid change:",f))}}})});n.add(b);const k=C=>{C.tagName==="SHOPIFY-PAYMENT-TERMS"&&(this.log("MutationObserver found new shopify-payment-terms element"),this.updateShopifyPaymentTerms(t,e));const m=C.querySelectorAll("shopify-payment-terms");m.length>0&&(this.log(`MutationObserver found ${m.length} shopify-payment-terms in added node`),this.updateShopifyPaymentTerms(t,e)),C.tagName==="AFTERPAY-PLACEMENT"&&(this.log("MutationObserver found new afterpay-placement element"),this.updateAfterpayPlacements(t,e,"afterpay"));const y=C.querySelectorAll("afterpay-placement");y.length>0&&(this.log(`MutationObserver found ${y.length} afterpay-placement in added node`),this.updateAfterpayPlacements(t,e,"afterpay")),C.tagName==="SQUARE-PLACEMENT"&&(this.log("MutationObserver found new square-placement element"),this.updateAfterpayPlacements(t,e,"square"));const w=C.querySelectorAll("square-placement");w.length>0&&(this.log(`MutationObserver found ${w.length} square-placement in added node`),this.updateAfterpayPlacements(t,e,"square")),C.tagName==="KLARNA-PLACEMENT"&&(this.log("MutationObserver found new klarna-placement element"),this.updateKlarnaPlacements(t,e));const T=C.querySelectorAll("klarna-placement");T.length>0&&(this.log(`MutationObserver found ${T.length} klarna-placement in added node`),this.updateKlarnaPlacements(t,e))},S=C=>{b.observe(C,{attributes:!0,attributeFilter:["data-sl-pid"],attributeOldValue:!0,subtree:!1});const m=C.getAttribute("data-sl-pid");this.log(`Started AttributeObserver on specific input with data-sl-pid="${m}"`)},P=()=>{const C=document.querySelectorAll('input[name="properties[_slpt]"]');this.log(`Found ${C.length} existing hidden inputs to check`),C.forEach(m=>{const y=m.getAttribute("data-sl-pid");this.log(`Checking existing input with data-sl-pid="${y}"`),r(m)?(m.value=s,this.log("Updated existing hidden input:",s),y&&(this.log("Applying initial DOM selector changes for existing product"),p(y,h)),S(m)):y&&this.isProductInAnyPriceTest(y)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",y):(m.remove(),this.log("Removed non-matching hidden input for product ID:",y))})},_=()=>{document.body?(u.observe(document.body,{childList:!0,subtree:!0}),this.log("Started MutationObserver on document.body"),P(),k(document.body)):document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{document.body&&(u.observe(document.body,{childList:!0,subtree:!0}),this.log("Started MutationObserver after DOMContentLoaded"),P(),k(document.body))}):(this.log("Set timeout on observer"),setTimeout(_,10))};_(),window.__shopliftPriceTestObservers=n,window.__shopliftPriceTestValue=s,this.log("Set up DOM observer for price test hidden inputs")}catch(s){this.log("Error updating price test hidden inputs:",s)}}updateKlarnaPlacements(t,e){this.updatePlacementElements(t,e,"klarna-placement",(i,s)=>{i.setAttribute("data-purchase-amount",s.toString())})}cleanupPriceTestObservers(){const t=window.__shopliftPriceTestObservers;t&&(t.forEach(e=>{e.disconnect()}),t.clear(),this.log("Cleaned up existing price test observers")),delete window.__shopliftPriceTestObservers,delete window.__shopliftPriceTestValue}updateAfterpayPlacements(t,e,i="afterpay"){const s=i==="square"?"square-placement":"afterpay-placement";if(document.querySelectorAll(s).length===0){this.log(`No ${s} elements found on page - early return`);return}this.updatePlacementElements(t,e,s,(n,o)=>{if(i==="afterpay"){const l=(o/100).toFixed(2);n.setAttribute("data-amount",l)}else n.setAttribute("data-amount",o.toString())}),this.log("updateAfterpayPlacements completed")}updatePlacementElements(t,e,i,s){const r=document.querySelectorAll(i);if(r.length===0){this.log(`No ${i} elements found - early return`);return}let n;if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const l=e==="control"?"a":"b",c=this.state.temporary.previewConfig.variants.find(d=>d.label===l);if(!c?.domSelectors){this.log(`No variant found for label ${l} in preview config for ${i}`);return}n=c.domSelectors,this.log(`Using preview config for ${i} in merchant mode, variant: ${l}`)}else{const l=this.testConfigs.find(d=>d.id===t);if(!l){this.log(`No testConfig found for id: ${t} - early return`);return}const c=l.hypotheses.find(d=>e==="control"?d.isControl:!d.isControl);if(!c?.domSelectors){this.log(`No hypothesis or domSelectors found for assignment: ${e} - early return`);return}n=c.domSelectors}const o=new RegExp(`${this.DATA_SL_ATTRIBUTE_P}=["'](\\d+)["']`);r.forEach(l=>{let c=null;const d=l.parentElement;if(d&&(c=d.querySelector('input[name="properties[_slpt]"]')),c||(c=l.querySelector('input[name="properties[_slpt]"]')),!c){this.log(`No hidden input found for ${i} element`);return}const p=c.getAttribute("data-sl-pid");if(!p){this.log("Hidden input has no data-sl-pid attribute - skipping");return}const h=n.find(S=>{const P=S.cssSelector.match(o);return P&&P[1]===p});if(!h){this.log(`No matching selector found for productId: ${p} - skipping element`);return}const u=h.actions.find(S=>S.scope==="price");if(!u?.value){this.log("No price action or value found - skipping element");return}const b=parseFloat(u.value.replace(/[^0-9.]/g,""));if(Number.isNaN(b)){this.log(`Invalid price "${u.value}" for product ${p} - skipping`);return}const k=Math.round(b*100);s(l,k)}),this.log(`updatePlacementElements completed for ${i}`)}updateShopifyPaymentTerms(t,e){const i=document.querySelectorAll("shopify-payment-terms");if(i.length===0)return;this.log("Store using shopify payments");let s;if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const n=e==="control"?"a":"b",o=this.state.temporary.previewConfig.variants.find(l=>l.label===n);if(!o||!o.domSelectors){this.log(`No variant found for label ${n} in preview config`);return}s=o.domSelectors,this.log(`Using preview config for shopify-payment-terms in merchant mode, variant: ${n}`)}else{const n=this.testConfigs.find(l=>l.id===t);if(!n)return;const o=n.hypotheses.find(l=>e==="control"?l.isControl===!0:l.isControl===!1);if(!o||!o.domSelectors)return;s=o.domSelectors}const r=new RegExp(`${this.DATA_SL_ATTRIBUTE_P}=["'](\\d+)["']`);i.forEach(n=>{const o=n.getAttribute("variant-id");if(!o)return;const l=s.find(c=>{const d=c.cssSelector.match(r);return d&&d[1]===o});if(l){const c=l.actions.find(d=>d.scope==="price");if(c&&c.value){const d=n.getAttribute("shopify-meta");if(d)try{const p=JSON.parse(d);if(p.variants&&Array.isArray(p.variants)){const h=p.variants.find(u=>u.id?.toString()===o);if(h){h.full_price=c.value;const u=parseFloat(c.value.replace(/[^0-9.]/g,""));if(h.number_of_payment_terms&&h.number_of_payment_terms>1){const b=u/h.number_of_payment_terms;h.price_per_term=`$${b.toFixed(2)}`}n.setAttribute("shopify-meta",JSON.stringify(p))}}}catch(p){this.log("Error parsing/updating shoplift-meta:",p)}}}})}async makeJsonRequest(t){const e=await this.makeRequest(t);return e===null?null:JSON.parse(await e.text(),F)}async makeRequest(t){const{url:e,method:i,headers:s,data:r,signal:n}=t,o=new Headers;if(s)for(const c in s)o.append(c,s[c]);(!s||!s.Accept)&&o.append("Accept","application/json"),(!s||!s["Content-Type"])&&o.append("Content-Type","application/json"),(this.eventHost.includes("ngrok.io")||this.eventHost.includes("ngrok-free.app"))&&o.append("ngrok-skip-browser-warning","1234");const l=await this.fetch(e,{method:i,headers:o,body:r,signal:n});if(!l.ok){if(l.status===204)return null;if(l.status===422){const c=await l.json();if(typeof c<"u"&&c.isBot)throw new et}throw new Error(`Error sending shoplift request ${l.status}`)}return l}queueAddVisitorToTest(t,e){if(this.state.essential.visitorTests.some(s=>s.testId===t))return;const i=this.testConfigs.find(s=>s.id===t);if(this.state.essential.visitorTests.push({createdAt:new Date,testId:t,hypothesisId:e.id,isThemeTest:e.type==="theme",themeId:e.themeId,isSaved:!1,isInvalid:!1,shouldSendToGa:!0,testType:e.type,assignedTo:e.isControl?"control":"variant",testTitle:i?.title}),e.type==="price"){const s=e.isControl?"control":"variant";this.log("Price test assignment detected, updating cart attributes:",t,s),this.updatePriceTestHiddenInputs(t,s,!1)}}queueCartUpdate(t){this.queueEvent(new wt(t))}queuePageView(t){this.queueEvent(new vt(t))}queueEvent(t){!this.state.essential.consentApproved&&this.state.essential.hasConsentInteraction||this.state.analytics.queue.length>10||this.state.analytics.queue.push(t)}legacyGetLocalStorageVisitor(){const t=this.localStorageGet(this.legacySessionKey);if(t)try{return JSON.parse(t,F)}catch{}return null}pruneStaleVisitorTests(){this.state.essential.visitorTests=this.state.essential.visitorTests.filter(t=>this.testConfigs.some(e=>e.id==t.testId)||this.inactiveTestConfigs.filter(e=>this.testIsPaused(e)).some(e=>e.id===t.testId))}pruneStateAndSave(){this.pruneStaleVisitorTests(),this.saveState()}saveState(){this.persistEssentialState(),this.persistAnalyticsState()}loadState(){const t=this.loadAnalyticsState(),e={analytics:t,essential:this.loadEssentialState(t),temporary:this.loadTemporaryState()},i=this.legacyGetLocalStorageVisitor(),s=this.legacyGetCookieVisitor(),r=[i,s].filter(n=>n!==null).sort((n,o)=>+o.storedAt-+n.storedAt)[0];return e.analytics.visitor===null&&r&&({visitorTests:e.essential.visitorTests,...e.analytics.visitor}=r,e.essential.isFirstLoad=!1,e.essential.initialState={createdAt:r.createdAt,referrer:r.referrer,utmCampaign:r.utmCampaign,utmContent:r.utmContent,utmMedium:r.utmMedium,utmSource:r.utmSource,device:r.device},this.deleteCookie("SHOPLIFT"),this.deleteLocalStorage(this.legacySessionKey)),!e.essential.consentApproved&&e.essential.hasConsentInteraction&&this.deleteLocalStorage(this.analyticsSessionKey),e}loadEssentialState(t){const e=this.loadLocalStorage(this.essentialSessionKey),i=this.loadCookie(this.essentialSessionKey),s=this.getInitialState();t.visitor?.device&&(s.device=t.visitor.device);const r={timestamp:new Date,consentApproved:!1,hasConsentInteraction:!1,debugMode:!1,initialState:s,visitorTests:[],isFirstLoad:!0},n=[e,i].filter(o=>o!==null).sort((o,l)=>+l.timestamp-+o.timestamp)[0]??r;return n.initialState||(t.visitor!==null?n.initialState=t.visitor:(n.initialState=s,n.initialState.createdAt=n.timestamp)),n}loadAnalyticsState(){const t=this.loadLocalStorage(this.analyticsSessionKey),e=this.loadCookie(this.analyticsSessionKey),i={timestamp:new Date,visitor:null,queue:[]},s=[t,e].filter(r=>r!==null).sort((r,n)=>+n.timestamp-+r.timestamp)[0]??i;return s.queue.length===0&&t&&t.queue.length>1&&(s.queue=t.queue),s}loadTemporaryState(){const t=this.sessionStorageGet(this.temporarySessionKey),e=t?JSON.parse(t,F):null,i=this.loadCookie(this.temporarySessionKey);return e??i??{isMerchant:!1,timestamp:new Date}}persistEssentialState(){this.log("Persisting essential state"),this.state.essential.isFirstLoad=!1,this.state.essential.timestamp=new Date,this.persistLocalStorageState(this.essentialSessionKey,this.state.essential),this.persistCookieState(this.essentialSessionKey,this.state.essential)}persistAnalyticsState(){this.log("Persisting analytics state"),this.state.essential.consentApproved&&(this.state.analytics.timestamp=new Date,this.persistLocalStorageState(this.analyticsSessionKey,this.state.analytics),this.persistCookieState(this.analyticsSessionKey,{...this.state.analytics,queue:[]}))}persistTemporaryState(){this.log("Setting temporary session state"),this.state.temporary.timestamp=new Date,this.sessionStorageSet(this.temporarySessionKey,JSON.stringify(this.state.temporary)),this.persistCookieState(this.temporarySessionKey,this.state.temporary,!0)}loadLocalStorage(t){const e=this.localStorageGet(t);if(e===null)return null;try{return JSON.parse(e,F)}catch{return null}}loadCookie(t){const e=this.getCookie(t);if(e===null)return null;try{return JSON.parse(e,F)}catch{return null}}persistLocalStorageState(t,e){this.localStorageSet(t,JSON.stringify(e))}persistCookieState(t,e,i=!1){const s=JSON.stringify(e),r=i?"":`expires=${new Date(new Date().getTime()+864e5*365).toUTCString()};`;document.cookie=`${t}=${s};domain=.${window.location.hostname};path=/;SameSite=Strict;${r}`}deleteCookie(t){const e=new Date(0).toUTCString();document.cookie=`${t}=;domain=.${window.location.hostname};path=/;expires=${e};`}deleteLocalStorage(t){window.localStorage.removeItem(t)}getChannel(t){return[{"name":"cross-network","test":(v) => new RegExp(".*cross-network.*", "i").test(v.utmCampaign)},{"name":"direct","test":(v) => v.utmSource === "" && v.utmMedium === ""},{"name":"paid-shopping","test":(v) => (new RegExp("^(?:Google|IGShopping|aax-us-east\.amazon-adsystem\.com|aax\.amazon-adsystem\.com|alibaba|alibaba\.com|amazon|amazon\.co\.uk|amazon\.com|apps\.shopify\.com|checkout\.shopify\.com|checkout\.stripe\.com|cr\.shopping\.naver\.com|cr2\.shopping\.naver\.com|ebay|ebay\.co\.uk|ebay\.com|ebay\.com\.au|ebay\.de|etsy|etsy\.com|m\.alibaba\.com|m\.shopping\.naver\.com|mercadolibre|mercadolibre\.com|mercadolibre\.com\.ar|mercadolibre\.com\.mx|message\.alibaba\.com|msearch\.shopping\.naver\.com|nl\.shopping\.net|no\.shopping\.net|offer\.alibaba\.com|one\.walmart\.com|order\.shopping\.yahoo\.co\.jp|partners\.shopify\.com|s3\.amazonaws\.com|se\.shopping\.net|shop\.app|shopify|shopify\.com|shopping\.naver\.com|shopping\.yahoo\.co\.jp|shopping\.yahoo\.com|shopzilla|shopzilla\.com|simplycodes\.com|store\.shopping\.yahoo\.co\.jp|stripe|stripe\.com|uk\.shopping\.net|walmart|walmart\.com)$", "i").test(v.utmSource) || new RegExp("^(.*(([^a-df-z]|^)shop|shopping).*)$", "i").test(v.utmCampaign)) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-search","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-social","test":(v) => new RegExp("^(?:43things|43things\.com|51\.com|5ch\.net|Hatena|ImageShack|academia\.edu|activerain|activerain\.com|activeworlds|activeworlds\.com|addthis|addthis\.com|airg\.ca|allnurses\.com|allrecipes\.com|alumniclass|alumniclass\.com|ameba\.jp|ameblo\.jp|americantowns|americantowns\.com|amp\.reddit\.com|ancestry\.com|anobii|anobii\.com|answerbag|answerbag\.com|answers\.yahoo\.com|aolanswers|aolanswers\.com|apps\.facebook\.com|ar\.pinterest\.com|artstation\.com|askubuntu|askubuntu\.com|asmallworld\.com|athlinks|athlinks\.com|away\.vk\.com|awe\.sm|b\.hatena\.ne\.jp|baby-gaga|baby-gaga\.com|babyblog\.ru|badoo|badoo\.com|bebo|bebo\.com|beforeitsnews|beforeitsnews\.com|bharatstudent|bharatstudent\.com|biip\.no|biswap\.org|bit\.ly|blackcareernetwork\.com|blackplanet|blackplanet\.com|blip\.fm|blog\.com|blog\.feedspot\.com|blog\.goo\.ne\.jp|blog\.naver\.com|blog\.yahoo\.co\.jp|blogg\.no|bloggang\.com|blogger|blogger\.com|blogher|blogher\.com|bloglines|bloglines\.com|blogs\.com|blogsome|blogsome\.com|blogspot|blogspot\.com|blogster|blogster\.com|blurtit|blurtit\.com|bookmarks\.yahoo\.co\.jp|bookmarks\.yahoo\.com|br\.pinterest\.com|brightkite|brightkite\.com|brizzly|brizzly\.com|business\.facebook\.com|buzzfeed|buzzfeed\.com|buzznet|buzznet\.com|cafe\.naver\.com|cafemom|cafemom\.com|camospace|camospace\.com|canalblog\.com|care\.com|care2|care2\.com|caringbridge\.org|catster|catster\.com|cbnt\.io|cellufun|cellufun\.com|centerblog\.net|chat\.zalo\.me|chegg\.com|chicagonow|chicagonow\.com|chiebukuro\.yahoo\.co\.jp|classmates|classmates\.com|classquest|classquest\.com|co\.pinterest\.com|cocolog-nifty|cocolog-nifty\.com|copainsdavant\.linternaute\.com|couchsurfing\.org|cozycot|cozycot\.com|cross\.tv|crunchyroll|crunchyroll\.com|cyworld|cyworld\.com|cz\.pinterest\.com|d\.hatena\.ne\.jp|dailystrength\.org|deluxe\.com|deviantart|deviantart\.com|dianping|dianping\.com|digg|digg\.com|diigo|diigo\.com|discover\.hubpages\.com|disqus|disqus\.com|dogster|dogster\.com|dol2day|dol2day\.com|doostang|doostang\.com|dopplr|dopplr\.com|douban|douban\.com|draft\.blogger\.com|draugiem\.lv|drugs-forum|drugs-forum\.com|dzone|dzone\.com|edublogs\.org|elftown|elftown\.com|epicurious\.com|everforo\.com|exblog\.jp|extole|extole\.com|facebook|facebook\.com|faceparty|faceparty\.com|fandom\.com|fanpop|fanpop\.com|fark|fark\.com|fb|fb\.me|fc2|fc2\.com|feedspot|feministing|feministing\.com|filmaffinity|filmaffinity\.com|flickr|flickr\.com|flipboard|flipboard\.com|folkdirect|folkdirect\.com|foodservice|foodservice\.com|forums\.androidcentral\.com|forums\.crackberry\.com|forums\.imore\.com|forums\.nexopia\.com|forums\.webosnation\.com|forums\.wpcentral\.com|fotki|fotki\.com|fotolog|fotolog\.com|foursquare|foursquare\.com|free\.facebook\.com|friendfeed|friendfeed\.com|fruehstueckstreff\.org|fubar|fubar\.com|gaiaonline|gaiaonline\.com|gamerdna|gamerdna\.com|gather\.com|geni\.com|getpocket\.com|glassboard|glassboard\.com|glassdoor|glassdoor\.com|godtube|godtube\.com|goldenline\.pl|goldstar|goldstar\.com|goo\.gl|gooblog|goodreads|goodreads\.com|google\+|googlegroups\.com|googleplus|govloop|govloop\.com|gowalla|gowalla\.com|gree\.jp|groups\.google\.com|gulli\.com|gutefrage\.net|habbo|habbo\.com|hi5|hi5\.com|hootsuite|hootsuite\.com|houzz|houzz\.com|hoverspot|hoverspot\.com|hr\.com|hu\.pinterest\.com|hubculture|hubculture\.com|hubpages\.com|hyves\.net|hyves\.nl|ibibo|ibibo\.com|id\.pinterest\.com|identi\.ca|ig|imageshack\.com|imageshack\.us|imvu|imvu\.com|in\.pinterest\.com|insanejournal|insanejournal\.com|instagram|instagram\.com|instapaper|instapaper\.com|internations\.org|interpals\.net|intherooms|intherooms\.com|irc-galleria\.net|is\.gd|italki|italki\.com|jammerdirect|jammerdirect\.com|jappy\.com|jappy\.de|kaboodle\.com|kakao|kakao\.com|kakaocorp\.com|kaneva|kaneva\.com|kin\.naver\.com|l\.facebook\.com|l\.instagram\.com|l\.messenger\.com|last\.fm|librarything|librarything\.com|lifestream\.aol\.com|line|line\.me|linkedin|linkedin\.com|listal|listal\.com|listography|listography\.com|livedoor\.com|livedoorblog|livejournal|livejournal\.com|lm\.facebook\.com|lnkd\.in|m\.blog\.naver\.com|m\.cafe\.naver\.com|m\.facebook\.com|m\.kin\.naver\.com|m\.vk\.com|m\.yelp\.com|mbga\.jp|medium\.com|meetin\.org|meetup|meetup\.com|meinvz\.net|meneame\.net|menuism\.com|messages\.google\.com|messages\.yahoo\.co\.jp|messenger|messenger\.com|mix\.com|mixi\.jp|mobile\.facebook\.com|mocospace|mocospace\.com|mouthshut|mouthshut\.com|movabletype|movabletype\.com|mubi|mubi\.com|my\.opera\.com|myanimelist\.net|myheritage|myheritage\.com|mylife|mylife\.com|mymodernmet|mymodernmet\.com|myspace|myspace\.com|netvibes|netvibes\.com|news\.ycombinator\.com|newsshowcase|nexopia|ngopost\.org|niconico|nicovideo\.jp|nightlifelink|nightlifelink\.com|ning|ning\.com|nl\.pinterest\.com|odnoklassniki\.ru|odnoklassniki\.ua|okwave\.jp|old\.reddit\.com|oneworldgroup\.org|onstartups|onstartups\.com|opendiary|opendiary\.com|oshiete\.goo\.ne\.jp|out\.reddit\.com|over-blog\.com|overblog\.com|paper\.li|partyflock\.nl|photobucket|photobucket\.com|pinboard|pinboard\.in|pingsta|pingsta\.com|pinterest|pinterest\.at|pinterest\.ca|pinterest\.ch|pinterest\.cl|pinterest\.co\.kr|pinterest\.co\.uk|pinterest\.com|pinterest\.com\.au|pinterest\.com\.mx|pinterest\.de|pinterest\.es|pinterest\.fr|pinterest\.it|pinterest\.jp|pinterest\.nz|pinterest\.ph|pinterest\.pt|pinterest\.ru|pinterest\.se|pixiv\.net|pl\.pinterest\.com|playahead\.se|plurk|plurk\.com|plus\.google\.com|plus\.url\.google\.com|pocket\.co|posterous|posterous\.com|pro\.homeadvisor\.com|pulse\.yahoo\.com|qapacity|qapacity\.com|quechup|quechup\.com|quora|quora\.com|qzone\.qq\.com|ravelry|ravelry\.com|reddit|reddit\.com|redux|redux\.com|renren|renren\.com|researchgate\.net|reunion|reunion\.com|reverbnation|reverbnation\.com|rtl\.de|ryze|ryze\.com|salespider|salespider\.com|scoop\.it|screenrant|screenrant\.com|scribd|scribd\.com|scvngr|scvngr\.com|secondlife|secondlife\.com|serverfault|serverfault\.com|shareit|sharethis|sharethis\.com|shvoong\.com|sites\.google\.com|skype|skyrock|skyrock\.com|slashdot\.org|slideshare\.net|smartnews\.com|snapchat|snapchat\.com|social|sociallife\.com\.br|socialvibe|socialvibe\.com|spaces\.live\.com|spoke|spoke\.com|spruz|spruz\.com|ssense\.com|stackapps|stackapps\.com|stackexchange|stackexchange\.com|stackoverflow|stackoverflow\.com|stardoll\.com|stickam|stickam\.com|studivz\.net|suomi24\.fi|superuser|superuser\.com|sweeva|sweeva\.com|t\.co|t\.me|tagged|tagged\.com|taggedmail|taggedmail\.com|talkbiznow|talkbiznow\.com|taringa\.net|techmeme|techmeme\.com|tencent|tencent\.com|tiktok|tiktok\.com|tinyurl|tinyurl\.com|toolbox|toolbox\.com|touch\.facebook\.com|tr\.pinterest\.com|travellerspoint|travellerspoint\.com|tripadvisor|tripadvisor\.com|trombi|trombi\.com|trustpilot|tudou|tudou\.com|tuenti|tuenti\.com|tumblr|tumblr\.com|tweetdeck|tweetdeck\.com|twitter|twitter\.com|twoo\.com|typepad|typepad\.com|unblog\.fr|urbanspoon\.com|ushareit\.com|ushi\.cn|vampirefreaks|vampirefreaks\.com|vampirerave|vampirerave\.com|vg\.no|video\.ibm\.com|vk\.com|vkontakte\.ru|wakoopa|wakoopa\.com|wattpad|wattpad\.com|web\.facebook\.com|web\.skype\.com|webshots|webshots\.com|wechat|wechat\.com|weebly|weebly\.com|weibo|weibo\.com|wer-weiss-was\.de|weread|weread\.com|whatsapp|whatsapp\.com|wiki\.answers\.com|wikihow\.com|wikitravel\.org|woot\.com|wordpress|wordpress\.com|wordpress\.org|xanga|xanga\.com|xing|xing\.com|yahoo-mbga\.jp|yammer|yammer\.com|yelp|yelp\.co\.uk|yelp\.com|youroom\.in|za\.pinterest\.com|zalo|zoo\.gr|zooppa|zooppa\.com)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-video","test":(v) => new RegExp("^(?:blog\.twitch\.tv|crackle|crackle\.com|curiositystream|curiositystream\.com|d\.tube|dailymotion|dailymotion\.com|dashboard\.twitch\.tv|disneyplus|disneyplus\.com|fast\.wistia\.net|help\.hulu\.com|help\.netflix\.com|hulu|hulu\.com|id\.twitch\.tv|iq\.com|iqiyi|iqiyi\.com|jobs\.netflix\.com|justin\.tv|m\.twitch\.tv|m\.youtube\.com|music\.youtube\.com|netflix|netflix\.com|player\.twitch\.tv|player\.vimeo\.com|ted|ted\.com|twitch|twitch\.tv|utreon|utreon\.com|veoh|veoh\.com|viadeo\.journaldunet\.com|vimeo|vimeo\.com|wistia|wistia\.com|youku|youku\.com|youtube|youtube\.com)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"display","test":(v) => new RegExp("^(?:display|banner|expandable|interstitial|cpm)$", "i").test(v.utmMedium)},{"name":"paid-other","test":(v) => new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"organic-shopping","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) || new RegExp("^(.*(([^a-df-z]|^)shop|shopping).*)$", "i").test(v.utmCampaign)},{"name":"organic-social","test":(v) => new RegExp("^(?:43things|43things\.com|51\.com|5ch\.net|Hatena|ImageShack|academia\.edu|activerain|activerain\.com|activeworlds|activeworlds\.com|addthis|addthis\.com|airg\.ca|allnurses\.com|allrecipes\.com|alumniclass|alumniclass\.com|ameba\.jp|ameblo\.jp|americantowns|americantowns\.com|amp\.reddit\.com|ancestry\.com|anobii|anobii\.com|answerbag|answerbag\.com|answers\.yahoo\.com|aolanswers|aolanswers\.com|apps\.facebook\.com|ar\.pinterest\.com|artstation\.com|askubuntu|askubuntu\.com|asmallworld\.com|athlinks|athlinks\.com|away\.vk\.com|awe\.sm|b\.hatena\.ne\.jp|baby-gaga|baby-gaga\.com|babyblog\.ru|badoo|badoo\.com|bebo|bebo\.com|beforeitsnews|beforeitsnews\.com|bharatstudent|bharatstudent\.com|biip\.no|biswap\.org|bit\.ly|blackcareernetwork\.com|blackplanet|blackplanet\.com|blip\.fm|blog\.com|blog\.feedspot\.com|blog\.goo\.ne\.jp|blog\.naver\.com|blog\.yahoo\.co\.jp|blogg\.no|bloggang\.com|blogger|blogger\.com|blogher|blogher\.com|bloglines|bloglines\.com|blogs\.com|blogsome|blogsome\.com|blogspot|blogspot\.com|blogster|blogster\.com|blurtit|blurtit\.com|bookmarks\.yahoo\.co\.jp|bookmarks\.yahoo\.com|br\.pinterest\.com|brightkite|brightkite\.com|brizzly|brizzly\.com|business\.facebook\.com|buzzfeed|buzzfeed\.com|buzznet|buzznet\.com|cafe\.naver\.com|cafemom|cafemom\.com|camospace|camospace\.com|canalblog\.com|care\.com|care2|care2\.com|caringbridge\.org|catster|catster\.com|cbnt\.io|cellufun|cellufun\.com|centerblog\.net|chat\.zalo\.me|chegg\.com|chicagonow|chicagonow\.com|chiebukuro\.yahoo\.co\.jp|classmates|classmates\.com|classquest|classquest\.com|co\.pinterest\.com|cocolog-nifty|cocolog-nifty\.com|copainsdavant\.linternaute\.com|couchsurfing\.org|cozycot|cozycot\.com|cross\.tv|crunchyroll|crunchyroll\.com|cyworld|cyworld\.com|cz\.pinterest\.com|d\.hatena\.ne\.jp|dailystrength\.org|deluxe\.com|deviantart|deviantart\.com|dianping|dianping\.com|digg|digg\.com|diigo|diigo\.com|discover\.hubpages\.com|disqus|disqus\.com|dogster|dogster\.com|dol2day|dol2day\.com|doostang|doostang\.com|dopplr|dopplr\.com|douban|douban\.com|draft\.blogger\.com|draugiem\.lv|drugs-forum|drugs-forum\.com|dzone|dzone\.com|edublogs\.org|elftown|elftown\.com|epicurious\.com|everforo\.com|exblog\.jp|extole|extole\.com|facebook|facebook\.com|faceparty|faceparty\.com|fandom\.com|fanpop|fanpop\.com|fark|fark\.com|fb|fb\.me|fc2|fc2\.com|feedspot|feministing|feministing\.com|filmaffinity|filmaffinity\.com|flickr|flickr\.com|flipboard|flipboard\.com|folkdirect|folkdirect\.com|foodservice|foodservice\.com|forums\.androidcentral\.com|forums\.crackberry\.com|forums\.imore\.com|forums\.nexopia\.com|forums\.webosnation\.com|forums\.wpcentral\.com|fotki|fotki\.com|fotolog|fotolog\.com|foursquare|foursquare\.com|free\.facebook\.com|friendfeed|friendfeed\.com|fruehstueckstreff\.org|fubar|fubar\.com|gaiaonline|gaiaonline\.com|gamerdna|gamerdna\.com|gather\.com|geni\.com|getpocket\.com|glassboard|glassboard\.com|glassdoor|glassdoor\.com|godtube|godtube\.com|goldenline\.pl|goldstar|goldstar\.com|goo\.gl|gooblog|goodreads|goodreads\.com|google\+|googlegroups\.com|googleplus|govloop|govloop\.com|gowalla|gowalla\.com|gree\.jp|groups\.google\.com|gulli\.com|gutefrage\.net|habbo|habbo\.com|hi5|hi5\.com|hootsuite|hootsuite\.com|houzz|houzz\.com|hoverspot|hoverspot\.com|hr\.com|hu\.pinterest\.com|hubculture|hubculture\.com|hubpages\.com|hyves\.net|hyves\.nl|ibibo|ibibo\.com|id\.pinterest\.com|identi\.ca|ig|imageshack\.com|imageshack\.us|imvu|imvu\.com|in\.pinterest\.com|insanejournal|insanejournal\.com|instagram|instagram\.com|instapaper|instapaper\.com|internations\.org|interpals\.net|intherooms|intherooms\.com|irc-galleria\.net|is\.gd|italki|italki\.com|jammerdirect|jammerdirect\.com|jappy\.com|jappy\.de|kaboodle\.com|kakao|kakao\.com|kakaocorp\.com|kaneva|kaneva\.com|kin\.naver\.com|l\.facebook\.com|l\.instagram\.com|l\.messenger\.com|last\.fm|librarything|librarything\.com|lifestream\.aol\.com|line|line\.me|linkedin|linkedin\.com|listal|listal\.com|listography|listography\.com|livedoor\.com|livedoorblog|livejournal|livejournal\.com|lm\.facebook\.com|lnkd\.in|m\.blog\.naver\.com|m\.cafe\.naver\.com|m\.facebook\.com|m\.kin\.naver\.com|m\.vk\.com|m\.yelp\.com|mbga\.jp|medium\.com|meetin\.org|meetup|meetup\.com|meinvz\.net|meneame\.net|menuism\.com|messages\.google\.com|messages\.yahoo\.co\.jp|messenger|messenger\.com|mix\.com|mixi\.jp|mobile\.facebook\.com|mocospace|mocospace\.com|mouthshut|mouthshut\.com|movabletype|movabletype\.com|mubi|mubi\.com|my\.opera\.com|myanimelist\.net|myheritage|myheritage\.com|mylife|mylife\.com|mymodernmet|mymodernmet\.com|myspace|myspace\.com|netvibes|netvibes\.com|news\.ycombinator\.com|newsshowcase|nexopia|ngopost\.org|niconico|nicovideo\.jp|nightlifelink|nightlifelink\.com|ning|ning\.com|nl\.pinterest\.com|odnoklassniki\.ru|odnoklassniki\.ua|okwave\.jp|old\.reddit\.com|oneworldgroup\.org|onstartups|onstartups\.com|opendiary|opendiary\.com|oshiete\.goo\.ne\.jp|out\.reddit\.com|over-blog\.com|overblog\.com|paper\.li|partyflock\.nl|photobucket|photobucket\.com|pinboard|pinboard\.in|pingsta|pingsta\.com|pinterest|pinterest\.at|pinterest\.ca|pinterest\.ch|pinterest\.cl|pinterest\.co\.kr|pinterest\.co\.uk|pinterest\.com|pinterest\.com\.au|pinterest\.com\.mx|pinterest\.de|pinterest\.es|pinterest\.fr|pinterest\.it|pinterest\.jp|pinterest\.nz|pinterest\.ph|pinterest\.pt|pinterest\.ru|pinterest\.se|pixiv\.net|pl\.pinterest\.com|playahead\.se|plurk|plurk\.com|plus\.google\.com|plus\.url\.google\.com|pocket\.co|posterous|posterous\.com|pro\.homeadvisor\.com|pulse\.yahoo\.com|qapacity|qapacity\.com|quechup|quechup\.com|quora|quora\.com|qzone\.qq\.com|ravelry|ravelry\.com|reddit|reddit\.com|redux|redux\.com|renren|renren\.com|researchgate\.net|reunion|reunion\.com|reverbnation|reverbnation\.com|rtl\.de|ryze|ryze\.com|salespider|salespider\.com|scoop\.it|screenrant|screenrant\.com|scribd|scribd\.com|scvngr|scvngr\.com|secondlife|secondlife\.com|serverfault|serverfault\.com|shareit|sharethis|sharethis\.com|shvoong\.com|sites\.google\.com|skype|skyrock|skyrock\.com|slashdot\.org|slideshare\.net|smartnews\.com|snapchat|snapchat\.com|social|sociallife\.com\.br|socialvibe|socialvibe\.com|spaces\.live\.com|spoke|spoke\.com|spruz|spruz\.com|ssense\.com|stackapps|stackapps\.com|stackexchange|stackexchange\.com|stackoverflow|stackoverflow\.com|stardoll\.com|stickam|stickam\.com|studivz\.net|suomi24\.fi|superuser|superuser\.com|sweeva|sweeva\.com|t\.co|t\.me|tagged|tagged\.com|taggedmail|taggedmail\.com|talkbiznow|talkbiznow\.com|taringa\.net|techmeme|techmeme\.com|tencent|tencent\.com|tiktok|tiktok\.com|tinyurl|tinyurl\.com|toolbox|toolbox\.com|touch\.facebook\.com|tr\.pinterest\.com|travellerspoint|travellerspoint\.com|tripadvisor|tripadvisor\.com|trombi|trombi\.com|trustpilot|tudou|tudou\.com|tuenti|tuenti\.com|tumblr|tumblr\.com|tweetdeck|tweetdeck\.com|twitter|twitter\.com|twoo\.com|typepad|typepad\.com|unblog\.fr|urbanspoon\.com|ushareit\.com|ushi\.cn|vampirefreaks|vampirefreaks\.com|vampirerave|vampirerave\.com|vg\.no|video\.ibm\.com|vk\.com|vkontakte\.ru|wakoopa|wakoopa\.com|wattpad|wattpad\.com|web\.facebook\.com|web\.skype\.com|webshots|webshots\.com|wechat|wechat\.com|weebly|weebly\.com|weibo|weibo\.com|wer-weiss-was\.de|weread|weread\.com|whatsapp|whatsapp\.com|wiki\.answers\.com|wikihow\.com|wikitravel\.org|woot\.com|wordpress|wordpress\.com|wordpress\.org|xanga|xanga\.com|xing|xing\.com|yahoo-mbga\.jp|yammer|yammer\.com|yelp|yelp\.co\.uk|yelp\.com|youroom\.in|za\.pinterest\.com|zalo|zoo\.gr|zooppa|zooppa\.com)$", "i").test(v.utmSource) || new RegExp("^(?:social|social-network|social-media|sm|social network|social media)$", "i").test(v.utmMedium)},{"name":"organic-video","test":(v) => new RegExp("^(?:blog\.twitch\.tv|crackle|crackle\.com|curiositystream|curiositystream\.com|d\.tube|dailymotion|dailymotion\.com|dashboard\.twitch\.tv|disneyplus|disneyplus\.com|fast\.wistia\.net|help\.hulu\.com|help\.netflix\.com|hulu|hulu\.com|id\.twitch\.tv|iq\.com|iqiyi|iqiyi\.com|jobs\.netflix\.com|justin\.tv|m\.twitch\.tv|m\.youtube\.com|music\.youtube\.com|netflix|netflix\.com|player\.twitch\.tv|player\.vimeo\.com|ted|ted\.com|twitch|twitch\.tv|utreon|utreon\.com|veoh|veoh\.com|viadeo\.journaldunet\.com|vimeo|vimeo\.com|wistia|wistia\.com|youku|youku\.com|youtube|youtube\.com)$", "i").test(v.utmSource) || new RegExp("^(.*video.*)$", "i").test(v.utmMedium)},{"name":"organic-search","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) || v.utmMedium.toLowerCase() === "organic"},{"name":"referral","test":(v) => new RegExp("^(?:referral|app|link)$", "i").test(v.utmMedium)},{"name":"email","test":(v) => new RegExp("^(?:email|e-mail|e_mail|e mail)$", "i").test(v.utmMedium) || new RegExp("^(?:email|e-mail|e_mail|e mail)$", "i").test(v.utmSource)},{"name":"affiliate","test":(v) => v.utmMedium.toLowerCase() === "affiliate"},{"name":"audio","test":(v) => v.utmMedium.toLowerCase() === "audio"},{"name":"sms","test":(v) => v.utmSource.toLowerCase() === "sms" || v.utmMedium.toLowerCase() === "sms"},{"name":"mobile-push-notification","test":(v) => v.utmSource.toLowerCase() === "firebase" || new RegExp("(?:.*mobile.*|.*notification.*|push$)", "i").test(v.utmMedium)}].find(i=>i.test(t))?.name??"other"}getShopifyAnalyticsId(){const t=this.getCookie("_shopify_y");if(t)return t;try{const e=this.localStorageGet("Shoplift_ClientId");if(e)return e}catch{}return null}legacyGetCookieVisitor(){const t=this.getCookie("SHOPLIFT");return t===null?null:JSON.parse(t,F)}getCookie(t){const e=this.cookie.split("; ").filter(i=>i.split("=").at(0)===t).at(0);return e===void 0?null:e.split("=").slice(1).join("=")}monitorConsentChange(){document.addEventListener("visitorConsentCollected",t=>{(async()=>await this.onConsentChange(t.detail.analyticsAllowed,!0))()}),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>this.loadShopifyConsentApiWithRetry()):this.loadShopifyConsentApiWithRetry()}loadShopifyConsentApiWithRetry(){let t=0;const e=()=>{this.loadShopifyConsentApi()||t++<10&&window.setTimeout(e,100)};e()}loadShopifyConsentApi(){if(window.Shopify){this.log("Loading Shopify features");const t=async()=>{if(!window.Shopify){this.log("Shopify object missing... suddenly?");return}if(window.Shopify.customerPrivacy===void 0){this.log("Shopify CustomerPrivacy api still missing, trying again in 1000ms"),e=window.setTimeout(()=>{(async()=>await t())()},1e3);return}const i=window.Shopify.customerPrivacy.getTrackingConsent();await this.onConsentChange(window.Shopify.customerPrivacy.analyticsProcessingAllowed(),i==="yes")};let e=window.setTimeout(()=>{(async()=>await t())()},5e3);return window.Shopify.loadFeatures([{name:"consent-tracking-api",version:"0.1"}],i=>{(async()=>{if(window.clearTimeout(e),i){this.log("Error loading consent tracking",i);return}await t()})()}),!0}return!1}async onConsentChange(t,e){try{if(this.log("Consent change detected",t,e),this.state.essential.consentApproved=t,this.state.essential.hasConsentInteraction=e,!this.state.essential.consentApproved){this.state.essential.hasConsentInteraction&&(this.state.analytics.queue.length=0),this.saveState();return}this.cookie=document.cookie,this.shopifyAnalyticsId=this.getShopifyAnalyticsId();for(const i of this.state.analytics.queue.filter(s=>s.type===1||s.type===2)){const s=i;s.shopifyAnalyticsId=this.shopifyAnalyticsId}this.saveState(),await this.syncAllEvents()}catch(i){this.log("Error syncing on consent change",i)}}isThemePreview(){return isThemePreview||themeRole!=="main"}isAppProxyPath(){const t=["/apps/","/tools/","/a/"],e=window.location.pathname;return t.some(i=>e.startsWith(i))}clearThemeBar(t,e,i){const s=structuredClone(i);this.log("Looking for theme bar"),this.waitForElement(null,"body").then(r=>this.waitForElement(r,"#preview-bar-iframe, #PBarNextFrameWrapper").then(n=>(this.log("Found theme bar"),e&&(this.log("Removing theme bar"),n.remove()),t?this.makeRequest({url:`${this.eventHost}/api/v0/logs`,method:"post",data:JSON.stringify({...this.debugState(),stateAtEvaluation:s},X)}):Promise.resolve(null)))).catch(r=>console.error(r))}waitForElement(t,e){return new Promise(i=>{const s=document.querySelector(e);if(s){i(s);return}const r=new MutationObserver(n=>{const o=document.querySelector(e);if(o){r.disconnect(),i(o);return}});r.observe(t??document.documentElement,{childList:!0})})}setDebug(t){this.state.essential.debugMode=t,this.saveState()}log(t,...e){let i=0;const s=t.replace(/%[sdoOfF]/g,r=>{if(i>=e.length)return r;const n=e[i++];return r==="%o"||r==="%O"?JSON.stringify(n):String(n)});this.logHistory.push(`[${new Date().toISOString()}][SL] ${s}`),!(!this.state.essential.debugMode&&!this.shopliftDebug)&&console.debug(`[SL] ${t}`,...e)}debugState(){return{state:this.state,storage:{essential:this.loadLocalStorage(this.essentialSessionKey),analytics:this.loadLocalStorage(this.analyticsSessionKey)},params:{shop:this.shop,host:this.host,eventHost:this.eventHost,cssHideClass:this.cssHideClass,testConfigs:this.testConfigs,inactiveTestConfigs:this.inactiveTestConfigs,sendPageView:this.sendPageView,isShopifyMerchantCookie:this.getCookie("is_shopify_merchant"),themeId,url:window.location.href,isThemePreview,themeRole,gaConfig:this.gaConfig},logHistory:this.logHistory}}createViewportObserver(t,e={}){const{threshold:i=this.VIEWPORT_TRACK_THRESHOLD,triggerOnce:s=!0}=e,r=new Set;return new IntersectionObserver(n=>{n.forEach(o=>{if(o.isIntersecting&&!r.has(o.target)){const l=o.target,c=l.getAttribute(this.DATA_SL_TEST_ID);c&&(t(c,l),s&&r.add(l))}})},{threshold:i})}applyChangesWithViewport(t,e,i,s){const r=e.selectorsForViewportTracking??e.selectors,n=o=>{if(this.state.essential.visitorTests.some(h=>h.testId===o)||this.activeViewportObservers.has(o))return;const l=[];if(r.forEach(h=>{t.querySelectorAll(h.cssSelector).forEach(b=>l.push(b))}),l.length===0)return;let c=!1;const d=()=>{c||(c=!0,i(o),p.disconnect(),this.activeViewportObservers.delete(o))},p=this.createViewportObserver(()=>{d()},{triggerOnce:!0,...s});this.activeViewportObservers.set(o,p),this.log(`Created viewport observer for test ${o}, observing ${l.length} elements`),l.forEach(h=>{h.setAttribute(this.DATA_SL_TEST_ID,String(o)),p.observe(h)}),setTimeout(()=>{c||l.forEach(h=>{const u=h.getBoundingClientRect(),b=s?.threshold??this.VIEWPORT_TRACK_THRESHOLD,k=Math.min(u.bottom,window.innerHeight)-Math.max(u.top,0),S=Math.min(u.right,window.innerWidth)-Math.max(u.left,0);u.top<window.innerHeight&&u.bottom>0&&u.left<window.innerWidth&&u.right>0&&k>0&&S>0&&k>=u.height*b&&(this.log(`Price element already visible in viewport for test ${o}:`,h),d())})},100)};e.selectors.length>0&&N(t,e,()=>{}),bt(t,{testId:e.testId,hypothesisId:e.hypothesisId,selectors:r},o=>{n(o)})}applyPriceTestWithMapLookup(t,e,i,s){if(!e.priceData){this.log("No price data for hypothesis '%s'",e.id);return}this.log("Hypothesis '%s' isControl=%s, priceData has %d variants",e.id,e.isControl,e.priceData.variants.length);const r=e.priceData.variants.slice(0,3);for(const[S,P,_]of r)this.log("  Sample priceData: variant=%s, price=%d, compareAt=%d",S,P,_);const n=j(e.priceData),o=new Set;for(const S of i)if(S.priceData)for(const[P]of S.priceData.variants)o.add(P);this.log("Price test Map lookup: %d products in hypothesis, %d total products to track",n.size,o.size);const l=e.priceData,c=new WeakSet;let d=!1;const p="[data-sl-attribute-p], [data-sl-attribute-cap], [data-sl-attribute-discount]",h=S=>{if(c.has(S))return;const P=S.getAttribute("data-sl-attribute-p"),_=S.getAttribute("data-sl-attribute-cap"),C=S.getAttribute("data-sl-attribute-discount"),m=P||_||C;if(!m||!o.has(m))return;c.add(S);const y=n.get(m);y&&(this.log("Applying price for product %s: %d cents (compare at: %d cents)",m,y.priceInCents,y.compareAtPriceInCents),Dt(S,m,y,l),this.log("Applied price to element for product %s",m)),!d&&!this.state.essential.visitorTests.some(w=>w.testId===t)&&(S.setAttribute(this.DATA_SL_TEST_ID,String(t)),this.setupElementViewportTracking(S,t,()=>{d||(d=!0,s(t))}))},u=()=>{const S=document.querySelectorAll(p);this.log("Scanning for price elements, found: %d",S.length),S.forEach(h)},b=new MutationObserver(S=>{for(const P of S)P.type==="childList"&&P.addedNodes.forEach(_=>{if(_.nodeType===Node.ELEMENT_NODE){const C=_;(C.hasAttribute("data-sl-attribute-p")||C.hasAttribute("data-sl-attribute-cap")||C.hasAttribute("data-sl-attribute-discount"))&&h(C),C.querySelectorAll(p).forEach(h)}}),P.type==="attributes"&&P.target instanceof Element&&h(P.target)}),k=document.body||document.documentElement;b.observe(k,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-sl-attribute-p","data-sl-attribute-cap","data-sl-attribute-discount"]}),this.log("MutationObserver started for price elements"),u(),document.readyState==="loading"&&document.addEventListener("DOMContentLoaded",()=>{this.log("DOMContentLoaded - rescanning for price elements"),u()}),setTimeout(()=>{this.log("Delayed rescan for price elements"),u()},100),setTimeout(()=>{this.log("Final rescan for price elements"),u()},500)}setupElementViewportTracking(t,e,i){const s=this.VIEWPORT_TRACK_THRESHOLD,r=t.getBoundingClientRect(),n=Math.min(r.bottom,window.innerHeight)-Math.max(r.top,0),o=Math.min(r.right,window.innerWidth)-Math.max(r.left,0);if(r.top<window.innerHeight&&r.bottom>0&&r.left<window.innerWidth&&r.right>0&&n>0&&o>0&&n>=r.height*s){this.log("Price element already visible for test %s",e),i();return}const c=new IntersectionObserver(d=>{for(const p of d)if(p.isIntersecting&&p.intersectionRatio>=s){this.log("Price element entered viewport for test %s",e),c.disconnect(),i();break}},{threshold:s});c.observe(t)}debug(){const t=this.debugState();console.log(JSON.stringify(t,X,2))}}(async function(){window.shopliftInstance||(window.shopliftInstance=new Wt("respirecosmetic.myshopify.com","https://app.shoplift.ai","https://events.shoplift.ai",true,false,false,{"sendEvents":false,"mode":"gtag"},false,false,1000,[{"id":"019dd448-1553-753c-b435-686218b29699","startAt":"2026-04-28T13:29:47.089029Z","requiresCountry":false,"bayesianRevision":5,"device":"all","status":"active","visitorOption":"new","ignoreTestViewParameterEnforcement":false,"statusHistory":[{"status":"active","createdAt":"2026-04-28T13:29:47.095512Z"}],"hypotheses":[{"visitorCount":3213,"trafficPercentage":0.3406334830774913,"title":"Soin Levres Collagene Booster","domSelectors":[],"id":"019dd43f-483b-79f9-b492-39deac94c71c","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":true,"redirectPath":"/pages/soin-levres-collagene-booster-1"},{"visitorCount":6219,"trafficPercentage":0.6593665169225087,"title":"PDP SLSPF","domSelectors":[],"id":"019dd440-1bc6-7ec2-8a25-3869c58bc05a","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":false,"redirectPath":"/products/soin-levres-collagene-booster"}],"targetAudiences":[],"title":"LP vs PDP Soin Lèvres"},{"id":"019e74f9-1ea1-7d45-8a70-8add8cc82de2","startAt":"2026-05-29T18:22:23.876543Z","requiresCountry":false,"bayesianRevision":5,"device":"all","status":"active","visitorOption":"all","ignoreTestViewParameterEnforcement":false,"statusHistory":[{"status":"active","createdAt":"2026-05-29T18:22:23.982802Z"}],"hypotheses":[{"visitorCount":5100,"trafficPercentage":0.5013226211210324,"title":"Nouveauté - Daily Protect","domSelectors":[],"id":"019e74f8-17c8-7bec-98fd-f3061d66dc30","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":true,"redirectPath":"/pages/nouveaute-daily-protect"},{"visitorCount":5073,"trafficPercentage":0.4986773788789675,"title":"Trio Haute Protection Solaire","domSelectors":[],"id":"019e74f8-f6a2-7f03-84b3-14f382d4f320","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":false,"redirectPath":"/products/trio-haute-protection"}],"targetAudiences":[],"title":"Untitled URL test"},{"id":"019f04b7-ca07-7499-bfbe-8f3e510f2900","startAt":"2026-06-26T16:16:21.486127Z","requiresCountry":false,"bayesianRevision":5,"device":"all","status":"active","visitorOption":"all","ignoreTestViewParameterEnforcement":false,"statusHistory":[{"status":"active","createdAt":"2026-06-26T16:16:21.559694Z"}],"hypotheses":[{"visitorCount":2,"trafficPercentage":0.737179487179487,"title":"Déodorant stick Vanille Tonka","domSelectors":[],"id":"019f04b7-540b-701f-96f1-ca718cee01e4","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":true,"redirectPath":"/products/deodorant-stick-vanille-tonka-1"},{"visitorCount":1,"trafficPercentage":0.26282051282051294,"title":"Kit Découverte Déodorant stick Vanille Tonka","domSelectors":[],"id":"019f04b7-7c0b-7756-9e08-80b8657f5429","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":false,"redirectPath":"/products/kit-decouverte-deodorant-stick-vanille-tonka"}],"targetAudiences":[],"title":"Untitled URL test"}],[{"id":"b34beb01-8e98-4647-bc5c-e6de002d3bc7","bayesianRevision":4,"status":"cancelled","hypotheses":[{"id":"25225939-1d3c-4bc7-bc65-a8fd8ddd401a","type":"theme","themeId":168474706256,"affix":"","isControl":true,"redirectPath":null},{"id":"a65de22d-0a0b-411b-9e46-2cee437ca994","type":"theme","themeId":177900945744,"affix":"","isControl":false,"redirectPath":null}],"ignoreTestViewParameterEnforcement":false}],null),await window.shopliftInstance.init())})();async function Gt(a,t,e,i){const s=Mt({log:i});if(e)return i("[SUB-PREVIEW] A side — no overlay applied; widget renders naturally"),s;const r=a.widget.widgetType,n=t?j(t):null;let o=W(t),l=K(a,o),c=l.discountMap,d=l.maxDiscount;function p(){const f=W(t);f!==o&&(o=f,l=K(a,o),c=l.discountMap,d=l.maxDiscount,i(`[SUB-PREVIEW] scope refreshed currentProductId=${o??"n/a"}, maxDiscount=${d}`))}i(`[SUB-PREVIEW] side=B, currentProductId=${o??"n/a"}, maxDiscount=${d}`);function h(f){if(!t||!n)return null;const v=Y(n),g=v?n.get(v):void 0;return g?{formattedVariantPrice:G(g.priceInCents,t),formattedDiscounted:G(g.priceInCents*(1-f/100),t)}:null}function u(f){const v=J(a,f);if(!v)return d;const g=D(a,"subscriptionInput"),I=g.length?g[0].selector:'input[name="rc_plan"]',A=v.querySelector(`${I}:checked`);if(A){const E=c[A.value];if(E!==void 0)return E}return d}function b(f){const v=D(a,"subscriptionDiscount");for(const g of v)if(g.selector.includes("badge")||g.selector.includes("__badge")){const I=f.querySelector(g.selector);I?.textContent&&!I.textContent.includes(`${d}%`)&&$(I,A=>U(A,d))}}function k(f,v){const g=h(v);if(!g)return;const I=D(a,"subscriptionCompareAt");for(const A of I){const E=f.querySelector(A.selector)||f.querySelector(`[part~="${A.selector}"]`);E?.textContent&&!E.textContent.includes(g.formattedVariantPrice)&&$(E,x=>/\d/.test(x)?g.formattedVariantPrice:x)}}function S(f,v){const g=h(v);if(!g)return;const I=D(a,"subscriptionPrice");for(const A of I){const E=f.querySelector(A.selector)||f.querySelector(`[part~="${A.selector}"]`);E?.textContent&&!E.textContent.includes(g.formattedDiscounted)&&$(E,x=>/\d/.test(x)?g.formattedDiscounted:x)}}function P(f){const v=D(a,"subscriptionInput"),g=v.length?v[0].selector:'input[name="rc_plan"]',I=D(a,"subscriptionPlanDiscount"),A=I.length?I[0].selector:".rc-plans-button__discount";for(const E of Array.from(f.querySelectorAll("label"))){const x=E.querySelector(g),R=E.querySelector(A);if(x&&R?.textContent){const V=c[x.value];if(V!==void 0){const O=R.textContent.match(/[\d.]+%/)?.[0];O&&O!==`${V}%`&&$(R,L=>U(L,V))}}}}function _(f){const v=f.querySelector("select");if(v)for(const g of Array.from(v.options)){const I=c[g.value];if(I!==void 0&&g.textContent){const A=g.textContent.match(/[\d.]+%/)?.[0];A&&A!==`${I}%`&&(g.textContent=U(g.textContent,I))}}}function C(f){const v=D(a,"onetimePrice");if(!v.length||!t||!n)return;const g=Y(n),I=g?n.get(g):void 0;if(!I)return;const A=G(I.priceInCents,t),E=D(a,"onetimeContainer"),x=E.length?E[0].selector:'[part~="rc-purchase-option__onetime"]',R=f.querySelector(x);if(R)for(const V of v){const O=R.querySelector(`[part~="${V.selector}"]`);O?.textContent&&!O.textContent.includes(A)&&$(O,L=>/\d/.test(L)?A:L)}}function m(f,v){const I=D(a,"subscriptionDiscount").filter(A=>A.selector.includes("benefit")||A.selector==="rc-benefits");for(const A of I){const E=f.querySelector(A.selector);if(E?.shadowRoot){for(const x of Array.from(E.shadowRoot.querySelectorAll("li")))if(x.textContent?.includes("Save")){const R=x.textContent.match(/[\d.]+%/)?.[0];R&&R!==`${v}%`&&$(x,V=>U(V,v))}}}}let y=!1;function w(){if(!y){y=!0;try{p();const f=B(a);if(!f)return;const v=u(f);b(f),k(f,v),S(f,v),C(f);const g=J(a,f);g&&(r==="buttons"||r==="radio"?P(g):_(g)),m(f,v)}finally{y=!1}}}const T=dt({data:a,runUpdates:w});return function(){T(),s()}}const jt=Object.freeze(Object.defineProperty({__proto__:null,subscriptionPreviewRender:Gt},Symbol.toStringTag,{value:"Module"}))})(); })("/", { suffix: "deodorants", type: "collection" }, "main", 181964374352, false)</script>
<!-- End of Shoplift scripts -->

 <!-- 2026-06-25T15:09:41.5405807Z -->
<style>.shoplift-hide { opacity: 0 !important; }</style>
<style id="sl-preview-bar-hide">#preview-bar-iframe, #PBarNextFrameWrapper { display: none !important; }</style>
<script type="text/javascript">(function(rootPath, template, themeRole, themeId, isThemePreview){ /* Generated on 2026-06-29T15:03:03.2984985Z */(function(){"use strict";var tt=document.createElement("style");tt.textContent=`#shoplift-preview-control{position:fixed;max-width:332px;height:56px;background-color:#141414;z-index:9999;bottom:20px;display:flex;border-radius:8px;box-shadow:13px 22px 7px #0000,9px 14px 7px #00000003,5px 8px 6px #0000000d,2px 4px 4px #00000017,1px 1px 2px #0000001a,0 0 #0000001a;align-items:center;margin:0 auto;left:16px;right:16px;opacity:0;transform:translateY(20px);visibility:hidden;transition:opacity .4s ease-in-out,transform .4s ease-in-out,visibility 0s .4s}#shoplift-preview-control.visible{opacity:1;transform:translateY(0);visibility:visible;transition:opacity .4s ease-in-out,transform .4s ease-in-out,visibility 0s 0s}#shoplift-preview-control *{font-family:Inter,sans-serif;color:#fff;box-sizing:border-box;font-size:16px}#shoplift-preview-variant-title{font-weight:400;line-height:140%;font-size:16px;text-align:start;letter-spacing:-.16px;flex-grow:1;text-wrap:nowrap;overflow:hidden;text-overflow:ellipsis}#shoplift-preview-variant-selector{position:relative;display:block;padding:6px 0;height:100%;min-width:0;flex:1 1 auto}#shoplift-preview-variant-menu-trigger{border:none;cursor:pointer;width:100%;background-color:transparent;padding:0 16px;border-left:1px solid #333;border-right:1px solid #333;height:100%;display:flex;align-items:center;justify-content:start;gap:8px}#shoplift-preview-variant-selector .menu-variant-label{width:24px;height:24px;border-radius:50%;padding:6px;display:flex;justify-content:center;align-items:center;font-size:12px;font-style:normal;font-weight:600;line-height:100%;letter-spacing:-.12px;flex-shrink:0}#shoplift-preview-variant-selector .preview-variant-menu{position:absolute;bottom:110%;transform:translate3d(0,20px,0);visibility:hidden;pointer-events:none;opacity:0;cursor:pointer;background-color:#141414;border:1px solid #141414;border-radius:6px;width:100%;max-height:156px;overflow-y:auto;box-shadow:0 8px 16px #0003;z-index:1;transition:opacity .3s ease-in-out,transform .3s ease-in-out,visibility 0s .3s}#shoplift-preview-variant-selector .preview-variant-menu.preview-variant-menu__visible{visibility:visible;pointer-events:auto;opacity:100;transform:translateZ(0);transition:opacity .3s ease-in-out,transform .3s ease-in-out,visibility 0s 0s}@media screen and (max-width:400px){#shoplift-preview-variant-selector .preview-variant-menu{position:fixed;left:0;right:0;width:auto;bottom:110%}}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item{padding:12px 16px;display:flex;overflow:hidden}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item .menu-variant-label{margin-right:6px}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item span{overflow:hidden;text-overflow:ellipsis;text-wrap:nowrap;white-space:nowrap;color:#f6f6f6;font-size:14px;font-style:normal;font-weight:500}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:hover{background-color:#545454}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:last-of-type{border-bottom-left-radius:6px;border-bottom-right-radius:6px}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:first-of-type{border-top-left-radius:6px;border-top-right-radius:6px}#shoplift-preview-control div:has(#shoplift-exit-preview-button){padding:0 16px}#shoplift-exit-preview-button{padding:6px 8px;font-weight:500;line-height:75%;border-radius:4px;background-color:transparent;border:none;text-decoration:none}#shoplift-exit-preview-button:hover{cursor:pointer;background-color:#333}#shoplift-preview-subscription-warning{position:relative;display:flex;align-items:center;gap:6px;padding:6px 10px;margin:0 4px;border-left:1px solid #333;cursor:help;outline:none}#shoplift-preview-subscription-warning__icon{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background-color:#f59e0b;color:#141414!important;font-weight:700;font-size:12px!important;line-height:1;flex-shrink:0}#shoplift-preview-subscription-warning__label{font-size:13px!important;font-weight:500;color:#fbbf24!important;text-wrap:nowrap;white-space:nowrap}#shoplift-preview-subscription-warning__tooltip{position:absolute;bottom:calc(100% + 8px);right:0;max-width:320px;width:max-content;padding:10px 12px;border-radius:6px;background-color:#1f1f1f;color:#fff!important;font-size:12px!important;line-height:1.4!important;box-shadow:0 8px 16px #0000004d;z-index:10000;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .2s ease-in-out,transform .2s ease-in-out,visibility 0s .2s;pointer-events:none}#shoplift-preview-subscription-warning__tooltip.shoplift-preview-subscription-warning__tooltip--visible{opacity:1;visibility:visible;transform:translateY(0);transition:opacity .2s ease-in-out,transform .2s ease-in-out,visibility 0s 0s}#shoplift-preview-subscription-warning:focus-visible{box-shadow:inset 0 0 0 2px #f59e0b;border-radius:4px}#shoplift-preview-control:has(#shoplift-preview-subscription-warning){max-width:480px}/*$vite$:1*/`,document.head.appendChild(tt);var ht=" daum[ /]| deusu/| yadirectfetcher|(?:^|[^g])news(?!sapphire)|(?<! (?:channel/|google/))google(?!(app|/google| pixel))|(?<! cu)bots?(?:\\b|_)|(?<!(?: ya| yandex|^job|inapp;) ?)search|(?<!(?:lib))http|(?<![hg]m)score|@[a-z][\\w-]+\\.|\\(\\)|\\.com|\\b\\d{13}\\b|^<|^[\\w \\.\\-\\(?:\\):]+(?:/v?\\d+(?:\\.\\d+)?(?:\\.\\d{1,10})*?)?(?:,|$)|^[^ ]{50,}$|^\\d+\\b|^\\w+/[\\w\\(\\)]*$|^active|^ad muncher|^amaya|^avsdevicesdk/|^biglotron|^bot|^bw/|^clamav[ /]|^client/|^cobweb/|^custom|^ddg[_-]android|^discourse|^dispatch/\\d|^downcast/|^duckduckgo|^facebook|^getright/|^gozilla/|^hobbit|^hotzonu|^hwcdn/|^jeode/|^jetty/|^jigsaw|^microsoft bits|^movabletype|^mozilla/\\d\\.\\d \\(compatible;?\\)$|^mozilla/\\d\\.\\d \\w*$|^navermailapp|^netsurf|^offline|^owler|^postman|^python|^rank|^read|^reed|^rest|^rss|^snapchat|^space bison|^svn|^swcd |^taringa|^thumbor/|^track|^valid|^w3c|^webbandit/|^webcopier|^wget|^whatsapp|^wordpress|^xenu link sleuth|^yahoo|^yandex|^zdm/\\d|^zoom marketplace/|^{{.*}}$|admin|analyzer|archive|ask jeeves/teoma|bit\\.ly/|bluecoat drtr|browsex|burpcollaborator|capture|catch|check|chrome-lighthouse|chromeframe|classifier|clean|cloud|crawl|cypress/|dareboost|datanyze|dejaclick|detect|dmbrowser|download|evc-batch/|feed|firephp|gomezagent|headless|httrack|hubspot marketing grader|hydra|ibisbrowser|images|insight|inspect|iplabel|ips-agent|java(?!;)|library|mail\\.ru/|manager|measure|neustar wpm|node|nutch|offbyone|optimize|pageburst|pagespeed|parser|perl|phantomjs|pingdom|powermarks|preview|proxy|ptst[ /]\\d|reputation|resolver|retriever|rexx;|rigor|rss\\b|scan|scrape|server|sogou|sparkler/|speedcurve|spider|splash|statuscake|synapse|synthetic|tools|torrent|trace|transcoder|url|virtuoso|wappalyzer|watch|webglance|webkit2png|whatcms/|zgrab",ft=/bot|spider|crawl|http|lighthouse/i,z;function gt(){if(z instanceof RegExp)return z;try{z=new RegExp(ht,"i")}catch{z=ft}return z}function mt(a){return!!a&&gt().test(a)}class Q{timestamp;constructor(){this.timestamp=new Date}}class yt extends Q{type;testId;hypothesisId;constructor(t,e,i){super(),this.type=3,this.testId=t,this.hypothesisId=e,this.timestamp=i}}class vt extends Q{type;path;constructor(t){super(),this.type=4,this.path=t}}class wt extends Q{type;cart;constructor(t){super(),this.type=5,this.cart=t}}class et extends Error{isBot;constructor(){super(),this.isBot=!0}}function bt(a,t,e){for(const i of t.selectors){const s=a.querySelectorAll(i.cssSelector);for(let r=0;r<s.length;r++)e(t.testId,t.hypothesisId)}st(a,t,(i,s,r,n,o)=>o(s,r),e)}function N(a,t,e){for(const i of t.selectors)rt(a,t.testId,t.hypothesisId,i,e??(()=>{}));st(a,t,rt,e??(()=>{}))}function it(a){return a.urlPatterns.reduce((t,e)=>{switch(e.operator){case"contains":return t+`.*${e}.*`;case"endsWith":return t+`.*${e}`;case"startsWith":return t+`${e}.*`}},"")}function st(a,t,e,i){new MutationObserver(()=>{for(const r of t.selectors)e(a,t.testId,t.hypothesisId,r,i)}).observe(a.documentElement,{childList:!0,subtree:!0})}function rt(a,t,e,i,s){const r=a.querySelectorAll(i.cssSelector);for(let n=0;n<r.length;n++){let o=r.item(n);if(o instanceof HTMLElement&&o.dataset.shoplift!==""){o.dataset.shoplift="";for(const l of i.actions.sort(kt))o=St(a,i.cssSelector,o,l)}}return r.length>0&&s?(s(t,e),!0):!1}function St(a,t,e,i){switch(i.type){case"innerHtml":e.innerHTML=i.value;break;case"attribute":Ct(e,i.scope,i.value);break;case"css":Tt(a,t,i.value);break;case"js":It(a,e,i);break;case"copy":return Pt(e);case"remove":At(e);break;case"move":Et(e,parseInt(i.value));break}return e}function Ct(a,t,e){a.setAttribute(t,e)}function Tt(a,t,e){const i=a.createElement("style");i.innerHTML=`${t} { ${e} }`,a.getElementsByTagName("head")[0]?.appendChild(i)}function It(a,t,e){Function("document","element",`"use strict"; ${e.value}`)(a,t)}function Pt(a){const t=a.cloneNode(!0);if(!a.parentNode)throw"Can't copy node outside of DOM";return a.parentNode.insertBefore(t,a.nextSibling),t}function At(a){a.remove()}function Et(a,t){if(t===0)return;const e=Array.prototype.slice.call(a.parentElement.children).indexOf(a),i=Math.min(Math.max(e+t,0),a.parentElement.children.length-1);a.parentElement.children.item(i).insertAdjacentElement(t>0?"afterend":"beforebegin",a)}function kt(a,t){return nt(a)-nt(t)}function nt(a){return a.type==="copy"||a.type==="remove"?0:1}var M=(a=>(a[a.Template=0]="Template",a[a.Theme=1]="Theme",a[a.UrlRedirect=2]="UrlRedirect",a[a.Script=3]="Script",a[a.Dom=4]="Dom",a[a.Price=5]="Price",a))(M||{});const xt="data:image/svg+xml,%3csvg%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M9.96001%207.90004C9.86501%207.90004%209.77001%207.86504%209.69501%207.79004L6.43501%204.53004C6.19501%204.29004%205.80501%204.29004%205.56501%204.53004L2.30501%207.79004C2.16001%207.93504%201.92001%207.93504%201.77501%207.79004C1.63001%207.64504%201.63001%207.40504%201.77501%207.26004L5.03501%204.00004C5.56501%203.47004%206.43001%203.47004%206.96501%204.00004L10.225%207.26004C10.37%207.40504%2010.37%207.64504%2010.225%207.79004C10.15%207.86004%2010.055%207.90004%209.96001%207.90004Z'%20fill='white'/%3e%3c/svg%3e",_t="data:image/svg+xml,%3csvg%20width='14'%20height='24'%20viewBox='0%200%2014%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M12.3976%2014.5255C12.2833%2013.8788%2012.0498%2013.3024%2011.6952%2012.7961C11.3416%2012.2898%2010.9209%2011.8353%2010.4353%2011.4317C9.94868%2011.0291%209.43546%2010.6488%208.89565%2010.292C8.48487%2010.049%208.09577%209.78565%207.72637%209.50402C7.35697%209.2224%207.08016%208.89503%206.89694%208.51987C6.71273%208.14471%206.67826%207.69533%206.79055%207.1697C6.86345%206.83216%206.97476%206.54647%207.12351%206.31162C7.27324%206.07778%207.47124%205.89986%207.7175%205.77684C7.96377%205.65483%208.21989%205.59383%208.48389%205.59383C8.88087%205.59383%209.17639%205.7016%209.3734%205.91714C9.56943%206.13268%209.68271%206.42345%209.71424%206.78946C9.74576%207.15547%209.72015%207.55401%209.63839%207.98509C9.55663%208.41617%209.43645%208.84724%209.27687%209.27934L13.5127%208.80149C13.9638%207.52656%2014.1017%206.42447%2013.9264%205.49725C13.751%204.56901%2013.2664%203.85122%2012.4724%203.34491C12.239%203.19648%2011.9779%203.07041%2011.6893%202.96569L12.0026%201.50979L9.86397%200L7.3875%201.50979L7.11169%202.78878C6.65166%202.8874%206.21724%203.01957%205.8114%203.19038C4.85292%203.594%204.06684%204.15115%203.45117%204.86385C2.83452%205.57655%202.42571%206.40108%202.22378%207.33847C2.06616%208.06947%202.04942%208.70796%202.17551%209.25087C2.30061%209.7948%202.52028%2010.2828%202.8355%2010.7139C3.14974%2011.145%203.51816%2011.5344%203.93977%2011.881C4.36039%2012.2288%204.782%2012.5521%205.20164%2012.851C5.68334%2013.1702%206.13844%2013.5169%206.56497%2013.8921C6.99052%2014.2672%207.31954%2014.7125%207.55004%2015.228C7.78055%2015.7445%207.81502%2016.3769%207.65347%2017.1262C7.56482%2017.5389%207.43676%2017.8765%207.27028%2018.1388C7.10381%2018.4011%206.89596%2018.5983%206.64772%2018.7295C6.3985%2018.8606%206.12071%2018.9267%205.8114%2018.9267C5.21641%2018.9267%204.79776%2018.6034%204.62833%2018.1632C4.4589%2017.7229%204.47367%2017.2583%204.60075%2016.5639C4.72782%2015.8705%205.05092%2015.1395%205.37107%2014.3699H1.17665C1.17665%2014.3699%200.207341%2016.1115%200.0310135%2017.6762C-0.0655232%2018.5302%200.0635208%2019.2653%200.41519%2019.8844C0.76686%2020.5036%201.33032%2020.9814%202.10655%2021.319C2.39222%2021.443%202.7104%2021.5447%203.05813%2021.623L2.54589%2024H7.17473L7.7047%2021.5386C8.08493%2021.442%208.43857%2021.3231%208.76562%2021.1787C9.73985%2020.7476%2010.52%2020.1427%2011.1071%2019.3649C11.6932%2018.5871%2012.0873%2017.7291%2012.2892%2016.7917C12.4744%2015.9295%2012.5099%2015.1741%2012.3966%2014.5275L12.3976%2014.5255Z'%20fill='white'/%3e%3c/svg%3e";async function Rt(a){let t=a.replace(/-/g,"+").replace(/_/g,"/");for(;t.length%4;)t+="=";const e=atob(t),i=Uint8Array.from(e,n=>n.charCodeAt(0)),s=new Blob([i]).stream().pipeThrough(new DecompressionStream("gzip")),r=await new Response(s).text();return JSON.parse(r)}function F(a,t){return typeof t=="string"&&/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+(?:Z|[+-]\d+)/.test(t)?new Date(t):t}function X(a,t){return t}function q(a,t=!1,e=!1,i=","){const s=a/100;if(e){const n=Math.round(s).toLocaleString("en-US");return i!==","?n.replace(/,/g,i):n}else{const r=t?",":".",n=s.toFixed(2).split("."),o=parseInt(n[0],10),l=n[1]??"00",c=o.toLocaleString("en-US");return i!==","?`${c.replace(/,/g,i)}${r}${l}`:t?`${c.replace(/,/g,".")}${r}${l}`:`${c}${r}${l}`}}function H(a,t,e,i){const s=t.replace("{{amount}}",q(a,!1,!1)).replace("{{amount_no_decimals}}",q(a,!1,!0)).replace("{{amount_with_comma_separator}}",q(a,!0,!1)).replace("{{amount_no_decimals_with_comma_separator}}",q(a,!0,!0)).replace("{{amount_with_space_separator}}",q(a,!1,!1," ")).replace("{{amount_no_decimals_with_space_separator}}",q(a,!1,!0," ")).replace("{{amount_with_apostrophe_separator}}",q(a,!1,!1,"'")).replace("{{amount_no_decimals_with_apostrophe_separator}}",q(a,!1,!0,"'")).replace("{{amount_with_period_and_space_separator}}",q(a,!1,!1,". ")).replace("{{amount_no_decimals_with_period_and_space_separator}}",q(a,!1,!0,". "));return i?`${s} ${e}`:s}function ot(a){return a.replace(/[^\d.,\s-]/g,"").trim()}function j(a){const t=new Map;for(const[e,i,s]of a.variants)t.set(e,{priceInCents:i,compareAtPriceInCents:s});return t}function Dt(a,t,e,i){const{priceInCents:s,compareAtPriceInCents:r}=e,{moneyFormat:n,currency:o,currencyCodeEnabled:l}=i;if(a.getAttribute("data-sl-attribute-p")===t)a.innerHTML=H(s,n,o,l);else if(a.getAttribute("data-sl-attribute-cap")===t)r<=0||r<=s?a.remove():a.innerHTML=H(r,n,o,l);else if(a.getAttribute("data-sl-attribute-discount")===t&&!(r<=0||r<=s)){const d=Math.round((r-s)/r*100),p=ot(H(r-s,n,o,!1)),h=a.getAttribute("data-sl-format")||"percent";h==="percent"?a.textContent=`-${d}%`:h==="amount"?a.textContent=`-${p}`:h==="both"&&(a.textContent=`-${d}% (-${p})`)}}function Ot(a){const t=[],e={id:"url-pattern",operator:"contains",value:"/"};for(const[i,s,r]of a.variants){t.push({id:`p-${i}`,cssSelector:`[data-sl-attribute-p="${i}"]`,urlPatterns:[e],actions:[{id:`p-action-${i}`,type:"innerHtml",scope:"price",value:H(s,a.moneyFormat,a.currency,a.currencyCodeEnabled)}]});const n=r<=0||r<=s;if(t.push({id:`cap-${i}`,cssSelector:`[data-sl-attribute-cap="${i}"]`,urlPatterns:[e],actions:[{id:`cap-action-${i}`,type:n?"remove":"innerHtml",scope:"compare-at-price",value:n?"":H(r,a.moneyFormat,a.currency,a.currencyCodeEnabled)}]}),!n&&r>s){const o=Math.round((r-s)/r*100),l=ot(H(r-s,a.moneyFormat,a.currency,!1));t.push({id:`d-${i}`,cssSelector:`[data-sl-attribute-discount="${i}"]`,urlPatterns:[e],actions:[{id:`d-action-${i}`,type:"js",scope:null,value:`var format = element.getAttribute('data-sl-format') || 'percent';                    if (format === 'percent') {                      element.textContent = '-${o}%';                    } else if (format === 'amount') {                      element.textContent = '-${l}';                    } else if (format === 'both') {                      element.textContent = '-${o}% (-${l})';                    }`}]})}}return t}const Jt="modulepreload",Yt=function(a){return"/"+a},Zt={},Vt=function(t,e,i){let s=Promise.resolve();function r(n){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=n,window.dispatchEvent(o),!o.defaultPrevented)throw n}return s.then(n=>{for(const o of n||[])o.status==="rejected"&&r(o.reason);return t().catch(r)})};function at(a,t,e){const i=e?a.plans.filter(c=>!c.variantId||c.variantId===e):a.plans,s=[],r=[];for(const c of i)c.direction==="decrease"?(s.push(c.existingShopifyPlanId),r.push(c.createdShopifyPlanId)):(s.push(c.createdShopifyPlanId),r.push(c.existingShopifyPlanId));const n=t?s:r,o=t?r:s;if(e)for(const c of a.plans)for(const d of[c.existingShopifyPlanId,c.createdShopifyPlanId])d&&!n.includes(d)&&!o.includes(d)&&o.push(d);const l={};for(let c=0;c<o.length;c++){const d=o[c],p=n[c];d&&p&&(l[d]=p)}return{showPlanIds:n,hidePlanIds:o,swapMap:l}}function lt(a,t,e){const i=t?a.plans.find(r=>r.variantId===t):void 0;if(i)return i.direction;if(e){const r=a.plans.find(n=>n.productId===e);if(r)return r.direction}return a.plans.find(r=>!r.variantId)?.direction??null}function K(a,t){const e=t?a.plans.filter(r=>!r.productId||r.productId===t):a.plans,i={};for(const r of e)i[r.existingShopifyPlanId]=r.existingDiscountAmount,i[r.createdShopifyPlanId]=r.existingDiscountAmount;const s=Math.max(...Object.values(i),0);return{discountMap:i,maxDiscount:s}}function W(a){const t=document.querySelector('form[action*="/cart/add"] input[name="product-id"]')?.value;if(t)return t;if(a){for(const r of Array.from(document.querySelectorAll("[data-sl-attribute-p]"))){const n=r.getAttribute("data-sl-attribute-p");if(!n)continue;const o=a.variants.find(l=>l[0]===n);if(o?.[3])return o[3]}const s=document.querySelector('form[action*="/cart/add"] input[name="id"]')?.value;if(s){const r=a.variants.find(n=>n[0]===s);if(r?.[3])return r[3]}}const e=window,i=e.ShopifyAnalytics?.meta?.product?.id??e.meta?.product?.id;return i!=null?String(i):null}function D(a,t){return a.widget.selectors[t]??[]}function U(a,t){return a.replace(/[\d.]+%/,`${t}%`)}function $(a,t){const e=document.createTreeWalker(a,NodeFilter.SHOW_TEXT);let i=e.nextNode();for(;i;){if(i.nodeValue!==null){const s=t(i.nodeValue);if(s!==i.nodeValue){i.nodeValue=s;return}}i=e.nextNode()}}function ct(a,t){return a===null?!1:a==="decrease"?!t:t}async function Lt(a){if(a.subscriptionSwapDone)return;const t=a.getActiveAssignment();if(!t)return;const e=a.getHypothesis(t.hypothesisId);if(!e?.subscriptionData)return;a.subscriptionSwapDone=!0;const i=e.subscriptionData,s=e.isControl,r=[...new Set(i.plans.map(d=>d.direction))].join(",");a.log(`[SUB-SWAP] ${s?"A":"B"} side, directions=${r}`);const n=i.plans.some(d=>d.variantId);let o=!1,l=!1;function c(){if(!l){l=!0;try{const d=n?document.querySelector("select[name='id'], input[name='id']")?.value:void 0,{showPlanIds:p,hidePlanIds:h,swapMap:u}=at(i,s,d);a.swapMap=u;const b=D(i,"widgetParent"),k=D(i,"subscriptionPlans"),S=D(i,"subscriptionInput");if(!b.length||!k.length||!S.length)return;const P=document.querySelector(b[0].selector);if(!P?.shadowRoot)return;const _=P.shadowRoot.querySelector(k[0].selector);if(!_?.shadowRoot)return;const C=S[0].selector;let m=null;if(i.widget.widgetType==="buttons"||i.widget.widgetType==="radio"){const y=Array.from(_.shadowRoot.querySelectorAll(C));if(!y.length)return;for(const v of y){const g=v.closest("label");g&&(p.includes(v.value)?g.style.display="":h.includes(v.value)&&(g.style.display="none"))}const w=y.some(v=>p.includes(v.value)&&v.checked),T=y.some(v=>h.includes(v.value)&&v.checked);if((w||T)&&(o=!1),!w&&!o){o=!0;for(const v of y)if(p.includes(v.value)){v.closest("label")?.click(),v.dispatchEvent(new Event("change",{bubbles:!0}));break}}const f=y.find(v=>v.checked);m=f&&p.includes(f.value)?f.value:p[0]??null}else if(i.widget.widgetType==="dropdown"){const y=_.shadowRoot.querySelector("select");if(!y)return;for(const w of Array.from(y.options))h.includes(w.value)&&(w.style.display="none",w.disabled=!0);if(h.includes(y.value)){const w=Array.from(y.options).find(T=>p.includes(T.value));w&&(y.value=w.value,y.dispatchEvent(new Event("change",{bubbles:!0})))}m=p.includes(y.value)?y.value:p[0]??null}if(m){const y=Array.from(document.querySelectorAll('input[name="selling_plan"]'));for(const w of y)w.value!==m&&(w.value=m)}}finally{l=!1}}}if(a.subscriptionHideWrongPlans=c,a.swapMap=at(i,s).swapMap,c(),n){const d=document.querySelector("select[name='id'], input[name='id']");d&&d.addEventListener("change",c)}}function B(a){const t=D(a,"widgetParent");return t.length?document.querySelector(t[0].selector)?.shadowRoot??null:null}function J(a,t){const e=D(a,"subscriptionPlans");return e.length?t.querySelector(e[0].selector)?.shadowRoot??null:null}function Y(a,t){const e=new URLSearchParams(window.location.search).get("variant");if(e)return e;{const i=document.querySelector('form[action*="/cart/add"] input[name="id"]')?.value;if(i)return i}return a.size>0?[...a.keys()][0]:void 0}function G(a,t){return H(a,t.moneyFormat,t.currency,t.currencyCodeEnabled)}function $t({originalFetch:a,swapMap:t,slptValue:e,getSelectedPlanId:i,log:s}){if(window.fetch.__shoplift_intercepted)return s("[SUB-INTERCEPT] already installed — skipping"),()=>{};function r(o){if(i){const l=i();if(l)return t[l]??l}return t[o]??o}const n=function(o,l){if((typeof o=="string"?o:o instanceof URL?o.href:o.url).includes("/cart/add")&&l?.body)try{if(l.body instanceof FormData){const d=l.body.get("selling_plan");d?l.body.set("selling_plan",r(String(d))):(!d||d==="")&&e&&l.body.set("properties[_slpt]",e)}else if(typeof l.body=="string"){const d=JSON.parse(l.body);if(d.items)for(const p of d.items){const h=String(p.selling_plan??"");h?p.selling_plan=r(h):!p.selling_plan&&e&&(p.properties||(p.properties={}),p.properties._slpt=e)}else if(d.id){const p=String(d.selling_plan??"");p?d.selling_plan=r(p):!d.selling_plan&&e&&(d.properties||(d.properties={}),d.properties._slpt=e)}l.body=JSON.stringify(d)}}catch(d){s("[SUB-INTERCEPT] body parse failed; cart-add proceeds with un-swapped plan",d)}return a.call(window,o,l)};return n.__shoplift_intercepted=!0,window.fetch=n,function(){window.fetch===n&&(window.fetch=a)}}function Mt({log:a}){if(window.fetch.__shoplift_intercepted)return a("[SUB-PREVIEW-BLOCK] already installed — skipping"),()=>{};const t=window.fetch,e=function(i,s){const r=typeof i=="string"?i:i instanceof URL?i.href:i.url;return r.includes("/cart/add")?(a("[SUB-PREVIEW-BLOCK] cart-add blocked in preview mode",{url:r}),Promise.resolve(new Response(JSON.stringify({id:0,properties:{},quantity:0,variant_id:0,key:"preview",title:"Preview — cart-add blocked",price:0,original_price:0,line_price:0,original_line_price:0,total_discount:0,discounts:[],preview:!0}),{status:200,headers:{"Content-Type":"application/json"}}))):t.call(window,i,s)};return e.__shoplift_intercepted=!0,window.fetch=e,function(){window.fetch===e&&(window.fetch=t)}}function dt({data:a,runUpdates:t,debounceMs:e=150}){let i=null;function s(){i&&clearTimeout(i),t(),i=setTimeout(t,e)}let r=null;const n=[],o={childList:!0,subtree:!0,characterData:!0,attributes:!0};function l(h){for(const u of n)u.disconnect();n.length=0;for(const u of Array.from(h.querySelectorAll("*")))if(u.shadowRoot){const b=new MutationObserver(s);b.observe(u.shadowRoot,o),n.push(b)}}function c(){const h=B(a);return h?(r&&r.disconnect(),l(h),r=new MutationObserver(u=>{u.some(b=>b.type==="childList"&&b.addedNodes.length>0)&&l(h),s()}),r.observe(h,o),!0):!1}const d=document.body||document.documentElement,p=new MutationObserver(()=>{c()&&s()});return p.observe(d,{childList:!0,subtree:!0}),c()&&s(),t(),function(){i&&(clearTimeout(i),i=null),p.disconnect(),r&&(r.disconnect(),r=null);for(const u of n)u.disconnect();n.length=0}}async function qt(a){if(a.subscriptionPriceDone)return;const t=a.getActiveAssignment(),e=t?a.getHypothesis(t.hypothesisId):void 0,i=e?.subscriptionData?null:a.findActiveSubscriptionTestControl(),s=e?.subscriptionData?e:i?.hypothesis;if(!s?.subscriptionData)return;const r=e?.subscriptionData?t.testId:i.testId;a.subscriptionPriceDone=!0;const n=s.subscriptionData,o=s.isControl,l=s.priceData,c=n.widget.widgetType;let d=W(l),p=K(n,d),h=p.discountMap,u=p.maxDiscount;function b(){const g=W(l);g!==d&&(d=g,p=K(n,d),h=p.discountMap,u=p.maxDiscount,a.log(`[SUB-PRICE] scope refreshed side=${o?"A":"B"}, currentProductId=${d??"n/a"}, maxDiscount=${u}`))}a.log(`[SUB-PRICE] side=${o?"A":"B"}, currentProductId=${d??"n/a"}, maxDiscount=${u}`),a.updatePriceTestHiddenInputs(r,o?"control":"variant",!1);function k(){if(!l)return null;const g=j(l),I=Y(g),A=lt(n,I,d);if(!ct(A,o))return null;const E=I?g.get(I):void 0;return E?{formattedVariantPrice:G(E.priceInCents,l),formattedDiscounted:G(E.priceInCents*(1-u/100),l)}:null}$t({originalFetch:a.fetch,swapMap:a.swapMap??{},slptValue:a.slptValue??void 0,log:a.log,getSelectedPlanId:()=>{const g=B(n);if(!g)return null;const I=J(n,g);if(!I)return null;const A=D(n,"subscriptionInput"),E=A.length?A[0].selector:'input[name="rc_plan"]';return I.querySelector(`${E}:checked`)?.value??null}});function S(g){const I=D(n,"subscriptionDiscount");for(const A of I)if(A.selector.includes("badge")||A.selector.includes("__badge")){const E=g.querySelector(A.selector);E?.textContent&&!E.textContent.includes(`${u}%`)&&$(E,x=>U(x,u))}}function P(g){const I=k();if(!I)return;const A=D(n,"subscriptionCompareAt");for(const E of A){const x=g.querySelector(E.selector)||g.querySelector(`[part~="${E.selector}"]`);x?.textContent&&!x.textContent.includes(I.formattedVariantPrice)&&$(x,R=>/\d/.test(R)?I.formattedVariantPrice:R)}}function _(g,I){const A=D(n,"subscriptionCompareAt"),E=I===0?"none":"";for(const x of A){const R=g.querySelector(x.selector)||g.querySelector(`[part~="${x.selector}"]`);R&&(E==="none"?R.style.display!=="none"&&(R.style.display="none"):R.style.display==="none"&&(R.style.display=""))}}function C(g){const I=D(n,"subscriptionInput"),A=I.length?I[0].selector:'input[name="rc_plan"]',E=D(n,"subscriptionPlanDiscount"),x=E.length?E[0].selector:".rc-plans-button__discount";for(const R of Array.from(g.querySelectorAll("label"))){const V=R.querySelector(A),O=R.querySelector(x);if(V&&O){const L=h[V.value];if(L!==void 0){if(L===0)O.style.display!=="none"&&(O.style.display="none");else if(O.style.display==="none"&&(O.style.display=""),O.textContent){const Z=O.textContent.match(/[\d.]+%/)?.[0];Z&&Z!==`${L}%`&&$(O,Kt=>U(Kt,L))}}}}}function m(g){const I=g.querySelector("select");if(I)for(const A of Array.from(I.options)){const E=h[A.value];if(E!==void 0&&A.textContent){const x=A.textContent.match(/[\d.]+%/)?.[0];x&&x!==`${E}%`&&(A.textContent=U(A.textContent,E))}}}function y(g,I){const E=D(n,"subscriptionDiscount").filter(x=>x.selector.includes("benefit")||x.selector==="rc-benefits");for(const x of E){const R=g.querySelector(x.selector);if(R?.shadowRoot){for(const V of Array.from(R.shadowRoot.querySelectorAll("li")))if(V.textContent?.includes("Save")){const O=V;if(I===0)O.style.display!=="none"&&(O.style.display="none");else{O.style.display==="none"&&(O.style.display="");const L=V.textContent.match(/[\d.]+%/)?.[0];L&&L!==`${I}%`&&$(V,Z=>U(Z,I))}}}}}let w=!1;function T(){if(!w){w=!0;try{if(b(),d!==null&&Object.keys(h).length===0)return;const g=B(n);if(!g)return;S(g),l&&P(g);const I=J(n,g);let A=u;if(I){const E=D(n,"subscriptionInput"),x=E.length?E[0].selector:'input[name="rc_plan"]',R=I.querySelector(`${x}:checked`);if(R){const V=h[R.value];V!==void 0&&(A=V)}c==="buttons"||c==="radio"?C(I):m(I)}_(g,A),y(g,A)}finally{w=!1}}}function f(){const g=k();if(!g)return;const I=B(n);if(!I)return;const A=D(n,"onetimeToggle"),E=A.length?A[0].selector:'input[value="onetime"]';if(!I.querySelector(E)?.checked)return;const R=D(n,"subscriptionPrice");for(const V of R){const O=I.querySelector(V.selector)||I.querySelector(`[part~="${V.selector}"]`);O?.textContent&&!O.textContent.includes(g.formattedDiscounted)&&$(O,L=>/\d/.test(L)?g.formattedDiscounted:L)}}function v(){a.subscriptionHideWrongPlans&&a.subscriptionHideWrongPlans(),T(),a.subscriptionUpdateOneTime&&a.subscriptionUpdateOneTime(),f()}dt({data:n,runUpdates:v})}async function Ht(a){if(a.subscriptionOneTimeDone)return;const t=a.getActiveAssignment(),e=t?a.getHypothesis(t.hypothesisId):void 0,i=!!(e?.subscriptionData&&e.priceData),s=i?null:a.findActiveSubscriptionTestControl(),r=i?e:s?.hypothesis;if(!r?.subscriptionData||!r.priceData)return;const n=i?t.testId:s.testId;a.subscriptionOneTimeDone=!0;const o=r.subscriptionData,l=r.priceData,c=j(l),d=r.isControl,p=d?"control":"variant";a.slptValue=`${n}:${p}:f`,a.updatePriceTestHiddenInputs(n,p,!1);function h(){const u=B(o);if(!u)return;const b=Y(c);if(!b)return;const k=W(l),S=lt(o,b,k);if(!ct(S,d))return;const P=c.get(b);if(!P)return;const _=H(P.priceInCents,l.moneyFormat,l.currency,l.currencyCodeEnabled),C=D(o,"onetimePrice");if(!C.length)return;const m=D(o,"onetimeContainer"),y=m.length?m[0].selector:'[part~="rc-purchase-option__onetime"]',T=u.querySelector(y)??u;for(const f of C){let v=null;try{v=T.querySelector(f.selector)}catch{v=null}v??=T.querySelector(`[part~="${f.selector}"]`),v&&v.textContent&&!v.textContent.includes(_)&&$(v,g=>/\d/.test(g)?_:g)}}a.subscriptionUpdateOneTime=h,h()}async function Ut(a,t){const{subscriptionPreviewRender:e}=await Vt(async()=>{const{subscriptionPreviewRender:i}=await Promise.resolve().then(()=>jt);return{subscriptionPreviewRender:i}},void 0);return e(a.subscriptionData,a.priceData,a.isControl,t)}function Nt(a,t){const e=a.widget.selectors.widgetParent??[],i=a.widget.selectors.subscriptionPlans??[],s=a.widget.selectors.subscriptionInput??[];if(!e.length||!i.length||!s.length){t("[SUB-GLOBAL-HIDE] Missing required selectors — skipping");return}const r=e[0].selector,n=i[0].selector,o=s[0].selector;let l=!1,c=null,d=!1;function p(){if(!d){d=!0;try{h()}finally{d=!1}}}function h(){const P=document.querySelector(r);if(!P?.shadowRoot)return;const _=P.shadowRoot.querySelector(n);if(!_?.shadowRoot)return;_.shadowRoot!==c&&(c=_.shadowRoot,l=!1);let C=0;if(a.widget.widgetType==="buttons"||a.widget.widgetType==="radio"){const m=Array.from(_.shadowRoot.querySelectorAll(o));for(const f of m)if(a.planIds.includes(f.value)){f.disabled||(f.disabled=!0);const v=f.closest("label");v&&v.style.display!=="none"&&(v.style.display="none",C++)}const y=m.filter(f=>!a.planIds.includes(f.value));if(!y.some(f=>f.checked)&&!l&&y.length>0){l=!0;const f=y[0];f.closest("label")?.click(),f.dispatchEvent(new Event("change",{bubbles:!0})),t(`[SUB-GLOBAL-HIDE] Preselected first visible plan input=${f.value}`)}const T=y.find(f=>f.checked)??y[0];if(T){const f=Array.from(document.querySelectorAll('input[name="selling_plan"]'));for(const v of f)v.value!==T.value&&(v.value=T.value,t(`[SUB-GLOBAL-HIDE] Mirrored plan id ${T.value} to form selling_plan input`))}}else if(a.widget.widgetType==="dropdown"){const m=_.shadowRoot.querySelector("select");if(!m)return;for(const T of Array.from(m.options))a.planIds.includes(T.value)&&(T.style.display!=="none"&&(T.style.display="none"),T.disabled||(T.disabled=!0),C++);const y=Array.from(m.options).filter(T=>!a.planIds.includes(T.value)),w=y.some(T=>T.value===m.value);y.length>0&&!w&&!l&&(l=!0,m.value=y[0].value,m.dispatchEvent(new Event("change",{bubbles:!0})),t(`[SUB-GLOBAL-HIDE] Preselected first visible option=${y[0].value}`))}C>0&&t(`[SUB-GLOBAL-HIDE] Hidden ${C} B-side plan buttons`)}const u={childList:!0,subtree:!0,characterData:!0};let b=null;function k(P){b?.disconnect(),b=new MutationObserver(()=>p()),b.observe(P,u)}function S(){const P=document.querySelector(r);if(!P?.shadowRoot)return!1;p(),new MutationObserver(()=>{p();const m=P.shadowRoot.querySelector(n);m?.shadowRoot&&k(m.shadowRoot)}).observe(P.shadowRoot,u);const C=P.shadowRoot.querySelector(n);return C?.shadowRoot&&k(C.shadowRoot),!0}if(!S()){t("[SUB-GLOBAL-HIDE] Widget not in DOM yet — waiting via MutationObserver");const P=new MutationObserver(()=>{S()&&P.disconnect()});P.observe(document.body??document.documentElement,{childList:!0,subtree:!0})}}const ut="Limited preview",Ft="Add-to-cart and checkout prices won't reflect this test until it launches — test selling plans are not created in your subscription app until after a test is launched.",Bt=5e3;function zt(){const a=document.createElement("div");a.id="shoplift-preview-subscription-warning";const t=document.createElement("span");t.id="shoplift-preview-subscription-warning__icon",t.setAttribute("aria-hidden","true"),t.textContent="!";const e=document.createElement("span");e.id="shoplift-preview-subscription-warning__label",e.textContent=ut;const i=document.createElement("div");i.id="shoplift-preview-subscription-warning__tooltip",i.setAttribute("role","tooltip"),i.textContent=Ft,a.appendChild(t),a.appendChild(e),a.appendChild(i),a.setAttribute("tabindex","0"),a.setAttribute("aria-describedby",i.id),a.setAttribute("aria-label",ut);let s=null;function r(){s!==null&&(clearTimeout(s),s=null)}function n(){i.classList.add("shoplift-preview-subscription-warning__tooltip--visible")}function o(){i.classList.remove("shoplift-preview-subscription-warning__tooltip--visible")}function l(){n(),r(),s=setTimeout(()=>{o(),s=null},Bt)}function c(){r(),n()}function d(){s===null&&o()}a.addEventListener("mouseenter",c),a.addEventListener("mouseleave",d),a.addEventListener("focus",c),a.addEventListener("blur",d);function p(u){try{const b=u.target;if(!(b instanceof Element))return;(b.closest('form[action*="/cart/add"] button[type="submit"], form[action*="/cart/add"] input[type="submit"]')!==null||b.closest('[name="add"], button[name="add"], [data-add-to-cart], button[data-add-to-cart]')!==null)&&l()}catch{}}document.addEventListener("click",p,!0);function h(){r(),document.removeEventListener("click",p,!0),a.removeEventListener("mouseenter",c),a.removeEventListener("mouseleave",d),a.removeEventListener("focus",c),a.removeEventListener("blur",d),a.remove()}return{root:a,tooltip:i,cleanup:h}}let pt=!1;class Wt{constructor(t,e,i,s,r,n,o,l,c,d,p,h,u){this.shop=t,this.host=e,this.eventHost=i,this.disableReferrerOverride=l,this.logHistory=[],this.legacySessionKey=`SHOPLIFT_SESSION_${this.shop}`,this.cssHideClass=s?"shoplift-hide":"",this.testConfigs=p.map(k=>({...k,startAt:new Date(k.startAt),statusHistory:k.statusHistory.map(S=>({...S,createdAt:new Date(S.createdAt)}))})),this.inactiveTestConfigs=h,this.hiddenSubscriptionPlans=u,this.sendPageView=!!r,this.shopliftDebug=n===!0,this.telemetryEnabled=c===!0,this.gaConfig=o!=={"sendEvents":false,"mode":"gtag"}?o:{sendEvents:!1},this.fetch=window.fetch.bind(window),this.localStorageSet=window.localStorage.setItem.bind(window.localStorage),this.localStorageGet=window.localStorage.getItem.bind(window.localStorage);const b=this.getDeviceType();this.device=b!=="tablet"?b:"mobile",this.state=this.loadState(),this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.testsFilteredByAudience=p.filter(k=>k.status=="active"),this.getCountryTimeout=d===1000?1e3:d,this.log("State Loaded",JSON.stringify(this.state))}DATA_SL_ATTRIBUTE_P="data-sl-attribute-p";DATA_SL_TEST_ID="data-sl-test-id";VIEWPORT_TRACK_THRESHOLD=.5;temporarySessionKey="Shoplift_Session";essentialSessionKey="Shoplift_Essential";analyticsSessionKey="Shoplift_Analytics";priceSelectorsSessionKey="Shoplift_PriceSelectors_v2";legacySessionKey;cssHideClass;testConfigs;inactiveTestConfigs;hiddenSubscriptionPlans;testsFilteredByAudience;sendPageView;shopliftDebug;gaConfig;telemetryEnabled;getCountryTimeout;state;subscriptionPreviewWarningCleanup=null;shopifyAnalyticsId;cookie=document.cookie;isSyncing=!1;isSyncingGA=!1;fetch;localStorageSet;localStorageGet;sessionStorageSet=window.sessionStorage.setItem.bind(window.sessionStorage);sessionStorageGet=window.sessionStorage.getItem.bind(window.sessionStorage);urlParams=new URLSearchParams(window.location.search);device;logHistory;activeViewportObservers=new Map;clientIdRetryCount=0;deriveCategoryFromExistingTests(){if(!this.state.temporary.testCategory&&this.state.essential.visitorTests.length>0){const t=this.state.essential.visitorTests.some(e=>{if(!e.hypothesisId)return!1;const i=this.getHypothesis(e.hypothesisId);return i&&["theme","basicScript","price"].includes(i.type)});this.state.temporary.testCategory=t?"global":"conditional",this.persistTemporaryState(),this.log("Derived test category from existing visitorTests: %s",this.state.temporary.testCategory)}}async init(){try{if(this.log("Shoplift script initializing"),window.Shopify&&window.Shopify.designMode){this.log("Skipping script for design mode");return}if(window.location.href.includes("slScreenshot=true")){this.log("Skipping script for screenshot");return}if(window.location.hostname.endsWith(".edgemesh.com")){this.log("Skipping script for preview");return}if(window.location.href.includes("isShopliftMerchant")){const s=this.urlParams.get("isShopliftMerchant")==="true";this.log("Setting merchant session to %s",s),this.state.temporary.isMerchant=s,this.persistTemporaryState()}if(this.state.temporary.isMerchant){this.log("Setting up preview for merchant"),typeof window.shoplift!="object"&&this.setShopliftStub(),this.state.temporary.previewConfig||this.hidePage(),await this.initPreview(),document.querySelector("#sl-preview-bar-hide")?.remove();return}if(this.state.temporary.previewConfig=void 0,mt(navigator.userAgent))return;const t=this.state.essential.visitorTests.filter(s=>s.hypothesisId&&+s.createdAt>Date.now()-6e4);if(t.length===0)this.sendDiagnosticTelemetry("page-landed",null);else for(const s of t)this.sendDiagnosticTelemetry("page-landed",s.testId,{hypothesisId:s.hypothesisId,isControl:s.assignedTo==="control",testType:s.testType??"unknown"});if(navigator.userAgent.includes("Chrome/118")){this.log("Random: %o",[Math.random(),Math.random(),Math.random()]);const s=await this.makeRequest({url:`${this.eventHost}/api/v0/events/ip`,method:"get"}).then(r=>r?.json());this.log(`IP: ${s}`),this.makeRequest({url:`${this.eventHost}/api/v0/logs`,method:"post",data:JSON.stringify(this.debugState(),X)}).catch()}if(this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.monitorConsentChange(),this.checkForThemePreview())return;if(!this.disableReferrerOverride&&this.state.temporary.originalReferrer!=null){this.log(`Overriding referrer from '${document.referrer}' to '${this.state.temporary.originalReferrer}'`);const s=this.state.temporary.originalReferrer;delete this.state.temporary.originalReferrer,this.persistTemporaryState(),Object.defineProperty(document,"referrer",{get:()=>s,enumerable:!0,configurable:!0})}if(await this.refreshVisitor(this.shopifyAnalyticsId),await this.handleVisitorTest()){this.log("Redirecting for visitor test");return}this.setShoplift(),this.showPage(),this.ensureCartAttributesForExistingPriceTests(!1);const i=this.state.essential.visitorTests.some(s=>(s.hypothesisId?this.getHypothesis(s.hypothesisId):void 0)?.subscriptionData!=null)||Object.values(this.state.temporary.testReservations??{}).some(s=>this.getHypothesis(s.hypothesisId)?.subscriptionData!=null);this.hiddenSubscriptionPlans&&!i&&(this.log(`[SUB-GLOBAL] Visitor not in subscription test — hiding ${this.hiddenSubscriptionPlans.planIds.length} B-side plans`),Nt(this.hiddenSubscriptionPlans,s=>this.log(s))),await this.subscriptionSwap(),await this.subscriptionOneTimePrice(),await this.subscriptionPriceChange(),await this.finalize(),console.log("SHOPLIFT SCRIPT INITIALIZED!")}catch(t){if(t instanceof et)return;throw t}finally{typeof window.shoplift!="object"&&this.setShopliftStub()}}getVariantColor(t){switch(t){case"a":return{text:"#141414",bg:"#E2E2E2"};case"b":return{text:"rgba(255, 255, 255, 1)",bg:"rgba(37, 99, 235, 1)"}}}getDefaultVariantTitle(t){return t.title?t.title:t.type==="price"?t.isControl?"Original prices":"Variant prices":t.isControl?"Original":"Untitled variant "+t.label.toUpperCase()}async initPreview(){const t=this.urlParams.get("previewConfig");if(t){this.state.temporary.previewConfig=void 0,this.log("Setting up the preview"),this.log("Found preview config, writing to temporary state");const e=await Rt(t);if(this.state.temporary.previewConfig=e,this.state.temporary.previewConfig.testTypeCategory===M.Price){this.hidePage(!0);const s=this.state.temporary.previewConfig;let r=`${this.host}/api/dom-selectors/${s.storeId}/${s.testId}/${s.isDraft||!1}`;s.shopifyProductId&&(r+=`?productId=${s.shopifyProductId}`);const n=await this.makeJsonRequest({method:"get",url:r}).catch(o=>(this.log("Error getting domSelectors",o),null));if(s.variants.forEach(o=>o.domSelectors=n[o.id]?.domSelectors),s.isDraft){const o=`${this.host}/api/dom-selectors/${s.storeId}/${s.testId}/subscription-preview`,l=await this.makeJsonRequest({method:"get",url:o}).catch(c=>(this.log("No subscription preview data for draft (test may not have a subscription widget)",c),null));l?.subscriptionData&&s.variants.forEach(c=>{c.subscriptionData=l.subscriptionData,c.priceData=l.priceData})}}this.persistTemporaryState();const i=new URL(window.location.toString());i.searchParams.delete("previewConfig"),this.queueRedirect(i)}else if(this.state.temporary.previewConfig){this.showPage();const e=this.state.temporary.previewConfig;if(e.testTypeCategory===M.Template&&this.handleTemplatePreview(e)&&this.initPreviewControls(e),e.testTypeCategory===M.UrlRedirect&&this.handleUrlPreview(e)&&this.initPreviewControls(e),e.testTypeCategory===M.Script&&this.handleScriptPreview(e)&&this.initPreviewControls(e),e.testTypeCategory===M.Price){const i=await this.handlePricePreview(e);e.isDraft?await this.handleSubscriptionPricePreview(e):await this.handleSubscriptionLivePreview(e),i&&this.initPreviewControls(e)}}}initPreviewControls(t){document.addEventListener("DOMContentLoaded",()=>{const e=t.variants.find(b=>b.id===t.currentVariant),i=e?.label||"a",s=t.variants,r=document.createElement("div");r.id="shoplift-preview-control";const n=document.createElement("div"),o=document.createElement("img");o.src=_t,o.height=24,o.width=14,n.style.padding="0 16px",n.style.lineHeight="100%",n.appendChild(o),r.appendChild(n);const l=document.createElement("div");l.id="shoplift-preview-variant-selector";const c=document.createElement("button");c.id="shoplift-preview-variant-menu-trigger";const d=document.createElement("div");d.className="menu-variant-label",d.style.backgroundColor=this.getVariantColor(i).bg,d.style.color=this.getVariantColor(i).text,d.innerText=i.toUpperCase(),c.appendChild(d);const p=document.createElement("span");if(p.id="shoplift-preview-variant-title",p.innerText=e?this.getDefaultVariantTitle(e):"Untitled variant "+i.toUpperCase(),c.appendChild(p),s.length>1){const b=document.createElement("img");b.src=xt,b.width=12,b.height=12,b.style.height="12px",b.style.width="12px",c.appendChild(b);const k=document.createElement("div");k.className="preview-variant-menu";for(const S of t.variants.filter(P=>P.id!==t.currentVariant)){const P=document.createElement("div");P.className="preview-variant-menu--item";const _=document.createElement("div");_.className="menu-variant-label",_.style.backgroundColor=this.getVariantColor(S.label).bg,_.style.color=this.getVariantColor(S.label).text,_.style.flexShrink="0",_.innerText=S.label.toUpperCase(),P.appendChild(_);const C=document.createElement("span");C.innerText=this.getDefaultVariantTitle(S),P.appendChild(C),P.addEventListener("click",()=>{this.pickVariant(S.id)}),k.appendChild(P)}l.appendChild(k),c.addEventListener("click",()=>{k.className!=="preview-variant-menu preview-variant-menu__visible"?k.classList.add("preview-variant-menu__visible"):k.classList.remove("preview-variant-menu__visible")}),document.addEventListener("click",S=>{S.target instanceof Element&&!c.contains(S.target)&&k.className==="preview-variant-menu preview-variant-menu__visible"&&k.classList.remove("preview-variant-menu__visible")})}else c.style.pointerEvents="none",d.style.margin="0";if(l.appendChild(c),r.appendChild(l),t.hasSubscription){this.subscriptionPreviewWarningCleanup?.();const b=zt();r.appendChild(b.root),this.subscriptionPreviewWarningCleanup=b.cleanup}const h=document.createElement("div"),u=document.createElement("button");u.id="shoplift-exit-preview-button",u.innerText="Exit",h.appendChild(u),u.addEventListener("click",()=>{this.exitPreview()}),r.appendChild(h),document.body.appendChild(r),requestAnimationFrame(()=>{r.classList.add("visible")})}),this.ensureCartAttributesForExistingPriceTests(!0)}pickVariant(t){if(this.state.temporary.previewConfig){const e=this.state.temporary.previewConfig,i=new URL(window.location.toString());if(e.testTypeCategory===M.UrlRedirect){const s=e.variants.find(r=>r.id===e.currentVariant)?.redirectUrl;if(i.pathname===s){const r=e.variants.find(n=>n.id===t)?.redirectUrl;r&&(i.pathname=r)}}if(e.testTypeCategory===M.Template){const s=e.variants.find(r=>r.id===e.currentVariant)?.pathName;if(s&&i.pathname===s){const r=e.variants.find(n=>n.id===t)?.pathName;r&&r!==s&&(i.pathname=r)}}e.currentVariant=t,this.persistTemporaryState(),this.queueRedirect(i)}}exitPreview(){const t=new URL(window.location.toString());if(this.state.temporary.previewConfig?.testTypeCategory===M.Template&&t.searchParams.delete("view"),this.state.temporary.previewConfig?.testTypeCategory===M.Script&&t.searchParams.delete("slVariant"),this.state.temporary.previewConfig?.testTypeCategory===M.UrlRedirect){const i=this.state.temporary.previewConfig.variants.filter(r=>!r.isControl&&r.redirectUrl!==null).map(r=>r.redirectUrl),s=this.state.temporary.previewConfig.variants.find(r=>r.label==="a")?.redirectUrl;i.includes(t.pathname)&&s&&(t.pathname=s)}this.state.temporary.isMerchant=!1,t.searchParams.delete("isShopliftMerchant"),this.state.temporary.previewConfig=void 0,this.persistTemporaryState(),this.subscriptionPreviewWarningCleanup?.(),this.subscriptionPreviewWarningCleanup=null,this.hidePage(),this.queueRedirect(t)}handleTemplatePreview(t){const e=t.currentVariant,i=t.variants.find(l=>l.id===e);if(!i)return!1;const s=t.variants.find(l=>l.isControl);if(!s)return!1;this.log("Setting up template preview for type",s.type);const r=new URL(window.location.toString()),n=r.searchParams.get("view"),o=i.type===s.type;return!o&&!i.isControl&&template.suffix===s.affix&&this.typeFromTemplate()===s.type&&i.pathName!==null?(this.log("Hit control template type, redirecting to the variant url"),this.hidePage(),r.pathname=i.pathName,this.queueRedirect(r),!0):(!i.isControl&&this.typeFromTemplate()==i.type&&template.suffix===s.affix&&o&&n!==(i.affix||"__DEFAULT__")&&(this.log("Template type and affix match control, updating the view param"),r.searchParams.delete("view"),this.log("Setting the new viewParam to",i.affix||"__DEFAULT__"),this.hidePage(),r.searchParams.set("view",i.affix||"__DEFAULT__"),this.queueRedirect(r)),n!==null&&n!==(i.affix||"__DEFAULT__")&&(r.searchParams.delete("view"),this.hidePage(),this.queueRedirect(r)),!0)}handleUrlPreview(t){const e=t.currentVariant,i=t.variants.find(n=>n.id===e),s=t.variants.find(n=>n.isControl)?.redirectUrl;if(!i)return!1;this.log("Setting up URL redirect preview");const r=new URL(window.location.toString());return r.pathname===s&&!i.isControl&&i.redirectUrl!==null&&(this.log("Url matches control, redirecting"),this.hidePage(),r.pathname=i.redirectUrl,this.queueRedirect(r)),!0}handleScriptPreview(t){const e=t.currentVariant,i=t.variants.find(n=>n.id===e);if(!i)return!1;this.log("Setting up script preview");const s=new URL(window.location.toString());return s.searchParams.get("slVariant")!==i.id&&(this.log("current id doesn't match the variant, redirecting"),s.searchParams.delete("slVariant"),this.log("Setting the new slVariantParam"),this.hidePage(),s.searchParams.set("slVariant",i.id),this.queueRedirect(s)),!0}async handlePricePreview(t){const e=t.currentVariant,i=t.variants.find(s=>s.id===e);return i?(this.log("Setting up price preview"),i.domSelectors&&i.domSelectors.length>0&&(N(document,{testId:t.testId,hypothesisId:i.id,selectors:i.domSelectors}),this.ensureCartAttributesForExistingPriceTests(!0)),!0):!1}async handleSubscriptionPricePreview(t){const e=t.variants.find(i=>i.id===t.currentVariant);e?.subscriptionData&&(this.log("Setting up subscription price preview"),await Ut({id:e.id,isControl:e.isControl,subscriptionData:e.subscriptionData,priceData:e.priceData},(i,...s)=>this.log(i,...s)))}async handleSubscriptionLivePreview(t){this.testConfigs.find(s=>s.id===t.testId)?.hypotheses.find(s=>s.id===t.currentVariant)?.subscriptionData&&(this.log("Setting up subscription live preview"),this.subscriptionSwapDone=!1,this.subscriptionOneTimeDone=!1,this.subscriptionPriceDone=!1,await this.subscriptionSwap(),await this.subscriptionOneTimePrice(),await this.subscriptionPriceChange())}async finalize(){const t=await this.getCartState();t!==null&&this.queueCartUpdate(t),this.pruneStateAndSave(),await this.syncAllEvents()}setShoplift(){this.log("Setting up public API");const e=this.urlParams.get("slVariant")==="true",i=e?null:this.urlParams.get("slVariant");window.shoplift={isHypothesisActive:async s=>{if(this.log("Script checking variant for hypothesis '%s'",s),e)return this.log("Forcing variant for hypothesis '%s'",s),!0;if(i!==null)return this.log("Forcing hypothesis '%s'",i),s===i;const r=this.testConfigs.find(o=>o.hypotheses.some(l=>l.id===s));if(!r)return this.log("No test found for hypothesis '%s'",s),!1;const n=this.state.essential.visitorTests.find(o=>o.testId===r.id);return n?(this.log("Active visitor test found",s),n.hypothesisId===s):(await this.manuallySplitVisitor(r),this.testConfigs.some(o=>o.hypotheses.some(l=>l.id===s&&this.state.essential.visitorTests.some(c=>c.hypothesisId===l.id))))},setAnalyticsConsent:async s=>{await this.onConsentChange(s,!0)},getVisitorData:()=>({visitor:this.state.analytics.visitor,visitorTests:this.state.essential.visitorTests.filter(s=>!s.isInvalid).map(s=>{const{shouldSendToGa:r,savedAt:n,...o}=s;return o})})}}setShopliftStub(){this.log("Setting up stubbed public API");const e=this.urlParams.get("slVariant")==="true",i=e?null:this.urlParams.get("slVariant");window.shoplift={isHypothesisActive:s=>Promise.resolve(e||s===i),setAnalyticsConsent:()=>Promise.resolve(),getVisitorData:()=>({visitor:null,visitorTests:[]})}}async manuallySplitVisitor(t){this.log("Starting manual split for test '%s'",t.id),await this.handleVisitorTest([t]);const e=this.getReservationForTest(t.id);e&&!e.isRealized&&e.entryCriteriaKey&&(this.log("Realizing manual API reservation for test '%s'",t.id),this.realizeReservationForCriteria(e.entryCriteriaKey)),this.saveState(),this.syncAllEvents()}async handleVisitorTest(t){await this.filterTestsByAudience(this.testConfigs,this.state.analytics.visitor??this.buildBaseVisitor(),this.state.essential.visitorTests),this.pruneStaleVisitorTests(),this.deriveCategoryFromExistingTests(),this.clearStaleReservations();let e=t?t.filter(i=>this.testsFilteredByAudience.some(s=>s.id===i.id)):[...this.testsForUrl(this.testsFilteredByAudience),...this.domTestsForUrl(this.testsFilteredByAudience)];try{if(e.length===0)return this.log("No tests found"),!1;this.log("Checking for existing visitor test on page");const i=this.getCurrentVisitorHypothesis(e);if(i){this.log("Found current visitor test");const l=this.considerRedirect(i);return l&&(this.log("Redirecting for current visitor test"),this.redirect(i)),l}const s=this.getReservationForCurrentPage();if(s){this.log("Found matching reservation for current page: %s",s.testId);const l=this.getHypothesis(s.hypothesisId);if(l){l.type!=="price"&&this.realizeReservationForCriteria(s.entryCriteriaKey);const c=this.considerRedirect(l);return c&&this.redirect(l),c}}this.log("No active test relation for test page");const r=this.testsForUrl(this.inactiveTestConfigs.filter(l=>this.testIsPaused(l)&&l.hypotheses.some(c=>this.state.essential.visitorTests.some(d=>d.hypothesisId===c.id)))).map(l=>l.id);if(r.length>0)return this.log("Visitor has paused tests for test page, skipping test assignment: %o",r),!1;if(!this.state.temporary.testCategory){const l=this.testsFilteredByAudience.filter(d=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(d))),c=this.testsFilteredByAudience.filter(d=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(d)));if(this.log("Category dice roll - global tests: %o, conditional tests: %o",l.map(d=>({id:d.id,title:d.title,criteria:this.getEntryCriteriaKey(d)})),c.map(d=>({id:d.id,title:d.title,criteria:this.getEntryCriteriaKey(d)}))),l.length>0&&c.length>0){const d=l.length,p=c.length,h=d+p,u=Math.random()*h;this.state.temporary.testCategory=u<d?"global":"conditional",this.log("Category dice roll: rolled %.2f of %d (global weight: %d, conditional weight: %d), selected '%s'",u,h,d,p,this.state.temporary.testCategory)}else l.length>0?(this.state.temporary.testCategory="global",this.log("Only global tests available, setting category to global")):(this.state.temporary.testCategory="conditional",this.log("Only conditional tests available, setting category to conditional"));this.persistTemporaryState()}const n=this.state.temporary.testCategory;if(this.log("Visitor test category: %s",n),n==="global"){const l=this.testsFilteredByAudience.filter(c=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)));for(const c of l)this.markTestAsBlocked(c,"category:global");e=e.filter(c=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)))}else{const l=this.testsFilteredByAudience.filter(c=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)));for(const c of l)this.markTestAsBlocked(c,"category:conditional");e=e.filter(c=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)))}if(e.length===0)return this.log("No tests remaining after category filter"),!1;this.createReservations(e);const o=this.getReservationForCurrentPage();if(o&&!o.isRealized){const l=this.getHypothesis(o.hypothesisId);if(l){l.type!=="price"&&this.realizeReservationForCriteria(o.entryCriteriaKey);const c=this.considerRedirect(l);return c&&(this.log("Redirecting for new test"),this.redirect(l)),c}}return!1}finally{this.includeInDomTests(),this.saveState()}}includeInDomTests(){this.applyControlForAudienceFilteredPriceTests();const t=this.getDomTestsForCurrentUrl(),e=this.getVisitorDomHypothesis(t);for(const i of t){this.log("Evaluating dom test '%s'",i.id);const s=i.hypotheses.some(u=>u.type==="price");if(this.state.essential.visitorTests.find(u=>u.testId===i.id&&u.isInvalid&&!u.hypothesisId)){if(this.log("Visitor is blocked from test '%s', applying control prices if price test",i.id),s){const u=i.hypotheses.find(b=>b.isControl);u?.priceData&&(this.applyPriceTestWithMapLookup(i.id,u,[u],()=>{this.log("Control prices applied for blocked visitor, no metrics tracked")}),this.updatePriceTestHiddenInputs(i.id,"control",!1))}continue}const n=this.getReservationForTest(i.id);let o=null,l=!1;const c=e.find(u=>i.hypotheses.some(b=>u.id===b.id));if(n)o=this.getHypothesis(n.hypothesisId)??null,this.log("Using reserved hypothesis '%s' for test '%s'",n.hypothesisId,i.id);else if(c)o=c,this.log("Using existing hypothesis assignment for test '%s'",i.id);else if(s){const u=this.visitorActiveTestTypeWithReservations();u?(l=!0,this.log("Visitor already in test type '%s', treating as non-test for price test '%s'",u,i.id)):o=this.pickHypothesis(i)}else o=this.pickHypothesis(i);if(l&&s){const u=i.hypotheses.find(b=>b.isControl);u?.priceData&&(this.log("Applying control prices for non-test visitor on price test '%s' (Map-based)",i.id),this.applyPriceTestWithMapLookup(i.id,u,[u],()=>{this.log("Control prices applied for non-test visitor, no metrics tracked")}),this.updatePriceTestHiddenInputs(i.id,"control",!1));continue}if(!o){this.log("Failed to pick hypothesis for test");continue}this.sendDiagnosticTelemetry("assignment",i.id,{hypothesisId:o.id,isControl:o.isControl,testType:o.type});const d=i.bayesianRevision??4,p=o.type==="price",h=d>=5;if(p&&h){if(this.log(`Price test with Map-based lookup (v${d}): ${i.id}`),!o.priceData){this.log("No price data for hypothesis '%s', skipping",o.id);continue}const u=o.isControl?"control":"variant";this.log(`Setting up Map-based price test for ${u} (test: ${i.id})`),this.applyPriceTestWithMapLookup(i.id,o,i.hypotheses,b=>{const k=this.getReservationForTest(b);k&&!k.isRealized&&k.entryCriteriaKey?this.realizeReservationForCriteria(k.entryCriteriaKey):this.queueAddVisitorToTest(b,o),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()});continue}if(p&&!h){this.log(`Price test without viewport tracking (v${d}): ${i.id}`);const u=this.getDomSelectorsForHypothesis(o);if(u.length===0)continue;N(document,{testId:i.id,hypothesisId:o.id,selectors:u},b=>{this.queueAddVisitorToTest(b,o),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()});continue}if(!o.domSelectors||o.domSelectors.length===0){this.log("No selectors found, skipping hypothesis");continue}N(document,{testId:i.id,hypothesisId:o.id,selectors:o.domSelectors},u=>{this.queueAddVisitorToTest(u,o),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()})}}considerRedirect(t){if(this.log("Considering redirect for hypothesis '%s'",t.id),t.isControl)return this.log("Skipping redirect for control"),!1;if(t.type==="basicScript"||t.type==="manualScript")return this.log("Skipping redirect for script test"),!1;const e=this.state.essential.visitorTests.find(n=>n.hypothesisId===t.id),i=new URL(window.location.toString()),r=new URLSearchParams(window.location.search).get("view");if(t.type==="theme"){if(!(t.themeId===themeId)){if(this.log("Theme id '%s' is not hypothesis theme ID '%s'",t.themeId,themeId),this.isAppProxyPath())return this.log("On App Proxy path, skipping theme redirect to avoid infinite loop"),!1;if(e&&e.themeId!==t.themeId&&(e.themeId===themeId||!this.isThemePreview()))this.log("On old theme, redirecting and updating local visitor"),e.themeId=t.themeId;else if(this.isThemePreview())return this.log("On non-test theme, skipping redirect"),!1;return this.log("Hiding page to redirect for theme test"),this.hidePage(),!0}return!1}else if(t.type!=="dom"&&t.type!=="price"&&t.affix!==template.suffix&&t.affix!==r||t.redirectPath&&!i.pathname.endsWith(t.redirectPath))return this.log("Hiding page to redirect for template test"),this.hidePage(),!0;return this.log("Not redirecting"),!1}redirect(t){if(this.log("Redirecting to hypothesis '%s'",t.id),t.isControl)return;const e=new URL(window.location.toString());if(e.searchParams.delete("view"),t.redirectPath){const s=RegExp("^(/w{2}-w{2})/").exec(e.pathname);if(s&&s.length>1){const r=s[1];e.pathname=`${r}${t.redirectPath}`}else e.pathname=t.redirectPath}else t.type==="theme"?(e.searchParams.set("_ab","0"),e.searchParams.set("_fd","0"),e.searchParams.set("_sc","1"),e.searchParams.set("preview_theme_id",t.themeId.toString())):t.type!=="urlRedirect"&&e.searchParams.set("view",t.affix);const i=this.state.essential.visitorTests.find(s=>s.hypothesisId===t.id)?.testId;if(i){const s=new Date(Date.now()+5e3).toUTCString();document.cookie=`shoplift_redirect=${i};domain=.${window.location.hostname};path=/;SameSite=Strict;expires=${s}`}this.queueRedirect(e)}async refreshVisitor(t){if(t===null||!this.state.essential.isFirstLoad||!this.testConfigs.some(i=>i.visitorOption!=="all"))return;this.log("Refreshing visitor"),this.hidePage();const e=await this.getVisitor(t);e&&e.id&&this.updateLocalVisitor(e)}buildBaseVisitor(){return{shopifyAnalyticsId:this.shopifyAnalyticsId,device:this.device,country:null,...this.state.essential.initialState}}getInitialState(){const t=this.getUTMValue("utm_source")??"",e=this.getUTMValue("utm_medium")??"",i=this.getUTMValue("utm_campaign")??"",s=this.getUTMValue("utm_content")??"",r=window.document.referrer,n=this.device;return{createdAt:new Date,utmSource:t,utmMedium:e,utmCampaign:i,utmContent:s,referrer:r,device:n}}checkForThemePreview(){return this.log("Checking for theme preview"),window.location.hostname.endsWith(".shopifypreview.com")?(this.log("on shopify preview domain"),this.clearThemeBar(!0,!1,this.state),document.querySelector("#sl-preview-bar-hide")?.remove(),!1):this.isThemePreview()?this.state.essential.visitorTests.some(t=>t.isThemeTest&&t.hypothesisId!=null&&this.getHypothesis(t.hypothesisId)&&t.themeId===themeId)?(this.log("On active theme test, removing theme bar"),this.clearThemeBar(!1,!0,this.state),!1):this.state.essential.visitorTests.some(t=>t.isThemeTest&&t.hypothesisId!=null&&!this.getHypothesis(t.hypothesisId)&&t.themeId===themeId)?(this.log("Visitor is on an inactive theme test, redirecting to main theme"),this.redirectToMainTheme(),!0):this.state.essential.isFirstLoad?(this.log("No visitor found on theme preview, redirecting to main theme"),this.redirectToMainTheme(),!0):this.inactiveTestConfigs.some(t=>t.hypotheses.some(e=>e.themeId===themeId))?(this.log("Current theme is an inactive theme test, redirecting to main theme"),this.redirectToMainTheme(),!0):this.testConfigs.some(t=>t.hypotheses.some(e=>e.themeId===themeId))?(this.log("Falling back to clearing theme bar"),this.clearThemeBar(!1,!0,this.state),!1):(this.log("No tests on current theme, skipping script"),this.clearThemeBar(!0,!1,this.state),document.querySelector("#sl-preview-bar-hide")?.remove(),!0):(this.log("Not on theme preview"),this.clearThemeBar(!0,!1,this.state),!1)}redirectToMainTheme(){this.hidePage();const t=new URL(window.location.toString());t.searchParams.set("preview_theme_id",""),this.queueRedirect(t)}testsForUrl(t){const e=new URL(window.location.href),i=this.typeFromTemplate();return t.filter(s=>s.hypotheses.some(r=>r.type!=="dom"&&r.type!=="price"&&(r.isControl&&r.type===i&&r.affix===template.suffix||r.type==="theme"||r.isControl&&r.type==="urlRedirect"&&r.redirectPath&&e.pathname.endsWith(r.redirectPath)||r.type==="basicScript"))&&(s.ignoreTestViewParameterEnforcement||!e.searchParams.has("view")||s.hypotheses.map(r=>r.affix).includes(e.searchParams.get("view")??"")))}domTestsForUrl(t){const e=new URL(window.location.href);return t.filter(i=>i.hypotheses.some(s=>s.type!=="dom"&&s.type!=="price"?!1:s.type==="price"&&s.priceData&&s.priceData.variants.length>0?!0:s.domSelectors&&s.domSelectors.some(r=>new RegExp(it(r)).test(e.toString()))))}async filterTestsByAudience(t,e,i){const s=[];let r=e.country;!r&&t.some(n=>n.requiresCountry&&!i.some(o=>o.testId===n.id))&&(this.log("Hiding page to check geoip"),this.hidePage(),r=await this.makeJsonRequest({method:"get",url:`${this.eventHost}/api/v0/visitors/get-country`,signal:AbortSignal.timeout(this.getCountryTimeout)}).catch(n=>(this.log("Error getting country",n),null)));for(const n of t){if(this.log("Checking audience for test '%s'",n.id),this.state.essential.visitorTests.some(c=>c.testId===n.id&&c.hypothesisId==null)){console.log(`Skipping blocked test '${n.id}'`);continue}const o=this.visitorCreatedDuringTestActive(n.statusHistory);(i.some(c=>c.testId===n.id&&(n.device==="all"||n.device===e.device&&n.device===this.device))||this.isTargetAudience(n,e,o,r))&&(this.log("Visitor is in audience for test '%s'",n.id),s.push(n))}this.testsFilteredByAudience=s}isTargetAudience(t,e,i,s){const r=this.getChannel(e);return(t.device==="all"||t.device===e.device&&t.device===this.device)&&(t.visitorOption==="all"||t.visitorOption==="new"&&i||t.visitorOption==="returning"&&!i)&&(t.targetAudiences.length===0||t.targetAudiences.reduce((n,o)=>n||o.reduce((l,c)=>l&&c(e,i,r,s),!0),!1))}visitorCreatedDuringTestActive(t){let e="";for(const i of t){if(this.state.analytics.visitor!==null&&this.state.analytics.visitor.createdAt<i.createdAt||this.state.essential.initialState.createdAt<i.createdAt)break;e=i.status}return e==="active"}getDomTestsForCurrentUrl(){return this.domTestsForUrl(this.testsFilteredByAudience)}getCurrentVisitorHypothesis(t){return t.flatMap(e=>e.hypotheses).find(e=>e.type!=="dom"&&e.type!=="price"&&this.state.essential.visitorTests.some(i=>i.hypothesisId===e.id))}getVisitorDomHypothesis(t){return t.flatMap(e=>e.hypotheses).filter(e=>(e.type==="dom"||e.type==="price")&&this.state.essential.visitorTests.some(i=>i.hypothesisId===e.id))}getHypothesis(t){return this.testConfigs.filter(e=>e.hypotheses.some(i=>i.id===t)).map(e=>e.hypotheses.find(i=>i.id===t))[0]}getActiveAssignment(){if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const e=this.state.temporary.previewConfig;return e.currentVariant&&e.testId?{testId:e.testId,hypothesisId:e.currentVariant}:null}const t=this.state.essential.visitorTests.find(e=>e.hypothesisId);return t?.hypothesisId?{testId:t.testId,hypothesisId:t.hypothesisId}:null}findActiveSubscriptionTestControl(){for(const t of this.testConfigs){const e=t.hypotheses.find(i=>i.isControl);if(e?.subscriptionData)return{testId:t.id,hypothesis:e}}return null}getDomSelectorsForHypothesis(t){if(!t)return[];if(t.domSelectors&&t.domSelectors.length>0)return t.domSelectors;if(t.priceData){const e=`${this.priceSelectorsSessionKey}_${t.id}`;try{const s=sessionStorage.getItem(e);if(s){const r=JSON.parse(s);return t.domSelectors=r,this.log("Loaded %d price selectors from cache for hypothesis '%s'",r.length,t.id),r}}catch{}const i=Ot(t.priceData);t.domSelectors=i;try{sessionStorage.setItem(e,JSON.stringify(i)),this.log("Generated and cached %d price selectors for hypothesis '%s'",i.length,t.id)}catch{this.log("Generated %d price selectors for hypothesis '%s' (cache unavailable)",i.length,t.id)}return i}return[]}hasThemeTest(t){return t.some(e=>e.hypotheses.some(i=>i.type==="theme"))}hasTestThatIsNotThemeTest(t){return t.some(e=>e.hypotheses.some(i=>i.type!=="theme"&&i.type!=="dom"&&i.type!=="price"))}hasThemeAndOtherTestTypes(t){return this.hasThemeTest(t)&&this.hasTestThatIsNotThemeTest(t)}testIsPaused(t){return t.status==="paused"||t.status==="incompatible"||t.status==="suspended"}visitorActiveTestType(){const t=this.state.essential.visitorTests.filter(e=>this.testConfigs.some(i=>i.hypotheses.some(s=>s.id==e.hypothesisId)));return t.length===0?null:t.some(e=>e.isThemeTest)?"theme":"templateOrUrlRedirect"}getReservationType(t){return t==="price"||this.isTemplateTestType(t)?"deferred":"immediate"}isTemplateTestType(t){return["product","collection","landing","index","cart","search","blog","article","collectionList"].includes(t)}getEntryCriteriaKey(t){const e=t.hypotheses.find(i=>i.isControl);if(!e)return`unknown:${t.id}`;switch(e.type){case"theme":return"global:theme";case"basicScript":return"global:autoApi";case"price":return"global:price";case"manualScript":return`conditional:manualApi:${t.id}`;case"urlRedirect":return`conditional:url:${e.redirectPath||"unknown"}`;default:return`conditional:template:${e.type}`}}isGlobalEntryCriteria(t){return t.startsWith("global:")}groupTestsByEntryCriteria(t){const e=new Map;for(const i of t){const s=this.getEntryCriteriaKey(i),r=e.get(s)||[];r.push(i),e.set(s,r)}return e}doesCurrentPageMatchEntryCriteria(t){if(this.isGlobalEntryCriteria(t))return!0;if(t==="conditional:manualApi")return!1;if(t.startsWith("conditional:url:")){const e=t.replace("conditional:url:","");return window.location.pathname.endsWith(e)}if(t.startsWith("conditional:template:")){const e=t.replace("conditional:template:","");return this.typeFromTemplate()===e}return!1}hasActiveReservation(){const t=this.getActiveReservations();return Object.values(t).some(e=>!e.isRealized)}getActiveReservation(){const t=this.getActiveReservations();return Object.values(t).find(e=>!e.isRealized)??null}clearStaleReservations(){const t=this.state.temporary.testReservations;if(!t)return;let e=!1;for(const[i,s]of Object.entries(t)){const r=this.testConfigs.find(o=>o.id===s.testId);if(!r){this.log("Test '%s' no longer in config, clearing reservation for criteria '%s'",s.testId,i),delete t[i],e=!0;continue}if(r.status!=="active"){this.log("Test '%s' status is '%s', clearing reservation for criteria '%s'",s.testId,r.status,i),delete t[i],e=!0;continue}this.testsFilteredByAudience.some(o=>o.id===s.testId)||(this.log("Visitor no longer passes audience for test '%s', clearing reservation for criteria '%s'",s.testId,i),delete t[i],e=!0)}e&&this.persistTemporaryState()}createReservations(t){if(this.state.temporary.testReservations||(this.state.temporary.testReservations={}),this.state.temporary.rolledEntryCriteria||(this.state.temporary.rolledEntryCriteria=[]),this.state.temporary.testCategory==="global"){this.createSingleReservation(t,"global");return}const i=t.filter(o=>this.doesCurrentPageMatchEntryCriteria(this.getEntryCriteriaKey(o))),s=t.filter(o=>!this.doesCurrentPageMatchEntryCriteria(this.getEntryCriteriaKey(o)));this.log("Conditional tests split - matching current page: %d, not matching: %d",i.length,s.length),i.length>0&&this.log("Tests matching current page (same pool): %o",i.map(o=>({id:o.id,title:o.title,criteria:this.getEntryCriteriaKey(o)})));const r=`conditional:current-page:${this.typeFromTemplate()}`;if(i.length>0&&!this.state.temporary.rolledEntryCriteria.includes(r)){this.createSingleReservation(i,r);for(const o of i){const l=this.getEntryCriteriaKey(o);this.state.temporary.rolledEntryCriteria.includes(l)||this.state.temporary.rolledEntryCriteria.push(l)}}const n=this.groupTestsByEntryCriteria(s);for(const[o,l]of n){if(this.state.temporary.rolledEntryCriteria.includes(o)){this.log("Already rolled for criteria '%s', skipping",o);continue}if(l.some(S=>this.state.essential.visitorTests.some(P=>P.testId===S.id))){this.log("Visitor already has VT for criteria '%s', skipping",o),this.state.temporary.rolledEntryCriteria.push(o);continue}const d=[...l].sort((S,P)=>S.id.localeCompare(P.id));this.log("Test dice roll for criteria '%s' - available tests: %o",o,d.map(S=>({id:S.id,title:S.title})));const p=Math.floor(Math.random()*d.length),h=d[p];this.log("Test dice roll: picked index %d of %d, selected test '%s' (%s)",p+1,l.length,h.id,h.title);const u=this.pickHypothesis(h);if(!u){this.log("No hypothesis picked for test '%s'",h.id);continue}this.sendDiagnosticTelemetry("assignment",h.id,{hypothesisId:u.id,isControl:u.isControl,testType:u.type});const b=this.getReservationType(u.type),k={testId:h.id,hypothesisId:u.id,testType:u.type,reservationType:b,isThemeTest:u.type==="theme",themeId:u.themeId,createdAt:new Date,isRealized:!1,entryCriteriaKey:o};this.state.temporary.testReservations[o]=k,this.state.temporary.rolledEntryCriteria.push(o),this.log("Created %s reservation for test '%s' (criteria: %s)",b,h.id,o);for(const S of l)S.id!==h.id&&this.markTestAsBlocked(S,o)}this.persistTemporaryState()}createSingleReservation(t,e){if(this.state.temporary.rolledEntryCriteria.includes(e)){this.log("Already rolled for pool '%s', skipping",e);return}if(t.some(p=>this.state.essential.visitorTests.some(h=>h.testId===p.id&&!h.isInvalid))){this.log("Visitor already has VT for pool '%s', skipping",e),this.state.temporary.rolledEntryCriteria.push(e);return}if(t.length===0){this.log("No tests in pool '%s'",e);return}const s=[...t].sort((p,h)=>p.id.localeCompare(h.id));this.log("Test dice roll for pool '%s' - available tests: %o",e,s.map(p=>({id:p.id,title:p.title,criteria:this.getEntryCriteriaKey(p)})));const r=Math.floor(Math.random()*s.length),n=s[r];this.log("Test dice roll: picked index %d of %d, selected test '%s' (%s)",r,t.length,n.id,n.title);const o=this.pickHypothesis(n);if(!o){this.log("No hypothesis picked for test '%s'",n.id);return}this.sendDiagnosticTelemetry("assignment",n.id,{hypothesisId:o.id,isControl:o.isControl,testType:o.type});const l=this.getReservationType(o.type),c=this.getEntryCriteriaKey(n),d={testId:n.id,hypothesisId:o.id,testType:o.type,reservationType:l,isThemeTest:o.type==="theme",themeId:o.themeId,createdAt:new Date,isRealized:!1,entryCriteriaKey:c};this.state.temporary.testReservations[c]=d,this.state.temporary.rolledEntryCriteria.push(e),this.log("Created %s reservation for test '%s' from pool '%s' (criteria: %s)",l,n.id,e,c);for(const p of t)p.id!==n.id&&this.markTestAsBlocked(p,`pool:${e}`);this.persistTemporaryState()}markTestAsBlocked(t,e){this.state.essential.visitorTests.some(i=>i.testId===t.id)||(this.log("Blocking visitor from test '%s' (reason: %s)",t.id,e),this.state.essential.visitorTests.push({createdAt:new Date,testId:t.id,hypothesisId:null,isThemeTest:t.hypotheses.some(i=>i.type==="theme"),shouldSendToGa:!1,isSaved:!0,isInvalid:!0,themeId:void 0}))}realizeReservationForCriteria(t){const e=this.state.temporary.testReservations?.[t];if(!e)return this.log("No reservation found for criteria '%s'",t),!1;if(e.isRealized)return this.log("Reservation already realized for criteria '%s'",t),!1;if(this.state.essential.visitorTests.some(s=>s.testId===e.testId&&!s.isInvalid))return this.log("Visitor already assigned to test '%s'",e.testId),!1;const i=this.getHypothesis(e.hypothesisId);return i?(e.isRealized=!0,this.persistTemporaryState(),this.queueAddVisitorToTest(e.testId,i),this.saveState(),this.log("Realized reservation for test '%s' (criteria: %s)",e.testId,t),!0):(this.log("Hypothesis '%s' not found",e.hypothesisId),!1)}getActiveReservations(){return this.state.temporary.testReservations??{}}getReservationForCurrentPage(){const t=this.getActiveReservations();for(const[e,i]of Object.entries(t)){if(i.isRealized)continue;const s=this.testConfigs.find(r=>r.id===i.testId);if(!(!s||s.status!=="active")&&this.doesCurrentPageMatchEntryCriteria(e))return i}return null}getReservationForTest(t){const e=this.getActiveReservations();return Object.values(e).find(i=>i.testId===t)??null}getReservationTestType(){const t=this.getActiveReservations(),e=Object.values(t);if(e.length===0)return null;for(const i of e)if(i.isThemeTest)return"theme";for(const i of e)if(i.testType==="price")return"price";return e.some(i=>!i.isRealized)?"templateOrUrlRedirect":null}hasPriceTests(t){return t.some(e=>e.hypotheses.some(i=>i.type==="price"))}_priceTestProductIds=null;getPriceTestProductIds(){if(this._priceTestProductIds)return this._priceTestProductIds;const t=new Set;for(const e of this.testConfigs)for(const i of e.hypotheses)if(i.type==="price"){for(const s of i.domSelectors||[]){const r=s.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);r?.[1]&&t.add(r[1])}if(i.priceData?.variants)for(const[s]of i.priceData.variants)t.add(s)}return this._priceTestProductIds=t,this.log("Built price test product ID cache with %d products",t.size),t}isProductInAnyPriceTest(t){return this.getPriceTestProductIds().has(t)}visitorActiveTestTypeWithReservations(){const t=this.getActiveReservations();for(const r of Object.values(t)){if(r.isThemeTest)return"theme";if(r.testType==="price")return"price"}if(Object.values(t).some(r=>!r.isRealized)){if(this.state.temporary.testCategory==="global")for(const n of Object.values(t)){if(n.testType==="theme")return"theme";if(n.testType==="price")return"price";if(n.testType==="basicScript")return"theme"}return"templateOrUrlRedirect"}const i=this.state.essential.visitorTests.filter(r=>!r.isInvalid&&this.testConfigs.some(n=>n.hypotheses.some(o=>o.id===r.hypothesisId)));return i.length===0?null:i.some(r=>this.getHypothesis(r.hypothesisId)?.type==="price")?"price":i.some(r=>r.isThemeTest)?"theme":"templateOrUrlRedirect"}applyControlForAudienceFilteredPriceTests(){const t=this.testConfigs.filter(s=>s.status==="active"&&s.hypotheses.some(r=>r.type==="price"));if(t.length===0)return;const e=this.testsFilteredByAudience.filter(s=>s.hypotheses.some(r=>r.type==="price")),i=t.filter(s=>!e.some(r=>r.id===s.id));if(i.length!==0){this.log("Found %d price tests filtered by audience, applying control selectors",i.length);for(const s of i){const r=s.hypotheses.find(c=>c.isControl),n=this.getDomSelectorsForHypothesis(r);if(n.length===0){this.log("No control selectors for audience-filtered price test '%s'",s.id);continue}const o=new URL(window.location.href);n.some(c=>{try{return new RegExp(it(c)).test(o.toString())}catch{return!1}})&&(this.log("Applying control selectors for audience-filtered price test '%s'",s.id),N(document,{testId:s.id,hypothesisId:r.id,selectors:n},()=>{}),this.updatePriceTestHiddenInputs(s.id,"control",!1))}}}pickHypothesis(t){let e=Math.random();const i=t.hypotheses.reduce((r,n)=>r+n.visitorCount,0);return t.hypotheses.sort((r,n)=>r.isControl?n.isControl?0:-1:n.isControl?1:0).reduce((r,n)=>{if(r!==null)return r;const l=t.hypotheses.reduce((c,d)=>c&&d.visitorCount>20,!0)?n.visitorCount/i-n.trafficPercentage:0;return e<=n.trafficPercentage-l?n:(e-=n.trafficPercentage-l,null)},null)}typeFromTemplate(){switch(template.type){case"list-collections":return"collectionList";case"page":return"landing";case"article":case"blog":case"cart":case"collection":case"index":case"product":case"search":return template.type;default:return null}}queueRedirect(t){this.saveState(),this.disableReferrerOverride||(this.log(`Saving temporary referrer override '${document.referrer}'`),this.state.temporary.originalReferrer=document.referrer,this.persistTemporaryState()),window.setTimeout(()=>window.location.assign(t),0),window.setTimeout(()=>{this.syncAllEvents()},2e3)}scheduleRetrySync(){this.clientIdRetryCount>=5||(this.clientIdRetryCount++,window.setTimeout(()=>{this.syncAllEvents()},500))}async syncAllEvents(){const t=async()=>{if(this.isSyncing){window.setTimeout(()=>{(async()=>await t())()},500);return}try{if(this.isSyncing=!0,this.syncGAEvents(),this.shopifyAnalyticsId||(this.shopifyAnalyticsId=this.getShopifyAnalyticsId()),!this.shopifyAnalyticsId){this.scheduleRetrySync();return}await this.syncEvents()}finally{this.isSyncing=!1}};await t()}async syncEvents(){if(!this.state.essential.consentApproved||!this.shopifyAnalyticsId||this.state.analytics.queue.length===0)return;const t=this.state.analytics.queue.length,e=this.state.analytics.queue.splice(0,t);this.log("Syncing %s events",t);try{const i={shop:this.shop,visitorDetails:{shopifyAnalyticsId:this.shopifyAnalyticsId,device:this.state.analytics.visitor?.device??this.device,country:this.state.analytics.visitor?.country??null,...this.state.essential.initialState},events:this.state.essential.visitorTests.filter(r=>!r.isInvalid&&!r.isSaved&&r.hypothesisId!=null).map(r=>new yt(r.testId,r.hypothesisId,r.createdAt)).concat(e)};await this.sendEvents(i);for(const r of this.state.essential.visitorTests.filter(n=>!n.isInvalid&&!n.isSaved&&n.hypothesisId!=null))this.sendDiagnosticTelemetry("event-delivered",r.testId,{hypothesisId:r.hypothesisId,isControl:r.assignedTo==="control",testType:r.testType??"unknown"});const s=await this.getVisitor(this.shopifyAnalyticsId);s!==null&&this.updateLocalVisitor(s);for(const r of this.state.essential.visitorTests.filter(n=>!n.isInvalid&&!n.isSaved))r.isSaved=!0,r.savedAt=Date.now()}catch{this.state.analytics.queue.splice(0,0,...e)}finally{this.saveState()}}syncGAEvents(){if(!this.gaConfig.sendEvents){if(pt)return;pt=!0,this.log("UseGtag is false — skipping GA Events");return}if(this.isSyncingGA){this.log("Already syncing GA - skipping GA events");return}const t=this.state.essential.visitorTests.filter(e=>e.shouldSendToGa);t.length!==0&&(this.isSyncingGA=!0,this.log("Syncing %s GA Events",t.length),Promise.allSettled(t.map(e=>this.sendGAEvent(e))).then(()=>this.log("All gtag events sent")).finally(()=>this.isSyncingGA=!1))}sendGAEvent(t){return new Promise(e=>{this.log("Sending GA Event for test %s, hypothesis %s",t.testId,t.hypothesisId);const i=()=>{this.log("GA acknowledged event for hypothesis %s",t.hypothesisId),t.shouldSendToGa=!1,this.persistEssentialState(),e()},s={exp_variant_string:`SL-${t.testId}-${t.hypothesisId}`};this.shopliftDebug&&Object.assign(s,{debug_mode:!0});function r(n,o,l){window.dataLayer=window.dataLayer||[],window.dataLayer.push(arguments)}this.gaConfig.mode==="gtag"?r("event","experience_impression",{...s,event_callback:i}):(window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"experience_impression",...s,eventCallback:i}))})}updateLocalVisitor(t){let e;({visitorTests:e,...this.state.analytics.visitor}=t),this.log("updateLocalVisitor - server returned %d tests: %o",e.length,e.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isInvalid:s.isInvalid}))),this.log("updateLocalVisitor - local has %d tests: %o",this.state.essential.visitorTests.length,this.state.essential.visitorTests.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isSaved:s.isSaved,isInvalid:s.isInvalid})));const i=300*1e3;for(const s of this.state.essential.visitorTests.filter(r=>r.isSaved&&(!r.savedAt||Date.now()-r.savedAt>i)&&!e.some(n=>n.testId===r.testId)))this.log("updateLocalVisitor - marking LOCAL test as INVALID (isSaved && not in server): testId=%s, hypothesisId=%s",s.testId,s.hypothesisId),s.isInvalid=!0;for(const s of e){const r=this.state.essential.visitorTests.findIndex(o=>o.testId===s.testId);if(!(r!==-1))this.log("updateLocalVisitor - ADDING server test (not found locally): testId=%s, hypothesisId=%s",s.testId,s.hypothesisId),this.state.essential.visitorTests.push(s);else{const o=this.state.essential.visitorTests.at(r);this.log("updateLocalVisitor - REPLACING local test with server test: testId=%s, local hypothesisId=%s -> server hypothesisId=%s, local isInvalid=%s -> false",s.testId,o?.hypothesisId,s.hypothesisId,o?.isInvalid),s.isInvalid=!1,s.shouldSendToGa=o?.shouldSendToGa??!1,s.testType=o?.testType,s.assignedTo=o?.assignedTo,s.testTitle=o?.testTitle,this.state.essential.visitorTests.splice(r,1,s)}}this.log("updateLocalVisitor - FINAL local tests: %o",this.state.essential.visitorTests.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isSaved:s.isSaved,isInvalid:s.isInvalid}))),this.state.analytics.visitor.storedAt=new Date}async getVisitor(t){try{return await this.makeJsonRequest({method:"get",url:`${this.eventHost}/api/v0/visitors/by-key/${this.shop}/${t}`})}catch{return null}}async sendEvents(t){await this.makeRequest({method:"post",url:`${this.eventHost}/api/v0/events`,data:JSON.stringify(t)})}sendDiagnosticTelemetry(t,e,i){if(!this.telemetryEnabled||!navigator.sendBeacon)return;const s=this.state.essential.consentApproved,r=JSON.stringify({shop:this.shop,testId:e,checkpoint:t,device:this.device,...s?{visitorId:this.shopifyAnalyticsId??"unknown"}:{},clientTimestamp:Date.now(),consentApproved:s,hasConsentInteraction:this.state.essential.hasConsentInteraction,...i});navigator.sendBeacon(`${this.eventHost}/api/v0/telemetry`,new Blob([r],{type:"text/plain"}))}getUTMValue(t){const i=decodeURIComponent(window.location.search.substring(1)).split("&");for(let s=0;s<i.length;s++){const r=i[s].split("=");if(r[0]===t)return r[1]||null}return null}hidePage(t){this.log("Hiding page"),this.cssHideClass&&!window.document.documentElement.classList.contains(this.cssHideClass)&&(window.document.documentElement.classList.add(this.cssHideClass),t||setTimeout(this.removeAsyncHide(this.cssHideClass),2e3))}showPage(){this.cssHideClass&&this.removeAsyncHide(this.cssHideClass)()}getDeviceType(){function t(){let i=!1;return(function(s){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(s)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(s.substr(0,4)))&&(i=!0)})(navigator.userAgent||navigator.vendor),i}function e(){let i=!1;return(function(s){(/android|ipad|playbook|silk/i.test(s)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(s.substr(0,4)))&&(i=!0)})(navigator.userAgent||navigator.vendor),i}return t()?"mobile":e()?"tablet":"desktop"}removeAsyncHide(t){return()=>{t&&window.document.documentElement.classList.remove(t)}}async getCartState(){try{let t=await this.makeJsonRequest({method:"get",url:`${window.location.origin}/cart.js`});return t===null||(t.note===null&&(t=await this.makeJsonRequest({method:"post",url:`${window.location.origin}/cart/update.js`,data:JSON.stringify({note:""})})),t==null)?null:{token:t.token,total_price:t.total_price,total_discount:t.total_discount,currency:t.currency,items_subtotal_price:t.items_subtotal_price,items:t.items.map(e=>({quantity:e.quantity,variant_id:e.variant_id,key:e.key,price:e.price,final_line_price:e.final_line_price,sku:e.sku,product_id:e.product_id}))}}catch(t){return this.log("Error sending cart info",t),null}}ensureCartAttributesForExistingPriceTests(t){try{if(this.log("Checking visitor assignments for active price tests"),t&&this.state.temporary.previewConfig){const e=this.state.temporary.previewConfig;this.log("Using preview config for merchant:",e.testId);let i="variant";if(e.variants&&e.variants.length>0){const s=e.variants.find(r=>r.id===e.currentVariant);s&&s.isControl&&(i="control")}this.log("Merchant preview - updating hidden inputs:",e.testId,i),this.updatePriceTestHiddenInputs(e.testId,i,!0);return}for(const e of this.state.essential.visitorTests){const i=this.testConfigs.find(n=>n.id===e.testId);if(!i){this.log("Test config not found:",e.testId);continue}const s=i.hypotheses.find(n=>n.id===e.hypothesisId);if(!s||s.type!=="price")continue;const r=s.isControl?"control":"variant";this.log("Updating hidden inputs for price test:",e.testId,r),this.updatePriceTestHiddenInputs(e.testId,r,t)}}catch(e){this.log("Error ensuring cart attributes for existing price tests:",e)}}subscriptionSwapDone=!1;subscriptionHideWrongPlans=null;subscriptionPriceDone=!1;subscriptionUpdateOneTime=null;subscriptionOneTimeDone=!1;swapMap=null;slptValue=null;async subscriptionSwap(){await Lt(this)}async subscriptionPriceChange(){await qt(this)}async subscriptionOneTimePrice(){await Ht(this)}updatePriceTestHiddenInputs(t,e,i){try{this.cleanupPriceTestObservers();const s=`${t}:${e}:${i?"t":"f"}`,r=C=>{const m=C.getAttribute("data-sl-pid");if(!m)return!0;if(i&&this.state.temporary.previewConfig){const w=this.state.temporary.previewConfig,T=e==="control"?"a":"b",f=w.variants.find(v=>v.label===T);if(!f)return!1;for(const v of f.domSelectors||[]){const g=v.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);if(g){const I=g[1];if(this.log(`Extracted ID from selector: ${I}, comparing to: ${m}`),I===m)return this.log("Product ID match found in preview config:",m,"variant:",f.label),!0}else this.log(`Could not extract ID from selector: ${v.cssSelector}`)}return this.log("No product ID match in preview config for:",m,"variant:",T),!1}const y=this.testConfigs.find(w=>w.id===t);if(!y)return this.log("Test config not found for testId:",t),!1;for(const w of y.hypotheses||[]){for(const T of w.domSelectors||[]){const f=T.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);if(f&&f[1]===m)return this.log("Product ID match found in domSelectors:",m,"for test:",t),!0}if(w.priceData?.variants){for(const T of w.priceData.variants)if(T[0]===m)return this.log("Product ID match found in priceData:",m,"for test:",t),!0}}return this.log("No product ID match for:",m,"in test:",t),!1},n=new Set;let o=!1,l=null;const c=(C,m)=>{if(document.querySelectorAll("[data-sl-attribute-p]").forEach(w=>{if(w instanceof Element&&w.nodeType===Node.ELEMENT_NODE&&w.isConnected&&document.contains(w))try{C.observe(w,{childList:!0,subtree:!0,characterData:!0,characterDataOldValue:!0,attributes:!1})}catch(T){this.log(`Failed to observe element (${m}):`,T)}}),document.body&&document.body.isConnected)try{C.observe(document.body,{childList:!0,subtree:!0,characterData:!0,characterDataOldValue:!0,attributes:!1})}catch(w){this.log(`Failed to observe document.body (${m}):`,w)}},d=(C,m,y,w)=>{const T=C.filter(f=>{const v=f.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);return v&&v[1]===w});this.log(`Applying ${y} DOM selectors, total: ${C.length}, filtered: ${T.length}`),T.length>0&&N(document,{testId:t,hypothesisId:m,selectors:T})},p=(C,m)=>{this.log(`Applying DOM selector changes for product ID: ${C}`),m.disconnect(),o=!0;try{if(i&&this.state.temporary.previewConfig){const y=e==="control"?"a":"b",w=this.state.temporary.previewConfig.variants.find(T=>T.label===y);if(!w?.domSelectors){this.log(`No DOM selectors found for preview variant: ${y}`);return}d(w.domSelectors,w.id,"preview config",C)}else{const y=this.testConfigs.find(T=>T.id===t);if(!y){this.log(`No test config found for testId: ${t}`);return}const w=y.hypotheses.find(T=>e==="control"?T.isControl:!T.isControl);if(!w?.domSelectors){this.log(`No DOM selectors found for assignment: ${e}`);return}d(w.domSelectors,w.id,"live config",C)}}finally{l!==null&&clearTimeout(l),l=window.setTimeout(()=>{o=!1,l=null,c(m,"reconnection"),this.log("Re-established innerHTML observer after DOM changes")},50)}},h=new MutationObserver(C=>{if(!o)for(const m of C){if(m.type!=="childList"&&m.type!=="characterData")continue;let y=m.target;m.type==="characterData"&&(y=m.target.parentElement||m.target.parentNode);let w=y,T=w.getAttribute("data-sl-attribute-p");for(;!T&&w.parentElement;)w=w.parentElement,T=w.getAttribute("data-sl-attribute-p");if(!T)continue;const f=w.innerHTML||w.textContent||"";let v="";m.type==="characterData"&&m.oldValue!==null&&(v=m.oldValue),this.log(`innerHTML changed on element with data-sl-attribute-p="${T}"`),v&&this.log(`Previous content: "${v}"`),this.log(`Current content: "${f}"`),p(T,h)}});c(h,"initial setup"),n.add(h);const u=new MutationObserver(C=>{C.forEach(m=>{m.addedNodes.forEach(y=>{if(y.nodeType===Node.ELEMENT_NODE){const w=y;k(w);const T=w.matches('input[name="properties[_slpt]"]')?[w]:w.querySelectorAll('input[name="properties[_slpt]"]');T.length>0&&this.log(`MutationObserver found ${T.length} new hidden input(s)`),T.forEach(f=>{const v=f.getAttribute("data-sl-pid");if(this.log(`MutationObserver checking new input with data-sl-pid="${v}"`),r(f))f.value!==s&&(f.value=s,this.log("Updated newly added hidden input:",s)),S(f);else{const g=f.getAttribute("data-sl-pid");g&&this.isProductInAnyPriceTest(g)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",g):(f.remove(),this.log("Removed newly added non-matching hidden input for product ID:",g))}})}})})});n.add(u);const b=new MutationObserver(C=>{C.forEach(m=>{if(m.type==="attributes"&&m.attributeName==="data-sl-pid"){const y=m.target;if(this.log("AttributeObserver detected data-sl-pid attribute change on:",y.tagName),y.matches('input[name="properties[_slpt]"]')){const w=y,T=m.oldValue,f=w.getAttribute("data-sl-pid");this.log(`data-sl-pid changed from "${T}" to "${f}" - triggering payment placement updates`),r(w)?(w.value!==s&&(w.value=s,this.log("Updated hidden input after data-sl-pid change:",s)),f&&p(f,h),this.log("Re-running payment placement updates after variant change"),k(document.body)):f&&this.isProductInAnyPriceTest(f)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",f):(w.remove(),this.log("Removed non-matching hidden input after data-sl-pid change:",f))}}})});n.add(b);const k=C=>{C.tagName==="SHOPIFY-PAYMENT-TERMS"&&(this.log("MutationObserver found new shopify-payment-terms element"),this.updateShopifyPaymentTerms(t,e));const m=C.querySelectorAll("shopify-payment-terms");m.length>0&&(this.log(`MutationObserver found ${m.length} shopify-payment-terms in added node`),this.updateShopifyPaymentTerms(t,e)),C.tagName==="AFTERPAY-PLACEMENT"&&(this.log("MutationObserver found new afterpay-placement element"),this.updateAfterpayPlacements(t,e,"afterpay"));const y=C.querySelectorAll("afterpay-placement");y.length>0&&(this.log(`MutationObserver found ${y.length} afterpay-placement in added node`),this.updateAfterpayPlacements(t,e,"afterpay")),C.tagName==="SQUARE-PLACEMENT"&&(this.log("MutationObserver found new square-placement element"),this.updateAfterpayPlacements(t,e,"square"));const w=C.querySelectorAll("square-placement");w.length>0&&(this.log(`MutationObserver found ${w.length} square-placement in added node`),this.updateAfterpayPlacements(t,e,"square")),C.tagName==="KLARNA-PLACEMENT"&&(this.log("MutationObserver found new klarna-placement element"),this.updateKlarnaPlacements(t,e));const T=C.querySelectorAll("klarna-placement");T.length>0&&(this.log(`MutationObserver found ${T.length} klarna-placement in added node`),this.updateKlarnaPlacements(t,e))},S=C=>{b.observe(C,{attributes:!0,attributeFilter:["data-sl-pid"],attributeOldValue:!0,subtree:!1});const m=C.getAttribute("data-sl-pid");this.log(`Started AttributeObserver on specific input with data-sl-pid="${m}"`)},P=()=>{const C=document.querySelectorAll('input[name="properties[_slpt]"]');this.log(`Found ${C.length} existing hidden inputs to check`),C.forEach(m=>{const y=m.getAttribute("data-sl-pid");this.log(`Checking existing input with data-sl-pid="${y}"`),r(m)?(m.value=s,this.log("Updated existing hidden input:",s),y&&(this.log("Applying initial DOM selector changes for existing product"),p(y,h)),S(m)):y&&this.isProductInAnyPriceTest(y)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",y):(m.remove(),this.log("Removed non-matching hidden input for product ID:",y))})},_=()=>{document.body?(u.observe(document.body,{childList:!0,subtree:!0}),this.log("Started MutationObserver on document.body"),P(),k(document.body)):document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{document.body&&(u.observe(document.body,{childList:!0,subtree:!0}),this.log("Started MutationObserver after DOMContentLoaded"),P(),k(document.body))}):(this.log("Set timeout on observer"),setTimeout(_,10))};_(),window.__shopliftPriceTestObservers=n,window.__shopliftPriceTestValue=s,this.log("Set up DOM observer for price test hidden inputs")}catch(s){this.log("Error updating price test hidden inputs:",s)}}updateKlarnaPlacements(t,e){this.updatePlacementElements(t,e,"klarna-placement",(i,s)=>{i.setAttribute("data-purchase-amount",s.toString())})}cleanupPriceTestObservers(){const t=window.__shopliftPriceTestObservers;t&&(t.forEach(e=>{e.disconnect()}),t.clear(),this.log("Cleaned up existing price test observers")),delete window.__shopliftPriceTestObservers,delete window.__shopliftPriceTestValue}updateAfterpayPlacements(t,e,i="afterpay"){const s=i==="square"?"square-placement":"afterpay-placement";if(document.querySelectorAll(s).length===0){this.log(`No ${s} elements found on page - early return`);return}this.updatePlacementElements(t,e,s,(n,o)=>{if(i==="afterpay"){const l=(o/100).toFixed(2);n.setAttribute("data-amount",l)}else n.setAttribute("data-amount",o.toString())}),this.log("updateAfterpayPlacements completed")}updatePlacementElements(t,e,i,s){const r=document.querySelectorAll(i);if(r.length===0){this.log(`No ${i} elements found - early return`);return}let n;if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const l=e==="control"?"a":"b",c=this.state.temporary.previewConfig.variants.find(d=>d.label===l);if(!c?.domSelectors){this.log(`No variant found for label ${l} in preview config for ${i}`);return}n=c.domSelectors,this.log(`Using preview config for ${i} in merchant mode, variant: ${l}`)}else{const l=this.testConfigs.find(d=>d.id===t);if(!l){this.log(`No testConfig found for id: ${t} - early return`);return}const c=l.hypotheses.find(d=>e==="control"?d.isControl:!d.isControl);if(!c?.domSelectors){this.log(`No hypothesis or domSelectors found for assignment: ${e} - early return`);return}n=c.domSelectors}const o=new RegExp(`${this.DATA_SL_ATTRIBUTE_P}=["'](\\d+)["']`);r.forEach(l=>{let c=null;const d=l.parentElement;if(d&&(c=d.querySelector('input[name="properties[_slpt]"]')),c||(c=l.querySelector('input[name="properties[_slpt]"]')),!c){this.log(`No hidden input found for ${i} element`);return}const p=c.getAttribute("data-sl-pid");if(!p){this.log("Hidden input has no data-sl-pid attribute - skipping");return}const h=n.find(S=>{const P=S.cssSelector.match(o);return P&&P[1]===p});if(!h){this.log(`No matching selector found for productId: ${p} - skipping element`);return}const u=h.actions.find(S=>S.scope==="price");if(!u?.value){this.log("No price action or value found - skipping element");return}const b=parseFloat(u.value.replace(/[^0-9.]/g,""));if(Number.isNaN(b)){this.log(`Invalid price "${u.value}" for product ${p} - skipping`);return}const k=Math.round(b*100);s(l,k)}),this.log(`updatePlacementElements completed for ${i}`)}updateShopifyPaymentTerms(t,e){const i=document.querySelectorAll("shopify-payment-terms");if(i.length===0)return;this.log("Store using shopify payments");let s;if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const n=e==="control"?"a":"b",o=this.state.temporary.previewConfig.variants.find(l=>l.label===n);if(!o||!o.domSelectors){this.log(`No variant found for label ${n} in preview config`);return}s=o.domSelectors,this.log(`Using preview config for shopify-payment-terms in merchant mode, variant: ${n}`)}else{const n=this.testConfigs.find(l=>l.id===t);if(!n)return;const o=n.hypotheses.find(l=>e==="control"?l.isControl===!0:l.isControl===!1);if(!o||!o.domSelectors)return;s=o.domSelectors}const r=new RegExp(`${this.DATA_SL_ATTRIBUTE_P}=["'](\\d+)["']`);i.forEach(n=>{const o=n.getAttribute("variant-id");if(!o)return;const l=s.find(c=>{const d=c.cssSelector.match(r);return d&&d[1]===o});if(l){const c=l.actions.find(d=>d.scope==="price");if(c&&c.value){const d=n.getAttribute("shopify-meta");if(d)try{const p=JSON.parse(d);if(p.variants&&Array.isArray(p.variants)){const h=p.variants.find(u=>u.id?.toString()===o);if(h){h.full_price=c.value;const u=parseFloat(c.value.replace(/[^0-9.]/g,""));if(h.number_of_payment_terms&&h.number_of_payment_terms>1){const b=u/h.number_of_payment_terms;h.price_per_term=`$${b.toFixed(2)}`}n.setAttribute("shopify-meta",JSON.stringify(p))}}}catch(p){this.log("Error parsing/updating shoplift-meta:",p)}}}})}async makeJsonRequest(t){const e=await this.makeRequest(t);return e===null?null:JSON.parse(await e.text(),F)}async makeRequest(t){const{url:e,method:i,headers:s,data:r,signal:n}=t,o=new Headers;if(s)for(const c in s)o.append(c,s[c]);(!s||!s.Accept)&&o.append("Accept","application/json"),(!s||!s["Content-Type"])&&o.append("Content-Type","application/json"),(this.eventHost.includes("ngrok.io")||this.eventHost.includes("ngrok-free.app"))&&o.append("ngrok-skip-browser-warning","1234");const l=await this.fetch(e,{method:i,headers:o,body:r,signal:n});if(!l.ok){if(l.status===204)return null;if(l.status===422){const c=await l.json();if(typeof c<"u"&&c.isBot)throw new et}throw new Error(`Error sending shoplift request ${l.status}`)}return l}queueAddVisitorToTest(t,e){if(this.state.essential.visitorTests.some(s=>s.testId===t))return;const i=this.testConfigs.find(s=>s.id===t);if(this.state.essential.visitorTests.push({createdAt:new Date,testId:t,hypothesisId:e.id,isThemeTest:e.type==="theme",themeId:e.themeId,isSaved:!1,isInvalid:!1,shouldSendToGa:!0,testType:e.type,assignedTo:e.isControl?"control":"variant",testTitle:i?.title}),e.type==="price"){const s=e.isControl?"control":"variant";this.log("Price test assignment detected, updating cart attributes:",t,s),this.updatePriceTestHiddenInputs(t,s,!1)}}queueCartUpdate(t){this.queueEvent(new wt(t))}queuePageView(t){this.queueEvent(new vt(t))}queueEvent(t){!this.state.essential.consentApproved&&this.state.essential.hasConsentInteraction||this.state.analytics.queue.length>10||this.state.analytics.queue.push(t)}legacyGetLocalStorageVisitor(){const t=this.localStorageGet(this.legacySessionKey);if(t)try{return JSON.parse(t,F)}catch{}return null}pruneStaleVisitorTests(){this.state.essential.visitorTests=this.state.essential.visitorTests.filter(t=>this.testConfigs.some(e=>e.id==t.testId)||this.inactiveTestConfigs.filter(e=>this.testIsPaused(e)).some(e=>e.id===t.testId))}pruneStateAndSave(){this.pruneStaleVisitorTests(),this.saveState()}saveState(){this.persistEssentialState(),this.persistAnalyticsState()}loadState(){const t=this.loadAnalyticsState(),e={analytics:t,essential:this.loadEssentialState(t),temporary:this.loadTemporaryState()},i=this.legacyGetLocalStorageVisitor(),s=this.legacyGetCookieVisitor(),r=[i,s].filter(n=>n!==null).sort((n,o)=>+o.storedAt-+n.storedAt)[0];return e.analytics.visitor===null&&r&&({visitorTests:e.essential.visitorTests,...e.analytics.visitor}=r,e.essential.isFirstLoad=!1,e.essential.initialState={createdAt:r.createdAt,referrer:r.referrer,utmCampaign:r.utmCampaign,utmContent:r.utmContent,utmMedium:r.utmMedium,utmSource:r.utmSource,device:r.device},this.deleteCookie("SHOPLIFT"),this.deleteLocalStorage(this.legacySessionKey)),!e.essential.consentApproved&&e.essential.hasConsentInteraction&&this.deleteLocalStorage(this.analyticsSessionKey),e}loadEssentialState(t){const e=this.loadLocalStorage(this.essentialSessionKey),i=this.loadCookie(this.essentialSessionKey),s=this.getInitialState();t.visitor?.device&&(s.device=t.visitor.device);const r={timestamp:new Date,consentApproved:!1,hasConsentInteraction:!1,debugMode:!1,initialState:s,visitorTests:[],isFirstLoad:!0},n=[e,i].filter(o=>o!==null).sort((o,l)=>+l.timestamp-+o.timestamp)[0]??r;return n.initialState||(t.visitor!==null?n.initialState=t.visitor:(n.initialState=s,n.initialState.createdAt=n.timestamp)),n}loadAnalyticsState(){const t=this.loadLocalStorage(this.analyticsSessionKey),e=this.loadCookie(this.analyticsSessionKey),i={timestamp:new Date,visitor:null,queue:[]},s=[t,e].filter(r=>r!==null).sort((r,n)=>+n.timestamp-+r.timestamp)[0]??i;return s.queue.length===0&&t&&t.queue.length>1&&(s.queue=t.queue),s}loadTemporaryState(){const t=this.sessionStorageGet(this.temporarySessionKey),e=t?JSON.parse(t,F):null,i=this.loadCookie(this.temporarySessionKey);return e??i??{isMerchant:!1,timestamp:new Date}}persistEssentialState(){this.log("Persisting essential state"),this.state.essential.isFirstLoad=!1,this.state.essential.timestamp=new Date,this.persistLocalStorageState(this.essentialSessionKey,this.state.essential),this.persistCookieState(this.essentialSessionKey,this.state.essential)}persistAnalyticsState(){this.log("Persisting analytics state"),this.state.essential.consentApproved&&(this.state.analytics.timestamp=new Date,this.persistLocalStorageState(this.analyticsSessionKey,this.state.analytics),this.persistCookieState(this.analyticsSessionKey,{...this.state.analytics,queue:[]}))}persistTemporaryState(){this.log("Setting temporary session state"),this.state.temporary.timestamp=new Date,this.sessionStorageSet(this.temporarySessionKey,JSON.stringify(this.state.temporary)),this.persistCookieState(this.temporarySessionKey,this.state.temporary,!0)}loadLocalStorage(t){const e=this.localStorageGet(t);if(e===null)return null;try{return JSON.parse(e,F)}catch{return null}}loadCookie(t){const e=this.getCookie(t);if(e===null)return null;try{return JSON.parse(e,F)}catch{return null}}persistLocalStorageState(t,e){this.localStorageSet(t,JSON.stringify(e))}persistCookieState(t,e,i=!1){const s=JSON.stringify(e),r=i?"":`expires=${new Date(new Date().getTime()+864e5*365).toUTCString()};`;document.cookie=`${t}=${s};domain=.${window.location.hostname};path=/;SameSite=Strict;${r}`}deleteCookie(t){const e=new Date(0).toUTCString();document.cookie=`${t}=;domain=.${window.location.hostname};path=/;expires=${e};`}deleteLocalStorage(t){window.localStorage.removeItem(t)}getChannel(t){return[{"name":"cross-network","test":(v) => new RegExp(".*cross-network.*", "i").test(v.utmCampaign)},{"name":"direct","test":(v) => v.utmSource === "" && v.utmMedium === ""},{"name":"paid-shopping","test":(v) => (new RegExp("^(?:Google|IGShopping|aax-us-east\.amazon-adsystem\.com|aax\.amazon-adsystem\.com|alibaba|alibaba\.com|amazon|amazon\.co\.uk|amazon\.com|apps\.shopify\.com|checkout\.shopify\.com|checkout\.stripe\.com|cr\.shopping\.naver\.com|cr2\.shopping\.naver\.com|ebay|ebay\.co\.uk|ebay\.com|ebay\.com\.au|ebay\.de|etsy|etsy\.com|m\.alibaba\.com|m\.shopping\.naver\.com|mercadolibre|mercadolibre\.com|mercadolibre\.com\.ar|mercadolibre\.com\.mx|message\.alibaba\.com|msearch\.shopping\.naver\.com|nl\.shopping\.net|no\.shopping\.net|offer\.alibaba\.com|one\.walmart\.com|order\.shopping\.yahoo\.co\.jp|partners\.shopify\.com|s3\.amazonaws\.com|se\.shopping\.net|shop\.app|shopify|shopify\.com|shopping\.naver\.com|shopping\.yahoo\.co\.jp|shopping\.yahoo\.com|shopzilla|shopzilla\.com|simplycodes\.com|store\.shopping\.yahoo\.co\.jp|stripe|stripe\.com|uk\.shopping\.net|walmart|walmart\.com)$", "i").test(v.utmSource) || new RegExp("^(.*(([^a-df-z]|^)shop|shopping).*)$", "i").test(v.utmCampaign)) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-search","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-social","test":(v) => new RegExp("^(?:43things|43things\.com|51\.com|5ch\.net|Hatena|ImageShack|academia\.edu|activerain|activerain\.com|activeworlds|activeworlds\.com|addthis|addthis\.com|airg\.ca|allnurses\.com|allrecipes\.com|alumniclass|alumniclass\.com|ameba\.jp|ameblo\.jp|americantowns|americantowns\.com|amp\.reddit\.com|ancestry\.com|anobii|anobii\.com|answerbag|answerbag\.com|answers\.yahoo\.com|aolanswers|aolanswers\.com|apps\.facebook\.com|ar\.pinterest\.com|artstation\.com|askubuntu|askubuntu\.com|asmallworld\.com|athlinks|athlinks\.com|away\.vk\.com|awe\.sm|b\.hatena\.ne\.jp|baby-gaga|baby-gaga\.com|babyblog\.ru|badoo|badoo\.com|bebo|bebo\.com|beforeitsnews|beforeitsnews\.com|bharatstudent|bharatstudent\.com|biip\.no|biswap\.org|bit\.ly|blackcareernetwork\.com|blackplanet|blackplanet\.com|blip\.fm|blog\.com|blog\.feedspot\.com|blog\.goo\.ne\.jp|blog\.naver\.com|blog\.yahoo\.co\.jp|blogg\.no|bloggang\.com|blogger|blogger\.com|blogher|blogher\.com|bloglines|bloglines\.com|blogs\.com|blogsome|blogsome\.com|blogspot|blogspot\.com|blogster|blogster\.com|blurtit|blurtit\.com|bookmarks\.yahoo\.co\.jp|bookmarks\.yahoo\.com|br\.pinterest\.com|brightkite|brightkite\.com|brizzly|brizzly\.com|business\.facebook\.com|buzzfeed|buzzfeed\.com|buzznet|buzznet\.com|cafe\.naver\.com|cafemom|cafemom\.com|camospace|camospace\.com|canalblog\.com|care\.com|care2|care2\.com|caringbridge\.org|catster|catster\.com|cbnt\.io|cellufun|cellufun\.com|centerblog\.net|chat\.zalo\.me|chegg\.com|chicagonow|chicagonow\.com|chiebukuro\.yahoo\.co\.jp|classmates|classmates\.com|classquest|classquest\.com|co\.pinterest\.com|cocolog-nifty|cocolog-nifty\.com|copainsdavant\.linternaute\.com|couchsurfing\.org|cozycot|cozycot\.com|cross\.tv|crunchyroll|crunchyroll\.com|cyworld|cyworld\.com|cz\.pinterest\.com|d\.hatena\.ne\.jp|dailystrength\.org|deluxe\.com|deviantart|deviantart\.com|dianping|dianping\.com|digg|digg\.com|diigo|diigo\.com|discover\.hubpages\.com|disqus|disqus\.com|dogster|dogster\.com|dol2day|dol2day\.com|doostang|doostang\.com|dopplr|dopplr\.com|douban|douban\.com|draft\.blogger\.com|draugiem\.lv|drugs-forum|drugs-forum\.com|dzone|dzone\.com|edublogs\.org|elftown|elftown\.com|epicurious\.com|everforo\.com|exblog\.jp|extole|extole\.com|facebook|facebook\.com|faceparty|faceparty\.com|fandom\.com|fanpop|fanpop\.com|fark|fark\.com|fb|fb\.me|fc2|fc2\.com|feedspot|feministing|feministing\.com|filmaffinity|filmaffinity\.com|flickr|flickr\.com|flipboard|flipboard\.com|folkdirect|folkdirect\.com|foodservice|foodservice\.com|forums\.androidcentral\.com|forums\.crackberry\.com|forums\.imore\.com|forums\.nexopia\.com|forums\.webosnation\.com|forums\.wpcentral\.com|fotki|fotki\.com|fotolog|fotolog\.com|foursquare|foursquare\.com|free\.facebook\.com|friendfeed|friendfeed\.com|fruehstueckstreff\.org|fubar|fubar\.com|gaiaonline|gaiaonline\.com|gamerdna|gamerdna\.com|gather\.com|geni\.com|getpocket\.com|glassboard|glassboard\.com|glassdoor|glassdoor\.com|godtube|godtube\.com|goldenline\.pl|goldstar|goldstar\.com|goo\.gl|gooblog|goodreads|goodreads\.com|google\+|googlegroups\.com|googleplus|govloop|govloop\.com|gowalla|gowalla\.com|gree\.jp|groups\.google\.com|gulli\.com|gutefrage\.net|habbo|habbo\.com|hi5|hi5\.com|hootsuite|hootsuite\.com|houzz|houzz\.com|hoverspot|hoverspot\.com|hr\.com|hu\.pinterest\.com|hubculture|hubculture\.com|hubpages\.com|hyves\.net|hyves\.nl|ibibo|ibibo\.com|id\.pinterest\.com|identi\.ca|ig|imageshack\.com|imageshack\.us|imvu|imvu\.com|in\.pinterest\.com|insanejournal|insanejournal\.com|instagram|instagram\.com|instapaper|instapaper\.com|internations\.org|interpals\.net|intherooms|intherooms\.com|irc-galleria\.net|is\.gd|italki|italki\.com|jammerdirect|jammerdirect\.com|jappy\.com|jappy\.de|kaboodle\.com|kakao|kakao\.com|kakaocorp\.com|kaneva|kaneva\.com|kin\.naver\.com|l\.facebook\.com|l\.instagram\.com|l\.messenger\.com|last\.fm|librarything|librarything\.com|lifestream\.aol\.com|line|line\.me|linkedin|linkedin\.com|listal|listal\.com|listography|listography\.com|livedoor\.com|livedoorblog|livejournal|livejournal\.com|lm\.facebook\.com|lnkd\.in|m\.blog\.naver\.com|m\.cafe\.naver\.com|m\.facebook\.com|m\.kin\.naver\.com|m\.vk\.com|m\.yelp\.com|mbga\.jp|medium\.com|meetin\.org|meetup|meetup\.com|meinvz\.net|meneame\.net|menuism\.com|messages\.google\.com|messages\.yahoo\.co\.jp|messenger|messenger\.com|mix\.com|mixi\.jp|mobile\.facebook\.com|mocospace|mocospace\.com|mouthshut|mouthshut\.com|movabletype|movabletype\.com|mubi|mubi\.com|my\.opera\.com|myanimelist\.net|myheritage|myheritage\.com|mylife|mylife\.com|mymodernmet|mymodernmet\.com|myspace|myspace\.com|netvibes|netvibes\.com|news\.ycombinator\.com|newsshowcase|nexopia|ngopost\.org|niconico|nicovideo\.jp|nightlifelink|nightlifelink\.com|ning|ning\.com|nl\.pinterest\.com|odnoklassniki\.ru|odnoklassniki\.ua|okwave\.jp|old\.reddit\.com|oneworldgroup\.org|onstartups|onstartups\.com|opendiary|opendiary\.com|oshiete\.goo\.ne\.jp|out\.reddit\.com|over-blog\.com|overblog\.com|paper\.li|partyflock\.nl|photobucket|photobucket\.com|pinboard|pinboard\.in|pingsta|pingsta\.com|pinterest|pinterest\.at|pinterest\.ca|pinterest\.ch|pinterest\.cl|pinterest\.co\.kr|pinterest\.co\.uk|pinterest\.com|pinterest\.com\.au|pinterest\.com\.mx|pinterest\.de|pinterest\.es|pinterest\.fr|pinterest\.it|pinterest\.jp|pinterest\.nz|pinterest\.ph|pinterest\.pt|pinterest\.ru|pinterest\.se|pixiv\.net|pl\.pinterest\.com|playahead\.se|plurk|plurk\.com|plus\.google\.com|plus\.url\.google\.com|pocket\.co|posterous|posterous\.com|pro\.homeadvisor\.com|pulse\.yahoo\.com|qapacity|qapacity\.com|quechup|quechup\.com|quora|quora\.com|qzone\.qq\.com|ravelry|ravelry\.com|reddit|reddit\.com|redux|redux\.com|renren|renren\.com|researchgate\.net|reunion|reunion\.com|reverbnation|reverbnation\.com|rtl\.de|ryze|ryze\.com|salespider|salespider\.com|scoop\.it|screenrant|screenrant\.com|scribd|scribd\.com|scvngr|scvngr\.com|secondlife|secondlife\.com|serverfault|serverfault\.com|shareit|sharethis|sharethis\.com|shvoong\.com|sites\.google\.com|skype|skyrock|skyrock\.com|slashdot\.org|slideshare\.net|smartnews\.com|snapchat|snapchat\.com|social|sociallife\.com\.br|socialvibe|socialvibe\.com|spaces\.live\.com|spoke|spoke\.com|spruz|spruz\.com|ssense\.com|stackapps|stackapps\.com|stackexchange|stackexchange\.com|stackoverflow|stackoverflow\.com|stardoll\.com|stickam|stickam\.com|studivz\.net|suomi24\.fi|superuser|superuser\.com|sweeva|sweeva\.com|t\.co|t\.me|tagged|tagged\.com|taggedmail|taggedmail\.com|talkbiznow|talkbiznow\.com|taringa\.net|techmeme|techmeme\.com|tencent|tencent\.com|tiktok|tiktok\.com|tinyurl|tinyurl\.com|toolbox|toolbox\.com|touch\.facebook\.com|tr\.pinterest\.com|travellerspoint|travellerspoint\.com|tripadvisor|tripadvisor\.com|trombi|trombi\.com|trustpilot|tudou|tudou\.com|tuenti|tuenti\.com|tumblr|tumblr\.com|tweetdeck|tweetdeck\.com|twitter|twitter\.com|twoo\.com|typepad|typepad\.com|unblog\.fr|urbanspoon\.com|ushareit\.com|ushi\.cn|vampirefreaks|vampirefreaks\.com|vampirerave|vampirerave\.com|vg\.no|video\.ibm\.com|vk\.com|vkontakte\.ru|wakoopa|wakoopa\.com|wattpad|wattpad\.com|web\.facebook\.com|web\.skype\.com|webshots|webshots\.com|wechat|wechat\.com|weebly|weebly\.com|weibo|weibo\.com|wer-weiss-was\.de|weread|weread\.com|whatsapp|whatsapp\.com|wiki\.answers\.com|wikihow\.com|wikitravel\.org|woot\.com|wordpress|wordpress\.com|wordpress\.org|xanga|xanga\.com|xing|xing\.com|yahoo-mbga\.jp|yammer|yammer\.com|yelp|yelp\.co\.uk|yelp\.com|youroom\.in|za\.pinterest\.com|zalo|zoo\.gr|zooppa|zooppa\.com)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-video","test":(v) => new RegExp("^(?:blog\.twitch\.tv|crackle|crackle\.com|curiositystream|curiositystream\.com|d\.tube|dailymotion|dailymotion\.com|dashboard\.twitch\.tv|disneyplus|disneyplus\.com|fast\.wistia\.net|help\.hulu\.com|help\.netflix\.com|hulu|hulu\.com|id\.twitch\.tv|iq\.com|iqiyi|iqiyi\.com|jobs\.netflix\.com|justin\.tv|m\.twitch\.tv|m\.youtube\.com|music\.youtube\.com|netflix|netflix\.com|player\.twitch\.tv|player\.vimeo\.com|ted|ted\.com|twitch|twitch\.tv|utreon|utreon\.com|veoh|veoh\.com|viadeo\.journaldunet\.com|vimeo|vimeo\.com|wistia|wistia\.com|youku|youku\.com|youtube|youtube\.com)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"display","test":(v) => new RegExp("^(?:display|banner|expandable|interstitial|cpm)$", "i").test(v.utmMedium)},{"name":"paid-other","test":(v) => new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"organic-shopping","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) || new RegExp("^(.*(([^a-df-z]|^)shop|shopping).*)$", "i").test(v.utmCampaign)},{"name":"organic-social","test":(v) => new RegExp("^(?:43things|43things\.com|51\.com|5ch\.net|Hatena|ImageShack|academia\.edu|activerain|activerain\.com|activeworlds|activeworlds\.com|addthis|addthis\.com|airg\.ca|allnurses\.com|allrecipes\.com|alumniclass|alumniclass\.com|ameba\.jp|ameblo\.jp|americantowns|americantowns\.com|amp\.reddit\.com|ancestry\.com|anobii|anobii\.com|answerbag|answerbag\.com|answers\.yahoo\.com|aolanswers|aolanswers\.com|apps\.facebook\.com|ar\.pinterest\.com|artstation\.com|askubuntu|askubuntu\.com|asmallworld\.com|athlinks|athlinks\.com|away\.vk\.com|awe\.sm|b\.hatena\.ne\.jp|baby-gaga|baby-gaga\.com|babyblog\.ru|badoo|badoo\.com|bebo|bebo\.com|beforeitsnews|beforeitsnews\.com|bharatstudent|bharatstudent\.com|biip\.no|biswap\.org|bit\.ly|blackcareernetwork\.com|blackplanet|blackplanet\.com|blip\.fm|blog\.com|blog\.feedspot\.com|blog\.goo\.ne\.jp|blog\.naver\.com|blog\.yahoo\.co\.jp|blogg\.no|bloggang\.com|blogger|blogger\.com|blogher|blogher\.com|bloglines|bloglines\.com|blogs\.com|blogsome|blogsome\.com|blogspot|blogspot\.com|blogster|blogster\.com|blurtit|blurtit\.com|bookmarks\.yahoo\.co\.jp|bookmarks\.yahoo\.com|br\.pinterest\.com|brightkite|brightkite\.com|brizzly|brizzly\.com|business\.facebook\.com|buzzfeed|buzzfeed\.com|buzznet|buzznet\.com|cafe\.naver\.com|cafemom|cafemom\.com|camospace|camospace\.com|canalblog\.com|care\.com|care2|care2\.com|caringbridge\.org|catster|catster\.com|cbnt\.io|cellufun|cellufun\.com|centerblog\.net|chat\.zalo\.me|chegg\.com|chicagonow|chicagonow\.com|chiebukuro\.yahoo\.co\.jp|classmates|classmates\.com|classquest|classquest\.com|co\.pinterest\.com|cocolog-nifty|cocolog-nifty\.com|copainsdavant\.linternaute\.com|couchsurfing\.org|cozycot|cozycot\.com|cross\.tv|crunchyroll|crunchyroll\.com|cyworld|cyworld\.com|cz\.pinterest\.com|d\.hatena\.ne\.jp|dailystrength\.org|deluxe\.com|deviantart|deviantart\.com|dianping|dianping\.com|digg|digg\.com|diigo|diigo\.com|discover\.hubpages\.com|disqus|disqus\.com|dogster|dogster\.com|dol2day|dol2day\.com|doostang|doostang\.com|dopplr|dopplr\.com|douban|douban\.com|draft\.blogger\.com|draugiem\.lv|drugs-forum|drugs-forum\.com|dzone|dzone\.com|edublogs\.org|elftown|elftown\.com|epicurious\.com|everforo\.com|exblog\.jp|extole|extole\.com|facebook|facebook\.com|faceparty|faceparty\.com|fandom\.com|fanpop|fanpop\.com|fark|fark\.com|fb|fb\.me|fc2|fc2\.com|feedspot|feministing|feministing\.com|filmaffinity|filmaffinity\.com|flickr|flickr\.com|flipboard|flipboard\.com|folkdirect|folkdirect\.com|foodservice|foodservice\.com|forums\.androidcentral\.com|forums\.crackberry\.com|forums\.imore\.com|forums\.nexopia\.com|forums\.webosnation\.com|forums\.wpcentral\.com|fotki|fotki\.com|fotolog|fotolog\.com|foursquare|foursquare\.com|free\.facebook\.com|friendfeed|friendfeed\.com|fruehstueckstreff\.org|fubar|fubar\.com|gaiaonline|gaiaonline\.com|gamerdna|gamerdna\.com|gather\.com|geni\.com|getpocket\.com|glassboard|glassboard\.com|glassdoor|glassdoor\.com|godtube|godtube\.com|goldenline\.pl|goldstar|goldstar\.com|goo\.gl|gooblog|goodreads|goodreads\.com|google\+|googlegroups\.com|googleplus|govloop|govloop\.com|gowalla|gowalla\.com|gree\.jp|groups\.google\.com|gulli\.com|gutefrage\.net|habbo|habbo\.com|hi5|hi5\.com|hootsuite|hootsuite\.com|houzz|houzz\.com|hoverspot|hoverspot\.com|hr\.com|hu\.pinterest\.com|hubculture|hubculture\.com|hubpages\.com|hyves\.net|hyves\.nl|ibibo|ibibo\.com|id\.pinterest\.com|identi\.ca|ig|imageshack\.com|imageshack\.us|imvu|imvu\.com|in\.pinterest\.com|insanejournal|insanejournal\.com|instagram|instagram\.com|instapaper|instapaper\.com|internations\.org|interpals\.net|intherooms|intherooms\.com|irc-galleria\.net|is\.gd|italki|italki\.com|jammerdirect|jammerdirect\.com|jappy\.com|jappy\.de|kaboodle\.com|kakao|kakao\.com|kakaocorp\.com|kaneva|kaneva\.com|kin\.naver\.com|l\.facebook\.com|l\.instagram\.com|l\.messenger\.com|last\.fm|librarything|librarything\.com|lifestream\.aol\.com|line|line\.me|linkedin|linkedin\.com|listal|listal\.com|listography|listography\.com|livedoor\.com|livedoorblog|livejournal|livejournal\.com|lm\.facebook\.com|lnkd\.in|m\.blog\.naver\.com|m\.cafe\.naver\.com|m\.facebook\.com|m\.kin\.naver\.com|m\.vk\.com|m\.yelp\.com|mbga\.jp|medium\.com|meetin\.org|meetup|meetup\.com|meinvz\.net|meneame\.net|menuism\.com|messages\.google\.com|messages\.yahoo\.co\.jp|messenger|messenger\.com|mix\.com|mixi\.jp|mobile\.facebook\.com|mocospace|mocospace\.com|mouthshut|mouthshut\.com|movabletype|movabletype\.com|mubi|mubi\.com|my\.opera\.com|myanimelist\.net|myheritage|myheritage\.com|mylife|mylife\.com|mymodernmet|mymodernmet\.com|myspace|myspace\.com|netvibes|netvibes\.com|news\.ycombinator\.com|newsshowcase|nexopia|ngopost\.org|niconico|nicovideo\.jp|nightlifelink|nightlifelink\.com|ning|ning\.com|nl\.pinterest\.com|odnoklassniki\.ru|odnoklassniki\.ua|okwave\.jp|old\.reddit\.com|oneworldgroup\.org|onstartups|onstartups\.com|opendiary|opendiary\.com|oshiete\.goo\.ne\.jp|out\.reddit\.com|over-blog\.com|overblog\.com|paper\.li|partyflock\.nl|photobucket|photobucket\.com|pinboard|pinboard\.in|pingsta|pingsta\.com|pinterest|pinterest\.at|pinterest\.ca|pinterest\.ch|pinterest\.cl|pinterest\.co\.kr|pinterest\.co\.uk|pinterest\.com|pinterest\.com\.au|pinterest\.com\.mx|pinterest\.de|pinterest\.es|pinterest\.fr|pinterest\.it|pinterest\.jp|pinterest\.nz|pinterest\.ph|pinterest\.pt|pinterest\.ru|pinterest\.se|pixiv\.net|pl\.pinterest\.com|playahead\.se|plurk|plurk\.com|plus\.google\.com|plus\.url\.google\.com|pocket\.co|posterous|posterous\.com|pro\.homeadvisor\.com|pulse\.yahoo\.com|qapacity|qapacity\.com|quechup|quechup\.com|quora|quora\.com|qzone\.qq\.com|ravelry|ravelry\.com|reddit|reddit\.com|redux|redux\.com|renren|renren\.com|researchgate\.net|reunion|reunion\.com|reverbnation|reverbnation\.com|rtl\.de|ryze|ryze\.com|salespider|salespider\.com|scoop\.it|screenrant|screenrant\.com|scribd|scribd\.com|scvngr|scvngr\.com|secondlife|secondlife\.com|serverfault|serverfault\.com|shareit|sharethis|sharethis\.com|shvoong\.com|sites\.google\.com|skype|skyrock|skyrock\.com|slashdot\.org|slideshare\.net|smartnews\.com|snapchat|snapchat\.com|social|sociallife\.com\.br|socialvibe|socialvibe\.com|spaces\.live\.com|spoke|spoke\.com|spruz|spruz\.com|ssense\.com|stackapps|stackapps\.com|stackexchange|stackexchange\.com|stackoverflow|stackoverflow\.com|stardoll\.com|stickam|stickam\.com|studivz\.net|suomi24\.fi|superuser|superuser\.com|sweeva|sweeva\.com|t\.co|t\.me|tagged|tagged\.com|taggedmail|taggedmail\.com|talkbiznow|talkbiznow\.com|taringa\.net|techmeme|techmeme\.com|tencent|tencent\.com|tiktok|tiktok\.com|tinyurl|tinyurl\.com|toolbox|toolbox\.com|touch\.facebook\.com|tr\.pinterest\.com|travellerspoint|travellerspoint\.com|tripadvisor|tripadvisor\.com|trombi|trombi\.com|trustpilot|tudou|tudou\.com|tuenti|tuenti\.com|tumblr|tumblr\.com|tweetdeck|tweetdeck\.com|twitter|twitter\.com|twoo\.com|typepad|typepad\.com|unblog\.fr|urbanspoon\.com|ushareit\.com|ushi\.cn|vampirefreaks|vampirefreaks\.com|vampirerave|vampirerave\.com|vg\.no|video\.ibm\.com|vk\.com|vkontakte\.ru|wakoopa|wakoopa\.com|wattpad|wattpad\.com|web\.facebook\.com|web\.skype\.com|webshots|webshots\.com|wechat|wechat\.com|weebly|weebly\.com|weibo|weibo\.com|wer-weiss-was\.de|weread|weread\.com|whatsapp|whatsapp\.com|wiki\.answers\.com|wikihow\.com|wikitravel\.org|woot\.com|wordpress|wordpress\.com|wordpress\.org|xanga|xanga\.com|xing|xing\.com|yahoo-mbga\.jp|yammer|yammer\.com|yelp|yelp\.co\.uk|yelp\.com|youroom\.in|za\.pinterest\.com|zalo|zoo\.gr|zooppa|zooppa\.com)$", "i").test(v.utmSource) || new RegExp("^(?:social|social-network|social-media|sm|social network|social media)$", "i").test(v.utmMedium)},{"name":"organic-video","test":(v) => new RegExp("^(?:blog\.twitch\.tv|crackle|crackle\.com|curiositystream|curiositystream\.com|d\.tube|dailymotion|dailymotion\.com|dashboard\.twitch\.tv|disneyplus|disneyplus\.com|fast\.wistia\.net|help\.hulu\.com|help\.netflix\.com|hulu|hulu\.com|id\.twitch\.tv|iq\.com|iqiyi|iqiyi\.com|jobs\.netflix\.com|justin\.tv|m\.twitch\.tv|m\.youtube\.com|music\.youtube\.com|netflix|netflix\.com|player\.twitch\.tv|player\.vimeo\.com|ted|ted\.com|twitch|twitch\.tv|utreon|utreon\.com|veoh|veoh\.com|viadeo\.journaldunet\.com|vimeo|vimeo\.com|wistia|wistia\.com|youku|youku\.com|youtube|youtube\.com)$", "i").test(v.utmSource) || new RegExp("^(.*video.*)$", "i").test(v.utmMedium)},{"name":"organic-search","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) || v.utmMedium.toLowerCase() === "organic"},{"name":"referral","test":(v) => new RegExp("^(?:referral|app|link)$", "i").test(v.utmMedium)},{"name":"email","test":(v) => new RegExp("^(?:email|e-mail|e_mail|e mail)$", "i").test(v.utmMedium) || new RegExp("^(?:email|e-mail|e_mail|e mail)$", "i").test(v.utmSource)},{"name":"affiliate","test":(v) => v.utmMedium.toLowerCase() === "affiliate"},{"name":"audio","test":(v) => v.utmMedium.toLowerCase() === "audio"},{"name":"sms","test":(v) => v.utmSource.toLowerCase() === "sms" || v.utmMedium.toLowerCase() === "sms"},{"name":"mobile-push-notification","test":(v) => v.utmSource.toLowerCase() === "firebase" || new RegExp("(?:.*mobile.*|.*notification.*|push$)", "i").test(v.utmMedium)}].find(i=>i.test(t))?.name??"other"}getShopifyAnalyticsId(){const t=this.getCookie("_shopify_y");if(t)return t;try{const e=this.localStorageGet("Shoplift_ClientId");if(e)return e}catch{}return null}legacyGetCookieVisitor(){const t=this.getCookie("SHOPLIFT");return t===null?null:JSON.parse(t,F)}getCookie(t){const e=this.cookie.split("; ").filter(i=>i.split("=").at(0)===t).at(0);return e===void 0?null:e.split("=").slice(1).join("=")}monitorConsentChange(){document.addEventListener("visitorConsentCollected",t=>{(async()=>await this.onConsentChange(t.detail.analyticsAllowed,!0))()}),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>this.loadShopifyConsentApiWithRetry()):this.loadShopifyConsentApiWithRetry()}loadShopifyConsentApiWithRetry(){let t=0;const e=()=>{this.loadShopifyConsentApi()||t++<10&&window.setTimeout(e,100)};e()}loadShopifyConsentApi(){if(window.Shopify){this.log("Loading Shopify features");const t=async()=>{if(!window.Shopify){this.log("Shopify object missing... suddenly?");return}if(window.Shopify.customerPrivacy===void 0){this.log("Shopify CustomerPrivacy api still missing, trying again in 1000ms"),e=window.setTimeout(()=>{(async()=>await t())()},1e3);return}const i=window.Shopify.customerPrivacy.getTrackingConsent();await this.onConsentChange(window.Shopify.customerPrivacy.analyticsProcessingAllowed(),i==="yes")};let e=window.setTimeout(()=>{(async()=>await t())()},5e3);return window.Shopify.loadFeatures([{name:"consent-tracking-api",version:"0.1"}],i=>{(async()=>{if(window.clearTimeout(e),i){this.log("Error loading consent tracking",i);return}await t()})()}),!0}return!1}async onConsentChange(t,e){try{if(this.log("Consent change detected",t,e),this.state.essential.consentApproved=t,this.state.essential.hasConsentInteraction=e,!this.state.essential.consentApproved){this.state.essential.hasConsentInteraction&&(this.state.analytics.queue.length=0),this.saveState();return}this.cookie=document.cookie,this.shopifyAnalyticsId=this.getShopifyAnalyticsId();for(const i of this.state.analytics.queue.filter(s=>s.type===1||s.type===2)){const s=i;s.shopifyAnalyticsId=this.shopifyAnalyticsId}this.saveState(),await this.syncAllEvents()}catch(i){this.log("Error syncing on consent change",i)}}isThemePreview(){return isThemePreview||themeRole!=="main"}isAppProxyPath(){const t=["/apps/","/tools/","/a/"],e=window.location.pathname;return t.some(i=>e.startsWith(i))}clearThemeBar(t,e,i){const s=structuredClone(i);this.log("Looking for theme bar"),this.waitForElement(null,"body").then(r=>this.waitForElement(r,"#preview-bar-iframe, #PBarNextFrameWrapper").then(n=>(this.log("Found theme bar"),e&&(this.log("Removing theme bar"),n.remove()),t?this.makeRequest({url:`${this.eventHost}/api/v0/logs`,method:"post",data:JSON.stringify({...this.debugState(),stateAtEvaluation:s},X)}):Promise.resolve(null)))).catch(r=>console.error(r))}waitForElement(t,e){return new Promise(i=>{const s=document.querySelector(e);if(s){i(s);return}const r=new MutationObserver(n=>{const o=document.querySelector(e);if(o){r.disconnect(),i(o);return}});r.observe(t??document.documentElement,{childList:!0})})}setDebug(t){this.state.essential.debugMode=t,this.saveState()}log(t,...e){let i=0;const s=t.replace(/%[sdoOfF]/g,r=>{if(i>=e.length)return r;const n=e[i++];return r==="%o"||r==="%O"?JSON.stringify(n):String(n)});this.logHistory.push(`[${new Date().toISOString()}][SL] ${s}`),!(!this.state.essential.debugMode&&!this.shopliftDebug)&&console.debug(`[SL] ${t}`,...e)}debugState(){return{state:this.state,storage:{essential:this.loadLocalStorage(this.essentialSessionKey),analytics:this.loadLocalStorage(this.analyticsSessionKey)},params:{shop:this.shop,host:this.host,eventHost:this.eventHost,cssHideClass:this.cssHideClass,testConfigs:this.testConfigs,inactiveTestConfigs:this.inactiveTestConfigs,sendPageView:this.sendPageView,isShopifyMerchantCookie:this.getCookie("is_shopify_merchant"),themeId,url:window.location.href,isThemePreview,themeRole,gaConfig:this.gaConfig},logHistory:this.logHistory}}createViewportObserver(t,e={}){const{threshold:i=this.VIEWPORT_TRACK_THRESHOLD,triggerOnce:s=!0}=e,r=new Set;return new IntersectionObserver(n=>{n.forEach(o=>{if(o.isIntersecting&&!r.has(o.target)){const l=o.target,c=l.getAttribute(this.DATA_SL_TEST_ID);c&&(t(c,l),s&&r.add(l))}})},{threshold:i})}applyChangesWithViewport(t,e,i,s){const r=e.selectorsForViewportTracking??e.selectors,n=o=>{if(this.state.essential.visitorTests.some(h=>h.testId===o)||this.activeViewportObservers.has(o))return;const l=[];if(r.forEach(h=>{t.querySelectorAll(h.cssSelector).forEach(b=>l.push(b))}),l.length===0)return;let c=!1;const d=()=>{c||(c=!0,i(o),p.disconnect(),this.activeViewportObservers.delete(o))},p=this.createViewportObserver(()=>{d()},{triggerOnce:!0,...s});this.activeViewportObservers.set(o,p),this.log(`Created viewport observer for test ${o}, observing ${l.length} elements`),l.forEach(h=>{h.setAttribute(this.DATA_SL_TEST_ID,String(o)),p.observe(h)}),setTimeout(()=>{c||l.forEach(h=>{const u=h.getBoundingClientRect(),b=s?.threshold??this.VIEWPORT_TRACK_THRESHOLD,k=Math.min(u.bottom,window.innerHeight)-Math.max(u.top,0),S=Math.min(u.right,window.innerWidth)-Math.max(u.left,0);u.top<window.innerHeight&&u.bottom>0&&u.left<window.innerWidth&&u.right>0&&k>0&&S>0&&k>=u.height*b&&(this.log(`Price element already visible in viewport for test ${o}:`,h),d())})},100)};e.selectors.length>0&&N(t,e,()=>{}),bt(t,{testId:e.testId,hypothesisId:e.hypothesisId,selectors:r},o=>{n(o)})}applyPriceTestWithMapLookup(t,e,i,s){if(!e.priceData){this.log("No price data for hypothesis '%s'",e.id);return}this.log("Hypothesis '%s' isControl=%s, priceData has %d variants",e.id,e.isControl,e.priceData.variants.length);const r=e.priceData.variants.slice(0,3);for(const[S,P,_]of r)this.log("  Sample priceData: variant=%s, price=%d, compareAt=%d",S,P,_);const n=j(e.priceData),o=new Set;for(const S of i)if(S.priceData)for(const[P]of S.priceData.variants)o.add(P);this.log("Price test Map lookup: %d products in hypothesis, %d total products to track",n.size,o.size);const l=e.priceData,c=new WeakSet;let d=!1;const p="[data-sl-attribute-p], [data-sl-attribute-cap], [data-sl-attribute-discount]",h=S=>{if(c.has(S))return;const P=S.getAttribute("data-sl-attribute-p"),_=S.getAttribute("data-sl-attribute-cap"),C=S.getAttribute("data-sl-attribute-discount"),m=P||_||C;if(!m||!o.has(m))return;c.add(S);const y=n.get(m);y&&(this.log("Applying price for product %s: %d cents (compare at: %d cents)",m,y.priceInCents,y.compareAtPriceInCents),Dt(S,m,y,l),this.log("Applied price to element for product %s",m)),!d&&!this.state.essential.visitorTests.some(w=>w.testId===t)&&(S.setAttribute(this.DATA_SL_TEST_ID,String(t)),this.setupElementViewportTracking(S,t,()=>{d||(d=!0,s(t))}))},u=()=>{const S=document.querySelectorAll(p);this.log("Scanning for price elements, found: %d",S.length),S.forEach(h)},b=new MutationObserver(S=>{for(const P of S)P.type==="childList"&&P.addedNodes.forEach(_=>{if(_.nodeType===Node.ELEMENT_NODE){const C=_;(C.hasAttribute("data-sl-attribute-p")||C.hasAttribute("data-sl-attribute-cap")||C.hasAttribute("data-sl-attribute-discount"))&&h(C),C.querySelectorAll(p).forEach(h)}}),P.type==="attributes"&&P.target instanceof Element&&h(P.target)}),k=document.body||document.documentElement;b.observe(k,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-sl-attribute-p","data-sl-attribute-cap","data-sl-attribute-discount"]}),this.log("MutationObserver started for price elements"),u(),document.readyState==="loading"&&document.addEventListener("DOMContentLoaded",()=>{this.log("DOMContentLoaded - rescanning for price elements"),u()}),setTimeout(()=>{this.log("Delayed rescan for price elements"),u()},100),setTimeout(()=>{this.log("Final rescan for price elements"),u()},500)}setupElementViewportTracking(t,e,i){const s=this.VIEWPORT_TRACK_THRESHOLD,r=t.getBoundingClientRect(),n=Math.min(r.bottom,window.innerHeight)-Math.max(r.top,0),o=Math.min(r.right,window.innerWidth)-Math.max(r.left,0);if(r.top<window.innerHeight&&r.bottom>0&&r.left<window.innerWidth&&r.right>0&&n>0&&o>0&&n>=r.height*s){this.log("Price element already visible for test %s",e),i();return}const c=new IntersectionObserver(d=>{for(const p of d)if(p.isIntersecting&&p.intersectionRatio>=s){this.log("Price element entered viewport for test %s",e),c.disconnect(),i();break}},{threshold:s});c.observe(t)}debug(){const t=this.debugState();console.log(JSON.stringify(t,X,2))}}(async function(){window.shopliftInstance||(window.shopliftInstance=new Wt("respirecosmetic.myshopify.com","https://app.shoplift.ai","https://events.shoplift.ai",true,false,false,{"sendEvents":false,"mode":"gtag"},false,false,1000,[{"id":"019dd448-1553-753c-b435-686218b29699","startAt":"2026-04-28T13:29:47.089029Z","requiresCountry":false,"bayesianRevision":5,"device":"all","status":"active","visitorOption":"new","ignoreTestViewParameterEnforcement":false,"statusHistory":[{"status":"active","createdAt":"2026-04-28T13:29:47.095512Z"}],"hypotheses":[{"visitorCount":3213,"trafficPercentage":0.3406334830774913,"title":"Soin Levres Collagene Booster","domSelectors":[],"id":"019dd43f-483b-79f9-b492-39deac94c71c","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":true,"redirectPath":"/pages/soin-levres-collagene-booster-1"},{"visitorCount":6219,"trafficPercentage":0.6593665169225087,"title":"PDP SLSPF","domSelectors":[],"id":"019dd440-1bc6-7ec2-8a25-3869c58bc05a","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":false,"redirectPath":"/products/soin-levres-collagene-booster"}],"targetAudiences":[],"title":"LP vs PDP Soin Lèvres"},{"id":"019e74f9-1ea1-7d45-8a70-8add8cc82de2","startAt":"2026-05-29T18:22:23.876543Z","requiresCountry":false,"bayesianRevision":5,"device":"all","status":"active","visitorOption":"all","ignoreTestViewParameterEnforcement":false,"statusHistory":[{"status":"active","createdAt":"2026-05-29T18:22:23.982802Z"}],"hypotheses":[{"visitorCount":5100,"trafficPercentage":0.5013226211210324,"title":"Nouveauté - Daily Protect","domSelectors":[],"id":"019e74f8-17c8-7bec-98fd-f3061d66dc30","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":true,"redirectPath":"/pages/nouveaute-daily-protect"},{"visitorCount":5073,"trafficPercentage":0.4986773788789675,"title":"Trio Haute Protection Solaire","domSelectors":[],"id":"019e74f8-f6a2-7f03-84b3-14f382d4f320","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":false,"redirectPath":"/products/trio-haute-protection"}],"targetAudiences":[],"title":"Untitled URL test"},{"id":"019f04b7-ca07-7499-bfbe-8f3e510f2900","startAt":"2026-06-26T16:16:21.486127Z","requiresCountry":false,"bayesianRevision":5,"device":"all","status":"active","visitorOption":"all","ignoreTestViewParameterEnforcement":false,"statusHistory":[{"status":"active","createdAt":"2026-06-26T16:16:21.559694Z"}],"hypotheses":[{"visitorCount":2,"trafficPercentage":0.737179487179487,"title":"Déodorant stick Vanille Tonka","domSelectors":[],"id":"019f04b7-540b-701f-96f1-ca718cee01e4","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":true,"redirectPath":"/products/deodorant-stick-vanille-tonka-1"},{"visitorCount":1,"trafficPercentage":0.26282051282051294,"title":"Kit Découverte Déodorant stick Vanille Tonka","domSelectors":[],"id":"019f04b7-7c0b-7756-9e08-80b8657f5429","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":false,"redirectPath":"/products/kit-decouverte-deodorant-stick-vanille-tonka"}],"targetAudiences":[],"title":"Untitled URL test"}],[{"id":"b34beb01-8e98-4647-bc5c-e6de002d3bc7","bayesianRevision":4,"status":"cancelled","hypotheses":[{"id":"25225939-1d3c-4bc7-bc65-a8fd8ddd401a","type":"theme","themeId":168474706256,"affix":"","isControl":true,"redirectPath":null},{"id":"a65de22d-0a0b-411b-9e46-2cee437ca994","type":"theme","themeId":177900945744,"affix":"","isControl":false,"redirectPath":null}],"ignoreTestViewParameterEnforcement":false}],null),await window.shopliftInstance.init())})();async function Gt(a,t,e,i){const s=Mt({log:i});if(e)return i("[SUB-PREVIEW] A side — no overlay applied; widget renders naturally"),s;const r=a.widget.widgetType,n=t?j(t):null;let o=W(t),l=K(a,o),c=l.discountMap,d=l.maxDiscount;function p(){const f=W(t);f!==o&&(o=f,l=K(a,o),c=l.discountMap,d=l.maxDiscount,i(`[SUB-PREVIEW] scope refreshed currentProductId=${o??"n/a"}, maxDiscount=${d}`))}i(`[SUB-PREVIEW] side=B, currentProductId=${o??"n/a"}, maxDiscount=${d}`);function h(f){if(!t||!n)return null;const v=Y(n),g=v?n.get(v):void 0;return g?{formattedVariantPrice:G(g.priceInCents,t),formattedDiscounted:G(g.priceInCents*(1-f/100),t)}:null}function u(f){const v=J(a,f);if(!v)return d;const g=D(a,"subscriptionInput"),I=g.length?g[0].selector:'input[name="rc_plan"]',A=v.querySelector(`${I}:checked`);if(A){const E=c[A.value];if(E!==void 0)return E}return d}function b(f){const v=D(a,"subscriptionDiscount");for(const g of v)if(g.selector.includes("badge")||g.selector.includes("__badge")){const I=f.querySelector(g.selector);I?.textContent&&!I.textContent.includes(`${d}%`)&&$(I,A=>U(A,d))}}function k(f,v){const g=h(v);if(!g)return;const I=D(a,"subscriptionCompareAt");for(const A of I){const E=f.querySelector(A.selector)||f.querySelector(`[part~="${A.selector}"]`);E?.textContent&&!E.textContent.includes(g.formattedVariantPrice)&&$(E,x=>/\d/.test(x)?g.formattedVariantPrice:x)}}function S(f,v){const g=h(v);if(!g)return;const I=D(a,"subscriptionPrice");for(const A of I){const E=f.querySelector(A.selector)||f.querySelector(`[part~="${A.selector}"]`);E?.textContent&&!E.textContent.includes(g.formattedDiscounted)&&$(E,x=>/\d/.test(x)?g.formattedDiscounted:x)}}function P(f){const v=D(a,"subscriptionInput"),g=v.length?v[0].selector:'input[name="rc_plan"]',I=D(a,"subscriptionPlanDiscount"),A=I.length?I[0].selector:".rc-plans-button__discount";for(const E of Array.from(f.querySelectorAll("label"))){const x=E.querySelector(g),R=E.querySelector(A);if(x&&R?.textContent){const V=c[x.value];if(V!==void 0){const O=R.textContent.match(/[\d.]+%/)?.[0];O&&O!==`${V}%`&&$(R,L=>U(L,V))}}}}function _(f){const v=f.querySelector("select");if(v)for(const g of Array.from(v.options)){const I=c[g.value];if(I!==void 0&&g.textContent){const A=g.textContent.match(/[\d.]+%/)?.[0];A&&A!==`${I}%`&&(g.textContent=U(g.textContent,I))}}}function C(f){const v=D(a,"onetimePrice");if(!v.length||!t||!n)return;const g=Y(n),I=g?n.get(g):void 0;if(!I)return;const A=G(I.priceInCents,t),E=D(a,"onetimeContainer"),x=E.length?E[0].selector:'[part~="rc-purchase-option__onetime"]',R=f.querySelector(x);if(R)for(const V of v){const O=R.querySelector(`[part~="${V.selector}"]`);O?.textContent&&!O.textContent.includes(A)&&$(O,L=>/\d/.test(L)?A:L)}}function m(f,v){const I=D(a,"subscriptionDiscount").filter(A=>A.selector.includes("benefit")||A.selector==="rc-benefits");for(const A of I){const E=f.querySelector(A.selector);if(E?.shadowRoot){for(const x of Array.from(E.shadowRoot.querySelectorAll("li")))if(x.textContent?.includes("Save")){const R=x.textContent.match(/[\d.]+%/)?.[0];R&&R!==`${v}%`&&$(x,V=>U(V,v))}}}}let y=!1;function w(){if(!y){y=!0;try{p();const f=B(a);if(!f)return;const v=u(f);b(f),k(f,v),S(f,v),C(f);const g=J(a,f);g&&(r==="buttons"||r==="radio"?P(g):_(g)),m(f,v)}finally{y=!1}}}const T=dt({data:a,runUpdates:w});return function(){T(),s()}}const jt=Object.freeze(Object.defineProperty({__proto__:null,subscriptionPreviewRender:Gt},Symbol.toStringTag,{value:"Module"}))})(); })("/", { suffix: "deodorants", type: "collection" }, "main", 181964374352, false)</script>
 <!-- 2026-06-25T15:09:41.5405807Z -->
<style>.shoplift-hide { opacity: 0 !important; }</style>
<style id="sl-preview-bar-hide">#preview-bar-iframe, #PBarNextFrameWrapper { display: none !important; }</style>
<script type="text/javascript">(function(rootPath, template, themeRole, themeId, isThemePreview){ /* Generated on 2026-06-29T15:03:03.2984985Z */(function(){"use strict";var tt=document.createElement("style");tt.textContent=`#shoplift-preview-control{position:fixed;max-width:332px;height:56px;background-color:#141414;z-index:9999;bottom:20px;display:flex;border-radius:8px;box-shadow:13px 22px 7px #0000,9px 14px 7px #00000003,5px 8px 6px #0000000d,2px 4px 4px #00000017,1px 1px 2px #0000001a,0 0 #0000001a;align-items:center;margin:0 auto;left:16px;right:16px;opacity:0;transform:translateY(20px);visibility:hidden;transition:opacity .4s ease-in-out,transform .4s ease-in-out,visibility 0s .4s}#shoplift-preview-control.visible{opacity:1;transform:translateY(0);visibility:visible;transition:opacity .4s ease-in-out,transform .4s ease-in-out,visibility 0s 0s}#shoplift-preview-control *{font-family:Inter,sans-serif;color:#fff;box-sizing:border-box;font-size:16px}#shoplift-preview-variant-title{font-weight:400;line-height:140%;font-size:16px;text-align:start;letter-spacing:-.16px;flex-grow:1;text-wrap:nowrap;overflow:hidden;text-overflow:ellipsis}#shoplift-preview-variant-selector{position:relative;display:block;padding:6px 0;height:100%;min-width:0;flex:1 1 auto}#shoplift-preview-variant-menu-trigger{border:none;cursor:pointer;width:100%;background-color:transparent;padding:0 16px;border-left:1px solid #333;border-right:1px solid #333;height:100%;display:flex;align-items:center;justify-content:start;gap:8px}#shoplift-preview-variant-selector .menu-variant-label{width:24px;height:24px;border-radius:50%;padding:6px;display:flex;justify-content:center;align-items:center;font-size:12px;font-style:normal;font-weight:600;line-height:100%;letter-spacing:-.12px;flex-shrink:0}#shoplift-preview-variant-selector .preview-variant-menu{position:absolute;bottom:110%;transform:translate3d(0,20px,0);visibility:hidden;pointer-events:none;opacity:0;cursor:pointer;background-color:#141414;border:1px solid #141414;border-radius:6px;width:100%;max-height:156px;overflow-y:auto;box-shadow:0 8px 16px #0003;z-index:1;transition:opacity .3s ease-in-out,transform .3s ease-in-out,visibility 0s .3s}#shoplift-preview-variant-selector .preview-variant-menu.preview-variant-menu__visible{visibility:visible;pointer-events:auto;opacity:100;transform:translateZ(0);transition:opacity .3s ease-in-out,transform .3s ease-in-out,visibility 0s 0s}@media screen and (max-width:400px){#shoplift-preview-variant-selector .preview-variant-menu{position:fixed;left:0;right:0;width:auto;bottom:110%}}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item{padding:12px 16px;display:flex;overflow:hidden}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item .menu-variant-label{margin-right:6px}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item span{overflow:hidden;text-overflow:ellipsis;text-wrap:nowrap;white-space:nowrap;color:#f6f6f6;font-size:14px;font-style:normal;font-weight:500}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:hover{background-color:#545454}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:last-of-type{border-bottom-left-radius:6px;border-bottom-right-radius:6px}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:first-of-type{border-top-left-radius:6px;border-top-right-radius:6px}#shoplift-preview-control div:has(#shoplift-exit-preview-button){padding:0 16px}#shoplift-exit-preview-button{padding:6px 8px;font-weight:500;line-height:75%;border-radius:4px;background-color:transparent;border:none;text-decoration:none}#shoplift-exit-preview-button:hover{cursor:pointer;background-color:#333}#shoplift-preview-subscription-warning{position:relative;display:flex;align-items:center;gap:6px;padding:6px 10px;margin:0 4px;border-left:1px solid #333;cursor:help;outline:none}#shoplift-preview-subscription-warning__icon{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background-color:#f59e0b;color:#141414!important;font-weight:700;font-size:12px!important;line-height:1;flex-shrink:0}#shoplift-preview-subscription-warning__label{font-size:13px!important;font-weight:500;color:#fbbf24!important;text-wrap:nowrap;white-space:nowrap}#shoplift-preview-subscription-warning__tooltip{position:absolute;bottom:calc(100% + 8px);right:0;max-width:320px;width:max-content;padding:10px 12px;border-radius:6px;background-color:#1f1f1f;color:#fff!important;font-size:12px!important;line-height:1.4!important;box-shadow:0 8px 16px #0000004d;z-index:10000;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .2s ease-in-out,transform .2s ease-in-out,visibility 0s .2s;pointer-events:none}#shoplift-preview-subscription-warning__tooltip.shoplift-preview-subscription-warning__tooltip--visible{opacity:1;visibility:visible;transform:translateY(0);transition:opacity .2s ease-in-out,transform .2s ease-in-out,visibility 0s 0s}#shoplift-preview-subscription-warning:focus-visible{box-shadow:inset 0 0 0 2px #f59e0b;border-radius:4px}#shoplift-preview-control:has(#shoplift-preview-subscription-warning){max-width:480px}/*$vite$:1*/`,document.head.appendChild(tt);var ht=" daum[ /]| deusu/| yadirectfetcher|(?:^|[^g])news(?!sapphire)|(?<! (?:channel/|google/))google(?!(app|/google| pixel))|(?<! cu)bots?(?:\\b|_)|(?<!(?: ya| yandex|^job|inapp;) ?)search|(?<!(?:lib))http|(?<![hg]m)score|@[a-z][\\w-]+\\.|\\(\\)|\\.com|\\b\\d{13}\\b|^<|^[\\w \\.\\-\\(?:\\):]+(?:/v?\\d+(?:\\.\\d+)?(?:\\.\\d{1,10})*?)?(?:,|$)|^[^ ]{50,}$|^\\d+\\b|^\\w+/[\\w\\(\\)]*$|^active|^ad muncher|^amaya|^avsdevicesdk/|^biglotron|^bot|^bw/|^clamav[ /]|^client/|^cobweb/|^custom|^ddg[_-]android|^discourse|^dispatch/\\d|^downcast/|^duckduckgo|^facebook|^getright/|^gozilla/|^hobbit|^hotzonu|^hwcdn/|^jeode/|^jetty/|^jigsaw|^microsoft bits|^movabletype|^mozilla/\\d\\.\\d \\(compatible;?\\)$|^mozilla/\\d\\.\\d \\w*$|^navermailapp|^netsurf|^offline|^owler|^postman|^python|^rank|^read|^reed|^rest|^rss|^snapchat|^space bison|^svn|^swcd |^taringa|^thumbor/|^track|^valid|^w3c|^webbandit/|^webcopier|^wget|^whatsapp|^wordpress|^xenu link sleuth|^yahoo|^yandex|^zdm/\\d|^zoom marketplace/|^{{.*}}$|admin|analyzer|archive|ask jeeves/teoma|bit\\.ly/|bluecoat drtr|browsex|burpcollaborator|capture|catch|check|chrome-lighthouse|chromeframe|classifier|clean|cloud|crawl|cypress/|dareboost|datanyze|dejaclick|detect|dmbrowser|download|evc-batch/|feed|firephp|gomezagent|headless|httrack|hubspot marketing grader|hydra|ibisbrowser|images|insight|inspect|iplabel|ips-agent|java(?!;)|library|mail\\.ru/|manager|measure|neustar wpm|node|nutch|offbyone|optimize|pageburst|pagespeed|parser|perl|phantomjs|pingdom|powermarks|preview|proxy|ptst[ /]\\d|reputation|resolver|retriever|rexx;|rigor|rss\\b|scan|scrape|server|sogou|sparkler/|speedcurve|spider|splash|statuscake|synapse|synthetic|tools|torrent|trace|transcoder|url|virtuoso|wappalyzer|watch|webglance|webkit2png|whatcms/|zgrab",ft=/bot|spider|crawl|http|lighthouse/i,z;function gt(){if(z instanceof RegExp)return z;try{z=new RegExp(ht,"i")}catch{z=ft}return z}function mt(a){return!!a&&gt().test(a)}class Q{timestamp;constructor(){this.timestamp=new Date}}class yt extends Q{type;testId;hypothesisId;constructor(t,e,i){super(),this.type=3,this.testId=t,this.hypothesisId=e,this.timestamp=i}}class vt extends Q{type;path;constructor(t){super(),this.type=4,this.path=t}}class wt extends Q{type;cart;constructor(t){super(),this.type=5,this.cart=t}}class et extends Error{isBot;constructor(){super(),this.isBot=!0}}function bt(a,t,e){for(const i of t.selectors){const s=a.querySelectorAll(i.cssSelector);for(let r=0;r<s.length;r++)e(t.testId,t.hypothesisId)}st(a,t,(i,s,r,n,o)=>o(s,r),e)}function N(a,t,e){for(const i of t.selectors)rt(a,t.testId,t.hypothesisId,i,e??(()=>{}));st(a,t,rt,e??(()=>{}))}function it(a){return a.urlPatterns.reduce((t,e)=>{switch(e.operator){case"contains":return t+`.*${e}.*`;case"endsWith":return t+`.*${e}`;case"startsWith":return t+`${e}.*`}},"")}function st(a,t,e,i){new MutationObserver(()=>{for(const r of t.selectors)e(a,t.testId,t.hypothesisId,r,i)}).observe(a.documentElement,{childList:!0,subtree:!0})}function rt(a,t,e,i,s){const r=a.querySelectorAll(i.cssSelector);for(let n=0;n<r.length;n++){let o=r.item(n);if(o instanceof HTMLElement&&o.dataset.shoplift!==""){o.dataset.shoplift="";for(const l of i.actions.sort(kt))o=St(a,i.cssSelector,o,l)}}return r.length>0&&s?(s(t,e),!0):!1}function St(a,t,e,i){switch(i.type){case"innerHtml":e.innerHTML=i.value;break;case"attribute":Ct(e,i.scope,i.value);break;case"css":Tt(a,t,i.value);break;case"js":It(a,e,i);break;case"copy":return Pt(e);case"remove":At(e);break;case"move":Et(e,parseInt(i.value));break}return e}function Ct(a,t,e){a.setAttribute(t,e)}function Tt(a,t,e){const i=a.createElement("style");i.innerHTML=`${t} { ${e} }`,a.getElementsByTagName("head")[0]?.appendChild(i)}function It(a,t,e){Function("document","element",`"use strict"; ${e.value}`)(a,t)}function Pt(a){const t=a.cloneNode(!0);if(!a.parentNode)throw"Can't copy node outside of DOM";return a.parentNode.insertBefore(t,a.nextSibling),t}function At(a){a.remove()}function Et(a,t){if(t===0)return;const e=Array.prototype.slice.call(a.parentElement.children).indexOf(a),i=Math.min(Math.max(e+t,0),a.parentElement.children.length-1);a.parentElement.children.item(i).insertAdjacentElement(t>0?"afterend":"beforebegin",a)}function kt(a,t){return nt(a)-nt(t)}function nt(a){return a.type==="copy"||a.type==="remove"?0:1}var M=(a=>(a[a.Template=0]="Template",a[a.Theme=1]="Theme",a[a.UrlRedirect=2]="UrlRedirect",a[a.Script=3]="Script",a[a.Dom=4]="Dom",a[a.Price=5]="Price",a))(M||{});const xt="data:image/svg+xml,%3csvg%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M9.96001%207.90004C9.86501%207.90004%209.77001%207.86504%209.69501%207.79004L6.43501%204.53004C6.19501%204.29004%205.80501%204.29004%205.56501%204.53004L2.30501%207.79004C2.16001%207.93504%201.92001%207.93504%201.77501%207.79004C1.63001%207.64504%201.63001%207.40504%201.77501%207.26004L5.03501%204.00004C5.56501%203.47004%206.43001%203.47004%206.96501%204.00004L10.225%207.26004C10.37%207.40504%2010.37%207.64504%2010.225%207.79004C10.15%207.86004%2010.055%207.90004%209.96001%207.90004Z'%20fill='white'/%3e%3c/svg%3e",_t="data:image/svg+xml,%3csvg%20width='14'%20height='24'%20viewBox='0%200%2014%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M12.3976%2014.5255C12.2833%2013.8788%2012.0498%2013.3024%2011.6952%2012.7961C11.3416%2012.2898%2010.9209%2011.8353%2010.4353%2011.4317C9.94868%2011.0291%209.43546%2010.6488%208.89565%2010.292C8.48487%2010.049%208.09577%209.78565%207.72637%209.50402C7.35697%209.2224%207.08016%208.89503%206.89694%208.51987C6.71273%208.14471%206.67826%207.69533%206.79055%207.1697C6.86345%206.83216%206.97476%206.54647%207.12351%206.31162C7.27324%206.07778%207.47124%205.89986%207.7175%205.77684C7.96377%205.65483%208.21989%205.59383%208.48389%205.59383C8.88087%205.59383%209.17639%205.7016%209.3734%205.91714C9.56943%206.13268%209.68271%206.42345%209.71424%206.78946C9.74576%207.15547%209.72015%207.55401%209.63839%207.98509C9.55663%208.41617%209.43645%208.84724%209.27687%209.27934L13.5127%208.80149C13.9638%207.52656%2014.1017%206.42447%2013.9264%205.49725C13.751%204.56901%2013.2664%203.85122%2012.4724%203.34491C12.239%203.19648%2011.9779%203.07041%2011.6893%202.96569L12.0026%201.50979L9.86397%200L7.3875%201.50979L7.11169%202.78878C6.65166%202.8874%206.21724%203.01957%205.8114%203.19038C4.85292%203.594%204.06684%204.15115%203.45117%204.86385C2.83452%205.57655%202.42571%206.40108%202.22378%207.33847C2.06616%208.06947%202.04942%208.70796%202.17551%209.25087C2.30061%209.7948%202.52028%2010.2828%202.8355%2010.7139C3.14974%2011.145%203.51816%2011.5344%203.93977%2011.881C4.36039%2012.2288%204.782%2012.5521%205.20164%2012.851C5.68334%2013.1702%206.13844%2013.5169%206.56497%2013.8921C6.99052%2014.2672%207.31954%2014.7125%207.55004%2015.228C7.78055%2015.7445%207.81502%2016.3769%207.65347%2017.1262C7.56482%2017.5389%207.43676%2017.8765%207.27028%2018.1388C7.10381%2018.4011%206.89596%2018.5983%206.64772%2018.7295C6.3985%2018.8606%206.12071%2018.9267%205.8114%2018.9267C5.21641%2018.9267%204.79776%2018.6034%204.62833%2018.1632C4.4589%2017.7229%204.47367%2017.2583%204.60075%2016.5639C4.72782%2015.8705%205.05092%2015.1395%205.37107%2014.3699H1.17665C1.17665%2014.3699%200.207341%2016.1115%200.0310135%2017.6762C-0.0655232%2018.5302%200.0635208%2019.2653%200.41519%2019.8844C0.76686%2020.5036%201.33032%2020.9814%202.10655%2021.319C2.39222%2021.443%202.7104%2021.5447%203.05813%2021.623L2.54589%2024H7.17473L7.7047%2021.5386C8.08493%2021.442%208.43857%2021.3231%208.76562%2021.1787C9.73985%2020.7476%2010.52%2020.1427%2011.1071%2019.3649C11.6932%2018.5871%2012.0873%2017.7291%2012.2892%2016.7917C12.4744%2015.9295%2012.5099%2015.1741%2012.3966%2014.5275L12.3976%2014.5255Z'%20fill='white'/%3e%3c/svg%3e";async function Rt(a){let t=a.replace(/-/g,"+").replace(/_/g,"/");for(;t.length%4;)t+="=";const e=atob(t),i=Uint8Array.from(e,n=>n.charCodeAt(0)),s=new Blob([i]).stream().pipeThrough(new DecompressionStream("gzip")),r=await new Response(s).text();return JSON.parse(r)}function F(a,t){return typeof t=="string"&&/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+(?:Z|[+-]\d+)/.test(t)?new Date(t):t}function X(a,t){return t}function q(a,t=!1,e=!1,i=","){const s=a/100;if(e){const n=Math.round(s).toLocaleString("en-US");return i!==","?n.replace(/,/g,i):n}else{const r=t?",":".",n=s.toFixed(2).split("."),o=parseInt(n[0],10),l=n[1]??"00",c=o.toLocaleString("en-US");return i!==","?`${c.replace(/,/g,i)}${r}${l}`:t?`${c.replace(/,/g,".")}${r}${l}`:`${c}${r}${l}`}}function H(a,t,e,i){const s=t.replace("{{amount}}",q(a,!1,!1)).replace("{{amount_no_decimals}}",q(a,!1,!0)).replace("{{amount_with_comma_separator}}",q(a,!0,!1)).replace("{{amount_no_decimals_with_comma_separator}}",q(a,!0,!0)).replace("{{amount_with_space_separator}}",q(a,!1,!1," ")).replace("{{amount_no_decimals_with_space_separator}}",q(a,!1,!0," ")).replace("{{amount_with_apostrophe_separator}}",q(a,!1,!1,"'")).replace("{{amount_no_decimals_with_apostrophe_separator}}",q(a,!1,!0,"'")).replace("{{amount_with_period_and_space_separator}}",q(a,!1,!1,". ")).replace("{{amount_no_decimals_with_period_and_space_separator}}",q(a,!1,!0,". "));return i?`${s} ${e}`:s}function ot(a){return a.replace(/[^\d.,\s-]/g,"").trim()}function j(a){const t=new Map;for(const[e,i,s]of a.variants)t.set(e,{priceInCents:i,compareAtPriceInCents:s});return t}function Dt(a,t,e,i){const{priceInCents:s,compareAtPriceInCents:r}=e,{moneyFormat:n,currency:o,currencyCodeEnabled:l}=i;if(a.getAttribute("data-sl-attribute-p")===t)a.innerHTML=H(s,n,o,l);else if(a.getAttribute("data-sl-attribute-cap")===t)r<=0||r<=s?a.remove():a.innerHTML=H(r,n,o,l);else if(a.getAttribute("data-sl-attribute-discount")===t&&!(r<=0||r<=s)){const d=Math.round((r-s)/r*100),p=ot(H(r-s,n,o,!1)),h=a.getAttribute("data-sl-format")||"percent";h==="percent"?a.textContent=`-${d}%`:h==="amount"?a.textContent=`-${p}`:h==="both"&&(a.textContent=`-${d}% (-${p})`)}}function Ot(a){const t=[],e={id:"url-pattern",operator:"contains",value:"/"};for(const[i,s,r]of a.variants){t.push({id:`p-${i}`,cssSelector:`[data-sl-attribute-p="${i}"]`,urlPatterns:[e],actions:[{id:`p-action-${i}`,type:"innerHtml",scope:"price",value:H(s,a.moneyFormat,a.currency,a.currencyCodeEnabled)}]});const n=r<=0||r<=s;if(t.push({id:`cap-${i}`,cssSelector:`[data-sl-attribute-cap="${i}"]`,urlPatterns:[e],actions:[{id:`cap-action-${i}`,type:n?"remove":"innerHtml",scope:"compare-at-price",value:n?"":H(r,a.moneyFormat,a.currency,a.currencyCodeEnabled)}]}),!n&&r>s){const o=Math.round((r-s)/r*100),l=ot(H(r-s,a.moneyFormat,a.currency,!1));t.push({id:`d-${i}`,cssSelector:`[data-sl-attribute-discount="${i}"]`,urlPatterns:[e],actions:[{id:`d-action-${i}`,type:"js",scope:null,value:`var format = element.getAttribute('data-sl-format') || 'percent';                    if (format === 'percent') {                      element.textContent = '-${o}%';                    } else if (format === 'amount') {                      element.textContent = '-${l}';                    } else if (format === 'both') {                      element.textContent = '-${o}% (-${l})';                    }`}]})}}return t}const Jt="modulepreload",Yt=function(a){return"/"+a},Zt={},Vt=function(t,e,i){let s=Promise.resolve();function r(n){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=n,window.dispatchEvent(o),!o.defaultPrevented)throw n}return s.then(n=>{for(const o of n||[])o.status==="rejected"&&r(o.reason);return t().catch(r)})};function at(a,t,e){const i=e?a.plans.filter(c=>!c.variantId||c.variantId===e):a.plans,s=[],r=[];for(const c of i)c.direction==="decrease"?(s.push(c.existingShopifyPlanId),r.push(c.createdShopifyPlanId)):(s.push(c.createdShopifyPlanId),r.push(c.existingShopifyPlanId));const n=t?s:r,o=t?r:s;if(e)for(const c of a.plans)for(const d of[c.existingShopifyPlanId,c.createdShopifyPlanId])d&&!n.includes(d)&&!o.includes(d)&&o.push(d);const l={};for(let c=0;c<o.length;c++){const d=o[c],p=n[c];d&&p&&(l[d]=p)}return{showPlanIds:n,hidePlanIds:o,swapMap:l}}function lt(a,t,e){const i=t?a.plans.find(r=>r.variantId===t):void 0;if(i)return i.direction;if(e){const r=a.plans.find(n=>n.productId===e);if(r)return r.direction}return a.plans.find(r=>!r.variantId)?.direction??null}function K(a,t){const e=t?a.plans.filter(r=>!r.productId||r.productId===t):a.plans,i={};for(const r of e)i[r.existingShopifyPlanId]=r.existingDiscountAmount,i[r.createdShopifyPlanId]=r.existingDiscountAmount;const s=Math.max(...Object.values(i),0);return{discountMap:i,maxDiscount:s}}function W(a){const t=document.querySelector('form[action*="/cart/add"] input[name="product-id"]')?.value;if(t)return t;if(a){for(const r of Array.from(document.querySelectorAll("[data-sl-attribute-p]"))){const n=r.getAttribute("data-sl-attribute-p");if(!n)continue;const o=a.variants.find(l=>l[0]===n);if(o?.[3])return o[3]}const s=document.querySelector('form[action*="/cart/add"] input[name="id"]')?.value;if(s){const r=a.variants.find(n=>n[0]===s);if(r?.[3])return r[3]}}const e=window,i=e.ShopifyAnalytics?.meta?.product?.id??e.meta?.product?.id;return i!=null?String(i):null}function D(a,t){return a.widget.selectors[t]??[]}function U(a,t){return a.replace(/[\d.]+%/,`${t}%`)}function $(a,t){const e=document.createTreeWalker(a,NodeFilter.SHOW_TEXT);let i=e.nextNode();for(;i;){if(i.nodeValue!==null){const s=t(i.nodeValue);if(s!==i.nodeValue){i.nodeValue=s;return}}i=e.nextNode()}}function ct(a,t){return a===null?!1:a==="decrease"?!t:t}async function Lt(a){if(a.subscriptionSwapDone)return;const t=a.getActiveAssignment();if(!t)return;const e=a.getHypothesis(t.hypothesisId);if(!e?.subscriptionData)return;a.subscriptionSwapDone=!0;const i=e.subscriptionData,s=e.isControl,r=[...new Set(i.plans.map(d=>d.direction))].join(",");a.log(`[SUB-SWAP] ${s?"A":"B"} side, directions=${r}`);const n=i.plans.some(d=>d.variantId);let o=!1,l=!1;function c(){if(!l){l=!0;try{const d=n?document.querySelector("select[name='id'], input[name='id']")?.value:void 0,{showPlanIds:p,hidePlanIds:h,swapMap:u}=at(i,s,d);a.swapMap=u;const b=D(i,"widgetParent"),k=D(i,"subscriptionPlans"),S=D(i,"subscriptionInput");if(!b.length||!k.length||!S.length)return;const P=document.querySelector(b[0].selector);if(!P?.shadowRoot)return;const _=P.shadowRoot.querySelector(k[0].selector);if(!_?.shadowRoot)return;const C=S[0].selector;let m=null;if(i.widget.widgetType==="buttons"||i.widget.widgetType==="radio"){const y=Array.from(_.shadowRoot.querySelectorAll(C));if(!y.length)return;for(const v of y){const g=v.closest("label");g&&(p.includes(v.value)?g.style.display="":h.includes(v.value)&&(g.style.display="none"))}const w=y.some(v=>p.includes(v.value)&&v.checked),T=y.some(v=>h.includes(v.value)&&v.checked);if((w||T)&&(o=!1),!w&&!o){o=!0;for(const v of y)if(p.includes(v.value)){v.closest("label")?.click(),v.dispatchEvent(new Event("change",{bubbles:!0}));break}}const f=y.find(v=>v.checked);m=f&&p.includes(f.value)?f.value:p[0]??null}else if(i.widget.widgetType==="dropdown"){const y=_.shadowRoot.querySelector("select");if(!y)return;for(const w of Array.from(y.options))h.includes(w.value)&&(w.style.display="none",w.disabled=!0);if(h.includes(y.value)){const w=Array.from(y.options).find(T=>p.includes(T.value));w&&(y.value=w.value,y.dispatchEvent(new Event("change",{bubbles:!0})))}m=p.includes(y.value)?y.value:p[0]??null}if(m){const y=Array.from(document.querySelectorAll('input[name="selling_plan"]'));for(const w of y)w.value!==m&&(w.value=m)}}finally{l=!1}}}if(a.subscriptionHideWrongPlans=c,a.swapMap=at(i,s).swapMap,c(),n){const d=document.querySelector("select[name='id'], input[name='id']");d&&d.addEventListener("change",c)}}function B(a){const t=D(a,"widgetParent");return t.length?document.querySelector(t[0].selector)?.shadowRoot??null:null}function J(a,t){const e=D(a,"subscriptionPlans");return e.length?t.querySelector(e[0].selector)?.shadowRoot??null:null}function Y(a,t){const e=new URLSearchParams(window.location.search).get("variant");if(e)return e;{const i=document.querySelector('form[action*="/cart/add"] input[name="id"]')?.value;if(i)return i}return a.size>0?[...a.keys()][0]:void 0}function G(a,t){return H(a,t.moneyFormat,t.currency,t.currencyCodeEnabled)}function $t({originalFetch:a,swapMap:t,slptValue:e,getSelectedPlanId:i,log:s}){if(window.fetch.__shoplift_intercepted)return s("[SUB-INTERCEPT] already installed — skipping"),()=>{};function r(o){if(i){const l=i();if(l)return t[l]??l}return t[o]??o}const n=function(o,l){if((typeof o=="string"?o:o instanceof URL?o.href:o.url).includes("/cart/add")&&l?.body)try{if(l.body instanceof FormData){const d=l.body.get("selling_plan");d?l.body.set("selling_plan",r(String(d))):(!d||d==="")&&e&&l.body.set("properties[_slpt]",e)}else if(typeof l.body=="string"){const d=JSON.parse(l.body);if(d.items)for(const p of d.items){const h=String(p.selling_plan??"");h?p.selling_plan=r(h):!p.selling_plan&&e&&(p.properties||(p.properties={}),p.properties._slpt=e)}else if(d.id){const p=String(d.selling_plan??"");p?d.selling_plan=r(p):!d.selling_plan&&e&&(d.properties||(d.properties={}),d.properties._slpt=e)}l.body=JSON.stringify(d)}}catch(d){s("[SUB-INTERCEPT] body parse failed; cart-add proceeds with un-swapped plan",d)}return a.call(window,o,l)};return n.__shoplift_intercepted=!0,window.fetch=n,function(){window.fetch===n&&(window.fetch=a)}}function Mt({log:a}){if(window.fetch.__shoplift_intercepted)return a("[SUB-PREVIEW-BLOCK] already installed — skipping"),()=>{};const t=window.fetch,e=function(i,s){const r=typeof i=="string"?i:i instanceof URL?i.href:i.url;return r.includes("/cart/add")?(a("[SUB-PREVIEW-BLOCK] cart-add blocked in preview mode",{url:r}),Promise.resolve(new Response(JSON.stringify({id:0,properties:{},quantity:0,variant_id:0,key:"preview",title:"Preview — cart-add blocked",price:0,original_price:0,line_price:0,original_line_price:0,total_discount:0,discounts:[],preview:!0}),{status:200,headers:{"Content-Type":"application/json"}}))):t.call(window,i,s)};return e.__shoplift_intercepted=!0,window.fetch=e,function(){window.fetch===e&&(window.fetch=t)}}function dt({data:a,runUpdates:t,debounceMs:e=150}){let i=null;function s(){i&&clearTimeout(i),t(),i=setTimeout(t,e)}let r=null;const n=[],o={childList:!0,subtree:!0,characterData:!0,attributes:!0};function l(h){for(const u of n)u.disconnect();n.length=0;for(const u of Array.from(h.querySelectorAll("*")))if(u.shadowRoot){const b=new MutationObserver(s);b.observe(u.shadowRoot,o),n.push(b)}}function c(){const h=B(a);return h?(r&&r.disconnect(),l(h),r=new MutationObserver(u=>{u.some(b=>b.type==="childList"&&b.addedNodes.length>0)&&l(h),s()}),r.observe(h,o),!0):!1}const d=document.body||document.documentElement,p=new MutationObserver(()=>{c()&&s()});return p.observe(d,{childList:!0,subtree:!0}),c()&&s(),t(),function(){i&&(clearTimeout(i),i=null),p.disconnect(),r&&(r.disconnect(),r=null);for(const u of n)u.disconnect();n.length=0}}async function qt(a){if(a.subscriptionPriceDone)return;const t=a.getActiveAssignment(),e=t?a.getHypothesis(t.hypothesisId):void 0,i=e?.subscriptionData?null:a.findActiveSubscriptionTestControl(),s=e?.subscriptionData?e:i?.hypothesis;if(!s?.subscriptionData)return;const r=e?.subscriptionData?t.testId:i.testId;a.subscriptionPriceDone=!0;const n=s.subscriptionData,o=s.isControl,l=s.priceData,c=n.widget.widgetType;let d=W(l),p=K(n,d),h=p.discountMap,u=p.maxDiscount;function b(){const g=W(l);g!==d&&(d=g,p=K(n,d),h=p.discountMap,u=p.maxDiscount,a.log(`[SUB-PRICE] scope refreshed side=${o?"A":"B"}, currentProductId=${d??"n/a"}, maxDiscount=${u}`))}a.log(`[SUB-PRICE] side=${o?"A":"B"}, currentProductId=${d??"n/a"}, maxDiscount=${u}`),a.updatePriceTestHiddenInputs(r,o?"control":"variant",!1);function k(){if(!l)return null;const g=j(l),I=Y(g),A=lt(n,I,d);if(!ct(A,o))return null;const E=I?g.get(I):void 0;return E?{formattedVariantPrice:G(E.priceInCents,l),formattedDiscounted:G(E.priceInCents*(1-u/100),l)}:null}$t({originalFetch:a.fetch,swapMap:a.swapMap??{},slptValue:a.slptValue??void 0,log:a.log,getSelectedPlanId:()=>{const g=B(n);if(!g)return null;const I=J(n,g);if(!I)return null;const A=D(n,"subscriptionInput"),E=A.length?A[0].selector:'input[name="rc_plan"]';return I.querySelector(`${E}:checked`)?.value??null}});function S(g){const I=D(n,"subscriptionDiscount");for(const A of I)if(A.selector.includes("badge")||A.selector.includes("__badge")){const E=g.querySelector(A.selector);E?.textContent&&!E.textContent.includes(`${u}%`)&&$(E,x=>U(x,u))}}function P(g){const I=k();if(!I)return;const A=D(n,"subscriptionCompareAt");for(const E of A){const x=g.querySelector(E.selector)||g.querySelector(`[part~="${E.selector}"]`);x?.textContent&&!x.textContent.includes(I.formattedVariantPrice)&&$(x,R=>/\d/.test(R)?I.formattedVariantPrice:R)}}function _(g,I){const A=D(n,"subscriptionCompareAt"),E=I===0?"none":"";for(const x of A){const R=g.querySelector(x.selector)||g.querySelector(`[part~="${x.selector}"]`);R&&(E==="none"?R.style.display!=="none"&&(R.style.display="none"):R.style.display==="none"&&(R.style.display=""))}}function C(g){const I=D(n,"subscriptionInput"),A=I.length?I[0].selector:'input[name="rc_plan"]',E=D(n,"subscriptionPlanDiscount"),x=E.length?E[0].selector:".rc-plans-button__discount";for(const R of Array.from(g.querySelectorAll("label"))){const V=R.querySelector(A),O=R.querySelector(x);if(V&&O){const L=h[V.value];if(L!==void 0){if(L===0)O.style.display!=="none"&&(O.style.display="none");else if(O.style.display==="none"&&(O.style.display=""),O.textContent){const Z=O.textContent.match(/[\d.]+%/)?.[0];Z&&Z!==`${L}%`&&$(O,Kt=>U(Kt,L))}}}}}function m(g){const I=g.querySelector("select");if(I)for(const A of Array.from(I.options)){const E=h[A.value];if(E!==void 0&&A.textContent){const x=A.textContent.match(/[\d.]+%/)?.[0];x&&x!==`${E}%`&&(A.textContent=U(A.textContent,E))}}}function y(g,I){const E=D(n,"subscriptionDiscount").filter(x=>x.selector.includes("benefit")||x.selector==="rc-benefits");for(const x of E){const R=g.querySelector(x.selector);if(R?.shadowRoot){for(const V of Array.from(R.shadowRoot.querySelectorAll("li")))if(V.textContent?.includes("Save")){const O=V;if(I===0)O.style.display!=="none"&&(O.style.display="none");else{O.style.display==="none"&&(O.style.display="");const L=V.textContent.match(/[\d.]+%/)?.[0];L&&L!==`${I}%`&&$(V,Z=>U(Z,I))}}}}}let w=!1;function T(){if(!w){w=!0;try{if(b(),d!==null&&Object.keys(h).length===0)return;const g=B(n);if(!g)return;S(g),l&&P(g);const I=J(n,g);let A=u;if(I){const E=D(n,"subscriptionInput"),x=E.length?E[0].selector:'input[name="rc_plan"]',R=I.querySelector(`${x}:checked`);if(R){const V=h[R.value];V!==void 0&&(A=V)}c==="buttons"||c==="radio"?C(I):m(I)}_(g,A),y(g,A)}finally{w=!1}}}function f(){const g=k();if(!g)return;const I=B(n);if(!I)return;const A=D(n,"onetimeToggle"),E=A.length?A[0].selector:'input[value="onetime"]';if(!I.querySelector(E)?.checked)return;const R=D(n,"subscriptionPrice");for(const V of R){const O=I.querySelector(V.selector)||I.querySelector(`[part~="${V.selector}"]`);O?.textContent&&!O.textContent.includes(g.formattedDiscounted)&&$(O,L=>/\d/.test(L)?g.formattedDiscounted:L)}}function v(){a.subscriptionHideWrongPlans&&a.subscriptionHideWrongPlans(),T(),a.subscriptionUpdateOneTime&&a.subscriptionUpdateOneTime(),f()}dt({data:n,runUpdates:v})}async function Ht(a){if(a.subscriptionOneTimeDone)return;const t=a.getActiveAssignment(),e=t?a.getHypothesis(t.hypothesisId):void 0,i=!!(e?.subscriptionData&&e.priceData),s=i?null:a.findActiveSubscriptionTestControl(),r=i?e:s?.hypothesis;if(!r?.subscriptionData||!r.priceData)return;const n=i?t.testId:s.testId;a.subscriptionOneTimeDone=!0;const o=r.subscriptionData,l=r.priceData,c=j(l),d=r.isControl,p=d?"control":"variant";a.slptValue=`${n}:${p}:f`,a.updatePriceTestHiddenInputs(n,p,!1);function h(){const u=B(o);if(!u)return;const b=Y(c);if(!b)return;const k=W(l),S=lt(o,b,k);if(!ct(S,d))return;const P=c.get(b);if(!P)return;const _=H(P.priceInCents,l.moneyFormat,l.currency,l.currencyCodeEnabled),C=D(o,"onetimePrice");if(!C.length)return;const m=D(o,"onetimeContainer"),y=m.length?m[0].selector:'[part~="rc-purchase-option__onetime"]',T=u.querySelector(y)??u;for(const f of C){let v=null;try{v=T.querySelector(f.selector)}catch{v=null}v??=T.querySelector(`[part~="${f.selector}"]`),v&&v.textContent&&!v.textContent.includes(_)&&$(v,g=>/\d/.test(g)?_:g)}}a.subscriptionUpdateOneTime=h,h()}async function Ut(a,t){const{subscriptionPreviewRender:e}=await Vt(async()=>{const{subscriptionPreviewRender:i}=await Promise.resolve().then(()=>jt);return{subscriptionPreviewRender:i}},void 0);return e(a.subscriptionData,a.priceData,a.isControl,t)}function Nt(a,t){const e=a.widget.selectors.widgetParent??[],i=a.widget.selectors.subscriptionPlans??[],s=a.widget.selectors.subscriptionInput??[];if(!e.length||!i.length||!s.length){t("[SUB-GLOBAL-HIDE] Missing required selectors — skipping");return}const r=e[0].selector,n=i[0].selector,o=s[0].selector;let l=!1,c=null,d=!1;function p(){if(!d){d=!0;try{h()}finally{d=!1}}}function h(){const P=document.querySelector(r);if(!P?.shadowRoot)return;const _=P.shadowRoot.querySelector(n);if(!_?.shadowRoot)return;_.shadowRoot!==c&&(c=_.shadowRoot,l=!1);let C=0;if(a.widget.widgetType==="buttons"||a.widget.widgetType==="radio"){const m=Array.from(_.shadowRoot.querySelectorAll(o));for(const f of m)if(a.planIds.includes(f.value)){f.disabled||(f.disabled=!0);const v=f.closest("label");v&&v.style.display!=="none"&&(v.style.display="none",C++)}const y=m.filter(f=>!a.planIds.includes(f.value));if(!y.some(f=>f.checked)&&!l&&y.length>0){l=!0;const f=y[0];f.closest("label")?.click(),f.dispatchEvent(new Event("change",{bubbles:!0})),t(`[SUB-GLOBAL-HIDE] Preselected first visible plan input=${f.value}`)}const T=y.find(f=>f.checked)??y[0];if(T){const f=Array.from(document.querySelectorAll('input[name="selling_plan"]'));for(const v of f)v.value!==T.value&&(v.value=T.value,t(`[SUB-GLOBAL-HIDE] Mirrored plan id ${T.value} to form selling_plan input`))}}else if(a.widget.widgetType==="dropdown"){const m=_.shadowRoot.querySelector("select");if(!m)return;for(const T of Array.from(m.options))a.planIds.includes(T.value)&&(T.style.display!=="none"&&(T.style.display="none"),T.disabled||(T.disabled=!0),C++);const y=Array.from(m.options).filter(T=>!a.planIds.includes(T.value)),w=y.some(T=>T.value===m.value);y.length>0&&!w&&!l&&(l=!0,m.value=y[0].value,m.dispatchEvent(new Event("change",{bubbles:!0})),t(`[SUB-GLOBAL-HIDE] Preselected first visible option=${y[0].value}`))}C>0&&t(`[SUB-GLOBAL-HIDE] Hidden ${C} B-side plan buttons`)}const u={childList:!0,subtree:!0,characterData:!0};let b=null;function k(P){b?.disconnect(),b=new MutationObserver(()=>p()),b.observe(P,u)}function S(){const P=document.querySelector(r);if(!P?.shadowRoot)return!1;p(),new MutationObserver(()=>{p();const m=P.shadowRoot.querySelector(n);m?.shadowRoot&&k(m.shadowRoot)}).observe(P.shadowRoot,u);const C=P.shadowRoot.querySelector(n);return C?.shadowRoot&&k(C.shadowRoot),!0}if(!S()){t("[SUB-GLOBAL-HIDE] Widget not in DOM yet — waiting via MutationObserver");const P=new MutationObserver(()=>{S()&&P.disconnect()});P.observe(document.body??document.documentElement,{childList:!0,subtree:!0})}}const ut="Limited preview",Ft="Add-to-cart and checkout prices won't reflect this test until it launches — test selling plans are not created in your subscription app until after a test is launched.",Bt=5e3;function zt(){const a=document.createElement("div");a.id="shoplift-preview-subscription-warning";const t=document.createElement("span");t.id="shoplift-preview-subscription-warning__icon",t.setAttribute("aria-hidden","true"),t.textContent="!";const e=document.createElement("span");e.id="shoplift-preview-subscription-warning__label",e.textContent=ut;const i=document.createElement("div");i.id="shoplift-preview-subscription-warning__tooltip",i.setAttribute("role","tooltip"),i.textContent=Ft,a.appendChild(t),a.appendChild(e),a.appendChild(i),a.setAttribute("tabindex","0"),a.setAttribute("aria-describedby",i.id),a.setAttribute("aria-label",ut);let s=null;function r(){s!==null&&(clearTimeout(s),s=null)}function n(){i.classList.add("shoplift-preview-subscription-warning__tooltip--visible")}function o(){i.classList.remove("shoplift-preview-subscription-warning__tooltip--visible")}function l(){n(),r(),s=setTimeout(()=>{o(),s=null},Bt)}function c(){r(),n()}function d(){s===null&&o()}a.addEventListener("mouseenter",c),a.addEventListener("mouseleave",d),a.addEventListener("focus",c),a.addEventListener("blur",d);function p(u){try{const b=u.target;if(!(b instanceof Element))return;(b.closest('form[action*="/cart/add"] button[type="submit"], form[action*="/cart/add"] input[type="submit"]')!==null||b.closest('[name="add"], button[name="add"], [data-add-to-cart], button[data-add-to-cart]')!==null)&&l()}catch{}}document.addEventListener("click",p,!0);function h(){r(),document.removeEventListener("click",p,!0),a.removeEventListener("mouseenter",c),a.removeEventListener("mouseleave",d),a.removeEventListener("focus",c),a.removeEventListener("blur",d),a.remove()}return{root:a,tooltip:i,cleanup:h}}let pt=!1;class Wt{constructor(t,e,i,s,r,n,o,l,c,d,p,h,u){this.shop=t,this.host=e,this.eventHost=i,this.disableReferrerOverride=l,this.logHistory=[],this.legacySessionKey=`SHOPLIFT_SESSION_${this.shop}`,this.cssHideClass=s?"shoplift-hide":"",this.testConfigs=p.map(k=>({...k,startAt:new Date(k.startAt),statusHistory:k.statusHistory.map(S=>({...S,createdAt:new Date(S.createdAt)}))})),this.inactiveTestConfigs=h,this.hiddenSubscriptionPlans=u,this.sendPageView=!!r,this.shopliftDebug=n===!0,this.telemetryEnabled=c===!0,this.gaConfig=o!=={"sendEvents":false,"mode":"gtag"}?o:{sendEvents:!1},this.fetch=window.fetch.bind(window),this.localStorageSet=window.localStorage.setItem.bind(window.localStorage),this.localStorageGet=window.localStorage.getItem.bind(window.localStorage);const b=this.getDeviceType();this.device=b!=="tablet"?b:"mobile",this.state=this.loadState(),this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.testsFilteredByAudience=p.filter(k=>k.status=="active"),this.getCountryTimeout=d===1000?1e3:d,this.log("State Loaded",JSON.stringify(this.state))}DATA_SL_ATTRIBUTE_P="data-sl-attribute-p";DATA_SL_TEST_ID="data-sl-test-id";VIEWPORT_TRACK_THRESHOLD=.5;temporarySessionKey="Shoplift_Session";essentialSessionKey="Shoplift_Essential";analyticsSessionKey="Shoplift_Analytics";priceSelectorsSessionKey="Shoplift_PriceSelectors_v2";legacySessionKey;cssHideClass;testConfigs;inactiveTestConfigs;hiddenSubscriptionPlans;testsFilteredByAudience;sendPageView;shopliftDebug;gaConfig;telemetryEnabled;getCountryTimeout;state;subscriptionPreviewWarningCleanup=null;shopifyAnalyticsId;cookie=document.cookie;isSyncing=!1;isSyncingGA=!1;fetch;localStorageSet;localStorageGet;sessionStorageSet=window.sessionStorage.setItem.bind(window.sessionStorage);sessionStorageGet=window.sessionStorage.getItem.bind(window.sessionStorage);urlParams=new URLSearchParams(window.location.search);device;logHistory;activeViewportObservers=new Map;clientIdRetryCount=0;deriveCategoryFromExistingTests(){if(!this.state.temporary.testCategory&&this.state.essential.visitorTests.length>0){const t=this.state.essential.visitorTests.some(e=>{if(!e.hypothesisId)return!1;const i=this.getHypothesis(e.hypothesisId);return i&&["theme","basicScript","price"].includes(i.type)});this.state.temporary.testCategory=t?"global":"conditional",this.persistTemporaryState(),this.log("Derived test category from existing visitorTests: %s",this.state.temporary.testCategory)}}async init(){try{if(this.log("Shoplift script initializing"),window.Shopify&&window.Shopify.designMode){this.log("Skipping script for design mode");return}if(window.location.href.includes("slScreenshot=true")){this.log("Skipping script for screenshot");return}if(window.location.hostname.endsWith(".edgemesh.com")){this.log("Skipping script for preview");return}if(window.location.href.includes("isShopliftMerchant")){const s=this.urlParams.get("isShopliftMerchant")==="true";this.log("Setting merchant session to %s",s),this.state.temporary.isMerchant=s,this.persistTemporaryState()}if(this.state.temporary.isMerchant){this.log("Setting up preview for merchant"),typeof window.shoplift!="object"&&this.setShopliftStub(),this.state.temporary.previewConfig||this.hidePage(),await this.initPreview(),document.querySelector("#sl-preview-bar-hide")?.remove();return}if(this.state.temporary.previewConfig=void 0,mt(navigator.userAgent))return;const t=this.state.essential.visitorTests.filter(s=>s.hypothesisId&&+s.createdAt>Date.now()-6e4);if(t.length===0)this.sendDiagnosticTelemetry("page-landed",null);else for(const s of t)this.sendDiagnosticTelemetry("page-landed",s.testId,{hypothesisId:s.hypothesisId,isControl:s.assignedTo==="control",testType:s.testType??"unknown"});if(navigator.userAgent.includes("Chrome/118")){this.log("Random: %o",[Math.random(),Math.random(),Math.random()]);const s=await this.makeRequest({url:`${this.eventHost}/api/v0/events/ip`,method:"get"}).then(r=>r?.json());this.log(`IP: ${s}`),this.makeRequest({url:`${this.eventHost}/api/v0/logs`,method:"post",data:JSON.stringify(this.debugState(),X)}).catch()}if(this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.monitorConsentChange(),this.checkForThemePreview())return;if(!this.disableReferrerOverride&&this.state.temporary.originalReferrer!=null){this.log(`Overriding referrer from '${document.referrer}' to '${this.state.temporary.originalReferrer}'`);const s=this.state.temporary.originalReferrer;delete this.state.temporary.originalReferrer,this.persistTemporaryState(),Object.defineProperty(document,"referrer",{get:()=>s,enumerable:!0,configurable:!0})}if(await this.refreshVisitor(this.shopifyAnalyticsId),await this.handleVisitorTest()){this.log("Redirecting for visitor test");return}this.setShoplift(),this.showPage(),this.ensureCartAttributesForExistingPriceTests(!1);const i=this.state.essential.visitorTests.some(s=>(s.hypothesisId?this.getHypothesis(s.hypothesisId):void 0)?.subscriptionData!=null)||Object.values(this.state.temporary.testReservations??{}).some(s=>this.getHypothesis(s.hypothesisId)?.subscriptionData!=null);this.hiddenSubscriptionPlans&&!i&&(this.log(`[SUB-GLOBAL] Visitor not in subscription test — hiding ${this.hiddenSubscriptionPlans.planIds.length} B-side plans`),Nt(this.hiddenSubscriptionPlans,s=>this.log(s))),await this.subscriptionSwap(),await this.subscriptionOneTimePrice(),await this.subscriptionPriceChange(),await this.finalize(),console.log("SHOPLIFT SCRIPT INITIALIZED!")}catch(t){if(t instanceof et)return;throw t}finally{typeof window.shoplift!="object"&&this.setShopliftStub()}}getVariantColor(t){switch(t){case"a":return{text:"#141414",bg:"#E2E2E2"};case"b":return{text:"rgba(255, 255, 255, 1)",bg:"rgba(37, 99, 235, 1)"}}}getDefaultVariantTitle(t){return t.title?t.title:t.type==="price"?t.isControl?"Original prices":"Variant prices":t.isControl?"Original":"Untitled variant "+t.label.toUpperCase()}async initPreview(){const t=this.urlParams.get("previewConfig");if(t){this.state.temporary.previewConfig=void 0,this.log("Setting up the preview"),this.log("Found preview config, writing to temporary state");const e=await Rt(t);if(this.state.temporary.previewConfig=e,this.state.temporary.previewConfig.testTypeCategory===M.Price){this.hidePage(!0);const s=this.state.temporary.previewConfig;let r=`${this.host}/api/dom-selectors/${s.storeId}/${s.testId}/${s.isDraft||!1}`;s.shopifyProductId&&(r+=`?productId=${s.shopifyProductId}`);const n=await this.makeJsonRequest({method:"get",url:r}).catch(o=>(this.log("Error getting domSelectors",o),null));if(s.variants.forEach(o=>o.domSelectors=n[o.id]?.domSelectors),s.isDraft){const o=`${this.host}/api/dom-selectors/${s.storeId}/${s.testId}/subscription-preview`,l=await this.makeJsonRequest({method:"get",url:o}).catch(c=>(this.log("No subscription preview data for draft (test may not have a subscription widget)",c),null));l?.subscriptionData&&s.variants.forEach(c=>{c.subscriptionData=l.subscriptionData,c.priceData=l.priceData})}}this.persistTemporaryState();const i=new URL(window.location.toString());i.searchParams.delete("previewConfig"),this.queueRedirect(i)}else if(this.state.temporary.previewConfig){this.showPage();const e=this.state.temporary.previewConfig;if(e.testTypeCategory===M.Template&&this.handleTemplatePreview(e)&&this.initPreviewControls(e),e.testTypeCategory===M.UrlRedirect&&this.handleUrlPreview(e)&&this.initPreviewControls(e),e.testTypeCategory===M.Script&&this.handleScriptPreview(e)&&this.initPreviewControls(e),e.testTypeCategory===M.Price){const i=await this.handlePricePreview(e);e.isDraft?await this.handleSubscriptionPricePreview(e):await this.handleSubscriptionLivePreview(e),i&&this.initPreviewControls(e)}}}initPreviewControls(t){document.addEventListener("DOMContentLoaded",()=>{const e=t.variants.find(b=>b.id===t.currentVariant),i=e?.label||"a",s=t.variants,r=document.createElement("div");r.id="shoplift-preview-control";const n=document.createElement("div"),o=document.createElement("img");o.src=_t,o.height=24,o.width=14,n.style.padding="0 16px",n.style.lineHeight="100%",n.appendChild(o),r.appendChild(n);const l=document.createElement("div");l.id="shoplift-preview-variant-selector";const c=document.createElement("button");c.id="shoplift-preview-variant-menu-trigger";const d=document.createElement("div");d.className="menu-variant-label",d.style.backgroundColor=this.getVariantColor(i).bg,d.style.color=this.getVariantColor(i).text,d.innerText=i.toUpperCase(),c.appendChild(d);const p=document.createElement("span");if(p.id="shoplift-preview-variant-title",p.innerText=e?this.getDefaultVariantTitle(e):"Untitled variant "+i.toUpperCase(),c.appendChild(p),s.length>1){const b=document.createElement("img");b.src=xt,b.width=12,b.height=12,b.style.height="12px",b.style.width="12px",c.appendChild(b);const k=document.createElement("div");k.className="preview-variant-menu";for(const S of t.variants.filter(P=>P.id!==t.currentVariant)){const P=document.createElement("div");P.className="preview-variant-menu--item";const _=document.createElement("div");_.className="menu-variant-label",_.style.backgroundColor=this.getVariantColor(S.label).bg,_.style.color=this.getVariantColor(S.label).text,_.style.flexShrink="0",_.innerText=S.label.toUpperCase(),P.appendChild(_);const C=document.createElement("span");C.innerText=this.getDefaultVariantTitle(S),P.appendChild(C),P.addEventListener("click",()=>{this.pickVariant(S.id)}),k.appendChild(P)}l.appendChild(k),c.addEventListener("click",()=>{k.className!=="preview-variant-menu preview-variant-menu__visible"?k.classList.add("preview-variant-menu__visible"):k.classList.remove("preview-variant-menu__visible")}),document.addEventListener("click",S=>{S.target instanceof Element&&!c.contains(S.target)&&k.className==="preview-variant-menu preview-variant-menu__visible"&&k.classList.remove("preview-variant-menu__visible")})}else c.style.pointerEvents="none",d.style.margin="0";if(l.appendChild(c),r.appendChild(l),t.hasSubscription){this.subscriptionPreviewWarningCleanup?.();const b=zt();r.appendChild(b.root),this.subscriptionPreviewWarningCleanup=b.cleanup}const h=document.createElement("div"),u=document.createElement("button");u.id="shoplift-exit-preview-button",u.innerText="Exit",h.appendChild(u),u.addEventListener("click",()=>{this.exitPreview()}),r.appendChild(h),document.body.appendChild(r),requestAnimationFrame(()=>{r.classList.add("visible")})}),this.ensureCartAttributesForExistingPriceTests(!0)}pickVariant(t){if(this.state.temporary.previewConfig){const e=this.state.temporary.previewConfig,i=new URL(window.location.toString());if(e.testTypeCategory===M.UrlRedirect){const s=e.variants.find(r=>r.id===e.currentVariant)?.redirectUrl;if(i.pathname===s){const r=e.variants.find(n=>n.id===t)?.redirectUrl;r&&(i.pathname=r)}}if(e.testTypeCategory===M.Template){const s=e.variants.find(r=>r.id===e.currentVariant)?.pathName;if(s&&i.pathname===s){const r=e.variants.find(n=>n.id===t)?.pathName;r&&r!==s&&(i.pathname=r)}}e.currentVariant=t,this.persistTemporaryState(),this.queueRedirect(i)}}exitPreview(){const t=new URL(window.location.toString());if(this.state.temporary.previewConfig?.testTypeCategory===M.Template&&t.searchParams.delete("view"),this.state.temporary.previewConfig?.testTypeCategory===M.Script&&t.searchParams.delete("slVariant"),this.state.temporary.previewConfig?.testTypeCategory===M.UrlRedirect){const i=this.state.temporary.previewConfig.variants.filter(r=>!r.isControl&&r.redirectUrl!==null).map(r=>r.redirectUrl),s=this.state.temporary.previewConfig.variants.find(r=>r.label==="a")?.redirectUrl;i.includes(t.pathname)&&s&&(t.pathname=s)}this.state.temporary.isMerchant=!1,t.searchParams.delete("isShopliftMerchant"),this.state.temporary.previewConfig=void 0,this.persistTemporaryState(),this.subscriptionPreviewWarningCleanup?.(),this.subscriptionPreviewWarningCleanup=null,this.hidePage(),this.queueRedirect(t)}handleTemplatePreview(t){const e=t.currentVariant,i=t.variants.find(l=>l.id===e);if(!i)return!1;const s=t.variants.find(l=>l.isControl);if(!s)return!1;this.log("Setting up template preview for type",s.type);const r=new URL(window.location.toString()),n=r.searchParams.get("view"),o=i.type===s.type;return!o&&!i.isControl&&template.suffix===s.affix&&this.typeFromTemplate()===s.type&&i.pathName!==null?(this.log("Hit control template type, redirecting to the variant url"),this.hidePage(),r.pathname=i.pathName,this.queueRedirect(r),!0):(!i.isControl&&this.typeFromTemplate()==i.type&&template.suffix===s.affix&&o&&n!==(i.affix||"__DEFAULT__")&&(this.log("Template type and affix match control, updating the view param"),r.searchParams.delete("view"),this.log("Setting the new viewParam to",i.affix||"__DEFAULT__"),this.hidePage(),r.searchParams.set("view",i.affix||"__DEFAULT__"),this.queueRedirect(r)),n!==null&&n!==(i.affix||"__DEFAULT__")&&(r.searchParams.delete("view"),this.hidePage(),this.queueRedirect(r)),!0)}handleUrlPreview(t){const e=t.currentVariant,i=t.variants.find(n=>n.id===e),s=t.variants.find(n=>n.isControl)?.redirectUrl;if(!i)return!1;this.log("Setting up URL redirect preview");const r=new URL(window.location.toString());return r.pathname===s&&!i.isControl&&i.redirectUrl!==null&&(this.log("Url matches control, redirecting"),this.hidePage(),r.pathname=i.redirectUrl,this.queueRedirect(r)),!0}handleScriptPreview(t){const e=t.currentVariant,i=t.variants.find(n=>n.id===e);if(!i)return!1;this.log("Setting up script preview");const s=new URL(window.location.toString());return s.searchParams.get("slVariant")!==i.id&&(this.log("current id doesn't match the variant, redirecting"),s.searchParams.delete("slVariant"),this.log("Setting the new slVariantParam"),this.hidePage(),s.searchParams.set("slVariant",i.id),this.queueRedirect(s)),!0}async handlePricePreview(t){const e=t.currentVariant,i=t.variants.find(s=>s.id===e);return i?(this.log("Setting up price preview"),i.domSelectors&&i.domSelectors.length>0&&(N(document,{testId:t.testId,hypothesisId:i.id,selectors:i.domSelectors}),this.ensureCartAttributesForExistingPriceTests(!0)),!0):!1}async handleSubscriptionPricePreview(t){const e=t.variants.find(i=>i.id===t.currentVariant);e?.subscriptionData&&(this.log("Setting up subscription price preview"),await Ut({id:e.id,isControl:e.isControl,subscriptionData:e.subscriptionData,priceData:e.priceData},(i,...s)=>this.log(i,...s)))}async handleSubscriptionLivePreview(t){this.testConfigs.find(s=>s.id===t.testId)?.hypotheses.find(s=>s.id===t.currentVariant)?.subscriptionData&&(this.log("Setting up subscription live preview"),this.subscriptionSwapDone=!1,this.subscriptionOneTimeDone=!1,this.subscriptionPriceDone=!1,await this.subscriptionSwap(),await this.subscriptionOneTimePrice(),await this.subscriptionPriceChange())}async finalize(){const t=await this.getCartState();t!==null&&this.queueCartUpdate(t),this.pruneStateAndSave(),await this.syncAllEvents()}setShoplift(){this.log("Setting up public API");const e=this.urlParams.get("slVariant")==="true",i=e?null:this.urlParams.get("slVariant");window.shoplift={isHypothesisActive:async s=>{if(this.log("Script checking variant for hypothesis '%s'",s),e)return this.log("Forcing variant for hypothesis '%s'",s),!0;if(i!==null)return this.log("Forcing hypothesis '%s'",i),s===i;const r=this.testConfigs.find(o=>o.hypotheses.some(l=>l.id===s));if(!r)return this.log("No test found for hypothesis '%s'",s),!1;const n=this.state.essential.visitorTests.find(o=>o.testId===r.id);return n?(this.log("Active visitor test found",s),n.hypothesisId===s):(await this.manuallySplitVisitor(r),this.testConfigs.some(o=>o.hypotheses.some(l=>l.id===s&&this.state.essential.visitorTests.some(c=>c.hypothesisId===l.id))))},setAnalyticsConsent:async s=>{await this.onConsentChange(s,!0)},getVisitorData:()=>({visitor:this.state.analytics.visitor,visitorTests:this.state.essential.visitorTests.filter(s=>!s.isInvalid).map(s=>{const{shouldSendToGa:r,savedAt:n,...o}=s;return o})})}}setShopliftStub(){this.log("Setting up stubbed public API");const e=this.urlParams.get("slVariant")==="true",i=e?null:this.urlParams.get("slVariant");window.shoplift={isHypothesisActive:s=>Promise.resolve(e||s===i),setAnalyticsConsent:()=>Promise.resolve(),getVisitorData:()=>({visitor:null,visitorTests:[]})}}async manuallySplitVisitor(t){this.log("Starting manual split for test '%s'",t.id),await this.handleVisitorTest([t]);const e=this.getReservationForTest(t.id);e&&!e.isRealized&&e.entryCriteriaKey&&(this.log("Realizing manual API reservation for test '%s'",t.id),this.realizeReservationForCriteria(e.entryCriteriaKey)),this.saveState(),this.syncAllEvents()}async handleVisitorTest(t){await this.filterTestsByAudience(this.testConfigs,this.state.analytics.visitor??this.buildBaseVisitor(),this.state.essential.visitorTests),this.pruneStaleVisitorTests(),this.deriveCategoryFromExistingTests(),this.clearStaleReservations();let e=t?t.filter(i=>this.testsFilteredByAudience.some(s=>s.id===i.id)):[...this.testsForUrl(this.testsFilteredByAudience),...this.domTestsForUrl(this.testsFilteredByAudience)];try{if(e.length===0)return this.log("No tests found"),!1;this.log("Checking for existing visitor test on page");const i=this.getCurrentVisitorHypothesis(e);if(i){this.log("Found current visitor test");const l=this.considerRedirect(i);return l&&(this.log("Redirecting for current visitor test"),this.redirect(i)),l}const s=this.getReservationForCurrentPage();if(s){this.log("Found matching reservation for current page: %s",s.testId);const l=this.getHypothesis(s.hypothesisId);if(l){l.type!=="price"&&this.realizeReservationForCriteria(s.entryCriteriaKey);const c=this.considerRedirect(l);return c&&this.redirect(l),c}}this.log("No active test relation for test page");const r=this.testsForUrl(this.inactiveTestConfigs.filter(l=>this.testIsPaused(l)&&l.hypotheses.some(c=>this.state.essential.visitorTests.some(d=>d.hypothesisId===c.id)))).map(l=>l.id);if(r.length>0)return this.log("Visitor has paused tests for test page, skipping test assignment: %o",r),!1;if(!this.state.temporary.testCategory){const l=this.testsFilteredByAudience.filter(d=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(d))),c=this.testsFilteredByAudience.filter(d=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(d)));if(this.log("Category dice roll - global tests: %o, conditional tests: %o",l.map(d=>({id:d.id,title:d.title,criteria:this.getEntryCriteriaKey(d)})),c.map(d=>({id:d.id,title:d.title,criteria:this.getEntryCriteriaKey(d)}))),l.length>0&&c.length>0){const d=l.length,p=c.length,h=d+p,u=Math.random()*h;this.state.temporary.testCategory=u<d?"global":"conditional",this.log("Category dice roll: rolled %.2f of %d (global weight: %d, conditional weight: %d), selected '%s'",u,h,d,p,this.state.temporary.testCategory)}else l.length>0?(this.state.temporary.testCategory="global",this.log("Only global tests available, setting category to global")):(this.state.temporary.testCategory="conditional",this.log("Only conditional tests available, setting category to conditional"));this.persistTemporaryState()}const n=this.state.temporary.testCategory;if(this.log("Visitor test category: %s",n),n==="global"){const l=this.testsFilteredByAudience.filter(c=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)));for(const c of l)this.markTestAsBlocked(c,"category:global");e=e.filter(c=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)))}else{const l=this.testsFilteredByAudience.filter(c=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)));for(const c of l)this.markTestAsBlocked(c,"category:conditional");e=e.filter(c=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)))}if(e.length===0)return this.log("No tests remaining after category filter"),!1;this.createReservations(e);const o=this.getReservationForCurrentPage();if(o&&!o.isRealized){const l=this.getHypothesis(o.hypothesisId);if(l){l.type!=="price"&&this.realizeReservationForCriteria(o.entryCriteriaKey);const c=this.considerRedirect(l);return c&&(this.log("Redirecting for new test"),this.redirect(l)),c}}return!1}finally{this.includeInDomTests(),this.saveState()}}includeInDomTests(){this.applyControlForAudienceFilteredPriceTests();const t=this.getDomTestsForCurrentUrl(),e=this.getVisitorDomHypothesis(t);for(const i of t){this.log("Evaluating dom test '%s'",i.id);const s=i.hypotheses.some(u=>u.type==="price");if(this.state.essential.visitorTests.find(u=>u.testId===i.id&&u.isInvalid&&!u.hypothesisId)){if(this.log("Visitor is blocked from test '%s', applying control prices if price test",i.id),s){const u=i.hypotheses.find(b=>b.isControl);u?.priceData&&(this.applyPriceTestWithMapLookup(i.id,u,[u],()=>{this.log("Control prices applied for blocked visitor, no metrics tracked")}),this.updatePriceTestHiddenInputs(i.id,"control",!1))}continue}const n=this.getReservationForTest(i.id);let o=null,l=!1;const c=e.find(u=>i.hypotheses.some(b=>u.id===b.id));if(n)o=this.getHypothesis(n.hypothesisId)??null,this.log("Using reserved hypothesis '%s' for test '%s'",n.hypothesisId,i.id);else if(c)o=c,this.log("Using existing hypothesis assignment for test '%s'",i.id);else if(s){const u=this.visitorActiveTestTypeWithReservations();u?(l=!0,this.log("Visitor already in test type '%s', treating as non-test for price test '%s'",u,i.id)):o=this.pickHypothesis(i)}else o=this.pickHypothesis(i);if(l&&s){const u=i.hypotheses.find(b=>b.isControl);u?.priceData&&(this.log("Applying control prices for non-test visitor on price test '%s' (Map-based)",i.id),this.applyPriceTestWithMapLookup(i.id,u,[u],()=>{this.log("Control prices applied for non-test visitor, no metrics tracked")}),this.updatePriceTestHiddenInputs(i.id,"control",!1));continue}if(!o){this.log("Failed to pick hypothesis for test");continue}this.sendDiagnosticTelemetry("assignment",i.id,{hypothesisId:o.id,isControl:o.isControl,testType:o.type});const d=i.bayesianRevision??4,p=o.type==="price",h=d>=5;if(p&&h){if(this.log(`Price test with Map-based lookup (v${d}): ${i.id}`),!o.priceData){this.log("No price data for hypothesis '%s', skipping",o.id);continue}const u=o.isControl?"control":"variant";this.log(`Setting up Map-based price test for ${u} (test: ${i.id})`),this.applyPriceTestWithMapLookup(i.id,o,i.hypotheses,b=>{const k=this.getReservationForTest(b);k&&!k.isRealized&&k.entryCriteriaKey?this.realizeReservationForCriteria(k.entryCriteriaKey):this.queueAddVisitorToTest(b,o),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()});continue}if(p&&!h){this.log(`Price test without viewport tracking (v${d}): ${i.id}`);const u=this.getDomSelectorsForHypothesis(o);if(u.length===0)continue;N(document,{testId:i.id,hypothesisId:o.id,selectors:u},b=>{this.queueAddVisitorToTest(b,o),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()});continue}if(!o.domSelectors||o.domSelectors.length===0){this.log("No selectors found, skipping hypothesis");continue}N(document,{testId:i.id,hypothesisId:o.id,selectors:o.domSelectors},u=>{this.queueAddVisitorToTest(u,o),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()})}}considerRedirect(t){if(this.log("Considering redirect for hypothesis '%s'",t.id),t.isControl)return this.log("Skipping redirect for control"),!1;if(t.type==="basicScript"||t.type==="manualScript")return this.log("Skipping redirect for script test"),!1;const e=this.state.essential.visitorTests.find(n=>n.hypothesisId===t.id),i=new URL(window.location.toString()),r=new URLSearchParams(window.location.search).get("view");if(t.type==="theme"){if(!(t.themeId===themeId)){if(this.log("Theme id '%s' is not hypothesis theme ID '%s'",t.themeId,themeId),this.isAppProxyPath())return this.log("On App Proxy path, skipping theme redirect to avoid infinite loop"),!1;if(e&&e.themeId!==t.themeId&&(e.themeId===themeId||!this.isThemePreview()))this.log("On old theme, redirecting and updating local visitor"),e.themeId=t.themeId;else if(this.isThemePreview())return this.log("On non-test theme, skipping redirect"),!1;return this.log("Hiding page to redirect for theme test"),this.hidePage(),!0}return!1}else if(t.type!=="dom"&&t.type!=="price"&&t.affix!==template.suffix&&t.affix!==r||t.redirectPath&&!i.pathname.endsWith(t.redirectPath))return this.log("Hiding page to redirect for template test"),this.hidePage(),!0;return this.log("Not redirecting"),!1}redirect(t){if(this.log("Redirecting to hypothesis '%s'",t.id),t.isControl)return;const e=new URL(window.location.toString());if(e.searchParams.delete("view"),t.redirectPath){const s=RegExp("^(/w{2}-w{2})/").exec(e.pathname);if(s&&s.length>1){const r=s[1];e.pathname=`${r}${t.redirectPath}`}else e.pathname=t.redirectPath}else t.type==="theme"?(e.searchParams.set("_ab","0"),e.searchParams.set("_fd","0"),e.searchParams.set("_sc","1"),e.searchParams.set("preview_theme_id",t.themeId.toString())):t.type!=="urlRedirect"&&e.searchParams.set("view",t.affix);const i=this.state.essential.visitorTests.find(s=>s.hypothesisId===t.id)?.testId;if(i){const s=new Date(Date.now()+5e3).toUTCString();document.cookie=`shoplift_redirect=${i};domain=.${window.location.hostname};path=/;SameSite=Strict;expires=${s}`}this.queueRedirect(e)}async refreshVisitor(t){if(t===null||!this.state.essential.isFirstLoad||!this.testConfigs.some(i=>i.visitorOption!=="all"))return;this.log("Refreshing visitor"),this.hidePage();const e=await this.getVisitor(t);e&&e.id&&this.updateLocalVisitor(e)}buildBaseVisitor(){return{shopifyAnalyticsId:this.shopifyAnalyticsId,device:this.device,country:null,...this.state.essential.initialState}}getInitialState(){const t=this.getUTMValue("utm_source")??"",e=this.getUTMValue("utm_medium")??"",i=this.getUTMValue("utm_campaign")??"",s=this.getUTMValue("utm_content")??"",r=window.document.referrer,n=this.device;return{createdAt:new Date,utmSource:t,utmMedium:e,utmCampaign:i,utmContent:s,referrer:r,device:n}}checkForThemePreview(){return this.log("Checking for theme preview"),window.location.hostname.endsWith(".shopifypreview.com")?(this.log("on shopify preview domain"),this.clearThemeBar(!0,!1,this.state),document.querySelector("#sl-preview-bar-hide")?.remove(),!1):this.isThemePreview()?this.state.essential.visitorTests.some(t=>t.isThemeTest&&t.hypothesisId!=null&&this.getHypothesis(t.hypothesisId)&&t.themeId===themeId)?(this.log("On active theme test, removing theme bar"),this.clearThemeBar(!1,!0,this.state),!1):this.state.essential.visitorTests.some(t=>t.isThemeTest&&t.hypothesisId!=null&&!this.getHypothesis(t.hypothesisId)&&t.themeId===themeId)?(this.log("Visitor is on an inactive theme test, redirecting to main theme"),this.redirectToMainTheme(),!0):this.state.essential.isFirstLoad?(this.log("No visitor found on theme preview, redirecting to main theme"),this.redirectToMainTheme(),!0):this.inactiveTestConfigs.some(t=>t.hypotheses.some(e=>e.themeId===themeId))?(this.log("Current theme is an inactive theme test, redirecting to main theme"),this.redirectToMainTheme(),!0):this.testConfigs.some(t=>t.hypotheses.some(e=>e.themeId===themeId))?(this.log("Falling back to clearing theme bar"),this.clearThemeBar(!1,!0,this.state),!1):(this.log("No tests on current theme, skipping script"),this.clearThemeBar(!0,!1,this.state),document.querySelector("#sl-preview-bar-hide")?.remove(),!0):(this.log("Not on theme preview"),this.clearThemeBar(!0,!1,this.state),!1)}redirectToMainTheme(){this.hidePage();const t=new URL(window.location.toString());t.searchParams.set("preview_theme_id",""),this.queueRedirect(t)}testsForUrl(t){const e=new URL(window.location.href),i=this.typeFromTemplate();return t.filter(s=>s.hypotheses.some(r=>r.type!=="dom"&&r.type!=="price"&&(r.isControl&&r.type===i&&r.affix===template.suffix||r.type==="theme"||r.isControl&&r.type==="urlRedirect"&&r.redirectPath&&e.pathname.endsWith(r.redirectPath)||r.type==="basicScript"))&&(s.ignoreTestViewParameterEnforcement||!e.searchParams.has("view")||s.hypotheses.map(r=>r.affix).includes(e.searchParams.get("view")??"")))}domTestsForUrl(t){const e=new URL(window.location.href);return t.filter(i=>i.hypotheses.some(s=>s.type!=="dom"&&s.type!=="price"?!1:s.type==="price"&&s.priceData&&s.priceData.variants.length>0?!0:s.domSelectors&&s.domSelectors.some(r=>new RegExp(it(r)).test(e.toString()))))}async filterTestsByAudience(t,e,i){const s=[];let r=e.country;!r&&t.some(n=>n.requiresCountry&&!i.some(o=>o.testId===n.id))&&(this.log("Hiding page to check geoip"),this.hidePage(),r=await this.makeJsonRequest({method:"get",url:`${this.eventHost}/api/v0/visitors/get-country`,signal:AbortSignal.timeout(this.getCountryTimeout)}).catch(n=>(this.log("Error getting country",n),null)));for(const n of t){if(this.log("Checking audience for test '%s'",n.id),this.state.essential.visitorTests.some(c=>c.testId===n.id&&c.hypothesisId==null)){console.log(`Skipping blocked test '${n.id}'`);continue}const o=this.visitorCreatedDuringTestActive(n.statusHistory);(i.some(c=>c.testId===n.id&&(n.device==="all"||n.device===e.device&&n.device===this.device))||this.isTargetAudience(n,e,o,r))&&(this.log("Visitor is in audience for test '%s'",n.id),s.push(n))}this.testsFilteredByAudience=s}isTargetAudience(t,e,i,s){const r=this.getChannel(e);return(t.device==="all"||t.device===e.device&&t.device===this.device)&&(t.visitorOption==="all"||t.visitorOption==="new"&&i||t.visitorOption==="returning"&&!i)&&(t.targetAudiences.length===0||t.targetAudiences.reduce((n,o)=>n||o.reduce((l,c)=>l&&c(e,i,r,s),!0),!1))}visitorCreatedDuringTestActive(t){let e="";for(const i of t){if(this.state.analytics.visitor!==null&&this.state.analytics.visitor.createdAt<i.createdAt||this.state.essential.initialState.createdAt<i.createdAt)break;e=i.status}return e==="active"}getDomTestsForCurrentUrl(){return this.domTestsForUrl(this.testsFilteredByAudience)}getCurrentVisitorHypothesis(t){return t.flatMap(e=>e.hypotheses).find(e=>e.type!=="dom"&&e.type!=="price"&&this.state.essential.visitorTests.some(i=>i.hypothesisId===e.id))}getVisitorDomHypothesis(t){return t.flatMap(e=>e.hypotheses).filter(e=>(e.type==="dom"||e.type==="price")&&this.state.essential.visitorTests.some(i=>i.hypothesisId===e.id))}getHypothesis(t){return this.testConfigs.filter(e=>e.hypotheses.some(i=>i.id===t)).map(e=>e.hypotheses.find(i=>i.id===t))[0]}getActiveAssignment(){if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const e=this.state.temporary.previewConfig;return e.currentVariant&&e.testId?{testId:e.testId,hypothesisId:e.currentVariant}:null}const t=this.state.essential.visitorTests.find(e=>e.hypothesisId);return t?.hypothesisId?{testId:t.testId,hypothesisId:t.hypothesisId}:null}findActiveSubscriptionTestControl(){for(const t of this.testConfigs){const e=t.hypotheses.find(i=>i.isControl);if(e?.subscriptionData)return{testId:t.id,hypothesis:e}}return null}getDomSelectorsForHypothesis(t){if(!t)return[];if(t.domSelectors&&t.domSelectors.length>0)return t.domSelectors;if(t.priceData){const e=`${this.priceSelectorsSessionKey}_${t.id}`;try{const s=sessionStorage.getItem(e);if(s){const r=JSON.parse(s);return t.domSelectors=r,this.log("Loaded %d price selectors from cache for hypothesis '%s'",r.length,t.id),r}}catch{}const i=Ot(t.priceData);t.domSelectors=i;try{sessionStorage.setItem(e,JSON.stringify(i)),this.log("Generated and cached %d price selectors for hypothesis '%s'",i.length,t.id)}catch{this.log("Generated %d price selectors for hypothesis '%s' (cache unavailable)",i.length,t.id)}return i}return[]}hasThemeTest(t){return t.some(e=>e.hypotheses.some(i=>i.type==="theme"))}hasTestThatIsNotThemeTest(t){return t.some(e=>e.hypotheses.some(i=>i.type!=="theme"&&i.type!=="dom"&&i.type!=="price"))}hasThemeAndOtherTestTypes(t){return this.hasThemeTest(t)&&this.hasTestThatIsNotThemeTest(t)}testIsPaused(t){return t.status==="paused"||t.status==="incompatible"||t.status==="suspended"}visitorActiveTestType(){const t=this.state.essential.visitorTests.filter(e=>this.testConfigs.some(i=>i.hypotheses.some(s=>s.id==e.hypothesisId)));return t.length===0?null:t.some(e=>e.isThemeTest)?"theme":"templateOrUrlRedirect"}getReservationType(t){return t==="price"||this.isTemplateTestType(t)?"deferred":"immediate"}isTemplateTestType(t){return["product","collection","landing","index","cart","search","blog","article","collectionList"].includes(t)}getEntryCriteriaKey(t){const e=t.hypotheses.find(i=>i.isControl);if(!e)return`unknown:${t.id}`;switch(e.type){case"theme":return"global:theme";case"basicScript":return"global:autoApi";case"price":return"global:price";case"manualScript":return`conditional:manualApi:${t.id}`;case"urlRedirect":return`conditional:url:${e.redirectPath||"unknown"}`;default:return`conditional:template:${e.type}`}}isGlobalEntryCriteria(t){return t.startsWith("global:")}groupTestsByEntryCriteria(t){const e=new Map;for(const i of t){const s=this.getEntryCriteriaKey(i),r=e.get(s)||[];r.push(i),e.set(s,r)}return e}doesCurrentPageMatchEntryCriteria(t){if(this.isGlobalEntryCriteria(t))return!0;if(t==="conditional:manualApi")return!1;if(t.startsWith("conditional:url:")){const e=t.replace("conditional:url:","");return window.location.pathname.endsWith(e)}if(t.startsWith("conditional:template:")){const e=t.replace("conditional:template:","");return this.typeFromTemplate()===e}return!1}hasActiveReservation(){const t=this.getActiveReservations();return Object.values(t).some(e=>!e.isRealized)}getActiveReservation(){const t=this.getActiveReservations();return Object.values(t).find(e=>!e.isRealized)??null}clearStaleReservations(){const t=this.state.temporary.testReservations;if(!t)return;let e=!1;for(const[i,s]of Object.entries(t)){const r=this.testConfigs.find(o=>o.id===s.testId);if(!r){this.log("Test '%s' no longer in config, clearing reservation for criteria '%s'",s.testId,i),delete t[i],e=!0;continue}if(r.status!=="active"){this.log("Test '%s' status is '%s', clearing reservation for criteria '%s'",s.testId,r.status,i),delete t[i],e=!0;continue}this.testsFilteredByAudience.some(o=>o.id===s.testId)||(this.log("Visitor no longer passes audience for test '%s', clearing reservation for criteria '%s'",s.testId,i),delete t[i],e=!0)}e&&this.persistTemporaryState()}createReservations(t){if(this.state.temporary.testReservations||(this.state.temporary.testReservations={}),this.state.temporary.rolledEntryCriteria||(this.state.temporary.rolledEntryCriteria=[]),this.state.temporary.testCategory==="global"){this.createSingleReservation(t,"global");return}const i=t.filter(o=>this.doesCurrentPageMatchEntryCriteria(this.getEntryCriteriaKey(o))),s=t.filter(o=>!this.doesCurrentPageMatchEntryCriteria(this.getEntryCriteriaKey(o)));this.log("Conditional tests split - matching current page: %d, not matching: %d",i.length,s.length),i.length>0&&this.log("Tests matching current page (same pool): %o",i.map(o=>({id:o.id,title:o.title,criteria:this.getEntryCriteriaKey(o)})));const r=`conditional:current-page:${this.typeFromTemplate()}`;if(i.length>0&&!this.state.temporary.rolledEntryCriteria.includes(r)){this.createSingleReservation(i,r);for(const o of i){const l=this.getEntryCriteriaKey(o);this.state.temporary.rolledEntryCriteria.includes(l)||this.state.temporary.rolledEntryCriteria.push(l)}}const n=this.groupTestsByEntryCriteria(s);for(const[o,l]of n){if(this.state.temporary.rolledEntryCriteria.includes(o)){this.log("Already rolled for criteria '%s', skipping",o);continue}if(l.some(S=>this.state.essential.visitorTests.some(P=>P.testId===S.id))){this.log("Visitor already has VT for criteria '%s', skipping",o),this.state.temporary.rolledEntryCriteria.push(o);continue}const d=[...l].sort((S,P)=>S.id.localeCompare(P.id));this.log("Test dice roll for criteria '%s' - available tests: %o",o,d.map(S=>({id:S.id,title:S.title})));const p=Math.floor(Math.random()*d.length),h=d[p];this.log("Test dice roll: picked index %d of %d, selected test '%s' (%s)",p+1,l.length,h.id,h.title);const u=this.pickHypothesis(h);if(!u){this.log("No hypothesis picked for test '%s'",h.id);continue}this.sendDiagnosticTelemetry("assignment",h.id,{hypothesisId:u.id,isControl:u.isControl,testType:u.type});const b=this.getReservationType(u.type),k={testId:h.id,hypothesisId:u.id,testType:u.type,reservationType:b,isThemeTest:u.type==="theme",themeId:u.themeId,createdAt:new Date,isRealized:!1,entryCriteriaKey:o};this.state.temporary.testReservations[o]=k,this.state.temporary.rolledEntryCriteria.push(o),this.log("Created %s reservation for test '%s' (criteria: %s)",b,h.id,o);for(const S of l)S.id!==h.id&&this.markTestAsBlocked(S,o)}this.persistTemporaryState()}createSingleReservation(t,e){if(this.state.temporary.rolledEntryCriteria.includes(e)){this.log("Already rolled for pool '%s', skipping",e);return}if(t.some(p=>this.state.essential.visitorTests.some(h=>h.testId===p.id&&!h.isInvalid))){this.log("Visitor already has VT for pool '%s', skipping",e),this.state.temporary.rolledEntryCriteria.push(e);return}if(t.length===0){this.log("No tests in pool '%s'",e);return}const s=[...t].sort((p,h)=>p.id.localeCompare(h.id));this.log("Test dice roll for pool '%s' - available tests: %o",e,s.map(p=>({id:p.id,title:p.title,criteria:this.getEntryCriteriaKey(p)})));const r=Math.floor(Math.random()*s.length),n=s[r];this.log("Test dice roll: picked index %d of %d, selected test '%s' (%s)",r,t.length,n.id,n.title);const o=this.pickHypothesis(n);if(!o){this.log("No hypothesis picked for test '%s'",n.id);return}this.sendDiagnosticTelemetry("assignment",n.id,{hypothesisId:o.id,isControl:o.isControl,testType:o.type});const l=this.getReservationType(o.type),c=this.getEntryCriteriaKey(n),d={testId:n.id,hypothesisId:o.id,testType:o.type,reservationType:l,isThemeTest:o.type==="theme",themeId:o.themeId,createdAt:new Date,isRealized:!1,entryCriteriaKey:c};this.state.temporary.testReservations[c]=d,this.state.temporary.rolledEntryCriteria.push(e),this.log("Created %s reservation for test '%s' from pool '%s' (criteria: %s)",l,n.id,e,c);for(const p of t)p.id!==n.id&&this.markTestAsBlocked(p,`pool:${e}`);this.persistTemporaryState()}markTestAsBlocked(t,e){this.state.essential.visitorTests.some(i=>i.testId===t.id)||(this.log("Blocking visitor from test '%s' (reason: %s)",t.id,e),this.state.essential.visitorTests.push({createdAt:new Date,testId:t.id,hypothesisId:null,isThemeTest:t.hypotheses.some(i=>i.type==="theme"),shouldSendToGa:!1,isSaved:!0,isInvalid:!0,themeId:void 0}))}realizeReservationForCriteria(t){const e=this.state.temporary.testReservations?.[t];if(!e)return this.log("No reservation found for criteria '%s'",t),!1;if(e.isRealized)return this.log("Reservation already realized for criteria '%s'",t),!1;if(this.state.essential.visitorTests.some(s=>s.testId===e.testId&&!s.isInvalid))return this.log("Visitor already assigned to test '%s'",e.testId),!1;const i=this.getHypothesis(e.hypothesisId);return i?(e.isRealized=!0,this.persistTemporaryState(),this.queueAddVisitorToTest(e.testId,i),this.saveState(),this.log("Realized reservation for test '%s' (criteria: %s)",e.testId,t),!0):(this.log("Hypothesis '%s' not found",e.hypothesisId),!1)}getActiveReservations(){return this.state.temporary.testReservations??{}}getReservationForCurrentPage(){const t=this.getActiveReservations();for(const[e,i]of Object.entries(t)){if(i.isRealized)continue;const s=this.testConfigs.find(r=>r.id===i.testId);if(!(!s||s.status!=="active")&&this.doesCurrentPageMatchEntryCriteria(e))return i}return null}getReservationForTest(t){const e=this.getActiveReservations();return Object.values(e).find(i=>i.testId===t)??null}getReservationTestType(){const t=this.getActiveReservations(),e=Object.values(t);if(e.length===0)return null;for(const i of e)if(i.isThemeTest)return"theme";for(const i of e)if(i.testType==="price")return"price";return e.some(i=>!i.isRealized)?"templateOrUrlRedirect":null}hasPriceTests(t){return t.some(e=>e.hypotheses.some(i=>i.type==="price"))}_priceTestProductIds=null;getPriceTestProductIds(){if(this._priceTestProductIds)return this._priceTestProductIds;const t=new Set;for(const e of this.testConfigs)for(const i of e.hypotheses)if(i.type==="price"){for(const s of i.domSelectors||[]){const r=s.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);r?.[1]&&t.add(r[1])}if(i.priceData?.variants)for(const[s]of i.priceData.variants)t.add(s)}return this._priceTestProductIds=t,this.log("Built price test product ID cache with %d products",t.size),t}isProductInAnyPriceTest(t){return this.getPriceTestProductIds().has(t)}visitorActiveTestTypeWithReservations(){const t=this.getActiveReservations();for(const r of Object.values(t)){if(r.isThemeTest)return"theme";if(r.testType==="price")return"price"}if(Object.values(t).some(r=>!r.isRealized)){if(this.state.temporary.testCategory==="global")for(const n of Object.values(t)){if(n.testType==="theme")return"theme";if(n.testType==="price")return"price";if(n.testType==="basicScript")return"theme"}return"templateOrUrlRedirect"}const i=this.state.essential.visitorTests.filter(r=>!r.isInvalid&&this.testConfigs.some(n=>n.hypotheses.some(o=>o.id===r.hypothesisId)));return i.length===0?null:i.some(r=>this.getHypothesis(r.hypothesisId)?.type==="price")?"price":i.some(r=>r.isThemeTest)?"theme":"templateOrUrlRedirect"}applyControlForAudienceFilteredPriceTests(){const t=this.testConfigs.filter(s=>s.status==="active"&&s.hypotheses.some(r=>r.type==="price"));if(t.length===0)return;const e=this.testsFilteredByAudience.filter(s=>s.hypotheses.some(r=>r.type==="price")),i=t.filter(s=>!e.some(r=>r.id===s.id));if(i.length!==0){this.log("Found %d price tests filtered by audience, applying control selectors",i.length);for(const s of i){const r=s.hypotheses.find(c=>c.isControl),n=this.getDomSelectorsForHypothesis(r);if(n.length===0){this.log("No control selectors for audience-filtered price test '%s'",s.id);continue}const o=new URL(window.location.href);n.some(c=>{try{return new RegExp(it(c)).test(o.toString())}catch{return!1}})&&(this.log("Applying control selectors for audience-filtered price test '%s'",s.id),N(document,{testId:s.id,hypothesisId:r.id,selectors:n},()=>{}),this.updatePriceTestHiddenInputs(s.id,"control",!1))}}}pickHypothesis(t){let e=Math.random();const i=t.hypotheses.reduce((r,n)=>r+n.visitorCount,0);return t.hypotheses.sort((r,n)=>r.isControl?n.isControl?0:-1:n.isControl?1:0).reduce((r,n)=>{if(r!==null)return r;const l=t.hypotheses.reduce((c,d)=>c&&d.visitorCount>20,!0)?n.visitorCount/i-n.trafficPercentage:0;return e<=n.trafficPercentage-l?n:(e-=n.trafficPercentage-l,null)},null)}typeFromTemplate(){switch(template.type){case"list-collections":return"collectionList";case"page":return"landing";case"article":case"blog":case"cart":case"collection":case"index":case"product":case"search":return template.type;default:return null}}queueRedirect(t){this.saveState(),this.disableReferrerOverride||(this.log(`Saving temporary referrer override '${document.referrer}'`),this.state.temporary.originalReferrer=document.referrer,this.persistTemporaryState()),window.setTimeout(()=>window.location.assign(t),0),window.setTimeout(()=>{this.syncAllEvents()},2e3)}scheduleRetrySync(){this.clientIdRetryCount>=5||(this.clientIdRetryCount++,window.setTimeout(()=>{this.syncAllEvents()},500))}async syncAllEvents(){const t=async()=>{if(this.isSyncing){window.setTimeout(()=>{(async()=>await t())()},500);return}try{if(this.isSyncing=!0,this.syncGAEvents(),this.shopifyAnalyticsId||(this.shopifyAnalyticsId=this.getShopifyAnalyticsId()),!this.shopifyAnalyticsId){this.scheduleRetrySync();return}await this.syncEvents()}finally{this.isSyncing=!1}};await t()}async syncEvents(){if(!this.state.essential.consentApproved||!this.shopifyAnalyticsId||this.state.analytics.queue.length===0)return;const t=this.state.analytics.queue.length,e=this.state.analytics.queue.splice(0,t);this.log("Syncing %s events",t);try{const i={shop:this.shop,visitorDetails:{shopifyAnalyticsId:this.shopifyAnalyticsId,device:this.state.analytics.visitor?.device??this.device,country:this.state.analytics.visitor?.country??null,...this.state.essential.initialState},events:this.state.essential.visitorTests.filter(r=>!r.isInvalid&&!r.isSaved&&r.hypothesisId!=null).map(r=>new yt(r.testId,r.hypothesisId,r.createdAt)).concat(e)};await this.sendEvents(i);for(const r of this.state.essential.visitorTests.filter(n=>!n.isInvalid&&!n.isSaved&&n.hypothesisId!=null))this.sendDiagnosticTelemetry("event-delivered",r.testId,{hypothesisId:r.hypothesisId,isControl:r.assignedTo==="control",testType:r.testType??"unknown"});const s=await this.getVisitor(this.shopifyAnalyticsId);s!==null&&this.updateLocalVisitor(s);for(const r of this.state.essential.visitorTests.filter(n=>!n.isInvalid&&!n.isSaved))r.isSaved=!0,r.savedAt=Date.now()}catch{this.state.analytics.queue.splice(0,0,...e)}finally{this.saveState()}}syncGAEvents(){if(!this.gaConfig.sendEvents){if(pt)return;pt=!0,this.log("UseGtag is false — skipping GA Events");return}if(this.isSyncingGA){this.log("Already syncing GA - skipping GA events");return}const t=this.state.essential.visitorTests.filter(e=>e.shouldSendToGa);t.length!==0&&(this.isSyncingGA=!0,this.log("Syncing %s GA Events",t.length),Promise.allSettled(t.map(e=>this.sendGAEvent(e))).then(()=>this.log("All gtag events sent")).finally(()=>this.isSyncingGA=!1))}sendGAEvent(t){return new Promise(e=>{this.log("Sending GA Event for test %s, hypothesis %s",t.testId,t.hypothesisId);const i=()=>{this.log("GA acknowledged event for hypothesis %s",t.hypothesisId),t.shouldSendToGa=!1,this.persistEssentialState(),e()},s={exp_variant_string:`SL-${t.testId}-${t.hypothesisId}`};this.shopliftDebug&&Object.assign(s,{debug_mode:!0});function r(n,o,l){window.dataLayer=window.dataLayer||[],window.dataLayer.push(arguments)}this.gaConfig.mode==="gtag"?r("event","experience_impression",{...s,event_callback:i}):(window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"experience_impression",...s,eventCallback:i}))})}updateLocalVisitor(t){let e;({visitorTests:e,...this.state.analytics.visitor}=t),this.log("updateLocalVisitor - server returned %d tests: %o",e.length,e.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isInvalid:s.isInvalid}))),this.log("updateLocalVisitor - local has %d tests: %o",this.state.essential.visitorTests.length,this.state.essential.visitorTests.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isSaved:s.isSaved,isInvalid:s.isInvalid})));const i=300*1e3;for(const s of this.state.essential.visitorTests.filter(r=>r.isSaved&&(!r.savedAt||Date.now()-r.savedAt>i)&&!e.some(n=>n.testId===r.testId)))this.log("updateLocalVisitor - marking LOCAL test as INVALID (isSaved && not in server): testId=%s, hypothesisId=%s",s.testId,s.hypothesisId),s.isInvalid=!0;for(const s of e){const r=this.state.essential.visitorTests.findIndex(o=>o.testId===s.testId);if(!(r!==-1))this.log("updateLocalVisitor - ADDING server test (not found locally): testId=%s, hypothesisId=%s",s.testId,s.hypothesisId),this.state.essential.visitorTests.push(s);else{const o=this.state.essential.visitorTests.at(r);this.log("updateLocalVisitor - REPLACING local test with server test: testId=%s, local hypothesisId=%s -> server hypothesisId=%s, local isInvalid=%s -> false",s.testId,o?.hypothesisId,s.hypothesisId,o?.isInvalid),s.isInvalid=!1,s.shouldSendToGa=o?.shouldSendToGa??!1,s.testType=o?.testType,s.assignedTo=o?.assignedTo,s.testTitle=o?.testTitle,this.state.essential.visitorTests.splice(r,1,s)}}this.log("updateLocalVisitor - FINAL local tests: %o",this.state.essential.visitorTests.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isSaved:s.isSaved,isInvalid:s.isInvalid}))),this.state.analytics.visitor.storedAt=new Date}async getVisitor(t){try{return await this.makeJsonRequest({method:"get",url:`${this.eventHost}/api/v0/visitors/by-key/${this.shop}/${t}`})}catch{return null}}async sendEvents(t){await this.makeRequest({method:"post",url:`${this.eventHost}/api/v0/events`,data:JSON.stringify(t)})}sendDiagnosticTelemetry(t,e,i){if(!this.telemetryEnabled||!navigator.sendBeacon)return;const s=this.state.essential.consentApproved,r=JSON.stringify({shop:this.shop,testId:e,checkpoint:t,device:this.device,...s?{visitorId:this.shopifyAnalyticsId??"unknown"}:{},clientTimestamp:Date.now(),consentApproved:s,hasConsentInteraction:this.state.essential.hasConsentInteraction,...i});navigator.sendBeacon(`${this.eventHost}/api/v0/telemetry`,new Blob([r],{type:"text/plain"}))}getUTMValue(t){const i=decodeURIComponent(window.location.search.substring(1)).split("&");for(let s=0;s<i.length;s++){const r=i[s].split("=");if(r[0]===t)return r[1]||null}return null}hidePage(t){this.log("Hiding page"),this.cssHideClass&&!window.document.documentElement.classList.contains(this.cssHideClass)&&(window.document.documentElement.classList.add(this.cssHideClass),t||setTimeout(this.removeAsyncHide(this.cssHideClass),2e3))}showPage(){this.cssHideClass&&this.removeAsyncHide(this.cssHideClass)()}getDeviceType(){function t(){let i=!1;return(function(s){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(s)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(s.substr(0,4)))&&(i=!0)})(navigator.userAgent||navigator.vendor),i}function e(){let i=!1;return(function(s){(/android|ipad|playbook|silk/i.test(s)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(s.substr(0,4)))&&(i=!0)})(navigator.userAgent||navigator.vendor),i}return t()?"mobile":e()?"tablet":"desktop"}removeAsyncHide(t){return()=>{t&&window.document.documentElement.classList.remove(t)}}async getCartState(){try{let t=await this.makeJsonRequest({method:"get",url:`${window.location.origin}/cart.js`});return t===null||(t.note===null&&(t=await this.makeJsonRequest({method:"post",url:`${window.location.origin}/cart/update.js`,data:JSON.stringify({note:""})})),t==null)?null:{token:t.token,total_price:t.total_price,total_discount:t.total_discount,currency:t.currency,items_subtotal_price:t.items_subtotal_price,items:t.items.map(e=>({quantity:e.quantity,variant_id:e.variant_id,key:e.key,price:e.price,final_line_price:e.final_line_price,sku:e.sku,product_id:e.product_id}))}}catch(t){return this.log("Error sending cart info",t),null}}ensureCartAttributesForExistingPriceTests(t){try{if(this.log("Checking visitor assignments for active price tests"),t&&this.state.temporary.previewConfig){const e=this.state.temporary.previewConfig;this.log("Using preview config for merchant:",e.testId);let i="variant";if(e.variants&&e.variants.length>0){const s=e.variants.find(r=>r.id===e.currentVariant);s&&s.isControl&&(i="control")}this.log("Merchant preview - updating hidden inputs:",e.testId,i),this.updatePriceTestHiddenInputs(e.testId,i,!0);return}for(const e of this.state.essential.visitorTests){const i=this.testConfigs.find(n=>n.id===e.testId);if(!i){this.log("Test config not found:",e.testId);continue}const s=i.hypotheses.find(n=>n.id===e.hypothesisId);if(!s||s.type!=="price")continue;const r=s.isControl?"control":"variant";this.log("Updating hidden inputs for price test:",e.testId,r),this.updatePriceTestHiddenInputs(e.testId,r,t)}}catch(e){this.log("Error ensuring cart attributes for existing price tests:",e)}}subscriptionSwapDone=!1;subscriptionHideWrongPlans=null;subscriptionPriceDone=!1;subscriptionUpdateOneTime=null;subscriptionOneTimeDone=!1;swapMap=null;slptValue=null;async subscriptionSwap(){await Lt(this)}async subscriptionPriceChange(){await qt(this)}async subscriptionOneTimePrice(){await Ht(this)}updatePriceTestHiddenInputs(t,e,i){try{this.cleanupPriceTestObservers();const s=`${t}:${e}:${i?"t":"f"}`,r=C=>{const m=C.getAttribute("data-sl-pid");if(!m)return!0;if(i&&this.state.temporary.previewConfig){const w=this.state.temporary.previewConfig,T=e==="control"?"a":"b",f=w.variants.find(v=>v.label===T);if(!f)return!1;for(const v of f.domSelectors||[]){const g=v.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);if(g){const I=g[1];if(this.log(`Extracted ID from selector: ${I}, comparing to: ${m}`),I===m)return this.log("Product ID match found in preview config:",m,"variant:",f.label),!0}else this.log(`Could not extract ID from selector: ${v.cssSelector}`)}return this.log("No product ID match in preview config for:",m,"variant:",T),!1}const y=this.testConfigs.find(w=>w.id===t);if(!y)return this.log("Test config not found for testId:",t),!1;for(const w of y.hypotheses||[]){for(const T of w.domSelectors||[]){const f=T.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);if(f&&f[1]===m)return this.log("Product ID match found in domSelectors:",m,"for test:",t),!0}if(w.priceData?.variants){for(const T of w.priceData.variants)if(T[0]===m)return this.log("Product ID match found in priceData:",m,"for test:",t),!0}}return this.log("No product ID match for:",m,"in test:",t),!1},n=new Set;let o=!1,l=null;const c=(C,m)=>{if(document.querySelectorAll("[data-sl-attribute-p]").forEach(w=>{if(w instanceof Element&&w.nodeType===Node.ELEMENT_NODE&&w.isConnected&&document.contains(w))try{C.observe(w,{childList:!0,subtree:!0,characterData:!0,characterDataOldValue:!0,attributes:!1})}catch(T){this.log(`Failed to observe element (${m}):`,T)}}),document.body&&document.body.isConnected)try{C.observe(document.body,{childList:!0,subtree:!0,characterData:!0,characterDataOldValue:!0,attributes:!1})}catch(w){this.log(`Failed to observe document.body (${m}):`,w)}},d=(C,m,y,w)=>{const T=C.filter(f=>{const v=f.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);return v&&v[1]===w});this.log(`Applying ${y} DOM selectors, total: ${C.length}, filtered: ${T.length}`),T.length>0&&N(document,{testId:t,hypothesisId:m,selectors:T})},p=(C,m)=>{this.log(`Applying DOM selector changes for product ID: ${C}`),m.disconnect(),o=!0;try{if(i&&this.state.temporary.previewConfig){const y=e==="control"?"a":"b",w=this.state.temporary.previewConfig.variants.find(T=>T.label===y);if(!w?.domSelectors){this.log(`No DOM selectors found for preview variant: ${y}`);return}d(w.domSelectors,w.id,"preview config",C)}else{const y=this.testConfigs.find(T=>T.id===t);if(!y){this.log(`No test config found for testId: ${t}`);return}const w=y.hypotheses.find(T=>e==="control"?T.isControl:!T.isControl);if(!w?.domSelectors){this.log(`No DOM selectors found for assignment: ${e}`);return}d(w.domSelectors,w.id,"live config",C)}}finally{l!==null&&clearTimeout(l),l=window.setTimeout(()=>{o=!1,l=null,c(m,"reconnection"),this.log("Re-established innerHTML observer after DOM changes")},50)}},h=new MutationObserver(C=>{if(!o)for(const m of C){if(m.type!=="childList"&&m.type!=="characterData")continue;let y=m.target;m.type==="characterData"&&(y=m.target.parentElement||m.target.parentNode);let w=y,T=w.getAttribute("data-sl-attribute-p");for(;!T&&w.parentElement;)w=w.parentElement,T=w.getAttribute("data-sl-attribute-p");if(!T)continue;const f=w.innerHTML||w.textContent||"";let v="";m.type==="characterData"&&m.oldValue!==null&&(v=m.oldValue),this.log(`innerHTML changed on element with data-sl-attribute-p="${T}"`),v&&this.log(`Previous content: "${v}"`),this.log(`Current content: "${f}"`),p(T,h)}});c(h,"initial setup"),n.add(h);const u=new MutationObserver(C=>{C.forEach(m=>{m.addedNodes.forEach(y=>{if(y.nodeType===Node.ELEMENT_NODE){const w=y;k(w);const T=w.matches('input[name="properties[_slpt]"]')?[w]:w.querySelectorAll('input[name="properties[_slpt]"]');T.length>0&&this.log(`MutationObserver found ${T.length} new hidden input(s)`),T.forEach(f=>{const v=f.getAttribute("data-sl-pid");if(this.log(`MutationObserver checking new input with data-sl-pid="${v}"`),r(f))f.value!==s&&(f.value=s,this.log("Updated newly added hidden input:",s)),S(f);else{const g=f.getAttribute("data-sl-pid");g&&this.isProductInAnyPriceTest(g)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",g):(f.remove(),this.log("Removed newly added non-matching hidden input for product ID:",g))}})}})})});n.add(u);const b=new MutationObserver(C=>{C.forEach(m=>{if(m.type==="attributes"&&m.attributeName==="data-sl-pid"){const y=m.target;if(this.log("AttributeObserver detected data-sl-pid attribute change on:",y.tagName),y.matches('input[name="properties[_slpt]"]')){const w=y,T=m.oldValue,f=w.getAttribute("data-sl-pid");this.log(`data-sl-pid changed from "${T}" to "${f}" - triggering payment placement updates`),r(w)?(w.value!==s&&(w.value=s,this.log("Updated hidden input after data-sl-pid change:",s)),f&&p(f,h),this.log("Re-running payment placement updates after variant change"),k(document.body)):f&&this.isProductInAnyPriceTest(f)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",f):(w.remove(),this.log("Removed non-matching hidden input after data-sl-pid change:",f))}}})});n.add(b);const k=C=>{C.tagName==="SHOPIFY-PAYMENT-TERMS"&&(this.log("MutationObserver found new shopify-payment-terms element"),this.updateShopifyPaymentTerms(t,e));const m=C.querySelectorAll("shopify-payment-terms");m.length>0&&(this.log(`MutationObserver found ${m.length} shopify-payment-terms in added node`),this.updateShopifyPaymentTerms(t,e)),C.tagName==="AFTERPAY-PLACEMENT"&&(this.log("MutationObserver found new afterpay-placement element"),this.updateAfterpayPlacements(t,e,"afterpay"));const y=C.querySelectorAll("afterpay-placement");y.length>0&&(this.log(`MutationObserver found ${y.length} afterpay-placement in added node`),this.updateAfterpayPlacements(t,e,"afterpay")),C.tagName==="SQUARE-PLACEMENT"&&(this.log("MutationObserver found new square-placement element"),this.updateAfterpayPlacements(t,e,"square"));const w=C.querySelectorAll("square-placement");w.length>0&&(this.log(`MutationObserver found ${w.length} square-placement in added node`),this.updateAfterpayPlacements(t,e,"square")),C.tagName==="KLARNA-PLACEMENT"&&(this.log("MutationObserver found new klarna-placement element"),this.updateKlarnaPlacements(t,e));const T=C.querySelectorAll("klarna-placement");T.length>0&&(this.log(`MutationObserver found ${T.length} klarna-placement in added node`),this.updateKlarnaPlacements(t,e))},S=C=>{b.observe(C,{attributes:!0,attributeFilter:["data-sl-pid"],attributeOldValue:!0,subtree:!1});const m=C.getAttribute("data-sl-pid");this.log(`Started AttributeObserver on specific input with data-sl-pid="${m}"`)},P=()=>{const C=document.querySelectorAll('input[name="properties[_slpt]"]');this.log(`Found ${C.length} existing hidden inputs to check`),C.forEach(m=>{const y=m.getAttribute("data-sl-pid");this.log(`Checking existing input with data-sl-pid="${y}"`),r(m)?(m.value=s,this.log("Updated existing hidden input:",s),y&&(this.log("Applying initial DOM selector changes for existing product"),p(y,h)),S(m)):y&&this.isProductInAnyPriceTest(y)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",y):(m.remove(),this.log("Removed non-matching hidden input for product ID:",y))})},_=()=>{document.body?(u.observe(document.body,{childList:!0,subtree:!0}),this.log("Started MutationObserver on document.body"),P(),k(document.body)):document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{document.body&&(u.observe(document.body,{childList:!0,subtree:!0}),this.log("Started MutationObserver after DOMContentLoaded"),P(),k(document.body))}):(this.log("Set timeout on observer"),setTimeout(_,10))};_(),window.__shopliftPriceTestObservers=n,window.__shopliftPriceTestValue=s,this.log("Set up DOM observer for price test hidden inputs")}catch(s){this.log("Error updating price test hidden inputs:",s)}}updateKlarnaPlacements(t,e){this.updatePlacementElements(t,e,"klarna-placement",(i,s)=>{i.setAttribute("data-purchase-amount",s.toString())})}cleanupPriceTestObservers(){const t=window.__shopliftPriceTestObservers;t&&(t.forEach(e=>{e.disconnect()}),t.clear(),this.log("Cleaned up existing price test observers")),delete window.__shopliftPriceTestObservers,delete window.__shopliftPriceTestValue}updateAfterpayPlacements(t,e,i="afterpay"){const s=i==="square"?"square-placement":"afterpay-placement";if(document.querySelectorAll(s).length===0){this.log(`No ${s} elements found on page - early return`);return}this.updatePlacementElements(t,e,s,(n,o)=>{if(i==="afterpay"){const l=(o/100).toFixed(2);n.setAttribute("data-amount",l)}else n.setAttribute("data-amount",o.toString())}),this.log("updateAfterpayPlacements completed")}updatePlacementElements(t,e,i,s){const r=document.querySelectorAll(i);if(r.length===0){this.log(`No ${i} elements found - early return`);return}let n;if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const l=e==="control"?"a":"b",c=this.state.temporary.previewConfig.variants.find(d=>d.label===l);if(!c?.domSelectors){this.log(`No variant found for label ${l} in preview config for ${i}`);return}n=c.domSelectors,this.log(`Using preview config for ${i} in merchant mode, variant: ${l}`)}else{const l=this.testConfigs.find(d=>d.id===t);if(!l){this.log(`No testConfig found for id: ${t} - early return`);return}const c=l.hypotheses.find(d=>e==="control"?d.isControl:!d.isControl);if(!c?.domSelectors){this.log(`No hypothesis or domSelectors found for assignment: ${e} - early return`);return}n=c.domSelectors}const o=new RegExp(`${this.DATA_SL_ATTRIBUTE_P}=["'](\\d+)["']`);r.forEach(l=>{let c=null;const d=l.parentElement;if(d&&(c=d.querySelector('input[name="properties[_slpt]"]')),c||(c=l.querySelector('input[name="properties[_slpt]"]')),!c){this.log(`No hidden input found for ${i} element`);return}const p=c.getAttribute("data-sl-pid");if(!p){this.log("Hidden input has no data-sl-pid attribute - skipping");return}const h=n.find(S=>{const P=S.cssSelector.match(o);return P&&P[1]===p});if(!h){this.log(`No matching selector found for productId: ${p} - skipping element`);return}const u=h.actions.find(S=>S.scope==="price");if(!u?.value){this.log("No price action or value found - skipping element");return}const b=parseFloat(u.value.replace(/[^0-9.]/g,""));if(Number.isNaN(b)){this.log(`Invalid price "${u.value}" for product ${p} - skipping`);return}const k=Math.round(b*100);s(l,k)}),this.log(`updatePlacementElements completed for ${i}`)}updateShopifyPaymentTerms(t,e){const i=document.querySelectorAll("shopify-payment-terms");if(i.length===0)return;this.log("Store using shopify payments");let s;if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const n=e==="control"?"a":"b",o=this.state.temporary.previewConfig.variants.find(l=>l.label===n);if(!o||!o.domSelectors){this.log(`No variant found for label ${n} in preview config`);return}s=o.domSelectors,this.log(`Using preview config for shopify-payment-terms in merchant mode, variant: ${n}`)}else{const n=this.testConfigs.find(l=>l.id===t);if(!n)return;const o=n.hypotheses.find(l=>e==="control"?l.isControl===!0:l.isControl===!1);if(!o||!o.domSelectors)return;s=o.domSelectors}const r=new RegExp(`${this.DATA_SL_ATTRIBUTE_P}=["'](\\d+)["']`);i.forEach(n=>{const o=n.getAttribute("variant-id");if(!o)return;const l=s.find(c=>{const d=c.cssSelector.match(r);return d&&d[1]===o});if(l){const c=l.actions.find(d=>d.scope==="price");if(c&&c.value){const d=n.getAttribute("shopify-meta");if(d)try{const p=JSON.parse(d);if(p.variants&&Array.isArray(p.variants)){const h=p.variants.find(u=>u.id?.toString()===o);if(h){h.full_price=c.value;const u=parseFloat(c.value.replace(/[^0-9.]/g,""));if(h.number_of_payment_terms&&h.number_of_payment_terms>1){const b=u/h.number_of_payment_terms;h.price_per_term=`$${b.toFixed(2)}`}n.setAttribute("shopify-meta",JSON.stringify(p))}}}catch(p){this.log("Error parsing/updating shoplift-meta:",p)}}}})}async makeJsonRequest(t){const e=await this.makeRequest(t);return e===null?null:JSON.parse(await e.text(),F)}async makeRequest(t){const{url:e,method:i,headers:s,data:r,signal:n}=t,o=new Headers;if(s)for(const c in s)o.append(c,s[c]);(!s||!s.Accept)&&o.append("Accept","application/json"),(!s||!s["Content-Type"])&&o.append("Content-Type","application/json"),(this.eventHost.includes("ngrok.io")||this.eventHost.includes("ngrok-free.app"))&&o.append("ngrok-skip-browser-warning","1234");const l=await this.fetch(e,{method:i,headers:o,body:r,signal:n});if(!l.ok){if(l.status===204)return null;if(l.status===422){const c=await l.json();if(typeof c<"u"&&c.isBot)throw new et}throw new Error(`Error sending shoplift request ${l.status}`)}return l}queueAddVisitorToTest(t,e){if(this.state.essential.visitorTests.some(s=>s.testId===t))return;const i=this.testConfigs.find(s=>s.id===t);if(this.state.essential.visitorTests.push({createdAt:new Date,testId:t,hypothesisId:e.id,isThemeTest:e.type==="theme",themeId:e.themeId,isSaved:!1,isInvalid:!1,shouldSendToGa:!0,testType:e.type,assignedTo:e.isControl?"control":"variant",testTitle:i?.title}),e.type==="price"){const s=e.isControl?"control":"variant";this.log("Price test assignment detected, updating cart attributes:",t,s),this.updatePriceTestHiddenInputs(t,s,!1)}}queueCartUpdate(t){this.queueEvent(new wt(t))}queuePageView(t){this.queueEvent(new vt(t))}queueEvent(t){!this.state.essential.consentApproved&&this.state.essential.hasConsentInteraction||this.state.analytics.queue.length>10||this.state.analytics.queue.push(t)}legacyGetLocalStorageVisitor(){const t=this.localStorageGet(this.legacySessionKey);if(t)try{return JSON.parse(t,F)}catch{}return null}pruneStaleVisitorTests(){this.state.essential.visitorTests=this.state.essential.visitorTests.filter(t=>this.testConfigs.some(e=>e.id==t.testId)||this.inactiveTestConfigs.filter(e=>this.testIsPaused(e)).some(e=>e.id===t.testId))}pruneStateAndSave(){this.pruneStaleVisitorTests(),this.saveState()}saveState(){this.persistEssentialState(),this.persistAnalyticsState()}loadState(){const t=this.loadAnalyticsState(),e={analytics:t,essential:this.loadEssentialState(t),temporary:this.loadTemporaryState()},i=this.legacyGetLocalStorageVisitor(),s=this.legacyGetCookieVisitor(),r=[i,s].filter(n=>n!==null).sort((n,o)=>+o.storedAt-+n.storedAt)[0];return e.analytics.visitor===null&&r&&({visitorTests:e.essential.visitorTests,...e.analytics.visitor}=r,e.essential.isFirstLoad=!1,e.essential.initialState={createdAt:r.createdAt,referrer:r.referrer,utmCampaign:r.utmCampaign,utmContent:r.utmContent,utmMedium:r.utmMedium,utmSource:r.utmSource,device:r.device},this.deleteCookie("SHOPLIFT"),this.deleteLocalStorage(this.legacySessionKey)),!e.essential.consentApproved&&e.essential.hasConsentInteraction&&this.deleteLocalStorage(this.analyticsSessionKey),e}loadEssentialState(t){const e=this.loadLocalStorage(this.essentialSessionKey),i=this.loadCookie(this.essentialSessionKey),s=this.getInitialState();t.visitor?.device&&(s.device=t.visitor.device);const r={timestamp:new Date,consentApproved:!1,hasConsentInteraction:!1,debugMode:!1,initialState:s,visitorTests:[],isFirstLoad:!0},n=[e,i].filter(o=>o!==null).sort((o,l)=>+l.timestamp-+o.timestamp)[0]??r;return n.initialState||(t.visitor!==null?n.initialState=t.visitor:(n.initialState=s,n.initialState.createdAt=n.timestamp)),n}loadAnalyticsState(){const t=this.loadLocalStorage(this.analyticsSessionKey),e=this.loadCookie(this.analyticsSessionKey),i={timestamp:new Date,visitor:null,queue:[]},s=[t,e].filter(r=>r!==null).sort((r,n)=>+n.timestamp-+r.timestamp)[0]??i;return s.queue.length===0&&t&&t.queue.length>1&&(s.queue=t.queue),s}loadTemporaryState(){const t=this.sessionStorageGet(this.temporarySessionKey),e=t?JSON.parse(t,F):null,i=this.loadCookie(this.temporarySessionKey);return e??i??{isMerchant:!1,timestamp:new Date}}persistEssentialState(){this.log("Persisting essential state"),this.state.essential.isFirstLoad=!1,this.state.essential.timestamp=new Date,this.persistLocalStorageState(this.essentialSessionKey,this.state.essential),this.persistCookieState(this.essentialSessionKey,this.state.essential)}persistAnalyticsState(){this.log("Persisting analytics state"),this.state.essential.consentApproved&&(this.state.analytics.timestamp=new Date,this.persistLocalStorageState(this.analyticsSessionKey,this.state.analytics),this.persistCookieState(this.analyticsSessionKey,{...this.state.analytics,queue:[]}))}persistTemporaryState(){this.log("Setting temporary session state"),this.state.temporary.timestamp=new Date,this.sessionStorageSet(this.temporarySessionKey,JSON.stringify(this.state.temporary)),this.persistCookieState(this.temporarySessionKey,this.state.temporary,!0)}loadLocalStorage(t){const e=this.localStorageGet(t);if(e===null)return null;try{return JSON.parse(e,F)}catch{return null}}loadCookie(t){const e=this.getCookie(t);if(e===null)return null;try{return JSON.parse(e,F)}catch{return null}}persistLocalStorageState(t,e){this.localStorageSet(t,JSON.stringify(e))}persistCookieState(t,e,i=!1){const s=JSON.stringify(e),r=i?"":`expires=${new Date(new Date().getTime()+864e5*365).toUTCString()};`;document.cookie=`${t}=${s};domain=.${window.location.hostname};path=/;SameSite=Strict;${r}`}deleteCookie(t){const e=new Date(0).toUTCString();document.cookie=`${t}=;domain=.${window.location.hostname};path=/;expires=${e};`}deleteLocalStorage(t){window.localStorage.removeItem(t)}getChannel(t){return[{"name":"cross-network","test":(v) => new RegExp(".*cross-network.*", "i").test(v.utmCampaign)},{"name":"direct","test":(v) => v.utmSource === "" && v.utmMedium === ""},{"name":"paid-shopping","test":(v) => (new RegExp("^(?:Google|IGShopping|aax-us-east\.amazon-adsystem\.com|aax\.amazon-adsystem\.com|alibaba|alibaba\.com|amazon|amazon\.co\.uk|amazon\.com|apps\.shopify\.com|checkout\.shopify\.com|checkout\.stripe\.com|cr\.shopping\.naver\.com|cr2\.shopping\.naver\.com|ebay|ebay\.co\.uk|ebay\.com|ebay\.com\.au|ebay\.de|etsy|etsy\.com|m\.alibaba\.com|m\.shopping\.naver\.com|mercadolibre|mercadolibre\.com|mercadolibre\.com\.ar|mercadolibre\.com\.mx|message\.alibaba\.com|msearch\.shopping\.naver\.com|nl\.shopping\.net|no\.shopping\.net|offer\.alibaba\.com|one\.walmart\.com|order\.shopping\.yahoo\.co\.jp|partners\.shopify\.com|s3\.amazonaws\.com|se\.shopping\.net|shop\.app|shopify|shopify\.com|shopping\.naver\.com|shopping\.yahoo\.co\.jp|shopping\.yahoo\.com|shopzilla|shopzilla\.com|simplycodes\.com|store\.shopping\.yahoo\.co\.jp|stripe|stripe\.com|uk\.shopping\.net|walmart|walmart\.com)$", "i").test(v.utmSource) || new RegExp("^(.*(([^a-df-z]|^)shop|shopping).*)$", "i").test(v.utmCampaign)) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-search","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-social","test":(v) => new RegExp("^(?:43things|43things\.com|51\.com|5ch\.net|Hatena|ImageShack|academia\.edu|activerain|activerain\.com|activeworlds|activeworlds\.com|addthis|addthis\.com|airg\.ca|allnurses\.com|allrecipes\.com|alumniclass|alumniclass\.com|ameba\.jp|ameblo\.jp|americantowns|americantowns\.com|amp\.reddit\.com|ancestry\.com|anobii|anobii\.com|answerbag|answerbag\.com|answers\.yahoo\.com|aolanswers|aolanswers\.com|apps\.facebook\.com|ar\.pinterest\.com|artstation\.com|askubuntu|askubuntu\.com|asmallworld\.com|athlinks|athlinks\.com|away\.vk\.com|awe\.sm|b\.hatena\.ne\.jp|baby-gaga|baby-gaga\.com|babyblog\.ru|badoo|badoo\.com|bebo|bebo\.com|beforeitsnews|beforeitsnews\.com|bharatstudent|bharatstudent\.com|biip\.no|biswap\.org|bit\.ly|blackcareernetwork\.com|blackplanet|blackplanet\.com|blip\.fm|blog\.com|blog\.feedspot\.com|blog\.goo\.ne\.jp|blog\.naver\.com|blog\.yahoo\.co\.jp|blogg\.no|bloggang\.com|blogger|blogger\.com|blogher|blogher\.com|bloglines|bloglines\.com|blogs\.com|blogsome|blogsome\.com|blogspot|blogspot\.com|blogster|blogster\.com|blurtit|blurtit\.com|bookmarks\.yahoo\.co\.jp|bookmarks\.yahoo\.com|br\.pinterest\.com|brightkite|brightkite\.com|brizzly|brizzly\.com|business\.facebook\.com|buzzfeed|buzzfeed\.com|buzznet|buzznet\.com|cafe\.naver\.com|cafemom|cafemom\.com|camospace|camospace\.com|canalblog\.com|care\.com|care2|care2\.com|caringbridge\.org|catster|catster\.com|cbnt\.io|cellufun|cellufun\.com|centerblog\.net|chat\.zalo\.me|chegg\.com|chicagonow|chicagonow\.com|chiebukuro\.yahoo\.co\.jp|classmates|classmates\.com|classquest|classquest\.com|co\.pinterest\.com|cocolog-nifty|cocolog-nifty\.com|copainsdavant\.linternaute\.com|couchsurfing\.org|cozycot|cozycot\.com|cross\.tv|crunchyroll|crunchyroll\.com|cyworld|cyworld\.com|cz\.pinterest\.com|d\.hatena\.ne\.jp|dailystrength\.org|deluxe\.com|deviantart|deviantart\.com|dianping|dianping\.com|digg|digg\.com|diigo|diigo\.com|discover\.hubpages\.com|disqus|disqus\.com|dogster|dogster\.com|dol2day|dol2day\.com|doostang|doostang\.com|dopplr|dopplr\.com|douban|douban\.com|draft\.blogger\.com|draugiem\.lv|drugs-forum|drugs-forum\.com|dzone|dzone\.com|edublogs\.org|elftown|elftown\.com|epicurious\.com|everforo\.com|exblog\.jp|extole|extole\.com|facebook|facebook\.com|faceparty|faceparty\.com|fandom\.com|fanpop|fanpop\.com|fark|fark\.com|fb|fb\.me|fc2|fc2\.com|feedspot|feministing|feministing\.com|filmaffinity|filmaffinity\.com|flickr|flickr\.com|flipboard|flipboard\.com|folkdirect|folkdirect\.com|foodservice|foodservice\.com|forums\.androidcentral\.com|forums\.crackberry\.com|forums\.imore\.com|forums\.nexopia\.com|forums\.webosnation\.com|forums\.wpcentral\.com|fotki|fotki\.com|fotolog|fotolog\.com|foursquare|foursquare\.com|free\.facebook\.com|friendfeed|friendfeed\.com|fruehstueckstreff\.org|fubar|fubar\.com|gaiaonline|gaiaonline\.com|gamerdna|gamerdna\.com|gather\.com|geni\.com|getpocket\.com|glassboard|glassboard\.com|glassdoor|glassdoor\.com|godtube|godtube\.com|goldenline\.pl|goldstar|goldstar\.com|goo\.gl|gooblog|goodreads|goodreads\.com|google\+|googlegroups\.com|googleplus|govloop|govloop\.com|gowalla|gowalla\.com|gree\.jp|groups\.google\.com|gulli\.com|gutefrage\.net|habbo|habbo\.com|hi5|hi5\.com|hootsuite|hootsuite\.com|houzz|houzz\.com|hoverspot|hoverspot\.com|hr\.com|hu\.pinterest\.com|hubculture|hubculture\.com|hubpages\.com|hyves\.net|hyves\.nl|ibibo|ibibo\.com|id\.pinterest\.com|identi\.ca|ig|imageshack\.com|imageshack\.us|imvu|imvu\.com|in\.pinterest\.com|insanejournal|insanejournal\.com|instagram|instagram\.com|instapaper|instapaper\.com|internations\.org|interpals\.net|intherooms|intherooms\.com|irc-galleria\.net|is\.gd|italki|italki\.com|jammerdirect|jammerdirect\.com|jappy\.com|jappy\.de|kaboodle\.com|kakao|kakao\.com|kakaocorp\.com|kaneva|kaneva\.com|kin\.naver\.com|l\.facebook\.com|l\.instagram\.com|l\.messenger\.com|last\.fm|librarything|librarything\.com|lifestream\.aol\.com|line|line\.me|linkedin|linkedin\.com|listal|listal\.com|listography|listography\.com|livedoor\.com|livedoorblog|livejournal|livejournal\.com|lm\.facebook\.com|lnkd\.in|m\.blog\.naver\.com|m\.cafe\.naver\.com|m\.facebook\.com|m\.kin\.naver\.com|m\.vk\.com|m\.yelp\.com|mbga\.jp|medium\.com|meetin\.org|meetup|meetup\.com|meinvz\.net|meneame\.net|menuism\.com|messages\.google\.com|messages\.yahoo\.co\.jp|messenger|messenger\.com|mix\.com|mixi\.jp|mobile\.facebook\.com|mocospace|mocospace\.com|mouthshut|mouthshut\.com|movabletype|movabletype\.com|mubi|mubi\.com|my\.opera\.com|myanimelist\.net|myheritage|myheritage\.com|mylife|mylife\.com|mymodernmet|mymodernmet\.com|myspace|myspace\.com|netvibes|netvibes\.com|news\.ycombinator\.com|newsshowcase|nexopia|ngopost\.org|niconico|nicovideo\.jp|nightlifelink|nightlifelink\.com|ning|ning\.com|nl\.pinterest\.com|odnoklassniki\.ru|odnoklassniki\.ua|okwave\.jp|old\.reddit\.com|oneworldgroup\.org|onstartups|onstartups\.com|opendiary|opendiary\.com|oshiete\.goo\.ne\.jp|out\.reddit\.com|over-blog\.com|overblog\.com|paper\.li|partyflock\.nl|photobucket|photobucket\.com|pinboard|pinboard\.in|pingsta|pingsta\.com|pinterest|pinterest\.at|pinterest\.ca|pinterest\.ch|pinterest\.cl|pinterest\.co\.kr|pinterest\.co\.uk|pinterest\.com|pinterest\.com\.au|pinterest\.com\.mx|pinterest\.de|pinterest\.es|pinterest\.fr|pinterest\.it|pinterest\.jp|pinterest\.nz|pinterest\.ph|pinterest\.pt|pinterest\.ru|pinterest\.se|pixiv\.net|pl\.pinterest\.com|playahead\.se|plurk|plurk\.com|plus\.google\.com|plus\.url\.google\.com|pocket\.co|posterous|posterous\.com|pro\.homeadvisor\.com|pulse\.yahoo\.com|qapacity|qapacity\.com|quechup|quechup\.com|quora|quora\.com|qzone\.qq\.com|ravelry|ravelry\.com|reddit|reddit\.com|redux|redux\.com|renren|renren\.com|researchgate\.net|reunion|reunion\.com|reverbnation|reverbnation\.com|rtl\.de|ryze|ryze\.com|salespider|salespider\.com|scoop\.it|screenrant|screenrant\.com|scribd|scribd\.com|scvngr|scvngr\.com|secondlife|secondlife\.com|serverfault|serverfault\.com|shareit|sharethis|sharethis\.com|shvoong\.com|sites\.google\.com|skype|skyrock|skyrock\.com|slashdot\.org|slideshare\.net|smartnews\.com|snapchat|snapchat\.com|social|sociallife\.com\.br|socialvibe|socialvibe\.com|spaces\.live\.com|spoke|spoke\.com|spruz|spruz\.com|ssense\.com|stackapps|stackapps\.com|stackexchange|stackexchange\.com|stackoverflow|stackoverflow\.com|stardoll\.com|stickam|stickam\.com|studivz\.net|suomi24\.fi|superuser|superuser\.com|sweeva|sweeva\.com|t\.co|t\.me|tagged|tagged\.com|taggedmail|taggedmail\.com|talkbiznow|talkbiznow\.com|taringa\.net|techmeme|techmeme\.com|tencent|tencent\.com|tiktok|tiktok\.com|tinyurl|tinyurl\.com|toolbox|toolbox\.com|touch\.facebook\.com|tr\.pinterest\.com|travellerspoint|travellerspoint\.com|tripadvisor|tripadvisor\.com|trombi|trombi\.com|trustpilot|tudou|tudou\.com|tuenti|tuenti\.com|tumblr|tumblr\.com|tweetdeck|tweetdeck\.com|twitter|twitter\.com|twoo\.com|typepad|typepad\.com|unblog\.fr|urbanspoon\.com|ushareit\.com|ushi\.cn|vampirefreaks|vampirefreaks\.com|vampirerave|vampirerave\.com|vg\.no|video\.ibm\.com|vk\.com|vkontakte\.ru|wakoopa|wakoopa\.com|wattpad|wattpad\.com|web\.facebook\.com|web\.skype\.com|webshots|webshots\.com|wechat|wechat\.com|weebly|weebly\.com|weibo|weibo\.com|wer-weiss-was\.de|weread|weread\.com|whatsapp|whatsapp\.com|wiki\.answers\.com|wikihow\.com|wikitravel\.org|woot\.com|wordpress|wordpress\.com|wordpress\.org|xanga|xanga\.com|xing|xing\.com|yahoo-mbga\.jp|yammer|yammer\.com|yelp|yelp\.co\.uk|yelp\.com|youroom\.in|za\.pinterest\.com|zalo|zoo\.gr|zooppa|zooppa\.com)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-video","test":(v) => new RegExp("^(?:blog\.twitch\.tv|crackle|crackle\.com|curiositystream|curiositystream\.com|d\.tube|dailymotion|dailymotion\.com|dashboard\.twitch\.tv|disneyplus|disneyplus\.com|fast\.wistia\.net|help\.hulu\.com|help\.netflix\.com|hulu|hulu\.com|id\.twitch\.tv|iq\.com|iqiyi|iqiyi\.com|jobs\.netflix\.com|justin\.tv|m\.twitch\.tv|m\.youtube\.com|music\.youtube\.com|netflix|netflix\.com|player\.twitch\.tv|player\.vimeo\.com|ted|ted\.com|twitch|twitch\.tv|utreon|utreon\.com|veoh|veoh\.com|viadeo\.journaldunet\.com|vimeo|vimeo\.com|wistia|wistia\.com|youku|youku\.com|youtube|youtube\.com)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"display","test":(v) => new RegExp("^(?:display|banner|expandable|interstitial|cpm)$", "i").test(v.utmMedium)},{"name":"paid-other","test":(v) => new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"organic-shopping","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) || new RegExp("^(.*(([^a-df-z]|^)shop|shopping).*)$", "i").test(v.utmCampaign)},{"name":"organic-social","test":(v) => new RegExp("^(?:43things|43things\.com|51\.com|5ch\.net|Hatena|ImageShack|academia\.edu|activerain|activerain\.com|activeworlds|activeworlds\.com|addthis|addthis\.com|airg\.ca|allnurses\.com|allrecipes\.com|alumniclass|alumniclass\.com|ameba\.jp|ameblo\.jp|americantowns|americantowns\.com|amp\.reddit\.com|ancestry\.com|anobii|anobii\.com|answerbag|answerbag\.com|answers\.yahoo\.com|aolanswers|aolanswers\.com|apps\.facebook\.com|ar\.pinterest\.com|artstation\.com|askubuntu|askubuntu\.com|asmallworld\.com|athlinks|athlinks\.com|away\.vk\.com|awe\.sm|b\.hatena\.ne\.jp|baby-gaga|baby-gaga\.com|babyblog\.ru|badoo|badoo\.com|bebo|bebo\.com|beforeitsnews|beforeitsnews\.com|bharatstudent|bharatstudent\.com|biip\.no|biswap\.org|bit\.ly|blackcareernetwork\.com|blackplanet|blackplanet\.com|blip\.fm|blog\.com|blog\.feedspot\.com|blog\.goo\.ne\.jp|blog\.naver\.com|blog\.yahoo\.co\.jp|blogg\.no|bloggang\.com|blogger|blogger\.com|blogher|blogher\.com|bloglines|bloglines\.com|blogs\.com|blogsome|blogsome\.com|blogspot|blogspot\.com|blogster|blogster\.com|blurtit|blurtit\.com|bookmarks\.yahoo\.co\.jp|bookmarks\.yahoo\.com|br\.pinterest\.com|brightkite|brightkite\.com|brizzly|brizzly\.com|business\.facebook\.com|buzzfeed|buzzfeed\.com|buzznet|buzznet\.com|cafe\.naver\.com|cafemom|cafemom\.com|camospace|camospace\.com|canalblog\.com|care\.com|care2|care2\.com|caringbridge\.org|catster|catster\.com|cbnt\.io|cellufun|cellufun\.com|centerblog\.net|chat\.zalo\.me|chegg\.com|chicagonow|chicagonow\.com|chiebukuro\.yahoo\.co\.jp|classmates|classmates\.com|classquest|classquest\.com|co\.pinterest\.com|cocolog-nifty|cocolog-nifty\.com|copainsdavant\.linternaute\.com|couchsurfing\.org|cozycot|cozycot\.com|cross\.tv|crunchyroll|crunchyroll\.com|cyworld|cyworld\.com|cz\.pinterest\.com|d\.hatena\.ne\.jp|dailystrength\.org|deluxe\.com|deviantart|deviantart\.com|dianping|dianping\.com|digg|digg\.com|diigo|diigo\.com|discover\.hubpages\.com|disqus|disqus\.com|dogster|dogster\.com|dol2day|dol2day\.com|doostang|doostang\.com|dopplr|dopplr\.com|douban|douban\.com|draft\.blogger\.com|draugiem\.lv|drugs-forum|drugs-forum\.com|dzone|dzone\.com|edublogs\.org|elftown|elftown\.com|epicurious\.com|everforo\.com|exblog\.jp|extole|extole\.com|facebook|facebook\.com|faceparty|faceparty\.com|fandom\.com|fanpop|fanpop\.com|fark|fark\.com|fb|fb\.me|fc2|fc2\.com|feedspot|feministing|feministing\.com|filmaffinity|filmaffinity\.com|flickr|flickr\.com|flipboard|flipboard\.com|folkdirect|folkdirect\.com|foodservice|foodservice\.com|forums\.androidcentral\.com|forums\.crackberry\.com|forums\.imore\.com|forums\.nexopia\.com|forums\.webosnation\.com|forums\.wpcentral\.com|fotki|fotki\.com|fotolog|fotolog\.com|foursquare|foursquare\.com|free\.facebook\.com|friendfeed|friendfeed\.com|fruehstueckstreff\.org|fubar|fubar\.com|gaiaonline|gaiaonline\.com|gamerdna|gamerdna\.com|gather\.com|geni\.com|getpocket\.com|glassboard|glassboard\.com|glassdoor|glassdoor\.com|godtube|godtube\.com|goldenline\.pl|goldstar|goldstar\.com|goo\.gl|gooblog|goodreads|goodreads\.com|google\+|googlegroups\.com|googleplus|govloop|govloop\.com|gowalla|gowalla\.com|gree\.jp|groups\.google\.com|gulli\.com|gutefrage\.net|habbo|habbo\.com|hi5|hi5\.com|hootsuite|hootsuite\.com|houzz|houzz\.com|hoverspot|hoverspot\.com|hr\.com|hu\.pinterest\.com|hubculture|hubculture\.com|hubpages\.com|hyves\.net|hyves\.nl|ibibo|ibibo\.com|id\.pinterest\.com|identi\.ca|ig|imageshack\.com|imageshack\.us|imvu|imvu\.com|in\.pinterest\.com|insanejournal|insanejournal\.com|instagram|instagram\.com|instapaper|instapaper\.com|internations\.org|interpals\.net|intherooms|intherooms\.com|irc-galleria\.net|is\.gd|italki|italki\.com|jammerdirect|jammerdirect\.com|jappy\.com|jappy\.de|kaboodle\.com|kakao|kakao\.com|kakaocorp\.com|kaneva|kaneva\.com|kin\.naver\.com|l\.facebook\.com|l\.instagram\.com|l\.messenger\.com|last\.fm|librarything|librarything\.com|lifestream\.aol\.com|line|line\.me|linkedin|linkedin\.com|listal|listal\.com|listography|listography\.com|livedoor\.com|livedoorblog|livejournal|livejournal\.com|lm\.facebook\.com|lnkd\.in|m\.blog\.naver\.com|m\.cafe\.naver\.com|m\.facebook\.com|m\.kin\.naver\.com|m\.vk\.com|m\.yelp\.com|mbga\.jp|medium\.com|meetin\.org|meetup|meetup\.com|meinvz\.net|meneame\.net|menuism\.com|messages\.google\.com|messages\.yahoo\.co\.jp|messenger|messenger\.com|mix\.com|mixi\.jp|mobile\.facebook\.com|mocospace|mocospace\.com|mouthshut|mouthshut\.com|movabletype|movabletype\.com|mubi|mubi\.com|my\.opera\.com|myanimelist\.net|myheritage|myheritage\.com|mylife|mylife\.com|mymodernmet|mymodernmet\.com|myspace|myspace\.com|netvibes|netvibes\.com|news\.ycombinator\.com|newsshowcase|nexopia|ngopost\.org|niconico|nicovideo\.jp|nightlifelink|nightlifelink\.com|ning|ning\.com|nl\.pinterest\.com|odnoklassniki\.ru|odnoklassniki\.ua|okwave\.jp|old\.reddit\.com|oneworldgroup\.org|onstartups|onstartups\.com|opendiary|opendiary\.com|oshiete\.goo\.ne\.jp|out\.reddit\.com|over-blog\.com|overblog\.com|paper\.li|partyflock\.nl|photobucket|photobucket\.com|pinboard|pinboard\.in|pingsta|pingsta\.com|pinterest|pinterest\.at|pinterest\.ca|pinterest\.ch|pinterest\.cl|pinterest\.co\.kr|pinterest\.co\.uk|pinterest\.com|pinterest\.com\.au|pinterest\.com\.mx|pinterest\.de|pinterest\.es|pinterest\.fr|pinterest\.it|pinterest\.jp|pinterest\.nz|pinterest\.ph|pinterest\.pt|pinterest\.ru|pinterest\.se|pixiv\.net|pl\.pinterest\.com|playahead\.se|plurk|plurk\.com|plus\.google\.com|plus\.url\.google\.com|pocket\.co|posterous|posterous\.com|pro\.homeadvisor\.com|pulse\.yahoo\.com|qapacity|qapacity\.com|quechup|quechup\.com|quora|quora\.com|qzone\.qq\.com|ravelry|ravelry\.com|reddit|reddit\.com|redux|redux\.com|renren|renren\.com|researchgate\.net|reunion|reunion\.com|reverbnation|reverbnation\.com|rtl\.de|ryze|ryze\.com|salespider|salespider\.com|scoop\.it|screenrant|screenrant\.com|scribd|scribd\.com|scvngr|scvngr\.com|secondlife|secondlife\.com|serverfault|serverfault\.com|shareit|sharethis|sharethis\.com|shvoong\.com|sites\.google\.com|skype|skyrock|skyrock\.com|slashdot\.org|slideshare\.net|smartnews\.com|snapchat|snapchat\.com|social|sociallife\.com\.br|socialvibe|socialvibe\.com|spaces\.live\.com|spoke|spoke\.com|spruz|spruz\.com|ssense\.com|stackapps|stackapps\.com|stackexchange|stackexchange\.com|stackoverflow|stackoverflow\.com|stardoll\.com|stickam|stickam\.com|studivz\.net|suomi24\.fi|superuser|superuser\.com|sweeva|sweeva\.com|t\.co|t\.me|tagged|tagged\.com|taggedmail|taggedmail\.com|talkbiznow|talkbiznow\.com|taringa\.net|techmeme|techmeme\.com|tencent|tencent\.com|tiktok|tiktok\.com|tinyurl|tinyurl\.com|toolbox|toolbox\.com|touch\.facebook\.com|tr\.pinterest\.com|travellerspoint|travellerspoint\.com|tripadvisor|tripadvisor\.com|trombi|trombi\.com|trustpilot|tudou|tudou\.com|tuenti|tuenti\.com|tumblr|tumblr\.com|tweetdeck|tweetdeck\.com|twitter|twitter\.com|twoo\.com|typepad|typepad\.com|unblog\.fr|urbanspoon\.com|ushareit\.com|ushi\.cn|vampirefreaks|vampirefreaks\.com|vampirerave|vampirerave\.com|vg\.no|video\.ibm\.com|vk\.com|vkontakte\.ru|wakoopa|wakoopa\.com|wattpad|wattpad\.com|web\.facebook\.com|web\.skype\.com|webshots|webshots\.com|wechat|wechat\.com|weebly|weebly\.com|weibo|weibo\.com|wer-weiss-was\.de|weread|weread\.com|whatsapp|whatsapp\.com|wiki\.answers\.com|wikihow\.com|wikitravel\.org|woot\.com|wordpress|wordpress\.com|wordpress\.org|xanga|xanga\.com|xing|xing\.com|yahoo-mbga\.jp|yammer|yammer\.com|yelp|yelp\.co\.uk|yelp\.com|youroom\.in|za\.pinterest\.com|zalo|zoo\.gr|zooppa|zooppa\.com)$", "i").test(v.utmSource) || new RegExp("^(?:social|social-network|social-media|sm|social network|social media)$", "i").test(v.utmMedium)},{"name":"organic-video","test":(v) => new RegExp("^(?:blog\.twitch\.tv|crackle|crackle\.com|curiositystream|curiositystream\.com|d\.tube|dailymotion|dailymotion\.com|dashboard\.twitch\.tv|disneyplus|disneyplus\.com|fast\.wistia\.net|help\.hulu\.com|help\.netflix\.com|hulu|hulu\.com|id\.twitch\.tv|iq\.com|iqiyi|iqiyi\.com|jobs\.netflix\.com|justin\.tv|m\.twitch\.tv|m\.youtube\.com|music\.youtube\.com|netflix|netflix\.com|player\.twitch\.tv|player\.vimeo\.com|ted|ted\.com|twitch|twitch\.tv|utreon|utreon\.com|veoh|veoh\.com|viadeo\.journaldunet\.com|vimeo|vimeo\.com|wistia|wistia\.com|youku|youku\.com|youtube|youtube\.com)$", "i").test(v.utmSource) || new RegExp("^(.*video.*)$", "i").test(v.utmMedium)},{"name":"organic-search","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) || v.utmMedium.toLowerCase() === "organic"},{"name":"referral","test":(v) => new RegExp("^(?:referral|app|link)$", "i").test(v.utmMedium)},{"name":"email","test":(v) => new RegExp("^(?:email|e-mail|e_mail|e mail)$", "i").test(v.utmMedium) || new RegExp("^(?:email|e-mail|e_mail|e mail)$", "i").test(v.utmSource)},{"name":"affiliate","test":(v) => v.utmMedium.toLowerCase() === "affiliate"},{"name":"audio","test":(v) => v.utmMedium.toLowerCase() === "audio"},{"name":"sms","test":(v) => v.utmSource.toLowerCase() === "sms" || v.utmMedium.toLowerCase() === "sms"},{"name":"mobile-push-notification","test":(v) => v.utmSource.toLowerCase() === "firebase" || new RegExp("(?:.*mobile.*|.*notification.*|push$)", "i").test(v.utmMedium)}].find(i=>i.test(t))?.name??"other"}getShopifyAnalyticsId(){const t=this.getCookie("_shopify_y");if(t)return t;try{const e=this.localStorageGet("Shoplift_ClientId");if(e)return e}catch{}return null}legacyGetCookieVisitor(){const t=this.getCookie("SHOPLIFT");return t===null?null:JSON.parse(t,F)}getCookie(t){const e=this.cookie.split("; ").filter(i=>i.split("=").at(0)===t).at(0);return e===void 0?null:e.split("=").slice(1).join("=")}monitorConsentChange(){document.addEventListener("visitorConsentCollected",t=>{(async()=>await this.onConsentChange(t.detail.analyticsAllowed,!0))()}),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>this.loadShopifyConsentApiWithRetry()):this.loadShopifyConsentApiWithRetry()}loadShopifyConsentApiWithRetry(){let t=0;const e=()=>{this.loadShopifyConsentApi()||t++<10&&window.setTimeout(e,100)};e()}loadShopifyConsentApi(){if(window.Shopify){this.log("Loading Shopify features");const t=async()=>{if(!window.Shopify){this.log("Shopify object missing... suddenly?");return}if(window.Shopify.customerPrivacy===void 0){this.log("Shopify CustomerPrivacy api still missing, trying again in 1000ms"),e=window.setTimeout(()=>{(async()=>await t())()},1e3);return}const i=window.Shopify.customerPrivacy.getTrackingConsent();await this.onConsentChange(window.Shopify.customerPrivacy.analyticsProcessingAllowed(),i==="yes")};let e=window.setTimeout(()=>{(async()=>await t())()},5e3);return window.Shopify.loadFeatures([{name:"consent-tracking-api",version:"0.1"}],i=>{(async()=>{if(window.clearTimeout(e),i){this.log("Error loading consent tracking",i);return}await t()})()}),!0}return!1}async onConsentChange(t,e){try{if(this.log("Consent change detected",t,e),this.state.essential.consentApproved=t,this.state.essential.hasConsentInteraction=e,!this.state.essential.consentApproved){this.state.essential.hasConsentInteraction&&(this.state.analytics.queue.length=0),this.saveState();return}this.cookie=document.cookie,this.shopifyAnalyticsId=this.getShopifyAnalyticsId();for(const i of this.state.analytics.queue.filter(s=>s.type===1||s.type===2)){const s=i;s.shopifyAnalyticsId=this.shopifyAnalyticsId}this.saveState(),await this.syncAllEvents()}catch(i){this.log("Error syncing on consent change",i)}}isThemePreview(){return isThemePreview||themeRole!=="main"}isAppProxyPath(){const t=["/apps/","/tools/","/a/"],e=window.location.pathname;return t.some(i=>e.startsWith(i))}clearThemeBar(t,e,i){const s=structuredClone(i);this.log("Looking for theme bar"),this.waitForElement(null,"body").then(r=>this.waitForElement(r,"#preview-bar-iframe, #PBarNextFrameWrapper").then(n=>(this.log("Found theme bar"),e&&(this.log("Removing theme bar"),n.remove()),t?this.makeRequest({url:`${this.eventHost}/api/v0/logs`,method:"post",data:JSON.stringify({...this.debugState(),stateAtEvaluation:s},X)}):Promise.resolve(null)))).catch(r=>console.error(r))}waitForElement(t,e){return new Promise(i=>{const s=document.querySelector(e);if(s){i(s);return}const r=new MutationObserver(n=>{const o=document.querySelector(e);if(o){r.disconnect(),i(o);return}});r.observe(t??document.documentElement,{childList:!0})})}setDebug(t){this.state.essential.debugMode=t,this.saveState()}log(t,...e){let i=0;const s=t.replace(/%[sdoOfF]/g,r=>{if(i>=e.length)return r;const n=e[i++];return r==="%o"||r==="%O"?JSON.stringify(n):String(n)});this.logHistory.push(`[${new Date().toISOString()}][SL] ${s}`),!(!this.state.essential.debugMode&&!this.shopliftDebug)&&console.debug(`[SL] ${t}`,...e)}debugState(){return{state:this.state,storage:{essential:this.loadLocalStorage(this.essentialSessionKey),analytics:this.loadLocalStorage(this.analyticsSessionKey)},params:{shop:this.shop,host:this.host,eventHost:this.eventHost,cssHideClass:this.cssHideClass,testConfigs:this.testConfigs,inactiveTestConfigs:this.inactiveTestConfigs,sendPageView:this.sendPageView,isShopifyMerchantCookie:this.getCookie("is_shopify_merchant"),themeId,url:window.location.href,isThemePreview,themeRole,gaConfig:this.gaConfig},logHistory:this.logHistory}}createViewportObserver(t,e={}){const{threshold:i=this.VIEWPORT_TRACK_THRESHOLD,triggerOnce:s=!0}=e,r=new Set;return new IntersectionObserver(n=>{n.forEach(o=>{if(o.isIntersecting&&!r.has(o.target)){const l=o.target,c=l.getAttribute(this.DATA_SL_TEST_ID);c&&(t(c,l),s&&r.add(l))}})},{threshold:i})}applyChangesWithViewport(t,e,i,s){const r=e.selectorsForViewportTracking??e.selectors,n=o=>{if(this.state.essential.visitorTests.some(h=>h.testId===o)||this.activeViewportObservers.has(o))return;const l=[];if(r.forEach(h=>{t.querySelectorAll(h.cssSelector).forEach(b=>l.push(b))}),l.length===0)return;let c=!1;const d=()=>{c||(c=!0,i(o),p.disconnect(),this.activeViewportObservers.delete(o))},p=this.createViewportObserver(()=>{d()},{triggerOnce:!0,...s});this.activeViewportObservers.set(o,p),this.log(`Created viewport observer for test ${o}, observing ${l.length} elements`),l.forEach(h=>{h.setAttribute(this.DATA_SL_TEST_ID,String(o)),p.observe(h)}),setTimeout(()=>{c||l.forEach(h=>{const u=h.getBoundingClientRect(),b=s?.threshold??this.VIEWPORT_TRACK_THRESHOLD,k=Math.min(u.bottom,window.innerHeight)-Math.max(u.top,0),S=Math.min(u.right,window.innerWidth)-Math.max(u.left,0);u.top<window.innerHeight&&u.bottom>0&&u.left<window.innerWidth&&u.right>0&&k>0&&S>0&&k>=u.height*b&&(this.log(`Price element already visible in viewport for test ${o}:`,h),d())})},100)};e.selectors.length>0&&N(t,e,()=>{}),bt(t,{testId:e.testId,hypothesisId:e.hypothesisId,selectors:r},o=>{n(o)})}applyPriceTestWithMapLookup(t,e,i,s){if(!e.priceData){this.log("No price data for hypothesis '%s'",e.id);return}this.log("Hypothesis '%s' isControl=%s, priceData has %d variants",e.id,e.isControl,e.priceData.variants.length);const r=e.priceData.variants.slice(0,3);for(const[S,P,_]of r)this.log("  Sample priceData: variant=%s, price=%d, compareAt=%d",S,P,_);const n=j(e.priceData),o=new Set;for(const S of i)if(S.priceData)for(const[P]of S.priceData.variants)o.add(P);this.log("Price test Map lookup: %d products in hypothesis, %d total products to track",n.size,o.size);const l=e.priceData,c=new WeakSet;let d=!1;const p="[data-sl-attribute-p], [data-sl-attribute-cap], [data-sl-attribute-discount]",h=S=>{if(c.has(S))return;const P=S.getAttribute("data-sl-attribute-p"),_=S.getAttribute("data-sl-attribute-cap"),C=S.getAttribute("data-sl-attribute-discount"),m=P||_||C;if(!m||!o.has(m))return;c.add(S);const y=n.get(m);y&&(this.log("Applying price for product %s: %d cents (compare at: %d cents)",m,y.priceInCents,y.compareAtPriceInCents),Dt(S,m,y,l),this.log("Applied price to element for product %s",m)),!d&&!this.state.essential.visitorTests.some(w=>w.testId===t)&&(S.setAttribute(this.DATA_SL_TEST_ID,String(t)),this.setupElementViewportTracking(S,t,()=>{d||(d=!0,s(t))}))},u=()=>{const S=document.querySelectorAll(p);this.log("Scanning for price elements, found: %d",S.length),S.forEach(h)},b=new MutationObserver(S=>{for(const P of S)P.type==="childList"&&P.addedNodes.forEach(_=>{if(_.nodeType===Node.ELEMENT_NODE){const C=_;(C.hasAttribute("data-sl-attribute-p")||C.hasAttribute("data-sl-attribute-cap")||C.hasAttribute("data-sl-attribute-discount"))&&h(C),C.querySelectorAll(p).forEach(h)}}),P.type==="attributes"&&P.target instanceof Element&&h(P.target)}),k=document.body||document.documentElement;b.observe(k,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-sl-attribute-p","data-sl-attribute-cap","data-sl-attribute-discount"]}),this.log("MutationObserver started for price elements"),u(),document.readyState==="loading"&&document.addEventListener("DOMContentLoaded",()=>{this.log("DOMContentLoaded - rescanning for price elements"),u()}),setTimeout(()=>{this.log("Delayed rescan for price elements"),u()},100),setTimeout(()=>{this.log("Final rescan for price elements"),u()},500)}setupElementViewportTracking(t,e,i){const s=this.VIEWPORT_TRACK_THRESHOLD,r=t.getBoundingClientRect(),n=Math.min(r.bottom,window.innerHeight)-Math.max(r.top,0),o=Math.min(r.right,window.innerWidth)-Math.max(r.left,0);if(r.top<window.innerHeight&&r.bottom>0&&r.left<window.innerWidth&&r.right>0&&n>0&&o>0&&n>=r.height*s){this.log("Price element already visible for test %s",e),i();return}const c=new IntersectionObserver(d=>{for(const p of d)if(p.isIntersecting&&p.intersectionRatio>=s){this.log("Price element entered viewport for test %s",e),c.disconnect(),i();break}},{threshold:s});c.observe(t)}debug(){const t=this.debugState();console.log(JSON.stringify(t,X,2))}}(async function(){window.shopliftInstance||(window.shopliftInstance=new Wt("respirecosmetic.myshopify.com","https://app.shoplift.ai","https://events.shoplift.ai",true,false,false,{"sendEvents":false,"mode":"gtag"},false,false,1000,[{"id":"019dd448-1553-753c-b435-686218b29699","startAt":"2026-04-28T13:29:47.089029Z","requiresCountry":false,"bayesianRevision":5,"device":"all","status":"active","visitorOption":"new","ignoreTestViewParameterEnforcement":false,"statusHistory":[{"status":"active","createdAt":"2026-04-28T13:29:47.095512Z"}],"hypotheses":[{"visitorCount":3213,"trafficPercentage":0.3406334830774913,"title":"Soin Levres Collagene Booster","domSelectors":[],"id":"019dd43f-483b-79f9-b492-39deac94c71c","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":true,"redirectPath":"/pages/soin-levres-collagene-booster-1"},{"visitorCount":6219,"trafficPercentage":0.6593665169225087,"title":"PDP SLSPF","domSelectors":[],"id":"019dd440-1bc6-7ec2-8a25-3869c58bc05a","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":false,"redirectPath":"/products/soin-levres-collagene-booster"}],"targetAudiences":[],"title":"LP vs PDP Soin Lèvres"},{"id":"019e74f9-1ea1-7d45-8a70-8add8cc82de2","startAt":"2026-05-29T18:22:23.876543Z","requiresCountry":false,"bayesianRevision":5,"device":"all","status":"active","visitorOption":"all","ignoreTestViewParameterEnforcement":false,"statusHistory":[{"status":"active","createdAt":"2026-05-29T18:22:23.982802Z"}],"hypotheses":[{"visitorCount":5100,"trafficPercentage":0.5013226211210324,"title":"Nouveauté - Daily Protect","domSelectors":[],"id":"019e74f8-17c8-7bec-98fd-f3061d66dc30","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":true,"redirectPath":"/pages/nouveaute-daily-protect"},{"visitorCount":5073,"trafficPercentage":0.4986773788789675,"title":"Trio Haute Protection Solaire","domSelectors":[],"id":"019e74f8-f6a2-7f03-84b3-14f382d4f320","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":false,"redirectPath":"/products/trio-haute-protection"}],"targetAudiences":[],"title":"Untitled URL test"},{"id":"019f04b7-ca07-7499-bfbe-8f3e510f2900","startAt":"2026-06-26T16:16:21.486127Z","requiresCountry":false,"bayesianRevision":5,"device":"all","status":"active","visitorOption":"all","ignoreTestViewParameterEnforcement":false,"statusHistory":[{"status":"active","createdAt":"2026-06-26T16:16:21.559694Z"}],"hypotheses":[{"visitorCount":2,"trafficPercentage":0.737179487179487,"title":"Déodorant stick Vanille Tonka","domSelectors":[],"id":"019f04b7-540b-701f-96f1-ca718cee01e4","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":true,"redirectPath":"/products/deodorant-stick-vanille-tonka-1"},{"visitorCount":1,"trafficPercentage":0.26282051282051294,"title":"Kit Découverte Déodorant stick Vanille Tonka","domSelectors":[],"id":"019f04b7-7c0b-7756-9e08-80b8657f5429","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":false,"redirectPath":"/products/kit-decouverte-deodorant-stick-vanille-tonka"}],"targetAudiences":[],"title":"Untitled URL test"}],[{"id":"b34beb01-8e98-4647-bc5c-e6de002d3bc7","bayesianRevision":4,"status":"cancelled","hypotheses":[{"id":"25225939-1d3c-4bc7-bc65-a8fd8ddd401a","type":"theme","themeId":168474706256,"affix":"","isControl":true,"redirectPath":null},{"id":"a65de22d-0a0b-411b-9e46-2cee437ca994","type":"theme","themeId":177900945744,"affix":"","isControl":false,"redirectPath":null}],"ignoreTestViewParameterEnforcement":false}],null),await window.shopliftInstance.init())})();async function Gt(a,t,e,i){const s=Mt({log:i});if(e)return i("[SUB-PREVIEW] A side — no overlay applied; widget renders naturally"),s;const r=a.widget.widgetType,n=t?j(t):null;let o=W(t),l=K(a,o),c=l.discountMap,d=l.maxDiscount;function p(){const f=W(t);f!==o&&(o=f,l=K(a,o),c=l.discountMap,d=l.maxDiscount,i(`[SUB-PREVIEW] scope refreshed currentProductId=${o??"n/a"}, maxDiscount=${d}`))}i(`[SUB-PREVIEW] side=B, currentProductId=${o??"n/a"}, maxDiscount=${d}`);function h(f){if(!t||!n)return null;const v=Y(n),g=v?n.get(v):void 0;return g?{formattedVariantPrice:G(g.priceInCents,t),formattedDiscounted:G(g.priceInCents*(1-f/100),t)}:null}function u(f){const v=J(a,f);if(!v)return d;const g=D(a,"subscriptionInput"),I=g.length?g[0].selector:'input[name="rc_plan"]',A=v.querySelector(`${I}:checked`);if(A){const E=c[A.value];if(E!==void 0)return E}return d}function b(f){const v=D(a,"subscriptionDiscount");for(const g of v)if(g.selector.includes("badge")||g.selector.includes("__badge")){const I=f.querySelector(g.selector);I?.textContent&&!I.textContent.includes(`${d}%`)&&$(I,A=>U(A,d))}}function k(f,v){const g=h(v);if(!g)return;const I=D(a,"subscriptionCompareAt");for(const A of I){const E=f.querySelector(A.selector)||f.querySelector(`[part~="${A.selector}"]`);E?.textContent&&!E.textContent.includes(g.formattedVariantPrice)&&$(E,x=>/\d/.test(x)?g.formattedVariantPrice:x)}}function S(f,v){const g=h(v);if(!g)return;const I=D(a,"subscriptionPrice");for(const A of I){const E=f.querySelector(A.selector)||f.querySelector(`[part~="${A.selector}"]`);E?.textContent&&!E.textContent.includes(g.formattedDiscounted)&&$(E,x=>/\d/.test(x)?g.formattedDiscounted:x)}}function P(f){const v=D(a,"subscriptionInput"),g=v.length?v[0].selector:'input[name="rc_plan"]',I=D(a,"subscriptionPlanDiscount"),A=I.length?I[0].selector:".rc-plans-button__discount";for(const E of Array.from(f.querySelectorAll("label"))){const x=E.querySelector(g),R=E.querySelector(A);if(x&&R?.textContent){const V=c[x.value];if(V!==void 0){const O=R.textContent.match(/[\d.]+%/)?.[0];O&&O!==`${V}%`&&$(R,L=>U(L,V))}}}}function _(f){const v=f.querySelector("select");if(v)for(const g of Array.from(v.options)){const I=c[g.value];if(I!==void 0&&g.textContent){const A=g.textContent.match(/[\d.]+%/)?.[0];A&&A!==`${I}%`&&(g.textContent=U(g.textContent,I))}}}function C(f){const v=D(a,"onetimePrice");if(!v.length||!t||!n)return;const g=Y(n),I=g?n.get(g):void 0;if(!I)return;const A=G(I.priceInCents,t),E=D(a,"onetimeContainer"),x=E.length?E[0].selector:'[part~="rc-purchase-option__onetime"]',R=f.querySelector(x);if(R)for(const V of v){const O=R.querySelector(`[part~="${V.selector}"]`);O?.textContent&&!O.textContent.includes(A)&&$(O,L=>/\d/.test(L)?A:L)}}function m(f,v){const I=D(a,"subscriptionDiscount").filter(A=>A.selector.includes("benefit")||A.selector==="rc-benefits");for(const A of I){const E=f.querySelector(A.selector);if(E?.shadowRoot){for(const x of Array.from(E.shadowRoot.querySelectorAll("li")))if(x.textContent?.includes("Save")){const R=x.textContent.match(/[\d.]+%/)?.[0];R&&R!==`${v}%`&&$(x,V=>U(V,v))}}}}let y=!1;function w(){if(!y){y=!0;try{p();const f=B(a);if(!f)return;const v=u(f);b(f),k(f,v),S(f,v),C(f);const g=J(a,f);g&&(r==="buttons"||r==="radio"?P(g):_(g)),m(f,v)}finally{y=!1}}}const T=dt({data:a,runUpdates:w});return function(){T(),s()}}const jt=Object.freeze(Object.defineProperty({__proto__:null,subscriptionPreviewRender:Gt},Symbol.toStringTag,{value:"Module"}))})(); })("/", { suffix: "deodorants", type: "collection" }, "main", 181964374352, false)</script>
 <script>
 function gtag() {
 dataLayer.push(arguments)
 }
 </script>
 <!-- 2026-06-25T15:09:41.5405807Z -->
<style>.shoplift-hide { opacity: 0 !important; }</style>
<style id="sl-preview-bar-hide">#preview-bar-iframe, #PBarNextFrameWrapper { display: none !important; }</style>
<script type="text/javascript">(function(rootPath, template, themeRole, themeId, isThemePreview){ /* Generated on 2026-06-29T15:03:03.2984985Z */(function(){"use strict";var tt=document.createElement("style");tt.textContent=`#shoplift-preview-control{position:fixed;max-width:332px;height:56px;background-color:#141414;z-index:9999;bottom:20px;display:flex;border-radius:8px;box-shadow:13px 22px 7px #0000,9px 14px 7px #00000003,5px 8px 6px #0000000d,2px 4px 4px #00000017,1px 1px 2px #0000001a,0 0 #0000001a;align-items:center;margin:0 auto;left:16px;right:16px;opacity:0;transform:translateY(20px);visibility:hidden;transition:opacity .4s ease-in-out,transform .4s ease-in-out,visibility 0s .4s}#shoplift-preview-control.visible{opacity:1;transform:translateY(0);visibility:visible;transition:opacity .4s ease-in-out,transform .4s ease-in-out,visibility 0s 0s}#shoplift-preview-control *{font-family:Inter,sans-serif;color:#fff;box-sizing:border-box;font-size:16px}#shoplift-preview-variant-title{font-weight:400;line-height:140%;font-size:16px;text-align:start;letter-spacing:-.16px;flex-grow:1;text-wrap:nowrap;overflow:hidden;text-overflow:ellipsis}#shoplift-preview-variant-selector{position:relative;display:block;padding:6px 0;height:100%;min-width:0;flex:1 1 auto}#shoplift-preview-variant-menu-trigger{border:none;cursor:pointer;width:100%;background-color:transparent;padding:0 16px;border-left:1px solid #333;border-right:1px solid #333;height:100%;display:flex;align-items:center;justify-content:start;gap:8px}#shoplift-preview-variant-selector .menu-variant-label{width:24px;height:24px;border-radius:50%;padding:6px;display:flex;justify-content:center;align-items:center;font-size:12px;font-style:normal;font-weight:600;line-height:100%;letter-spacing:-.12px;flex-shrink:0}#shoplift-preview-variant-selector .preview-variant-menu{position:absolute;bottom:110%;transform:translate3d(0,20px,0);visibility:hidden;pointer-events:none;opacity:0;cursor:pointer;background-color:#141414;border:1px solid #141414;border-radius:6px;width:100%;max-height:156px;overflow-y:auto;box-shadow:0 8px 16px #0003;z-index:1;transition:opacity .3s ease-in-out,transform .3s ease-in-out,visibility 0s .3s}#shoplift-preview-variant-selector .preview-variant-menu.preview-variant-menu__visible{visibility:visible;pointer-events:auto;opacity:100;transform:translateZ(0);transition:opacity .3s ease-in-out,transform .3s ease-in-out,visibility 0s 0s}@media screen and (max-width:400px){#shoplift-preview-variant-selector .preview-variant-menu{position:fixed;left:0;right:0;width:auto;bottom:110%}}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item{padding:12px 16px;display:flex;overflow:hidden}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item .menu-variant-label{margin-right:6px}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item span{overflow:hidden;text-overflow:ellipsis;text-wrap:nowrap;white-space:nowrap;color:#f6f6f6;font-size:14px;font-style:normal;font-weight:500}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:hover{background-color:#545454}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:last-of-type{border-bottom-left-radius:6px;border-bottom-right-radius:6px}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:first-of-type{border-top-left-radius:6px;border-top-right-radius:6px}#shoplift-preview-control div:has(#shoplift-exit-preview-button){padding:0 16px}#shoplift-exit-preview-button{padding:6px 8px;font-weight:500;line-height:75%;border-radius:4px;background-color:transparent;border:none;text-decoration:none}#shoplift-exit-preview-button:hover{cursor:pointer;background-color:#333}#shoplift-preview-subscription-warning{position:relative;display:flex;align-items:center;gap:6px;padding:6px 10px;margin:0 4px;border-left:1px solid #333;cursor:help;outline:none}#shoplift-preview-subscription-warning__icon{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background-color:#f59e0b;color:#141414!important;font-weight:700;font-size:12px!important;line-height:1;flex-shrink:0}#shoplift-preview-subscription-warning__label{font-size:13px!important;font-weight:500;color:#fbbf24!important;text-wrap:nowrap;white-space:nowrap}#shoplift-preview-subscription-warning__tooltip{position:absolute;bottom:calc(100% + 8px);right:0;max-width:320px;width:max-content;padding:10px 12px;border-radius:6px;background-color:#1f1f1f;color:#fff!important;font-size:12px!important;line-height:1.4!important;box-shadow:0 8px 16px #0000004d;z-index:10000;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .2s ease-in-out,transform .2s ease-in-out,visibility 0s .2s;pointer-events:none}#shoplift-preview-subscription-warning__tooltip.shoplift-preview-subscription-warning__tooltip--visible{opacity:1;visibility:visible;transform:translateY(0);transition:opacity .2s ease-in-out,transform .2s ease-in-out,visibility 0s 0s}#shoplift-preview-subscription-warning:focus-visible{box-shadow:inset 0 0 0 2px #f59e0b;border-radius:4px}#shoplift-preview-control:has(#shoplift-preview-subscription-warning){max-width:480px}/*$vite$:1*/`,document.head.appendChild(tt);var ht=" daum[ /]| deusu/| yadirectfetcher|(?:^|[^g])news(?!sapphire)|(?<! (?:channel/|google/))google(?!(app|/google| pixel))|(?<! cu)bots?(?:\\b|_)|(?<!(?: ya| yandex|^job|inapp;) ?)search|(?<!(?:lib))http|(?<![hg]m)score|@[a-z][\\w-]+\\.|\\(\\)|\\.com|\\b\\d{13}\\b|^<|^[\\w \\.\\-\\(?:\\):]+(?:/v?\\d+(?:\\.\\d+)?(?:\\.\\d{1,10})*?)?(?:,|$)|^[^ ]{50,}$|^\\d+\\b|^\\w+/[\\w\\(\\)]*$|^active|^ad muncher|^amaya|^avsdevicesdk/|^biglotron|^bot|^bw/|^clamav[ /]|^client/|^cobweb/|^custom|^ddg[_-]android|^discourse|^dispatch/\\d|^downcast/|^duckduckgo|^facebook|^getright/|^gozilla/|^hobbit|^hotzonu|^hwcdn/|^jeode/|^jetty/|^jigsaw|^microsoft bits|^movabletype|^mozilla/\\d\\.\\d \\(compatible;?\\)$|^mozilla/\\d\\.\\d \\w*$|^navermailapp|^netsurf|^offline|^owler|^postman|^python|^rank|^read|^reed|^rest|^rss|^snapchat|^space bison|^svn|^swcd |^taringa|^thumbor/|^track|^valid|^w3c|^webbandit/|^webcopier|^wget|^whatsapp|^wordpress|^xenu link sleuth|^yahoo|^yandex|^zdm/\\d|^zoom marketplace/|^{{.*}}$|admin|analyzer|archive|ask jeeves/teoma|bit\\.ly/|bluecoat drtr|browsex|burpcollaborator|capture|catch|check|chrome-lighthouse|chromeframe|classifier|clean|cloud|crawl|cypress/|dareboost|datanyze|dejaclick|detect|dmbrowser|download|evc-batch/|feed|firephp|gomezagent|headless|httrack|hubspot marketing grader|hydra|ibisbrowser|images|insight|inspect|iplabel|ips-agent|java(?!;)|library|mail\\.ru/|manager|measure|neustar wpm|node|nutch|offbyone|optimize|pageburst|pagespeed|parser|perl|phantomjs|pingdom|powermarks|preview|proxy|ptst[ /]\\d|reputation|resolver|retriever|rexx;|rigor|rss\\b|scan|scrape|server|sogou|sparkler/|speedcurve|spider|splash|statuscake|synapse|synthetic|tools|torrent|trace|transcoder|url|virtuoso|wappalyzer|watch|webglance|webkit2png|whatcms/|zgrab",ft=/bot|spider|crawl|http|lighthouse/i,z;function gt(){if(z instanceof RegExp)return z;try{z=new RegExp(ht,"i")}catch{z=ft}return z}function mt(a){return!!a&&gt().test(a)}class Q{timestamp;constructor(){this.timestamp=new Date}}class yt extends Q{type;testId;hypothesisId;constructor(t,e,i){super(),this.type=3,this.testId=t,this.hypothesisId=e,this.timestamp=i}}class vt extends Q{type;path;constructor(t){super(),this.type=4,this.path=t}}class wt extends Q{type;cart;constructor(t){super(),this.type=5,this.cart=t}}class et extends Error{isBot;constructor(){super(),this.isBot=!0}}function bt(a,t,e){for(const i of t.selectors){const s=a.querySelectorAll(i.cssSelector);for(let r=0;r<s.length;r++)e(t.testId,t.hypothesisId)}st(a,t,(i,s,r,n,o)=>o(s,r),e)}function N(a,t,e){for(const i of t.selectors)rt(a,t.testId,t.hypothesisId,i,e??(()=>{}));st(a,t,rt,e??(()=>{}))}function it(a){return a.urlPatterns.reduce((t,e)=>{switch(e.operator){case"contains":return t+`.*${e}.*`;case"endsWith":return t+`.*${e}`;case"startsWith":return t+`${e}.*`}},"")}function st(a,t,e,i){new MutationObserver(()=>{for(const r of t.selectors)e(a,t.testId,t.hypothesisId,r,i)}).observe(a.documentElement,{childList:!0,subtree:!0})}function rt(a,t,e,i,s){const r=a.querySelectorAll(i.cssSelector);for(let n=0;n<r.length;n++){let o=r.item(n);if(o instanceof HTMLElement&&o.dataset.shoplift!==""){o.dataset.shoplift="";for(const l of i.actions.sort(kt))o=St(a,i.cssSelector,o,l)}}return r.length>0&&s?(s(t,e),!0):!1}function St(a,t,e,i){switch(i.type){case"innerHtml":e.innerHTML=i.value;break;case"attribute":Ct(e,i.scope,i.value);break;case"css":Tt(a,t,i.value);break;case"js":It(a,e,i);break;case"copy":return Pt(e);case"remove":At(e);break;case"move":Et(e,parseInt(i.value));break}return e}function Ct(a,t,e){a.setAttribute(t,e)}function Tt(a,t,e){const i=a.createElement("style");i.innerHTML=`${t} { ${e} }`,a.getElementsByTagName("head")[0]?.appendChild(i)}function It(a,t,e){Function("document","element",`"use strict"; ${e.value}`)(a,t)}function Pt(a){const t=a.cloneNode(!0);if(!a.parentNode)throw"Can't copy node outside of DOM";return a.parentNode.insertBefore(t,a.nextSibling),t}function At(a){a.remove()}function Et(a,t){if(t===0)return;const e=Array.prototype.slice.call(a.parentElement.children).indexOf(a),i=Math.min(Math.max(e+t,0),a.parentElement.children.length-1);a.parentElement.children.item(i).insertAdjacentElement(t>0?"afterend":"beforebegin",a)}function kt(a,t){return nt(a)-nt(t)}function nt(a){return a.type==="copy"||a.type==="remove"?0:1}var M=(a=>(a[a.Template=0]="Template",a[a.Theme=1]="Theme",a[a.UrlRedirect=2]="UrlRedirect",a[a.Script=3]="Script",a[a.Dom=4]="Dom",a[a.Price=5]="Price",a))(M||{});const xt="data:image/svg+xml,%3csvg%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M9.96001%207.90004C9.86501%207.90004%209.77001%207.86504%209.69501%207.79004L6.43501%204.53004C6.19501%204.29004%205.80501%204.29004%205.56501%204.53004L2.30501%207.79004C2.16001%207.93504%201.92001%207.93504%201.77501%207.79004C1.63001%207.64504%201.63001%207.40504%201.77501%207.26004L5.03501%204.00004C5.56501%203.47004%206.43001%203.47004%206.96501%204.00004L10.225%207.26004C10.37%207.40504%2010.37%207.64504%2010.225%207.79004C10.15%207.86004%2010.055%207.90004%209.96001%207.90004Z'%20fill='white'/%3e%3c/svg%3e",_t="data:image/svg+xml,%3csvg%20width='14'%20height='24'%20viewBox='0%200%2014%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M12.3976%2014.5255C12.2833%2013.8788%2012.0498%2013.3024%2011.6952%2012.7961C11.3416%2012.2898%2010.9209%2011.8353%2010.4353%2011.4317C9.94868%2011.0291%209.43546%2010.6488%208.89565%2010.292C8.48487%2010.049%208.09577%209.78565%207.72637%209.50402C7.35697%209.2224%207.08016%208.89503%206.89694%208.51987C6.71273%208.14471%206.67826%207.69533%206.79055%207.1697C6.86345%206.83216%206.97476%206.54647%207.12351%206.31162C7.27324%206.07778%207.47124%205.89986%207.7175%205.77684C7.96377%205.65483%208.21989%205.59383%208.48389%205.59383C8.88087%205.59383%209.17639%205.7016%209.3734%205.91714C9.56943%206.13268%209.68271%206.42345%209.71424%206.78946C9.74576%207.15547%209.72015%207.55401%209.63839%207.98509C9.55663%208.41617%209.43645%208.84724%209.27687%209.27934L13.5127%208.80149C13.9638%207.52656%2014.1017%206.42447%2013.9264%205.49725C13.751%204.56901%2013.2664%203.85122%2012.4724%203.34491C12.239%203.19648%2011.9779%203.07041%2011.6893%202.96569L12.0026%201.50979L9.86397%200L7.3875%201.50979L7.11169%202.78878C6.65166%202.8874%206.21724%203.01957%205.8114%203.19038C4.85292%203.594%204.06684%204.15115%203.45117%204.86385C2.83452%205.57655%202.42571%206.40108%202.22378%207.33847C2.06616%208.06947%202.04942%208.70796%202.17551%209.25087C2.30061%209.7948%202.52028%2010.2828%202.8355%2010.7139C3.14974%2011.145%203.51816%2011.5344%203.93977%2011.881C4.36039%2012.2288%204.782%2012.5521%205.20164%2012.851C5.68334%2013.1702%206.13844%2013.5169%206.56497%2013.8921C6.99052%2014.2672%207.31954%2014.7125%207.55004%2015.228C7.78055%2015.7445%207.81502%2016.3769%207.65347%2017.1262C7.56482%2017.5389%207.43676%2017.8765%207.27028%2018.1388C7.10381%2018.4011%206.89596%2018.5983%206.64772%2018.7295C6.3985%2018.8606%206.12071%2018.9267%205.8114%2018.9267C5.21641%2018.9267%204.79776%2018.6034%204.62833%2018.1632C4.4589%2017.7229%204.47367%2017.2583%204.60075%2016.5639C4.72782%2015.8705%205.05092%2015.1395%205.37107%2014.3699H1.17665C1.17665%2014.3699%200.207341%2016.1115%200.0310135%2017.6762C-0.0655232%2018.5302%200.0635208%2019.2653%200.41519%2019.8844C0.76686%2020.5036%201.33032%2020.9814%202.10655%2021.319C2.39222%2021.443%202.7104%2021.5447%203.05813%2021.623L2.54589%2024H7.17473L7.7047%2021.5386C8.08493%2021.442%208.43857%2021.3231%208.76562%2021.1787C9.73985%2020.7476%2010.52%2020.1427%2011.1071%2019.3649C11.6932%2018.5871%2012.0873%2017.7291%2012.2892%2016.7917C12.4744%2015.9295%2012.5099%2015.1741%2012.3966%2014.5275L12.3976%2014.5255Z'%20fill='white'/%3e%3c/svg%3e";async function Rt(a){let t=a.replace(/-/g,"+").replace(/_/g,"/");for(;t.length%4;)t+="=";const e=atob(t),i=Uint8Array.from(e,n=>n.charCodeAt(0)),s=new Blob([i]).stream().pipeThrough(new DecompressionStream("gzip")),r=await new Response(s).text();return JSON.parse(r)}function F(a,t){return typeof t=="string"&&/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+(?:Z|[+-]\d+)/.test(t)?new Date(t):t}function X(a,t){return t}function q(a,t=!1,e=!1,i=","){const s=a/100;if(e){const n=Math.round(s).toLocaleString("en-US");return i!==","?n.replace(/,/g,i):n}else{const r=t?",":".",n=s.toFixed(2).split("."),o=parseInt(n[0],10),l=n[1]??"00",c=o.toLocaleString("en-US");return i!==","?`${c.replace(/,/g,i)}${r}${l}`:t?`${c.replace(/,/g,".")}${r}${l}`:`${c}${r}${l}`}}function H(a,t,e,i){const s=t.replace("{{amount}}",q(a,!1,!1)).replace("{{amount_no_decimals}}",q(a,!1,!0)).replace("{{amount_with_comma_separator}}",q(a,!0,!1)).replace("{{amount_no_decimals_with_comma_separator}}",q(a,!0,!0)).replace("{{amount_with_space_separator}}",q(a,!1,!1," ")).replace("{{amount_no_decimals_with_space_separator}}",q(a,!1,!0," ")).replace("{{amount_with_apostrophe_separator}}",q(a,!1,!1,"'")).replace("{{amount_no_decimals_with_apostrophe_separator}}",q(a,!1,!0,"'")).replace("{{amount_with_period_and_space_separator}}",q(a,!1,!1,". ")).replace("{{amount_no_decimals_with_period_and_space_separator}}",q(a,!1,!0,". "));return i?`${s} ${e}`:s}function ot(a){return a.replace(/[^\d.,\s-]/g,"").trim()}function j(a){const t=new Map;for(const[e,i,s]of a.variants)t.set(e,{priceInCents:i,compareAtPriceInCents:s});return t}function Dt(a,t,e,i){const{priceInCents:s,compareAtPriceInCents:r}=e,{moneyFormat:n,currency:o,currencyCodeEnabled:l}=i;if(a.getAttribute("data-sl-attribute-p")===t)a.innerHTML=H(s,n,o,l);else if(a.getAttribute("data-sl-attribute-cap")===t)r<=0||r<=s?a.remove():a.innerHTML=H(r,n,o,l);else if(a.getAttribute("data-sl-attribute-discount")===t&&!(r<=0||r<=s)){const d=Math.round((r-s)/r*100),p=ot(H(r-s,n,o,!1)),h=a.getAttribute("data-sl-format")||"percent";h==="percent"?a.textContent=`-${d}%`:h==="amount"?a.textContent=`-${p}`:h==="both"&&(a.textContent=`-${d}% (-${p})`)}}function Ot(a){const t=[],e={id:"url-pattern",operator:"contains",value:"/"};for(const[i,s,r]of a.variants){t.push({id:`p-${i}`,cssSelector:`[data-sl-attribute-p="${i}"]`,urlPatterns:[e],actions:[{id:`p-action-${i}`,type:"innerHtml",scope:"price",value:H(s,a.moneyFormat,a.currency,a.currencyCodeEnabled)}]});const n=r<=0||r<=s;if(t.push({id:`cap-${i}`,cssSelector:`[data-sl-attribute-cap="${i}"]`,urlPatterns:[e],actions:[{id:`cap-action-${i}`,type:n?"remove":"innerHtml",scope:"compare-at-price",value:n?"":H(r,a.moneyFormat,a.currency,a.currencyCodeEnabled)}]}),!n&&r>s){const o=Math.round((r-s)/r*100),l=ot(H(r-s,a.moneyFormat,a.currency,!1));t.push({id:`d-${i}`,cssSelector:`[data-sl-attribute-discount="${i}"]`,urlPatterns:[e],actions:[{id:`d-action-${i}`,type:"js",scope:null,value:`var format = element.getAttribute('data-sl-format') || 'percent';                    if (format === 'percent') {                      element.textContent = '-${o}%';                    } else if (format === 'amount') {                      element.textContent = '-${l}';                    } else if (format === 'both') {                      element.textContent = '-${o}% (-${l})';                    }`}]})}}return t}const Jt="modulepreload",Yt=function(a){return"/"+a},Zt={},Vt=function(t,e,i){let s=Promise.resolve();function r(n){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=n,window.dispatchEvent(o),!o.defaultPrevented)throw n}return s.then(n=>{for(const o of n||[])o.status==="rejected"&&r(o.reason);return t().catch(r)})};function at(a,t,e){const i=e?a.plans.filter(c=>!c.variantId||c.variantId===e):a.plans,s=[],r=[];for(const c of i)c.direction==="decrease"?(s.push(c.existingShopifyPlanId),r.push(c.createdShopifyPlanId)):(s.push(c.createdShopifyPlanId),r.push(c.existingShopifyPlanId));const n=t?s:r,o=t?r:s;if(e)for(const c of a.plans)for(const d of[c.existingShopifyPlanId,c.createdShopifyPlanId])d&&!n.includes(d)&&!o.includes(d)&&o.push(d);const l={};for(let c=0;c<o.length;c++){const d=o[c],p=n[c];d&&p&&(l[d]=p)}return{showPlanIds:n,hidePlanIds:o,swapMap:l}}function lt(a,t,e){const i=t?a.plans.find(r=>r.variantId===t):void 0;if(i)return i.direction;if(e){const r=a.plans.find(n=>n.productId===e);if(r)return r.direction}return a.plans.find(r=>!r.variantId)?.direction??null}function K(a,t){const e=t?a.plans.filter(r=>!r.productId||r.productId===t):a.plans,i={};for(const r of e)i[r.existingShopifyPlanId]=r.existingDiscountAmount,i[r.createdShopifyPlanId]=r.existingDiscountAmount;const s=Math.max(...Object.values(i),0);return{discountMap:i,maxDiscount:s}}function W(a){const t=document.querySelector('form[action*="/cart/add"] input[name="product-id"]')?.value;if(t)return t;if(a){for(const r of Array.from(document.querySelectorAll("[data-sl-attribute-p]"))){const n=r.getAttribute("data-sl-attribute-p");if(!n)continue;const o=a.variants.find(l=>l[0]===n);if(o?.[3])return o[3]}const s=document.querySelector('form[action*="/cart/add"] input[name="id"]')?.value;if(s){const r=a.variants.find(n=>n[0]===s);if(r?.[3])return r[3]}}const e=window,i=e.ShopifyAnalytics?.meta?.product?.id??e.meta?.product?.id;return i!=null?String(i):null}function D(a,t){return a.widget.selectors[t]??[]}function U(a,t){return a.replace(/[\d.]+%/,`${t}%`)}function $(a,t){const e=document.createTreeWalker(a,NodeFilter.SHOW_TEXT);let i=e.nextNode();for(;i;){if(i.nodeValue!==null){const s=t(i.nodeValue);if(s!==i.nodeValue){i.nodeValue=s;return}}i=e.nextNode()}}function ct(a,t){return a===null?!1:a==="decrease"?!t:t}async function Lt(a){if(a.subscriptionSwapDone)return;const t=a.getActiveAssignment();if(!t)return;const e=a.getHypothesis(t.hypothesisId);if(!e?.subscriptionData)return;a.subscriptionSwapDone=!0;const i=e.subscriptionData,s=e.isControl,r=[...new Set(i.plans.map(d=>d.direction))].join(",");a.log(`[SUB-SWAP] ${s?"A":"B"} side, directions=${r}`);const n=i.plans.some(d=>d.variantId);let o=!1,l=!1;function c(){if(!l){l=!0;try{const d=n?document.querySelector("select[name='id'], input[name='id']")?.value:void 0,{showPlanIds:p,hidePlanIds:h,swapMap:u}=at(i,s,d);a.swapMap=u;const b=D(i,"widgetParent"),k=D(i,"subscriptionPlans"),S=D(i,"subscriptionInput");if(!b.length||!k.length||!S.length)return;const P=document.querySelector(b[0].selector);if(!P?.shadowRoot)return;const _=P.shadowRoot.querySelector(k[0].selector);if(!_?.shadowRoot)return;const C=S[0].selector;let m=null;if(i.widget.widgetType==="buttons"||i.widget.widgetType==="radio"){const y=Array.from(_.shadowRoot.querySelectorAll(C));if(!y.length)return;for(const v of y){const g=v.closest("label");g&&(p.includes(v.value)?g.style.display="":h.includes(v.value)&&(g.style.display="none"))}const w=y.some(v=>p.includes(v.value)&&v.checked),T=y.some(v=>h.includes(v.value)&&v.checked);if((w||T)&&(o=!1),!w&&!o){o=!0;for(const v of y)if(p.includes(v.value)){v.closest("label")?.click(),v.dispatchEvent(new Event("change",{bubbles:!0}));break}}const f=y.find(v=>v.checked);m=f&&p.includes(f.value)?f.value:p[0]??null}else if(i.widget.widgetType==="dropdown"){const y=_.shadowRoot.querySelector("select");if(!y)return;for(const w of Array.from(y.options))h.includes(w.value)&&(w.style.display="none",w.disabled=!0);if(h.includes(y.value)){const w=Array.from(y.options).find(T=>p.includes(T.value));w&&(y.value=w.value,y.dispatchEvent(new Event("change",{bubbles:!0})))}m=p.includes(y.value)?y.value:p[0]??null}if(m){const y=Array.from(document.querySelectorAll('input[name="selling_plan"]'));for(const w of y)w.value!==m&&(w.value=m)}}finally{l=!1}}}if(a.subscriptionHideWrongPlans=c,a.swapMap=at(i,s).swapMap,c(),n){const d=document.querySelector("select[name='id'], input[name='id']");d&&d.addEventListener("change",c)}}function B(a){const t=D(a,"widgetParent");return t.length?document.querySelector(t[0].selector)?.shadowRoot??null:null}function J(a,t){const e=D(a,"subscriptionPlans");return e.length?t.querySelector(e[0].selector)?.shadowRoot??null:null}function Y(a,t){const e=new URLSearchParams(window.location.search).get("variant");if(e)return e;{const i=document.querySelector('form[action*="/cart/add"] input[name="id"]')?.value;if(i)return i}return a.size>0?[...a.keys()][0]:void 0}function G(a,t){return H(a,t.moneyFormat,t.currency,t.currencyCodeEnabled)}function $t({originalFetch:a,swapMap:t,slptValue:e,getSelectedPlanId:i,log:s}){if(window.fetch.__shoplift_intercepted)return s("[SUB-INTERCEPT] already installed — skipping"),()=>{};function r(o){if(i){const l=i();if(l)return t[l]??l}return t[o]??o}const n=function(o,l){if((typeof o=="string"?o:o instanceof URL?o.href:o.url).includes("/cart/add")&&l?.body)try{if(l.body instanceof FormData){const d=l.body.get("selling_plan");d?l.body.set("selling_plan",r(String(d))):(!d||d==="")&&e&&l.body.set("properties[_slpt]",e)}else if(typeof l.body=="string"){const d=JSON.parse(l.body);if(d.items)for(const p of d.items){const h=String(p.selling_plan??"");h?p.selling_plan=r(h):!p.selling_plan&&e&&(p.properties||(p.properties={}),p.properties._slpt=e)}else if(d.id){const p=String(d.selling_plan??"");p?d.selling_plan=r(p):!d.selling_plan&&e&&(d.properties||(d.properties={}),d.properties._slpt=e)}l.body=JSON.stringify(d)}}catch(d){s("[SUB-INTERCEPT] body parse failed; cart-add proceeds with un-swapped plan",d)}return a.call(window,o,l)};return n.__shoplift_intercepted=!0,window.fetch=n,function(){window.fetch===n&&(window.fetch=a)}}function Mt({log:a}){if(window.fetch.__shoplift_intercepted)return a("[SUB-PREVIEW-BLOCK] already installed — skipping"),()=>{};const t=window.fetch,e=function(i,s){const r=typeof i=="string"?i:i instanceof URL?i.href:i.url;return r.includes("/cart/add")?(a("[SUB-PREVIEW-BLOCK] cart-add blocked in preview mode",{url:r}),Promise.resolve(new Response(JSON.stringify({id:0,properties:{},quantity:0,variant_id:0,key:"preview",title:"Preview — cart-add blocked",price:0,original_price:0,line_price:0,original_line_price:0,total_discount:0,discounts:[],preview:!0}),{status:200,headers:{"Content-Type":"application/json"}}))):t.call(window,i,s)};return e.__shoplift_intercepted=!0,window.fetch=e,function(){window.fetch===e&&(window.fetch=t)}}function dt({data:a,runUpdates:t,debounceMs:e=150}){let i=null;function s(){i&&clearTimeout(i),t(),i=setTimeout(t,e)}let r=null;const n=[],o={childList:!0,subtree:!0,characterData:!0,attributes:!0};function l(h){for(const u of n)u.disconnect();n.length=0;for(const u of Array.from(h.querySelectorAll("*")))if(u.shadowRoot){const b=new MutationObserver(s);b.observe(u.shadowRoot,o),n.push(b)}}function c(){const h=B(a);return h?(r&&r.disconnect(),l(h),r=new MutationObserver(u=>{u.some(b=>b.type==="childList"&&b.addedNodes.length>0)&&l(h),s()}),r.observe(h,o),!0):!1}const d=document.body||document.documentElement,p=new MutationObserver(()=>{c()&&s()});return p.observe(d,{childList:!0,subtree:!0}),c()&&s(),t(),function(){i&&(clearTimeout(i),i=null),p.disconnect(),r&&(r.disconnect(),r=null);for(const u of n)u.disconnect();n.length=0}}async function qt(a){if(a.subscriptionPriceDone)return;const t=a.getActiveAssignment(),e=t?a.getHypothesis(t.hypothesisId):void 0,i=e?.subscriptionData?null:a.findActiveSubscriptionTestControl(),s=e?.subscriptionData?e:i?.hypothesis;if(!s?.subscriptionData)return;const r=e?.subscriptionData?t.testId:i.testId;a.subscriptionPriceDone=!0;const n=s.subscriptionData,o=s.isControl,l=s.priceData,c=n.widget.widgetType;let d=W(l),p=K(n,d),h=p.discountMap,u=p.maxDiscount;function b(){const g=W(l);g!==d&&(d=g,p=K(n,d),h=p.discountMap,u=p.maxDiscount,a.log(`[SUB-PRICE] scope refreshed side=${o?"A":"B"}, currentProductId=${d??"n/a"}, maxDiscount=${u}`))}a.log(`[SUB-PRICE] side=${o?"A":"B"}, currentProductId=${d??"n/a"}, maxDiscount=${u}`),a.updatePriceTestHiddenInputs(r,o?"control":"variant",!1);function k(){if(!l)return null;const g=j(l),I=Y(g),A=lt(n,I,d);if(!ct(A,o))return null;const E=I?g.get(I):void 0;return E?{formattedVariantPrice:G(E.priceInCents,l),formattedDiscounted:G(E.priceInCents*(1-u/100),l)}:null}$t({originalFetch:a.fetch,swapMap:a.swapMap??{},slptValue:a.slptValue??void 0,log:a.log,getSelectedPlanId:()=>{const g=B(n);if(!g)return null;const I=J(n,g);if(!I)return null;const A=D(n,"subscriptionInput"),E=A.length?A[0].selector:'input[name="rc_plan"]';return I.querySelector(`${E}:checked`)?.value??null}});function S(g){const I=D(n,"subscriptionDiscount");for(const A of I)if(A.selector.includes("badge")||A.selector.includes("__badge")){const E=g.querySelector(A.selector);E?.textContent&&!E.textContent.includes(`${u}%`)&&$(E,x=>U(x,u))}}function P(g){const I=k();if(!I)return;const A=D(n,"subscriptionCompareAt");for(const E of A){const x=g.querySelector(E.selector)||g.querySelector(`[part~="${E.selector}"]`);x?.textContent&&!x.textContent.includes(I.formattedVariantPrice)&&$(x,R=>/\d/.test(R)?I.formattedVariantPrice:R)}}function _(g,I){const A=D(n,"subscriptionCompareAt"),E=I===0?"none":"";for(const x of A){const R=g.querySelector(x.selector)||g.querySelector(`[part~="${x.selector}"]`);R&&(E==="none"?R.style.display!=="none"&&(R.style.display="none"):R.style.display==="none"&&(R.style.display=""))}}function C(g){const I=D(n,"subscriptionInput"),A=I.length?I[0].selector:'input[name="rc_plan"]',E=D(n,"subscriptionPlanDiscount"),x=E.length?E[0].selector:".rc-plans-button__discount";for(const R of Array.from(g.querySelectorAll("label"))){const V=R.querySelector(A),O=R.querySelector(x);if(V&&O){const L=h[V.value];if(L!==void 0){if(L===0)O.style.display!=="none"&&(O.style.display="none");else if(O.style.display==="none"&&(O.style.display=""),O.textContent){const Z=O.textContent.match(/[\d.]+%/)?.[0];Z&&Z!==`${L}%`&&$(O,Kt=>U(Kt,L))}}}}}function m(g){const I=g.querySelector("select");if(I)for(const A of Array.from(I.options)){const E=h[A.value];if(E!==void 0&&A.textContent){const x=A.textContent.match(/[\d.]+%/)?.[0];x&&x!==`${E}%`&&(A.textContent=U(A.textContent,E))}}}function y(g,I){const E=D(n,"subscriptionDiscount").filter(x=>x.selector.includes("benefit")||x.selector==="rc-benefits");for(const x of E){const R=g.querySelector(x.selector);if(R?.shadowRoot){for(const V of Array.from(R.shadowRoot.querySelectorAll("li")))if(V.textContent?.includes("Save")){const O=V;if(I===0)O.style.display!=="none"&&(O.style.display="none");else{O.style.display==="none"&&(O.style.display="");const L=V.textContent.match(/[\d.]+%/)?.[0];L&&L!==`${I}%`&&$(V,Z=>U(Z,I))}}}}}let w=!1;function T(){if(!w){w=!0;try{if(b(),d!==null&&Object.keys(h).length===0)return;const g=B(n);if(!g)return;S(g),l&&P(g);const I=J(n,g);let A=u;if(I){const E=D(n,"subscriptionInput"),x=E.length?E[0].selector:'input[name="rc_plan"]',R=I.querySelector(`${x}:checked`);if(R){const V=h[R.value];V!==void 0&&(A=V)}c==="buttons"||c==="radio"?C(I):m(I)}_(g,A),y(g,A)}finally{w=!1}}}function f(){const g=k();if(!g)return;const I=B(n);if(!I)return;const A=D(n,"onetimeToggle"),E=A.length?A[0].selector:'input[value="onetime"]';if(!I.querySelector(E)?.checked)return;const R=D(n,"subscriptionPrice");for(const V of R){const O=I.querySelector(V.selector)||I.querySelector(`[part~="${V.selector}"]`);O?.textContent&&!O.textContent.includes(g.formattedDiscounted)&&$(O,L=>/\d/.test(L)?g.formattedDiscounted:L)}}function v(){a.subscriptionHideWrongPlans&&a.subscriptionHideWrongPlans(),T(),a.subscriptionUpdateOneTime&&a.subscriptionUpdateOneTime(),f()}dt({data:n,runUpdates:v})}async function Ht(a){if(a.subscriptionOneTimeDone)return;const t=a.getActiveAssignment(),e=t?a.getHypothesis(t.hypothesisId):void 0,i=!!(e?.subscriptionData&&e.priceData),s=i?null:a.findActiveSubscriptionTestControl(),r=i?e:s?.hypothesis;if(!r?.subscriptionData||!r.priceData)return;const n=i?t.testId:s.testId;a.subscriptionOneTimeDone=!0;const o=r.subscriptionData,l=r.priceData,c=j(l),d=r.isControl,p=d?"control":"variant";a.slptValue=`${n}:${p}:f`,a.updatePriceTestHiddenInputs(n,p,!1);function h(){const u=B(o);if(!u)return;const b=Y(c);if(!b)return;const k=W(l),S=lt(o,b,k);if(!ct(S,d))return;const P=c.get(b);if(!P)return;const _=H(P.priceInCents,l.moneyFormat,l.currency,l.currencyCodeEnabled),C=D(o,"onetimePrice");if(!C.length)return;const m=D(o,"onetimeContainer"),y=m.length?m[0].selector:'[part~="rc-purchase-option__onetime"]',T=u.querySelector(y)??u;for(const f of C){let v=null;try{v=T.querySelector(f.selector)}catch{v=null}v??=T.querySelector(`[part~="${f.selector}"]`),v&&v.textContent&&!v.textContent.includes(_)&&$(v,g=>/\d/.test(g)?_:g)}}a.subscriptionUpdateOneTime=h,h()}async function Ut(a,t){const{subscriptionPreviewRender:e}=await Vt(async()=>{const{subscriptionPreviewRender:i}=await Promise.resolve().then(()=>jt);return{subscriptionPreviewRender:i}},void 0);return e(a.subscriptionData,a.priceData,a.isControl,t)}function Nt(a,t){const e=a.widget.selectors.widgetParent??[],i=a.widget.selectors.subscriptionPlans??[],s=a.widget.selectors.subscriptionInput??[];if(!e.length||!i.length||!s.length){t("[SUB-GLOBAL-HIDE] Missing required selectors — skipping");return}const r=e[0].selector,n=i[0].selector,o=s[0].selector;let l=!1,c=null,d=!1;function p(){if(!d){d=!0;try{h()}finally{d=!1}}}function h(){const P=document.querySelector(r);if(!P?.shadowRoot)return;const _=P.shadowRoot.querySelector(n);if(!_?.shadowRoot)return;_.shadowRoot!==c&&(c=_.shadowRoot,l=!1);let C=0;if(a.widget.widgetType==="buttons"||a.widget.widgetType==="radio"){const m=Array.from(_.shadowRoot.querySelectorAll(o));for(const f of m)if(a.planIds.includes(f.value)){f.disabled||(f.disabled=!0);const v=f.closest("label");v&&v.style.display!=="none"&&(v.style.display="none",C++)}const y=m.filter(f=>!a.planIds.includes(f.value));if(!y.some(f=>f.checked)&&!l&&y.length>0){l=!0;const f=y[0];f.closest("label")?.click(),f.dispatchEvent(new Event("change",{bubbles:!0})),t(`[SUB-GLOBAL-HIDE] Preselected first visible plan input=${f.value}`)}const T=y.find(f=>f.checked)??y[0];if(T){const f=Array.from(document.querySelectorAll('input[name="selling_plan"]'));for(const v of f)v.value!==T.value&&(v.value=T.value,t(`[SUB-GLOBAL-HIDE] Mirrored plan id ${T.value} to form selling_plan input`))}}else if(a.widget.widgetType==="dropdown"){const m=_.shadowRoot.querySelector("select");if(!m)return;for(const T of Array.from(m.options))a.planIds.includes(T.value)&&(T.style.display!=="none"&&(T.style.display="none"),T.disabled||(T.disabled=!0),C++);const y=Array.from(m.options).filter(T=>!a.planIds.includes(T.value)),w=y.some(T=>T.value===m.value);y.length>0&&!w&&!l&&(l=!0,m.value=y[0].value,m.dispatchEvent(new Event("change",{bubbles:!0})),t(`[SUB-GLOBAL-HIDE] Preselected first visible option=${y[0].value}`))}C>0&&t(`[SUB-GLOBAL-HIDE] Hidden ${C} B-side plan buttons`)}const u={childList:!0,subtree:!0,characterData:!0};let b=null;function k(P){b?.disconnect(),b=new MutationObserver(()=>p()),b.observe(P,u)}function S(){const P=document.querySelector(r);if(!P?.shadowRoot)return!1;p(),new MutationObserver(()=>{p();const m=P.shadowRoot.querySelector(n);m?.shadowRoot&&k(m.shadowRoot)}).observe(P.shadowRoot,u);const C=P.shadowRoot.querySelector(n);return C?.shadowRoot&&k(C.shadowRoot),!0}if(!S()){t("[SUB-GLOBAL-HIDE] Widget not in DOM yet — waiting via MutationObserver");const P=new MutationObserver(()=>{S()&&P.disconnect()});P.observe(document.body??document.documentElement,{childList:!0,subtree:!0})}}const ut="Limited preview",Ft="Add-to-cart and checkout prices won't reflect this test until it launches — test selling plans are not created in your subscription app until after a test is launched.",Bt=5e3;function zt(){const a=document.createElement("div");a.id="shoplift-preview-subscription-warning";const t=document.createElement("span");t.id="shoplift-preview-subscription-warning__icon",t.setAttribute("aria-hidden","true"),t.textContent="!";const e=document.createElement("span");e.id="shoplift-preview-subscription-warning__label",e.textContent=ut;const i=document.createElement("div");i.id="shoplift-preview-subscription-warning__tooltip",i.setAttribute("role","tooltip"),i.textContent=Ft,a.appendChild(t),a.appendChild(e),a.appendChild(i),a.setAttribute("tabindex","0"),a.setAttribute("aria-describedby",i.id),a.setAttribute("aria-label",ut);let s=null;function r(){s!==null&&(clearTimeout(s),s=null)}function n(){i.classList.add("shoplift-preview-subscription-warning__tooltip--visible")}function o(){i.classList.remove("shoplift-preview-subscription-warning__tooltip--visible")}function l(){n(),r(),s=setTimeout(()=>{o(),s=null},Bt)}function c(){r(),n()}function d(){s===null&&o()}a.addEventListener("mouseenter",c),a.addEventListener("mouseleave",d),a.addEventListener("focus",c),a.addEventListener("blur",d);function p(u){try{const b=u.target;if(!(b instanceof Element))return;(b.closest('form[action*="/cart/add"] button[type="submit"], form[action*="/cart/add"] input[type="submit"]')!==null||b.closest('[name="add"], button[name="add"], [data-add-to-cart], button[data-add-to-cart]')!==null)&&l()}catch{}}document.addEventListener("click",p,!0);function h(){r(),document.removeEventListener("click",p,!0),a.removeEventListener("mouseenter",c),a.removeEventListener("mouseleave",d),a.removeEventListener("focus",c),a.removeEventListener("blur",d),a.remove()}return{root:a,tooltip:i,cleanup:h}}let pt=!1;class Wt{constructor(t,e,i,s,r,n,o,l,c,d,p,h,u){this.shop=t,this.host=e,this.eventHost=i,this.disableReferrerOverride=l,this.logHistory=[],this.legacySessionKey=`SHOPLIFT_SESSION_${this.shop}`,this.cssHideClass=s?"shoplift-hide":"",this.testConfigs=p.map(k=>({...k,startAt:new Date(k.startAt),statusHistory:k.statusHistory.map(S=>({...S,createdAt:new Date(S.createdAt)}))})),this.inactiveTestConfigs=h,this.hiddenSubscriptionPlans=u,this.sendPageView=!!r,this.shopliftDebug=n===!0,this.telemetryEnabled=c===!0,this.gaConfig=o!=={"sendEvents":false,"mode":"gtag"}?o:{sendEvents:!1},this.fetch=window.fetch.bind(window),this.localStorageSet=window.localStorage.setItem.bind(window.localStorage),this.localStorageGet=window.localStorage.getItem.bind(window.localStorage);const b=this.getDeviceType();this.device=b!=="tablet"?b:"mobile",this.state=this.loadState(),this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.testsFilteredByAudience=p.filter(k=>k.status=="active"),this.getCountryTimeout=d===1000?1e3:d,this.log("State Loaded",JSON.stringify(this.state))}DATA_SL_ATTRIBUTE_P="data-sl-attribute-p";DATA_SL_TEST_ID="data-sl-test-id";VIEWPORT_TRACK_THRESHOLD=.5;temporarySessionKey="Shoplift_Session";essentialSessionKey="Shoplift_Essential";analyticsSessionKey="Shoplift_Analytics";priceSelectorsSessionKey="Shoplift_PriceSelectors_v2";legacySessionKey;cssHideClass;testConfigs;inactiveTestConfigs;hiddenSubscriptionPlans;testsFilteredByAudience;sendPageView;shopliftDebug;gaConfig;telemetryEnabled;getCountryTimeout;state;subscriptionPreviewWarningCleanup=null;shopifyAnalyticsId;cookie=document.cookie;isSyncing=!1;isSyncingGA=!1;fetch;localStorageSet;localStorageGet;sessionStorageSet=window.sessionStorage.setItem.bind(window.sessionStorage);sessionStorageGet=window.sessionStorage.getItem.bind(window.sessionStorage);urlParams=new URLSearchParams(window.location.search);device;logHistory;activeViewportObservers=new Map;clientIdRetryCount=0;deriveCategoryFromExistingTests(){if(!this.state.temporary.testCategory&&this.state.essential.visitorTests.length>0){const t=this.state.essential.visitorTests.some(e=>{if(!e.hypothesisId)return!1;const i=this.getHypothesis(e.hypothesisId);return i&&["theme","basicScript","price"].includes(i.type)});this.state.temporary.testCategory=t?"global":"conditional",this.persistTemporaryState(),this.log("Derived test category from existing visitorTests: %s",this.state.temporary.testCategory)}}async init(){try{if(this.log("Shoplift script initializing"),window.Shopify&&window.Shopify.designMode){this.log("Skipping script for design mode");return}if(window.location.href.includes("slScreenshot=true")){this.log("Skipping script for screenshot");return}if(window.location.hostname.endsWith(".edgemesh.com")){this.log("Skipping script for preview");return}if(window.location.href.includes("isShopliftMerchant")){const s=this.urlParams.get("isShopliftMerchant")==="true";this.log("Setting merchant session to %s",s),this.state.temporary.isMerchant=s,this.persistTemporaryState()}if(this.state.temporary.isMerchant){this.log("Setting up preview for merchant"),typeof window.shoplift!="object"&&this.setShopliftStub(),this.state.temporary.previewConfig||this.hidePage(),await this.initPreview(),document.querySelector("#sl-preview-bar-hide")?.remove();return}if(this.state.temporary.previewConfig=void 0,mt(navigator.userAgent))return;const t=this.state.essential.visitorTests.filter(s=>s.hypothesisId&&+s.createdAt>Date.now()-6e4);if(t.length===0)this.sendDiagnosticTelemetry("page-landed",null);else for(const s of t)this.sendDiagnosticTelemetry("page-landed",s.testId,{hypothesisId:s.hypothesisId,isControl:s.assignedTo==="control",testType:s.testType??"unknown"});if(navigator.userAgent.includes("Chrome/118")){this.log("Random: %o",[Math.random(),Math.random(),Math.random()]);const s=await this.makeRequest({url:`${this.eventHost}/api/v0/events/ip`,method:"get"}).then(r=>r?.json());this.log(`IP: ${s}`),this.makeRequest({url:`${this.eventHost}/api/v0/logs`,method:"post",data:JSON.stringify(this.debugState(),X)}).catch()}if(this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.monitorConsentChange(),this.checkForThemePreview())return;if(!this.disableReferrerOverride&&this.state.temporary.originalReferrer!=null){this.log(`Overriding referrer from '${document.referrer}' to '${this.state.temporary.originalReferrer}'`);const s=this.state.temporary.originalReferrer;delete this.state.temporary.originalReferrer,this.persistTemporaryState(),Object.defineProperty(document,"referrer",{get:()=>s,enumerable:!0,configurable:!0})}if(await this.refreshVisitor(this.shopifyAnalyticsId),await this.handleVisitorTest()){this.log("Redirecting for visitor test");return}this.setShoplift(),this.showPage(),this.ensureCartAttributesForExistingPriceTests(!1);const i=this.state.essential.visitorTests.some(s=>(s.hypothesisId?this.getHypothesis(s.hypothesisId):void 0)?.subscriptionData!=null)||Object.values(this.state.temporary.testReservations??{}).some(s=>this.getHypothesis(s.hypothesisId)?.subscriptionData!=null);this.hiddenSubscriptionPlans&&!i&&(this.log(`[SUB-GLOBAL] Visitor not in subscription test — hiding ${this.hiddenSubscriptionPlans.planIds.length} B-side plans`),Nt(this.hiddenSubscriptionPlans,s=>this.log(s))),await this.subscriptionSwap(),await this.subscriptionOneTimePrice(),await this.subscriptionPriceChange(),await this.finalize(),console.log("SHOPLIFT SCRIPT INITIALIZED!")}catch(t){if(t instanceof et)return;throw t}finally{typeof window.shoplift!="object"&&this.setShopliftStub()}}getVariantColor(t){switch(t){case"a":return{text:"#141414",bg:"#E2E2E2"};case"b":return{text:"rgba(255, 255, 255, 1)",bg:"rgba(37, 99, 235, 1)"}}}getDefaultVariantTitle(t){return t.title?t.title:t.type==="price"?t.isControl?"Original prices":"Variant prices":t.isControl?"Original":"Untitled variant "+t.label.toUpperCase()}async initPreview(){const t=this.urlParams.get("previewConfig");if(t){this.state.temporary.previewConfig=void 0,this.log("Setting up the preview"),this.log("Found preview config, writing to temporary state");const e=await Rt(t);if(this.state.temporary.previewConfig=e,this.state.temporary.previewConfig.testTypeCategory===M.Price){this.hidePage(!0);const s=this.state.temporary.previewConfig;let r=`${this.host}/api/dom-selectors/${s.storeId}/${s.testId}/${s.isDraft||!1}`;s.shopifyProductId&&(r+=`?productId=${s.shopifyProductId}`);const n=await this.makeJsonRequest({method:"get",url:r}).catch(o=>(this.log("Error getting domSelectors",o),null));if(s.variants.forEach(o=>o.domSelectors=n[o.id]?.domSelectors),s.isDraft){const o=`${this.host}/api/dom-selectors/${s.storeId}/${s.testId}/subscription-preview`,l=await this.makeJsonRequest({method:"get",url:o}).catch(c=>(this.log("No subscription preview data for draft (test may not have a subscription widget)",c),null));l?.subscriptionData&&s.variants.forEach(c=>{c.subscriptionData=l.subscriptionData,c.priceData=l.priceData})}}this.persistTemporaryState();const i=new URL(window.location.toString());i.searchParams.delete("previewConfig"),this.queueRedirect(i)}else if(this.state.temporary.previewConfig){this.showPage();const e=this.state.temporary.previewConfig;if(e.testTypeCategory===M.Template&&this.handleTemplatePreview(e)&&this.initPreviewControls(e),e.testTypeCategory===M.UrlRedirect&&this.handleUrlPreview(e)&&this.initPreviewControls(e),e.testTypeCategory===M.Script&&this.handleScriptPreview(e)&&this.initPreviewControls(e),e.testTypeCategory===M.Price){const i=await this.handlePricePreview(e);e.isDraft?await this.handleSubscriptionPricePreview(e):await this.handleSubscriptionLivePreview(e),i&&this.initPreviewControls(e)}}}initPreviewControls(t){document.addEventListener("DOMContentLoaded",()=>{const e=t.variants.find(b=>b.id===t.currentVariant),i=e?.label||"a",s=t.variants,r=document.createElement("div");r.id="shoplift-preview-control";const n=document.createElement("div"),o=document.createElement("img");o.src=_t,o.height=24,o.width=14,n.style.padding="0 16px",n.style.lineHeight="100%",n.appendChild(o),r.appendChild(n);const l=document.createElement("div");l.id="shoplift-preview-variant-selector";const c=document.createElement("button");c.id="shoplift-preview-variant-menu-trigger";const d=document.createElement("div");d.className="menu-variant-label",d.style.backgroundColor=this.getVariantColor(i).bg,d.style.color=this.getVariantColor(i).text,d.innerText=i.toUpperCase(),c.appendChild(d);const p=document.createElement("span");if(p.id="shoplift-preview-variant-title",p.innerText=e?this.getDefaultVariantTitle(e):"Untitled variant "+i.toUpperCase(),c.appendChild(p),s.length>1){const b=document.createElement("img");b.src=xt,b.width=12,b.height=12,b.style.height="12px",b.style.width="12px",c.appendChild(b);const k=document.createElement("div");k.className="preview-variant-menu";for(const S of t.variants.filter(P=>P.id!==t.currentVariant)){const P=document.createElement("div");P.className="preview-variant-menu--item";const _=document.createElement("div");_.className="menu-variant-label",_.style.backgroundColor=this.getVariantColor(S.label).bg,_.style.color=this.getVariantColor(S.label).text,_.style.flexShrink="0",_.innerText=S.label.toUpperCase(),P.appendChild(_);const C=document.createElement("span");C.innerText=this.getDefaultVariantTitle(S),P.appendChild(C),P.addEventListener("click",()=>{this.pickVariant(S.id)}),k.appendChild(P)}l.appendChild(k),c.addEventListener("click",()=>{k.className!=="preview-variant-menu preview-variant-menu__visible"?k.classList.add("preview-variant-menu__visible"):k.classList.remove("preview-variant-menu__visible")}),document.addEventListener("click",S=>{S.target instanceof Element&&!c.contains(S.target)&&k.className==="preview-variant-menu preview-variant-menu__visible"&&k.classList.remove("preview-variant-menu__visible")})}else c.style.pointerEvents="none",d.style.margin="0";if(l.appendChild(c),r.appendChild(l),t.hasSubscription){this.subscriptionPreviewWarningCleanup?.();const b=zt();r.appendChild(b.root),this.subscriptionPreviewWarningCleanup=b.cleanup}const h=document.createElement("div"),u=document.createElement("button");u.id="shoplift-exit-preview-button",u.innerText="Exit",h.appendChild(u),u.addEventListener("click",()=>{this.exitPreview()}),r.appendChild(h),document.body.appendChild(r),requestAnimationFrame(()=>{r.classList.add("visible")})}),this.ensureCartAttributesForExistingPriceTests(!0)}pickVariant(t){if(this.state.temporary.previewConfig){const e=this.state.temporary.previewConfig,i=new URL(window.location.toString());if(e.testTypeCategory===M.UrlRedirect){const s=e.variants.find(r=>r.id===e.currentVariant)?.redirectUrl;if(i.pathname===s){const r=e.variants.find(n=>n.id===t)?.redirectUrl;r&&(i.pathname=r)}}if(e.testTypeCategory===M.Template){const s=e.variants.find(r=>r.id===e.currentVariant)?.pathName;if(s&&i.pathname===s){const r=e.variants.find(n=>n.id===t)?.pathName;r&&r!==s&&(i.pathname=r)}}e.currentVariant=t,this.persistTemporaryState(),this.queueRedirect(i)}}exitPreview(){const t=new URL(window.location.toString());if(this.state.temporary.previewConfig?.testTypeCategory===M.Template&&t.searchParams.delete("view"),this.state.temporary.previewConfig?.testTypeCategory===M.Script&&t.searchParams.delete("slVariant"),this.state.temporary.previewConfig?.testTypeCategory===M.UrlRedirect){const i=this.state.temporary.previewConfig.variants.filter(r=>!r.isControl&&r.redirectUrl!==null).map(r=>r.redirectUrl),s=this.state.temporary.previewConfig.variants.find(r=>r.label==="a")?.redirectUrl;i.includes(t.pathname)&&s&&(t.pathname=s)}this.state.temporary.isMerchant=!1,t.searchParams.delete("isShopliftMerchant"),this.state.temporary.previewConfig=void 0,this.persistTemporaryState(),this.subscriptionPreviewWarningCleanup?.(),this.subscriptionPreviewWarningCleanup=null,this.hidePage(),this.queueRedirect(t)}handleTemplatePreview(t){const e=t.currentVariant,i=t.variants.find(l=>l.id===e);if(!i)return!1;const s=t.variants.find(l=>l.isControl);if(!s)return!1;this.log("Setting up template preview for type",s.type);const r=new URL(window.location.toString()),n=r.searchParams.get("view"),o=i.type===s.type;return!o&&!i.isControl&&template.suffix===s.affix&&this.typeFromTemplate()===s.type&&i.pathName!==null?(this.log("Hit control template type, redirecting to the variant url"),this.hidePage(),r.pathname=i.pathName,this.queueRedirect(r),!0):(!i.isControl&&this.typeFromTemplate()==i.type&&template.suffix===s.affix&&o&&n!==(i.affix||"__DEFAULT__")&&(this.log("Template type and affix match control, updating the view param"),r.searchParams.delete("view"),this.log("Setting the new viewParam to",i.affix||"__DEFAULT__"),this.hidePage(),r.searchParams.set("view",i.affix||"__DEFAULT__"),this.queueRedirect(r)),n!==null&&n!==(i.affix||"__DEFAULT__")&&(r.searchParams.delete("view"),this.hidePage(),this.queueRedirect(r)),!0)}handleUrlPreview(t){const e=t.currentVariant,i=t.variants.find(n=>n.id===e),s=t.variants.find(n=>n.isControl)?.redirectUrl;if(!i)return!1;this.log("Setting up URL redirect preview");const r=new URL(window.location.toString());return r.pathname===s&&!i.isControl&&i.redirectUrl!==null&&(this.log("Url matches control, redirecting"),this.hidePage(),r.pathname=i.redirectUrl,this.queueRedirect(r)),!0}handleScriptPreview(t){const e=t.currentVariant,i=t.variants.find(n=>n.id===e);if(!i)return!1;this.log("Setting up script preview");const s=new URL(window.location.toString());return s.searchParams.get("slVariant")!==i.id&&(this.log("current id doesn't match the variant, redirecting"),s.searchParams.delete("slVariant"),this.log("Setting the new slVariantParam"),this.hidePage(),s.searchParams.set("slVariant",i.id),this.queueRedirect(s)),!0}async handlePricePreview(t){const e=t.currentVariant,i=t.variants.find(s=>s.id===e);return i?(this.log("Setting up price preview"),i.domSelectors&&i.domSelectors.length>0&&(N(document,{testId:t.testId,hypothesisId:i.id,selectors:i.domSelectors}),this.ensureCartAttributesForExistingPriceTests(!0)),!0):!1}async handleSubscriptionPricePreview(t){const e=t.variants.find(i=>i.id===t.currentVariant);e?.subscriptionData&&(this.log("Setting up subscription price preview"),await Ut({id:e.id,isControl:e.isControl,subscriptionData:e.subscriptionData,priceData:e.priceData},(i,...s)=>this.log(i,...s)))}async handleSubscriptionLivePreview(t){this.testConfigs.find(s=>s.id===t.testId)?.hypotheses.find(s=>s.id===t.currentVariant)?.subscriptionData&&(this.log("Setting up subscription live preview"),this.subscriptionSwapDone=!1,this.subscriptionOneTimeDone=!1,this.subscriptionPriceDone=!1,await this.subscriptionSwap(),await this.subscriptionOneTimePrice(),await this.subscriptionPriceChange())}async finalize(){const t=await this.getCartState();t!==null&&this.queueCartUpdate(t),this.pruneStateAndSave(),await this.syncAllEvents()}setShoplift(){this.log("Setting up public API");const e=this.urlParams.get("slVariant")==="true",i=e?null:this.urlParams.get("slVariant");window.shoplift={isHypothesisActive:async s=>{if(this.log("Script checking variant for hypothesis '%s'",s),e)return this.log("Forcing variant for hypothesis '%s'",s),!0;if(i!==null)return this.log("Forcing hypothesis '%s'",i),s===i;const r=this.testConfigs.find(o=>o.hypotheses.some(l=>l.id===s));if(!r)return this.log("No test found for hypothesis '%s'",s),!1;const n=this.state.essential.visitorTests.find(o=>o.testId===r.id);return n?(this.log("Active visitor test found",s),n.hypothesisId===s):(await this.manuallySplitVisitor(r),this.testConfigs.some(o=>o.hypotheses.some(l=>l.id===s&&this.state.essential.visitorTests.some(c=>c.hypothesisId===l.id))))},setAnalyticsConsent:async s=>{await this.onConsentChange(s,!0)},getVisitorData:()=>({visitor:this.state.analytics.visitor,visitorTests:this.state.essential.visitorTests.filter(s=>!s.isInvalid).map(s=>{const{shouldSendToGa:r,savedAt:n,...o}=s;return o})})}}setShopliftStub(){this.log("Setting up stubbed public API");const e=this.urlParams.get("slVariant")==="true",i=e?null:this.urlParams.get("slVariant");window.shoplift={isHypothesisActive:s=>Promise.resolve(e||s===i),setAnalyticsConsent:()=>Promise.resolve(),getVisitorData:()=>({visitor:null,visitorTests:[]})}}async manuallySplitVisitor(t){this.log("Starting manual split for test '%s'",t.id),await this.handleVisitorTest([t]);const e=this.getReservationForTest(t.id);e&&!e.isRealized&&e.entryCriteriaKey&&(this.log("Realizing manual API reservation for test '%s'",t.id),this.realizeReservationForCriteria(e.entryCriteriaKey)),this.saveState(),this.syncAllEvents()}async handleVisitorTest(t){await this.filterTestsByAudience(this.testConfigs,this.state.analytics.visitor??this.buildBaseVisitor(),this.state.essential.visitorTests),this.pruneStaleVisitorTests(),this.deriveCategoryFromExistingTests(),this.clearStaleReservations();let e=t?t.filter(i=>this.testsFilteredByAudience.some(s=>s.id===i.id)):[...this.testsForUrl(this.testsFilteredByAudience),...this.domTestsForUrl(this.testsFilteredByAudience)];try{if(e.length===0)return this.log("No tests found"),!1;this.log("Checking for existing visitor test on page");const i=this.getCurrentVisitorHypothesis(e);if(i){this.log("Found current visitor test");const l=this.considerRedirect(i);return l&&(this.log("Redirecting for current visitor test"),this.redirect(i)),l}const s=this.getReservationForCurrentPage();if(s){this.log("Found matching reservation for current page: %s",s.testId);const l=this.getHypothesis(s.hypothesisId);if(l){l.type!=="price"&&this.realizeReservationForCriteria(s.entryCriteriaKey);const c=this.considerRedirect(l);return c&&this.redirect(l),c}}this.log("No active test relation for test page");const r=this.testsForUrl(this.inactiveTestConfigs.filter(l=>this.testIsPaused(l)&&l.hypotheses.some(c=>this.state.essential.visitorTests.some(d=>d.hypothesisId===c.id)))).map(l=>l.id);if(r.length>0)return this.log("Visitor has paused tests for test page, skipping test assignment: %o",r),!1;if(!this.state.temporary.testCategory){const l=this.testsFilteredByAudience.filter(d=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(d))),c=this.testsFilteredByAudience.filter(d=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(d)));if(this.log("Category dice roll - global tests: %o, conditional tests: %o",l.map(d=>({id:d.id,title:d.title,criteria:this.getEntryCriteriaKey(d)})),c.map(d=>({id:d.id,title:d.title,criteria:this.getEntryCriteriaKey(d)}))),l.length>0&&c.length>0){const d=l.length,p=c.length,h=d+p,u=Math.random()*h;this.state.temporary.testCategory=u<d?"global":"conditional",this.log("Category dice roll: rolled %.2f of %d (global weight: %d, conditional weight: %d), selected '%s'",u,h,d,p,this.state.temporary.testCategory)}else l.length>0?(this.state.temporary.testCategory="global",this.log("Only global tests available, setting category to global")):(this.state.temporary.testCategory="conditional",this.log("Only conditional tests available, setting category to conditional"));this.persistTemporaryState()}const n=this.state.temporary.testCategory;if(this.log("Visitor test category: %s",n),n==="global"){const l=this.testsFilteredByAudience.filter(c=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)));for(const c of l)this.markTestAsBlocked(c,"category:global");e=e.filter(c=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)))}else{const l=this.testsFilteredByAudience.filter(c=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)));for(const c of l)this.markTestAsBlocked(c,"category:conditional");e=e.filter(c=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)))}if(e.length===0)return this.log("No tests remaining after category filter"),!1;this.createReservations(e);const o=this.getReservationForCurrentPage();if(o&&!o.isRealized){const l=this.getHypothesis(o.hypothesisId);if(l){l.type!=="price"&&this.realizeReservationForCriteria(o.entryCriteriaKey);const c=this.considerRedirect(l);return c&&(this.log("Redirecting for new test"),this.redirect(l)),c}}return!1}finally{this.includeInDomTests(),this.saveState()}}includeInDomTests(){this.applyControlForAudienceFilteredPriceTests();const t=this.getDomTestsForCurrentUrl(),e=this.getVisitorDomHypothesis(t);for(const i of t){this.log("Evaluating dom test '%s'",i.id);const s=i.hypotheses.some(u=>u.type==="price");if(this.state.essential.visitorTests.find(u=>u.testId===i.id&&u.isInvalid&&!u.hypothesisId)){if(this.log("Visitor is blocked from test '%s', applying control prices if price test",i.id),s){const u=i.hypotheses.find(b=>b.isControl);u?.priceData&&(this.applyPriceTestWithMapLookup(i.id,u,[u],()=>{this.log("Control prices applied for blocked visitor, no metrics tracked")}),this.updatePriceTestHiddenInputs(i.id,"control",!1))}continue}const n=this.getReservationForTest(i.id);let o=null,l=!1;const c=e.find(u=>i.hypotheses.some(b=>u.id===b.id));if(n)o=this.getHypothesis(n.hypothesisId)??null,this.log("Using reserved hypothesis '%s' for test '%s'",n.hypothesisId,i.id);else if(c)o=c,this.log("Using existing hypothesis assignment for test '%s'",i.id);else if(s){const u=this.visitorActiveTestTypeWithReservations();u?(l=!0,this.log("Visitor already in test type '%s', treating as non-test for price test '%s'",u,i.id)):o=this.pickHypothesis(i)}else o=this.pickHypothesis(i);if(l&&s){const u=i.hypotheses.find(b=>b.isControl);u?.priceData&&(this.log("Applying control prices for non-test visitor on price test '%s' (Map-based)",i.id),this.applyPriceTestWithMapLookup(i.id,u,[u],()=>{this.log("Control prices applied for non-test visitor, no metrics tracked")}),this.updatePriceTestHiddenInputs(i.id,"control",!1));continue}if(!o){this.log("Failed to pick hypothesis for test");continue}this.sendDiagnosticTelemetry("assignment",i.id,{hypothesisId:o.id,isControl:o.isControl,testType:o.type});const d=i.bayesianRevision??4,p=o.type==="price",h=d>=5;if(p&&h){if(this.log(`Price test with Map-based lookup (v${d}): ${i.id}`),!o.priceData){this.log("No price data for hypothesis '%s', skipping",o.id);continue}const u=o.isControl?"control":"variant";this.log(`Setting up Map-based price test for ${u} (test: ${i.id})`),this.applyPriceTestWithMapLookup(i.id,o,i.hypotheses,b=>{const k=this.getReservationForTest(b);k&&!k.isRealized&&k.entryCriteriaKey?this.realizeReservationForCriteria(k.entryCriteriaKey):this.queueAddVisitorToTest(b,o),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()});continue}if(p&&!h){this.log(`Price test without viewport tracking (v${d}): ${i.id}`);const u=this.getDomSelectorsForHypothesis(o);if(u.length===0)continue;N(document,{testId:i.id,hypothesisId:o.id,selectors:u},b=>{this.queueAddVisitorToTest(b,o),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()});continue}if(!o.domSelectors||o.domSelectors.length===0){this.log("No selectors found, skipping hypothesis");continue}N(document,{testId:i.id,hypothesisId:o.id,selectors:o.domSelectors},u=>{this.queueAddVisitorToTest(u,o),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()})}}considerRedirect(t){if(this.log("Considering redirect for hypothesis '%s'",t.id),t.isControl)return this.log("Skipping redirect for control"),!1;if(t.type==="basicScript"||t.type==="manualScript")return this.log("Skipping redirect for script test"),!1;const e=this.state.essential.visitorTests.find(n=>n.hypothesisId===t.id),i=new URL(window.location.toString()),r=new URLSearchParams(window.location.search).get("view");if(t.type==="theme"){if(!(t.themeId===themeId)){if(this.log("Theme id '%s' is not hypothesis theme ID '%s'",t.themeId,themeId),this.isAppProxyPath())return this.log("On App Proxy path, skipping theme redirect to avoid infinite loop"),!1;if(e&&e.themeId!==t.themeId&&(e.themeId===themeId||!this.isThemePreview()))this.log("On old theme, redirecting and updating local visitor"),e.themeId=t.themeId;else if(this.isThemePreview())return this.log("On non-test theme, skipping redirect"),!1;return this.log("Hiding page to redirect for theme test"),this.hidePage(),!0}return!1}else if(t.type!=="dom"&&t.type!=="price"&&t.affix!==template.suffix&&t.affix!==r||t.redirectPath&&!i.pathname.endsWith(t.redirectPath))return this.log("Hiding page to redirect for template test"),this.hidePage(),!0;return this.log("Not redirecting"),!1}redirect(t){if(this.log("Redirecting to hypothesis '%s'",t.id),t.isControl)return;const e=new URL(window.location.toString());if(e.searchParams.delete("view"),t.redirectPath){const s=RegExp("^(/w{2}-w{2})/").exec(e.pathname);if(s&&s.length>1){const r=s[1];e.pathname=`${r}${t.redirectPath}`}else e.pathname=t.redirectPath}else t.type==="theme"?(e.searchParams.set("_ab","0"),e.searchParams.set("_fd","0"),e.searchParams.set("_sc","1"),e.searchParams.set("preview_theme_id",t.themeId.toString())):t.type!=="urlRedirect"&&e.searchParams.set("view",t.affix);const i=this.state.essential.visitorTests.find(s=>s.hypothesisId===t.id)?.testId;if(i){const s=new Date(Date.now()+5e3).toUTCString();document.cookie=`shoplift_redirect=${i};domain=.${window.location.hostname};path=/;SameSite=Strict;expires=${s}`}this.queueRedirect(e)}async refreshVisitor(t){if(t===null||!this.state.essential.isFirstLoad||!this.testConfigs.some(i=>i.visitorOption!=="all"))return;this.log("Refreshing visitor"),this.hidePage();const e=await this.getVisitor(t);e&&e.id&&this.updateLocalVisitor(e)}buildBaseVisitor(){return{shopifyAnalyticsId:this.shopifyAnalyticsId,device:this.device,country:null,...this.state.essential.initialState}}getInitialState(){const t=this.getUTMValue("utm_source")??"",e=this.getUTMValue("utm_medium")??"",i=this.getUTMValue("utm_campaign")??"",s=this.getUTMValue("utm_content")??"",r=window.document.referrer,n=this.device;return{createdAt:new Date,utmSource:t,utmMedium:e,utmCampaign:i,utmContent:s,referrer:r,device:n}}checkForThemePreview(){return this.log("Checking for theme preview"),window.location.hostname.endsWith(".shopifypreview.com")?(this.log("on shopify preview domain"),this.clearThemeBar(!0,!1,this.state),document.querySelector("#sl-preview-bar-hide")?.remove(),!1):this.isThemePreview()?this.state.essential.visitorTests.some(t=>t.isThemeTest&&t.hypothesisId!=null&&this.getHypothesis(t.hypothesisId)&&t.themeId===themeId)?(this.log("On active theme test, removing theme bar"),this.clearThemeBar(!1,!0,this.state),!1):this.state.essential.visitorTests.some(t=>t.isThemeTest&&t.hypothesisId!=null&&!this.getHypothesis(t.hypothesisId)&&t.themeId===themeId)?(this.log("Visitor is on an inactive theme test, redirecting to main theme"),this.redirectToMainTheme(),!0):this.state.essential.isFirstLoad?(this.log("No visitor found on theme preview, redirecting to main theme"),this.redirectToMainTheme(),!0):this.inactiveTestConfigs.some(t=>t.hypotheses.some(e=>e.themeId===themeId))?(this.log("Current theme is an inactive theme test, redirecting to main theme"),this.redirectToMainTheme(),!0):this.testConfigs.some(t=>t.hypotheses.some(e=>e.themeId===themeId))?(this.log("Falling back to clearing theme bar"),this.clearThemeBar(!1,!0,this.state),!1):(this.log("No tests on current theme, skipping script"),this.clearThemeBar(!0,!1,this.state),document.querySelector("#sl-preview-bar-hide")?.remove(),!0):(this.log("Not on theme preview"),this.clearThemeBar(!0,!1,this.state),!1)}redirectToMainTheme(){this.hidePage();const t=new URL(window.location.toString());t.searchParams.set("preview_theme_id",""),this.queueRedirect(t)}testsForUrl(t){const e=new URL(window.location.href),i=this.typeFromTemplate();return t.filter(s=>s.hypotheses.some(r=>r.type!=="dom"&&r.type!=="price"&&(r.isControl&&r.type===i&&r.affix===template.suffix||r.type==="theme"||r.isControl&&r.type==="urlRedirect"&&r.redirectPath&&e.pathname.endsWith(r.redirectPath)||r.type==="basicScript"))&&(s.ignoreTestViewParameterEnforcement||!e.searchParams.has("view")||s.hypotheses.map(r=>r.affix).includes(e.searchParams.get("view")??"")))}domTestsForUrl(t){const e=new URL(window.location.href);return t.filter(i=>i.hypotheses.some(s=>s.type!=="dom"&&s.type!=="price"?!1:s.type==="price"&&s.priceData&&s.priceData.variants.length>0?!0:s.domSelectors&&s.domSelectors.some(r=>new RegExp(it(r)).test(e.toString()))))}async filterTestsByAudience(t,e,i){const s=[];let r=e.country;!r&&t.some(n=>n.requiresCountry&&!i.some(o=>o.testId===n.id))&&(this.log("Hiding page to check geoip"),this.hidePage(),r=await this.makeJsonRequest({method:"get",url:`${this.eventHost}/api/v0/visitors/get-country`,signal:AbortSignal.timeout(this.getCountryTimeout)}).catch(n=>(this.log("Error getting country",n),null)));for(const n of t){if(this.log("Checking audience for test '%s'",n.id),this.state.essential.visitorTests.some(c=>c.testId===n.id&&c.hypothesisId==null)){console.log(`Skipping blocked test '${n.id}'`);continue}const o=this.visitorCreatedDuringTestActive(n.statusHistory);(i.some(c=>c.testId===n.id&&(n.device==="all"||n.device===e.device&&n.device===this.device))||this.isTargetAudience(n,e,o,r))&&(this.log("Visitor is in audience for test '%s'",n.id),s.push(n))}this.testsFilteredByAudience=s}isTargetAudience(t,e,i,s){const r=this.getChannel(e);return(t.device==="all"||t.device===e.device&&t.device===this.device)&&(t.visitorOption==="all"||t.visitorOption==="new"&&i||t.visitorOption==="returning"&&!i)&&(t.targetAudiences.length===0||t.targetAudiences.reduce((n,o)=>n||o.reduce((l,c)=>l&&c(e,i,r,s),!0),!1))}visitorCreatedDuringTestActive(t){let e="";for(const i of t){if(this.state.analytics.visitor!==null&&this.state.analytics.visitor.createdAt<i.createdAt||this.state.essential.initialState.createdAt<i.createdAt)break;e=i.status}return e==="active"}getDomTestsForCurrentUrl(){return this.domTestsForUrl(this.testsFilteredByAudience)}getCurrentVisitorHypothesis(t){return t.flatMap(e=>e.hypotheses).find(e=>e.type!=="dom"&&e.type!=="price"&&this.state.essential.visitorTests.some(i=>i.hypothesisId===e.id))}getVisitorDomHypothesis(t){return t.flatMap(e=>e.hypotheses).filter(e=>(e.type==="dom"||e.type==="price")&&this.state.essential.visitorTests.some(i=>i.hypothesisId===e.id))}getHypothesis(t){return this.testConfigs.filter(e=>e.hypotheses.some(i=>i.id===t)).map(e=>e.hypotheses.find(i=>i.id===t))[0]}getActiveAssignment(){if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const e=this.state.temporary.previewConfig;return e.currentVariant&&e.testId?{testId:e.testId,hypothesisId:e.currentVariant}:null}const t=this.state.essential.visitorTests.find(e=>e.hypothesisId);return t?.hypothesisId?{testId:t.testId,hypothesisId:t.hypothesisId}:null}findActiveSubscriptionTestControl(){for(const t of this.testConfigs){const e=t.hypotheses.find(i=>i.isControl);if(e?.subscriptionData)return{testId:t.id,hypothesis:e}}return null}getDomSelectorsForHypothesis(t){if(!t)return[];if(t.domSelectors&&t.domSelectors.length>0)return t.domSelectors;if(t.priceData){const e=`${this.priceSelectorsSessionKey}_${t.id}`;try{const s=sessionStorage.getItem(e);if(s){const r=JSON.parse(s);return t.domSelectors=r,this.log("Loaded %d price selectors from cache for hypothesis '%s'",r.length,t.id),r}}catch{}const i=Ot(t.priceData);t.domSelectors=i;try{sessionStorage.setItem(e,JSON.stringify(i)),this.log("Generated and cached %d price selectors for hypothesis '%s'",i.length,t.id)}catch{this.log("Generated %d price selectors for hypothesis '%s' (cache unavailable)",i.length,t.id)}return i}return[]}hasThemeTest(t){return t.some(e=>e.hypotheses.some(i=>i.type==="theme"))}hasTestThatIsNotThemeTest(t){return t.some(e=>e.hypotheses.some(i=>i.type!=="theme"&&i.type!=="dom"&&i.type!=="price"))}hasThemeAndOtherTestTypes(t){return this.hasThemeTest(t)&&this.hasTestThatIsNotThemeTest(t)}testIsPaused(t){return t.status==="paused"||t.status==="incompatible"||t.status==="suspended"}visitorActiveTestType(){const t=this.state.essential.visitorTests.filter(e=>this.testConfigs.some(i=>i.hypotheses.some(s=>s.id==e.hypothesisId)));return t.length===0?null:t.some(e=>e.isThemeTest)?"theme":"templateOrUrlRedirect"}getReservationType(t){return t==="price"||this.isTemplateTestType(t)?"deferred":"immediate"}isTemplateTestType(t){return["product","collection","landing","index","cart","search","blog","article","collectionList"].includes(t)}getEntryCriteriaKey(t){const e=t.hypotheses.find(i=>i.isControl);if(!e)return`unknown:${t.id}`;switch(e.type){case"theme":return"global:theme";case"basicScript":return"global:autoApi";case"price":return"global:price";case"manualScript":return`conditional:manualApi:${t.id}`;case"urlRedirect":return`conditional:url:${e.redirectPath||"unknown"}`;default:return`conditional:template:${e.type}`}}isGlobalEntryCriteria(t){return t.startsWith("global:")}groupTestsByEntryCriteria(t){const e=new Map;for(const i of t){const s=this.getEntryCriteriaKey(i),r=e.get(s)||[];r.push(i),e.set(s,r)}return e}doesCurrentPageMatchEntryCriteria(t){if(this.isGlobalEntryCriteria(t))return!0;if(t==="conditional:manualApi")return!1;if(t.startsWith("conditional:url:")){const e=t.replace("conditional:url:","");return window.location.pathname.endsWith(e)}if(t.startsWith("conditional:template:")){const e=t.replace("conditional:template:","");return this.typeFromTemplate()===e}return!1}hasActiveReservation(){const t=this.getActiveReservations();return Object.values(t).some(e=>!e.isRealized)}getActiveReservation(){const t=this.getActiveReservations();return Object.values(t).find(e=>!e.isRealized)??null}clearStaleReservations(){const t=this.state.temporary.testReservations;if(!t)return;let e=!1;for(const[i,s]of Object.entries(t)){const r=this.testConfigs.find(o=>o.id===s.testId);if(!r){this.log("Test '%s' no longer in config, clearing reservation for criteria '%s'",s.testId,i),delete t[i],e=!0;continue}if(r.status!=="active"){this.log("Test '%s' status is '%s', clearing reservation for criteria '%s'",s.testId,r.status,i),delete t[i],e=!0;continue}this.testsFilteredByAudience.some(o=>o.id===s.testId)||(this.log("Visitor no longer passes audience for test '%s', clearing reservation for criteria '%s'",s.testId,i),delete t[i],e=!0)}e&&this.persistTemporaryState()}createReservations(t){if(this.state.temporary.testReservations||(this.state.temporary.testReservations={}),this.state.temporary.rolledEntryCriteria||(this.state.temporary.rolledEntryCriteria=[]),this.state.temporary.testCategory==="global"){this.createSingleReservation(t,"global");return}const i=t.filter(o=>this.doesCurrentPageMatchEntryCriteria(this.getEntryCriteriaKey(o))),s=t.filter(o=>!this.doesCurrentPageMatchEntryCriteria(this.getEntryCriteriaKey(o)));this.log("Conditional tests split - matching current page: %d, not matching: %d",i.length,s.length),i.length>0&&this.log("Tests matching current page (same pool): %o",i.map(o=>({id:o.id,title:o.title,criteria:this.getEntryCriteriaKey(o)})));const r=`conditional:current-page:${this.typeFromTemplate()}`;if(i.length>0&&!this.state.temporary.rolledEntryCriteria.includes(r)){this.createSingleReservation(i,r);for(const o of i){const l=this.getEntryCriteriaKey(o);this.state.temporary.rolledEntryCriteria.includes(l)||this.state.temporary.rolledEntryCriteria.push(l)}}const n=this.groupTestsByEntryCriteria(s);for(const[o,l]of n){if(this.state.temporary.rolledEntryCriteria.includes(o)){this.log("Already rolled for criteria '%s', skipping",o);continue}if(l.some(S=>this.state.essential.visitorTests.some(P=>P.testId===S.id))){this.log("Visitor already has VT for criteria '%s', skipping",o),this.state.temporary.rolledEntryCriteria.push(o);continue}const d=[...l].sort((S,P)=>S.id.localeCompare(P.id));this.log("Test dice roll for criteria '%s' - available tests: %o",o,d.map(S=>({id:S.id,title:S.title})));const p=Math.floor(Math.random()*d.length),h=d[p];this.log("Test dice roll: picked index %d of %d, selected test '%s' (%s)",p+1,l.length,h.id,h.title);const u=this.pickHypothesis(h);if(!u){this.log("No hypothesis picked for test '%s'",h.id);continue}this.sendDiagnosticTelemetry("assignment",h.id,{hypothesisId:u.id,isControl:u.isControl,testType:u.type});const b=this.getReservationType(u.type),k={testId:h.id,hypothesisId:u.id,testType:u.type,reservationType:b,isThemeTest:u.type==="theme",themeId:u.themeId,createdAt:new Date,isRealized:!1,entryCriteriaKey:o};this.state.temporary.testReservations[o]=k,this.state.temporary.rolledEntryCriteria.push(o),this.log("Created %s reservation for test '%s' (criteria: %s)",b,h.id,o);for(const S of l)S.id!==h.id&&this.markTestAsBlocked(S,o)}this.persistTemporaryState()}createSingleReservation(t,e){if(this.state.temporary.rolledEntryCriteria.includes(e)){this.log("Already rolled for pool '%s', skipping",e);return}if(t.some(p=>this.state.essential.visitorTests.some(h=>h.testId===p.id&&!h.isInvalid))){this.log("Visitor already has VT for pool '%s', skipping",e),this.state.temporary.rolledEntryCriteria.push(e);return}if(t.length===0){this.log("No tests in pool '%s'",e);return}const s=[...t].sort((p,h)=>p.id.localeCompare(h.id));this.log("Test dice roll for pool '%s' - available tests: %o",e,s.map(p=>({id:p.id,title:p.title,criteria:this.getEntryCriteriaKey(p)})));const r=Math.floor(Math.random()*s.length),n=s[r];this.log("Test dice roll: picked index %d of %d, selected test '%s' (%s)",r,t.length,n.id,n.title);const o=this.pickHypothesis(n);if(!o){this.log("No hypothesis picked for test '%s'",n.id);return}this.sendDiagnosticTelemetry("assignment",n.id,{hypothesisId:o.id,isControl:o.isControl,testType:o.type});const l=this.getReservationType(o.type),c=this.getEntryCriteriaKey(n),d={testId:n.id,hypothesisId:o.id,testType:o.type,reservationType:l,isThemeTest:o.type==="theme",themeId:o.themeId,createdAt:new Date,isRealized:!1,entryCriteriaKey:c};this.state.temporary.testReservations[c]=d,this.state.temporary.rolledEntryCriteria.push(e),this.log("Created %s reservation for test '%s' from pool '%s' (criteria: %s)",l,n.id,e,c);for(const p of t)p.id!==n.id&&this.markTestAsBlocked(p,`pool:${e}`);this.persistTemporaryState()}markTestAsBlocked(t,e){this.state.essential.visitorTests.some(i=>i.testId===t.id)||(this.log("Blocking visitor from test '%s' (reason: %s)",t.id,e),this.state.essential.visitorTests.push({createdAt:new Date,testId:t.id,hypothesisId:null,isThemeTest:t.hypotheses.some(i=>i.type==="theme"),shouldSendToGa:!1,isSaved:!0,isInvalid:!0,themeId:void 0}))}realizeReservationForCriteria(t){const e=this.state.temporary.testReservations?.[t];if(!e)return this.log("No reservation found for criteria '%s'",t),!1;if(e.isRealized)return this.log("Reservation already realized for criteria '%s'",t),!1;if(this.state.essential.visitorTests.some(s=>s.testId===e.testId&&!s.isInvalid))return this.log("Visitor already assigned to test '%s'",e.testId),!1;const i=this.getHypothesis(e.hypothesisId);return i?(e.isRealized=!0,this.persistTemporaryState(),this.queueAddVisitorToTest(e.testId,i),this.saveState(),this.log("Realized reservation for test '%s' (criteria: %s)",e.testId,t),!0):(this.log("Hypothesis '%s' not found",e.hypothesisId),!1)}getActiveReservations(){return this.state.temporary.testReservations??{}}getReservationForCurrentPage(){const t=this.getActiveReservations();for(const[e,i]of Object.entries(t)){if(i.isRealized)continue;const s=this.testConfigs.find(r=>r.id===i.testId);if(!(!s||s.status!=="active")&&this.doesCurrentPageMatchEntryCriteria(e))return i}return null}getReservationForTest(t){const e=this.getActiveReservations();return Object.values(e).find(i=>i.testId===t)??null}getReservationTestType(){const t=this.getActiveReservations(),e=Object.values(t);if(e.length===0)return null;for(const i of e)if(i.isThemeTest)return"theme";for(const i of e)if(i.testType==="price")return"price";return e.some(i=>!i.isRealized)?"templateOrUrlRedirect":null}hasPriceTests(t){return t.some(e=>e.hypotheses.some(i=>i.type==="price"))}_priceTestProductIds=null;getPriceTestProductIds(){if(this._priceTestProductIds)return this._priceTestProductIds;const t=new Set;for(const e of this.testConfigs)for(const i of e.hypotheses)if(i.type==="price"){for(const s of i.domSelectors||[]){const r=s.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);r?.[1]&&t.add(r[1])}if(i.priceData?.variants)for(const[s]of i.priceData.variants)t.add(s)}return this._priceTestProductIds=t,this.log("Built price test product ID cache with %d products",t.size),t}isProductInAnyPriceTest(t){return this.getPriceTestProductIds().has(t)}visitorActiveTestTypeWithReservations(){const t=this.getActiveReservations();for(const r of Object.values(t)){if(r.isThemeTest)return"theme";if(r.testType==="price")return"price"}if(Object.values(t).some(r=>!r.isRealized)){if(this.state.temporary.testCategory==="global")for(const n of Object.values(t)){if(n.testType==="theme")return"theme";if(n.testType==="price")return"price";if(n.testType==="basicScript")return"theme"}return"templateOrUrlRedirect"}const i=this.state.essential.visitorTests.filter(r=>!r.isInvalid&&this.testConfigs.some(n=>n.hypotheses.some(o=>o.id===r.hypothesisId)));return i.length===0?null:i.some(r=>this.getHypothesis(r.hypothesisId)?.type==="price")?"price":i.some(r=>r.isThemeTest)?"theme":"templateOrUrlRedirect"}applyControlForAudienceFilteredPriceTests(){const t=this.testConfigs.filter(s=>s.status==="active"&&s.hypotheses.some(r=>r.type==="price"));if(t.length===0)return;const e=this.testsFilteredByAudience.filter(s=>s.hypotheses.some(r=>r.type==="price")),i=t.filter(s=>!e.some(r=>r.id===s.id));if(i.length!==0){this.log("Found %d price tests filtered by audience, applying control selectors",i.length);for(const s of i){const r=s.hypotheses.find(c=>c.isControl),n=this.getDomSelectorsForHypothesis(r);if(n.length===0){this.log("No control selectors for audience-filtered price test '%s'",s.id);continue}const o=new URL(window.location.href);n.some(c=>{try{return new RegExp(it(c)).test(o.toString())}catch{return!1}})&&(this.log("Applying control selectors for audience-filtered price test '%s'",s.id),N(document,{testId:s.id,hypothesisId:r.id,selectors:n},()=>{}),this.updatePriceTestHiddenInputs(s.id,"control",!1))}}}pickHypothesis(t){let e=Math.random();const i=t.hypotheses.reduce((r,n)=>r+n.visitorCount,0);return t.hypotheses.sort((r,n)=>r.isControl?n.isControl?0:-1:n.isControl?1:0).reduce((r,n)=>{if(r!==null)return r;const l=t.hypotheses.reduce((c,d)=>c&&d.visitorCount>20,!0)?n.visitorCount/i-n.trafficPercentage:0;return e<=n.trafficPercentage-l?n:(e-=n.trafficPercentage-l,null)},null)}typeFromTemplate(){switch(template.type){case"list-collections":return"collectionList";case"page":return"landing";case"article":case"blog":case"cart":case"collection":case"index":case"product":case"search":return template.type;default:return null}}queueRedirect(t){this.saveState(),this.disableReferrerOverride||(this.log(`Saving temporary referrer override '${document.referrer}'`),this.state.temporary.originalReferrer=document.referrer,this.persistTemporaryState()),window.setTimeout(()=>window.location.assign(t),0),window.setTimeout(()=>{this.syncAllEvents()},2e3)}scheduleRetrySync(){this.clientIdRetryCount>=5||(this.clientIdRetryCount++,window.setTimeout(()=>{this.syncAllEvents()},500))}async syncAllEvents(){const t=async()=>{if(this.isSyncing){window.setTimeout(()=>{(async()=>await t())()},500);return}try{if(this.isSyncing=!0,this.syncGAEvents(),this.shopifyAnalyticsId||(this.shopifyAnalyticsId=this.getShopifyAnalyticsId()),!this.shopifyAnalyticsId){this.scheduleRetrySync();return}await this.syncEvents()}finally{this.isSyncing=!1}};await t()}async syncEvents(){if(!this.state.essential.consentApproved||!this.shopifyAnalyticsId||this.state.analytics.queue.length===0)return;const t=this.state.analytics.queue.length,e=this.state.analytics.queue.splice(0,t);this.log("Syncing %s events",t);try{const i={shop:this.shop,visitorDetails:{shopifyAnalyticsId:this.shopifyAnalyticsId,device:this.state.analytics.visitor?.device??this.device,country:this.state.analytics.visitor?.country??null,...this.state.essential.initialState},events:this.state.essential.visitorTests.filter(r=>!r.isInvalid&&!r.isSaved&&r.hypothesisId!=null).map(r=>new yt(r.testId,r.hypothesisId,r.createdAt)).concat(e)};await this.sendEvents(i);for(const r of this.state.essential.visitorTests.filter(n=>!n.isInvalid&&!n.isSaved&&n.hypothesisId!=null))this.sendDiagnosticTelemetry("event-delivered",r.testId,{hypothesisId:r.hypothesisId,isControl:r.assignedTo==="control",testType:r.testType??"unknown"});const s=await this.getVisitor(this.shopifyAnalyticsId);s!==null&&this.updateLocalVisitor(s);for(const r of this.state.essential.visitorTests.filter(n=>!n.isInvalid&&!n.isSaved))r.isSaved=!0,r.savedAt=Date.now()}catch{this.state.analytics.queue.splice(0,0,...e)}finally{this.saveState()}}syncGAEvents(){if(!this.gaConfig.sendEvents){if(pt)return;pt=!0,this.log("UseGtag is false — skipping GA Events");return}if(this.isSyncingGA){this.log("Already syncing GA - skipping GA events");return}const t=this.state.essential.visitorTests.filter(e=>e.shouldSendToGa);t.length!==0&&(this.isSyncingGA=!0,this.log("Syncing %s GA Events",t.length),Promise.allSettled(t.map(e=>this.sendGAEvent(e))).then(()=>this.log("All gtag events sent")).finally(()=>this.isSyncingGA=!1))}sendGAEvent(t){return new Promise(e=>{this.log("Sending GA Event for test %s, hypothesis %s",t.testId,t.hypothesisId);const i=()=>{this.log("GA acknowledged event for hypothesis %s",t.hypothesisId),t.shouldSendToGa=!1,this.persistEssentialState(),e()},s={exp_variant_string:`SL-${t.testId}-${t.hypothesisId}`};this.shopliftDebug&&Object.assign(s,{debug_mode:!0});function r(n,o,l){window.dataLayer=window.dataLayer||[],window.dataLayer.push(arguments)}this.gaConfig.mode==="gtag"?r("event","experience_impression",{...s,event_callback:i}):(window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"experience_impression",...s,eventCallback:i}))})}updateLocalVisitor(t){let e;({visitorTests:e,...this.state.analytics.visitor}=t),this.log("updateLocalVisitor - server returned %d tests: %o",e.length,e.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isInvalid:s.isInvalid}))),this.log("updateLocalVisitor - local has %d tests: %o",this.state.essential.visitorTests.length,this.state.essential.visitorTests.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isSaved:s.isSaved,isInvalid:s.isInvalid})));const i=300*1e3;for(const s of this.state.essential.visitorTests.filter(r=>r.isSaved&&(!r.savedAt||Date.now()-r.savedAt>i)&&!e.some(n=>n.testId===r.testId)))this.log("updateLocalVisitor - marking LOCAL test as INVALID (isSaved && not in server): testId=%s, hypothesisId=%s",s.testId,s.hypothesisId),s.isInvalid=!0;for(const s of e){const r=this.state.essential.visitorTests.findIndex(o=>o.testId===s.testId);if(!(r!==-1))this.log("updateLocalVisitor - ADDING server test (not found locally): testId=%s, hypothesisId=%s",s.testId,s.hypothesisId),this.state.essential.visitorTests.push(s);else{const o=this.state.essential.visitorTests.at(r);this.log("updateLocalVisitor - REPLACING local test with server test: testId=%s, local hypothesisId=%s -> server hypothesisId=%s, local isInvalid=%s -> false",s.testId,o?.hypothesisId,s.hypothesisId,o?.isInvalid),s.isInvalid=!1,s.shouldSendToGa=o?.shouldSendToGa??!1,s.testType=o?.testType,s.assignedTo=o?.assignedTo,s.testTitle=o?.testTitle,this.state.essential.visitorTests.splice(r,1,s)}}this.log("updateLocalVisitor - FINAL local tests: %o",this.state.essential.visitorTests.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isSaved:s.isSaved,isInvalid:s.isInvalid}))),this.state.analytics.visitor.storedAt=new Date}async getVisitor(t){try{return await this.makeJsonRequest({method:"get",url:`${this.eventHost}/api/v0/visitors/by-key/${this.shop}/${t}`})}catch{return null}}async sendEvents(t){await this.makeRequest({method:"post",url:`${this.eventHost}/api/v0/events`,data:JSON.stringify(t)})}sendDiagnosticTelemetry(t,e,i){if(!this.telemetryEnabled||!navigator.sendBeacon)return;const s=this.state.essential.consentApproved,r=JSON.stringify({shop:this.shop,testId:e,checkpoint:t,device:this.device,...s?{visitorId:this.shopifyAnalyticsId??"unknown"}:{},clientTimestamp:Date.now(),consentApproved:s,hasConsentInteraction:this.state.essential.hasConsentInteraction,...i});navigator.sendBeacon(`${this.eventHost}/api/v0/telemetry`,new Blob([r],{type:"text/plain"}))}getUTMValue(t){const i=decodeURIComponent(window.location.search.substring(1)).split("&");for(let s=0;s<i.length;s++){const r=i[s].split("=");if(r[0]===t)return r[1]||null}return null}hidePage(t){this.log("Hiding page"),this.cssHideClass&&!window.document.documentElement.classList.contains(this.cssHideClass)&&(window.document.documentElement.classList.add(this.cssHideClass),t||setTimeout(this.removeAsyncHide(this.cssHideClass),2e3))}showPage(){this.cssHideClass&&this.removeAsyncHide(this.cssHideClass)()}getDeviceType(){function t(){let i=!1;return(function(s){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(s)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(s.substr(0,4)))&&(i=!0)})(navigator.userAgent||navigator.vendor),i}function e(){let i=!1;return(function(s){(/android|ipad|playbook|silk/i.test(s)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(s.substr(0,4)))&&(i=!0)})(navigator.userAgent||navigator.vendor),i}return t()?"mobile":e()?"tablet":"desktop"}removeAsyncHide(t){return()=>{t&&window.document.documentElement.classList.remove(t)}}async getCartState(){try{let t=await this.makeJsonRequest({method:"get",url:`${window.location.origin}/cart.js`});return t===null||(t.note===null&&(t=await this.makeJsonRequest({method:"post",url:`${window.location.origin}/cart/update.js`,data:JSON.stringify({note:""})})),t==null)?null:{token:t.token,total_price:t.total_price,total_discount:t.total_discount,currency:t.currency,items_subtotal_price:t.items_subtotal_price,items:t.items.map(e=>({quantity:e.quantity,variant_id:e.variant_id,key:e.key,price:e.price,final_line_price:e.final_line_price,sku:e.sku,product_id:e.product_id}))}}catch(t){return this.log("Error sending cart info",t),null}}ensureCartAttributesForExistingPriceTests(t){try{if(this.log("Checking visitor assignments for active price tests"),t&&this.state.temporary.previewConfig){const e=this.state.temporary.previewConfig;this.log("Using preview config for merchant:",e.testId);let i="variant";if(e.variants&&e.variants.length>0){const s=e.variants.find(r=>r.id===e.currentVariant);s&&s.isControl&&(i="control")}this.log("Merchant preview - updating hidden inputs:",e.testId,i),this.updatePriceTestHiddenInputs(e.testId,i,!0);return}for(const e of this.state.essential.visitorTests){const i=this.testConfigs.find(n=>n.id===e.testId);if(!i){this.log("Test config not found:",e.testId);continue}const s=i.hypotheses.find(n=>n.id===e.hypothesisId);if(!s||s.type!=="price")continue;const r=s.isControl?"control":"variant";this.log("Updating hidden inputs for price test:",e.testId,r),this.updatePriceTestHiddenInputs(e.testId,r,t)}}catch(e){this.log("Error ensuring cart attributes for existing price tests:",e)}}subscriptionSwapDone=!1;subscriptionHideWrongPlans=null;subscriptionPriceDone=!1;subscriptionUpdateOneTime=null;subscriptionOneTimeDone=!1;swapMap=null;slptValue=null;async subscriptionSwap(){await Lt(this)}async subscriptionPriceChange(){await qt(this)}async subscriptionOneTimePrice(){await Ht(this)}updatePriceTestHiddenInputs(t,e,i){try{this.cleanupPriceTestObservers();const s=`${t}:${e}:${i?"t":"f"}`,r=C=>{const m=C.getAttribute("data-sl-pid");if(!m)return!0;if(i&&this.state.temporary.previewConfig){const w=this.state.temporary.previewConfig,T=e==="control"?"a":"b",f=w.variants.find(v=>v.label===T);if(!f)return!1;for(const v of f.domSelectors||[]){const g=v.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);if(g){const I=g[1];if(this.log(`Extracted ID from selector: ${I}, comparing to: ${m}`),I===m)return this.log("Product ID match found in preview config:",m,"variant:",f.label),!0}else this.log(`Could not extract ID from selector: ${v.cssSelector}`)}return this.log("No product ID match in preview config for:",m,"variant:",T),!1}const y=this.testConfigs.find(w=>w.id===t);if(!y)return this.log("Test config not found for testId:",t),!1;for(const w of y.hypotheses||[]){for(const T of w.domSelectors||[]){const f=T.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);if(f&&f[1]===m)return this.log("Product ID match found in domSelectors:",m,"for test:",t),!0}if(w.priceData?.variants){for(const T of w.priceData.variants)if(T[0]===m)return this.log("Product ID match found in priceData:",m,"for test:",t),!0}}return this.log("No product ID match for:",m,"in test:",t),!1},n=new Set;let o=!1,l=null;const c=(C,m)=>{if(document.querySelectorAll("[data-sl-attribute-p]").forEach(w=>{if(w instanceof Element&&w.nodeType===Node.ELEMENT_NODE&&w.isConnected&&document.contains(w))try{C.observe(w,{childList:!0,subtree:!0,characterData:!0,characterDataOldValue:!0,attributes:!1})}catch(T){this.log(`Failed to observe element (${m}):`,T)}}),document.body&&document.body.isConnected)try{C.observe(document.body,{childList:!0,subtree:!0,characterData:!0,characterDataOldValue:!0,attributes:!1})}catch(w){this.log(`Failed to observe document.body (${m}):`,w)}},d=(C,m,y,w)=>{const T=C.filter(f=>{const v=f.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);return v&&v[1]===w});this.log(`Applying ${y} DOM selectors, total: ${C.length}, filtered: ${T.length}`),T.length>0&&N(document,{testId:t,hypothesisId:m,selectors:T})},p=(C,m)=>{this.log(`Applying DOM selector changes for product ID: ${C}`),m.disconnect(),o=!0;try{if(i&&this.state.temporary.previewConfig){const y=e==="control"?"a":"b",w=this.state.temporary.previewConfig.variants.find(T=>T.label===y);if(!w?.domSelectors){this.log(`No DOM selectors found for preview variant: ${y}`);return}d(w.domSelectors,w.id,"preview config",C)}else{const y=this.testConfigs.find(T=>T.id===t);if(!y){this.log(`No test config found for testId: ${t}`);return}const w=y.hypotheses.find(T=>e==="control"?T.isControl:!T.isControl);if(!w?.domSelectors){this.log(`No DOM selectors found for assignment: ${e}`);return}d(w.domSelectors,w.id,"live config",C)}}finally{l!==null&&clearTimeout(l),l=window.setTimeout(()=>{o=!1,l=null,c(m,"reconnection"),this.log("Re-established innerHTML observer after DOM changes")},50)}},h=new MutationObserver(C=>{if(!o)for(const m of C){if(m.type!=="childList"&&m.type!=="characterData")continue;let y=m.target;m.type==="characterData"&&(y=m.target.parentElement||m.target.parentNode);let w=y,T=w.getAttribute("data-sl-attribute-p");for(;!T&&w.parentElement;)w=w.parentElement,T=w.getAttribute("data-sl-attribute-p");if(!T)continue;const f=w.innerHTML||w.textContent||"";let v="";m.type==="characterData"&&m.oldValue!==null&&(v=m.oldValue),this.log(`innerHTML changed on element with data-sl-attribute-p="${T}"`),v&&this.log(`Previous content: "${v}"`),this.log(`Current content: "${f}"`),p(T,h)}});c(h,"initial setup"),n.add(h);const u=new MutationObserver(C=>{C.forEach(m=>{m.addedNodes.forEach(y=>{if(y.nodeType===Node.ELEMENT_NODE){const w=y;k(w);const T=w.matches('input[name="properties[_slpt]"]')?[w]:w.querySelectorAll('input[name="properties[_slpt]"]');T.length>0&&this.log(`MutationObserver found ${T.length} new hidden input(s)`),T.forEach(f=>{const v=f.getAttribute("data-sl-pid");if(this.log(`MutationObserver checking new input with data-sl-pid="${v}"`),r(f))f.value!==s&&(f.value=s,this.log("Updated newly added hidden input:",s)),S(f);else{const g=f.getAttribute("data-sl-pid");g&&this.isProductInAnyPriceTest(g)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",g):(f.remove(),this.log("Removed newly added non-matching hidden input for product ID:",g))}})}})})});n.add(u);const b=new MutationObserver(C=>{C.forEach(m=>{if(m.type==="attributes"&&m.attributeName==="data-sl-pid"){const y=m.target;if(this.log("AttributeObserver detected data-sl-pid attribute change on:",y.tagName),y.matches('input[name="properties[_slpt]"]')){const w=y,T=m.oldValue,f=w.getAttribute("data-sl-pid");this.log(`data-sl-pid changed from "${T}" to "${f}" - triggering payment placement updates`),r(w)?(w.value!==s&&(w.value=s,this.log("Updated hidden input after data-sl-pid change:",s)),f&&p(f,h),this.log("Re-running payment placement updates after variant change"),k(document.body)):f&&this.isProductInAnyPriceTest(f)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",f):(w.remove(),this.log("Removed non-matching hidden input after data-sl-pid change:",f))}}})});n.add(b);const k=C=>{C.tagName==="SHOPIFY-PAYMENT-TERMS"&&(this.log("MutationObserver found new shopify-payment-terms element"),this.updateShopifyPaymentTerms(t,e));const m=C.querySelectorAll("shopify-payment-terms");m.length>0&&(this.log(`MutationObserver found ${m.length} shopify-payment-terms in added node`),this.updateShopifyPaymentTerms(t,e)),C.tagName==="AFTERPAY-PLACEMENT"&&(this.log("MutationObserver found new afterpay-placement element"),this.updateAfterpayPlacements(t,e,"afterpay"));const y=C.querySelectorAll("afterpay-placement");y.length>0&&(this.log(`MutationObserver found ${y.length} afterpay-placement in added node`),this.updateAfterpayPlacements(t,e,"afterpay")),C.tagName==="SQUARE-PLACEMENT"&&(this.log("MutationObserver found new square-placement element"),this.updateAfterpayPlacements(t,e,"square"));const w=C.querySelectorAll("square-placement");w.length>0&&(this.log(`MutationObserver found ${w.length} square-placement in added node`),this.updateAfterpayPlacements(t,e,"square")),C.tagName==="KLARNA-PLACEMENT"&&(this.log("MutationObserver found new klarna-placement element"),this.updateKlarnaPlacements(t,e));const T=C.querySelectorAll("klarna-placement");T.length>0&&(this.log(`MutationObserver found ${T.length} klarna-placement in added node`),this.updateKlarnaPlacements(t,e))},S=C=>{b.observe(C,{attributes:!0,attributeFilter:["data-sl-pid"],attributeOldValue:!0,subtree:!1});const m=C.getAttribute("data-sl-pid");this.log(`Started AttributeObserver on specific input with data-sl-pid="${m}"`)},P=()=>{const C=document.querySelectorAll('input[name="properties[_slpt]"]');this.log(`Found ${C.length} existing hidden inputs to check`),C.forEach(m=>{const y=m.getAttribute("data-sl-pid");this.log(`Checking existing input with data-sl-pid="${y}"`),r(m)?(m.value=s,this.log("Updated existing hidden input:",s),y&&(this.log("Applying initial DOM selector changes for existing product"),p(y,h)),S(m)):y&&this.isProductInAnyPriceTest(y)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",y):(m.remove(),this.log("Removed non-matching hidden input for product ID:",y))})},_=()=>{document.body?(u.observe(document.body,{childList:!0,subtree:!0}),this.log("Started MutationObserver on document.body"),P(),k(document.body)):document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{document.body&&(u.observe(document.body,{childList:!0,subtree:!0}),this.log("Started MutationObserver after DOMContentLoaded"),P(),k(document.body))}):(this.log("Set timeout on observer"),setTimeout(_,10))};_(),window.__shopliftPriceTestObservers=n,window.__shopliftPriceTestValue=s,this.log("Set up DOM observer for price test hidden inputs")}catch(s){this.log("Error updating price test hidden inputs:",s)}}updateKlarnaPlacements(t,e){this.updatePlacementElements(t,e,"klarna-placement",(i,s)=>{i.setAttribute("data-purchase-amount",s.toString())})}cleanupPriceTestObservers(){const t=window.__shopliftPriceTestObservers;t&&(t.forEach(e=>{e.disconnect()}),t.clear(),this.log("Cleaned up existing price test observers")),delete window.__shopliftPriceTestObservers,delete window.__shopliftPriceTestValue}updateAfterpayPlacements(t,e,i="afterpay"){const s=i==="square"?"square-placement":"afterpay-placement";if(document.querySelectorAll(s).length===0){this.log(`No ${s} elements found on page - early return`);return}this.updatePlacementElements(t,e,s,(n,o)=>{if(i==="afterpay"){const l=(o/100).toFixed(2);n.setAttribute("data-amount",l)}else n.setAttribute("data-amount",o.toString())}),this.log("updateAfterpayPlacements completed")}updatePlacementElements(t,e,i,s){const r=document.querySelectorAll(i);if(r.length===0){this.log(`No ${i} elements found - early return`);return}let n;if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const l=e==="control"?"a":"b",c=this.state.temporary.previewConfig.variants.find(d=>d.label===l);if(!c?.domSelectors){this.log(`No variant found for label ${l} in preview config for ${i}`);return}n=c.domSelectors,this.log(`Using preview config for ${i} in merchant mode, variant: ${l}`)}else{const l=this.testConfigs.find(d=>d.id===t);if(!l){this.log(`No testConfig found for id: ${t} - early return`);return}const c=l.hypotheses.find(d=>e==="control"?d.isControl:!d.isControl);if(!c?.domSelectors){this.log(`No hypothesis or domSelectors found for assignment: ${e} - early return`);return}n=c.domSelectors}const o=new RegExp(`${this.DATA_SL_ATTRIBUTE_P}=["'](\\d+)["']`);r.forEach(l=>{let c=null;const d=l.parentElement;if(d&&(c=d.querySelector('input[name="properties[_slpt]"]')),c||(c=l.querySelector('input[name="properties[_slpt]"]')),!c){this.log(`No hidden input found for ${i} element`);return}const p=c.getAttribute("data-sl-pid");if(!p){this.log("Hidden input has no data-sl-pid attribute - skipping");return}const h=n.find(S=>{const P=S.cssSelector.match(o);return P&&P[1]===p});if(!h){this.log(`No matching selector found for productId: ${p} - skipping element`);return}const u=h.actions.find(S=>S.scope==="price");if(!u?.value){this.log("No price action or value found - skipping element");return}const b=parseFloat(u.value.replace(/[^0-9.]/g,""));if(Number.isNaN(b)){this.log(`Invalid price "${u.value}" for product ${p} - skipping`);return}const k=Math.round(b*100);s(l,k)}),this.log(`updatePlacementElements completed for ${i}`)}updateShopifyPaymentTerms(t,e){const i=document.querySelectorAll("shopify-payment-terms");if(i.length===0)return;this.log("Store using shopify payments");let s;if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const n=e==="control"?"a":"b",o=this.state.temporary.previewConfig.variants.find(l=>l.label===n);if(!o||!o.domSelectors){this.log(`No variant found for label ${n} in preview config`);return}s=o.domSelectors,this.log(`Using preview config for shopify-payment-terms in merchant mode, variant: ${n}`)}else{const n=this.testConfigs.find(l=>l.id===t);if(!n)return;const o=n.hypotheses.find(l=>e==="control"?l.isControl===!0:l.isControl===!1);if(!o||!o.domSelectors)return;s=o.domSelectors}const r=new RegExp(`${this.DATA_SL_ATTRIBUTE_P}=["'](\\d+)["']`);i.forEach(n=>{const o=n.getAttribute("variant-id");if(!o)return;const l=s.find(c=>{const d=c.cssSelector.match(r);return d&&d[1]===o});if(l){const c=l.actions.find(d=>d.scope==="price");if(c&&c.value){const d=n.getAttribute("shopify-meta");if(d)try{const p=JSON.parse(d);if(p.variants&&Array.isArray(p.variants)){const h=p.variants.find(u=>u.id?.toString()===o);if(h){h.full_price=c.value;const u=parseFloat(c.value.replace(/[^0-9.]/g,""));if(h.number_of_payment_terms&&h.number_of_payment_terms>1){const b=u/h.number_of_payment_terms;h.price_per_term=`$${b.toFixed(2)}`}n.setAttribute("shopify-meta",JSON.stringify(p))}}}catch(p){this.log("Error parsing/updating shoplift-meta:",p)}}}})}async makeJsonRequest(t){const e=await this.makeRequest(t);return e===null?null:JSON.parse(await e.text(),F)}async makeRequest(t){const{url:e,method:i,headers:s,data:r,signal:n}=t,o=new Headers;if(s)for(const c in s)o.append(c,s[c]);(!s||!s.Accept)&&o.append("Accept","application/json"),(!s||!s["Content-Type"])&&o.append("Content-Type","application/json"),(this.eventHost.includes("ngrok.io")||this.eventHost.includes("ngrok-free.app"))&&o.append("ngrok-skip-browser-warning","1234");const l=await this.fetch(e,{method:i,headers:o,body:r,signal:n});if(!l.ok){if(l.status===204)return null;if(l.status===422){const c=await l.json();if(typeof c<"u"&&c.isBot)throw new et}throw new Error(`Error sending shoplift request ${l.status}`)}return l}queueAddVisitorToTest(t,e){if(this.state.essential.visitorTests.some(s=>s.testId===t))return;const i=this.testConfigs.find(s=>s.id===t);if(this.state.essential.visitorTests.push({createdAt:new Date,testId:t,hypothesisId:e.id,isThemeTest:e.type==="theme",themeId:e.themeId,isSaved:!1,isInvalid:!1,shouldSendToGa:!0,testType:e.type,assignedTo:e.isControl?"control":"variant",testTitle:i?.title}),e.type==="price"){const s=e.isControl?"control":"variant";this.log("Price test assignment detected, updating cart attributes:",t,s),this.updatePriceTestHiddenInputs(t,s,!1)}}queueCartUpdate(t){this.queueEvent(new wt(t))}queuePageView(t){this.queueEvent(new vt(t))}queueEvent(t){!this.state.essential.consentApproved&&this.state.essential.hasConsentInteraction||this.state.analytics.queue.length>10||this.state.analytics.queue.push(t)}legacyGetLocalStorageVisitor(){const t=this.localStorageGet(this.legacySessionKey);if(t)try{return JSON.parse(t,F)}catch{}return null}pruneStaleVisitorTests(){this.state.essential.visitorTests=this.state.essential.visitorTests.filter(t=>this.testConfigs.some(e=>e.id==t.testId)||this.inactiveTestConfigs.filter(e=>this.testIsPaused(e)).some(e=>e.id===t.testId))}pruneStateAndSave(){this.pruneStaleVisitorTests(),this.saveState()}saveState(){this.persistEssentialState(),this.persistAnalyticsState()}loadState(){const t=this.loadAnalyticsState(),e={analytics:t,essential:this.loadEssentialState(t),temporary:this.loadTemporaryState()},i=this.legacyGetLocalStorageVisitor(),s=this.legacyGetCookieVisitor(),r=[i,s].filter(n=>n!==null).sort((n,o)=>+o.storedAt-+n.storedAt)[0];return e.analytics.visitor===null&&r&&({visitorTests:e.essential.visitorTests,...e.analytics.visitor}=r,e.essential.isFirstLoad=!1,e.essential.initialState={createdAt:r.createdAt,referrer:r.referrer,utmCampaign:r.utmCampaign,utmContent:r.utmContent,utmMedium:r.utmMedium,utmSource:r.utmSource,device:r.device},this.deleteCookie("SHOPLIFT"),this.deleteLocalStorage(this.legacySessionKey)),!e.essential.consentApproved&&e.essential.hasConsentInteraction&&this.deleteLocalStorage(this.analyticsSessionKey),e}loadEssentialState(t){const e=this.loadLocalStorage(this.essentialSessionKey),i=this.loadCookie(this.essentialSessionKey),s=this.getInitialState();t.visitor?.device&&(s.device=t.visitor.device);const r={timestamp:new Date,consentApproved:!1,hasConsentInteraction:!1,debugMode:!1,initialState:s,visitorTests:[],isFirstLoad:!0},n=[e,i].filter(o=>o!==null).sort((o,l)=>+l.timestamp-+o.timestamp)[0]??r;return n.initialState||(t.visitor!==null?n.initialState=t.visitor:(n.initialState=s,n.initialState.createdAt=n.timestamp)),n}loadAnalyticsState(){const t=this.loadLocalStorage(this.analyticsSessionKey),e=this.loadCookie(this.analyticsSessionKey),i={timestamp:new Date,visitor:null,queue:[]},s=[t,e].filter(r=>r!==null).sort((r,n)=>+n.timestamp-+r.timestamp)[0]??i;return s.queue.length===0&&t&&t.queue.length>1&&(s.queue=t.queue),s}loadTemporaryState(){const t=this.sessionStorageGet(this.temporarySessionKey),e=t?JSON.parse(t,F):null,i=this.loadCookie(this.temporarySessionKey);return e??i??{isMerchant:!1,timestamp:new Date}}persistEssentialState(){this.log("Persisting essential state"),this.state.essential.isFirstLoad=!1,this.state.essential.timestamp=new Date,this.persistLocalStorageState(this.essentialSessionKey,this.state.essential),this.persistCookieState(this.essentialSessionKey,this.state.essential)}persistAnalyticsState(){this.log("Persisting analytics state"),this.state.essential.consentApproved&&(this.state.analytics.timestamp=new Date,this.persistLocalStorageState(this.analyticsSessionKey,this.state.analytics),this.persistCookieState(this.analyticsSessionKey,{...this.state.analytics,queue:[]}))}persistTemporaryState(){this.log("Setting temporary session state"),this.state.temporary.timestamp=new Date,this.sessionStorageSet(this.temporarySessionKey,JSON.stringify(this.state.temporary)),this.persistCookieState(this.temporarySessionKey,this.state.temporary,!0)}loadLocalStorage(t){const e=this.localStorageGet(t);if(e===null)return null;try{return JSON.parse(e,F)}catch{return null}}loadCookie(t){const e=this.getCookie(t);if(e===null)return null;try{return JSON.parse(e,F)}catch{return null}}persistLocalStorageState(t,e){this.localStorageSet(t,JSON.stringify(e))}persistCookieState(t,e,i=!1){const s=JSON.stringify(e),r=i?"":`expires=${new Date(new Date().getTime()+864e5*365).toUTCString()};`;document.cookie=`${t}=${s};domain=.${window.location.hostname};path=/;SameSite=Strict;${r}`}deleteCookie(t){const e=new Date(0).toUTCString();document.cookie=`${t}=;domain=.${window.location.hostname};path=/;expires=${e};`}deleteLocalStorage(t){window.localStorage.removeItem(t)}getChannel(t){return[{"name":"cross-network","test":(v) => new RegExp(".*cross-network.*", "i").test(v.utmCampaign)},{"name":"direct","test":(v) => v.utmSource === "" && v.utmMedium === ""},{"name":"paid-shopping","test":(v) => (new RegExp("^(?:Google|IGShopping|aax-us-east\.amazon-adsystem\.com|aax\.amazon-adsystem\.com|alibaba|alibaba\.com|amazon|amazon\.co\.uk|amazon\.com|apps\.shopify\.com|checkout\.shopify\.com|checkout\.stripe\.com|cr\.shopping\.naver\.com|cr2\.shopping\.naver\.com|ebay|ebay\.co\.uk|ebay\.com|ebay\.com\.au|ebay\.de|etsy|etsy\.com|m\.alibaba\.com|m\.shopping\.naver\.com|mercadolibre|mercadolibre\.com|mercadolibre\.com\.ar|mercadolibre\.com\.mx|message\.alibaba\.com|msearch\.shopping\.naver\.com|nl\.shopping\.net|no\.shopping\.net|offer\.alibaba\.com|one\.walmart\.com|order\.shopping\.yahoo\.co\.jp|partners\.shopify\.com|s3\.amazonaws\.com|se\.shopping\.net|shop\.app|shopify|shopify\.com|shopping\.naver\.com|shopping\.yahoo\.co\.jp|shopping\.yahoo\.com|shopzilla|shopzilla\.com|simplycodes\.com|store\.shopping\.yahoo\.co\.jp|stripe|stripe\.com|uk\.shopping\.net|walmart|walmart\.com)$", "i").test(v.utmSource) || new RegExp("^(.*(([^a-df-z]|^)shop|shopping).*)$", "i").test(v.utmCampaign)) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-search","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-social","test":(v) => new RegExp("^(?:43things|43things\.com|51\.com|5ch\.net|Hatena|ImageShack|academia\.edu|activerain|activerain\.com|activeworlds|activeworlds\.com|addthis|addthis\.com|airg\.ca|allnurses\.com|allrecipes\.com|alumniclass|alumniclass\.com|ameba\.jp|ameblo\.jp|americantowns|americantowns\.com|amp\.reddit\.com|ancestry\.com|anobii|anobii\.com|answerbag|answerbag\.com|answers\.yahoo\.com|aolanswers|aolanswers\.com|apps\.facebook\.com|ar\.pinterest\.com|artstation\.com|askubuntu|askubuntu\.com|asmallworld\.com|athlinks|athlinks\.com|away\.vk\.com|awe\.sm|b\.hatena\.ne\.jp|baby-gaga|baby-gaga\.com|babyblog\.ru|badoo|badoo\.com|bebo|bebo\.com|beforeitsnews|beforeitsnews\.com|bharatstudent|bharatstudent\.com|biip\.no|biswap\.org|bit\.ly|blackcareernetwork\.com|blackplanet|blackplanet\.com|blip\.fm|blog\.com|blog\.feedspot\.com|blog\.goo\.ne\.jp|blog\.naver\.com|blog\.yahoo\.co\.jp|blogg\.no|bloggang\.com|blogger|blogger\.com|blogher|blogher\.com|bloglines|bloglines\.com|blogs\.com|blogsome|blogsome\.com|blogspot|blogspot\.com|blogster|blogster\.com|blurtit|blurtit\.com|bookmarks\.yahoo\.co\.jp|bookmarks\.yahoo\.com|br\.pinterest\.com|brightkite|brightkite\.com|brizzly|brizzly\.com|business\.facebook\.com|buzzfeed|buzzfeed\.com|buzznet|buzznet\.com|cafe\.naver\.com|cafemom|cafemom\.com|camospace|camospace\.com|canalblog\.com|care\.com|care2|care2\.com|caringbridge\.org|catster|catster\.com|cbnt\.io|cellufun|cellufun\.com|centerblog\.net|chat\.zalo\.me|chegg\.com|chicagonow|chicagonow\.com|chiebukuro\.yahoo\.co\.jp|classmates|classmates\.com|classquest|classquest\.com|co\.pinterest\.com|cocolog-nifty|cocolog-nifty\.com|copainsdavant\.linternaute\.com|couchsurfing\.org|cozycot|cozycot\.com|cross\.tv|crunchyroll|crunchyroll\.com|cyworld|cyworld\.com|cz\.pinterest\.com|d\.hatena\.ne\.jp|dailystrength\.org|deluxe\.com|deviantart|deviantart\.com|dianping|dianping\.com|digg|digg\.com|diigo|diigo\.com|discover\.hubpages\.com|disqus|disqus\.com|dogster|dogster\.com|dol2day|dol2day\.com|doostang|doostang\.com|dopplr|dopplr\.com|douban|douban\.com|draft\.blogger\.com|draugiem\.lv|drugs-forum|drugs-forum\.com|dzone|dzone\.com|edublogs\.org|elftown|elftown\.com|epicurious\.com|everforo\.com|exblog\.jp|extole|extole\.com|facebook|facebook\.com|faceparty|faceparty\.com|fandom\.com|fanpop|fanpop\.com|fark|fark\.com|fb|fb\.me|fc2|fc2\.com|feedspot|feministing|feministing\.com|filmaffinity|filmaffinity\.com|flickr|flickr\.com|flipboard|flipboard\.com|folkdirect|folkdirect\.com|foodservice|foodservice\.com|forums\.androidcentral\.com|forums\.crackberry\.com|forums\.imore\.com|forums\.nexopia\.com|forums\.webosnation\.com|forums\.wpcentral\.com|fotki|fotki\.com|fotolog|fotolog\.com|foursquare|foursquare\.com|free\.facebook\.com|friendfeed|friendfeed\.com|fruehstueckstreff\.org|fubar|fubar\.com|gaiaonline|gaiaonline\.com|gamerdna|gamerdna\.com|gather\.com|geni\.com|getpocket\.com|glassboard|glassboard\.com|glassdoor|glassdoor\.com|godtube|godtube\.com|goldenline\.pl|goldstar|goldstar\.com|goo\.gl|gooblog|goodreads|goodreads\.com|google\+|googlegroups\.com|googleplus|govloop|govloop\.com|gowalla|gowalla\.com|gree\.jp|groups\.google\.com|gulli\.com|gutefrage\.net|habbo|habbo\.com|hi5|hi5\.com|hootsuite|hootsuite\.com|houzz|houzz\.com|hoverspot|hoverspot\.com|hr\.com|hu\.pinterest\.com|hubculture|hubculture\.com|hubpages\.com|hyves\.net|hyves\.nl|ibibo|ibibo\.com|id\.pinterest\.com|identi\.ca|ig|imageshack\.com|imageshack\.us|imvu|imvu\.com|in\.pinterest\.com|insanejournal|insanejournal\.com|instagram|instagram\.com|instapaper|instapaper\.com|internations\.org|interpals\.net|intherooms|intherooms\.com|irc-galleria\.net|is\.gd|italki|italki\.com|jammerdirect|jammerdirect\.com|jappy\.com|jappy\.de|kaboodle\.com|kakao|kakao\.com|kakaocorp\.com|kaneva|kaneva\.com|kin\.naver\.com|l\.facebook\.com|l\.instagram\.com|l\.messenger\.com|last\.fm|librarything|librarything\.com|lifestream\.aol\.com|line|line\.me|linkedin|linkedin\.com|listal|listal\.com|listography|listography\.com|livedoor\.com|livedoorblog|livejournal|livejournal\.com|lm\.facebook\.com|lnkd\.in|m\.blog\.naver\.com|m\.cafe\.naver\.com|m\.facebook\.com|m\.kin\.naver\.com|m\.vk\.com|m\.yelp\.com|mbga\.jp|medium\.com|meetin\.org|meetup|meetup\.com|meinvz\.net|meneame\.net|menuism\.com|messages\.google\.com|messages\.yahoo\.co\.jp|messenger|messenger\.com|mix\.com|mixi\.jp|mobile\.facebook\.com|mocospace|mocospace\.com|mouthshut|mouthshut\.com|movabletype|movabletype\.com|mubi|mubi\.com|my\.opera\.com|myanimelist\.net|myheritage|myheritage\.com|mylife|mylife\.com|mymodernmet|mymodernmet\.com|myspace|myspace\.com|netvibes|netvibes\.com|news\.ycombinator\.com|newsshowcase|nexopia|ngopost\.org|niconico|nicovideo\.jp|nightlifelink|nightlifelink\.com|ning|ning\.com|nl\.pinterest\.com|odnoklassniki\.ru|odnoklassniki\.ua|okwave\.jp|old\.reddit\.com|oneworldgroup\.org|onstartups|onstartups\.com|opendiary|opendiary\.com|oshiete\.goo\.ne\.jp|out\.reddit\.com|over-blog\.com|overblog\.com|paper\.li|partyflock\.nl|photobucket|photobucket\.com|pinboard|pinboard\.in|pingsta|pingsta\.com|pinterest|pinterest\.at|pinterest\.ca|pinterest\.ch|pinterest\.cl|pinterest\.co\.kr|pinterest\.co\.uk|pinterest\.com|pinterest\.com\.au|pinterest\.com\.mx|pinterest\.de|pinterest\.es|pinterest\.fr|pinterest\.it|pinterest\.jp|pinterest\.nz|pinterest\.ph|pinterest\.pt|pinterest\.ru|pinterest\.se|pixiv\.net|pl\.pinterest\.com|playahead\.se|plurk|plurk\.com|plus\.google\.com|plus\.url\.google\.com|pocket\.co|posterous|posterous\.com|pro\.homeadvisor\.com|pulse\.yahoo\.com|qapacity|qapacity\.com|quechup|quechup\.com|quora|quora\.com|qzone\.qq\.com|ravelry|ravelry\.com|reddit|reddit\.com|redux|redux\.com|renren|renren\.com|researchgate\.net|reunion|reunion\.com|reverbnation|reverbnation\.com|rtl\.de|ryze|ryze\.com|salespider|salespider\.com|scoop\.it|screenrant|screenrant\.com|scribd|scribd\.com|scvngr|scvngr\.com|secondlife|secondlife\.com|serverfault|serverfault\.com|shareit|sharethis|sharethis\.com|shvoong\.com|sites\.google\.com|skype|skyrock|skyrock\.com|slashdot\.org|slideshare\.net|smartnews\.com|snapchat|snapchat\.com|social|sociallife\.com\.br|socialvibe|socialvibe\.com|spaces\.live\.com|spoke|spoke\.com|spruz|spruz\.com|ssense\.com|stackapps|stackapps\.com|stackexchange|stackexchange\.com|stackoverflow|stackoverflow\.com|stardoll\.com|stickam|stickam\.com|studivz\.net|suomi24\.fi|superuser|superuser\.com|sweeva|sweeva\.com|t\.co|t\.me|tagged|tagged\.com|taggedmail|taggedmail\.com|talkbiznow|talkbiznow\.com|taringa\.net|techmeme|techmeme\.com|tencent|tencent\.com|tiktok|tiktok\.com|tinyurl|tinyurl\.com|toolbox|toolbox\.com|touch\.facebook\.com|tr\.pinterest\.com|travellerspoint|travellerspoint\.com|tripadvisor|tripadvisor\.com|trombi|trombi\.com|trustpilot|tudou|tudou\.com|tuenti|tuenti\.com|tumblr|tumblr\.com|tweetdeck|tweetdeck\.com|twitter|twitter\.com|twoo\.com|typepad|typepad\.com|unblog\.fr|urbanspoon\.com|ushareit\.com|ushi\.cn|vampirefreaks|vampirefreaks\.com|vampirerave|vampirerave\.com|vg\.no|video\.ibm\.com|vk\.com|vkontakte\.ru|wakoopa|wakoopa\.com|wattpad|wattpad\.com|web\.facebook\.com|web\.skype\.com|webshots|webshots\.com|wechat|wechat\.com|weebly|weebly\.com|weibo|weibo\.com|wer-weiss-was\.de|weread|weread\.com|whatsapp|whatsapp\.com|wiki\.answers\.com|wikihow\.com|wikitravel\.org|woot\.com|wordpress|wordpress\.com|wordpress\.org|xanga|xanga\.com|xing|xing\.com|yahoo-mbga\.jp|yammer|yammer\.com|yelp|yelp\.co\.uk|yelp\.com|youroom\.in|za\.pinterest\.com|zalo|zoo\.gr|zooppa|zooppa\.com)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-video","test":(v) => new RegExp("^(?:blog\.twitch\.tv|crackle|crackle\.com|curiositystream|curiositystream\.com|d\.tube|dailymotion|dailymotion\.com|dashboard\.twitch\.tv|disneyplus|disneyplus\.com|fast\.wistia\.net|help\.hulu\.com|help\.netflix\.com|hulu|hulu\.com|id\.twitch\.tv|iq\.com|iqiyi|iqiyi\.com|jobs\.netflix\.com|justin\.tv|m\.twitch\.tv|m\.youtube\.com|music\.youtube\.com|netflix|netflix\.com|player\.twitch\.tv|player\.vimeo\.com|ted|ted\.com|twitch|twitch\.tv|utreon|utreon\.com|veoh|veoh\.com|viadeo\.journaldunet\.com|vimeo|vimeo\.com|wistia|wistia\.com|youku|youku\.com|youtube|youtube\.com)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"display","test":(v) => new RegExp("^(?:display|banner|expandable|interstitial|cpm)$", "i").test(v.utmMedium)},{"name":"paid-other","test":(v) => new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"organic-shopping","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) || new RegExp("^(.*(([^a-df-z]|^)shop|shopping).*)$", "i").test(v.utmCampaign)},{"name":"organic-social","test":(v) => new RegExp("^(?:43things|43things\.com|51\.com|5ch\.net|Hatena|ImageShack|academia\.edu|activerain|activerain\.com|activeworlds|activeworlds\.com|addthis|addthis\.com|airg\.ca|allnurses\.com|allrecipes\.com|alumniclass|alumniclass\.com|ameba\.jp|ameblo\.jp|americantowns|americantowns\.com|amp\.reddit\.com|ancestry\.com|anobii|anobii\.com|answerbag|answerbag\.com|answers\.yahoo\.com|aolanswers|aolanswers\.com|apps\.facebook\.com|ar\.pinterest\.com|artstation\.com|askubuntu|askubuntu\.com|asmallworld\.com|athlinks|athlinks\.com|away\.vk\.com|awe\.sm|b\.hatena\.ne\.jp|baby-gaga|baby-gaga\.com|babyblog\.ru|badoo|badoo\.com|bebo|bebo\.com|beforeitsnews|beforeitsnews\.com|bharatstudent|bharatstudent\.com|biip\.no|biswap\.org|bit\.ly|blackcareernetwork\.com|blackplanet|blackplanet\.com|blip\.fm|blog\.com|blog\.feedspot\.com|blog\.goo\.ne\.jp|blog\.naver\.com|blog\.yahoo\.co\.jp|blogg\.no|bloggang\.com|blogger|blogger\.com|blogher|blogher\.com|bloglines|bloglines\.com|blogs\.com|blogsome|blogsome\.com|blogspot|blogspot\.com|blogster|blogster\.com|blurtit|blurtit\.com|bookmarks\.yahoo\.co\.jp|bookmarks\.yahoo\.com|br\.pinterest\.com|brightkite|brightkite\.com|brizzly|brizzly\.com|business\.facebook\.com|buzzfeed|buzzfeed\.com|buzznet|buzznet\.com|cafe\.naver\.com|cafemom|cafemom\.com|camospace|camospace\.com|canalblog\.com|care\.com|care2|care2\.com|caringbridge\.org|catster|catster\.com|cbnt\.io|cellufun|cellufun\.com|centerblog\.net|chat\.zalo\.me|chegg\.com|chicagonow|chicagonow\.com|chiebukuro\.yahoo\.co\.jp|classmates|classmates\.com|classquest|classquest\.com|co\.pinterest\.com|cocolog-nifty|cocolog-nifty\.com|copainsdavant\.linternaute\.com|couchsurfing\.org|cozycot|cozycot\.com|cross\.tv|crunchyroll|crunchyroll\.com|cyworld|cyworld\.com|cz\.pinterest\.com|d\.hatena\.ne\.jp|dailystrength\.org|deluxe\.com|deviantart|deviantart\.com|dianping|dianping\.com|digg|digg\.com|diigo|diigo\.com|discover\.hubpages\.com|disqus|disqus\.com|dogster|dogster\.com|dol2day|dol2day\.com|doostang|doostang\.com|dopplr|dopplr\.com|douban|douban\.com|draft\.blogger\.com|draugiem\.lv|drugs-forum|drugs-forum\.com|dzone|dzone\.com|edublogs\.org|elftown|elftown\.com|epicurious\.com|everforo\.com|exblog\.jp|extole|extole\.com|facebook|facebook\.com|faceparty|faceparty\.com|fandom\.com|fanpop|fanpop\.com|fark|fark\.com|fb|fb\.me|fc2|fc2\.com|feedspot|feministing|feministing\.com|filmaffinity|filmaffinity\.com|flickr|flickr\.com|flipboard|flipboard\.com|folkdirect|folkdirect\.com|foodservice|foodservice\.com|forums\.androidcentral\.com|forums\.crackberry\.com|forums\.imore\.com|forums\.nexopia\.com|forums\.webosnation\.com|forums\.wpcentral\.com|fotki|fotki\.com|fotolog|fotolog\.com|foursquare|foursquare\.com|free\.facebook\.com|friendfeed|friendfeed\.com|fruehstueckstreff\.org|fubar|fubar\.com|gaiaonline|gaiaonline\.com|gamerdna|gamerdna\.com|gather\.com|geni\.com|getpocket\.com|glassboard|glassboard\.com|glassdoor|glassdoor\.com|godtube|godtube\.com|goldenline\.pl|goldstar|goldstar\.com|goo\.gl|gooblog|goodreads|goodreads\.com|google\+|googlegroups\.com|googleplus|govloop|govloop\.com|gowalla|gowalla\.com|gree\.jp|groups\.google\.com|gulli\.com|gutefrage\.net|habbo|habbo\.com|hi5|hi5\.com|hootsuite|hootsuite\.com|houzz|houzz\.com|hoverspot|hoverspot\.com|hr\.com|hu\.pinterest\.com|hubculture|hubculture\.com|hubpages\.com|hyves\.net|hyves\.nl|ibibo|ibibo\.com|id\.pinterest\.com|identi\.ca|ig|imageshack\.com|imageshack\.us|imvu|imvu\.com|in\.pinterest\.com|insanejournal|insanejournal\.com|instagram|instagram\.com|instapaper|instapaper\.com|internations\.org|interpals\.net|intherooms|intherooms\.com|irc-galleria\.net|is\.gd|italki|italki\.com|jammerdirect|jammerdirect\.com|jappy\.com|jappy\.de|kaboodle\.com|kakao|kakao\.com|kakaocorp\.com|kaneva|kaneva\.com|kin\.naver\.com|l\.facebook\.com|l\.instagram\.com|l\.messenger\.com|last\.fm|librarything|librarything\.com|lifestream\.aol\.com|line|line\.me|linkedin|linkedin\.com|listal|listal\.com|listography|listography\.com|livedoor\.com|livedoorblog|livejournal|livejournal\.com|lm\.facebook\.com|lnkd\.in|m\.blog\.naver\.com|m\.cafe\.naver\.com|m\.facebook\.com|m\.kin\.naver\.com|m\.vk\.com|m\.yelp\.com|mbga\.jp|medium\.com|meetin\.org|meetup|meetup\.com|meinvz\.net|meneame\.net|menuism\.com|messages\.google\.com|messages\.yahoo\.co\.jp|messenger|messenger\.com|mix\.com|mixi\.jp|mobile\.facebook\.com|mocospace|mocospace\.com|mouthshut|mouthshut\.com|movabletype|movabletype\.com|mubi|mubi\.com|my\.opera\.com|myanimelist\.net|myheritage|myheritage\.com|mylife|mylife\.com|mymodernmet|mymodernmet\.com|myspace|myspace\.com|netvibes|netvibes\.com|news\.ycombinator\.com|newsshowcase|nexopia|ngopost\.org|niconico|nicovideo\.jp|nightlifelink|nightlifelink\.com|ning|ning\.com|nl\.pinterest\.com|odnoklassniki\.ru|odnoklassniki\.ua|okwave\.jp|old\.reddit\.com|oneworldgroup\.org|onstartups|onstartups\.com|opendiary|opendiary\.com|oshiete\.goo\.ne\.jp|out\.reddit\.com|over-blog\.com|overblog\.com|paper\.li|partyflock\.nl|photobucket|photobucket\.com|pinboard|pinboard\.in|pingsta|pingsta\.com|pinterest|pinterest\.at|pinterest\.ca|pinterest\.ch|pinterest\.cl|pinterest\.co\.kr|pinterest\.co\.uk|pinterest\.com|pinterest\.com\.au|pinterest\.com\.mx|pinterest\.de|pinterest\.es|pinterest\.fr|pinterest\.it|pinterest\.jp|pinterest\.nz|pinterest\.ph|pinterest\.pt|pinterest\.ru|pinterest\.se|pixiv\.net|pl\.pinterest\.com|playahead\.se|plurk|plurk\.com|plus\.google\.com|plus\.url\.google\.com|pocket\.co|posterous|posterous\.com|pro\.homeadvisor\.com|pulse\.yahoo\.com|qapacity|qapacity\.com|quechup|quechup\.com|quora|quora\.com|qzone\.qq\.com|ravelry|ravelry\.com|reddit|reddit\.com|redux|redux\.com|renren|renren\.com|researchgate\.net|reunion|reunion\.com|reverbnation|reverbnation\.com|rtl\.de|ryze|ryze\.com|salespider|salespider\.com|scoop\.it|screenrant|screenrant\.com|scribd|scribd\.com|scvngr|scvngr\.com|secondlife|secondlife\.com|serverfault|serverfault\.com|shareit|sharethis|sharethis\.com|shvoong\.com|sites\.google\.com|skype|skyrock|skyrock\.com|slashdot\.org|slideshare\.net|smartnews\.com|snapchat|snapchat\.com|social|sociallife\.com\.br|socialvibe|socialvibe\.com|spaces\.live\.com|spoke|spoke\.com|spruz|spruz\.com|ssense\.com|stackapps|stackapps\.com|stackexchange|stackexchange\.com|stackoverflow|stackoverflow\.com|stardoll\.com|stickam|stickam\.com|studivz\.net|suomi24\.fi|superuser|superuser\.com|sweeva|sweeva\.com|t\.co|t\.me|tagged|tagged\.com|taggedmail|taggedmail\.com|talkbiznow|talkbiznow\.com|taringa\.net|techmeme|techmeme\.com|tencent|tencent\.com|tiktok|tiktok\.com|tinyurl|tinyurl\.com|toolbox|toolbox\.com|touch\.facebook\.com|tr\.pinterest\.com|travellerspoint|travellerspoint\.com|tripadvisor|tripadvisor\.com|trombi|trombi\.com|trustpilot|tudou|tudou\.com|tuenti|tuenti\.com|tumblr|tumblr\.com|tweetdeck|tweetdeck\.com|twitter|twitter\.com|twoo\.com|typepad|typepad\.com|unblog\.fr|urbanspoon\.com|ushareit\.com|ushi\.cn|vampirefreaks|vampirefreaks\.com|vampirerave|vampirerave\.com|vg\.no|video\.ibm\.com|vk\.com|vkontakte\.ru|wakoopa|wakoopa\.com|wattpad|wattpad\.com|web\.facebook\.com|web\.skype\.com|webshots|webshots\.com|wechat|wechat\.com|weebly|weebly\.com|weibo|weibo\.com|wer-weiss-was\.de|weread|weread\.com|whatsapp|whatsapp\.com|wiki\.answers\.com|wikihow\.com|wikitravel\.org|woot\.com|wordpress|wordpress\.com|wordpress\.org|xanga|xanga\.com|xing|xing\.com|yahoo-mbga\.jp|yammer|yammer\.com|yelp|yelp\.co\.uk|yelp\.com|youroom\.in|za\.pinterest\.com|zalo|zoo\.gr|zooppa|zooppa\.com)$", "i").test(v.utmSource) || new RegExp("^(?:social|social-network|social-media|sm|social network|social media)$", "i").test(v.utmMedium)},{"name":"organic-video","test":(v) => new RegExp("^(?:blog\.twitch\.tv|crackle|crackle\.com|curiositystream|curiositystream\.com|d\.tube|dailymotion|dailymotion\.com|dashboard\.twitch\.tv|disneyplus|disneyplus\.com|fast\.wistia\.net|help\.hulu\.com|help\.netflix\.com|hulu|hulu\.com|id\.twitch\.tv|iq\.com|iqiyi|iqiyi\.com|jobs\.netflix\.com|justin\.tv|m\.twitch\.tv|m\.youtube\.com|music\.youtube\.com|netflix|netflix\.com|player\.twitch\.tv|player\.vimeo\.com|ted|ted\.com|twitch|twitch\.tv|utreon|utreon\.com|veoh|veoh\.com|viadeo\.journaldunet\.com|vimeo|vimeo\.com|wistia|wistia\.com|youku|youku\.com|youtube|youtube\.com)$", "i").test(v.utmSource) || new RegExp("^(.*video.*)$", "i").test(v.utmMedium)},{"name":"organic-search","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) || v.utmMedium.toLowerCase() === "organic"},{"name":"referral","test":(v) => new RegExp("^(?:referral|app|link)$", "i").test(v.utmMedium)},{"name":"email","test":(v) => new RegExp("^(?:email|e-mail|e_mail|e mail)$", "i").test(v.utmMedium) || new RegExp("^(?:email|e-mail|e_mail|e mail)$", "i").test(v.utmSource)},{"name":"affiliate","test":(v) => v.utmMedium.toLowerCase() === "affiliate"},{"name":"audio","test":(v) => v.utmMedium.toLowerCase() === "audio"},{"name":"sms","test":(v) => v.utmSource.toLowerCase() === "sms" || v.utmMedium.toLowerCase() === "sms"},{"name":"mobile-push-notification","test":(v) => v.utmSource.toLowerCase() === "firebase" || new RegExp("(?:.*mobile.*|.*notification.*|push$)", "i").test(v.utmMedium)}].find(i=>i.test(t))?.name??"other"}getShopifyAnalyticsId(){const t=this.getCookie("_shopify_y");if(t)return t;try{const e=this.localStorageGet("Shoplift_ClientId");if(e)return e}catch{}return null}legacyGetCookieVisitor(){const t=this.getCookie("SHOPLIFT");return t===null?null:JSON.parse(t,F)}getCookie(t){const e=this.cookie.split("; ").filter(i=>i.split("=").at(0)===t).at(0);return e===void 0?null:e.split("=").slice(1).join("=")}monitorConsentChange(){document.addEventListener("visitorConsentCollected",t=>{(async()=>await this.onConsentChange(t.detail.analyticsAllowed,!0))()}),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>this.loadShopifyConsentApiWithRetry()):this.loadShopifyConsentApiWithRetry()}loadShopifyConsentApiWithRetry(){let t=0;const e=()=>{this.loadShopifyConsentApi()||t++<10&&window.setTimeout(e,100)};e()}loadShopifyConsentApi(){if(window.Shopify){this.log("Loading Shopify features");const t=async()=>{if(!window.Shopify){this.log("Shopify object missing... suddenly?");return}if(window.Shopify.customerPrivacy===void 0){this.log("Shopify CustomerPrivacy api still missing, trying again in 1000ms"),e=window.setTimeout(()=>{(async()=>await t())()},1e3);return}const i=window.Shopify.customerPrivacy.getTrackingConsent();await this.onConsentChange(window.Shopify.customerPrivacy.analyticsProcessingAllowed(),i==="yes")};let e=window.setTimeout(()=>{(async()=>await t())()},5e3);return window.Shopify.loadFeatures([{name:"consent-tracking-api",version:"0.1"}],i=>{(async()=>{if(window.clearTimeout(e),i){this.log("Error loading consent tracking",i);return}await t()})()}),!0}return!1}async onConsentChange(t,e){try{if(this.log("Consent change detected",t,e),this.state.essential.consentApproved=t,this.state.essential.hasConsentInteraction=e,!this.state.essential.consentApproved){this.state.essential.hasConsentInteraction&&(this.state.analytics.queue.length=0),this.saveState();return}this.cookie=document.cookie,this.shopifyAnalyticsId=this.getShopifyAnalyticsId();for(const i of this.state.analytics.queue.filter(s=>s.type===1||s.type===2)){const s=i;s.shopifyAnalyticsId=this.shopifyAnalyticsId}this.saveState(),await this.syncAllEvents()}catch(i){this.log("Error syncing on consent change",i)}}isThemePreview(){return isThemePreview||themeRole!=="main"}isAppProxyPath(){const t=["/apps/","/tools/","/a/"],e=window.location.pathname;return t.some(i=>e.startsWith(i))}clearThemeBar(t,e,i){const s=structuredClone(i);this.log("Looking for theme bar"),this.waitForElement(null,"body").then(r=>this.waitForElement(r,"#preview-bar-iframe, #PBarNextFrameWrapper").then(n=>(this.log("Found theme bar"),e&&(this.log("Removing theme bar"),n.remove()),t?this.makeRequest({url:`${this.eventHost}/api/v0/logs`,method:"post",data:JSON.stringify({...this.debugState(),stateAtEvaluation:s},X)}):Promise.resolve(null)))).catch(r=>console.error(r))}waitForElement(t,e){return new Promise(i=>{const s=document.querySelector(e);if(s){i(s);return}const r=new MutationObserver(n=>{const o=document.querySelector(e);if(o){r.disconnect(),i(o);return}});r.observe(t??document.documentElement,{childList:!0})})}setDebug(t){this.state.essential.debugMode=t,this.saveState()}log(t,...e){let i=0;const s=t.replace(/%[sdoOfF]/g,r=>{if(i>=e.length)return r;const n=e[i++];return r==="%o"||r==="%O"?JSON.stringify(n):String(n)});this.logHistory.push(`[${new Date().toISOString()}][SL] ${s}`),!(!this.state.essential.debugMode&&!this.shopliftDebug)&&console.debug(`[SL] ${t}`,...e)}debugState(){return{state:this.state,storage:{essential:this.loadLocalStorage(this.essentialSessionKey),analytics:this.loadLocalStorage(this.analyticsSessionKey)},params:{shop:this.shop,host:this.host,eventHost:this.eventHost,cssHideClass:this.cssHideClass,testConfigs:this.testConfigs,inactiveTestConfigs:this.inactiveTestConfigs,sendPageView:this.sendPageView,isShopifyMerchantCookie:this.getCookie("is_shopify_merchant"),themeId,url:window.location.href,isThemePreview,themeRole,gaConfig:this.gaConfig},logHistory:this.logHistory}}createViewportObserver(t,e={}){const{threshold:i=this.VIEWPORT_TRACK_THRESHOLD,triggerOnce:s=!0}=e,r=new Set;return new IntersectionObserver(n=>{n.forEach(o=>{if(o.isIntersecting&&!r.has(o.target)){const l=o.target,c=l.getAttribute(this.DATA_SL_TEST_ID);c&&(t(c,l),s&&r.add(l))}})},{threshold:i})}applyChangesWithViewport(t,e,i,s){const r=e.selectorsForViewportTracking??e.selectors,n=o=>{if(this.state.essential.visitorTests.some(h=>h.testId===o)||this.activeViewportObservers.has(o))return;const l=[];if(r.forEach(h=>{t.querySelectorAll(h.cssSelector).forEach(b=>l.push(b))}),l.length===0)return;let c=!1;const d=()=>{c||(c=!0,i(o),p.disconnect(),this.activeViewportObservers.delete(o))},p=this.createViewportObserver(()=>{d()},{triggerOnce:!0,...s});this.activeViewportObservers.set(o,p),this.log(`Created viewport observer for test ${o}, observing ${l.length} elements`),l.forEach(h=>{h.setAttribute(this.DATA_SL_TEST_ID,String(o)),p.observe(h)}),setTimeout(()=>{c||l.forEach(h=>{const u=h.getBoundingClientRect(),b=s?.threshold??this.VIEWPORT_TRACK_THRESHOLD,k=Math.min(u.bottom,window.innerHeight)-Math.max(u.top,0),S=Math.min(u.right,window.innerWidth)-Math.max(u.left,0);u.top<window.innerHeight&&u.bottom>0&&u.left<window.innerWidth&&u.right>0&&k>0&&S>0&&k>=u.height*b&&(this.log(`Price element already visible in viewport for test ${o}:`,h),d())})},100)};e.selectors.length>0&&N(t,e,()=>{}),bt(t,{testId:e.testId,hypothesisId:e.hypothesisId,selectors:r},o=>{n(o)})}applyPriceTestWithMapLookup(t,e,i,s){if(!e.priceData){this.log("No price data for hypothesis '%s'",e.id);return}this.log("Hypothesis '%s' isControl=%s, priceData has %d variants",e.id,e.isControl,e.priceData.variants.length);const r=e.priceData.variants.slice(0,3);for(const[S,P,_]of r)this.log("  Sample priceData: variant=%s, price=%d, compareAt=%d",S,P,_);const n=j(e.priceData),o=new Set;for(const S of i)if(S.priceData)for(const[P]of S.priceData.variants)o.add(P);this.log("Price test Map lookup: %d products in hypothesis, %d total products to track",n.size,o.size);const l=e.priceData,c=new WeakSet;let d=!1;const p="[data-sl-attribute-p], [data-sl-attribute-cap], [data-sl-attribute-discount]",h=S=>{if(c.has(S))return;const P=S.getAttribute("data-sl-attribute-p"),_=S.getAttribute("data-sl-attribute-cap"),C=S.getAttribute("data-sl-attribute-discount"),m=P||_||C;if(!m||!o.has(m))return;c.add(S);const y=n.get(m);y&&(this.log("Applying price for product %s: %d cents (compare at: %d cents)",m,y.priceInCents,y.compareAtPriceInCents),Dt(S,m,y,l),this.log("Applied price to element for product %s",m)),!d&&!this.state.essential.visitorTests.some(w=>w.testId===t)&&(S.setAttribute(this.DATA_SL_TEST_ID,String(t)),this.setupElementViewportTracking(S,t,()=>{d||(d=!0,s(t))}))},u=()=>{const S=document.querySelectorAll(p);this.log("Scanning for price elements, found: %d",S.length),S.forEach(h)},b=new MutationObserver(S=>{for(const P of S)P.type==="childList"&&P.addedNodes.forEach(_=>{if(_.nodeType===Node.ELEMENT_NODE){const C=_;(C.hasAttribute("data-sl-attribute-p")||C.hasAttribute("data-sl-attribute-cap")||C.hasAttribute("data-sl-attribute-discount"))&&h(C),C.querySelectorAll(p).forEach(h)}}),P.type==="attributes"&&P.target instanceof Element&&h(P.target)}),k=document.body||document.documentElement;b.observe(k,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-sl-attribute-p","data-sl-attribute-cap","data-sl-attribute-discount"]}),this.log("MutationObserver started for price elements"),u(),document.readyState==="loading"&&document.addEventListener("DOMContentLoaded",()=>{this.log("DOMContentLoaded - rescanning for price elements"),u()}),setTimeout(()=>{this.log("Delayed rescan for price elements"),u()},100),setTimeout(()=>{this.log("Final rescan for price elements"),u()},500)}setupElementViewportTracking(t,e,i){const s=this.VIEWPORT_TRACK_THRESHOLD,r=t.getBoundingClientRect(),n=Math.min(r.bottom,window.innerHeight)-Math.max(r.top,0),o=Math.min(r.right,window.innerWidth)-Math.max(r.left,0);if(r.top<window.innerHeight&&r.bottom>0&&r.left<window.innerWidth&&r.right>0&&n>0&&o>0&&n>=r.height*s){this.log("Price element already visible for test %s",e),i();return}const c=new IntersectionObserver(d=>{for(const p of d)if(p.isIntersecting&&p.intersectionRatio>=s){this.log("Price element entered viewport for test %s",e),c.disconnect(),i();break}},{threshold:s});c.observe(t)}debug(){const t=this.debugState();console.log(JSON.stringify(t,X,2))}}(async function(){window.shopliftInstance||(window.shopliftInstance=new Wt("respirecosmetic.myshopify.com","https://app.shoplift.ai","https://events.shoplift.ai",true,false,false,{"sendEvents":false,"mode":"gtag"},false,false,1000,[{"id":"019dd448-1553-753c-b435-686218b29699","startAt":"2026-04-28T13:29:47.089029Z","requiresCountry":false,"bayesianRevision":5,"device":"all","status":"active","visitorOption":"new","ignoreTestViewParameterEnforcement":false,"statusHistory":[{"status":"active","createdAt":"2026-04-28T13:29:47.095512Z"}],"hypotheses":[{"visitorCount":3213,"trafficPercentage":0.3406334830774913,"title":"Soin Levres Collagene Booster","domSelectors":[],"id":"019dd43f-483b-79f9-b492-39deac94c71c","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":true,"redirectPath":"/pages/soin-levres-collagene-booster-1"},{"visitorCount":6219,"trafficPercentage":0.6593665169225087,"title":"PDP SLSPF","domSelectors":[],"id":"019dd440-1bc6-7ec2-8a25-3869c58bc05a","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":false,"redirectPath":"/products/soin-levres-collagene-booster"}],"targetAudiences":[],"title":"LP vs PDP Soin Lèvres"},{"id":"019e74f9-1ea1-7d45-8a70-8add8cc82de2","startAt":"2026-05-29T18:22:23.876543Z","requiresCountry":false,"bayesianRevision":5,"device":"all","status":"active","visitorOption":"all","ignoreTestViewParameterEnforcement":false,"statusHistory":[{"status":"active","createdAt":"2026-05-29T18:22:23.982802Z"}],"hypotheses":[{"visitorCount":5100,"trafficPercentage":0.5013226211210324,"title":"Nouveauté - Daily Protect","domSelectors":[],"id":"019e74f8-17c8-7bec-98fd-f3061d66dc30","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":true,"redirectPath":"/pages/nouveaute-daily-protect"},{"visitorCount":5073,"trafficPercentage":0.4986773788789675,"title":"Trio Haute Protection Solaire","domSelectors":[],"id":"019e74f8-f6a2-7f03-84b3-14f382d4f320","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":false,"redirectPath":"/products/trio-haute-protection"}],"targetAudiences":[],"title":"Untitled URL test"},{"id":"019f04b7-ca07-7499-bfbe-8f3e510f2900","startAt":"2026-06-26T16:16:21.486127Z","requiresCountry":false,"bayesianRevision":5,"device":"all","status":"active","visitorOption":"all","ignoreTestViewParameterEnforcement":false,"statusHistory":[{"status":"active","createdAt":"2026-06-26T16:16:21.559694Z"}],"hypotheses":[{"visitorCount":2,"trafficPercentage":0.737179487179487,"title":"Déodorant stick Vanille Tonka","domSelectors":[],"id":"019f04b7-540b-701f-96f1-ca718cee01e4","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":true,"redirectPath":"/products/deodorant-stick-vanille-tonka-1"},{"visitorCount":1,"trafficPercentage":0.26282051282051294,"title":"Kit Découverte Déodorant stick Vanille Tonka","domSelectors":[],"id":"019f04b7-7c0b-7756-9e08-80b8657f5429","type":"urlRedirect","themeId":181964374352,"affix":"","isControl":false,"redirectPath":"/products/kit-decouverte-deodorant-stick-vanille-tonka"}],"targetAudiences":[],"title":"Untitled URL test"}],[{"id":"b34beb01-8e98-4647-bc5c-e6de002d3bc7","bayesianRevision":4,"status":"cancelled","hypotheses":[{"id":"25225939-1d3c-4bc7-bc65-a8fd8ddd401a","type":"theme","themeId":168474706256,"affix":"","isControl":true,"redirectPath":null},{"id":"a65de22d-0a0b-411b-9e46-2cee437ca994","type":"theme","themeId":177900945744,"affix":"","isControl":false,"redirectPath":null}],"ignoreTestViewParameterEnforcement":false}],null),await window.shopliftInstance.init())})();async function Gt(a,t,e,i){const s=Mt({log:i});if(e)return i("[SUB-PREVIEW] A side — no overlay applied; widget renders naturally"),s;const r=a.widget.widgetType,n=t?j(t):null;let o=W(t),l=K(a,o),c=l.discountMap,d=l.maxDiscount;function p(){const f=W(t);f!==o&&(o=f,l=K(a,o),c=l.discountMap,d=l.maxDiscount,i(`[SUB-PREVIEW] scope refreshed currentProductId=${o??"n/a"}, maxDiscount=${d}`))}i(`[SUB-PREVIEW] side=B, currentProductId=${o??"n/a"}, maxDiscount=${d}`);function h(f){if(!t||!n)return null;const v=Y(n),g=v?n.get(v):void 0;return g?{formattedVariantPrice:G(g.priceInCents,t),formattedDiscounted:G(g.priceInCents*(1-f/100),t)}:null}function u(f){const v=J(a,f);if(!v)return d;const g=D(a,"subscriptionInput"),I=g.length?g[0].selector:'input[name="rc_plan"]',A=v.querySelector(`${I}:checked`);if(A){const E=c[A.value];if(E!==void 0)return E}return d}function b(f){const v=D(a,"subscriptionDiscount");for(const g of v)if(g.selector.includes("badge")||g.selector.includes("__badge")){const I=f.querySelector(g.selector);I?.textContent&&!I.textContent.includes(`${d}%`)&&$(I,A=>U(A,d))}}function k(f,v){const g=h(v);if(!g)return;const I=D(a,"subscriptionCompareAt");for(const A of I){const E=f.querySelector(A.selector)||f.querySelector(`[part~="${A.selector}"]`);E?.textContent&&!E.textContent.includes(g.formattedVariantPrice)&&$(E,x=>/\d/.test(x)?g.formattedVariantPrice:x)}}function S(f,v){const g=h(v);if(!g)return;const I=D(a,"subscriptionPrice");for(const A of I){const E=f.querySelector(A.selector)||f.querySelector(`[part~="${A.selector}"]`);E?.textContent&&!E.textContent.includes(g.formattedDiscounted)&&$(E,x=>/\d/.test(x)?g.formattedDiscounted:x)}}function P(f){const v=D(a,"subscriptionInput"),g=v.length?v[0].selector:'input[name="rc_plan"]',I=D(a,"subscriptionPlanDiscount"),A=I.length?I[0].selector:".rc-plans-button__discount";for(const E of Array.from(f.querySelectorAll("label"))){const x=E.querySelector(g),R=E.querySelector(A);if(x&&R?.textContent){const V=c[x.value];if(V!==void 0){const O=R.textContent.match(/[\d.]+%/)?.[0];O&&O!==`${V}%`&&$(R,L=>U(L,V))}}}}function _(f){const v=f.querySelector("select");if(v)for(const g of Array.from(v.options)){const I=c[g.value];if(I!==void 0&&g.textContent){const A=g.textContent.match(/[\d.]+%/)?.[0];A&&A!==`${I}%`&&(g.textContent=U(g.textContent,I))}}}function C(f){const v=D(a,"onetimePrice");if(!v.length||!t||!n)return;const g=Y(n),I=g?n.get(g):void 0;if(!I)return;const A=G(I.priceInCents,t),E=D(a,"onetimeContainer"),x=E.length?E[0].selector:'[part~="rc-purchase-option__onetime"]',R=f.querySelector(x);if(R)for(const V of v){const O=R.querySelector(`[part~="${V.selector}"]`);O?.textContent&&!O.textContent.includes(A)&&$(O,L=>/\d/.test(L)?A:L)}}function m(f,v){const I=D(a,"subscriptionDiscount").filter(A=>A.selector.includes("benefit")||A.selector==="rc-benefits");for(const A of I){const E=f.querySelector(A.selector);if(E?.shadowRoot){for(const x of Array.from(E.shadowRoot.querySelectorAll("li")))if(x.textContent?.includes("Save")){const R=x.textContent.match(/[\d.]+%/)?.[0];R&&R!==`${v}%`&&$(x,V=>U(V,v))}}}}let y=!1;function w(){if(!y){y=!0;try{p();const f=B(a);if(!f)return;const v=u(f);b(f),k(f,v),S(f,v),C(f);const g=J(a,f);g&&(r==="buttons"||r==="radio"?P(g):_(g)),m(f,v)}finally{y=!1}}}const T=dt({data:a,runUpdates:w});return function(){T(),s()}}const jt=Object.freeze(Object.defineProperty({__proto__:null,subscriptionPreviewRender:Gt},Symbol.toStringTag,{value:"Module"}))})(); })("/", { suffix: "deodorants", type: "collection" }, "main", 181964374352, false)</script>
 <script>
 function gtag() {
 dataLayer.push(arguments)
 }
 </script><script type="text/javascript">
 ;(function (c, l, a, r, i, t, y) {
 c[a] =
 c[a] ||
 function () {
 ;(c[a].q = c[a].q || []).push(arguments)
 }
 t = l.createElement(r)
 t.async = 1
 t.src = 'https://www.clarity.ms/tag/' + i
 y = l.getElementsByTagName(r)[0]
 y.parentNode.insertBefore(t, y)
 })(window, document, 'clarity', 'script', 'p523tawel4')
 </script><meta name="google-site-verification" content="mKRo0x2xDrbsdIGKtqDyA39U_1VDTdGWleZFq2RwSrE">
 
 
 
 
 
 
 
 
<meta charset='utf-8'><meta name='viewport' content='width=device-width, initial-scale=1.0, viewport-fit=cover'><link rel='preconnect' href='https://cdn.shopify.com' crossorigin><link rel='canonical' href='https://respire.co/collections/deodorant'>

 <link
 fetchpriority='low'
 rel='icon'
 href='//respire.co/cdn/shop/t/228/assets/favicon.ico?v=42717616766127010781774023232'
 sizes='32x32'
 >

<title>
 Déodorants Naturels Efficaces | Respire
</title><meta name='description' content='Protégez votre peau avec notre gamme de déodorants naturels et efficaces. Profitez d’une protection durable pour votre confort quotidien.'><meta property='og:type' content='website'><meta property='og:title' content='Déodorants Naturels Efficaces | Respire'><meta property='og:image' content='http://respire.co/cdn/shop/t/228/assets/og.png?v=174100751898724784411774023239'><meta property='og:image:secure_url' content='https://respire.co/cdn/shop/t/228/assets/og.png?v=174100751898724784411774023239'><meta property='og:description' content='Protégez votre peau avec notre gamme de déodorants naturels et efficaces. Profitez d’une protection durable pour votre confort quotidien.'><meta property='og:url' content='https://respire.co/collections/deodorant'><meta property='og:site_name' content='Respire'><meta name='twitter:site' content='@twitter_handler'>

 <meta name="twitter:image" content="//respire.co/cdn/shop/t/228/assets/og.png?v=174100751898724784411774023239" />
<script>
 window.dataLayer = window.dataLayer || []
</script>
<link
 rel="preload"
 href="//respire.co/cdn/shop/t/228/assets/Scto%20Grotesk%20B%20Regular.woff2?v=144161535954484128651774023245"
 as="font"
 type="font/woff2"
 crossorigin="anonymous"
><link
 rel="preload"
 href="//respire.co/cdn/shop/t/228/assets/Scto%20Grotesk%20B%20Bold.woff2?v=107241506801649613911774023243"
 as="font"
 type="font/woff2"
 crossorigin="anonymous"
><link
 rel="preload"
 href="//respire.co/cdn/shop/t/228/assets/Scto%20Grotesk%20B%20Black.woff2?v=51219979415213016821774023241"
 as="font"
 type="font/woff2"
 crossorigin="anonymous"
><link
 rel="preload"
 href="//respire.co/cdn/shop/t/228/assets/subset-CheltenhamLT-LightCond.woff2?v=57196317716993214541774023247"
 as="font"
 type="font/woff2"
 crossorigin="anonymous"
><link
 rel="preload"
 href="//respire.co/cdn/shop/t/228/assets/subset-CheltenhamLT-LightCondItalic.woff2?v=18728925879069876201774023249"
 as="font"
 type="font/woff2"
 crossorigin="anonymous"
><link rel="preload" href="//respire.co/cdn/shop/t/228/assets/icons.woff2?v=183111132589761959321774023234" as="font" type="font/woff2" crossorigin="anonymous">

<style>
 @font-face {
 font-family: 'Scto Grotesk B';
 src: url("//respire.co/cdn/shop/t/228/assets/Scto%20Grotesk%20B%20Regular.woff2?v=144161535954484128651774023245") format('woff2');
 font-weight: normal;
 font-style: normal;
 font-display: swap;
 }
 @font-face {
 font-family: 'Scto Grotesk B';
 src: url("//respire.co/cdn/shop/t/228/assets/Scto%20Grotesk%20B%20Bold.woff2?v=107241506801649613911774023243") format('woff2');
 font-weight: bold;
 font-style: normal;
 font-display: swap;
 }
 @font-face {
 font-family: 'Scto Grotesk B';
 src: url("//respire.co/cdn/shop/t/228/assets/Scto%20Grotesk%20B%20Black.woff2?v=51219979415213016821774023241") format('woff2');
 font-weight: 900;
 font-style: normal;
 font-display: swap;
 }
 @font-face {
 font-family: 'ITCCheltenham LT';
 src: url("//respire.co/cdn/shop/t/228/assets/subset-CheltenhamLT-LightCond.woff2?v=57196317716993214541774023247") format('woff2');
 font-weight: 300;
 font-style: normal;
 font-display: swap;
 }
 @font-face {
 font-family: 'ITCCheltenham LT';
 src: url("//respire.co/cdn/shop/t/228/assets/subset-CheltenhamLT-LightCondItalic.woff2?v=18728925879069876201774023249") format('woff2');
 font-weight: 300;
 font-style: italic;
 font-display: swap;
 }
 @font-face {
 font-family: 'Icons';
 src: url("//respire.co/cdn/shop/t/228/assets/icons.woff2?v=183111132589761959321774023234") format('woff2');
 font-display: swap;
 }
</style>


  <script src="//respire.co/cdn/shop/t/228/assets/main.CpL5sZdz.js" type="module" crossorigin="anonymous"></script>
  <link href="//respire.co/cdn/shop/t/228/assets/main.CSGoFG29.css" rel="stylesheet" type="text/css" media="all" />



<script>
 window.translations = {
 geo_ip_stay_on_current_site:
 "Non, rester sur le site [current_country_name]",
 geo_ip_go_to_detected_site:
 "Oui, aller sur le site [detected_country_name]",
 geo_ip_message_html:
 "Votre emplacement est défini sur [country_name] mais vous êtes sur le site [current_country_name]. Pour continuer vos achats en [currency_iso_code] [currency_symbol] veuillez cliquer sur continuer, sinon veuillez choisir votre localisation."
 }
</script>
<script>
 window.money_format = '{{amount_with_comma_separator}}€';
 window.country = 'France';
 window.availableCountries = [{
 name: "Algérie",
 iso_code: "DZ",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Allemagne",
 iso_code: "DE",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Australie",
 iso_code: "AU",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Autriche",
 iso_code: "AT",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Belgique",
 iso_code: "BE",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Canada",
 iso_code: "CA",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Chine",
 iso_code: "CN",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Chypre",
 iso_code: "CY",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Corée du Sud",
 iso_code: "KR",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Danemark",
 iso_code: "DK",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Espagne",
 iso_code: "ES",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Estonie",
 iso_code: "EE",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "États-Unis",
 iso_code: "US",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Finlande",
 iso_code: "FI",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "France",
 iso_code: "FR",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Grèce",
 iso_code: "GR",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Guadeloupe",
 iso_code: "GP",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Guyane française",
 iso_code: "GF",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Hongrie",
 iso_code: "HU",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Inde",
 iso_code: "IN",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Irlande",
 iso_code: "IE",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Islande",
 iso_code: "IS",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Israël",
 iso_code: "IL",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Italie",
 iso_code: "IT",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Japon",
 iso_code: "JP",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "La Réunion",
 iso_code: "RE",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Lettonie",
 iso_code: "LV",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Lituanie",
 iso_code: "LT",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Luxembourg",
 iso_code: "LU",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Maroc",
 iso_code: "MA",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Martinique",
 iso_code: "MQ",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Maurice",
 iso_code: "MU",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Mayotte",
 iso_code: "YT",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Monaco",
 iso_code: "MC",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Norvège",
 iso_code: "NO",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Nouvelle-Calédonie",
 iso_code: "NC",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Nouvelle-Zélande",
 iso_code: "NZ",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Pays-Bas",
 iso_code: "NL",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Pologne",
 iso_code: "PL",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Polynésie française",
 iso_code: "PF",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Portugal",
 iso_code: "PT",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "R.A.S. chinoise de Hong Kong",
 iso_code: "HK",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Royaume-Uni",
 iso_code: "GB",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Russie",
 iso_code: "RU",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Saint-Barthélemy",
 iso_code: "BL",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Saint-Martin",
 iso_code: "MF",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Saint-Pierre-et-Miquelon",
 iso_code: "PM",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Singapour",
 iso_code: "SG",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Slovaquie",
 iso_code: "SK",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Slovénie",
 iso_code: "SI",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Suède",
 iso_code: "SE",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Suisse",
 iso_code: "CH",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Tchéquie",
 iso_code: "CZ",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Terres australes françaises",
 iso_code: "TF",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Thaïlande",
 iso_code: "TH",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Tunisie",
 iso_code: "TN",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Turquie",
 iso_code: "TR",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Viêt Nam",
 iso_code: "VN",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 },{
 name: "Wallis-et-Futuna",
 iso_code: "WF",
 currency: {
 iso_code: "EUR",
 symbol: "€",
 },
 }];
</script><script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script><meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/6910672978/digital_wallets/dialog">
<meta name="shopify-checkout-api-token" content="49d155fceae83b8ae7f15844e5181652">
<meta id="in-context-paypal-metadata" data-shop-id="6910672978" data-venmo-supported="false" data-environment="production" data-locale="fr_FR" data-paypal-v4="true" data-currency="EUR">
<link rel="alternate" type="application/atom+xml" title="Feed" href="/collections/deodorant.atom" />
<link rel="next" href="/collections/deodorant?page=2">
<link rel="alternate" hreflang="x-default" href="https://respire.co/collections/deodorant">
<link rel="alternate" hreflang="fr" href="https://respire.co/collections/deodorant">
<link rel="alternate" hreflang="es" href="https://respire.co/es/collections/desodorante">
<link rel="alternate" hreflang="it" href="https://respire.co/it/collections/deodorante">
<link rel="alternate" hreflang="es-ES" href="https://es.respire.co/collections/desodorante">
<link rel="alternate" hreflang="it-ES" href="https://es.respire.co/it/collections/deodorante">
<link rel="alternate" hreflang="fr-ES" href="https://es.respire.co/fr/collections/deodorant">
<link rel="alternate" hreflang="it-IT" href="https://it.respire.co/collections/deodorante">
<link rel="alternate" hreflang="es-IT" href="https://it.respire.co/es/collections/desodorante">
<link rel="alternate" hreflang="fr-IT" href="https://it.respire.co/fr/collections/deodorant">
<link rel="alternate" type="application/json+oembed" href="https://respire.co/collections/deodorant.oembed">
<script async="async" src="/checkouts/internal/preloads.js?locale=fr-FR&configuration_id=3611820368"></script>
<link rel="preconnect" href="https://shop.app" crossorigin="anonymous">
<script async="async" src="https://shop.app/checkouts/internal/preloads.js?locale=fr-FR&configuration_id=3611820368&shop_id=6910672978" crossorigin="anonymous"></script>
<script id="apple-pay-shop-capabilities" type="application/json">{"shopId":6910672978,"countryCode":"FR","currencyCode":"EUR","merchantCapabilities":["supports3DS"],"merchantId":"gid:\/\/shopify\/Shop\/6910672978","merchantName":"Respire","requiredBillingContactFields":["postalAddress","email","phone"],"requiredShippingContactFields":["postalAddress","email","phone"],"shippingType":"shipping","supportedNetworks":["visa","masterCard","amex","maestro"],"total":{"type":"pending","label":"Respire","amount":"1.00"},"shopifyPaymentsEnabled":true,"supportsSubscriptions":true}</script>
<script id="shopify-features" type="application/json">{"accessToken":"49d155fceae83b8ae7f15844e5181652","betas":["rich-media-storefront-analytics"],"domain":"respire.co","predictiveSearch":true,"shopId":6910672978,"locale":"fr"}</script>
<script>var Shopify = Shopify || {};
Shopify.shop = "respirecosmetic.myshopify.com";
Shopify.locale = "fr";
Shopify.currency = {"active":"EUR","rate":"1.0"};
Shopify.country = "FR";
Shopify.theme = {"name":"release\/daily-protect-22-mars","id":181964374352,"schema_name":"bootstrap","schema_version":"0.1.0","theme_store_id":null,"role":"main"};
Shopify.theme.handle = "null";
Shopify.theme.style = {"id":null,"handle":null};
Shopify.cdnHost = "respire.co/cdn";
Shopify.routes = Shopify.routes || {};
Shopify.routes.root = "/";
Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js";
Shopify.SignInWithShop = Shopify.SignInWithShop || {};
Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {};
Shopify.SignInWithShop.User.recognized = false;</script>
<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
<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>
<script>
  window.ShopifyPay = window.ShopifyPay || {};
  window.ShopifyPay.apiHost = "shop.app\/pay";
  window.ShopifyPay.redirectState = null;
</script>
<script>
  window.Shopify = window.Shopify || {};
  window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {};
  window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.01 };
  window.Shopify.SignInWithShop.eligible = true;
</script>
<script id="shop-js-analytics" type="application/json">{"pageType":"collection"}</script>
<script defer="defer" async type="module" src="//respire.co/cdn/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.fr.esm.js"></script>
<script type="module">
  await import("//respire.co/cdn/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.fr.esm.js");

  window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true,"transferSessionEnabled":true});

</script>
<script>
  window.Shopify = window.Shopify || {};
  if (!window.Shopify.featureAssets) window.Shopify.featureAssets = {};
  window.Shopify.featureAssets['shop-js'] = {"shop-toast-manager":["modules/v2/loader.shop-toast-manager.fr.esm.js"],"listener":["modules/v2/loader.listener.fr.esm.js"],"init-shop-user-recognition":["modules/v2/loader.init-shop-user-recognition.fr.esm.js"],"shop-cash-offers":["modules/v2/loader.shop-cash-offers.fr.esm.js"],"init-windoid":["modules/v2/loader.init-windoid.fr.esm.js"],"init-fed-cm":["modules/v2/loader.init-fed-cm.fr.esm.js"],"avatar":["modules/v2/loader.avatar.fr.esm.js"],"checkout-modal":["modules/v2/loader.checkout-modal.fr.esm.js"],"init-shop-email-lookup-coordinator":["modules/v2/loader.init-shop-email-lookup-coordinator.fr.esm.js"],"shop-button":["modules/v2/loader.shop-button.fr.esm.js"],"init-customer-accounts-sign-up":["modules/v2/loader.init-customer-accounts-sign-up.fr.esm.js"],"shop-user-recognition":["modules/v2/loader.shop-user-recognition.fr.esm.js"],"init-shop-cart-sync":["modules/v2/loader.init-shop-cart-sync.fr.esm.js"],"shop-login-button":["modules/v2/loader.shop-login-button.fr.esm.js"],"init-customer-accounts":["modules/v2/loader.init-customer-accounts.fr.esm.js"],"pay-button":["modules/v2/loader.pay-button.fr.esm.js"],"shop-follow-button":["modules/v2/loader.shop-follow-button.fr.esm.js"],"shop-cart-sync":["modules/v2/loader.shop-cart-sync.fr.esm.js"],"shop-login":["modules/v2/loader.shop-login.fr.esm.js"],"init-shop-for-new-customer-accounts":["modules/v2/loader.init-shop-for-new-customer-accounts.fr.esm.js"],"lead-capture":["modules/v2/loader.lead-capture.fr.esm.js"],"payment-terms":["modules/v2/loader.payment-terms.fr.esm.js"]};
</script>
<script>(function() {
  var isLoaded = false;
  function asyncLoad() {
    if (isLoaded) return;
    isLoaded = true;
    var urls = ["https:\/\/cdn.shipup.co\/latest_v2\/shipup-shopify.js?shop=respirecosmetic.myshopify.com","https:\/\/d23dclunsivw3h.cloudfront.net\/redirect-app.js?shop=respirecosmetic.myshopify.com","https:\/\/static.rechargecdn.com\/assets\/js\/widget.min.js?shop=respirecosmetic.myshopify.com","https:\/\/api.fastbundle.co\/scripts\/src.js?shop=respirecosmetic.myshopify.com","https:\/\/api.fastbundle.co\/scripts\/script_tag.js?shop=respirecosmetic.myshopify.com"];
    for (var i = 0; i < urls.length; i++) {
      var s = document.createElement('script');
      s.type = 'text/javascript';
      s.async = true;
      s.src = urls[i];
      var x = document.getElementsByTagName('script')[0];
      x.parentNode.insertBefore(s, x);
    }
  };
  if(window.attachEvent) {
    window.attachEvent('onload', asyncLoad);
  } else {
    window.addEventListener('load', asyncLoad, false);
  }
})();</script>
<script id="__st">var __st={"a":6910672978,"offset":7200,"reqid":"1d92d009-e849-49cb-b06a-8d952ce4ed50-1782745863","pageurl":"respire.co\/collections\/deodorant","u":"44c399130cdb","p":"collection","rtyp":"collection","rid":617159885136};</script>
<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
<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.2.iife.js',D={infoText:'Protégé par hCaptcha',privacyText:'Confidentialité',termsText:'Conditions'},(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('DOMContentLoaded',(()=>{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>
<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" defer="defer" src="//respire.co/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
<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 = "//respire.co/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><script crossorigin="anonymous" defer="defer" src="//respire.co/cdn/shopifycloud/storefront/assets/shopify_pay/storefront-bf1cdb70.js?v=20250812"></script>
<script id="shopify-origin-trials" async="async" integrity="sha256-MrpR+SbfwphjsvuxKsSWA5xxY07P36eahsNLLXSgEwo=" src="//cdn.shopify.com/shopifycloud/storefront/assets/storefront/origin_trials-c173577b.js" crossorigin="anonymous" onload="window.__shopifyOriginTrialsDone = true" onerror="window.__shopifyOriginTrialsDone = true"></script>

<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>

<script>
 window.StoreCreditInit = {
 shop: 'respirecosmetic.myshopify.com',
 cashback_widget_status: 0
 }
</script>
<script text='text/javascript'>
 var _learnq = _learnq || [];
 var _learnq = _learnq || [];
 if ('') {
 _learnq.push(['identify', {
 '$email' : ''
 }]);
 }
 
</script><!-- BEGIN app block: shopify://apps/join-stories/blocks/global-script/01ec6b69-ffcd-4917-91ec-8e867f5f7704 -->
  <script
    src='https://respire.my.join-stories.com/scripts/global.js'
    type='text/javascript'
  ></script>



<!-- END app block --><!-- BEGIN app block: shopify://apps/judge-me-reviews/blocks/judgeme_core/61ccd3b1-a9f2-4160-9fe9-4fec8413e5d8 --><!-- Start of Judge.me Core -->







<link rel="dns-prefetch" href="https://cdn.judge.me">
<link rel="dns-prefetch" href="https://cdn1.judge.me">
<link rel="dns-prefetch" href="https://api.judge.me">

<script data-cfasync='false' class='jdgm-settings-script'>window.jdgmSettings={"pagination":5,"disable_web_reviews":false,"badge_no_review_text":"Aucun avis","badge_n_reviews_text":"{{ n }} avis","badge_star_color":"#fccb67","hide_badge_preview_if_no_reviews":true,"badge_hide_text":false,"enforce_center_preview_badge":false,"widget_title":"Avis clients","widget_open_form_text":"JE DONNE MON AVIS","widget_close_form_text":"ANNULER","widget_refresh_page_text":"Actualiser la page","widget_summary_text":"Basé sur {{ number_of_reviews }} avis","widget_no_review_text":"Soyez le premier à écrire un avis","widget_name_field_text":"Nom ","widget_verified_name_field_text":"Nom ","widget_name_placeholder_text":"Indiquez votre nom (affiché avec votre avis)","widget_required_field_error_text":"Ce champ est obligatoire.","widget_email_field_text":"Adresse email","widget_verified_email_field_text":"Email ","widget_email_placeholder_text":"Entrez votre adresse email (non affiché avec votre avis)","widget_email_field_error_text":"L'adresse email  est requise \u0026 doit être valide. ","widget_rating_field_text":"Note ","widget_review_title_field_text":"Titre de l'avis","widget_review_title_placeholder_text":"Donnez un titre à votre avis.","widget_review_body_field_text":"Contenu de l'avis","widget_review_body_placeholder_text":"Écrivez votre avis ici","widget_pictures_field_text":"Photo/Vidéo (facultatif)","widget_submit_review_text":"Poster votre avis","widget_submit_verified_review_text":"Envoyer votre avis","widget_submit_success_msg_with_auto_publish":"Merci d'avoir partagé votre avis ! ","widget_submit_success_msg_no_auto_publish":"Merci d'avoir partagé votre avis !","widget_show_default_reviews_out_of_total_text":"Affichage de {{ n_reviews_shown }} sur {{ n_reviews }} avis.","widget_show_all_link_text":"Tout afficher","widget_show_less_link_text":"Afficher moins","widget_author_said_text":"{{ reviewer_name }} a dit :","widget_days_text":"il y a {{ n }} jour/jours","widget_weeks_text":"il y a {{ n }} semaine/semaines","widget_months_text":"il y a {{ n }} mois","widget_years_text":"il y a {{ n }} an/ans","widget_yesterday_text":"Hier","widget_today_text":"Aujourd'hui","widget_replied_text":"\u003e\u003e {{ shop_name }} a répondu :","widget_read_more_text":"Lire plus","widget_reviewer_name_as_initial":"","widget_rating_filter_color":"#f7d075","widget_rating_filter_see_all_text":"Voir tous les avis","widget_sorting_most_recent_text":"Plus récents","widget_sorting_highest_rating_text":"Meilleures notes","widget_sorting_lowest_rating_text":"Notes les plus basses","widget_sorting_with_pictures_text":"Uniquement les photos","widget_sorting_most_helpful_text":"Plus utiles","widget_open_question_form_text":"Poser une question","widget_reviews_subtab_text":"Avis","widget_questions_subtab_text":"Questions","widget_question_label_text":"Question","widget_answer_label_text":"Réponse","widget_question_placeholder_text":"Écrivez votre question ici.","widget_submit_question_text":"Envoyer une question.","widget_question_submit_success_text":"Merci pour votre question ! Nous l'étudierions dès que possible.","widget_star_color":"#f7d075","verified_badge_text":"Acheteur vérifié","verified_badge_bg_color":"","verified_badge_text_color":"","verified_badge_placement":"right-of-timestamp","widget_review_max_height":2,"widget_hide_border":false,"widget_social_share":false,"widget_thumb":true,"widget_review_location_show":false,"widget_location_format":"country_code_only","all_reviews_include_out_of_store_products":true,"all_reviews_out_of_store_text":"(hors boutique)","all_reviews_pagination":100,"all_reviews_product_name_prefix_text":"à propos de","enable_review_pictures":false,"enable_question_anwser":false,"widget_theme":"","review_date_format":"dd/mm/yyyy","default_sort_method":"highest-rating","widget_product_reviews_subtab_text":"Avis Produits","widget_shop_reviews_subtab_text":"Avis Boutique","widget_other_products_reviews_text":"Avis pour d'autres produits","widget_store_reviews_subtab_text":"Avis de la boutique","widget_no_store_reviews_text":"Cette boutique n'a pas encore reçu d'avis","widget_web_restriction_product_reviews_text":"Ce produit n'a pas encore reçu d'avis","widget_no_items_text":"Aucun élément trouvé","widget_show_more_text":"Afficher plus","widget_write_a_store_review_text":"Rédiger un avis sur le magasin","widget_other_languages_heading":"Avis dans d'autres langues","widget_translate_review_text":"Traduire l'avis en {{ language }}","widget_translating_review_text":"Traduction en cours...","widget_show_original_translation_text":"Afficher l'original ({{ language }})","widget_translate_review_failed_text":"Impossible de traduire cet avis.","widget_translate_review_retry_text":"Réessayer","widget_translate_review_try_again_later_text":"Réessayez plus tard","show_product_url_for_grouped_product":false,"widget_sorting_pictures_first_text":"Photos en premier","show_pictures_on_all_rev_page_mobile":false,"show_pictures_on_all_rev_page_desktop":false,"floating_tab_hide_mobile_install_preference":false,"floating_tab_button_name":"★ Avis","floating_tab_title":"Laissons nos clients parler pour nous","floating_tab_button_color":"","floating_tab_button_background_color":"","floating_tab_url":"","floating_tab_url_enabled":true,"floating_tab_tab_style":"text","all_reviews_text_badge_text":"Les clients nous notent {{ shop.metafields.judgeme.all_reviews_rating | round: 1 }}/5 basé sur {{ shop.metafields.judgeme.all_reviews_count }} avis.","all_reviews_text_badge_text_branded_style":"{{ shop.metafields.judgeme.all_reviews_rating | round: 1 }} sur 5 étoiles basé sur {{ shop.metafields.judgeme.all_reviews_count }} avis","is_all_reviews_text_badge_a_link":false,"show_stars_for_all_reviews_text_badge":false,"all_reviews_text_badge_url":"","all_reviews_text_style":"text","all_reviews_text_color_style":"judgeme_brand_color","all_reviews_text_color":"#108474","all_reviews_text_show_jm_brand":true,"featured_carousel_show_header":false,"featured_carousel_title":"C'est vous qui le dites ! ","testimonials_carousel_title":"Les clients nous disent","videos_carousel_title":"Histoire de clients réels","cards_carousel_title":"Les clients nous disent","featured_carousel_count_text":"basé sur {{ n }} avis","featured_carousel_add_link_to_all_reviews_page":false,"featured_carousel_url":"","featured_carousel_show_images":true,"featured_carousel_autoslide_interval":10,"featured_carousel_arrows_on_the_sides":true,"featured_carousel_height":180,"featured_carousel_width":100,"featured_carousel_image_size":0,"featured_carousel_image_height":250,"featured_carousel_arrow_color":"#314b48","verified_count_badge_style":"vintage","verified_count_badge_orientation":"horizontal","verified_count_badge_color_style":"judgeme_brand_color","verified_count_badge_color":"#108474","is_verified_count_badge_a_link":false,"verified_count_badge_url":"","verified_count_badge_show_jm_brand":true,"widget_rating_preset_default":5,"widget_first_sub_tab":"product-reviews","widget_show_histogram":true,"widget_histogram_use_custom_color":true,"widget_pagination_use_custom_color":false,"widget_star_use_custom_color":true,"widget_verified_badge_use_custom_color":false,"widget_write_review_use_custom_color":false,"picture_reminder_submit_button":"Upload Pictures","enable_review_videos":false,"mute_video_by_default":true,"widget_sorting_videos_first_text":"Vidéos en premier","widget_review_pending_text":"En attente","featured_carousel_items_for_large_screen":3,"social_share_options_order":"Facebook","remove_microdata_snippet":true,"disable_json_ld":true,"enable_json_ld_products":false,"preview_badge_show_question_text":false,"preview_badge_no_question_text":"Aucune question","preview_badge_n_question_text":"{{ number_of_questions }} question/questions","qa_badge_show_icon":false,"qa_badge_position":"same-row","remove_judgeme_branding":true,"widget_add_search_bar":false,"widget_search_bar_placeholder":"Recherche","widget_sorting_verified_only_text":"Vérifiés uniquement","featured_carousel_theme":"default","featured_carousel_show_rating":true,"featured_carousel_show_title":false,"featured_carousel_show_body":true,"featured_carousel_show_date":false,"featured_carousel_show_reviewer":true,"featured_carousel_show_product":false,"featured_carousel_header_background_color":"#108474","featured_carousel_header_text_color":"#ffffff","featured_carousel_name_product_separator":"reviewed","featured_carousel_full_star_background":"#108474","featured_carousel_empty_star_background":"#dadada","featured_carousel_vertical_theme_background":"#f9fafb","featured_carousel_verified_badge_enable":false,"featured_carousel_verified_badge_color":"#108474","featured_carousel_border_style":"round","featured_carousel_review_line_length_limit":3,"featured_carousel_more_reviews_button_text":"Lire plus d'avis","featured_carousel_view_product_button_text":"Voir le produit","all_reviews_page_load_reviews_on":"scroll","all_reviews_page_load_more_text":"Charger plus d'avis","disable_fb_tab_reviews":false,"enable_ajax_cdn_cache":false,"widget_public_name_text":"affiché publiquement comme","default_reviewer_name":"John Smith","default_reviewer_name_has_non_latin":true,"widget_reviewer_anonymous":"Anonyme","medals_widget_title":"Médailles d'avis Judge.me","medals_widget_background_color":"#f9fafb","medals_widget_position":"footer_all_pages","medals_widget_border_color":"#f9fafb","medals_widget_verified_text_position":"left","medals_widget_use_monochromatic_version":false,"medals_widget_elements_color":"#108474","show_reviewer_avatar":true,"widget_invalid_yt_video_url_error_text":"Pas une URL de vidéo YouTube","widget_max_length_field_error_text":"Veuillez ne pas dépasser {0} caractères.","widget_show_country_flag":false,"widget_show_collected_via_shop_app":true,"widget_verified_by_shop_badge_style":"light","widget_verified_by_shop_text":"Vérifié par la boutique","widget_show_photo_gallery":false,"widget_load_with_code_splitting":true,"widget_ugc_install_preference":false,"widget_ugc_title":"Fait par nous, partagé par vous","widget_ugc_subtitle":"Taguez-nous pour voir votre photo mise en avant sur notre page","widget_ugc_arrows_color":"#ffffff","widget_ugc_primary_button_text":"Acheter maintenant","widget_ugc_primary_button_background_color":"#108474","widget_ugc_primary_button_text_color":"#ffffff","widget_ugc_primary_button_border_width":"0","widget_ugc_primary_button_border_style":"none","widget_ugc_primary_button_border_color":"#108474","widget_ugc_primary_button_border_radius":"25","widget_ugc_secondary_button_text":"Charger plus","widget_ugc_secondary_button_background_color":"#ffffff","widget_ugc_secondary_button_text_color":"#108474","widget_ugc_secondary_button_border_width":"2","widget_ugc_secondary_button_border_style":"solid","widget_ugc_secondary_button_border_color":"#108474","widget_ugc_secondary_button_border_radius":"25","widget_ugc_reviews_button_text":"Voir les avis","widget_ugc_reviews_button_background_color":"#ffffff","widget_ugc_reviews_button_text_color":"#108474","widget_ugc_reviews_button_border_width":"2","widget_ugc_reviews_button_border_style":"solid","widget_ugc_reviews_button_border_color":"#108474","widget_ugc_reviews_button_border_radius":"25","widget_ugc_reviews_button_link_to":"judgeme-reviews-page","widget_ugc_show_post_date":true,"widget_ugc_max_width":"800","widget_rating_metafield_value_type":true,"widget_primary_color":"#151515","widget_enable_secondary_color":false,"widget_secondary_color":"#edf5f5","widget_summary_average_rating_text":"{{ average_rating }} sur 5","widget_media_grid_title":"Photos \u0026 vidéos clients","widget_media_grid_see_more_text":"Voir plus","widget_round_style":false,"widget_show_product_medals":true,"widget_verified_by_judgeme_text":"Vérifié par Judge.me","widget_show_store_medals":true,"widget_verified_by_judgeme_text_in_store_medals":"Vérifié par Judge.me","widget_media_field_exceed_quantity_message":"Désolé, nous ne pouvons accepter que {{ max_media }} pour un avis.","widget_media_field_exceed_limit_message":"{{ file_name }} est trop volumineux, veuillez sélectionner un {{ media_type }} de moins de {{ size_limit }}MB.","widget_review_submitted_text":"Avis soumis !","widget_question_submitted_text":"Question soumise !","widget_close_form_text_question":"Annuler","widget_write_your_answer_here_text":"Écrivez votre réponse ici","widget_enabled_branded_link":true,"widget_show_collected_by_judgeme":false,"widget_reviewer_name_color":"","widget_write_review_text_color":"","widget_write_review_bg_color":"","widget_collected_by_judgeme_text":"collecté par Judge.me","widget_pagination_type":"standard","widget_load_more_text":"Charger plus","widget_load_more_color":"#108474","widget_full_review_text":"Avis complet","widget_read_more_reviews_text":"Lire plus d'avis","widget_read_questions_text":"Lire les questions","widget_questions_and_answers_text":"Questions \u0026 Réponses","widget_verified_by_text":"Vérifié par","widget_verified_text":"Vérifié","widget_number_of_reviews_text":"{{ number_of_reviews }} avis","widget_back_button_text":"Retour","widget_next_button_text":"Suivant","widget_custom_forms_filter_button":"Filtres","custom_forms_style":"vertical","widget_show_review_information":false,"how_reviews_are_collected":"Comment les avis sont-ils collectés ?","widget_show_review_keywords":true,"widget_gdpr_statement":"Comment nous utilisons vos données : Nous vous contacterons uniquement à propos de l'avis que vous avez laissé, et seulement si nécessaire. En soumettant votre avis, vous acceptez les \u003ca href='https://judge.me/terms' target='_blank' rel='nofollow noopener'\u003econditions\u003c/a\u003e, la \u003ca href='https://judge.me/privacy' target='_blank' rel='nofollow noopener'\u003epolitique de confidentialité\u003c/a\u003e et les \u003ca href='https://judge.me/content-policy' target='_blank' rel='nofollow noopener'\u003epolitiques de contenu\u003c/a\u003e de Judge.me.","widget_multilingual_sorting_enabled":false,"widget_translate_review_content_enabled":false,"widget_translate_review_content_method":"manual","popup_widget_review_selection":"automatically_with_pictures","popup_widget_round_border_style":true,"popup_widget_show_title":true,"popup_widget_show_body":true,"popup_widget_show_reviewer":false,"popup_widget_show_product":true,"popup_widget_show_pictures":true,"popup_widget_use_review_picture":true,"popup_widget_show_on_home_page":true,"popup_widget_show_on_product_page":true,"popup_widget_show_on_collection_page":true,"popup_widget_show_on_cart_page":true,"popup_widget_position":"bottom_left","popup_widget_first_review_delay":5,"popup_widget_duration":5,"popup_widget_interval":5,"popup_widget_review_count":5,"popup_widget_hide_on_mobile":true,"review_snippet_widget_round_border_style":true,"review_snippet_widget_card_color":"#FFFFFF","review_snippet_widget_slider_arrows_background_color":"#FFFFFF","review_snippet_widget_slider_arrows_color":"#000000","review_snippet_widget_star_color":"#108474","show_product_variant":false,"all_reviews_product_variant_label_text":"Variante : ","widget_show_verified_branding":false,"widget_ai_summary_title":"Les clients disent","widget_ai_summary_disclaimer":"Résumé des avis généré par IA basé sur les avis clients récents","widget_show_ai_summary":false,"widget_show_ai_summary_bg":false,"widget_show_review_title_input":true,"redirect_reviewers_invited_via_email":"review_widget","request_store_review_after_product_review":false,"request_review_other_products_in_order":false,"review_form_color_scheme":"default","review_form_corner_style":"square","review_form_star_color":{},"review_form_text_color":"#333333","review_form_background_color":"#ffffff","review_form_field_background_color":"#fafafa","review_form_button_color":{},"review_form_button_text_color":"#ffffff","review_form_modal_overlay_color":"#000000","review_content_screen_title_text":"Comment évalueriez-vous ce produit ?","review_content_introduction_text":"Nous serions ravis que vous partagiez un peu votre expérience.","store_review_form_title_text":"Comment évalueriez-vous cette boutique ?","store_review_form_introduction_text":"Nous serions ravis que vous partagiez un peu votre expérience.","show_review_guidance_text":true,"one_star_review_guidance_text":"Mauvais","five_star_review_guidance_text":"Excellent","customer_information_screen_title_text":"À propos de vous","customer_information_introduction_text":"Veuillez nous en dire plus sur vous.","custom_questions_screen_title_text":"Votre expérience en détail","custom_questions_introduction_text":"Voici quelques questions pour nous aider à mieux comprendre votre expérience.","review_submitted_screen_title_text":"Merci pour votre avis !","review_submitted_screen_thank_you_text":"Nous le traitons et il apparaîtra bientôt dans la boutique.","review_submitted_screen_email_verification_text":"Veuillez confirmer votre email en cliquant sur le lien que nous venons de vous envoyer. Cela nous aide à maintenir des avis authentiques.","review_submitted_request_store_review_text":"Aimeriez-vous partager votre expérience d'achat avec nous ?","review_submitted_review_other_products_text":"Aimeriez-vous évaluer ces produits ?","store_review_screen_title_text":"Voulez-vous partager votre expérience de shopping avec nous ?","store_review_introduction_text":"Nous apprécions votre retour d'expérience et nous l'utilisons pour nous améliorer. Veuillez partager vos pensées ou suggestions.","reviewer_media_screen_title_picture_text":"Partager une photo","reviewer_media_introduction_picture_text":"Téléchargez une photo pour étayer votre avis.","reviewer_media_screen_title_video_text":"Partager une vidéo","reviewer_media_introduction_video_text":"Téléchargez une vidéo pour étayer votre avis.","reviewer_media_screen_title_picture_or_video_text":"Partager une photo ou une vidéo","reviewer_media_introduction_picture_or_video_text":"Téléchargez une photo ou une vidéo pour étayer votre avis.","reviewer_media_youtube_url_text":"Collez votre URL Youtube ici","advanced_settings_next_step_button_text":"Suivant","advanced_settings_close_review_button_text":"Fermer","modal_write_review_flow":false,"write_review_flow_required_text":"Obligatoire","write_review_flow_privacy_message_text":"Nous respectons votre vie privée.","write_review_flow_anonymous_text":"Avis anonyme","write_review_flow_visibility_text":"Ne sera pas visible pour les autres clients.","write_review_flow_multiple_selection_help_text":"Sélectionnez autant que vous le souhaitez","write_review_flow_single_selection_help_text":"Sélectionnez une option","write_review_flow_required_field_error_text":"Ce champ est obligatoire","write_review_flow_invalid_email_error_text":"Veuillez saisir une adresse email valide","write_review_flow_max_length_error_text":"Max. {{ max_length }} caractères.","write_review_flow_media_upload_text":"\u003cb\u003eCliquez pour télécharger\u003c/b\u003e ou glissez-déposez","write_review_flow_gdpr_statement":"Nous vous contacterons uniquement au sujet de votre avis si nécessaire. En soumettant votre avis, vous acceptez nos \u003ca href='https://judge.me/terms' target='_blank' rel='nofollow noopener'\u003econditions d'utilisation\u003c/a\u003e et notre \u003ca href='https://judge.me/privacy' target='_blank' rel='nofollow noopener'\u003epolitique de confidentialité\u003c/a\u003e.","rating_only_reviews_enabled":false,"show_negative_reviews_help_screen":false,"new_review_flow_help_screen_rating_threshold":3,"negative_review_resolution_screen_title_text":"Dites-nous plus","negative_review_resolution_text":"Votre expérience est importante pour nous. S'il y a eu des problèmes avec votre achat, nous sommes là pour vous aider. N'hésitez pas à nous contacter, nous aimerions avoir l'opportunité de corriger les choses.","negative_review_resolution_button_text":"Contactez-nous","negative_review_resolution_proceed_with_review_text":"Laisser un avis","negative_review_resolution_subject":"Problème avec l'achat de {{ shop_name }}.{{ order_name }}","preview_badge_collection_page_install_status":false,"widget_review_custom_css":"","preview_badge_custom_css":"","preview_badge_stars_count":"5-stars","featured_carousel_custom_css":"","floating_tab_custom_css":"","all_reviews_widget_custom_css":"","medals_widget_custom_css":"","verified_badge_custom_css":"","all_reviews_text_custom_css":"","transparency_badges_collected_via_store_invite":false,"transparency_badges_from_another_provider":false,"transparency_badges_collected_from_store_visitor":false,"transparency_badges_collected_by_verified_review_provider":false,"transparency_badges_earned_reward":false,"transparency_badges_collected_via_store_invite_text":"Avis collecté via l'invitation du magasin","transparency_badges_from_another_provider_text":"Avis collecté d'un autre fournisseur","transparency_badges_collected_from_store_visitor_text":"Avis collecté d'un visiteur du magasin","transparency_badges_written_in_google_text":"Avis écrit sur Google","transparency_badges_written_in_etsy_text":"Avis écrit sur Etsy","transparency_badges_written_in_shop_app_text":"Avis écrit sur Shop App","transparency_badges_earned_reward_text":"Avis a gagné une récompense pour une commande future","product_review_widget_per_page":3,"widget_store_review_label_text":"Avis de la boutique","checkout_comment_extension_title_on_product_page":"Customer Comments","checkout_comment_extension_num_latest_comment_show":5,"checkout_comment_extension_format":"name_and_timestamp","checkout_comment_customer_name":"last_initial","checkout_comment_comment_notification":true,"preview_badge_collection_page_install_preference":true,"preview_badge_home_page_install_preference":false,"preview_badge_product_page_install_preference":true,"review_widget_install_preference":"","review_carousel_install_preference":true,"floating_reviews_tab_install_preference":"none","verified_reviews_count_badge_install_preference":false,"all_reviews_text_install_preference":false,"review_widget_best_location":true,"judgeme_medals_install_preference":false,"review_widget_revamp_enabled":false,"review_widget_qna_enabled":false,"review_widget_header_theme":"minimal","review_widget_widget_title_enabled":true,"review_widget_header_text_size":"medium","review_widget_header_text_weight":"regular","review_widget_average_rating_style":"compact","review_widget_bar_chart_enabled":true,"review_widget_bar_chart_type":"numbers","review_widget_bar_chart_style":"standard","review_widget_expanded_media_gallery_enabled":false,"review_widget_reviews_section_theme":"standard","review_widget_image_style":"thumbnails","review_widget_review_image_ratio":"square","review_widget_stars_size":"medium","review_widget_verified_badge":"standard_text","review_widget_review_title_text_size":"medium","review_widget_review_text_size":"medium","review_widget_review_text_length":"medium","review_widget_number_of_columns_desktop":3,"review_widget_carousel_transition_speed":5,"review_widget_custom_questions_answers_display":"always","review_widget_button_text_color":"#FFFFFF","review_widget_text_color":"#000000","review_widget_lighter_text_color":"#7B7B7B","review_widget_corner_styling":"soft","review_widget_review_word_singular":"avis","review_widget_review_word_plural":"avis","review_widget_voting_label":"Utile?","review_widget_shop_reply_label":"Réponse de {{ shop_name }} :","review_widget_filters_title":"Filtres","qna_widget_question_word_singular":"Question","qna_widget_question_word_plural":"Questions","qna_widget_answer_reply_label":"Réponse de {{ answerer_name }} :","qna_content_screen_title_text":"Poser une question sur ce produit","qna_widget_question_required_field_error_text":"Veuillez entrer votre question.","qna_widget_flow_gdpr_statement":"Nous vous contacterons uniquement au sujet de votre question si nécessaire. En soumettant votre question, vous acceptez nos \u003ca href='https://judge.me/terms' target='_blank' rel='nofollow noopener'\u003econditions d'utilisation\u003c/a\u003e et notre \u003ca href='https://judge.me/privacy' target='_blank' rel='nofollow noopener'\u003epolitique de confidentialité\u003c/a\u003e.","qna_widget_question_submitted_text":"Merci pour votre question !","qna_widget_close_form_text_question":"Fermer","qna_widget_question_submit_success_text":"Nous vous enverrons un email lorsque nous répondrons à votre question.","all_reviews_widget_v2025_enabled":false,"all_reviews_widget_v2025_header_theme":"default","all_reviews_widget_v2025_widget_title_enabled":true,"all_reviews_widget_v2025_header_text_size":"medium","all_reviews_widget_v2025_header_text_weight":"regular","all_reviews_widget_v2025_average_rating_style":"compact","all_reviews_widget_v2025_bar_chart_enabled":true,"all_reviews_widget_v2025_bar_chart_type":"numbers","all_reviews_widget_v2025_bar_chart_style":"standard","all_reviews_widget_v2025_expanded_media_gallery_enabled":false,"all_reviews_widget_v2025_show_store_medals":true,"all_reviews_widget_v2025_show_photo_gallery":true,"all_reviews_widget_v2025_show_review_keywords":false,"all_reviews_widget_v2025_show_ai_summary":false,"all_reviews_widget_v2025_show_ai_summary_bg":false,"all_reviews_widget_v2025_add_search_bar":false,"all_reviews_widget_v2025_default_sort_method":"most-recent","all_reviews_widget_v2025_reviews_per_page":10,"all_reviews_widget_v2025_reviews_section_theme":"default","all_reviews_widget_v2025_image_style":"thumbnails","all_reviews_widget_v2025_review_image_ratio":"square","all_reviews_widget_v2025_stars_size":"medium","all_reviews_widget_v2025_verified_badge":"bold_badge","all_reviews_widget_v2025_review_title_text_size":"medium","all_reviews_widget_v2025_review_text_size":"medium","all_reviews_widget_v2025_review_text_length":"medium","all_reviews_widget_v2025_number_of_columns_desktop":3,"all_reviews_widget_v2025_carousel_transition_speed":5,"all_reviews_widget_v2025_custom_questions_answers_display":"always","all_reviews_widget_v2025_show_product_variant":false,"all_reviews_widget_v2025_show_reviewer_avatar":true,"all_reviews_widget_v2025_reviewer_name_as_initial":"","all_reviews_widget_v2025_review_location_show":false,"all_reviews_widget_v2025_location_format":"","all_reviews_widget_v2025_show_country_flag":false,"all_reviews_widget_v2025_verified_by_shop_badge_style":"light","all_reviews_widget_v2025_social_share":false,"all_reviews_widget_v2025_social_share_options_order":"Facebook,Twitter,LinkedIn,Pinterest","all_reviews_widget_v2025_pagination_type":"standard","all_reviews_widget_v2025_button_text_color":"#FFFFFF","all_reviews_widget_v2025_text_color":"#000000","all_reviews_widget_v2025_lighter_text_color":"#7B7B7B","all_reviews_widget_v2025_corner_styling":"soft","all_reviews_widget_v2025_title":"Avis clients","all_reviews_widget_v2025_ai_summary_title":"Les clients disent à propos de cette boutique","all_reviews_widget_v2025_no_review_text":"Soyez le premier à écrire un avis","platform":"shopify","branding_url":"https://app.judge.me/reviews/stores/respire","branding_text":"Propulsé par Judge.me","locale":"en","reply_name":"Respire","widget_version":"2.1","footer":true,"autopublish":true,"review_dates":true,"enable_custom_form":false,"shop_use_review_site":true,"shop_locale":"fr","enable_multi_locales_translations":false,"show_review_title_input":true,"review_verification_email_status":"never","can_be_branded":true,"reply_name_text":"Respire"};</script> <style class='jdgm-settings-style'>.jdgm-xx{left:0}:not(.jdgm-prev-badge__stars)>.jdgm-star{color:#f7d075}.jdgm-histogram .jdgm-star.jdgm-star{color:#f7d075}.jdgm-preview-badge .jdgm-star.jdgm-star{color:#fccb67}.jdgm-histogram .jdgm-histogram__bar-content{background:#f7d075}.jdgm-histogram .jdgm-histogram__bar:after{background:#f7d075}.jdgm-prev-badge[data-average-rating='0.00']{display:none !important}.jdgm-author-all-initials{display:none !important}.jdgm-author-last-initial{display:none !important}.jdgm-rev-widg__title{visibility:hidden}.jdgm-rev-widg__summary-text{visibility:hidden}.jdgm-prev-badge__text{visibility:hidden}.jdgm-rev__replier:before{content:'Respire'}.jdgm-rev__prod-link-prefix:before{content:'à propos de'}.jdgm-rev__variant-label:before{content:'Variante : '}.jdgm-rev__out-of-store-text:before{content:'(hors boutique)'}@media only screen and (min-width: 768px){.jdgm-rev__pics .jdgm-rev_all-rev-page-picture-separator,.jdgm-rev__pics .jdgm-rev__product-picture{display:none}}@media only screen and (max-width: 768px){.jdgm-rev__pics .jdgm-rev_all-rev-page-picture-separator,.jdgm-rev__pics .jdgm-rev__product-picture{display:none}}.jdgm-preview-badge[data-template="index"]{display:none !important}.jdgm-verified-count-badget[data-from-snippet="true"]{display:none !important}.jdgm-all-reviews-text[data-from-snippet="true"]{display:none !important}.jdgm-medals-section[data-from-snippet="true"]{display:none !important}.jdgm-ugc-media-wrapper[data-from-snippet="true"]{display:none !important}.jdgm-rev__transparency-badge[data-badge-type="review_collected_via_store_invitation"]{display:none !important}.jdgm-rev__transparency-badge[data-badge-type="review_collected_from_another_provider"]{display:none !important}.jdgm-rev__transparency-badge[data-badge-type="review_collected_from_store_visitor"]{display:none !important}.jdgm-rev__transparency-badge[data-badge-type="review_written_in_etsy"]{display:none !important}.jdgm-rev__transparency-badge[data-badge-type="review_written_in_google_business"]{display:none !important}.jdgm-rev__transparency-badge[data-badge-type="review_written_in_shop_app"]{display:none !important}.jdgm-rev__transparency-badge[data-badge-type="review_earned_for_future_purchase"]{display:none !important}
</style> <style class='jdgm-settings-style'></style>

  
  
  
  <style class='jdgm-miracle-styles'>
  @-webkit-keyframes jdgm-spin{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);-ms-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes jdgm-spin{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);-ms-transform:rotate(359deg);transform:rotate(359deg)}}@font-face{font-family:'JudgemeStar';src:url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAScAA0AAAAABrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAEgAAAABoAAAAcbyQ+3kdERUYAAARgAAAAHgAAACAAMwAGT1MvMgAAAZgAAABGAAAAVi+vS9xjbWFwAAAB8AAAAEAAAAFKwBMjvmdhc3AAAARYAAAACAAAAAj//wADZ2x5ZgAAAkAAAAEJAAABdH33LXtoZWFkAAABMAAAAC0AAAA2BroQKWhoZWEAAAFgAAAAHAAAACQD5QHQaG10eAAAAeAAAAAPAAAAFAYAAABsb2NhAAACMAAAAA4AAAAOAO4AeG1heHAAAAF8AAAAHAAAACAASgAvbmFtZQAAA0wAAADeAAABkorWfVZwb3N0AAAELAAAACkAAABEp3ubLXgBY2BkYADhPPP4OfH8Nl8ZuJkYQODS2fRrCPr/aSYGxq1ALgcDWBoAO60LkwAAAHgBY2BkYGDc+v80gx4TAwgASaAICmABAFB+Arl4AWNgZGBgYGPQYWBiAAIwyQgWc2AAAwAHVQB6eAFjYGRiYJzAwMrAwejDmMbAwOAOpb8ySDK0MDAwMbByMsCBAAMCBKS5pjA4PGB4wMR44P8BBj3GrQymQGFGkBwAjtgK/gAAeAFjYoAAEA1jAwAAZAAHAHgB3crBCcAwDEPRZydkih567CDdf4ZskmLwFBV8xBfCaC4BXkOUmx4sU0h2ngNb9V0vQCxaRKIAevT7fGWuBrEAAAAAAAAAAAA0AHgAugAAeAF9z79Kw1AUx/FzTm7un6QmJtwmQ5Bg1abgEGr/BAqlU6Gju+Cgg1MkQ/sA7Vj7BOnmO/gUvo2Lo14NqIO6/IazfD8HEODtmQCfoANwNsyp2/GJt3WKQrd1NLiYYWx2PBqOsmJMEOznPOTzfSCrhAtbbLdmeFLJV9eKd63WLrZcIcuaEVdssWCKM6pLCfTVOYbz/0pNSMSZKLIZpvh78sAUH6PlMrreTCabP9r+Z/puPZ2ur/RqpQHgh+MIegCnXeM4MRAPjYN//5tj4ZtTjkFqEdmeMShlEJ7tVAly2TAkx6R68Fl4E/aVvn8JqHFQ4JS1434gXKcuL31dDhzs3YbsEOAd/IU88gAAAHgBfY4xTgMxEEVfkk0AgRCioKFxQYd2ZRtpixxgRU2RfhU5q5VWseQ4JdfgAJyBlmNwAM7ABRhZQ0ORwp7nr+eZAa54YwYg9zm3ynPOeFRe8MCrciXOh/KSS76UV5L/iDmrLiS5AeU519wrL3jmSbkS5115yR2fyivJv9kx0ZMZ2RLZw27q87iNQi8EBo5FSPIMw3HqBboi5lKTGAGDp8FKXWP+t9TU01Lj5His1Ba6uM9dTEMwvrFmbf5GC/q2drW3ruXUhhsCiQOjznFlCzYhHUZp4xp76vsvQh89CQAAeAFjYGJABowM6IANLMrEyMTIzMjCXpyRWJBqZshWXJJYBKOMAFHFBucAAAAAAAAB//8AAngBY2BkYGDgA2IJBhBgAvKZGViBJAuYxwAABJsAOgAAeAFjYGBgZACCk535hiD60tn0azAaAEqpB6wAAA==") format("woff");font-weight:normal;font-style:normal}.jdgm-star{font-family:'JudgemeStar';display:inline !important;text-decoration:none !important;padding:0 4px 0 0 !important;margin:0 !important;font-weight:bold;opacity:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.jdgm-star:hover{opacity:1}.jdgm-star:last-of-type{padding:0 !important}.jdgm-star.jdgm--on:before{content:"\e000"}.jdgm-star.jdgm--off:before{content:"\e001"}.jdgm-star.jdgm--half:before{content:"\e002"}.jdgm-widget *{margin:0;line-height:1.4;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-overflow-scrolling:touch}.jdgm-hidden{display:none !important;visibility:hidden !important}.jdgm-temp-hidden{display:none}.jdgm-spinner{width:40px;height:40px;margin:auto;border-radius:50%;border-top:2px solid #eee;border-right:2px solid #eee;border-bottom:2px solid #eee;border-left:2px solid #ccc;-webkit-animation:jdgm-spin 0.8s infinite linear;animation:jdgm-spin 0.8s infinite linear}.jdgm-prev-badge{display:block !important}

</style>


  
  
   




<script data-cfasync='false' class='jdgm-script'>
!function(e){window.jdgm=window.jdgm||{},jdgm.CDN_HOST="https://cdnwidget.judge.me/",jdgm.CDN_HOST_ALT="https://cdn2.judge.me/cdn/widget_frontend/",jdgm.API_HOST="https://api.judge.me/",jdgm.CDN_BASE_URL="https://cdn.shopify.com/extensions/019f13d1-21e4-70ed-a8db-ed16ea3a2ee2/judgeme-596/assets/",jdgm.CDN_API_HOST="https://cdn.judge.me/",
jdgm.docReady=function(d){(e.attachEvent?"complete"===e.readyState:"loading"!==e.readyState)?
setTimeout(d,0):e.addEventListener("DOMContentLoaded",d)},jdgm.loadCSS=function(d,t,o,a){
!o&&jdgm.loadCSS.requestedUrls.indexOf(d)>=0||(jdgm.loadCSS.requestedUrls.push(d),
(a=e.createElement("link")).rel="stylesheet",a.class="jdgm-stylesheet",a.media="nope!",
a.href=d,a.onload=function(){this.media="all",t&&setTimeout(t)},e.body.appendChild(a))},
jdgm.loadCSS.requestedUrls=[],jdgm.loadJS=function(e,d){var t=new XMLHttpRequest;
t.onreadystatechange=function(){4===t.readyState&&(Function(t.response)(),d&&d(t.response))},
t.open("GET",e),t.onerror=function(){if(e.indexOf(jdgm.CDN_HOST)===0&&jdgm.CDN_HOST_ALT!==jdgm.CDN_HOST){var f=e.replace(jdgm.CDN_HOST,jdgm.CDN_HOST_ALT);jdgm.loadJS(f,d)}},t.send()},jdgm.docReady((function(){(window.jdgmLoadCSS||e.querySelectorAll(
".jdgm-widget, .jdgm-all-reviews-page").length>0)&&(jdgmSettings.widget_load_with_code_splitting?
parseFloat(jdgmSettings.widget_version)>=3?jdgm.loadCSS(jdgm.CDN_BASE_URL+"widget_v3_base.css"):
jdgm.loadCSS(jdgm.CDN_BASE_URL+"widget_base.css"):jdgm.loadCSS(jdgm.CDN_BASE_URL+"shopify_v2.css")
)}))}(document);
</script>
<noscript><link rel="stylesheet" type="text/css" media="all" href="https://cdn.shopify.com/extensions/019f13d1-21e4-70ed-a8db-ed16ea3a2ee2/judgeme-596/assets/shopify_v2.css"></noscript>

<!-- BEGIN app snippet: theme_fix_tags --><script>
  (function() {
    var jdgmThemeFixes = null;
    if (!jdgmThemeFixes) return;
    var thisThemeFix = jdgmThemeFixes[Shopify.theme.id];
    if (!thisThemeFix) return;

    if (thisThemeFix.html) {
      document.addEventListener("DOMContentLoaded", function() {
        var htmlDiv = document.createElement('div');
        htmlDiv.classList.add('jdgm-theme-fix-html');
        htmlDiv.innerHTML = thisThemeFix.html;
        document.body.append(htmlDiv);
      });
    };

    if (thisThemeFix.css) {
      var styleTag = document.createElement('style');
      styleTag.classList.add('jdgm-theme-fix-style');
      styleTag.innerHTML = thisThemeFix.css;
      document.head.append(styleTag);
    };

    if (thisThemeFix.js) {
      var scriptTag = document.createElement('script');
      scriptTag.classList.add('jdgm-theme-fix-script');
      scriptTag.innerHTML = thisThemeFix.js;
      document.head.append(scriptTag);
    };
  })();
</script>
<!-- END app snippet -->
<!-- End of Judge.me Core -->



<!-- END app block --><!-- BEGIN app block: shopify://apps/klaviyo-email-marketing-sms/blocks/klaviyo-onsite-embed/2632fe16-c075-4321-a88b-50b567f42507 -->












  <script async src="https://static.klaviyo.com/onsite/js/PPpHT4/klaviyo.js?company_id=PPpHT4"></script>
  <script>!function(){if(!window.klaviyo){window._klOnsite=window._klOnsite||[];try{window.klaviyo=new Proxy({},{get:function(n,i){return"push"===i?function(){var n;(n=window._klOnsite).push.apply(n,arguments)}:function(){for(var n=arguments.length,o=new Array(n),w=0;w<n;w++)o[w]=arguments[w];var t="function"==typeof o[o.length-1]?o.pop():void 0,e=new Promise((function(n){window._klOnsite.push([i].concat(o,[function(i){t&&t(i),n(i)}]))}));return e}}})}catch(n){window.klaviyo=window.klaviyo||[],window.klaviyo.push=function(){var n;(n=window._klOnsite).push.apply(n,arguments)}}}}();</script>

  




  <script>
    window.klaviyoReviewsProductDesignMode = false
  </script>



  <!-- BEGIN app snippet: customer-hub-data --><script>
  if (!window.customerHub) {
    window.customerHub = {};
  }
  window.customerHub.storefrontRoutes = {
    login: "https://respire.co/customer_authentication/redirect?locale=fr&region_country=FR?return_url=%2F%23k-hub",
    register: "https://account.respire.co?locale=fr&buyer_flags=eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNwaXJlY29zbWV0aWMubXlzaG9waWZ5LmNvbSIsImZsYWdzIjpbXSwiZXhwIjoxNzgzMzUwNjYzLCJuYmYiOjE3ODI3NDU4NjN9.r6yvXTyCy4OKH7SWCceM8hx2yoasXpn6FhBOgO7WaJc?return_url=%2F%23k-hub",
    logout: "/account/logout",
    profile: "/account",
    addresses: "/account/addresses",
  };
  
  window.customerHub.userId = null;
  
  window.customerHub.storeDomain = "respirecosmetic.myshopify.com";

  

  
    window.customerHub.storeLocale = {
        currentLanguage: 'fr',
        currentCountry: 'FR',
        availableLanguages: [
          
            {
              iso_code: 'fr',
              endonym_name: 'français'
            },
          
            {
              iso_code: 'es',
              endonym_name: 'Español'
            },
          
            {
              iso_code: 'it',
              endonym_name: 'Italiano'
            }
          
        ],
        availableCountries: [
          
            {
              iso_code: 'DZ',
              name: 'Algérie',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'DE',
              name: 'Allemagne',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'AU',
              name: 'Australie',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'AT',
              name: 'Autriche',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'BE',
              name: 'Belgique',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'CA',
              name: 'Canada',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'CN',
              name: 'Chine',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'CY',
              name: 'Chypre',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'KR',
              name: 'Corée du Sud',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'DK',
              name: 'Danemark',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'ES',
              name: 'Espagne',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'EE',
              name: 'Estonie',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'US',
              name: 'États-Unis',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'FI',
              name: 'Finlande',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'FR',
              name: 'France',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'GR',
              name: 'Grèce',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'GP',
              name: 'Guadeloupe',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'GF',
              name: 'Guyane française',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'HU',
              name: 'Hongrie',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'IN',
              name: 'Inde',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'IE',
              name: 'Irlande',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'IS',
              name: 'Islande',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'IL',
              name: 'Israël',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'IT',
              name: 'Italie',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'JP',
              name: 'Japon',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'RE',
              name: 'La Réunion',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'LV',
              name: 'Lettonie',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'LT',
              name: 'Lituanie',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'LU',
              name: 'Luxembourg',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'MA',
              name: 'Maroc',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'MQ',
              name: 'Martinique',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'MU',
              name: 'Maurice',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'YT',
              name: 'Mayotte',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'MC',
              name: 'Monaco',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'NO',
              name: 'Norvège',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'NC',
              name: 'Nouvelle-Calédonie',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'NZ',
              name: 'Nouvelle-Zélande',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'NL',
              name: 'Pays-Bas',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'PL',
              name: 'Pologne',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'PF',
              name: 'Polynésie française',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'PT',
              name: 'Portugal',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'HK',
              name: 'R.A.S. chinoise de Hong Kong',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'GB',
              name: 'Royaume-Uni',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'RU',
              name: 'Russie',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'BL',
              name: 'Saint-Barthélemy',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'MF',
              name: 'Saint-Martin',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'PM',
              name: 'Saint-Pierre-et-Miquelon',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'SG',
              name: 'Singapour',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'SK',
              name: 'Slovaquie',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'SI',
              name: 'Slovénie',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'SE',
              name: 'Suède',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'CH',
              name: 'Suisse',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'CZ',
              name: 'Tchéquie',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'TF',
              name: 'Terres australes françaises',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'TH',
              name: 'Thaïlande',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'TN',
              name: 'Tunisie',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'TR',
              name: 'Turquie',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'VN',
              name: 'Viêt Nam',
              currency_code: 'EUR'
            },
          
            {
              iso_code: 'WF',
              name: 'Wallis-et-Futuna',
              currency_code: 'EUR'
            }
          
        ]
    };
  
</script>
<!-- END app snippet -->







<!-- END app block --><!-- BEGIN app block: shopify://apps/okendo/blocks/theme-settings/bb689e69-ea70-4661-8fb7-ad24a2e23c29 --><!-- BEGIN app snippet: header-metafields -->












    
        <style data-oke-reviews-version="0.85.5" type="text/css" data-href="https://d3hw6dc1ow8pp2.cloudfront.net/reviews-widget-plus/css/okendo-reviews-styles.18391d59.css"></style><style data-oke-reviews-version="0.85.5" type="text/css" data-href="https://d3hw6dc1ow8pp2.cloudfront.net/reviews-widget-plus/css/modules/okendo-star-rating.4cb378a8.css"></style><style data-oke-reviews-version="0.85.5" type="text/css" data-href="https://d3hw6dc1ow8pp2.cloudfront.net/reviews-widget-plus/css/modules/okendo-reviews-keywords.0942444f.css"></style><style data-oke-reviews-version="0.85.5" type="text/css" data-href="https://d3hw6dc1ow8pp2.cloudfront.net/reviews-widget-plus/css/modules/okendo-reviews-summary.a0c9d7d6.css"></style><style type="text/css">.okeReviews[data-oke-container],div.okeReviews{font-size:14px;font-size:var(--oke-text-regular);font-weight:400;font-family:var(--oke-text-fontFamily);line-height:1.6}.okeReviews[data-oke-container] *,.okeReviews[data-oke-container] :after,.okeReviews[data-oke-container] :before,div.okeReviews *,div.okeReviews :after,div.okeReviews :before{box-sizing:border-box}.okeReviews[data-oke-container] h1,.okeReviews[data-oke-container] h2,.okeReviews[data-oke-container] h3,.okeReviews[data-oke-container] h4,.okeReviews[data-oke-container] h5,.okeReviews[data-oke-container] h6,div.okeReviews h1,div.okeReviews h2,div.okeReviews h3,div.okeReviews h4,div.okeReviews h5,div.okeReviews h6{font-size:1em;font-weight:400;line-height:1.4;margin:0}.okeReviews[data-oke-container] ul,div.okeReviews ul{padding:0;margin:0}.okeReviews[data-oke-container] li,div.okeReviews li{list-style-type:none;padding:0}.okeReviews[data-oke-container] p,div.okeReviews p{line-height:1.8;margin:0 0 4px}.okeReviews[data-oke-container] p:last-child,div.okeReviews p:last-child{margin-bottom:0}.okeReviews[data-oke-container] a,div.okeReviews a{text-decoration:none;color:inherit}.okeReviews[data-oke-container] button,div.okeReviews button{border-radius:0;border:0;box-shadow:none;margin:0;width:auto;min-width:auto;padding:0;background-color:transparent;min-height:auto}.okeReviews[data-oke-container] button,.okeReviews[data-oke-container] input,.okeReviews[data-oke-container] select,.okeReviews[data-oke-container] textarea,div.okeReviews button,div.okeReviews input,div.okeReviews select,div.okeReviews textarea{font-family:inherit;font-size:1em}.okeReviews[data-oke-container] label,.okeReviews[data-oke-container] select,div.okeReviews label,div.okeReviews select{display:inline}.okeReviews[data-oke-container] select,div.okeReviews select{width:auto}.okeReviews[data-oke-container] article,.okeReviews[data-oke-container] aside,div.okeReviews article,div.okeReviews aside{margin:0}.okeReviews[data-oke-container] table,div.okeReviews table{background:transparent;border:0;border-collapse:collapse;border-spacing:0;font-family:inherit;font-size:1em;table-layout:auto}.okeReviews[data-oke-container] table td,.okeReviews[data-oke-container] table th,.okeReviews[data-oke-container] table tr,div.okeReviews table td,div.okeReviews table th,div.okeReviews table tr{border:0;font-family:inherit;font-size:1em}.okeReviews[data-oke-container] table td,.okeReviews[data-oke-container] table th,div.okeReviews table td,div.okeReviews table th{background:transparent;font-weight:400;letter-spacing:normal;padding:0;text-align:left;text-transform:none;vertical-align:middle}.okeReviews[data-oke-container] table tr:hover td,.okeReviews[data-oke-container] table tr:hover th,div.okeReviews table tr:hover td,div.okeReviews table tr:hover th{background:transparent}.okeReviews[data-oke-container] fieldset,div.okeReviews fieldset{border:0;padding:0;margin:0;min-width:0}.okeReviews[data-oke-container] img,.okeReviews[data-oke-container] svg,div.okeReviews img,div.okeReviews svg{max-width:none}.okeReviews[data-oke-container] div:empty,div.okeReviews div:empty{display:block}.okeReviews[data-oke-container] .oke-icon:before,div.okeReviews .oke-icon:before{font-family:oke-widget-icons!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:inherit}.okeReviews[data-oke-container] .oke-icon--select-arrow:before,div.okeReviews .oke-icon--select-arrow:before{content:""}.okeReviews[data-oke-container] .oke-icon--loading:before,div.okeReviews .oke-icon--loading:before{content:""}.okeReviews[data-oke-container] .oke-icon--pencil:before,div.okeReviews .oke-icon--pencil:before{content:""}.okeReviews[data-oke-container] .oke-icon--filter:before,div.okeReviews .oke-icon--filter:before{content:""}.okeReviews[data-oke-container] .oke-icon--play:before,div.okeReviews .oke-icon--play:before{content:""}.okeReviews[data-oke-container] .oke-icon--tick-circle:before,div.okeReviews .oke-icon--tick-circle:before{content:""}.okeReviews[data-oke-container] .oke-icon--chevron-left:before,div.okeReviews .oke-icon--chevron-left:before{content:""}.okeReviews[data-oke-container] .oke-icon--chevron-right:before,div.okeReviews .oke-icon--chevron-right:before{content:""}.okeReviews[data-oke-container] .oke-icon--thumbs-down:before,div.okeReviews .oke-icon--thumbs-down:before{content:""}.okeReviews[data-oke-container] .oke-icon--thumbs-up:before,div.okeReviews .oke-icon--thumbs-up:before{content:""}.okeReviews[data-oke-container] .oke-icon--close:before,div.okeReviews .oke-icon--close:before{content:""}.okeReviews[data-oke-container] .oke-icon--chevron-up:before,div.okeReviews .oke-icon--chevron-up:before{content:""}.okeReviews[data-oke-container] .oke-icon--chevron-down:before,div.okeReviews .oke-icon--chevron-down:before{content:""}.okeReviews[data-oke-container] .oke-icon--star:before,div.okeReviews .oke-icon--star:before{content:""}.okeReviews[data-oke-container] .oke-icon--magnifying-glass:before,div.okeReviews .oke-icon--magnifying-glass:before{content:""}@font-face{font-family:oke-widget-icons;src:url(https://d3hw6dc1ow8pp2.cloudfront.net/reviews-widget-plus/fonts/oke-widget-icons.ttf) format("truetype"),url(https://d3hw6dc1ow8pp2.cloudfront.net/reviews-widget-plus/fonts/oke-widget-icons.woff) format("woff"),url(https://d3hw6dc1ow8pp2.cloudfront.net/reviews-widget-plus/img/oke-widget-icons.bc0d6b0a.svg) format("svg");font-weight:400;font-style:normal;font-display:swap}.okeReviews[data-oke-container] .oke-button,div.okeReviews .oke-button{display:inline-block;border-style:solid;border-color:var(--oke-button-borderColor);border-width:var(--oke-button-borderWidth);background-color:var(--oke-button-backgroundColor);line-height:1;padding:12px 24px;margin:0;border-radius:var(--oke-button-borderRadius);color:var(--oke-button-textColor);text-align:center;position:relative;font-weight:var(--oke-button-fontWeight);font-size:var(--oke-button-fontSize);font-family:var(--oke-button-fontFamily);outline:0}.okeReviews[data-oke-container] .oke-button-text,.okeReviews[data-oke-container] .oke-button .oke-icon,div.okeReviews .oke-button-text,div.okeReviews .oke-button .oke-icon{line-height:1}.okeReviews[data-oke-container] .oke-button.oke-is-loading,div.okeReviews .oke-button.oke-is-loading{position:relative}.okeReviews[data-oke-container] .oke-button.oke-is-loading:before,div.okeReviews .oke-button.oke-is-loading:before{font-family:oke-widget-icons!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";color:undefined;font-size:12px;display:inline-block;animation:oke-spin 1s linear infinite;position:absolute;width:12px;height:12px;top:0;left:0;bottom:0;right:0;margin:auto}.okeReviews[data-oke-container] .oke-button.oke-is-loading>*,div.okeReviews .oke-button.oke-is-loading>*{opacity:0}.okeReviews[data-oke-container] .oke-button.oke-is-active,div.okeReviews .oke-button.oke-is-active{background-color:var(--oke-button-backgroundColorActive);color:var(--oke-button-textColorActive);border-color:var(--oke-button-borderColorActive)}.okeReviews[data-oke-container] .oke-button:not(.oke-is-loading),div.okeReviews .oke-button:not(.oke-is-loading){cursor:pointer}.okeReviews[data-oke-container] .oke-button:not(.oke-is-loading):not(.oke-is-active):hover,div.okeReviews .oke-button:not(.oke-is-loading):not(.oke-is-active):hover{background-color:var(--oke-button-backgroundColorHover);color:var(--oke-button-textColorHover);border-color:var(--oke-button-borderColorHover);box-shadow:0 0 0 2px var(--oke-button-backgroundColorHover)}.okeReviews[data-oke-container] .oke-button:not(.oke-is-loading):not(.oke-is-active):active,.okeReviews[data-oke-container] .oke-button:not(.oke-is-loading):not(.oke-is-active):hover:active,div.okeReviews .oke-button:not(.oke-is-loading):not(.oke-is-active):active,div.okeReviews .oke-button:not(.oke-is-loading):not(.oke-is-active):hover:active{background-color:var(--oke-button-backgroundColorActive);color:var(--oke-button-textColorActive);border-color:var(--oke-button-borderColorActive)}.okeReviews[data-oke-container] .oke-title,div.okeReviews .oke-title{font-weight:var(--oke-title-fontWeight);font-size:var(--oke-title-fontSize);font-family:var(--oke-title-fontFamily)}.okeReviews[data-oke-container] .oke-bodyText,div.okeReviews .oke-bodyText{font-weight:var(--oke-bodyText-fontWeight);font-size:var(--oke-bodyText-fontSize);font-family:var(--oke-bodyText-fontFamily)}.okeReviews[data-oke-container] .oke-linkButton,div.okeReviews .oke-linkButton{cursor:pointer;font-weight:700;pointer-events:auto;text-decoration:underline}.okeReviews[data-oke-container] .oke-linkButton:hover,div.okeReviews .oke-linkButton:hover{text-decoration:none}.okeReviews[data-oke-container] .oke-readMore,div.okeReviews .oke-readMore{cursor:pointer;color:inherit;text-decoration:underline}.okeReviews[data-oke-container] .oke-select,div.okeReviews .oke-select{cursor:pointer;background-repeat:no-repeat;background-position-x:100%;background-position-y:50%;border:none;padding:0 24px 0 12px;-moz-appearance:none;appearance:none;color:inherit;-webkit-appearance:none;background-color:transparent;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='currentColor' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E");outline-offset:4px}.okeReviews[data-oke-container] .oke-select:disabled,div.okeReviews .oke-select:disabled{background-color:transparent;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='%239a9db1' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E")}.okeReviews[data-oke-container] .oke-loader,div.okeReviews .oke-loader{position:relative}.okeReviews[data-oke-container] .oke-loader:before,div.okeReviews .oke-loader:before{font-family:oke-widget-icons!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";color:var(--oke-text-secondaryColor);font-size:12px;display:inline-block;animation:oke-spin 1s linear infinite;position:absolute;width:12px;height:12px;top:0;left:0;bottom:0;right:0;margin:auto}.okeReviews[data-oke-container] .oke-a11yText,div.okeReviews .oke-a11yText{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.okeReviews[data-oke-container] .oke-hidden,div.okeReviews .oke-hidden{display:none}.okeReviews[data-oke-container] .oke-modal,div.okeReviews .oke-modal{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:0;z-index:2147483647;max-height:100%;background-color:rgba(0,0,0,.5);padding:40px 0 32px}@media only screen and (min-width:1024px){.okeReviews[data-oke-container] .oke-modal,div.okeReviews .oke-modal{display:flex;align-items:center;padding:48px 0}}.okeReviews[data-oke-container] .oke-modal ::-moz-selection,div.okeReviews .oke-modal ::-moz-selection{background-color:rgba(39,45,69,.2)}.okeReviews[data-oke-container] .oke-modal ::selection,div.okeReviews .oke-modal ::selection{background-color:rgba(39,45,69,.2)}.okeReviews[data-oke-container] .oke-modal,.okeReviews[data-oke-container] .oke-modal p,div.okeReviews .oke-modal,div.okeReviews .oke-modal p{color:#272d45}.okeReviews[data-oke-container] .oke-modal-content,div.okeReviews .oke-modal-content{background-color:#fff;margin:auto;position:relative;will-change:transform,opacity;width:calc(100% - 64px)}@media only screen and (min-width:1024px){.okeReviews[data-oke-container] .oke-modal-content,div.okeReviews .oke-modal-content{max-width:1000px}}.okeReviews[data-oke-container] .oke-modal-close,div.okeReviews .oke-modal-close{cursor:pointer;position:absolute;width:32px;height:32px;top:-32px;padding:4px;right:-4px;line-height:1}.okeReviews[data-oke-container] .oke-modal-close:before,div.okeReviews .oke-modal-close:before{font-family:oke-widget-icons!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";color:#fff;font-size:24px;display:inline-block;width:24px;height:24px}.okeReviews[data-oke-container] .oke-modal-overlay,div.okeReviews .oke-modal-overlay{background-color:rgba(43,46,56,.9)}@media only screen and (min-width:1024px){.okeReviews[data-oke-container] .oke-modal--large .oke-modal-content,div.okeReviews .oke-modal--large .oke-modal-content{max-width:1200px}}.okeReviews[data-oke-container] .oke-modal .oke-helpful,.okeReviews[data-oke-container] .oke-modal .oke-helpful-vote-button,.okeReviews[data-oke-container] .oke-modal .oke-reviewContent-date,div.okeReviews .oke-modal .oke-helpful,div.okeReviews .oke-modal .oke-helpful-vote-button,div.okeReviews .oke-modal .oke-reviewContent-date{color:#676986}.oke-modal .okeReviews[data-oke-container].oke-w,.oke-modal div.okeReviews.oke-w{color:#272d45}.okeReviews[data-oke-container] .oke-tag,div.okeReviews .oke-tag{align-items:center;color:#272d45;display:flex;font-size:var(--oke-text-small);font-weight:600;text-align:left;position:relative;z-index:2;background-color:#f4f4f6;padding:4px 6px;border:none;border-radius:4px;gap:6px;line-height:1}.okeReviews[data-oke-container] .oke-tag svg,div.okeReviews .oke-tag svg{fill:currentColor;height:1rem}.okeReviews[data-oke-container] .hooper,div.okeReviews .hooper{height:auto}.okeReviews--left{text-align:left}.okeReviews--right{text-align:right}.okeReviews--center{text-align:center}.okeReviews :not([tabindex="-1"]):focus-visible{outline:5px auto highlight;outline:5px auto -webkit-focus-ring-color}.is-oke-modalOpen{overflow:hidden!important}img.oke-is-error{background-color:var(--oke-shadingColor);background-size:cover;background-position:50% 50%;box-shadow:inset 0 0 0 1px var(--oke-border-color)}@keyframes oke-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes oke-fade-in{0%{opacity:0}to{opacity:1}}.layout-panel-flex>div:has([data-oke-container]){width:100%}
.oke-stars{line-height:1;position:relative;display:inline-block}.oke-stars-background svg{overflow:visible}.oke-stars-foreground{overflow:hidden;position:absolute;top:0;left:0}.oke-sr{display:inline-block;padding-top:var(--oke-starRating-spaceAbove);padding-bottom:var(--oke-starRating-spaceBelow)}.oke-sr .oke-is-clickable{cursor:pointer}.oke-sr--hidden{display:none}.oke-sr-count,.oke-sr-rating,.oke-sr-stars{display:inline-block;vertical-align:middle}.oke-sr-stars{line-height:1;margin-right:8px}.oke-sr-rating{display:none}.oke-sr-count--brackets:before{content:"("}.oke-sr-count--brackets:after{content:")"}
.oke-rk{display:block}.okeReviews[data-oke-container] .oke-reviewsKeywords-heading,div.okeReviews .oke-reviewsKeywords-heading{font-weight:700;margin-bottom:8px}.okeReviews[data-oke-container] .oke-reviewsKeywords-heading-skeleton,div.okeReviews .oke-reviewsKeywords-heading-skeleton{height:calc(var(--oke-button-fontSize) + 4px);width:150px}.okeReviews[data-oke-container] .oke-reviewsKeywords-list,div.okeReviews .oke-reviewsKeywords-list{display:inline-flex;align-items:center;flex-wrap:wrap;gap:4px}.okeReviews[data-oke-container] .oke-reviewsKeywords-list-category,div.okeReviews .oke-reviewsKeywords-list-category{background-color:var(--oke-filter-backgroundColor);color:var(--oke-filter-textColor);border:1px solid var(--oke-filter-borderColor);border-radius:var(--oke-filter-borderRadius);padding:6px 16px;transition:background-color .1s ease-out,border-color .1s ease-out;white-space:nowrap}.okeReviews[data-oke-container] .oke-reviewsKeywords-list-category.oke-is-clickable,div.okeReviews .oke-reviewsKeywords-list-category.oke-is-clickable{cursor:pointer}.okeReviews[data-oke-container] .oke-reviewsKeywords-list-category.oke-is-active,div.okeReviews .oke-reviewsKeywords-list-category.oke-is-active{background-color:var(--oke-filter-backgroundColorActive);color:var(--oke-filter-textColorActive);border-color:var(--oke-filter-borderColorActive)}.okeReviews[data-oke-container] .oke-reviewsKeywords .oke-translateButton,div.okeReviews .oke-reviewsKeywords .oke-translateButton{margin-top:12px}
.oke-rs{display:block}.oke-rs .oke-reviewsSummary.oke-is-preRender .oke-reviewsSummary-summary{-webkit-mask:linear-gradient(180deg,#000 0,#000 40%,transparent 95%,transparent 0) 100% 50%/100% 100% repeat-x;mask:linear-gradient(180deg,#000 0,#000 40%,transparent 95%,transparent 0) 100% 50%/100% 100% repeat-x;max-height:150px}.okeReviews[data-oke-container] .oke-reviewsSummary .oke-tooltip,div.okeReviews .oke-reviewsSummary .oke-tooltip{display:inline-block;font-weight:400}.okeReviews[data-oke-container] .oke-reviewsSummary .oke-tooltip-trigger,div.okeReviews .oke-reviewsSummary .oke-tooltip-trigger{height:15px;width:15px;overflow:hidden;transform:translateY(-10%)}.okeReviews[data-oke-container] .oke-reviewsSummary-heading,div.okeReviews .oke-reviewsSummary-heading{align-items:center;-moz-column-gap:4px;column-gap:4px;display:inline-flex;font-weight:700;margin-bottom:8px}.okeReviews[data-oke-container] .oke-reviewsSummary-heading-skeleton,div.okeReviews .oke-reviewsSummary-heading-skeleton{height:calc(var(--oke-button-fontSize) + 4px);width:150px}.okeReviews[data-oke-container] .oke-reviewsSummary-icon,div.okeReviews .oke-reviewsSummary-icon{fill:currentColor;font-size:14px}.okeReviews[data-oke-container] .oke-reviewsSummary-icon svg,div.okeReviews .oke-reviewsSummary-icon svg{vertical-align:baseline}.okeReviews[data-oke-container] .oke-reviewsSummary-summary.oke-is-truncated,div.okeReviews .oke-reviewsSummary-summary.oke-is-truncated{display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}</style>
    
    <script type="application/json" id="oke-reviews-settings">{"subscriberId":"ca7cd64c-740c-453a-a4c9-3d18933b028c","analyticsSettings":{"isWidgetOnScreenTrackingEnabled":true,"provider":"gtag"},"locale":"fr","localeAndVariant":{"code":"fr"},"matchCustomerLocale":true,"widgetSettings":{"global":{"dateSettings":{"format":{"type":"absolute","options":{"dateStyle":"medium"}}},"hideOkendoBranding":true,"reviewTranslationsMode":"on-load","showIncentiveIndicator":false,"searchEnginePaginationEnabled":true,"stars":{"backgroundColor":"#E5E5E5","foregroundColor":"#151515","interspace":5,"shape":{"type":"default"},"showBorder":false},"font":{"fontType":"inherit-from-page"}},"homepageCarousel":{"slidesPerPage":{"large":3,"medium":2},"totalSlides":12,"scrollBehaviour":"slide","style":{"showDates":true,"border":{"color":"#E5E5EB","width":{"value":1,"unit":"px"}},"headingFont":{"hasCustomFontSettings":false},"bodyFont":{"hasCustomFontSettings":false},"arrows":{"color":"#676986","size":{"value":24,"unit":"px"},"enabled":true},"avatar":{"backgroundColor":"#E5E5EB","placeholderTextColor":"#2C3E50","size":{"value":48,"unit":"px"},"enabled":true},"media":{"size":{"value":80,"unit":"px"},"imageGap":{"value":4,"unit":"px"},"enabled":true},"stars":{"height":{"value":18,"unit":"px"}},"productImageSize":{"value":48,"unit":"px"},"layout":{"name":"default","reviewDetailsPosition":"below","showProductName":false,"showAttributeBars":false,"showProductVariantName":false,"showProductDetails":"only-when-grouped"},"highlightColor":"#0E7A82","spaceAbove":{"value":20,"unit":"px"},"text":{"primaryColor":"#2C3E50","fontSizeRegular":{"value":14,"unit":"px"},"fontSizeSmall":{"value":12,"unit":"px"},"secondaryColor":"#676986"},"spaceBelow":{"value":20,"unit":"px"}},"defaultSort":"rating desc","autoPlay":false,"truncation":{"bodyMaxLines":4,"enabled":true,"truncateAll":false}},"mediaCarousel":{"minimumImages":1,"linkText":"Read More","autoPlay":false,"slideSize":"medium","arrowPosition":"outside"},"mediaGrid":{"gridStyleDesktop":{"layout":"default-desktop"},"gridStyleMobile":{"layout":"default-mobile"},"showMoreArrow":{"arrowColor":"#676986","enabled":true,"backgroundColor":"#f4f4f6"},"linkText":"Read More","infiniteScroll":false,"gapSize":{"value":10,"unit":"px"}},"questions":{"initialPageSize":5,"loadMorePageSize":6},"reviewsBadge":{"layout":"large","colorScheme":"dark"},"reviewsTab":{"enabled":false},"reviewsWidget":{"tabs":{"reviews":true,"questions":true},"header":{"columnDistribution":"center","verticalAlignment":"top","blocks":[{"columnWidth":"two-thirds","modules":[{"name":"rating-average","layout":"three-line"}],"textAlignment":"center"}]},"style":{"showDates":true,"border":{"color":"#C5BFB4","width":{"value":1,"unit":"px"}},"bodyFont":{"hasCustomFontSettings":false},"headingFont":{"hasCustomFontSettings":false},"filters":{"backgroundColorActive":"#151515","backgroundColor":"#FFFFFF","borderColor":"#DBDDE4","borderRadius":{"value":100,"unit":"px"},"borderColorActive":"#151515","textColorActive":"#FFFFFF","textColor":"#151515","searchHighlightColor":"#a1a1a1"},"avatar":{"enabled":false},"stars":{"height":{"value":13,"unit":"px"}},"shadingColor":"#F7F7F8","productImageSize":{"value":48,"unit":"px"},"button":{"backgroundColorActive":"#121212","borderColorHover":"#121212","backgroundColor":"#151515","borderColor":"#DBDDE4","backgroundColorHover":"#121212","textColorHover":"#FFFFFF","borderRadius":{"value":6,"unit":"px"},"borderWidth":{"value":0,"unit":"px"},"borderColorActive":"#121212","textColorActive":"#FFFFFF","textColor":"#FFFFFF","font":{"hasCustomFontSettings":false}},"highlightColor":"#151515","spaceAbove":{"value":20,"unit":"px"},"text":{"primaryColor":"#151515","fontSizeRegular":{"value":14,"unit":"px"},"fontSizeLarge":{"value":48,"unit":"px"},"fontSizeSmall":{"value":12,"unit":"px"},"secondaryColor":"#676986"},"spaceBelow":{"value":20,"unit":"px"},"attributeBar":{"style":"default","backgroundColor":"#D3D4DD","shadingColor":"#9A9DB1","markerColor":"#151515"}},"showWhenEmpty":false,"reviews":{"list":{"layout":{"collapseReviewerDetails":false,"columnAmount":4,"name":"default","showAttributeBars":false,"borderStyle":"minimal","showProductVariantName":false,"showProductDetails":"only-when-grouped"},"loyalty":{"maxInitialAchievements":3},"initialPageSize":2,"replyTruncation":{"bodyMaxLines":4,"enabled":true},"media":{"layout":"featured","size":{"value":200,"unit":"px"}},"truncation":{"bodyMaxLines":2,"truncateAll":true,"enabled":true},"loadMorePageSize":2},"controls":{"filterMode":"closed","freeTextSearchEnabled":true,"featuredReviewsTags":["uA89arv"],"keywordsFilterEnabled":false,"writeReviewButtonEnabled":true,"defaultSort":"tags desc","secondarySort":"rating desc"}}},"starRatings":{"showWhenEmpty":false,"style":{"spaceAbove":{"value":0,"unit":"px"},"text":{"content":"review-count","style":"number-and-text","brackets":false},"singleStar":false,"height":{"value":13,"unit":"px"},"spaceBelow":{"value":0,"unit":"px"}},"clickBehavior":"scroll-to-widget"}},"features":{"attributeFiltersEnabled":true,"recorderPlusEnabled":true,"recorderQandaPlusEnabled":true,"reviewsKeywordsEnabled":true,"reviewsSummariesEnabled":true}}</script>
            <style id="oke-css-vars">:root{--oke-widget-spaceAbove:20px;--oke-widget-spaceBelow:20px;--oke-starRating-spaceAbove:0;--oke-starRating-spaceBelow:0;--oke-button-backgroundColor:#151515;--oke-button-backgroundColorHover:#121212;--oke-button-backgroundColorActive:#121212;--oke-button-textColor:#fff;--oke-button-textColorHover:#fff;--oke-button-textColorActive:#fff;--oke-button-borderColor:#dbdde4;--oke-button-borderColorHover:#121212;--oke-button-borderColorActive:#121212;--oke-button-borderRadius:6px;--oke-button-borderWidth:0;--oke-button-fontWeight:700;--oke-button-fontSize:var(--oke-text-regular,14px);--oke-button-fontFamily:inherit;--oke-border-color:#c5bfb4;--oke-border-width:1px;--oke-text-primaryColor:#151515;--oke-text-secondaryColor:#676986;--oke-text-small:12px;--oke-text-regular:14px;--oke-text-large:48px;--oke-text-fontFamily:inherit;--oke-avatar-size:undefined;--oke-avatar-backgroundColor:undefined;--oke-avatar-placeholderTextColor:undefined;--oke-highlightColor:#151515;--oke-shadingColor:#f7f7f8;--oke-productImageSize:48px;--oke-attributeBar-shadingColor:#9a9db1;--oke-attributeBar-borderColor:undefined;--oke-attributeBar-backgroundColor:#d3d4dd;--oke-attributeBar-markerColor:#151515;--oke-filter-backgroundColor:#fff;--oke-filter-backgroundColorActive:#151515;--oke-filter-borderColor:#dbdde4;--oke-filter-borderColorActive:#151515;--oke-filter-textColor:#151515;--oke-filter-textColorActive:#fff;--oke-filter-borderRadius:100px;--oke-filter-searchHighlightColor:#a1a1a1;--oke-mediaGrid-chevronColor:#676986;--oke-stars-foregroundColor:#151515;--oke-stars-backgroundColor:#e5e5e5;--oke-stars-borderWidth:0}.oke-w,oke-modal{--oke-title-fontWeight:600;--oke-title-fontSize:var(--oke-text-regular,14px);--oke-title-fontFamily:inherit;--oke-bodyText-fontWeight:400;--oke-bodyText-fontSize:var(--oke-text-regular,14px);--oke-bodyText-fontFamily:inherit}</style>
            <style id="oke-reviews-custom-css">.okeReviews.oke-sr{display:block}[data-oke-star-rating]{margin-bottom:6px}div.okeReviews[data-oke-container] .oke-w-reviews-count,div.okeReviews[data-oke-container] .oke-sortSelect-label,div.okeReviews[data-oke-container] .oke-w-reviewer-flag,div.okeReviews[data-oke-container] .oke-w-review-recommendation,div.okeReviews[data-oke-container] .oke-reviewContent .oke-reviewContent-title,div.okeReviews[data-oke-container] .oke-w-review-footer{display:none}div.okeReviews[data-oke-container].oke-w{max-width:unset}div.okeReviews[data-oke-container].oke-w .oke-w-reviews{margin-top:-30px}div.okeReviews[data-oke-container] .oke-reviewContent .oke-reviewContent-title{font-weight:900;font-size:1.25em;color:var(--oke-text-primaryColor)}div.okeReviews[data-oke-container] .oke-reviewContent-body p{line-height:1.5}div.oke-modal .okeReviews[data-oke-container].oke-w,div.okeReviews[data-oke-container] .oke-modal,div.okeReviews[data-oke-container] .oke-modal p,div.okeReviews[data-oke-container] .oke-modal .oke-helpful,div.okeReviews[data-oke-container] .oke-modal .oke-helpful-vote-button,div.okeReviews[data-oke-container] .oke-modal .oke-reviewContent-date{color:var(--oke-text-primaryColor)}div.okeReviews[data-oke-container] .oke-is-small .oke-w-reviews-head{display:block}div.okeReviews[data-oke-container] .oke-is-small .oke-button,div.okeReviews[data-oke-container] .oke-is-small .oke-qw-header-askQuestion{width:100%}div.okeReviews[data-oke-container] .oke-button:not(.oke-is-loading):not(.oke-is-active):hover{box-shadow:none}.okeReviews[data-oke-container] .oke-w-reviews-writeReview{display:inherit}div.okeReviews[data-oke-container] .oke-is-small .oke-w-writeReview{margin-top:5px}div.okeReviews[data-oke-container] .oke-w-reviews-head .oke-w-reviews-filterToggle .oke-icon{vertical-align:initial}div.okeReviews[data-oke-container] .oke-w-reviews-head .oke-w-writeReview:before,div.okeReviews[data-oke-container] .oke-w-reviews-head .oke-w-reviews-filterToggle .oke-icon:before{vertical-align:bottom}div.okeReviews[data-oke-container] .oke-w-reviews-controls{flex-wrap:wrap;column-gap:10px;padding-bottom:50px}div.okeReviews[data-oke-container] .oke-is-small .oke-sortSelect-label{margin-right:0}div.okeReviews[data-oke-container] .oke-helpful-vote-button{line-height:1.2}div.okeReviews[data-oke-container] .oke-w-ratingAverageModule-rating{display:flex;flex-direction:column-reverse;gap:10px;font-weight:900;line-height:1}div.okeReviews[data-oke-container] .oke-w-ratingAverageModule-rating-average{font-size:70px}div.okeReviews[data-oke-container] .oke-w-ratingAverageModule-rating-average:after{content:'/ 5'}div.okeReviews[data-oke-container] .oke-w-ratingAverageModule-rating-stars svg{height:13px}div.okeReviews[data-oke-container] .oke-w-ratingAverageModule-count{color:var(--oke-text-primaryColor);font-family:'Scto Grotesk B';font-size:40px;font-weight:900;line-height:30px;text-transform:uppercase}div.okeReviews[data-oke-container] .oke-w-reviews-controls{justify-content:center}div.okeReviews[data-oke-container] .oke-sortSelect{border:var(--oke-border-width) solid var(--oke-border-color);border-radius:6px;padding:.5em}div.okeReviews[data-oke-container] .oke-select{background-image:url("data:image/svg+xml,%3Csvg width='11' height='7' viewBox='0 0 11 7' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.101562 1.16256L0.836609 0.393554L5.10156 4.85555L9.36652 0.393555L10.1016 1.16256L5.10156 6.39355L0.101562 1.16256Z' fill='%23151515'/%3E%3Cpath d='M0.101562 1.16256L0.836609 0.393554L5.10156 4.85555L9.36652 0.393555L10.1016 1.16256L5.10156 6.39355L0.101562 1.16256Z' fill='black' fill-opacity='0.2'/%3E%3Cpath d='M0.101562 1.16256L0.836609 0.393554L5.10156 4.85555L9.36652 0.393555L10.1016 1.16256L5.10156 6.39355L0.101562 1.16256Z' fill='black' fill-opacity='0.2'/%3E%3Cpath d='M0.101562 1.16256L0.836609 0.393554L5.10156 4.85555L9.36652 0.393555L10.1016 1.16256L5.10156 6.39355L0.101562 1.16256Z' fill='black' fill-opacity='0.2'/%3E%3C/svg%3E%0A")}div.okeReviews[data-oke-container].oke-w .oke-w-review-side{border:0}div.okeReviews[data-oke-container] .oke-w-reviewer-name{text-transform:capitalize}div.okeReviews[data-oke-container] .oke-w-reviewer-verified{text-transform:lowercase;border:var(--oke-border-width) solid var(--oke-border-color);border-radius:35px;padding:2px 6px;display:flex;flex-direction:row-reverse;gap:4px;margin-top:5px}div.okeReviews[data-oke-container] .oke-w-reviewer-verified-icon:before{content:url("data:image/svg+xml,%3Csvg width='7' height='8' viewBox='0 0 7 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1.49219 3.30715L3.38859 5.89355L6.14674 0.893555' stroke='%23151515' stroke-width='1.3' stroke-linecap='round'/%3E%3Cpath d='M1.49219 3.30715L3.38859 5.89355L6.14674 0.893555' stroke='black' stroke-opacity='0.2' stroke-width='1.3' stroke-linecap='round'/%3E%3Cpath d='M1.49219 3.30715L3.38859 5.89355L6.14674 0.893555' stroke='black' stroke-opacity='0.2' stroke-width='1.3' stroke-linecap='round'/%3E%3Cpath d='M1.49219 3.30715L3.38859 5.89355L6.14674 0.893555' stroke='black' stroke-opacity='0.2' stroke-width='1.3' stroke-linecap='round'/%3E%3C/svg%3E%0A");width:auto;margin-left:0}div.okeReviews[data-oke-container] .oke-w-review-main{padding:0}.oke-drp{margin-top:50px;margin-bottom:40px}.oke-drp h1{margin-bottom:20px}</style>
            <template id="oke-reviews-body-template"><svg id="oke-star-symbols" style="display:none!important" data-oke-id="oke-star-symbols"><symbol id="oke-star-empty" style="overflow:visible;"><path id="star-default--empty" fill="var(--oke-stars-backgroundColor)" stroke="var(--oke-stars-borderColor)" stroke-width="var(--oke-stars-borderWidth)" d="M3.34 13.86c-.48.3-.76.1-.63-.44l1.08-4.56L.26 5.82c-.42-.36-.32-.7.24-.74l4.63-.37L6.92.39c.2-.52.55-.52.76 0l1.8 4.32 4.62.37c.56.05.67.37.24.74l-3.53 3.04 1.08 4.56c.13.54-.14.74-.63.44L7.3 11.43l-3.96 2.43z"/></symbol><symbol id="oke-star-filled" style="overflow:visible;"><path id="star-default--filled" fill="var(--oke-stars-foregroundColor)" stroke="var(--oke-stars-borderColor)" stroke-width="var(--oke-stars-borderWidth)" d="M3.34 13.86c-.48.3-.76.1-.63-.44l1.08-4.56L.26 5.82c-.42-.36-.32-.7.24-.74l4.63-.37L6.92.39c.2-.52.55-.52.76 0l1.8 4.32 4.62.37c.56.05.67.37.24.74l-3.53 3.04 1.08 4.56c.13.54-.14.74-.63.44L7.3 11.43l-3.96 2.43z"/></symbol></svg></template><script>document.addEventListener('readystatechange',() =>{Array.from(document.getElementById('oke-reviews-body-template')?.content.children)?.forEach(function(child){if(!Array.from(document.body.querySelectorAll('[data-oke-id='.concat(child.getAttribute('data-oke-id'),']'))).length){document.body.prepend(child)}})},{once:true});</script>




    
        <script type="application/json" id="oke-surveys-settings">{"subscriberId":"ca7cd64c-740c-453a-a4c9-3d18933b028c","options":{"renderOnSiteScripts":false},"style":{"button":{"hoverBackgroundColor":"#151515","backgroundColor":"#151515","hoverTextColor":"#FFFFFF","textColor":"#FFFFFF"},"standalone":{"pageBackgroundColor":"#F4F4F6"},"control":{"hoverBackgroundColor":"#F4F4F6","selectedBackgroundColor":"#151515","borderColor":"#E5E5EC","backgroundColor":"#FAFAFB","selectedTextColor":"#FFFFFF","textColor":"#384B57"},"text":{"primaryColor":"#151515","secondaryColor":"#6B6D80"},"stars":{"emptyColor":"#C7CCDB","filledColor":"#FFAF00"},"textField":{"focusBorderShadowColor":"#CBF2F0","borderColor":"#E5E5EC","focusBorderColor":"#57BFBE"}}}</script><script src="https://surveys.okendo.io/js/client-setup.js" async></script>
    
    










<!-- END app snippet -->

    <!-- BEGIN app snippet: okendo-reviews-json-ld -->
<!-- END app snippet -->

<!-- BEGIN app snippet: widget-plus-initialisation-script -->




    <script async id="okendo-reviews-script" src="https://cdn-static.okendo.io/reviews-widget-plus/js/okendo-reviews.js"></script>

<!-- END app snippet -->


<!-- END app block --><script src="https://cdn.shopify.com/extensions/019e6304-1439-7edb-b3fe-701936421ba3/stape-remix-46/assets/widget.js" type="text/javascript" defer="defer"></script>
<script src="https://cdn.shopify.com/extensions/019f13d1-21e4-70ed-a8db-ed16ea3a2ee2/judgeme-596/assets/loader.js" type="text/javascript" defer="defer"></script>
<link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
<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: 6910672978,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token,page_type: "collection"};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>
<script>
  window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || [];
</script>
<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,r=/bytedance/i;function o(){try{var e=document.cookie;if(!e||"string"!=typeof e)return;for(var r=0,o=e.split(";");r<o.length;r++){var d=o[r],n=d.indexOf("=");if(-1!==n){var t=d.slice(0,n).trim();if(t){var i=void 0;try{i=decodeURIComponent(t)}catch(e){i=t}if("_shopify_s"===i){var a=d.slice(n+1).trim();try{return decodeURIComponent(a)}catch(e){return a}}}}}return}catch(e){return}}return function(d,n,t,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};if(!Boolean(null==(l=null==(s=window.Shopify)?void 0:s.analytics)?void 0:l.replayQueue)){var s,l;window.Shopify=window.Shopify||{};var c=window.Shopify;c.analytics=c.analytics||{};var u=c.analytics;u.replayQueue=[],u.publish=function(e,r,o){return u.replayQueue.push([e,r,o]),!0};try{self.performance.mark("wpm:start")}catch(e){}var p,h,f,m,g,y,v,w=(h=(p={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,f=p.legacy,(m=navigator.userAgent).match(e)?"bot":m.match(h)?"modern":m.match(f)?"legacy":m.match(r)?"bot":"unknown"),b="modern"===w?"modern":"legacy",P=(null!=i?i:{modern:"",legacy:""})[b],S=[(g={baseUrl:n,hashVersion:t,buildTarget:b}).baseUrl,"/wpm","/b",g.hashVersion,"modern"===g.buildTarget?"m":"l",".js"].join(""),C=function(e){var r=e.version,d=e.browserTarget,n=e.surface,t=e.shopId,i=e.monorailEndpoint,a=window.location.href;return{emit:function(e){var s=e.status,l=e.errorMsg,c=(new Date).getTime(),u=JSON.stringify({metadata:{event_sent_at_ms:c},events:[{schema_id:"web_pixels_manager_load/3.2",payload:{version:r,bundle_target:d,page_url:a,status:s,surface:n,error_msg:l,shop_id:t,visit_token:o()},metadata:{event_created_at_ms:c}}]});if(!i)return console&&console.warn&&console.warn("[Web Pixels Manager] No Monorail endpoint provided, skipping logging."),!1;try{return self.navigator.sendBeacon.bind(self.navigator)(i,u)}catch(e){}var p=new XMLHttpRequest;try{return p.open("POST",i,!0),p.setRequestHeader("Content-Type","text/plain"),p.send(u),!0}catch(e){return console&&console.warn&&console.warn("[Web Pixels Manager] Got an unhandled error while logging to Monorail."),!1}}}}({version:t,browserTarget:w,surface:d.surface,shopId:d.shopId,monorailEndpoint:d.monorailEndpoint});try{a.browserTarget=w,function(e){var r=e.src,o=e.async,d=void 0===o||o,n=e.onload,t=e.onerror,i=e.sri,a=e.scriptDataAttributes,s=void 0===a?{}:a,l=document.createElement("script"),c=document.querySelector("head"),u=document.querySelector("body");if(l.async=d,l.src=r,i&&(l.integrity=i,l.crossOrigin="anonymous"),s)for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))try{l.dataset[p]=s[p]}catch(e){}if(n&&l.addEventListener("load",n),t&&l.addEventListener("error",t),c)c.appendChild(l);else{if(!u)throw new Error("Did not find a head or body element to append the script");u.appendChild(l)}}({src:S,async:!0,onload:function(){if(!function(){var e,r;return Boolean(null==(r=null==(e=window.Shopify)?void 0:e.analytics)?void 0:r.initialized)}()){var e=window.webPixelsManager.init(d)||void 0;if(e){var r=window.Shopify.analytics;r.replayQueue.forEach(function(r){var o=r[0],d=r[1],n=r[2];e.publishCustomEvent(o,d,n)}),r.replayQueue=[],r.publish=e.publishCustomEvent,r.visitor=e.visitor,r.initialized=!0}}},onerror:function(){return C.emit({status:"failed",errorMsg:"".concat(S," has failed to load")})},sri:(y=P,v=/^sha384-[A-Za-z0-9+/=]+$/,"string"==typeof y&&v.test(y)?P:""),scriptDataAttributes:a}),C.emit({status:"loading"})}catch(e){C.emit({status:"failed",errorMsg:(null==e?void 0:e.message)||"Unknown error"})}}}}();wpmLoader({shopId: 6910672978,storefrontBaseUrl: "https://respire.co",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://monorail-edge.shopifysvc.com/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["d5bdd5d0"],webPixelsConfigList: [{"id":"2949972304","configuration":"{\"shop\":\"respirecosmetic.myshopify.com\", \"shopliftUrl\":\"https:\/\/events.shoplift.ai\/api\/events\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"71519e2d2b1cc1c0046736bfb27fde47","type":"APP","apiClientId":7521861633,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"2824438096","configuration":"{\"siteId\":\"zf6KjOZ6iFtYpqY0\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"c9406bb6835a3b96d17b5d48e4254f48","type":"APP","apiClientId":45694124033,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_personal_data"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"2585428304","configuration":"{\"accountID\":\"PPpHT4\",\"webPixelConfig\":\"eyJlbmFibGVBZGRlZFRvQ2FydEV2ZW50cyI6IHRydWV9\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"524f6c1ee37bacdca7657a665bdca589","type":"APP","apiClientId":123074,"privacyPurposes":["ANALYTICS","MARKETING"],"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":"1874985296","configuration":"{\"webPixelName\":\"Judge.me\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"34ad157958823915625854214640f0bf","type":"APP","apiClientId":683015,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"1153827152","configuration":"{\"pixelCode\":\"CAGUN7JC77U5I49O1OE0\"}","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"},{"id":"983957840","configuration":"{\"joinDomain\":\"respire\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"aba44f25bef6b6f9c5cce3989ad88990","type":"APP","apiClientId":111364603905,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":[],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"820969808","configuration":"{\"accountID\":\"1220658\",\"workspaceId\":\"659d7ab1-726a-4402-9c2a-74dcc3650b5f\",\"projectId\":\"d3ff6d5e-4faa-4668-9e46-197a4d21c6a5\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"7f1561d8e89b361a3193f1f545354ae9","type":"APP","apiClientId":5461967,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":[],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"473661776","configuration":"{\"accountID\":\"6910672978\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"9cf281f576a3744d05c8685f9f7f3f72","type":"APP","apiClientId":10250649601,"privacyPurposes":[],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"29262160","configuration":"{\"myshopifyDomain\":\"respirecosmetic.myshopify.com\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"23b97d18e2aa74363140dc29c9284e87","type":"APP","apiClientId":2775569,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_phone","read_customer_personal_data"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"60588368","eventPayloadVersion":"1","runtimeContext":"LAX","scriptVersion":"29","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"name":"Affilae Pixel"},{"id":"66027856","eventPayloadVersion":"1","runtimeContext":"LAX","scriptVersion":"9","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"name":"GTM Custom Pixel"},{"id":"109117776","eventPayloadVersion":"1","runtimeContext":"LAX","scriptVersion":"50","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"name":"GTM new"},{"id":"114360656","eventPayloadVersion":"1","runtimeContext":"LAX","scriptVersion":"4","type":"CUSTOM","privacyPurposes":[],"name":"Stape checkout"},{"id":"shopify-app-pixel","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"0480","apiClientId":"shopify-pixel","type":"APP","privacyPurposes":["ANALYTICS","MARKETING"]},{"id":"shopify-custom-pixel","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"0480","apiClientId":"shopify-pixel","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING"]}],isMerchantRequest: false,initData: {"shop":{"name":"Respire","paymentSettings":{"currencyCode":"EUR"},"myshopifyDomain":"respirecosmetic.myshopify.com","countryCode":"FR","storefrontUrl":"https:\/\/respire.co"},"customer":null,"cart":null,"checkout":null,"productVariants":[],"products":[{"id":"10533813682512","handle":"deodorant-stick-vanille-tonka","title":"","vendor":"","type":null,"untranslatedTitle":null,"url":null,"remoteShopId":null,"variants":[{"id":"53158969409872","price":{"amount":0.0,"currencyCode":"EUR"},"image":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"10533855002960","handle":"recharge-deodorant-stick-vanille-tonka","title":"","vendor":"","type":null,"untranslatedTitle":null,"url":null,"remoteShopId":null,"variants":[{"id":"53159300137296","price":{"amount":0.0,"currencyCode":"EUR"},"image":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8782815199568","handle":"deodorant-stick-fleur-de-coton-efficace-48h","title":"","vendor":"","type":null,"untranslatedTitle":null,"url":null,"remoteShopId":null,"variants":[{"id":"47868480192848","price":{"amount":0.0,"currencyCode":"EUR"},"image":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9031400096080","handle":"recharge-deodorant-stick-fleur-de-coton-efficace-48h","title":"","vendor":"","type":null,"untranslatedTitle":null,"url":null,"remoteShopId":null,"variants":[{"id":"48204010226000","price":{"amount":0.0,"currencyCode":"EUR"},"image":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9031231734096","handle":"deodorant-stick-douceur-monoi-efficace-48h","title":"","vendor":"","type":null,"untranslatedTitle":null,"url":null,"remoteShopId":null,"variants":[{"id":"48203443339600","price":{"amount":0.0,"currencyCode":"EUR"},"image":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"10056944058704","handle":"recharge-deodorant-stick-douceur-monoi","title":"","vendor":"","type":null,"untranslatedTitle":null,"url":null,"remoteShopId":null,"variants":[{"id":"51213849166160","price":{"amount":0.0,"currencyCode":"EUR"},"image":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9031216726352","handle":"deodorant-stick-menthe-eucalyptus-efficace-48h","title":"","vendor":"","type":null,"untranslatedTitle":null,"url":null,"remoteShopId":null,"variants":[{"id":"48203367907664","price":{"amount":0.0,"currencyCode":"EUR"},"image":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"10230175039824","handle":"recharge-deodorant-stick-menthe-eucalyptus","title":"","vendor":"","type":null,"untranslatedTitle":null,"url":null,"remoteShopId":null,"variants":[{"id":"51977152168272","price":{"amount":0.0,"currencyCode":"EUR"},"image":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9555900465488","handle":"deodorant-stick-rose-pivoine-efficace-48h","title":"","vendor":"","type":null,"untranslatedTitle":null,"url":null,"remoteShopId":null,"variants":[{"id":"49142707585360","price":{"amount":0.0,"currencyCode":"EUR"},"image":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"10059497963856","handle":"recharge-deodorant-stick-rose-pivoine","title":"","vendor":"","type":null,"untranslatedTitle":null,"url":null,"remoteShopId":null,"variants":[{"id":"51236124393808","price":{"amount":0.0,"currencyCode":"EUR"},"image":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9781986787664","handle":"deodorant-stick-yuzu-basilic","title":"","vendor":"","type":null,"untranslatedTitle":null,"url":null,"remoteShopId":null,"variants":[{"id":"49820378464592","price":{"amount":0.0,"currencyCode":"EUR"},"image":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9818114490704","handle":"mini-deodorant-stick-fleur-de-coton","title":"","vendor":"","type":null,"untranslatedTitle":null,"url":null,"remoteShopId":null,"variants":[{"id":"49941366440272","price":{"amount":0.0,"currencyCode":"EUR"},"image":null,"sku":null,"title":null,"untranslatedTitle":null}]}],"purchasingCompany":null,"page":{"pageType":"collection","resourceId":617159885136}},},"https://respire.co/cdn","4074779awe500cddcp1e53a49dm5f7c656e",{"modern":"","legacy":""},{"trekkieShim":true,"apiClientId":"580111","themeId":"181964374352","pageType":"collection","resourceId":"617159885136","shopId":"6910672978","storefrontBaseUrl":"https:\/\/respire.co","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"d5bdd5d0\"]","isMerchantRequest":"false","hashVersion":"4074779awe500cddcp1e53a49dm5f7c656e","publish":"custom","events":"[[\"page_viewed\",{}],[\"collection_viewed\",{\"collection\":{\"id\":\"617159885136\",\"title\":\"Déodorants\",\"productVariants\":[{\"price\":{\"amount\":11.9,\"currencyCode\":\"EUR\"},\"product\":{\"title\":\"Déodorant stick Vanille Tonka\",\"vendor\":\"Respire\",\"id\":\"10533813682512\",\"untranslatedTitle\":\"Déodorant stick Vanille Tonka\",\"url\":\"\/products\/deodorant-stick-vanille-tonka\",\"type\":\"Unitaire\"},\"id\":\"53158969409872\",\"image\":{\"src\":\"\/\/respire.co\/cdn\/shop\/files\/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?v=1781775871\"},\"sku\":\"DSTPVT50\",\"title\":\"Default Title\",\"untranslatedTitle\":\"Default Title\"},{\"price\":{\"amount\":10.9,\"currencyCode\":\"EUR\"},\"product\":{\"title\":\"Recharge Déodorant stick Vanille Tonka\",\"vendor\":\"Respire\",\"id\":\"10533855002960\",\"untranslatedTitle\":\"Recharge Déodorant stick Vanille Tonka\",\"url\":\"\/products\/recharge-deodorant-stick-vanille-tonka\",\"type\":\"Unitaire\"},\"id\":\"53159300137296\",\"image\":{\"src\":\"\/\/respire.co\/cdn\/shop\/files\/Respire-Recharge-Deodorant-stick-Vanille-Tonka.jpg?v=1781779509\"},\"sku\":\"DSTPRECHVT\",\"title\":\"Default Title\",\"untranslatedTitle\":\"Default Title\"},{\"price\":{\"amount\":11.9,\"currencyCode\":\"EUR\"},\"product\":{\"title\":\"Déodorant stick Fleur de Coton\",\"vendor\":\"Respire\",\"id\":\"8782815199568\",\"untranslatedTitle\":\"Déodorant stick Fleur de Coton\",\"url\":\"\/products\/deodorant-stick-fleur-de-coton-efficace-48h\",\"type\":\"Unitaire\"},\"id\":\"47868480192848\",\"image\":{\"src\":\"\/\/respire.co\/cdn\/shop\/files\/deodorant-stick-fleur-de-coton-respire-6615914.jpg?v=1763637117\"},\"sku\":\"DSTPFC50\",\"title\":\"Default Title\",\"untranslatedTitle\":\"Default Title\"},{\"price\":{\"amount\":10.9,\"currencyCode\":\"EUR\"},\"product\":{\"title\":\"Recharge Déodorant stick Fleur de Coton\",\"vendor\":\"Respire\",\"id\":\"9031400096080\",\"untranslatedTitle\":\"Recharge Déodorant stick Fleur de Coton\",\"url\":\"\/products\/recharge-deodorant-stick-fleur-de-coton-efficace-48h\",\"type\":\"Unitaire\"},\"id\":\"48204010226000\",\"image\":{\"src\":\"\/\/respire.co\/cdn\/shop\/files\/recharge-deodorant-stick-fleur-de-coton-respire-7426633.jpg?v=1763636986\"},\"sku\":\"DSTPRECHFC\",\"title\":\"Default Title\",\"untranslatedTitle\":\"Default Title\"},{\"price\":{\"amount\":11.9,\"currencyCode\":\"EUR\"},\"product\":{\"title\":\"Déodorant stick Douceur Monoï\",\"vendor\":\"Respire\",\"id\":\"9031231734096\",\"untranslatedTitle\":\"Déodorant stick Douceur Monoï\",\"url\":\"\/products\/deodorant-stick-douceur-monoi-efficace-48h\",\"type\":\"Unitaire\"},\"id\":\"48203443339600\",\"image\":{\"src\":\"\/\/respire.co\/cdn\/shop\/files\/deodorant-stick-douceur-monoi-respire-2643009.jpg?v=1763575826\"},\"sku\":\"DSTPDM50\",\"title\":\"Default Title\",\"untranslatedTitle\":\"Default Title\"},{\"price\":{\"amount\":10.9,\"currencyCode\":\"EUR\"},\"product\":{\"title\":\"Recharge Déodorant stick Douceur Monoï\",\"vendor\":\"Respire\",\"id\":\"10056944058704\",\"untranslatedTitle\":\"Recharge Déodorant stick Douceur Monoï\",\"url\":\"\/products\/recharge-deodorant-stick-douceur-monoi\",\"type\":\"Unitaire\"},\"id\":\"51213849166160\",\"image\":{\"src\":\"\/\/respire.co\/cdn\/shop\/files\/recharge-deodorant-stick-douceur-monoi-respire-6489958.jpg?v=1755619538\"},\"sku\":\"DSTPRECHDM\",\"title\":\"Default Title\",\"untranslatedTitle\":\"Default Title\"},{\"price\":{\"amount\":11.9,\"currencyCode\":\"EUR\"},\"product\":{\"title\":\"Déodorant stick Menthe Eucalyptus\",\"vendor\":\"Respire\",\"id\":\"9031216726352\",\"untranslatedTitle\":\"Déodorant stick Menthe Eucalyptus\",\"url\":\"\/products\/deodorant-stick-menthe-eucalyptus-efficace-48h\",\"type\":\"Unitaire\"},\"id\":\"48203367907664\",\"image\":{\"src\":\"\/\/respire.co\/cdn\/shop\/files\/deodorant-stick-menthe-eucalyptus-respire-4222462.jpg?v=1763570667\"},\"sku\":\"DSTPME50\",\"title\":\"Default Title\",\"untranslatedTitle\":\"Default Title\"},{\"price\":{\"amount\":10.9,\"currencyCode\":\"EUR\"},\"product\":{\"title\":\"Recharge Déodorant stick Menthe Eucalyptus\",\"vendor\":\"Respire\",\"id\":\"10230175039824\",\"untranslatedTitle\":\"Recharge Déodorant stick Menthe Eucalyptus\",\"url\":\"\/products\/recharge-deodorant-stick-menthe-eucalyptus\",\"type\":\"Unitaire\"},\"id\":\"51977152168272\",\"image\":{\"src\":\"\/\/respire.co\/cdn\/shop\/files\/Recharge_Menthe_Eucalyptus_ombre.jpg?v=1756740751\"},\"sku\":\"DSTPRECHME\",\"title\":\"Default Title\",\"untranslatedTitle\":\"Default Title\"},{\"price\":{\"amount\":11.9,\"currencyCode\":\"EUR\"},\"product\":{\"title\":\"Déodorant stick Rose Pivoine\",\"vendor\":\"Respire\",\"id\":\"9555900465488\",\"untranslatedTitle\":\"Déodorant stick Rose Pivoine\",\"url\":\"\/products\/deodorant-stick-rose-pivoine-efficace-48h\",\"type\":\"Unitaire\"},\"id\":\"49142707585360\",\"image\":{\"src\":\"\/\/respire.co\/cdn\/shop\/files\/deodorant-stick-rose-pivoine-respire-9714692.jpg?v=1755619654\"},\"sku\":\"DSTPRP50\",\"title\":\"Default Title\",\"untranslatedTitle\":\"Default Title\"},{\"price\":{\"amount\":10.9,\"currencyCode\":\"EUR\"},\"product\":{\"title\":\"Recharge Déodorant stick Rose Pivoine\",\"vendor\":\"Respire\",\"id\":\"10059497963856\",\"untranslatedTitle\":\"Recharge Déodorant stick Rose Pivoine\",\"url\":\"\/products\/recharge-deodorant-stick-rose-pivoine\",\"type\":\"Unitaire\"},\"id\":\"51236124393808\",\"image\":{\"src\":\"\/\/respire.co\/cdn\/shop\/files\/recharge-deodorant-stick-rose-pivoine-respire-4650942.jpg?v=1755619538\"},\"sku\":\"DSTPRECHRP\",\"title\":\"Default Title\",\"untranslatedTitle\":\"Default Title\"},{\"price\":{\"amount\":11.9,\"currencyCode\":\"EUR\"},\"product\":{\"title\":\"Déodorant stick Yuzu Basilic Énergisant\",\"vendor\":\"Respire\",\"id\":\"9781986787664\",\"untranslatedTitle\":\"Déodorant stick Yuzu Basilic Énergisant\",\"url\":\"\/products\/deodorant-stick-yuzu-basilic\",\"type\":\"Unitaire\"},\"id\":\"49820378464592\",\"image\":{\"src\":\"\/\/respire.co\/cdn\/shop\/files\/deodorant-stick-yuzu-basilic-energisant-respire-2109915.jpg?v=1755619561\"},\"sku\":\"DSTPYB50\",\"title\":\"Default Title\",\"untranslatedTitle\":\"Default Title\"},{\"price\":{\"amount\":6.9,\"currencyCode\":\"EUR\"},\"product\":{\"title\":\"Déodorant stick Fleur de Coton 20g\",\"vendor\":\"Respire\",\"id\":\"9818114490704\",\"untranslatedTitle\":\"Déodorant stick Fleur de Coton 20g\",\"url\":\"\/products\/mini-deodorant-stick-fleur-de-coton\",\"type\":\"Unitaire\"},\"id\":\"49941366440272\",\"image\":{\"src\":\"\/\/respire.co\/cdn\/shop\/files\/mini-deodorant-stick-fleur-de-coton-respire-8176735.jpg?v=1755619556\"},\"sku\":\"DSOFC20\",\"title\":\"Default Title\",\"untranslatedTitle\":\"Default Title\"}]}}]]"});})();</script><script>
  window.ShopifyAnalytics = window.ShopifyAnalytics || {};
  window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {};
  window.ShopifyAnalytics.meta.currency = 'EUR';
  var meta = {"products":[{"id":10533813682512,"gid":"gid:\/\/shopify\/Product\/10533813682512","vendor":"Respire","type":"Unitaire","handle":"deodorant-stick-vanille-tonka","variants":[{"id":53158969409872,"price":1190,"name":"Déodorant stick Vanille Tonka","public_title":null,"sku":"DSTPVT50"}],"remote":false},{"id":10533855002960,"gid":"gid:\/\/shopify\/Product\/10533855002960","vendor":"Respire","type":"Unitaire","handle":"recharge-deodorant-stick-vanille-tonka","variants":[{"id":53159300137296,"price":1090,"name":"Recharge Déodorant stick Vanille Tonka","public_title":null,"sku":"DSTPRECHVT"}],"remote":false},{"id":8782815199568,"gid":"gid:\/\/shopify\/Product\/8782815199568","vendor":"Respire","type":"Unitaire","handle":"deodorant-stick-fleur-de-coton-efficace-48h","variants":[{"id":47868480192848,"price":1190,"name":"Déodorant stick Fleur de Coton","public_title":null,"sku":"DSTPFC50"}],"remote":false},{"id":9031400096080,"gid":"gid:\/\/shopify\/Product\/9031400096080","vendor":"Respire","type":"Unitaire","handle":"recharge-deodorant-stick-fleur-de-coton-efficace-48h","variants":[{"id":48204010226000,"price":1090,"name":"Recharge Déodorant stick Fleur de Coton","public_title":null,"sku":"DSTPRECHFC"}],"remote":false},{"id":9031231734096,"gid":"gid:\/\/shopify\/Product\/9031231734096","vendor":"Respire","type":"Unitaire","handle":"deodorant-stick-douceur-monoi-efficace-48h","variants":[{"id":48203443339600,"price":1190,"name":"Déodorant stick Douceur Monoï","public_title":null,"sku":"DSTPDM50"}],"remote":false},{"id":10056944058704,"gid":"gid:\/\/shopify\/Product\/10056944058704","vendor":"Respire","type":"Unitaire","handle":"recharge-deodorant-stick-douceur-monoi","variants":[{"id":51213849166160,"price":1090,"name":"Recharge Déodorant stick Douceur Monoï","public_title":null,"sku":"DSTPRECHDM"}],"remote":false},{"id":9031216726352,"gid":"gid:\/\/shopify\/Product\/9031216726352","vendor":"Respire","type":"Unitaire","handle":"deodorant-stick-menthe-eucalyptus-efficace-48h","variants":[{"id":48203367907664,"price":1190,"name":"Déodorant stick Menthe Eucalyptus","public_title":null,"sku":"DSTPME50"}],"remote":false},{"id":10230175039824,"gid":"gid:\/\/shopify\/Product\/10230175039824","vendor":"Respire","type":"Unitaire","handle":"recharge-deodorant-stick-menthe-eucalyptus","variants":[{"id":51977152168272,"price":1090,"name":"Recharge Déodorant stick Menthe Eucalyptus","public_title":null,"sku":"DSTPRECHME"}],"remote":false},{"id":9555900465488,"gid":"gid:\/\/shopify\/Product\/9555900465488","vendor":"Respire","type":"Unitaire","handle":"deodorant-stick-rose-pivoine-efficace-48h","variants":[{"id":49142707585360,"price":1190,"name":"Déodorant stick Rose Pivoine","public_title":null,"sku":"DSTPRP50"}],"remote":false},{"id":10059497963856,"gid":"gid:\/\/shopify\/Product\/10059497963856","vendor":"Respire","type":"Unitaire","handle":"recharge-deodorant-stick-rose-pivoine","variants":[{"id":51236124393808,"price":1090,"name":"Recharge Déodorant stick Rose Pivoine","public_title":null,"sku":"DSTPRECHRP"}],"remote":false},{"id":9781986787664,"gid":"gid:\/\/shopify\/Product\/9781986787664","vendor":"Respire","type":"Unitaire","handle":"deodorant-stick-yuzu-basilic","variants":[{"id":49820378464592,"price":1190,"name":"Déodorant stick Yuzu Basilic Énergisant","public_title":null,"sku":"DSTPYB50"}],"remote":false},{"id":9818114490704,"gid":"gid:\/\/shopify\/Product\/9818114490704","vendor":"Respire","type":"Unitaire","handle":"mini-deodorant-stick-fleur-de-coton","variants":[{"id":49941366440272,"price":690,"name":"Déodorant stick Fleur de Coton 20g","public_title":null,"sku":"DSOFC20"}],"remote":false}],"page":{"pageType":"collection","resourceType":"collection","resourceId":617159885136,"requestId":"1d92d009-e849-49cb-b06a-8d952ce4ed50-1782745863"}};
  for (var attr in meta) {
    window.ShopifyAnalytics.meta[attr] = meta[attr];
  }
</script>
<script class="analytics">
  (function () {
    var customDocumentWrite = function(content) {
      var jquery = null;

      if (window.jQuery) {
        jquery = window.jQuery;
      } else if (window.Checkout && window.Checkout.$) {
        jquery = window.Checkout.$;
      }

      if (jquery) {
        jquery('body').append(content);
      }
    };

    var hasLoggedConversion = function(token) {
      if (token) {
        return document.cookie.indexOf('loggedConversion=' + token) !== -1;
      }
      return false;
    }

    var setCookieIfConversion = function(token) {
      if (token) {
        var twoMonthsFromNow = new Date(Date.now());
        twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2);

        document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow;
      }
    }

    var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || [];
    window.ShopifyAnalytics.lib.trekkie = window.trekkie;
    if (trekkie.integrations) {
      return;
    }
    trekkie.methods = [
      'identify',
      'page',
      'ready',
      'track',
      'trackForm',
      'trackLink'
    ];
    trekkie.factory = function(method) {
      return function() {
        var args = Array.prototype.slice.call(arguments);
        args.unshift(method);
        trekkie.push(args);
        if (window.__TREKKIE_SHIM_QUEUE && (method == 'track' || method == 'page')) {
          try {
            window.__TREKKIE_SHIM_QUEUE.push({
              from: 'trekkie-stub',
              method: method,
              args: args.slice(1)
            });
          } catch (e) {
            // no-op
          }
        }
        return trekkie;
      };
    };
    for (var i = 0; i < trekkie.methods.length; i++) {
      var key = trekkie.methods[i];
      trekkie[key] = trekkie.factory(key);
    }
    trekkie.load = function(config) {
      trekkie.config = config || {};
      trekkie.config.initialDocumentCookie = document.cookie;
      var first = document.getElementsByTagName('script')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.onerror = function(e) {
  var scriptFallback = document.createElement('script');
  scriptFallback.type = 'text/javascript';
  scriptFallback.onerror = function(error) {
          var Monorail = {
      produce: function produce(monorailDomain, schemaId, payload) {
        var currentMs = new Date().getTime();
        var event = {
          schema_id: schemaId,
          payload: payload,
          metadata: {
            event_created_at_ms: currentMs,
            event_sent_at_ms: currentMs
          }
        };
        return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event));
      },
      sendRequest: function sendRequest(endpointUrl, payload) {
        // Try the sendBeacon API
        if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) {
          var blobData = new window.Blob([payload], {
            type: 'text/plain'
          });

          if (window.navigator.sendBeacon(endpointUrl, blobData)) {
            return true;
          } // sendBeacon was not successful

        } // XHR beacon

        var xhr = new XMLHttpRequest();

        try {
          xhr.open('POST', endpointUrl);
          xhr.setRequestHeader('Content-Type', 'text/plain');
          xhr.send(payload);
        } catch (e) {
          console.log(e);
        }

        return false;
      },
      isIos12: function isIos12() {
        return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1;
      }
    };
    Monorail.produce('monorail-edge.shopifysvc.com',
      'trekkie_storefront_load_errors/1.1',
      {shop_id: 6910672978,
      theme_id: 181964374352,
      app_name: "storefront",
      context_url: window.location.href,
      source_url: "//respire.co/cdn/s/trekkie.storefront.370ef8ffef154dc56bb5a814fea4666724353464.min.js"});

  };
  scriptFallback.async = true;
  scriptFallback.src = '//respire.co/cdn/s/trekkie.storefront.370ef8ffef154dc56bb5a814fea4666724353464.min.js';
  first.parentNode.insertBefore(scriptFallback, first);
};
script.async = true;
script.src = '//respire.co/cdn/s/trekkie.storefront.370ef8ffef154dc56bb5a814fea4666724353464.min.js';
first.parentNode.insertBefore(script, first);

    };
    trekkie.load(
      {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":6910672978,"isMerchantRequest":null,"themeId":181964374352,"themeCityHash":"16664564783438962195","contentLanguage":"fr","currency":"EUR","eventMetadataId":"d35e5498-ff82-4b0e-b82b-0ab8170817f7"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["b5387b81","d5bdd5d0"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":false,"source":"trekkie-storefront-renderer","apiClientId":580111}}
    );

    var loaded = false;
    trekkie.ready(function() {
      if (loaded) return;
      loaded = true;

      window.ShopifyAnalytics.lib = window.trekkie;

      var originalDocumentWrite = document.write;
      document.write = customDocumentWrite;
      try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {};
      document.write = originalDocumentWrite;

      window.ShopifyAnalytics.lib.page(null,{"pageType":"collection","resourceType":"collection","resourceId":617159885136,"requestId":"1d92d009-e849-49cb-b06a-8d952ce4ed50-1782745863","shopifyEmitted":true});

      var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/)
      var token = match? match[1]: undefined;
      if (!hasLoggedConversion(token)) {
        setCookieIfConversion(token);
        window.ShopifyAnalytics.lib.track("Viewed Product Category",{"currency":"EUR","category":"Collection: deodorant","collectionName":"deodorant","collectionId":617159885136,"nonInteraction":true},undefined,undefined,{"shopifyEmitted":true});
      }
    });

    var eventsListenerScript = document.createElement('script');
    eventsListenerScript.async = true;
    eventsListenerScript.src = "//respire.co/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js";
    document.getElementsByTagName('head')[0].appendChild(eventsListenerScript);
})();</script>
<script
  defer
 src="https://respire.co/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.6.0.min.js"
  data-application="storefront-renderer"
  data-shop-id="6910672978"
  data-render-region="gcp-europe-west1"
  data-page-type="collection"
  data-theme-instance-id="181964374352"
  data-theme-name="bootstrap"
  data-theme-version="0.1.0"
  data-monorail-region="shop_domain"
  data-resource-timing-sampling-rate="10"
  data-shs="true"
  data-shs-beacon="true"
  data-shs-export-with-fetch="true"
  data-shs-logs-sample-rate="1"
  data-shs-beacon-endpoint="https://respire.co/api/collect"
></script>
</head><body class="font-sans text-16"><!-- BEGIN sections: header-group -->
<header id="shopify-section-sections--26281157493072__header" class="shopify-section shopify-section-group-header-group">
<div aria-hidden class="pt-header" data-type="spacer"></div><div
 x-data="header"
 id="header"
 class="offset-with-banner fixed left-0 right-0 top-0 z-11"
 :class="(isBannerHidden || isMobileNavOpen) && 'banner-hidden'"
>
 
 

 
<div
 class='relative z-10 grid h-28 place-items-center whitespace-nowrap justify-center text-center text-12'
 style='background-color: #000000; color: #ffffff'
>
 
 

<div
 x-data='slideshow({groupBy:1,autoPlayInterval:5000,disableLg:false,loop:false, displayChildrenCountMobile:-1, displayChildrenCountDesktop: -1})'
 
 class='w-full max-w-[var(--screenWidth)]'
 
><div
 x-ref='wrapper'
 @touchstart='handleTouchStart'
 class='flex [&>*]:shrink-0 justify-start items-stretch [&>*]:snap-center overflow-x-auto overscroll-x-contain scrollbar-hide snap-x snap-mandatory scroll-smooth items-center'
 >
 
 
 <span class='flex w-full items-center justify-center heir-a:underline'>
 <p>Derniers jours de la <a href="/collections/vente-archives" title="Vente Archives"><strong>Vente Archives</strong></a><strong>    </strong></p>
 
 
 <span>&nbsp;</span> 
 
 <span class='font-bold'>
 


























<span
 class="countdown"
 x-data=" countdown({ day: '2026-06-30', hours: '23:59', labels: { days: 'J', hours: 'H', minutes: 'M', seconds: 'S' } }) "
><span x-html="countdownText">
 
 
 01J
 
 06H
 47M
 
 
 </span></span>
 </span>
 
 </span>
 
 <span class='flex w-full items-center justify-center heir-a:underline'>
 <p><strong>Stick Solaire offert </strong>dès 70€ d'achat</p>
 
 </span>
 
 <span class='flex w-full items-center justify-center heir-a:underline'>
 <p><strong>Livraison offerte</strong> dès 45€ d'achat</p>
 
 </span>
 
 <span class='flex w-full items-center justify-center heir-a:underline'>
 <p><strong>NOUVEAU </strong>Déodorant stick Vanille Tonka, enfin <a href="/products/deodorant-stick-vanille-tonka" title="Déodorant stick Vanille Tonka">disponible</a></p>
 
 </span>
 
 
 </div>
</div>
</div>
 
 <div class="relative z-10 h-nav border-b border-grey-light/50 bg-white text-black"><div class="grid-container flex h-nav items-center justify-between"><div class="flex items-center gap-24 lg:hidden"><button
 class="header-burger pointer-events-auto relative aspect-square w-17"
 aria-label="Menu"
 data-tag="menu_nav"
 data-menu="menu-burger"
 data-trk="button-cta-nav-menu-menu-burger"
 :aria-expanded="isMobileNavOpen ? true : false"
 @click="handleBurgerClick;$store.global.isSearchVisible=false"
 ><div class="absolute inset-0 flex flex-col justify-between"><span class="header-burger-open-line"></span><span class="header-burger-open-line"></span><span class="header-burger-open-line"></span></div><div class="absolute inset-0"><span class="header-burger-close-line-wrapper absolute-center rotate-45"><span class="header-burger-close-line origin-left"></span></span><span
 class="header-burger-close-line-wrapper absolute-center -rotate-45"
 ><span class="header-burger-close-line origin-right"></span></span></div></button><button
 x-data
 @click="$store.global.isSearchVisible=!$store.global.isSearchVisible;isMobileNavOpen=false"
 aria-label="Rechercher"
 data-tag="menu_nav"
 data-menu="search"
 data-trk="button-cta-nav-menu-search"
 class="lg:hidden"
 >
 <svg viewbox='0 0 17 17' fill='none' xmlns='http://www.w3.org/2000/svg' class='h-18 w-18'><path d="M13.92 8.32a6.55 6.55 0 1 1-13.1 0 6.55 6.55 0 0 1 13.1 0Z" stroke="currentColor" stroke-width="1.6"/><path d="M13.92 8.32a6.55 6.55 0 1 1-13.1 0 6.55 6.55 0 0 1 13.1 0Zm-2.45 4.28 3.98 3.8m-3.98-3.8 3.98 3.8m-3.98-3.8 3.98 3.8" stroke="currentColor" stroke-width="1.6"/></svg>
 </button></div><nav
 @mouseleave="closeAllPanels"
 role="navigation"
 class="flex h-full items-center gap-10 text-12/narrow font-bold"
 ><a
 @mouseenter="closeAllPanels"
 @click="closeMobileNav(); $store.global.isSearchVisible=false;"
 href="/"
 class="lg-max:absolute-center block h-28 lg:mr-28"
 aria-label="Home page"
 data-tag="menu_nav"
 data-menu="home-page"
 data-trk="button-cta-nav-menu-home-page"
 ><svg viewbox='0 0 440 128' fill='none' xmlns='http://www.w3.org/2000/svg' class='h-full'><path d="M277.23 99.77h32.89c1.05 0 1.74-.7 1.74-1.68v-3.16c0-1.06-.7-1.69-1.74-1.69h-1.05a6.87 6.87 0 0 1-6.84-6.88V31.4c0-1.05-.7-1.68-1.75-1.68h-2.72l-21.93 6.88c-1.4.35-1.74 1.05-1.74 1.68v3.44c0 1.05.7 1.4 1.4 1.4s3.41-.7 4.81-.7c3.07 0 4.82 2.04 4.82 5.13v38.82c0 3.8-3.07 6.88-6.85 6.88h-1.04c-1.05 0-1.75.7-1.75 1.69v3.09c0 1.05.7 1.68 1.75 1.68M0 41.71c0 1.05.7 1.4 1.4 1.4s3.42-.7 4.81-.7c3.08 0 4.82 2.04 4.82 5.13v38.82c0 3.8-3.07 6.88-6.84 6.88H3.14c-1.05 0-1.74.7-1.74 1.69v3.09c0 1.05.7 1.68 1.74 1.68h35.97c1.04 0 1.74-.7 1.74-1.68v-3.1c0-1.05-.7-1.68-1.74-1.68h-4.12a6.87 6.87 0 0 1-6.85-6.88V59.9c0-9.26 7.2-14.74 13.34-14.74 5.45 0 5.45 2.74 10.26 2.74a9.04 9.04 0 0 0 8.87-8.92c0-4.77-3.77-10.32-10.96-10.32-12.99 0-18.85 12.36-21.58 19.59V31.39c0-1.05-.7-1.68-1.74-1.68H23.6L1.75 36.59C.35 36.94 0 37.64 0 38.27v3.44Zm59.57 23.03c0-20.64 16.06-36.09 34.21-36.09 20.88 0 29.12 17.2 29.12 26.47 0 2.04-1.05 3.8-4.47 3.8H77.37v.34c0 17.83 10.27 27.8 21.93 27.8 9.92 0 15.43-4.84 18.5-12 .35-.7.7-1.4 2.03-1.4h1.67c1.05 0 1.75.7 1.4 2.03-2.02 10.32-9.57 25.77-29.12 25.77S59.57 86.7 59.57 64.74Zm18.5-12.43h24.65a3.81 3.81 0 0 0 3.77-3.79c0-4.84-4.12-12.7-12.64-12.7-6.56 0-13.68 5.9-15.78 16.5Zm52.72 39.53c-.35 1.4 0 2.03 1.05 2.74 1.05.7 15.08 6.88 25.35 6.88 16.4 0 26.32-7.87 26.32-21.63 0-12.7-8.58-18.18-15.43-20.64l-6.5-2.38c-2.72-1.06-14.03-3.44-14.03-12.36 0-5.13 4.82-8.57 10.62-8.57 8.24 0 14.73 8.29 14.73 13.41 0 1.06.7 1.69 1.68 1.69h3.07c1.05 0 1.75-.7 1.75-1.69V34.83c0-1.05-.7-1.4-1.75-1.68-3.07-1.06-9.92-4.43-19.83-4.43-15.09 0-25.98 7.59-25.98 19.94 0 11.73 9.22 17.2 17.1 19.94l8.6 3.09c5.45 2.03 10.26 5.83 10.26 12 0 5.48-4.47 10.6-10.96 10.6-11.31 0-16.41-9.61-16.41-17.48v-1.4c0-1.4-.7-1.69-1.68-2.04l-2.02-.35c-1.4-.35-2.03.35-2.38 1.4l-3.56 17.42Zm58.17-50.13c0 1.05.7 1.4 1.4 1.4s3.42-.7 4.82-.7c3.07 0 4.81 2.04 4.81 5.13v66.27c0 3.8-3.07 6.88-6.84 6.88h-1.05c-1.04 0-1.74.7-1.74 1.69v3.09c0 1.05.7 1.68 1.74 1.68h34.57c1.05 0 1.75-.7 1.75-1.69v-3.08c0-1.06-.7-1.69-1.75-1.69h-2.72a6.87 6.87 0 0 1-6.85-6.88V93.17c4.12 4.85 10.27 8.29 19.49 8.29 17.1 0 30.44-15.1 30.44-39.53 0-17.2-9.91-33.35-27.02-33.35-12.99 0-20.18 9.27-22.9 15.8V31.39c0-1.05-.7-1.68-1.75-1.68h-2.73l-21.92 6.88c-1.4.35-1.68 1.05-1.68 1.68v3.44h-.07Zm28.07 39.18V56.1c0-5.47 4.12-16.85 15.72-16.85 9.91 0 16.4 9.27 16.4 26.47 0 18.89-8.86 25.06-16.75 25.06-6.5 0-12.64-3.72-15.37-9.9Zm65.36-70.77c0 5.83 4.48 10.32 10.62 10.32a10.1 10.1 0 0 0 10.26-10.32c0-5.48-4.46-9.97-10.26-9.97-6.14 0-10.62 4.42-10.62 9.97Zm34.57 31.6c0 1.04.7 1.4 1.4 1.4s3.42-.7 4.82-.7c3.07 0 4.81 2.03 4.81 5.12v38.82c0 3.8-3.07 6.88-6.84 6.88h-1.05c-1.04 0-1.74.7-1.74 1.69v3.09c0 1.05.7 1.68 1.74 1.68h35.97c1.04 0 1.74-.7 1.74-1.68v-3.1c0-1.05-.7-1.68-1.74-1.68h-4.12a6.87 6.87 0 0 1-6.85-6.88V59.9c0-9.26 7.2-14.74 13.34-14.74 5.45 0 5.45 2.74 10.27 2.74a9.04 9.04 0 0 0 8.87-8.92c0-4.77-3.78-10.32-10.97-10.32-12.99 0-18.85 12.36-21.58 19.59V31.39c0-1.05-.7-1.68-1.74-1.68h-2.73l-21.92 6.88c-1.4.35-1.75 1.05-1.75 1.68l.07 3.44Zm59.57 23.02c0-20.64 16.06-36.09 34.21-36.09 20.88 0 29.12 17.2 29.12 26.47 0 2.04-1.04 3.8-4.47 3.8h-41.06v.34c0 17.83 10.27 27.8 21.93 27.8 9.92 0 15.43-4.84 18.5-12 .36-.7.7-1.4 2.03-1.4h1.75c1.04 0 1.67.7 1.4 2.03-2.03 10.32-9.57 25.77-29.13 25.77-19.48 0-34.21-14.75-34.21-36.8m18.43-12.35h24.65a3.81 3.81 0 0 0 3.77-3.79c0-4.84-4.12-12.7-12.64-12.7-6.56 0-13.75 5.9-15.78 16.5Z" fill="currentColor"/></svg></a><div class="flex h-full items-center gap-20 lg-max:hidden"><a 
 href=/collections/vente-archives 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left header-link uppercase'
 
 
 
 x-data
 @mouseenter='handleLinkMouseEnter'
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-vente-archives'>Vente Archives</a>
 
<button 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left header-link uppercase'
 
 
aria-haspopup="true" :aria-expanded="currentPanelIndex == 1 ? true : false" data-panel-index="1"
 
 x-data
 @mouseenter='handleLinkMouseEnter'
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-nos-soins'>Nos soins</button>

<button 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left header-link uppercase'
 
 
aria-haspopup="true" :aria-expanded="currentPanelIndex == 2 ? true : false" data-panel-index="2"
 
 x-data
 @mouseenter='handleLinkMouseEnter'
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-a-propos'>A propos</button>





</div>
<div
 x-cloak
 x-show="currentPanelIndex === 1"
 x-transition:enter="transition-transform ease-expo-out duration-500 transform-gpu"
 x-transition:enter-start="-translate-y-8"
 class="header-panel fixed inset-x-0 top-header bg-white py-20"
 ><div class="grid-container flex items-start span-gap-x-1-wider"><ul class="flex flex-wrap py-20 span-w-17 span-gap-1-wider"><li class="span-w-5">
 <a 
 href=/collections/all 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left uppercase mb-20'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-selection'>Sélection</a>
 
 <ul>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/vente-archives 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-vente-archives-new'>Vente Archives <b>[New]</b></a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/nouveautes 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-nouveautes'>Nouveautés</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/solaire 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-solaires'>Solaires</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/kits-duo 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-kits-routines'>Kits & Routines</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/pages/diagnostic/diagnostic 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-diagnostic-de-peau'>Diagnostic de peau</a>
 </li>
 
<a 
 href=/collections/all 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left mt-10'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-selection'>Tout voir</a>
 </ul>
 
 </li>
 <li class="span-w-5">
 <a 
 href=/collections/visage 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left uppercase mb-20'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-preoccupations'>Préoccupations</a>
 
 <ul>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/taches-pigmentaires-vieillissement-cutane 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-vieillissement-cutane'>Vieillissement cutané</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/cernes-et-teint-terne 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-cernes-teint-terne'>Cernes & Teint Terne</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/gamme-anti-imperfections 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-imperfections-exces-de-sebum'>Imperfections & Excès de sébum</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/hydratation 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-deshydratation-secheresse-cutanee'>Déshydratation & Sécheresse cutanée</a>
 </li>
 
<a 
 href=/collections/visage 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left mt-10'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-preoccupations'>Tout voir</a>
 </ul>
 
 </li>
 <li class="span-w-5">
 <a 
 href=/collections/visage 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left uppercase mb-20'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-ingredients'>Ingrédients</a>
 
 <ul>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/filtres-solaires 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-filtres-solaires'>Filtres Solaires </a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/acide-hyaluronique-ceramide 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-acide-hyaluronique-ceramide'>Acide Hyaluronique & Céramide </a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/vitamine-c 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-vitamine-c-ginseng-rouge'>Vitamine C & Ginseng Rouge </a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/acide-salicylique-prebiotiques 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-acide-salicylique-prebiotique'>Acide Salicylique & Prébiotique</a>
 </li>
 
<a 
 href=/collections/visage 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left mt-10'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-ingredients'>Tout voir</a>
 </ul>
 
 </li>
 <li class="span-w-5">
 <a 
 href=/collections/visage 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left uppercase mb-20'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-soins-du-visage'>Soins du Visage</a>
 
 <ul>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/soin-levres 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-soin-levres'>Soin Lèvres </a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/serums-visage-naturels 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-serums'>Sérums</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/cremes-visages-naturelles 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-cremes'>Crèmes</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/nettoyants-visage 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-nettoyants-demaquillants'>Nettoyants & Démaquillants</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/masque-visage 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-masque'>Masque</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/contour-des-yeux 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-contour-des-yeux'>Contour des yeux</a>
 </li>
 
<a 
 href=/collections/visage 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left mt-10'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-soins-du-visage'>Tout voir</a>
 </ul>
 
 </li>
 <li class="span-w-5">
 <a 
 href=/collections/deodorant 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left uppercase mb-20'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-deodorants'>Déodorants</a>
 
 <ul>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/deodorants-solides-naturels 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-deodorants-sticks'>Déodorants sticks</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/deodorants-sticks-carton-certifies-bio 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-deodorants-stick-carton'>Déodorants stick carton</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/deodorants-roll-on-naturels 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-deodorants-roll-on'>Déodorants roll-on</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/recharges 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-recharges'>Recharges</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/kit-personnalise 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-kit-personnalise'>Kit Personnalisé</a>
 </li>
 
<a 
 href=/collections/deodorant 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left mt-10'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-deodorants'>Tout voir</a>
 </ul>
 
 </li>
 <li class="span-w-5">
 <a 
 href=/collections/corps 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left uppercase mb-20'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-soins-du-corps'>Soins du Corps</a>
 
 <ul>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/shampoings-solides 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-shampoings-apres-shampoings'>Shampoings & Après-shampoings</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/savons-naturels 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-savons-exfoliants'>Savons & Exfoliants</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/dentifrices-naturels 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-dentifrices'>Dentifrices</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/collections/corps-baume-huile-seche-naturels 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-hydratants-corps-mains-et-levres'>Hydratants corps, mains et lèvres</a>
 </li>
 
<a 
 href=/collections/corps 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left mt-10'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-soins-du-corps'>Tout voir</a>
 </ul>
 
 </li>
 
 </ul><ul class="flex flex-wrap span-w-12 gutter-gap-1">
 
<li class="relative overflow-clip rounded-md span-w-4"><a
 @click="closeAllPanels"
 href="/pages/gamme-daily-protect"
 class="group relative overflow-clip"
 data-tag="menu_nav"
 data-menu="newsolaires"
 data-trk="button-cta-nav-menu-newsolaires"
 >
 <picture
 class="block group-hover:scale-110 transition-transform duration-1000 group-hover:duration-500 ease-expo-out"
 ><source
 media="(max-width: 1023px)"
 srcset="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
 width="0"
 height="0"
 >
 <img src="//respire.co/cdn/shop/files/Respire_DailyProtect_2026_StickSolaire_02_1.jpg?crop=center&amp;height=420&amp;v=1774145353&amp;width=420" alt="" width="420" height="420" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire_DailyProtect_2026_StickSolaire_02_1.jpg?crop=center&amp;height=960&amp;v=1774145353&amp;width=960 960w,//respire.co/cdn/shop/files/Respire_DailyProtect_2026_StickSolaire_02_1.jpg?crop=center&amp;height=1200&amp;v=1774145353&amp;width=1200 1200w,//respire.co/cdn/shop/files/Respire_DailyProtect_2026_StickSolaire_02_1.jpg?crop=center&amp;height=1920&amp;v=1774145353&amp;width=1920 1920w,//respire.co/cdn/shop/files/Respire_DailyProtect_2026_StickSolaire_02_1.jpg?crop=center&amp;height=2400&amp;v=1774145353&amp;width=2400 2400w" sizes="29vw" class="w-full">
</picture><span class="absolute left-8 top-8 text-20/none font-black tracking-tight text-black">[NEW]<br>SOLAIRES</span></a></li>
 
<li class="relative overflow-clip rounded-md span-w-4"><a
 @click="closeAllPanels"
 href="/pages/soin-levres-collagene-booster"
 class="group relative overflow-clip"
 data-tag="menu_nav"
 data-menu="newsoin-levres"
 data-trk="button-cta-nav-menu-newsoin-levres"
 >
 <picture
 class="block group-hover:scale-110 transition-transform duration-1000 group-hover:duration-500 ease-expo-out"
 ><source
 media="(max-width: 1023px)"
 srcset="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
 width="0"
 height="0"
 >
 <img src="//respire.co/cdn/shop/files/Respire-Soin-Levres-Collagene-Booster-Texture.jpg?crop=center&amp;height=420&amp;v=1775825680&amp;width=420" alt="" width="420" height="420" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Soin-Levres-Collagene-Booster-Texture.jpg?crop=center&amp;height=960&amp;v=1775825680&amp;width=960 960w,//respire.co/cdn/shop/files/Respire-Soin-Levres-Collagene-Booster-Texture.jpg?crop=center&amp;height=1200&amp;v=1775825680&amp;width=1200 1200w,//respire.co/cdn/shop/files/Respire-Soin-Levres-Collagene-Booster-Texture.jpg?crop=center&amp;height=1920&amp;v=1775825680&amp;width=1920 1920w,//respire.co/cdn/shop/files/Respire-Soin-Levres-Collagene-Booster-Texture.jpg?crop=center&amp;height=2400&amp;v=1775825680&amp;width=2400 2400w" sizes="29vw" class="w-full">
</picture><span class="absolute left-8 top-8 text-20/none font-black tracking-tight text-black">[NEW]<br>SOIN LÈVRES</span></a></li>
 
<li class="relative overflow-clip rounded-md span-w-4"><a
 @click="closeAllPanels"
 href="/collections/deodorants-solides-naturels"
 class="group relative overflow-clip"
 data-tag="menu_nav"
 data-menu="deodorant-stick"
 data-trk="button-cta-nav-menu-deodorant-stick"
 >
 <picture
 class="block group-hover:scale-110 transition-transform duration-1000 group-hover:duration-500 ease-expo-out"
 ><source
 media="(max-width: 1023px)"
 srcset="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
 width="0"
 height="0"
 >
 <img src="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-et-sa-recharge_989446c1-fee2-41b0-a86f-31df13802b7a.jpg?crop=center&amp;height=420&amp;v=1780044253&amp;width=420" alt="" width="420" height="420" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-et-sa-recharge_989446c1-fee2-41b0-a86f-31df13802b7a.jpg?crop=center&amp;height=960&amp;v=1780044253&amp;width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-et-sa-recharge_989446c1-fee2-41b0-a86f-31df13802b7a.jpg?crop=center&amp;height=1200&amp;v=1780044253&amp;width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-et-sa-recharge_989446c1-fee2-41b0-a86f-31df13802b7a.jpg?crop=center&amp;height=1920&amp;v=1780044253&amp;width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-et-sa-recharge_989446c1-fee2-41b0-a86f-31df13802b7a.jpg?crop=center&amp;height=2400&amp;v=1780044253&amp;width=2400 2400w" sizes="29vw" class="w-full">
</picture><span class="absolute left-8 top-8 text-20/none font-black tracking-tight text-black">DEODORANT<br> STICK</span></a></li>
 
<li class="relative overflow-clip rounded-md span-w-4"><a
 @click="closeAllPanels"
 href="/pages/skin-check"
 class="group relative overflow-clip"
 data-tag="menu_nav"
 data-menu="skin-check"
 data-trk="button-cta-nav-menu-skin-check"
 >
 <picture
 class="block group-hover:scale-110 transition-transform duration-1000 group-hover:duration-500 ease-expo-out"
 ><source
 media="(max-width: 1023px)"
 srcset="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
 width="0"
 height="0"
 >
 <img src="//respire.co/cdn/shop/files/Respire_TROIS_SERUMS_2026_SERUM_ACTIVATE_05_1.jpg?crop=center&amp;height=420&amp;v=1774145587&amp;width=420" alt="" width="420" height="420" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire_TROIS_SERUMS_2026_SERUM_ACTIVATE_05_1.jpg?crop=center&amp;height=960&amp;v=1774145587&amp;width=960 960w,//respire.co/cdn/shop/files/Respire_TROIS_SERUMS_2026_SERUM_ACTIVATE_05_1.jpg?crop=center&amp;height=1200&amp;v=1774145587&amp;width=1200 1200w,//respire.co/cdn/shop/files/Respire_TROIS_SERUMS_2026_SERUM_ACTIVATE_05_1.jpg?crop=center&amp;height=1920&amp;v=1774145587&amp;width=1920 1920w,//respire.co/cdn/shop/files/Respire_TROIS_SERUMS_2026_SERUM_ACTIVATE_05_1.jpg?crop=center&amp;height=2400&amp;v=1774145587&amp;width=2400 2400w" sizes="29vw" class="w-full">
</picture><span class="absolute left-8 top-8 text-20/none font-black tracking-tight text-black">SKIN <br>CHECK</span></a></li>
 
<li class="relative overflow-clip rounded-md span-w-4"><a
 @click="closeAllPanels"
 href="/collections/serums-visage-naturels"
 class="group relative overflow-clip"
 data-tag="menu_nav"
 data-menu="serums-visage"
 data-trk="button-cta-nav-menu-serums-visage"
 >
 <picture
 class="block group-hover:scale-110 transition-transform duration-1000 group-hover:duration-500 ease-expo-out"
 ><source
 media="(max-width: 1023px)"
 srcset="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
 width="0"
 height="0"
 >
 <img src="//respire.co/cdn/shop/files/Trois_Serums0103-Modifica.jpg?crop=center&amp;height=420&amp;v=1769298974&amp;width=420" alt="" width="420" height="420" loading="lazy" srcset="//respire.co/cdn/shop/files/Trois_Serums0103-Modifica.jpg?crop=center&amp;height=960&amp;v=1769298974&amp;width=960 960w,//respire.co/cdn/shop/files/Trois_Serums0103-Modifica.jpg?crop=center&amp;height=1200&amp;v=1769298974&amp;width=1200 1200w,//respire.co/cdn/shop/files/Trois_Serums0103-Modifica.jpg?crop=center&amp;height=1920&amp;v=1769298974&amp;width=1920 1920w,//respire.co/cdn/shop/files/Trois_Serums0103-Modifica.jpg?crop=center&amp;height=2400&amp;v=1769298974&amp;width=2400 2400w" sizes="29vw" class="w-full">
</picture><span class="absolute left-8 top-8 text-20/none font-black tracking-tight text-black">SÉRUMS <br>VISAGE</span></a></li>
 
<li class="relative overflow-clip rounded-md span-w-4"><a
 @click="closeAllPanels"
 href="/pages/ou-nous-trouver"
 class="group relative overflow-clip"
 data-tag="menu_nav"
 data-menu="ou-noustrouver"
 data-trk="button-cta-nav-menu-ou-noustrouver"
 >
 <picture
 class="block group-hover:scale-110 transition-transform duration-1000 group-hover:duration-500 ease-expo-out"
 ><source
 media="(max-width: 1023px)"
 srcset="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
 width="0"
 height="0"
 >
 <img src="//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_606e0851-cf29-47ac-b290-876afb5534dc.jpg?crop=center&amp;height=420&amp;v=1736933721&amp;width=420" alt="" width="420" height="420" loading="lazy" srcset="//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_606e0851-cf29-47ac-b290-876afb5534dc.jpg?crop=center&amp;height=960&amp;v=1736933721&amp;width=960 960w,//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_606e0851-cf29-47ac-b290-876afb5534dc.jpg?crop=center&amp;height=1200&amp;v=1736933721&amp;width=1200 1200w,//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_606e0851-cf29-47ac-b290-876afb5534dc.jpg?crop=center&amp;height=1920&amp;v=1736933721&amp;width=1920 1920w,//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_606e0851-cf29-47ac-b290-876afb5534dc.jpg?crop=center&amp;height=2400&amp;v=1736933721&amp;width=2400 2400w" sizes="29vw" class="w-full">
</picture><span class="absolute left-8 top-8 text-20/none font-black tracking-tight text-black">OÙ NOUS<br>TROUVER ?</span></a></li>
 
 </ul></div></div>
<div
 x-cloak
 x-show="currentPanelIndex === 2"
 x-transition:enter="transition-transform ease-expo-out duration-500 transform-gpu"
 x-transition:enter-start="-translate-y-8"
 class="header-panel fixed inset-x-0 top-header bg-white py-20"
 ><div class="grid-container flex span-gap-x-1-wider"><ul class="flex flex-col pt-20 span-w-17">
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/pages/about-us 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-notre-mission'>Notre mission</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/pages/charte-de-formulation 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-charte-de-formulation'>Charte de formulation</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=/blogs/actualites 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-actualites'>Actualités</a>
 </li>
 
<li class="border-t border-grey-light/50 py-8">
 <a 
 href=https://www.respire.co/pages/ou-nous-trouver 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeAllPanels'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-nos-pharmacies-partenaires'>Nos pharmacies partenaires</a>
 </li>
 
 </ul>
 
 </div></div>
 




</nav><div class="!flex items-center gap-8 uppercase"><button
 x-data
 @click="$store.global.isSearchVisible=!$store.global.isSearchVisible"
 aria-label="Rechercher"
 data-tag="menu_nav"
 data-menu="search"
 data-trk="button-cta-nav-menu-search"
 class="p-8 lg-max:hidden"
 >
 <svg viewbox='0 0 17 17' fill='none' xmlns='http://www.w3.org/2000/svg' class='h-18 w-18'><path d="M13.92 8.32a6.55 6.55 0 1 1-13.1 0 6.55 6.55 0 0 1 13.1 0Z" stroke="currentColor" stroke-width="1.6"/><path d="M13.92 8.32a6.55 6.55 0 1 1-13.1 0 6.55 6.55 0 0 1 13.1 0Zm-2.45 4.28 3.98 3.8m-3.98-3.8 3.98 3.8m-3.98-3.8 3.98 3.8" stroke="currentColor" stroke-width="1.6"/></svg>
 </button><a 
 href=https://respire.co/customer_authentication/redirect?locale=fr&region_country=FR 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative block p-8'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
 data-taxi-nocache

data-trk='button-cta-nav-menu-mon-compte'><svg viewbox='0 0 17 17' fill='none' xmlns='http://www.w3.org/2000/svg' class='h-18 w-18'><path d="M1.46 16.6c.01-1.88.65-6 6.53-6s6.58 4.12 6.58 6" stroke="currentColor" stroke-width="1.6"/><circle cx="7.95" cy="5.3" r="3.17" stroke="currentColor" stroke-width="1.6"/></svg><span class="sr-only">Mon compte</span></a>
 
 <button
 data-ajax-cart-section
 x-data
 @click="$store.global.isMinicartVisible=true"
 aria-label="Panier"
 data-tag="menu_nav"
 data-menu="cart"
 data-trk="button-cta-nav-menu-cart"
 class="-mr-8 block p-8"
 ><svg viewbox='0 0 14 17' fill='none' xmlns='http://www.w3.org/2000/svg' class='h-18 w-18'><g stroke="currentColor" stroke-width="1.5"><path d="M1.6 5.57h11.51v9.91H1.6z"/><path d="M4.45 9.46c0-5.63 1.44-8.01 3.1-8.01 1.67 0 3.13 2.11 3.13 8" stroke-linecap="round"/></g></svg></button></div><div
 x-ref="mobileNav"
 x-cloak
 x-show="isMobileNavOpen"
 x-transition:enter="transition-transform ease-expo-out duration-700 transform-gpu"
 x-transition:enter-start="-translate-x-full"
 x-transition:enter-end="translate-x-0"
 x-transition:leave="transition-transform ease-quart-inout duration-700 transform-gpu"
 x-transition:leave-start="translate-x-0"
 x-transition:leave-end="-translate-x-full"
 class="fixed inset-0 top-header h-[calc(var(--screenHeightMax)-var(--navHeight))] overflow-y-scroll bg-white lg:hidden"
 ><div class="flex min-h-full flex-col">

<div
 x-data='slideshow({groupBy:1,autoPlayInterval:0,disableLg:false,loop:false, displayChildrenCountMobile:-1, displayChildrenCountDesktop: -1})'
 
 class='my-10 grid-container overflow-clip'
 
><div
 x-ref='wrapper'
 @touchstart='handleTouchStart'
 class='flex [&>*]:shrink-0 justify-start items-stretch [&>*]:snap-center overflow-x-auto overscroll-x-contain scrollbar-hide snap-x snap-mandatory scroll-smooth flex gap-x-6'
 >
 
<article class='relative overflow-clip rounded-md span-w-5'><a
 @click="closeMobileNav"
 href='/pages/gamme-daily-protect'
 data-tag="menu_nav"
 data-menu="newsolaires"
 data-trk="button-cta-nav-menu-newsolaires"
 >
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 srcset="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
 width="0"
 height="0"
 >
 <img src="//respire.co/cdn/shop/files/Respire_DailyProtect_2026_StickSolaire_02_1.jpg?crop=center&amp;height=161&amp;v=1774145353&amp;width=161" alt="" width="161" height="161" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire_DailyProtect_2026_StickSolaire_02_1.jpg?crop=center&amp;height=48&amp;v=1774145353&amp;width=48 48w,//respire.co/cdn/shop/files/Respire_DailyProtect_2026_StickSolaire_02_1.jpg?crop=center&amp;height=96&amp;v=1774145353&amp;width=96 96w,//respire.co/cdn/shop/files/Respire_DailyProtect_2026_StickSolaire_02_1.jpg?crop=center&amp;height=160&amp;v=1774145353&amp;width=160 160w,//respire.co/cdn/shop/files/Respire_DailyProtect_2026_StickSolaire_02_1.jpg?crop=center&amp;height=320&amp;v=1774145353&amp;width=320 320w,//respire.co/cdn/shop/files/Respire_DailyProtect_2026_StickSolaire_02_1.jpg?crop=center&amp;height=640&amp;v=1774145353&amp;width=640 640w" sizes="42vw" class="w-full">
</picture><span class='absolute left-8 top-8 text-16/5 font-black tracking-tight'>[NEW]<br>SOLAIRES</span></a></article>
 
<article class='relative overflow-clip rounded-md span-w-5'><a
 @click="closeMobileNav"
 href='/pages/soin-levres-collagene-booster'
 data-tag="menu_nav"
 data-menu="newsoin-levres"
 data-trk="button-cta-nav-menu-newsoin-levres"
 >
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 srcset="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
 width="0"
 height="0"
 >
 <img src="//respire.co/cdn/shop/files/Respire-Soin-Levres-Collagene-Booster-Texture.jpg?crop=center&amp;height=161&amp;v=1775825680&amp;width=161" alt="" width="161" height="161" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Soin-Levres-Collagene-Booster-Texture.jpg?crop=center&amp;height=48&amp;v=1775825680&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Soin-Levres-Collagene-Booster-Texture.jpg?crop=center&amp;height=96&amp;v=1775825680&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Soin-Levres-Collagene-Booster-Texture.jpg?crop=center&amp;height=160&amp;v=1775825680&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Soin-Levres-Collagene-Booster-Texture.jpg?crop=center&amp;height=320&amp;v=1775825680&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Soin-Levres-Collagene-Booster-Texture.jpg?crop=center&amp;height=640&amp;v=1775825680&amp;width=640 640w" sizes="42vw" class="w-full">
</picture><span class='absolute left-8 top-8 text-16/5 font-black tracking-tight'>[NEW]<br>SOIN LÈVRES</span></a></article>
 
<article class='relative overflow-clip rounded-md span-w-5'><a
 @click="closeMobileNav"
 href='/collections/deodorants-solides-naturels'
 data-tag="menu_nav"
 data-menu="deodorant-stick"
 data-trk="button-cta-nav-menu-deodorant-stick"
 >
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 srcset="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
 width="0"
 height="0"
 >
 <img src="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-et-sa-recharge_989446c1-fee2-41b0-a86f-31df13802b7a.jpg?crop=center&amp;height=161&amp;v=1780044253&amp;width=161" alt="" width="161" height="161" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-et-sa-recharge_989446c1-fee2-41b0-a86f-31df13802b7a.jpg?crop=center&amp;height=48&amp;v=1780044253&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-et-sa-recharge_989446c1-fee2-41b0-a86f-31df13802b7a.jpg?crop=center&amp;height=96&amp;v=1780044253&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-et-sa-recharge_989446c1-fee2-41b0-a86f-31df13802b7a.jpg?crop=center&amp;height=160&amp;v=1780044253&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-et-sa-recharge_989446c1-fee2-41b0-a86f-31df13802b7a.jpg?crop=center&amp;height=320&amp;v=1780044253&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-et-sa-recharge_989446c1-fee2-41b0-a86f-31df13802b7a.jpg?crop=center&amp;height=640&amp;v=1780044253&amp;width=640 640w" sizes="42vw" class="w-full">
</picture><span class='absolute left-8 top-8 text-16/5 font-black tracking-tight'>DEODORANT<br> STICK</span></a></article>
 
<article class='relative overflow-clip rounded-md span-w-5'><a
 @click="closeMobileNav"
 href='/pages/skin-check'
 data-tag="menu_nav"
 data-menu="skin-check"
 data-trk="button-cta-nav-menu-skin-check"
 >
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 srcset="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
 width="0"
 height="0"
 >
 <img src="//respire.co/cdn/shop/files/Respire_TROIS_SERUMS_2026_SERUM_ACTIVATE_05_1.jpg?crop=center&amp;height=161&amp;v=1774145587&amp;width=161" alt="" width="161" height="161" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire_TROIS_SERUMS_2026_SERUM_ACTIVATE_05_1.jpg?crop=center&amp;height=48&amp;v=1774145587&amp;width=48 48w,//respire.co/cdn/shop/files/Respire_TROIS_SERUMS_2026_SERUM_ACTIVATE_05_1.jpg?crop=center&amp;height=96&amp;v=1774145587&amp;width=96 96w,//respire.co/cdn/shop/files/Respire_TROIS_SERUMS_2026_SERUM_ACTIVATE_05_1.jpg?crop=center&amp;height=160&amp;v=1774145587&amp;width=160 160w,//respire.co/cdn/shop/files/Respire_TROIS_SERUMS_2026_SERUM_ACTIVATE_05_1.jpg?crop=center&amp;height=320&amp;v=1774145587&amp;width=320 320w,//respire.co/cdn/shop/files/Respire_TROIS_SERUMS_2026_SERUM_ACTIVATE_05_1.jpg?crop=center&amp;height=640&amp;v=1774145587&amp;width=640 640w" sizes="42vw" class="w-full">
</picture><span class='absolute left-8 top-8 text-16/5 font-black tracking-tight'>SKIN <br>CHECK</span></a></article>
 
<article class='relative overflow-clip rounded-md span-w-5'><a
 @click="closeMobileNav"
 href='/collections/serums-visage-naturels'
 data-tag="menu_nav"
 data-menu="serums-visage"
 data-trk="button-cta-nav-menu-serums-visage"
 >
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 srcset="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
 width="0"
 height="0"
 >
 <img src="//respire.co/cdn/shop/files/Trois_Serums0103-Modifica.jpg?crop=center&amp;height=161&amp;v=1769298974&amp;width=161" alt="" width="161" height="161" loading="lazy" srcset="//respire.co/cdn/shop/files/Trois_Serums0103-Modifica.jpg?crop=center&amp;height=48&amp;v=1769298974&amp;width=48 48w,//respire.co/cdn/shop/files/Trois_Serums0103-Modifica.jpg?crop=center&amp;height=96&amp;v=1769298974&amp;width=96 96w,//respire.co/cdn/shop/files/Trois_Serums0103-Modifica.jpg?crop=center&amp;height=160&amp;v=1769298974&amp;width=160 160w,//respire.co/cdn/shop/files/Trois_Serums0103-Modifica.jpg?crop=center&amp;height=320&amp;v=1769298974&amp;width=320 320w,//respire.co/cdn/shop/files/Trois_Serums0103-Modifica.jpg?crop=center&amp;height=640&amp;v=1769298974&amp;width=640 640w" sizes="42vw" class="w-full">
</picture><span class='absolute left-8 top-8 text-16/5 font-black tracking-tight'>SÉRUMS <br>VISAGE</span></a></article>
 
<article class='relative overflow-clip rounded-md span-w-5'><a
 @click="closeMobileNav"
 href='/pages/ou-nous-trouver'
 data-tag="menu_nav"
 data-menu="ou-noustrouver"
 data-trk="button-cta-nav-menu-ou-noustrouver"
 >
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 srcset="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
 width="0"
 height="0"
 >
 <img src="//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_606e0851-cf29-47ac-b290-876afb5534dc.jpg?crop=center&amp;height=161&amp;v=1736933721&amp;width=161" alt="" width="161" height="161" loading="lazy" srcset="//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_606e0851-cf29-47ac-b290-876afb5534dc.jpg?crop=center&amp;height=48&amp;v=1736933721&amp;width=48 48w,//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_606e0851-cf29-47ac-b290-876afb5534dc.jpg?crop=center&amp;height=96&amp;v=1736933721&amp;width=96 96w,//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_606e0851-cf29-47ac-b290-876afb5534dc.jpg?crop=center&amp;height=160&amp;v=1736933721&amp;width=160 160w,//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_606e0851-cf29-47ac-b290-876afb5534dc.jpg?crop=center&amp;height=320&amp;v=1736933721&amp;width=320 320w,//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_606e0851-cf29-47ac-b290-876afb5534dc.jpg?crop=center&amp;height=640&amp;v=1736933721&amp;width=640 640w" sizes="42vw" class="w-full">
</picture><span class='absolute left-8 top-8 text-16/5 font-black tracking-tight'>OÙ NOUS<br>TROUVER ?</span></a></article>
 

 </div>
</div>
 <div class="grid-container mt-auto flex flex-col gap-14"><a 
 href=/collections/vente-archives 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left text-28/narrower text-grey font-sans !font-black uppercase tracking-tight'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-vente-archives'>Vente Archives</a>
<ul class="flex flex-col gap-14" data-type="panel-links-cards" x-data="accordion">
 
 
 <li><div class='accordion grid grid-rows-[1fr]'><div class='relative'><input
 data-type='accordion'
 class='peer sr-only'
 type='checkbox'
 id='header-mobile-links-cards-panel_links_cards_qn9wbY-0'
 :checked='selected === "header-mobile-links-cards-panel_links_cards_qn9wbY-0"'
 @change='handleChange'
 ><label
 class='!py-0 flex items-center justify-between py-14 focus:outline-none focus:ring-0 select-none cursor-pointer peer-checked:[&>span:last-child>span:last-child]:rotate-90'
 for='header-mobile-links-cards-panel_links_cards_qn9wbY-0'
 ><span class='text-28/narrower font-black uppercase tracking-tight will-change-transform'>Sélection</span><span class='pointer-events-none relative flex h-12 w-12 items-center justify-center [&>span]:bg-black'><span class='absolute block h-2 w-full lg:h-3'></span><span class='absolute block h-full w-2 transition-transform peer-checked:rotate-90 lg:w-3'></span></span></label><article
 class='grid grid-rows-[0fr] overflow-clip transition-[grid-template-rows] duration-500 ease-expo-out pointer-events-all'
 :inert='selected !== "header-mobile-links-cards-panel_links_cards_qn9wbY-0"'
 ><div class='min-h-0'><div class='min-h-0'>
 <ul class='mt-14'>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/vente-archives 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-vente-archives-new'>Vente Archives <b>[New]</b></a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/nouveautes 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-nouveautes'>Nouveautés</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/solaire 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-solaires'>Solaires</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/kits-duo 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-kits-routines'>Kits & Routines</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/pages/diagnostic/diagnostic 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-diagnostic-de-peau'>Diagnostic de peau</a>
 </li>
 
<a 
 href=/collections/all 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left mt-5 font-bold text-13 after:scale-x-100'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-selection'>Tout voir</a>
 </ul>
 </div></div></article></div></div>
 </li>
 
 
 <li><div class='accordion grid grid-rows-[1fr]'><div class='relative'><input
 data-type='accordion'
 class='peer sr-only'
 type='checkbox'
 id='header-mobile-links-cards-panel_links_cards_qn9wbY-1'
 :checked='selected === "header-mobile-links-cards-panel_links_cards_qn9wbY-1"'
 @change='handleChange'
 ><label
 class='!py-0 flex items-center justify-between py-14 focus:outline-none focus:ring-0 select-none cursor-pointer peer-checked:[&>span:last-child>span:last-child]:rotate-90'
 for='header-mobile-links-cards-panel_links_cards_qn9wbY-1'
 ><span class='text-28/narrower font-black uppercase tracking-tight will-change-transform'>Préoccupations</span><span class='pointer-events-none relative flex h-12 w-12 items-center justify-center [&>span]:bg-black'><span class='absolute block h-2 w-full lg:h-3'></span><span class='absolute block h-full w-2 transition-transform peer-checked:rotate-90 lg:w-3'></span></span></label><article
 class='grid grid-rows-[0fr] overflow-clip transition-[grid-template-rows] duration-500 ease-expo-out pointer-events-all'
 :inert='selected !== "header-mobile-links-cards-panel_links_cards_qn9wbY-1"'
 ><div class='min-h-0'><div class='min-h-0'>
 <ul class='mt-14'>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/taches-pigmentaires-vieillissement-cutane 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-vieillissement-cutane'>Vieillissement cutané</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/cernes-et-teint-terne 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-cernes-teint-terne'>Cernes & Teint Terne</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/gamme-anti-imperfections 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-imperfections-exces-de-sebum'>Imperfections & Excès de sébum</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/hydratation 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-deshydratation-secheresse-cutanee'>Déshydratation & Sécheresse cutanée</a>
 </li>
 
<a 
 href=/collections/visage 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left mt-5 font-bold text-13 after:scale-x-100'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-preoccupations'>Tout voir</a>
 </ul>
 </div></div></article></div></div>
 </li>
 
 
 <li><div class='accordion grid grid-rows-[1fr]'><div class='relative'><input
 data-type='accordion'
 class='peer sr-only'
 type='checkbox'
 id='header-mobile-links-cards-panel_links_cards_qn9wbY-2'
 :checked='selected === "header-mobile-links-cards-panel_links_cards_qn9wbY-2"'
 @change='handleChange'
 ><label
 class='!py-0 flex items-center justify-between py-14 focus:outline-none focus:ring-0 select-none cursor-pointer peer-checked:[&>span:last-child>span:last-child]:rotate-90'
 for='header-mobile-links-cards-panel_links_cards_qn9wbY-2'
 ><span class='text-28/narrower font-black uppercase tracking-tight will-change-transform'>Ingrédients</span><span class='pointer-events-none relative flex h-12 w-12 items-center justify-center [&>span]:bg-black'><span class='absolute block h-2 w-full lg:h-3'></span><span class='absolute block h-full w-2 transition-transform peer-checked:rotate-90 lg:w-3'></span></span></label><article
 class='grid grid-rows-[0fr] overflow-clip transition-[grid-template-rows] duration-500 ease-expo-out pointer-events-all'
 :inert='selected !== "header-mobile-links-cards-panel_links_cards_qn9wbY-2"'
 ><div class='min-h-0'><div class='min-h-0'>
 <ul class='mt-14'>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/filtres-solaires 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-filtres-solaires'>Filtres Solaires </a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/acide-hyaluronique-ceramide 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-acide-hyaluronique-ceramide'>Acide Hyaluronique & Céramide </a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/vitamine-c 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-vitamine-c-ginseng-rouge'>Vitamine C & Ginseng Rouge </a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/acide-salicylique-prebiotiques 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-acide-salicylique-prebiotique'>Acide Salicylique & Prébiotique</a>
 </li>
 
<a 
 href=/collections/visage 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left mt-5 font-bold text-13 after:scale-x-100'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-ingredients'>Tout voir</a>
 </ul>
 </div></div></article></div></div>
 </li>
 
 
 <li><div class='accordion grid grid-rows-[1fr]'><div class='relative'><input
 data-type='accordion'
 class='peer sr-only'
 type='checkbox'
 id='header-mobile-links-cards-panel_links_cards_qn9wbY-3'
 :checked='selected === "header-mobile-links-cards-panel_links_cards_qn9wbY-3"'
 @change='handleChange'
 ><label
 class='!py-0 flex items-center justify-between py-14 focus:outline-none focus:ring-0 select-none cursor-pointer peer-checked:[&>span:last-child>span:last-child]:rotate-90'
 for='header-mobile-links-cards-panel_links_cards_qn9wbY-3'
 ><span class='text-28/narrower font-black uppercase tracking-tight will-change-transform'>Soins du Visage</span><span class='pointer-events-none relative flex h-12 w-12 items-center justify-center [&>span]:bg-black'><span class='absolute block h-2 w-full lg:h-3'></span><span class='absolute block h-full w-2 transition-transform peer-checked:rotate-90 lg:w-3'></span></span></label><article
 class='grid grid-rows-[0fr] overflow-clip transition-[grid-template-rows] duration-500 ease-expo-out pointer-events-all'
 :inert='selected !== "header-mobile-links-cards-panel_links_cards_qn9wbY-3"'
 ><div class='min-h-0'><div class='min-h-0'>
 <ul class='mt-14'>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/soin-levres 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-soin-levres'>Soin Lèvres </a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/serums-visage-naturels 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-serums'>Sérums</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/cremes-visages-naturelles 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-cremes'>Crèmes</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/nettoyants-visage 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-nettoyants-demaquillants'>Nettoyants & Démaquillants</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/masque-visage 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-masque'>Masque</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/contour-des-yeux 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-contour-des-yeux'>Contour des yeux</a>
 </li>
 
<a 
 href=/collections/visage 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left mt-5 font-bold text-13 after:scale-x-100'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-soins-du-visage'>Tout voir</a>
 </ul>
 </div></div></article></div></div>
 </li>
 
 
 <li><div class='accordion grid grid-rows-[1fr]'><div class='relative'><input
 data-type='accordion'
 class='peer sr-only'
 type='checkbox'
 id='header-mobile-links-cards-panel_links_cards_qn9wbY-4'
 :checked='selected === "header-mobile-links-cards-panel_links_cards_qn9wbY-4"'
 @change='handleChange'
 ><label
 class='!py-0 flex items-center justify-between py-14 focus:outline-none focus:ring-0 select-none cursor-pointer peer-checked:[&>span:last-child>span:last-child]:rotate-90'
 for='header-mobile-links-cards-panel_links_cards_qn9wbY-4'
 ><span class='text-28/narrower font-black uppercase tracking-tight will-change-transform'>Déodorants</span><span class='pointer-events-none relative flex h-12 w-12 items-center justify-center [&>span]:bg-black'><span class='absolute block h-2 w-full lg:h-3'></span><span class='absolute block h-full w-2 transition-transform peer-checked:rotate-90 lg:w-3'></span></span></label><article
 class='grid grid-rows-[0fr] overflow-clip transition-[grid-template-rows] duration-500 ease-expo-out pointer-events-all'
 :inert='selected !== "header-mobile-links-cards-panel_links_cards_qn9wbY-4"'
 ><div class='min-h-0'><div class='min-h-0'>
 <ul class='mt-14'>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/deodorants-solides-naturels 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-deodorants-sticks'>Déodorants sticks</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/deodorants-sticks-carton-certifies-bio 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-deodorants-stick-carton'>Déodorants stick carton</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/deodorants-roll-on-naturels 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-deodorants-roll-on'>Déodorants roll-on</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/recharges 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-recharges'>Recharges</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/kit-personnalise 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-kit-personnalise'>Kit Personnalisé</a>
 </li>
 
<a 
 href=/collections/deodorant 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left mt-5 font-bold text-13 after:scale-x-100'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-deodorants'>Tout voir</a>
 </ul>
 </div></div></article></div></div>
 </li>
 
 
 <li><div class='accordion grid grid-rows-[1fr]'><div class='relative'><input
 data-type='accordion'
 class='peer sr-only'
 type='checkbox'
 id='header-mobile-links-cards-panel_links_cards_qn9wbY-5'
 :checked='selected === "header-mobile-links-cards-panel_links_cards_qn9wbY-5"'
 @change='handleChange'
 ><label
 class='!py-0 flex items-center justify-between py-14 focus:outline-none focus:ring-0 select-none cursor-pointer peer-checked:[&>span:last-child>span:last-child]:rotate-90'
 for='header-mobile-links-cards-panel_links_cards_qn9wbY-5'
 ><span class='text-28/narrower font-black uppercase tracking-tight will-change-transform'>Soins du Corps</span><span class='pointer-events-none relative flex h-12 w-12 items-center justify-center [&>span]:bg-black'><span class='absolute block h-2 w-full lg:h-3'></span><span class='absolute block h-full w-2 transition-transform peer-checked:rotate-90 lg:w-3'></span></span></label><article
 class='grid grid-rows-[0fr] overflow-clip transition-[grid-template-rows] duration-500 ease-expo-out pointer-events-all'
 :inert='selected !== "header-mobile-links-cards-panel_links_cards_qn9wbY-5"'
 ><div class='min-h-0'><div class='min-h-0'>
 <ul class='mt-14'>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/shampoings-solides 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-shampoings-apres-shampoings'>Shampoings & Après-shampoings</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/savons-naturels 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-savons-exfoliants'>Savons & Exfoliants</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/dentifrices-naturels 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-dentifrices'>Dentifrices</a>
 </li>
 
<li class='border-t border-grey-light/50 py-5 text-13'>
 <a 
 href=/collections/corps-baume-huile-seche-naturels 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-hydratants-corps-mains-et-levres'>Hydratants corps, mains et lèvres</a>
 </li>
 
<a 
 href=/collections/corps 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left mt-5 font-bold text-13 after:scale-x-100'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-soins-du-corps'>Tout voir</a>
 </ul>
 </div></div></article></div></div>
 </li>
 
 </ul><div class='accordion grid grid-rows-[1fr]'><div class='relative'><input
 data-type='accordion'
 class='peer sr-only'
 type='checkbox'
 id='header-mobile-links-push-panel_links_push_q8Efm6'
 
 ><label
 class='!py-0 flex items-center justify-between py-14 focus:outline-none focus:ring-0 select-none cursor-pointer peer-checked:[&>span:last-child>span:last-child]:rotate-90'
 for='header-mobile-links-push-panel_links_push_q8Efm6'
 ><span class='text-28/narrower font-black uppercase tracking-tight will-change-transform'>A propos</span><span class='pointer-events-none relative flex h-12 w-12 items-center justify-center [&>span]:bg-black'><span class='absolute block h-2 w-full lg:h-3'></span><span class='absolute block h-full w-2 transition-transform peer-checked:rotate-90 lg:w-3'></span></span></label><article
 class='grid grid-rows-[0fr] overflow-clip transition-[grid-template-rows] duration-500 ease-expo-out pointer-events-all'
 
 ><div class='min-h-0'><div class='min-h-0'>
 <ul class='mt-14 flex flex-col' data-type='panel-links-push'>
 
 <li class='border-t border-grey-light/50 py-5 text-13'><a 
 href=/pages/about-us 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-notre-mission'>Notre mission</a>
 </li>
 
 <li class='border-t border-grey-light/50 py-5 text-13'><a 
 href=/pages/charte-de-formulation 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-charte-de-formulation'>Charte de formulation</a>
 </li>
 
 <li class='border-t border-grey-light/50 py-5 text-13'><a 
 href=/blogs/actualites 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-actualites'>Actualités</a>
 </li>
 
 <li class='border-t border-grey-light/50 py-5 text-13'><a 
 href=https://www.respire.co/pages/ou-nous-trouver 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left font-normal'
 
 
 
 x-data
 @click='closeMobileNav'
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-nos-pharmacies-partenaires'>Nos pharmacies partenaires</a>
 </li>
 
 </ul>
 </div></div></article></div></div>
</div><div class="sticky inset-x-0 bottom-0 mt-20 h-55 border-t border-grey-light bg-white"><div class="grid-container !flex h-full justify-between"><ul class="flex h-full items-center gap-10">
 
 </ul><div class="flex items-center gap-20 lg:hidden">
 <div x-data='localizationForm'>
 <form method="post" action="/localization" id="localization_form" accept-charset="UTF-8" class="shopify-localization-form" enctype="multipart/form-data"><input type="hidden" name="form_type" value="localization" /><input type="hidden" name="utf8" value="✓" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="return_to" value="/collections/deodorant" />
<div class='relative inline-block text-10/narrower font-black'><select
 name='country_code'
 id='country_code'
 value='FR'
 class='cursor-pointer appearance-none bg-transparent pr-15 uppercase focus:outline-none'
 >
 
 <option 
 value='DZ'>
 DZ / EUR
 </option>
 
 <option 
 value='DE'>
 DE / EUR
 </option>
 
 <option 
 value='AU'>
 AU / EUR
 </option>
 
 <option 
 value='AT'>
 AT / EUR
 </option>
 
 <option 
 value='BE'>
 BE / EUR
 </option>
 
 <option 
 value='CA'>
 CA / EUR
 </option>
 
 <option 
 value='CN'>
 CN / EUR
 </option>
 
 <option 
 value='CY'>
 CY / EUR
 </option>
 
 <option 
 value='KR'>
 KR / EUR
 </option>
 
 <option 
 value='DK'>
 DK / EUR
 </option>
 
 <option 
 value='ES'>
 ES / EUR
 </option>
 
 <option 
 value='EE'>
 EE / EUR
 </option>
 
 <option 
 value='US'>
 US / EUR
 </option>
 
 <option 
 value='FI'>
 FI / EUR
 </option>
 
 <option 
 value='FR'>
 FR / EUR
 </option>
 
 <option 
 value='GR'>
 GR / EUR
 </option>
 
 <option 
 value='GP'>
 GP / EUR
 </option>
 
 <option 
 value='GF'>
 GF / EUR
 </option>
 
 <option 
 value='HU'>
 HU / EUR
 </option>
 
 <option 
 value='IN'>
 IN / EUR
 </option>
 
 <option 
 value='IE'>
 IE / EUR
 </option>
 
 <option 
 value='IS'>
 IS / EUR
 </option>
 
 <option 
 value='IL'>
 IL / EUR
 </option>
 
 <option 
 value='IT'>
 IT / EUR
 </option>
 
 <option 
 value='JP'>
 JP / EUR
 </option>
 
 <option 
 value='RE'>
 RE / EUR
 </option>
 
 <option 
 value='LV'>
 LV / EUR
 </option>
 
 <option 
 value='LT'>
 LT / EUR
 </option>
 
 <option 
 value='LU'>
 LU / EUR
 </option>
 
 <option 
 value='MA'>
 MA / EUR
 </option>
 
 <option 
 value='MQ'>
 MQ / EUR
 </option>
 
 <option 
 value='MU'>
 MU / EUR
 </option>
 
 <option 
 value='YT'>
 YT / EUR
 </option>
 
 <option 
 value='MC'>
 MC / EUR
 </option>
 
 <option 
 value='NO'>
 NO / EUR
 </option>
 
 <option 
 value='NC'>
 NC / EUR
 </option>
 
 <option 
 value='NZ'>
 NZ / EUR
 </option>
 
 <option 
 value='NL'>
 NL / EUR
 </option>
 
 <option 
 value='PL'>
 PL / EUR
 </option>
 
 <option 
 value='PF'>
 PF / EUR
 </option>
 
 <option 
 value='PT'>
 PT / EUR
 </option>
 
 <option 
 value='HK'>
 HK / EUR
 </option>
 
 <option 
 value='GB'>
 GB / EUR
 </option>
 
 <option 
 value='RU'>
 RU / EUR
 </option>
 
 <option 
 value='BL'>
 BL / EUR
 </option>
 
 <option 
 value='MF'>
 MF / EUR
 </option>
 
 <option 
 value='PM'>
 PM / EUR
 </option>
 
 <option 
 value='SG'>
 SG / EUR
 </option>
 
 <option 
 value='SK'>
 SK / EUR
 </option>
 
 <option 
 value='SI'>
 SI / EUR
 </option>
 
 <option 
 value='SE'>
 SE / EUR
 </option>
 
 <option 
 value='CH'>
 CH / EUR
 </option>
 
 <option 
 value='CZ'>
 CZ / EUR
 </option>
 
 <option 
 value='TF'>
 TF / EUR
 </option>
 
 <option 
 value='TH'>
 TH / EUR
 </option>
 
 <option 
 value='TN'>
 TN / EUR
 </option>
 
 <option 
 value='TR'>
 TR / EUR
 </option>
 
 <option 
 value='VN'>
 VN / EUR
 </option>
 
 <option 
 value='WF'>
 WF / EUR
 </option>
 

 </select><div class='pointer-events-none absolute bottom-2 right-0 top-0 grid place-items-center'><svg viewbox='0 0 10 6' fill='none' xmlns='http://www.w3.org/2000/svg' class='w-10 shrink-0'><path d="M0.977051 1.25586L4.70504 4.98385" stroke="currentColor" stroke-width="1.19296" stroke-linecap="round"/><path d="M8.43311 1.25586L4.70511 4.98385" stroke="currentColor" stroke-width="1.19296" stroke-linecap="round"/></svg>
 </div></div>
 </form>
 </div>

 <div x-data='localizationForm'>
 <form method="post" action="/localization" id="localization_form" accept-charset="UTF-8" class="shopify-localization-form" enctype="multipart/form-data"><input type="hidden" name="form_type" value="localization" /><input type="hidden" name="utf8" value="✓" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="return_to" value="/collections/deodorant" />
<div class='relative inline-block text-10/narrower font-black'><select
 name='language_code'
 id='language_code'
 value='fr'
 class='cursor-pointer appearance-none bg-transparent pr-10 uppercase focus:outline-none'
 >
 
 <option 
 value='fr'>
 français
 </option>
 
 <option 
 value='es'>
 Español
 </option>
 
 <option 
 value='it'>
 Italiano
 </option>
 

 </select><div class='pointer-events-none absolute bottom-2 right-0 top-0 grid place-items-center'><svg viewbox='0 0 10 6' fill='none' xmlns='http://www.w3.org/2000/svg' class='w-10 shrink-0'><path d="M0.977051 1.25586L4.70504 4.98385" stroke="currentColor" stroke-width="1.19296" stroke-linecap="round"/><path d="M8.43311 1.25586L4.70511 4.98385" stroke="currentColor" stroke-width="1.19296" stroke-linecap="round"/></svg>
 </div></div>
 </form>
 </div>
</div></div></div></div></div></div></div><div
 x-cloak
 x-show="currentPanelIndex !== null"
 x-transition:enter="transition-opacity ease-expo-out duration-500 transform-gpu"
 x-transition:enter-start="opacity-0"
 x-transition:leave="transition-opacity ease-quart-inout duration-300 transform-gpu"
 x-transition:leave-end="opacity-0"
 aria-hidden="true"
 class="header-background pointer-events-none fixed inset-0 bg-black/20"
 ></div></div>
</header><aside id="shopify-section-sections--26281157493072__search" class="shopify-section shopify-section-group-header-group"><div
 x-data='predictiveSearch({predictiveUrl: "/search/suggest"})'
 x-show='$store.global.isSearchVisible'
 x-transition:enter='ease-expo-out duration-700 transform-gpu'
 x-transition:enter-start='-translate-y-full'
 x-transition:leave='ease-quart-inout duration-700 transform-gpu'
 x-transition:leave-end='-translate-y-full'
 x-cloak
 :aria-hidden="$store.global.isSearchVisible ? 'false' : 'true'"
 aria-modal='true'
 role='dialog'
 class='fixed left-0 right-0 top-headerDynamic z-10 w-full bg-white transition-[transform,top] duration-[.8s] ease-expo-out'
 x-trap='$store.global.isSearchVisible'
 :inert='!$store.global.isSearchVisible'
 @keydown.escape='$store.global.isSearchVisible = false'
><div class='grid-container'><form
 class='relative mt-20 flex w-full items-center'
 action='/search'
 method='get'
 role='search'
 ><input type='hidden' name='type' value='product'><div class='relative w-full'><div class="relative text-16/none lg:text-13/none"><input
 placeholder="Recherchez"
 type="search"
 id="search"
 name="q"
 aria-label=""
 class="w-full peer appearance-none block w-full h-45 px-12 py-18 appearance-none placeholder-current focus-visible:outline-none focus-visible:ring-0 duration-300 ease-quart-out transition-colors aria-[invalid]:text-orange aria-[invalid]:border-orange bg-grey-lighter placeholder:text-grey rounded-sm"></div>
<button 
 
 
 class='absolute top-1/2 -translate-y-1/2 right-10 p-10'
 
 
 
 x-data
 @click='handleClickReset'
 
 
 
 
 type='button'
 
 
 
 
 
 
><svg fill='none' viewbox='0 0 15 14' xmlns='http://www.w3.org/2000/svg' class=''><path d="M1.93 13.86.84 12.77 6.61 7 .84 1.23 1.93.14 7.7 5.91 13.47.14l1.09 1.09L8.78 7l5.78 5.77-1.09 1.09L7.7 8.09z" fill="currentColor"/></svg>
</button>
 </div><button 
 
 
 class='relative flex text-12/narrow font-bold whitespace-nowrap after:absolute after:inset-x-0 after:bottom-0 after:h-1 after:bg-black after:origin-left after:transition-transform after:duration-500 hover:after:duration-200 ease-expo-out hover:after:scale-x-0 ml-20'
 
 
 
 x-data
 @click='$store.global.isSearchVisible=false'
 
 
 
 
 type='button'
 
 
 
 
 
 
>Fermer</button></form>
<section class='my-24 lg:my-40' x-ref='suggestions'><h2 class='text-13 font-black'>Suggestions</h2><ul class='mt-20 text-12' role='listbox'><li role='option'>
 <button 
 
 
 class='relative'
 
 
 
 x-data
 @click='handleClickTerm'
 
 
 
 
 type='button'
 
 
 
 
 
 
>Déodorant stick Vanille Tonka <b>[New]</b></button>
 </li><li role='option'>
 <button 
 
 
 class='relative'
 
 
 
 x-data
 @click='handleClickTerm'
 
 
 
 
 type='button'
 
 
 
 
 
 
>Soin Lèvres Collagène Booster <b>[New]</b></button>
 </li><li role='option'>
 <button 
 
 
 class='relative'
 
 
 
 x-data
 @click='handleClickTerm'
 
 
 
 
 type='button'
 
 
 
 
 
 
>Stick Solaire <b>[New]</b></button>
 </li><li role='option'>
 <button 
 
 
 class='relative'
 
 
 
 x-data
 @click='handleClickTerm'
 
 
 
 
 type='button'
 
 
 
 
 
 
>Recharge Déodorant stick</button>
 </li><li role='option'>
 <button 
 
 
 class='relative'
 
 
 
 x-data
 @click='handleClickTerm'
 
 
 
 
 type='button'
 
 
 
 
 
 
>Crème</button>
 </li></ul></section><section class='my-24 flex gap-y-5 lg:my-40 lg:flex-wrap lg:gap-x-4 lg:gap-y-12 lg-max:flex-col' x-ref='predictiveSearchResults'><article class='group relative isolate flex flex-col lg:w-[24.6%] h-120'><a
 href='/products/deodorant-stick-vanille-tonka'
 @click='$store.global.isSearchVisible=false'
 class='flex h-full items-center gap-7'><div class='relative flex-shrink-0 h-full'>
 
 <picture
 class="block h-full w-auto rounded-md"
 ><source
 media="(min-width: 1024px)"
 sizes="6vw"
 srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&height=1195&v=1781775871&width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&height=1494&v=1781775871&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&height=2390&v=1781775871&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&height=2987&v=1781775871&width=2400 2400w"
 width="94"
 height="117"
 ><img src="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&amp;height=92&amp;v=1781775871&amp;width=74" alt="Déodorant stick Vanille Tonka" width="74" height="92" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&amp;height=60&amp;v=1781775871&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&amp;height=119&amp;v=1781775871&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&amp;height=199&amp;v=1781775871&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&amp;height=398&amp;v=1781775871&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&amp;height=796&amp;v=1781775871&amp;width=640 640w" sizes="19vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden h-full h-full w-full object-cover rounded-md"
 ><source
 media="(min-width: 1024px)"
 sizes="6vw"
 srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&height=1195&v=1781775872&width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&height=1494&v=1781775872&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&height=2390&v=1781775872&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&height=2987&v=1781775872&width=2400 2400w"
 width="94"
 height="117"
 ><img src="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=92&amp;v=1781775872&amp;width=74" alt="Déodorant stick Vanille Tonka" width="74" height="92" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=60&amp;v=1781775872&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=119&amp;v=1781775872&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=199&amp;v=1781775872&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=398&amp;v=1781775872&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=796&amp;v=1781775872&amp;width=640 640w" sizes="19vw" class="w-full">
</picture>
 
 </div><div class='flex flex-col gap-6'>
 
 <div class="flex items-center gap-x-4"><span
 role="img"
 aria-label="Noté 4.7 sur 5"
 class="mb-1 h-11 w-11"
 >
 <svg viewbox='0 0 10 9' fill='none' xmlns='http://www.w3.org/2000/svg' class=''><path d="M4.20608 0.388707C4.31734 0.0462747 4.8018 0.0462739 4.91306 0.388706L5.72783 2.89632C5.77759 3.04946 5.9203 3.15315 6.08132 3.15315L8.71798 3.15315C9.07804 3.15315 9.22774 3.61389 8.93645 3.82552L6.80335 5.37531C6.67308 5.46996 6.61857 5.63772 6.66833 5.79086L7.4831 8.29848C7.59436 8.64091 7.20243 8.92566 6.91114 8.71403L4.77804 7.16424C4.64777 7.06959 4.47137 7.06959 4.3411 7.16424L2.208 8.71403C1.91671 8.92566 1.52478 8.64091 1.63604 8.29848L2.45081 5.79086C2.50057 5.63772 2.44606 5.46996 2.31579 5.37531L0.18269 3.82552C-0.108601 3.61389 0.0411019 3.15315 0.401157 3.15315L3.03782 3.15315C3.19884 3.15315 3.34155 3.04946 3.39131 2.89632L4.20608 0.388707Z" fill="currentColor"/></svg>
 </span><span aria-hidden="true" class="text-11/normal font-bold uppercase tracking-wider lg:text-10/narrower">4.7/5
 
</span></div>

 
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Déodorant stick Vanille Tonka</h2><p class='line-clamp-1 text-13/narrow hidden xl:block lg-max:block'>
 Efficacité 48h
 </p></div><div class='text-13 font-black leading-none'><span>11,90€</span></div></div>
 
</a></article>
<article class='group relative isolate flex flex-col lg:w-[24.6%] h-120'><a
 href='/products/stick-solaire-anti-tache-50'
 @click='$store.global.isSearchVisible=false'
 class='flex h-full items-center gap-7'><div class='relative flex-shrink-0 h-full'>
 
 <picture
 class="block h-full w-auto rounded-md"
 ><source
 media="(min-width: 1024px)"
 sizes="6vw"
 srcset="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&height=1195&v=1776679718&width=960 960w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&height=1494&v=1776679718&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&height=2390&v=1776679718&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&height=2987&v=1776679718&width=2400 2400w"
 width="94"
 height="117"
 ><img src="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=92&amp;v=1776679718&amp;width=74" alt="Stick Solaire Matifiant SPF50+" width="74" height="92" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=60&amp;v=1776679718&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=119&amp;v=1776679718&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=199&amp;v=1776679718&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=398&amp;v=1776679718&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=796&amp;v=1776679718&amp;width=640 640w" sizes="19vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden h-full h-full w-full object-cover rounded-md"
 ><source
 media="(min-width: 1024px)"
 sizes="6vw"
 srcset="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&height=1195&v=1776679718&width=960 960w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&height=1494&v=1776679718&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&height=2390&v=1776679718&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&height=2987&v=1776679718&width=2400 2400w"
 width="94"
 height="117"
 ><img src="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&amp;height=92&amp;v=1776679718&amp;width=74" alt="Stick Solaire Matifiant SPF50+" width="74" height="92" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&amp;height=60&amp;v=1776679718&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&amp;height=119&amp;v=1776679718&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&amp;height=199&amp;v=1776679718&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&amp;height=398&amp;v=1776679718&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&amp;height=796&amp;v=1776679718&amp;width=640 640w" sizes="19vw" class="w-full">
</picture>
 
 </div><div class='flex flex-col gap-6'>
 
 <div class="flex items-center gap-x-4"><span
 role="img"
 aria-label="Noté 4.7 sur 5"
 class="mb-1 h-11 w-11"
 >
 <svg viewbox='0 0 10 9' fill='none' xmlns='http://www.w3.org/2000/svg' class=''><path d="M4.20608 0.388707C4.31734 0.0462747 4.8018 0.0462739 4.91306 0.388706L5.72783 2.89632C5.77759 3.04946 5.9203 3.15315 6.08132 3.15315L8.71798 3.15315C9.07804 3.15315 9.22774 3.61389 8.93645 3.82552L6.80335 5.37531C6.67308 5.46996 6.61857 5.63772 6.66833 5.79086L7.4831 8.29848C7.59436 8.64091 7.20243 8.92566 6.91114 8.71403L4.77804 7.16424C4.64777 7.06959 4.47137 7.06959 4.3411 7.16424L2.208 8.71403C1.91671 8.92566 1.52478 8.64091 1.63604 8.29848L2.45081 5.79086C2.50057 5.63772 2.44606 5.46996 2.31579 5.37531L0.18269 3.82552C-0.108601 3.61389 0.0411019 3.15315 0.401157 3.15315L3.03782 3.15315C3.19884 3.15315 3.34155 3.04946 3.39131 2.89632L4.20608 0.388707Z" fill="currentColor"/></svg>
 </span><span aria-hidden="true" class="text-11/normal font-bold uppercase tracking-wider lg:text-10/narrower">4.7/5
 
</span></div>

 
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Stick Solaire Matifiant SPF50+</h2><p class='line-clamp-1 text-13/narrow hidden xl:block lg-max:block'>
 Très Haute Protection UVA/B + Bakuchiol
 </p></div><div class='text-13 font-black leading-none'><span>13,90€</span></div></div>
 
</a></article>
<article class='group relative isolate flex flex-col lg:w-[24.6%] h-120'><a
 href='/products/serum-glow-and-protect'
 @click='$store.global.isSearchVisible=false'
 class='flex h-full items-center gap-7'><div class='relative flex-shrink-0 h-full'>
 
 <picture
 class="block h-full w-auto rounded-md"
 ><source
 media="(min-width: 1024px)"
 sizes="6vw"
 srcset="//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&height=1195&v=1768405266&width=960 960w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&height=1494&v=1768405266&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&height=2390&v=1768405266&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&height=2987&v=1768405266&width=2400 2400w"
 width="94"
 height="117"
 ><img src="//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=92&amp;v=1768405266&amp;width=74" alt="Sérum Glow &amp; Protect" width="74" height="92" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=60&amp;v=1768405266&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=119&amp;v=1768405266&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=199&amp;v=1768405266&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=398&amp;v=1768405266&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=796&amp;v=1768405266&amp;width=640 640w" sizes="19vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden h-full h-full w-full object-cover rounded-md"
 ><source
 media="(min-width: 1024px)"
 sizes="6vw"
 srcset="//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&height=1195&v=1770808338&width=960 960w,//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&height=1494&v=1770808338&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&height=2390&v=1770808338&width=1920 1920w"
 width="94"
 height="117"
 ><img src="//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&amp;height=92&amp;v=1770808338&amp;width=74" alt="Sérum Glow &amp; Protect" width="74" height="92" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&amp;height=60&amp;v=1770808338&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&amp;height=119&amp;v=1770808338&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&amp;height=199&amp;v=1770808338&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&amp;height=398&amp;v=1770808338&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&amp;height=796&amp;v=1770808338&amp;width=640 640w" sizes="19vw" class="w-full">
</picture>
 
 </div><div class='flex flex-col gap-6'>
 
 <div class="flex items-center gap-x-4"><span
 role="img"
 aria-label="Noté 4.8 sur 5"
 class="mb-1 h-11 w-11"
 >
 <svg viewbox='0 0 10 9' fill='none' xmlns='http://www.w3.org/2000/svg' class=''><path d="M4.20608 0.388707C4.31734 0.0462747 4.8018 0.0462739 4.91306 0.388706L5.72783 2.89632C5.77759 3.04946 5.9203 3.15315 6.08132 3.15315L8.71798 3.15315C9.07804 3.15315 9.22774 3.61389 8.93645 3.82552L6.80335 5.37531C6.67308 5.46996 6.61857 5.63772 6.66833 5.79086L7.4831 8.29848C7.59436 8.64091 7.20243 8.92566 6.91114 8.71403L4.77804 7.16424C4.64777 7.06959 4.47137 7.06959 4.3411 7.16424L2.208 8.71403C1.91671 8.92566 1.52478 8.64091 1.63604 8.29848L2.45081 5.79086C2.50057 5.63772 2.44606 5.46996 2.31579 5.37531L0.18269 3.82552C-0.108601 3.61389 0.0411019 3.15315 0.401157 3.15315L3.03782 3.15315C3.19884 3.15315 3.34155 3.04946 3.39131 2.89632L4.20608 0.388707Z" fill="currentColor"/></svg>
 </span><span aria-hidden="true" class="text-11/normal font-bold uppercase tracking-wider lg:text-10/narrower">4.8/5
 
</span></div>

 
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Sérum Glow & Protect</h2><p class='line-clamp-1 text-13/narrow hidden xl:block lg-max:block'>
 Vitamine C brevetée + SPF30
 </p></div><div class='text-13 font-black leading-none'><span>27,90€</span></div></div>
 
</a></article>
<article class='group relative isolate flex flex-col lg:w-[24.6%] h-120'><a
 href='/products/masque-stick-booster-eclat'
 @click='$store.global.isSearchVisible=false'
 class='flex h-full items-center gap-7'><div class='relative flex-shrink-0 h-full'>
 
 <picture
 class="block h-full w-auto rounded-md"
 ><source
 media="(min-width: 1024px)"
 sizes="6vw"
 srcset="//respire.co/cdn/shop/files/Respire-Skincare-Gamme-Boost-Masque-Visage-Eclat-Vitamine-C-SF-30.jpg?crop=center&height=1195&v=1767706924&width=960 960w,//respire.co/cdn/shop/files/Respire-Skincare-Gamme-Boost-Masque-Visage-Eclat-Vitamine-C-SF-30.jpg?crop=center&height=1494&v=1767706924&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Skincare-Gamme-Boost-Masque-Visage-Eclat-Vitamine-C-SF-30.jpg?crop=center&height=2390&v=1767706924&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Skincare-Gamme-Boost-Masque-Visage-Eclat-Vitamine-C-SF-30.jpg?crop=center&height=2987&v=1767706924&width=2400 2400w"
 width="94"
 height="117"
 ><img src="//respire.co/cdn/shop/files/Respire-Skincare-Gamme-Boost-Masque-Visage-Eclat-Vitamine-C-SF-30.jpg?crop=center&amp;height=92&amp;v=1767706924&amp;width=74" alt="Masque Stick Booster Éclat" width="74" height="92" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Skincare-Gamme-Boost-Masque-Visage-Eclat-Vitamine-C-SF-30.jpg?crop=center&amp;height=60&amp;v=1767706924&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Skincare-Gamme-Boost-Masque-Visage-Eclat-Vitamine-C-SF-30.jpg?crop=center&amp;height=119&amp;v=1767706924&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Skincare-Gamme-Boost-Masque-Visage-Eclat-Vitamine-C-SF-30.jpg?crop=center&amp;height=199&amp;v=1767706924&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Skincare-Gamme-Boost-Masque-Visage-Eclat-Vitamine-C-SF-30.jpg?crop=center&amp;height=398&amp;v=1767706924&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Skincare-Gamme-Boost-Masque-Visage-Eclat-Vitamine-C-SF-30.jpg?crop=center&amp;height=796&amp;v=1767706924&amp;width=640 640w" sizes="19vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden h-full h-full w-full object-cover rounded-md"
 ><source
 media="(min-width: 1024px)"
 sizes="6vw"
 srcset="//respire.co/cdn/shop/files/012_APPLICATION_LAVAGE_MASQUE_KAREN_263copie2_1.jpg?crop=center&height=1195&v=1770808338&width=960 960w,//respire.co/cdn/shop/files/012_APPLICATION_LAVAGE_MASQUE_KAREN_263copie2_1.jpg?crop=center&height=1494&v=1770808338&width=1200 1200w,//respire.co/cdn/shop/files/012_APPLICATION_LAVAGE_MASQUE_KAREN_263copie2_1.jpg?crop=center&height=2390&v=1770808338&width=1920 1920w,//respire.co/cdn/shop/files/012_APPLICATION_LAVAGE_MASQUE_KAREN_263copie2_1.jpg?crop=center&height=2987&v=1770808338&width=2400 2400w"
 width="94"
 height="117"
 ><img src="//respire.co/cdn/shop/files/012_APPLICATION_LAVAGE_MASQUE_KAREN_263copie2_1.jpg?crop=center&amp;height=92&amp;v=1770808338&amp;width=74" alt="Masque Stick Booster Éclat" width="74" height="92" loading="lazy" srcset="//respire.co/cdn/shop/files/012_APPLICATION_LAVAGE_MASQUE_KAREN_263copie2_1.jpg?crop=center&amp;height=60&amp;v=1770808338&amp;width=48 48w,//respire.co/cdn/shop/files/012_APPLICATION_LAVAGE_MASQUE_KAREN_263copie2_1.jpg?crop=center&amp;height=119&amp;v=1770808338&amp;width=96 96w,//respire.co/cdn/shop/files/012_APPLICATION_LAVAGE_MASQUE_KAREN_263copie2_1.jpg?crop=center&amp;height=199&amp;v=1770808338&amp;width=160 160w,//respire.co/cdn/shop/files/012_APPLICATION_LAVAGE_MASQUE_KAREN_263copie2_1.jpg?crop=center&amp;height=398&amp;v=1770808338&amp;width=320 320w,//respire.co/cdn/shop/files/012_APPLICATION_LAVAGE_MASQUE_KAREN_263copie2_1.jpg?crop=center&amp;height=796&amp;v=1770808338&amp;width=640 640w" sizes="19vw" class="w-full">
</picture>
 
 </div><div class='flex flex-col gap-6'>
 
 <div class="flex items-center gap-x-4"><span
 role="img"
 aria-label="Noté 4.4 sur 5"
 class="mb-1 h-11 w-11"
 >
 <svg viewbox='0 0 10 9' fill='none' xmlns='http://www.w3.org/2000/svg' class=''><path d="M4.20608 0.388707C4.31734 0.0462747 4.8018 0.0462739 4.91306 0.388706L5.72783 2.89632C5.77759 3.04946 5.9203 3.15315 6.08132 3.15315L8.71798 3.15315C9.07804 3.15315 9.22774 3.61389 8.93645 3.82552L6.80335 5.37531C6.67308 5.46996 6.61857 5.63772 6.66833 5.79086L7.4831 8.29848C7.59436 8.64091 7.20243 8.92566 6.91114 8.71403L4.77804 7.16424C4.64777 7.06959 4.47137 7.06959 4.3411 7.16424L2.208 8.71403C1.91671 8.92566 1.52478 8.64091 1.63604 8.29848L2.45081 5.79086C2.50057 5.63772 2.44606 5.46996 2.31579 5.37531L0.18269 3.82552C-0.108601 3.61389 0.0411019 3.15315 0.401157 3.15315L3.03782 3.15315C3.19884 3.15315 3.34155 3.04946 3.39131 2.89632L4.20608 0.388707Z" fill="currentColor"/></svg>
 </span><span aria-hidden="true" class="text-11/normal font-bold uppercase tracking-wider lg:text-10/narrower">4.4/5
 
</span></div>

 
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Masque Stick Booster Éclat</h2><p class='line-clamp-1 text-13/narrow hidden xl:block lg-max:block'>
 Vitamine C + Ginseng Rouge + Argile Rose
 </p></div><div class='text-13 font-black leading-none'><span>18,90€</span></div></div>
 
</a></article>
<article class='group relative isolate flex flex-col lg:w-[24.6%] h-120'><a
 href='/products/soin-levres-collagene-booster'
 @click='$store.global.isSearchVisible=false'
 class='flex h-full items-center gap-7'><div class='relative flex-shrink-0 h-full'>
 
 <picture
 class="block h-full w-auto rounded-md"
 ><source
 media="(min-width: 1024px)"
 sizes="6vw"
 srcset="//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&height=1195&v=1773330409&width=960 960w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&height=1494&v=1773330409&width=1200 1200w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&height=2390&v=1773330409&width=1920 1920w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&height=2987&v=1773330409&width=2400 2400w"
 width="94"
 height="117"
 ><img src="//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=92&amp;v=1773330409&amp;width=74" alt="Soin Lèvres Collagène Booster" width="74" height="92" loading="lazy" srcset="//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=60&amp;v=1773330409&amp;width=48 48w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=119&amp;v=1773330409&amp;width=96 96w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=199&amp;v=1773330409&amp;width=160 160w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=398&amp;v=1773330409&amp;width=320 320w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=796&amp;v=1773330409&amp;width=640 640w" sizes="19vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden h-full h-full w-full object-cover rounded-md"
 ><source
 media="(min-width: 1024px)"
 sizes="6vw"
 srcset="//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&height=1195&v=1774535264&width=960 960w,//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&height=1494&v=1774535264&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&height=2390&v=1774535264&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&height=2987&v=1774535264&width=2400 2400w"
 width="94"
 height="117"
 ><img src="//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&amp;height=92&amp;v=1774535264&amp;width=74" alt="Soin Lèvres Collagène Booster" width="74" height="92" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&amp;height=60&amp;v=1774535264&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&amp;height=119&amp;v=1774535264&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&amp;height=199&amp;v=1774535264&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&amp;height=398&amp;v=1774535264&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&amp;height=796&amp;v=1774535264&amp;width=640 640w" sizes="19vw" class="w-full">
</picture>
 
 </div><div class='flex flex-col gap-6'>
 
 <div class="flex items-center gap-x-4"><span
 role="img"
 aria-label="Noté 4.0 sur 5"
 class="mb-1 h-11 w-11"
 >
 <svg viewbox='0 0 10 9' fill='none' xmlns='http://www.w3.org/2000/svg' class=''><path d="M4.20608 0.388707C4.31734 0.0462747 4.8018 0.0462739 4.91306 0.388706L5.72783 2.89632C5.77759 3.04946 5.9203 3.15315 6.08132 3.15315L8.71798 3.15315C9.07804 3.15315 9.22774 3.61389 8.93645 3.82552L6.80335 5.37531C6.67308 5.46996 6.61857 5.63772 6.66833 5.79086L7.4831 8.29848C7.59436 8.64091 7.20243 8.92566 6.91114 8.71403L4.77804 7.16424C4.64777 7.06959 4.47137 7.06959 4.3411 7.16424L2.208 8.71403C1.91671 8.92566 1.52478 8.64091 1.63604 8.29848L2.45081 5.79086C2.50057 5.63772 2.44606 5.46996 2.31579 5.37531L0.18269 3.82552C-0.108601 3.61389 0.0411019 3.15315 0.401157 3.15315L3.03782 3.15315C3.19884 3.15315 3.34155 3.04946 3.39131 2.89632L4.20608 0.388707Z" fill="currentColor"/></svg>
 </span><span aria-hidden="true" class="text-11/normal font-bold uppercase tracking-wider lg:text-10/narrower">4.0/5
 
</span></div>

 
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Soin Lèvres Collagène Booster</h2><p class='line-clamp-1 text-13/narrow hidden xl:block lg-max:block'>
 4% Peptides Pro-Collagène + SPF20
 </p></div><div class='text-13 font-black leading-none'><span>19,90€</span></div></div>
 
</a></article>
</section></div></div><div
 class='fixed z-1 h-full w-full bg-black/20'
 aria-hidden
 x-data
 @click='$store.global.isSearchVisible=false'
 x-show='$store.global.isSearchVisible'
 x-transition:enter='transition-opacity ease-expo-out duration-700 transform-gpu'
 x-transition:enter-start='opacity-0'
 x-transition:leave='transition-opacity ease-quart-inout duration-700 transform-gpu pointer-events-none'
 x-transition:leave-end='opacity-0'
 x-cloak
></div>
</aside>
<!-- END sections: header-group --><main data-taxi id="app" tabindex="-1" class="relative min-h-viewportMax"><div
 
 data-taxi-view><aside id="shopify-section-template--26101953266000__nav" class="shopify-section offset-with-banner sticky top-header z-1 overflow-y-auto border-b border-grey-light bg-white py-10"><nav role='navigation' class='w-fit text-12/none font-bold uppercase text-grey'><ul class='flex gap-10 margin-px-1 heir-span:whitespace-nowrap'><li><a
 aria-current='page'
 class='grid place-items-center rounded-sm p-10 text-center border text-black border-grey-light'
 href='/collections/deodorant'
 ><span>Tout Voir</span></a></li><li><a
 
 class='grid place-items-center rounded-sm p-10 text-center border hover:bg-grey-lighter transition-colors duration-400 ease-cubic-out border-transparent'
 href='/collections/deodorants-solides-naturels'
 ><span>Sticks</span></a></li><li><a
 
 class='grid place-items-center rounded-sm p-10 text-center border hover:bg-grey-lighter transition-colors duration-400 ease-cubic-out border-transparent'
 href='/collections/deodorants-sticks-carton-certifies-bio'
 ><span>Sticks carton</span></a></li><li><a
 
 class='grid place-items-center rounded-sm p-10 text-center border hover:bg-grey-lighter transition-colors duration-400 ease-cubic-out border-transparent'
 href='/collections/deodorants-roll-on-naturels'
 ><span>Roll-Ons</span></a></li><li><a
 
 class='grid place-items-center rounded-sm p-10 text-center border hover:bg-grey-lighter transition-colors duration-400 ease-cubic-out border-transparent'
 href='/collections/recharges'
 ><span>Recharges</span></a></li><li><a
 
 class='grid place-items-center rounded-sm p-10 text-center border hover:bg-grey-lighter transition-colors duration-400 ease-cubic-out border-transparent'
 href='/collections/kit-personnalise'
 ><span>KIT personnalisé</span></a></li></ul></nav></aside><section id="shopify-section-template--26101953266000__template" class="shopify-section"><div class="pb-60">
 
 <h1 class="py-60 text-center text-28/narrowest font-black uppercase tracking-tighter lg:text-64/narrowest">Déodorants</h1><div class="grid-container flex flex-wrap gap-y-34 gutter-gap-x-1 lg:span-px-1-wide">
 
 <article class='group relative isolate flex flex-col span-w-6 lg:span-w-7'><a
 href='/products/deodorant-stick-vanille-tonka'><div class='relative flex-shrink-0'><span class='absolute right-0 top-0 z-1 block p-14 text-13/narrower font-bold'>[ New ]</span>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&height=1198&v=1781775871&width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&height=1497&v=1781775871&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&height=2396&v=1781775871&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&height=2994&v=1781775871&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&amp;height=242&amp;v=1781775871&amp;width=194" alt="Déodorant stick Vanille Tonka" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&amp;height=60&amp;v=1781775871&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&amp;height=120&amp;v=1781775871&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&amp;height=200&amp;v=1781775871&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&amp;height=399&amp;v=1781775871&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?crop=center&amp;height=798&amp;v=1781775871&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&height=1198&v=1781775872&width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&height=1497&v=1781775872&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&height=2396&v=1781775872&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&height=2994&v=1781775872&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=242&amp;v=1781775872&amp;width=194" alt="Déodorant stick Vanille Tonka" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=60&amp;v=1781775872&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=120&amp;v=1781775872&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=200&amp;v=1781775872&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=399&amp;v=1781775872&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=798&amp;v=1781775872&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Déodorant stick Vanille Tonka</h2><p class='line-clamp-1 text-13/narrow'>
 Efficacité 48h
 </p></div><div class='text-13 font-black leading-none'><span>11,90€</span></div></div>
 
</a><div class='pointer-events-none absolute flex aspect-[4/5] w-full items-end justify-center overflow-clip'><div class='translate-y-full py-14 transition-transform duration-400 ease-expo-out group-focus-within:transform-none group-hover:transform-none'><button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out h-40 bg-black hover:bg-grey-dark text-white overflow-clip w-fit pointer-events-auto min-w-[8rem]'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:53158969409872,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Déodorant stick Vanille Tonka&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 10533813682512, Categories: ["Déodorants","Déodorants Sticks","Nouveautés","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Packshot.jpg?v=1781775871&width=720", URL: "https://respire.co/products/deodorant-stick-vanille-tonka", Price: "11,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
:inert='loading'><div
 class='h-full transform-gpu transition-transform duration-500 ease-quart-inout'
 :class='loading && "-translate-y-full !ease-expo-out"'
 ><div class='flex h-full items-center transition-transform'>Ajouter</div><div class='absolute left-0 top-full flex h-full w-full items-center justify-center transition-transform'>
 <div
 role='status'
 class='pointer-events-none w-18'
 aria-label='Loading...'
><svg
 viewbox='0 0 100 101'
 fill='none'
 xmlns='http://www.w3.org/2000/svg'
 class='animate-[spin_600ms_linear_infinite] fill-current'
 aria-hidden='true'
 ><path d='M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z' fill='currentColor' opacity='0.3' /><path d='M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z' fill='currentFill' /></svg></div>
 </div></div></button></div></div></article>
 
 <article class='group relative isolate flex flex-col span-w-6 lg:span-w-7'><a
 href='/products/recharge-deodorant-stick-vanille-tonka'><div class='relative flex-shrink-0'><span class='absolute right-0 top-0 z-1 block p-14 text-13/narrower font-bold'>[ New ]</span>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Recharge-Deodorant-stick-Vanille-Tonka.jpg?crop=center&height=1198&v=1781779509&width=960 960w,//respire.co/cdn/shop/files/Respire-Recharge-Deodorant-stick-Vanille-Tonka.jpg?crop=center&height=1497&v=1781779509&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Recharge-Deodorant-stick-Vanille-Tonka.jpg?crop=center&height=2396&v=1781779509&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Recharge-Deodorant-stick-Vanille-Tonka.jpg?crop=center&height=2994&v=1781779509&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Recharge-Deodorant-stick-Vanille-Tonka.jpg?crop=center&amp;height=242&amp;v=1781779509&amp;width=194" alt="Recharge Déodorant stick Vanille Tonka" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Recharge-Deodorant-stick-Vanille-Tonka.jpg?crop=center&amp;height=60&amp;v=1781779509&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Recharge-Deodorant-stick-Vanille-Tonka.jpg?crop=center&amp;height=120&amp;v=1781779509&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Recharge-Deodorant-stick-Vanille-Tonka.jpg?crop=center&amp;height=200&amp;v=1781779509&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Recharge-Deodorant-stick-Vanille-Tonka.jpg?crop=center&amp;height=399&amp;v=1781779509&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Recharge-Deodorant-stick-Vanille-Tonka.jpg?crop=center&amp;height=798&amp;v=1781779509&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&height=1198&v=1781775872&width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&height=1497&v=1781775872&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&height=2396&v=1781775872&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&height=2994&v=1781775872&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=242&amp;v=1781775872&amp;width=194" alt="Recharge Déodorant stick Vanille Tonka" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=60&amp;v=1781775872&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=120&amp;v=1781775872&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=200&amp;v=1781775872&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=399&amp;v=1781775872&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Vanille-Tonka-Application.jpg?crop=center&amp;height=798&amp;v=1781775872&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Recharge Déodorant stick Vanille Tonka</h2><p class='line-clamp-1 text-13/narrow'>
 Efficacité 48h
 </p></div><div class='text-13 font-black leading-none'><span>10,90€</span></div></div>
 
</a><div class='pointer-events-none absolute flex aspect-[4/5] w-full items-end justify-center overflow-clip'><div class='translate-y-full py-14 transition-transform duration-400 ease-expo-out group-focus-within:transform-none group-hover:transform-none'><button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out h-40 bg-black hover:bg-grey-dark text-white overflow-clip w-fit pointer-events-auto min-w-[8rem]'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:53159300137296,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Recharge Déodorant stick Vanille Tonka&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 10533855002960, Categories: ["Déodorants","Déodorants Sticks","Nouveautés","Recharges","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/Respire-Recharge-Deodorant-stick-Vanille-Tonka.jpg?v=1781779509&width=720", URL: "https://respire.co/products/recharge-deodorant-stick-vanille-tonka", Price: "10,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
:inert='loading'><div
 class='h-full transform-gpu transition-transform duration-500 ease-quart-inout'
 :class='loading && "-translate-y-full !ease-expo-out"'
 ><div class='flex h-full items-center transition-transform'>Ajouter</div><div class='absolute left-0 top-full flex h-full w-full items-center justify-center transition-transform'>
 <div
 role='status'
 class='pointer-events-none w-18'
 aria-label='Loading...'
><svg
 viewbox='0 0 100 101'
 fill='none'
 xmlns='http://www.w3.org/2000/svg'
 class='animate-[spin_600ms_linear_infinite] fill-current'
 aria-hidden='true'
 ><path d='M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z' fill='currentColor' opacity='0.3' /><path d='M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z' fill='currentFill' /></svg></div>
 </div></div></button></div></div></article>
 
 <article class='group relative isolate flex flex-col span-w-6 lg:span-w-7'><a
 href='/products/deodorant-stick-fleur-de-coton-efficace-48h'><div class='relative flex-shrink-0'>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?crop=center&height=1198&v=1763637117&width=960 960w,//respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?crop=center&height=1497&v=1763637117&width=1200 1200w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?crop=center&amp;height=242&amp;v=1763637117&amp;width=194" alt="Déodorant stick Fleur de Coton - Respire" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?crop=center&amp;height=60&amp;v=1763637117&amp;width=48 48w,//respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?crop=center&amp;height=120&amp;v=1763637117&amp;width=96 96w,//respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?crop=center&amp;height=200&amp;v=1763637117&amp;width=160 160w,//respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?crop=center&amp;height=399&amp;v=1763637117&amp;width=320 320w,//respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?crop=center&amp;height=798&amp;v=1763637117&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&height=1198&v=1780039061&width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&height=1497&v=1780039061&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&height=2396&v=1780039061&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&height=2994&v=1780039061&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=242&amp;v=1780039061&amp;width=194" alt="Déodorant stick Fleur de Coton" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=60&amp;v=1780039061&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=120&amp;v=1780039061&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=200&amp;v=1780039061&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=399&amp;v=1780039061&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=798&amp;v=1780039061&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Déodorant stick Fleur de Coton</h2><p class='line-clamp-1 text-13/narrow'>
 Oxyde de Magnésium + Amidon de Maïs
 </p></div><div class='text-13 font-black leading-none'><span>11,90€</span></div></div>
 
</a><div class='pointer-events-none absolute flex aspect-[4/5] w-full items-end justify-center overflow-clip'><div class='translate-y-full py-14 transition-transform duration-400 ease-expo-out group-focus-within:transform-none group-hover:transform-none'><button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out h-40 bg-black hover:bg-grey-dark text-white overflow-clip w-fit pointer-events-auto min-w-[8rem]'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:47868480192848,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Déodorant stick Fleur de Coton&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 8782815199568, Categories: ["Déodorants","Déodorants Sticks","Nouveautés | Respire","Soins solides","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?v=1763637117&width=720", URL: "https://respire.co/products/deodorant-stick-fleur-de-coton-efficace-48h", Price: "11,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
:inert='loading'><div
 class='h-full transform-gpu transition-transform duration-500 ease-quart-inout'
 :class='loading && "-translate-y-full !ease-expo-out"'
 ><div class='flex h-full items-center transition-transform'>Ajouter</div><div class='absolute left-0 top-full flex h-full w-full items-center justify-center transition-transform'>
 <div
 role='status'
 class='pointer-events-none w-18'
 aria-label='Loading...'
><svg
 viewbox='0 0 100 101'
 fill='none'
 xmlns='http://www.w3.org/2000/svg'
 class='animate-[spin_600ms_linear_infinite] fill-current'
 aria-hidden='true'
 ><path d='M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z' fill='currentColor' opacity='0.3' /><path d='M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z' fill='currentFill' /></svg></div>
 </div></div></button></div></div></article>
 
 <article class='group relative isolate flex flex-col span-w-6 lg:span-w-7'><a
 href='/products/recharge-deodorant-stick-fleur-de-coton-efficace-48h'><div class='relative flex-shrink-0'>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/recharge-deodorant-stick-fleur-de-coton-respire-7426633.jpg?crop=center&height=1198&v=1763636986&width=960 960w,//respire.co/cdn/shop/files/recharge-deodorant-stick-fleur-de-coton-respire-7426633.jpg?crop=center&height=1497&v=1763636986&width=1200 1200w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/recharge-deodorant-stick-fleur-de-coton-respire-7426633.jpg?crop=center&amp;height=242&amp;v=1763636986&amp;width=194" alt="Recharge Déodorant stick Fleur de Coton - Respire" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/recharge-deodorant-stick-fleur-de-coton-respire-7426633.jpg?crop=center&amp;height=60&amp;v=1763636986&amp;width=48 48w,//respire.co/cdn/shop/files/recharge-deodorant-stick-fleur-de-coton-respire-7426633.jpg?crop=center&amp;height=120&amp;v=1763636986&amp;width=96 96w,//respire.co/cdn/shop/files/recharge-deodorant-stick-fleur-de-coton-respire-7426633.jpg?crop=center&amp;height=200&amp;v=1763636986&amp;width=160 160w,//respire.co/cdn/shop/files/recharge-deodorant-stick-fleur-de-coton-respire-7426633.jpg?crop=center&amp;height=399&amp;v=1763636986&amp;width=320 320w,//respire.co/cdn/shop/files/recharge-deodorant-stick-fleur-de-coton-respire-7426633.jpg?crop=center&amp;height=798&amp;v=1763636986&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&height=1198&v=1780039061&width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&height=1497&v=1780039061&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&height=2396&v=1780039061&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&height=2994&v=1780039061&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=242&amp;v=1780039061&amp;width=194" alt="Recharge Déodorant stick Fleur de Coton" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=60&amp;v=1780039061&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=120&amp;v=1780039061&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=200&amp;v=1780039061&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=399&amp;v=1780039061&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=798&amp;v=1780039061&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Recharge Déodorant stick Fleur de Coton</h2><p class='line-clamp-1 text-13/narrow'>
 Efficacité 48h
 </p></div><div class='text-13 font-black leading-none'><span>10,90€</span></div></div>
 
</a><div class='pointer-events-none absolute flex aspect-[4/5] w-full items-end justify-center overflow-clip'><div class='translate-y-full py-14 transition-transform duration-400 ease-expo-out group-focus-within:transform-none group-hover:transform-none'><button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out h-40 bg-black hover:bg-grey-dark text-white overflow-clip w-fit pointer-events-auto min-w-[8rem]'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:48204010226000,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Recharge Déodorant stick Fleur de Coton&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 9031400096080, Categories: ["Déodorants","Déodorants Sticks","Nouveautés | Respire","Recharges","Soins solides","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/recharge-deodorant-stick-fleur-de-coton-respire-7426633.jpg?v=1763636986&width=720", URL: "https://respire.co/products/recharge-deodorant-stick-fleur-de-coton-efficace-48h", Price: "10,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
:inert='loading'><div
 class='h-full transform-gpu transition-transform duration-500 ease-quart-inout'
 :class='loading && "-translate-y-full !ease-expo-out"'
 ><div class='flex h-full items-center transition-transform'>Ajouter</div><div class='absolute left-0 top-full flex h-full w-full items-center justify-center transition-transform'>
 <div
 role='status'
 class='pointer-events-none w-18'
 aria-label='Loading...'
><svg
 viewbox='0 0 100 101'
 fill='none'
 xmlns='http://www.w3.org/2000/svg'
 class='animate-[spin_600ms_linear_infinite] fill-current'
 aria-hidden='true'
 ><path d='M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z' fill='currentColor' opacity='0.3' /><path d='M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z' fill='currentFill' /></svg></div>
 </div></div></button></div></div></article>
 
 <article class='group relative isolate flex flex-col span-w-6 lg:span-w-7'><a
 href='/products/deodorant-stick-douceur-monoi-efficace-48h'><div class='relative flex-shrink-0'>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/deodorant-stick-douceur-monoi-respire-2643009.jpg?crop=center&height=1198&v=1763575826&width=960 960w,//respire.co/cdn/shop/files/deodorant-stick-douceur-monoi-respire-2643009.jpg?crop=center&height=1497&v=1763575826&width=1200 1200w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/deodorant-stick-douceur-monoi-respire-2643009.jpg?crop=center&amp;height=242&amp;v=1763575826&amp;width=194" alt="Déodorant stick Douceur Monoï - Respire" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/deodorant-stick-douceur-monoi-respire-2643009.jpg?crop=center&amp;height=60&amp;v=1763575826&amp;width=48 48w,//respire.co/cdn/shop/files/deodorant-stick-douceur-monoi-respire-2643009.jpg?crop=center&amp;height=120&amp;v=1763575826&amp;width=96 96w,//respire.co/cdn/shop/files/deodorant-stick-douceur-monoi-respire-2643009.jpg?crop=center&amp;height=200&amp;v=1763575826&amp;width=160 160w,//respire.co/cdn/shop/files/deodorant-stick-douceur-monoi-respire-2643009.jpg?crop=center&amp;height=399&amp;v=1763575826&amp;width=320 320w,//respire.co/cdn/shop/files/deodorant-stick-douceur-monoi-respire-2643009.jpg?crop=center&amp;height=798&amp;v=1763575826&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&height=1198&v=1780043186&width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&height=1497&v=1780043186&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&height=2396&v=1780043186&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&height=2994&v=1780043186&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&amp;height=242&amp;v=1780043186&amp;width=194" alt="Déodorant stick Douceur Monoï" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&amp;height=60&amp;v=1780043186&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&amp;height=120&amp;v=1780043186&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&amp;height=200&amp;v=1780043186&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&amp;height=399&amp;v=1780043186&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&amp;height=798&amp;v=1780043186&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Déodorant stick Douceur Monoï</h2><p class='line-clamp-1 text-13/narrow'>
 Efficacité 48h, rechargeable
 </p></div><div class='text-13 font-black leading-none'><span>11,90€</span></div></div>
 
</a><div class='pointer-events-none absolute flex aspect-[4/5] w-full items-end justify-center overflow-clip'><div class='translate-y-full py-14 transition-transform duration-400 ease-expo-out group-focus-within:transform-none group-hover:transform-none'><button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out h-40 bg-black hover:bg-grey-dark text-white overflow-clip w-fit pointer-events-auto min-w-[8rem]'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:48203443339600,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Déodorant stick Douceur Monoï&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 9031231734096, Categories: ["Déodorants","Déodorants Sticks","Nos Iconiques I Respire","Nouveautés | Respire","Soins solides","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/deodorant-stick-douceur-monoi-respire-2643009.jpg?v=1763575826&width=720", URL: "https://respire.co/products/deodorant-stick-douceur-monoi-efficace-48h", Price: "11,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
:inert='loading'><div
 class='h-full transform-gpu transition-transform duration-500 ease-quart-inout'
 :class='loading && "-translate-y-full !ease-expo-out"'
 ><div class='flex h-full items-center transition-transform'>Ajouter</div><div class='absolute left-0 top-full flex h-full w-full items-center justify-center transition-transform'>
 <div
 role='status'
 class='pointer-events-none w-18'
 aria-label='Loading...'
><svg
 viewbox='0 0 100 101'
 fill='none'
 xmlns='http://www.w3.org/2000/svg'
 class='animate-[spin_600ms_linear_infinite] fill-current'
 aria-hidden='true'
 ><path d='M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z' fill='currentColor' opacity='0.3' /><path d='M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z' fill='currentFill' /></svg></div>
 </div></div></button></div></div></article>
 
 <article class='group relative isolate flex flex-col span-w-6 lg:span-w-7'><a
 href='/products/recharge-deodorant-stick-douceur-monoi'><div class='relative flex-shrink-0'>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/recharge-deodorant-stick-douceur-monoi-respire-6489958.jpg?crop=center&height=1198&v=1755619538&width=960 960w,//respire.co/cdn/shop/files/recharge-deodorant-stick-douceur-monoi-respire-6489958.jpg?crop=center&height=1497&v=1755619538&width=1200 1200w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/recharge-deodorant-stick-douceur-monoi-respire-6489958.jpg?crop=center&amp;height=242&amp;v=1755619538&amp;width=194" alt="Recharge Déodorant stick Douceur Monoï - Respire" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/recharge-deodorant-stick-douceur-monoi-respire-6489958.jpg?crop=center&amp;height=60&amp;v=1755619538&amp;width=48 48w,//respire.co/cdn/shop/files/recharge-deodorant-stick-douceur-monoi-respire-6489958.jpg?crop=center&amp;height=120&amp;v=1755619538&amp;width=96 96w,//respire.co/cdn/shop/files/recharge-deodorant-stick-douceur-monoi-respire-6489958.jpg?crop=center&amp;height=200&amp;v=1755619538&amp;width=160 160w,//respire.co/cdn/shop/files/recharge-deodorant-stick-douceur-monoi-respire-6489958.jpg?crop=center&amp;height=399&amp;v=1755619538&amp;width=320 320w,//respire.co/cdn/shop/files/recharge-deodorant-stick-douceur-monoi-respire-6489958.jpg?crop=center&amp;height=798&amp;v=1755619538&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&height=1198&v=1780043186&width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&height=1497&v=1780043186&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&height=2396&v=1780043186&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&height=2994&v=1780043186&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&amp;height=242&amp;v=1780043186&amp;width=194" alt="Recharge Déodorant stick Douceur Monoï" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&amp;height=60&amp;v=1780043186&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&amp;height=120&amp;v=1780043186&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&amp;height=200&amp;v=1780043186&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&amp;height=399&amp;v=1780043186&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Douceur-Monoi-Application.jpg?crop=center&amp;height=798&amp;v=1780043186&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Recharge Déodorant stick Douceur Monoï</h2><p class='line-clamp-1 text-13/narrow'>
 Efficace 48h
 </p></div><div class='text-13 font-black leading-none'><span>10,90€</span></div></div>
 
</a><div class='pointer-events-none absolute flex aspect-[4/5] w-full items-end justify-center overflow-clip'><div class='translate-y-full py-14 transition-transform duration-400 ease-expo-out group-focus-within:transform-none group-hover:transform-none'><button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out h-40 bg-black hover:bg-grey-dark text-white overflow-clip w-fit pointer-events-auto min-w-[8rem]'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:51213849166160,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Recharge Déodorant stick Douceur Monoï&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 10056944058704, Categories: ["Déodorants","Déodorants Sticks","Nos Iconiques I Respire","Nouveautés | Respire","Recharges","Soins solides","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/recharge-deodorant-stick-douceur-monoi-respire-6489958.jpg?v=1755619538&width=720", URL: "https://respire.co/products/recharge-deodorant-stick-douceur-monoi", Price: "10,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
:inert='loading'><div
 class='h-full transform-gpu transition-transform duration-500 ease-quart-inout'
 :class='loading && "-translate-y-full !ease-expo-out"'
 ><div class='flex h-full items-center transition-transform'>Ajouter</div><div class='absolute left-0 top-full flex h-full w-full items-center justify-center transition-transform'>
 <div
 role='status'
 class='pointer-events-none w-18'
 aria-label='Loading...'
><svg
 viewbox='0 0 100 101'
 fill='none'
 xmlns='http://www.w3.org/2000/svg'
 class='animate-[spin_600ms_linear_infinite] fill-current'
 aria-hidden='true'
 ><path d='M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z' fill='currentColor' opacity='0.3' /><path d='M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z' fill='currentFill' /></svg></div>
 </div></div></button></div></div></article>
 
 <article class='group relative isolate flex flex-col span-w-6 lg:span-w-7'><a
 href='/products/deodorant-stick-menthe-eucalyptus-efficace-48h'><div class='relative flex-shrink-0'>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/deodorant-stick-menthe-eucalyptus-respire-4222462.jpg?crop=center&height=1198&v=1763570667&width=960 960w,//respire.co/cdn/shop/files/deodorant-stick-menthe-eucalyptus-respire-4222462.jpg?crop=center&height=1497&v=1763570667&width=1200 1200w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/deodorant-stick-menthe-eucalyptus-respire-4222462.jpg?crop=center&amp;height=242&amp;v=1763570667&amp;width=194" alt="Déodorant stick Menthe Eucalyptus - Respire" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/deodorant-stick-menthe-eucalyptus-respire-4222462.jpg?crop=center&amp;height=60&amp;v=1763570667&amp;width=48 48w,//respire.co/cdn/shop/files/deodorant-stick-menthe-eucalyptus-respire-4222462.jpg?crop=center&amp;height=120&amp;v=1763570667&amp;width=96 96w,//respire.co/cdn/shop/files/deodorant-stick-menthe-eucalyptus-respire-4222462.jpg?crop=center&amp;height=200&amp;v=1763570667&amp;width=160 160w,//respire.co/cdn/shop/files/deodorant-stick-menthe-eucalyptus-respire-4222462.jpg?crop=center&amp;height=399&amp;v=1763570667&amp;width=320 320w,//respire.co/cdn/shop/files/deodorant-stick-menthe-eucalyptus-respire-4222462.jpg?crop=center&amp;height=798&amp;v=1763570667&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&height=1198&v=1780047806&width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&height=1497&v=1780047806&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&height=2396&v=1780047806&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&height=2994&v=1780047806&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&amp;height=242&amp;v=1780047806&amp;width=194" alt="Déodorant stick Menthe Eucalyptus" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&amp;height=60&amp;v=1780047806&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&amp;height=120&amp;v=1780047806&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&amp;height=200&amp;v=1780047806&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&amp;height=399&amp;v=1780047806&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&amp;height=798&amp;v=1780047806&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Déodorant stick Menthe Eucalyptus</h2><p class='line-clamp-1 text-13/narrow'>
 Efficacité 48h
 </p></div><div class='text-13 font-black leading-none'><span>11,90€</span></div></div>
 
</a><div class='pointer-events-none absolute flex aspect-[4/5] w-full items-end justify-center overflow-clip'><div class='translate-y-full py-14 transition-transform duration-400 ease-expo-out group-focus-within:transform-none group-hover:transform-none'><button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out h-40 bg-black hover:bg-grey-dark text-white overflow-clip w-fit pointer-events-auto min-w-[8rem]'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:48203367907664,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Déodorant stick Menthe Eucalyptus&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 9031216726352, Categories: ["Déodorants","Déodorants Sticks","Nouveautés | Respire","Soins solides","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/deodorant-stick-menthe-eucalyptus-respire-4222462.jpg?v=1763570667&width=720", URL: "https://respire.co/products/deodorant-stick-menthe-eucalyptus-efficace-48h", Price: "11,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
:inert='loading'><div
 class='h-full transform-gpu transition-transform duration-500 ease-quart-inout'
 :class='loading && "-translate-y-full !ease-expo-out"'
 ><div class='flex h-full items-center transition-transform'>Ajouter</div><div class='absolute left-0 top-full flex h-full w-full items-center justify-center transition-transform'>
 <div
 role='status'
 class='pointer-events-none w-18'
 aria-label='Loading...'
><svg
 viewbox='0 0 100 101'
 fill='none'
 xmlns='http://www.w3.org/2000/svg'
 class='animate-[spin_600ms_linear_infinite] fill-current'
 aria-hidden='true'
 ><path d='M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z' fill='currentColor' opacity='0.3' /><path d='M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z' fill='currentFill' /></svg></div>
 </div></div></button></div></div></article>
 
 <article class='group relative isolate flex flex-col span-w-6 lg:span-w-7'><a
 href='/products/recharge-deodorant-stick-menthe-eucalyptus'><div class='relative flex-shrink-0'>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Recharge_Menthe_Eucalyptus_ombre.jpg?crop=center&height=1198&v=1756740751&width=960 960w,//respire.co/cdn/shop/files/Recharge_Menthe_Eucalyptus_ombre.jpg?crop=center&height=1497&v=1756740751&width=1200 1200w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Recharge_Menthe_Eucalyptus_ombre.jpg?crop=center&amp;height=242&amp;v=1756740751&amp;width=194" alt="Recharge Déodorant stick Menthe Eucalyptus" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Recharge_Menthe_Eucalyptus_ombre.jpg?crop=center&amp;height=60&amp;v=1756740751&amp;width=48 48w,//respire.co/cdn/shop/files/Recharge_Menthe_Eucalyptus_ombre.jpg?crop=center&amp;height=120&amp;v=1756740751&amp;width=96 96w,//respire.co/cdn/shop/files/Recharge_Menthe_Eucalyptus_ombre.jpg?crop=center&amp;height=200&amp;v=1756740751&amp;width=160 160w,//respire.co/cdn/shop/files/Recharge_Menthe_Eucalyptus_ombre.jpg?crop=center&amp;height=399&amp;v=1756740751&amp;width=320 320w,//respire.co/cdn/shop/files/Recharge_Menthe_Eucalyptus_ombre.jpg?crop=center&amp;height=798&amp;v=1756740751&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&height=1198&v=1780047806&width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&height=1497&v=1780047806&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&height=2396&v=1780047806&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&height=2994&v=1780047806&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&amp;height=242&amp;v=1780047806&amp;width=194" alt="Recharge Déodorant stick Menthe Eucalyptus" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&amp;height=60&amp;v=1780047806&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&amp;height=120&amp;v=1780047806&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&amp;height=200&amp;v=1780047806&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&amp;height=399&amp;v=1780047806&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-Menthe-Eucalyptus-application.jpg?crop=center&amp;height=798&amp;v=1780047806&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Recharge Déodorant stick Menthe Eucalyptus</h2><p class='line-clamp-1 text-13/narrow'>
 Efficacité 48h
 </p></div><div class='text-13 font-black leading-none'><span>10,90€</span></div></div>
 
</a><div class='pointer-events-none absolute flex aspect-[4/5] w-full items-end justify-center overflow-clip'><div class='translate-y-full py-14 transition-transform duration-400 ease-expo-out group-focus-within:transform-none group-hover:transform-none'><button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out h-40 bg-black hover:bg-grey-dark text-white overflow-clip w-fit pointer-events-auto min-w-[8rem]'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:51977152168272,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Recharge Déodorant stick Menthe Eucalyptus&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 10230175039824, Categories: ["Déodorants","Déodorants Sticks","Nouveautés | Respire","Recharges","Soins solides","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/Recharge_Menthe_Eucalyptus_ombre.jpg?v=1756740751&width=720", URL: "https://respire.co/products/recharge-deodorant-stick-menthe-eucalyptus", Price: "10,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
:inert='loading'><div
 class='h-full transform-gpu transition-transform duration-500 ease-quart-inout'
 :class='loading && "-translate-y-full !ease-expo-out"'
 ><div class='flex h-full items-center transition-transform'>Ajouter</div><div class='absolute left-0 top-full flex h-full w-full items-center justify-center transition-transform'>
 <div
 role='status'
 class='pointer-events-none w-18'
 aria-label='Loading...'
><svg
 viewbox='0 0 100 101'
 fill='none'
 xmlns='http://www.w3.org/2000/svg'
 class='animate-[spin_600ms_linear_infinite] fill-current'
 aria-hidden='true'
 ><path d='M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z' fill='currentColor' opacity='0.3' /><path d='M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z' fill='currentFill' /></svg></div>
 </div></div></button></div></div></article>
 
 <article class='group relative isolate flex flex-col span-w-6 lg:span-w-7'><a
 href='/products/deodorant-stick-rose-pivoine-efficace-48h'><div class='relative flex-shrink-0'>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/deodorant-stick-rose-pivoine-respire-9714692.jpg?crop=center&height=1198&v=1755619654&width=960 960w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/deodorant-stick-rose-pivoine-respire-9714692.jpg?crop=center&amp;height=242&amp;v=1755619654&amp;width=194" alt="Déodorant stick Rose Pivoine - Respire" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/deodorant-stick-rose-pivoine-respire-9714692.jpg?crop=center&amp;height=60&amp;v=1755619654&amp;width=48 48w,//respire.co/cdn/shop/files/deodorant-stick-rose-pivoine-respire-9714692.jpg?crop=center&amp;height=120&amp;v=1755619654&amp;width=96 96w,//respire.co/cdn/shop/files/deodorant-stick-rose-pivoine-respire-9714692.jpg?crop=center&amp;height=200&amp;v=1755619654&amp;width=160 160w,//respire.co/cdn/shop/files/deodorant-stick-rose-pivoine-respire-9714692.jpg?crop=center&amp;height=399&amp;v=1755619654&amp;width=320 320w,//respire.co/cdn/shop/files/deodorant-stick-rose-pivoine-respire-9714692.jpg?crop=center&amp;height=798&amp;v=1755619654&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&height=1198&v=1780045035&width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&height=1497&v=1780045035&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&height=2396&v=1780045035&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&height=2994&v=1780045035&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&amp;height=242&amp;v=1780045035&amp;width=194" alt="Déodorant stick Rose Pivoine" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&amp;height=60&amp;v=1780045035&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&amp;height=120&amp;v=1780045035&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&amp;height=200&amp;v=1780045035&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&amp;height=399&amp;v=1780045035&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&amp;height=798&amp;v=1780045035&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Déodorant stick Rose Pivoine</h2><p class='line-clamp-1 text-13/narrow'>
 Efficacité 48h, rechargeable
 </p></div><div class='text-13 font-black leading-none'><span>11,90€</span></div></div>
 
</a><div class='pointer-events-none absolute flex aspect-[4/5] w-full items-end justify-center overflow-clip'><div class='translate-y-full py-14 transition-transform duration-400 ease-expo-out group-focus-within:transform-none group-hover:transform-none'><button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out h-40 bg-black hover:bg-grey-dark text-white overflow-clip w-fit pointer-events-auto min-w-[8rem]'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:49142707585360,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Déodorant stick Rose Pivoine&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 9555900465488, Categories: ["Déodorants","Déodorants Sticks","Soins solides","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/deodorant-stick-rose-pivoine-respire-9714692.jpg?v=1755619654&width=720", URL: "https://respire.co/products/deodorant-stick-rose-pivoine-efficace-48h", Price: "11,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
:inert='loading'><div
 class='h-full transform-gpu transition-transform duration-500 ease-quart-inout'
 :class='loading && "-translate-y-full !ease-expo-out"'
 ><div class='flex h-full items-center transition-transform'>Ajouter</div><div class='absolute left-0 top-full flex h-full w-full items-center justify-center transition-transform'>
 <div
 role='status'
 class='pointer-events-none w-18'
 aria-label='Loading...'
><svg
 viewbox='0 0 100 101'
 fill='none'
 xmlns='http://www.w3.org/2000/svg'
 class='animate-[spin_600ms_linear_infinite] fill-current'
 aria-hidden='true'
 ><path d='M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z' fill='currentColor' opacity='0.3' /><path d='M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z' fill='currentFill' /></svg></div>
 </div></div></button></div></div></article>
 
 <article class='group relative isolate flex flex-col span-w-6 lg:span-w-7'><a
 href='/products/recharge-deodorant-stick-rose-pivoine'><div class='relative flex-shrink-0'>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/recharge-deodorant-stick-rose-pivoine-respire-4650942.jpg?crop=center&height=1198&v=1755619538&width=960 960w,//respire.co/cdn/shop/files/recharge-deodorant-stick-rose-pivoine-respire-4650942.jpg?crop=center&height=1497&v=1755619538&width=1200 1200w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/recharge-deodorant-stick-rose-pivoine-respire-4650942.jpg?crop=center&amp;height=242&amp;v=1755619538&amp;width=194" alt="Recharge Déodorant stick Rose Pivoine - Respire" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/recharge-deodorant-stick-rose-pivoine-respire-4650942.jpg?crop=center&amp;height=60&amp;v=1755619538&amp;width=48 48w,//respire.co/cdn/shop/files/recharge-deodorant-stick-rose-pivoine-respire-4650942.jpg?crop=center&amp;height=120&amp;v=1755619538&amp;width=96 96w,//respire.co/cdn/shop/files/recharge-deodorant-stick-rose-pivoine-respire-4650942.jpg?crop=center&amp;height=200&amp;v=1755619538&amp;width=160 160w,//respire.co/cdn/shop/files/recharge-deodorant-stick-rose-pivoine-respire-4650942.jpg?crop=center&amp;height=399&amp;v=1755619538&amp;width=320 320w,//respire.co/cdn/shop/files/recharge-deodorant-stick-rose-pivoine-respire-4650942.jpg?crop=center&amp;height=798&amp;v=1755619538&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&height=1198&v=1780045035&width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&height=1497&v=1780045035&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&height=2396&v=1780045035&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&height=2994&v=1780045035&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&amp;height=242&amp;v=1780045035&amp;width=194" alt="Recharge Déodorant stick Rose Pivoine" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&amp;height=60&amp;v=1780045035&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&amp;height=120&amp;v=1780045035&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&amp;height=200&amp;v=1780045035&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&amp;height=399&amp;v=1780045035&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-stick-naturel-rose-pivoine-application.jpg?crop=center&amp;height=798&amp;v=1780045035&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Recharge Déodorant stick Rose Pivoine</h2><p class='line-clamp-1 text-13/narrow'>
 Efficace 48h
 </p></div><div class='text-13 font-black leading-none'><span>10,90€</span></div></div>
 
</a><div class='pointer-events-none absolute flex aspect-[4/5] w-full items-end justify-center overflow-clip'><div class='translate-y-full py-14 transition-transform duration-400 ease-expo-out group-focus-within:transform-none group-hover:transform-none'><button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out h-40 bg-black hover:bg-grey-dark text-white overflow-clip w-fit pointer-events-auto min-w-[8rem]'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:51236124393808,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Recharge Déodorant stick Rose Pivoine&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 10059497963856, Categories: ["Déodorants","Déodorants Sticks","Recharges","Soins solides","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/recharge-deodorant-stick-rose-pivoine-respire-4650942.jpg?v=1755619538&width=720", URL: "https://respire.co/products/recharge-deodorant-stick-rose-pivoine", Price: "10,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
:inert='loading'><div
 class='h-full transform-gpu transition-transform duration-500 ease-quart-inout'
 :class='loading && "-translate-y-full !ease-expo-out"'
 ><div class='flex h-full items-center transition-transform'>Ajouter</div><div class='absolute left-0 top-full flex h-full w-full items-center justify-center transition-transform'>
 <div
 role='status'
 class='pointer-events-none w-18'
 aria-label='Loading...'
><svg
 viewbox='0 0 100 101'
 fill='none'
 xmlns='http://www.w3.org/2000/svg'
 class='animate-[spin_600ms_linear_infinite] fill-current'
 aria-hidden='true'
 ><path d='M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z' fill='currentColor' opacity='0.3' /><path d='M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z' fill='currentFill' /></svg></div>
 </div></div></button></div></div></article>
 
 <article class='group relative isolate flex flex-col span-w-6 lg:span-w-7'><a
 href='/products/deodorant-stick-yuzu-basilic'><div class='relative flex-shrink-0'>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/deodorant-stick-yuzu-basilic-energisant-respire-2109915.jpg?crop=center&height=1198&v=1755619561&width=960 960w,//respire.co/cdn/shop/files/deodorant-stick-yuzu-basilic-energisant-respire-2109915.jpg?crop=center&height=1497&v=1755619561&width=1200 1200w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/deodorant-stick-yuzu-basilic-energisant-respire-2109915.jpg?crop=center&amp;height=242&amp;v=1755619561&amp;width=194" alt="Déodorant stick Yuzu Basilic Énergisant - Respire" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/deodorant-stick-yuzu-basilic-energisant-respire-2109915.jpg?crop=center&amp;height=60&amp;v=1755619561&amp;width=48 48w,//respire.co/cdn/shop/files/deodorant-stick-yuzu-basilic-energisant-respire-2109915.jpg?crop=center&amp;height=120&amp;v=1755619561&amp;width=96 96w,//respire.co/cdn/shop/files/deodorant-stick-yuzu-basilic-energisant-respire-2109915.jpg?crop=center&amp;height=200&amp;v=1755619561&amp;width=160 160w,//respire.co/cdn/shop/files/deodorant-stick-yuzu-basilic-energisant-respire-2109915.jpg?crop=center&amp;height=399&amp;v=1755619561&amp;width=320 320w,//respire.co/cdn/shop/files/deodorant-stick-yuzu-basilic-energisant-respire-2109915.jpg?crop=center&amp;height=798&amp;v=1755619561&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Naturel-Energisant-Yuzu-Basilic-Application.jpg?crop=center&height=1198&v=1780046658&width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Naturel-Energisant-Yuzu-Basilic-Application.jpg?crop=center&height=1497&v=1780046658&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Naturel-Energisant-Yuzu-Basilic-Application.jpg?crop=center&height=2396&v=1780046658&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Naturel-Energisant-Yuzu-Basilic-Application.jpg?crop=center&height=2994&v=1780046658&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Naturel-Energisant-Yuzu-Basilic-Application.jpg?crop=center&amp;height=242&amp;v=1780046658&amp;width=194" alt="Déodorant stick Yuzu Basilic Énergisant" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Naturel-Energisant-Yuzu-Basilic-Application.jpg?crop=center&amp;height=60&amp;v=1780046658&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Naturel-Energisant-Yuzu-Basilic-Application.jpg?crop=center&amp;height=120&amp;v=1780046658&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Naturel-Energisant-Yuzu-Basilic-Application.jpg?crop=center&amp;height=200&amp;v=1780046658&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Naturel-Energisant-Yuzu-Basilic-Application.jpg?crop=center&amp;height=399&amp;v=1780046658&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Naturel-Energisant-Yuzu-Basilic-Application.jpg?crop=center&amp;height=798&amp;v=1780046658&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Déodorant stick Yuzu Basilic Énergisant</h2><p class='line-clamp-1 text-13/narrow'>
 Efficacité 48h
 </p></div><div class='text-13 font-black leading-none'><span>11,90€</span></div></div>
 
</a><div class='pointer-events-none absolute flex aspect-[4/5] w-full items-end justify-center overflow-clip'><div class='translate-y-full py-14 transition-transform duration-400 ease-expo-out group-focus-within:transform-none group-hover:transform-none'><button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out h-40 bg-black hover:bg-grey-dark text-white overflow-clip w-fit pointer-events-auto min-w-[8rem]'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:49820378464592,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Déodorant stick Yuzu Basilic Énergisant&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 9781986787664, Categories: ["Déodorants","Déodorants Sticks","Soins solides","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/deodorant-stick-yuzu-basilic-energisant-respire-2109915.jpg?v=1755619561&width=720", URL: "https://respire.co/products/deodorant-stick-yuzu-basilic", Price: "11,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
:inert='loading'><div
 class='h-full transform-gpu transition-transform duration-500 ease-quart-inout'
 :class='loading && "-translate-y-full !ease-expo-out"'
 ><div class='flex h-full items-center transition-transform'>Ajouter</div><div class='absolute left-0 top-full flex h-full w-full items-center justify-center transition-transform'>
 <div
 role='status'
 class='pointer-events-none w-18'
 aria-label='Loading...'
><svg
 viewbox='0 0 100 101'
 fill='none'
 xmlns='http://www.w3.org/2000/svg'
 class='animate-[spin_600ms_linear_infinite] fill-current'
 aria-hidden='true'
 ><path d='M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z' fill='currentColor' opacity='0.3' /><path d='M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z' fill='currentFill' /></svg></div>
 </div></div></button></div></div></article>
 
 <article class='group relative isolate flex flex-col span-w-6 lg:span-w-7'><a
 href='/products/mini-deodorant-stick-fleur-de-coton'><div class='relative flex-shrink-0'>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/mini-deodorant-stick-fleur-de-coton-respire-8176735.jpg?crop=center&height=1198&v=1755619556&width=960 960w,//respire.co/cdn/shop/files/mini-deodorant-stick-fleur-de-coton-respire-8176735.jpg?crop=center&height=1497&v=1755619556&width=1200 1200w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/mini-deodorant-stick-fleur-de-coton-respire-8176735.jpg?crop=center&amp;height=242&amp;v=1755619556&amp;width=194" alt="Mini Déodorant stick Fleur de Coton - Respire" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/mini-deodorant-stick-fleur-de-coton-respire-8176735.jpg?crop=center&amp;height=60&amp;v=1755619556&amp;width=48 48w,//respire.co/cdn/shop/files/mini-deodorant-stick-fleur-de-coton-respire-8176735.jpg?crop=center&amp;height=120&amp;v=1755619556&amp;width=96 96w,//respire.co/cdn/shop/files/mini-deodorant-stick-fleur-de-coton-respire-8176735.jpg?crop=center&amp;height=200&amp;v=1755619556&amp;width=160 160w,//respire.co/cdn/shop/files/mini-deodorant-stick-fleur-de-coton-respire-8176735.jpg?crop=center&amp;height=399&amp;v=1755619556&amp;width=320 320w,//respire.co/cdn/shop/files/mini-deodorant-stick-fleur-de-coton-respire-8176735.jpg?crop=center&amp;height=798&amp;v=1755619556&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&height=1198&v=1780039061&width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&height=1497&v=1780039061&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&height=2396&v=1780039061&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&height=2994&v=1780039061&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=242&amp;v=1780039061&amp;width=194" alt="Déodorant stick Fleur de Coton 20g" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=60&amp;v=1780039061&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=120&amp;v=1780039061&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=200&amp;v=1780039061&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=399&amp;v=1780039061&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=798&amp;v=1780039061&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Déodorant stick Fleur de Coton 20g</h2><p class='line-clamp-1 text-13/narrow'>
 Efficacité 48h, format voyage
 </p></div><div class='text-13 font-black leading-none'><span>6,90€</span></div></div>
 
</a><div class='pointer-events-none absolute flex aspect-[4/5] w-full items-end justify-center overflow-clip'><div class='translate-y-full py-14 transition-transform duration-400 ease-expo-out group-focus-within:transform-none group-hover:transform-none'><button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out h-40 bg-black hover:bg-grey-dark text-white overflow-clip w-fit pointer-events-auto min-w-[8rem]'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:49941366440272,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Déodorant stick Fleur de Coton 20g&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 9818114490704, Categories: ["Déodorants","Déodorants Sticks","Nouveautés | Respire","Soins solides","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/mini-deodorant-stick-fleur-de-coton-respire-8176735.jpg?v=1755619556&width=720", URL: "https://respire.co/products/mini-deodorant-stick-fleur-de-coton", Price: "6,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
:inert='loading'><div
 class='h-full transform-gpu transition-transform duration-500 ease-quart-inout'
 :class='loading && "-translate-y-full !ease-expo-out"'
 ><div class='flex h-full items-center transition-transform'>Ajouter</div><div class='absolute left-0 top-full flex h-full w-full items-center justify-center transition-transform'>
 <div
 role='status'
 class='pointer-events-none w-18'
 aria-label='Loading...'
><svg
 viewbox='0 0 100 101'
 fill='none'
 xmlns='http://www.w3.org/2000/svg'
 class='animate-[spin_600ms_linear_infinite] fill-current'
 aria-hidden='true'
 ><path d='M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z' fill='currentColor' opacity='0.3' /><path d='M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z' fill='currentFill' /></svg></div>
 </div></div></button></div></div></article>
 
 </div><div class="grid-container">
 <nav role='navigation' aria-label='Pagination' class='w-fit py-44 text-12/none tabular-nums lg:py-80 mx-auto'><ul role='list' class='flex items-center justify-center'><li><span
 aria-current='page'
 aria-label='Page 1'
 class='grid h-20 w-20 place-items-center'
 >1</span></li><li><a
 href='/collections/deodorant?page=2'
 aria-label='Page 2'
 class='grid h-20 w-20 place-items-center text-black/20 transition-colors duration-400 ease-cubic-out hover:text-grey'
 >2</a></li><li><a
 href='/collections/deodorant?page=3'
 aria-label='Page 3'
 class='grid h-20 w-20 place-items-center text-black/20 transition-colors duration-400 ease-cubic-out hover:text-grey'
 >3</a></li><li><a
 href='/collections/deodorant?page=2'
 aria-label='Page suivante'
 class='grid h-20 w-20 place-items-center'
 ><svg viewbox='0 0 18 19' fill='none' xmlns='http://www.w3.org/2000/svg' class='w-16 h-16'><path d="m9 14.15-.67-.68 3.84-3.84H4v-.96h8.17L8.33 4.83 9 4.15l5 5-5 5Z" fill="currentColor"/></svg></a></li></ul></nav>
 </div>
 
</div>
</section><section id="shopify-section-template--26101953266000__slice_collection_list_Vm96KF" class="shopify-section"><nav role='navigation' class='grid-container py-60 lg:py-100 lg:span-px-1-wide'><ul class='flex flex-col gap-12 text-40/narrowest font-black uppercase tracking-tighter lg:text-120/narrowest'><li><a
 
 class='group flex items-start gap-7 focus:outline-none'
 href='/collections/nos-kits-deodorant'
 ><span class='block'>Offres</span><ul class='flex gap-5'>
 
 
<li
 class='h-30 w-25 shrink-0 overflow-clip lg:h-80 lg:w-70 opacity-0 transition-opacity duration-200 ease-cubic-out group-hover:opacity-100 group-focus:opacity-100'
 style='transition-delay:0ms'
 ><picture
 class="block scale-105 transition-transform duration-600 ease-cubic-out group-hover:scale-100 group-focus:scale-100 w-full h-full object-cover"
 style="transition-delay:0ms"><source
 media="(min-width: 1024px)"
 sizes="4vw"
 srcset="//respire.co/cdn/shop/files/kit-decouverte-deodorant-stick-fleur-de-coton-respire-3772084.jpg?crop=center&height=1097&v=1755619659&width=960 960w,//respire.co/cdn/shop/files/kit-decouverte-deodorant-stick-fleur-de-coton-respire-3772084.jpg?crop=center&height=1371&v=1755619659&width=1200 1200w"
 width="70"
 height="80"
 ><img src="//respire.co/cdn/shop/files/kit-decouverte-deodorant-stick-fleur-de-coton-respire-3772084.jpg?crop=center&amp;height=30&amp;v=1755619659&amp;width=25" alt="Kit Découverte Déodorant stick Fleur de Coton - Respire" width="25" height="30" loading="lazy" srcset="//respire.co/cdn/shop/files/kit-decouverte-deodorant-stick-fleur-de-coton-respire-3772084.jpg?crop=center&amp;height=58&amp;v=1755619659&amp;width=48 48w,//respire.co/cdn/shop/files/kit-decouverte-deodorant-stick-fleur-de-coton-respire-3772084.jpg?crop=center&amp;height=115&amp;v=1755619659&amp;width=96 96w,//respire.co/cdn/shop/files/kit-decouverte-deodorant-stick-fleur-de-coton-respire-3772084.jpg?crop=center&amp;height=192&amp;v=1755619659&amp;width=160 160w,//respire.co/cdn/shop/files/kit-decouverte-deodorant-stick-fleur-de-coton-respire-3772084.jpg?crop=center&amp;height=384&amp;v=1755619659&amp;width=320 320w,//respire.co/cdn/shop/files/kit-decouverte-deodorant-stick-fleur-de-coton-respire-3772084.jpg?crop=center&amp;height=768&amp;v=1755619659&amp;width=640 640w" sizes="6vw" class="w-full">
</picture></li>
 
<li
 class='h-30 w-25 shrink-0 overflow-clip lg:h-80 lg:w-70 opacity-0 transition-opacity duration-200 ease-cubic-out group-hover:opacity-100 group-focus:opacity-100'
 style='transition-delay:75ms'
 ><picture
 class="block scale-105 transition-transform duration-600 ease-cubic-out group-hover:scale-100 group-focus:scale-100 w-full h-full object-cover"
 style="transition-delay:75ms"><source
 media="(min-width: 1024px)"
 sizes="4vw"
 srcset="//respire.co/cdn/shop/files/kit-decouverte-deodorant-roll-on-fleur-de-coton-respire-7137724.jpg?crop=center&height=1097&v=1755619661&width=960 960w,//respire.co/cdn/shop/files/kit-decouverte-deodorant-roll-on-fleur-de-coton-respire-7137724.jpg?crop=center&height=1371&v=1755619661&width=1200 1200w"
 width="70"
 height="80"
 ><img src="//respire.co/cdn/shop/files/kit-decouverte-deodorant-roll-on-fleur-de-coton-respire-7137724.jpg?crop=center&amp;height=30&amp;v=1755619661&amp;width=25" alt="Kit Découverte Déodorant roll - on Fleur de coton - Respire" width="25" height="30" loading="lazy" srcset="//respire.co/cdn/shop/files/kit-decouverte-deodorant-roll-on-fleur-de-coton-respire-7137724.jpg?crop=center&amp;height=58&amp;v=1755619661&amp;width=48 48w,//respire.co/cdn/shop/files/kit-decouverte-deodorant-roll-on-fleur-de-coton-respire-7137724.jpg?crop=center&amp;height=115&amp;v=1755619661&amp;width=96 96w,//respire.co/cdn/shop/files/kit-decouverte-deodorant-roll-on-fleur-de-coton-respire-7137724.jpg?crop=center&amp;height=192&amp;v=1755619661&amp;width=160 160w,//respire.co/cdn/shop/files/kit-decouverte-deodorant-roll-on-fleur-de-coton-respire-7137724.jpg?crop=center&amp;height=384&amp;v=1755619661&amp;width=320 320w,//respire.co/cdn/shop/files/kit-decouverte-deodorant-roll-on-fleur-de-coton-respire-7137724.jpg?crop=center&amp;height=768&amp;v=1755619661&amp;width=640 640w" sizes="6vw" class="w-full">
</picture></li>
 
<li
 class='h-30 w-25 shrink-0 overflow-clip lg:h-80 lg:w-70 opacity-0 transition-opacity duration-200 ease-cubic-out group-hover:opacity-100 group-focus:opacity-100'
 style='transition-delay:150ms'
 ><picture
 class="block scale-105 transition-transform duration-600 ease-cubic-out group-hover:scale-100 group-focus:scale-100 w-full h-full object-cover"
 style="transition-delay:150ms"><source
 media="(min-width: 1024px)"
 sizes="4vw"
 srcset="//respire.co/cdn/shop/files/kit-decouverte-deodorant-roll-on-figue-fraiche-respire-4316455.jpg?crop=center&height=1097&v=1755619656&width=960 960w,//respire.co/cdn/shop/files/kit-decouverte-deodorant-roll-on-figue-fraiche-respire-4316455.jpg?crop=center&height=1371&v=1755619656&width=1200 1200w"
 width="70"
 height="80"
 ><img src="//respire.co/cdn/shop/files/kit-decouverte-deodorant-roll-on-figue-fraiche-respire-4316455.jpg?crop=center&amp;height=30&amp;v=1755619656&amp;width=25" alt="Kit Découverte Déodorant roll - on Figue Fraîche - Respire" width="25" height="30" loading="lazy" srcset="//respire.co/cdn/shop/files/kit-decouverte-deodorant-roll-on-figue-fraiche-respire-4316455.jpg?crop=center&amp;height=58&amp;v=1755619656&amp;width=48 48w,//respire.co/cdn/shop/files/kit-decouverte-deodorant-roll-on-figue-fraiche-respire-4316455.jpg?crop=center&amp;height=115&amp;v=1755619656&amp;width=96 96w,//respire.co/cdn/shop/files/kit-decouverte-deodorant-roll-on-figue-fraiche-respire-4316455.jpg?crop=center&amp;height=192&amp;v=1755619656&amp;width=160 160w,//respire.co/cdn/shop/files/kit-decouverte-deodorant-roll-on-figue-fraiche-respire-4316455.jpg?crop=center&amp;height=384&amp;v=1755619656&amp;width=320 320w,//respire.co/cdn/shop/files/kit-decouverte-deodorant-roll-on-figue-fraiche-respire-4316455.jpg?crop=center&amp;height=768&amp;v=1755619656&amp;width=640 640w" sizes="6vw" class="w-full">
</picture></li>
 
 
 </ul></a></li><li><a
 
 class='group flex items-start gap-7 focus:outline-none'
 href='/collections/all'
 ><span class='block'>Tout voir</span><ul class='flex gap-5'>
 
 
<li
 class='h-30 w-25 shrink-0 overflow-clip lg:h-80 lg:w-70 opacity-0 transition-opacity duration-200 ease-cubic-out group-hover:opacity-100 group-focus:opacity-100'
 style='transition-delay:0ms'
 ><picture
 class="block scale-105 transition-transform duration-600 ease-cubic-out group-hover:scale-100 group-focus:scale-100 w-full h-full object-cover"
 style="transition-delay:0ms"><source
 media="(min-width: 1024px)"
 sizes="4vw"
 srcset="//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&height=1097&v=1773330409&width=960 960w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&height=1371&v=1773330409&width=1200 1200w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&height=2194&v=1773330409&width=1920 1920w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&height=2743&v=1773330409&width=2400 2400w"
 width="70"
 height="80"
 ><img src="//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=30&amp;v=1773330409&amp;width=25" alt="Soin Lèvres Collagène Booster" width="25" height="30" loading="lazy" srcset="//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=58&amp;v=1773330409&amp;width=48 48w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=115&amp;v=1773330409&amp;width=96 96w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=192&amp;v=1773330409&amp;width=160 160w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=384&amp;v=1773330409&amp;width=320 320w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=768&amp;v=1773330409&amp;width=640 640w" sizes="6vw" class="w-full">
</picture></li>
 
<li
 class='h-30 w-25 shrink-0 overflow-clip lg:h-80 lg:w-70 opacity-0 transition-opacity duration-200 ease-cubic-out group-hover:opacity-100 group-focus:opacity-100'
 style='transition-delay:75ms'
 ><picture
 class="block scale-105 transition-transform duration-600 ease-cubic-out group-hover:scale-100 group-focus:scale-100 w-full h-full object-cover"
 style="transition-delay:75ms"><source
 media="(min-width: 1024px)"
 sizes="4vw"
 srcset="//respire.co/cdn/shop/files/Respire-Soin-Levres-Booster-collagene-Edition-Limitee-Packshot_7cb26430-18a7-454d-949f-f851e1eb65ac.jpg?crop=center&height=1097&v=1776445349&width=960 960w,//respire.co/cdn/shop/files/Respire-Soin-Levres-Booster-collagene-Edition-Limitee-Packshot_7cb26430-18a7-454d-949f-f851e1eb65ac.jpg?crop=center&height=1371&v=1776445349&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Soin-Levres-Booster-collagene-Edition-Limitee-Packshot_7cb26430-18a7-454d-949f-f851e1eb65ac.jpg?crop=center&height=2194&v=1776445349&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Soin-Levres-Booster-collagene-Edition-Limitee-Packshot_7cb26430-18a7-454d-949f-f851e1eb65ac.jpg?crop=center&height=2743&v=1776445349&width=2400 2400w"
 width="70"
 height="80"
 ><img src="//respire.co/cdn/shop/files/Respire-Soin-Levres-Booster-collagene-Edition-Limitee-Packshot_7cb26430-18a7-454d-949f-f851e1eb65ac.jpg?crop=center&amp;height=30&amp;v=1776445349&amp;width=25" alt="Soin Lèvres Collagène Booster&lt;br&gt;+ 7j/7 Lip Charm" width="25" height="30" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Soin-Levres-Booster-collagene-Edition-Limitee-Packshot_7cb26430-18a7-454d-949f-f851e1eb65ac.jpg?crop=center&amp;height=58&amp;v=1776445349&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Soin-Levres-Booster-collagene-Edition-Limitee-Packshot_7cb26430-18a7-454d-949f-f851e1eb65ac.jpg?crop=center&amp;height=115&amp;v=1776445349&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Soin-Levres-Booster-collagene-Edition-Limitee-Packshot_7cb26430-18a7-454d-949f-f851e1eb65ac.jpg?crop=center&amp;height=192&amp;v=1776445349&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Soin-Levres-Booster-collagene-Edition-Limitee-Packshot_7cb26430-18a7-454d-949f-f851e1eb65ac.jpg?crop=center&amp;height=384&amp;v=1776445349&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Soin-Levres-Booster-collagene-Edition-Limitee-Packshot_7cb26430-18a7-454d-949f-f851e1eb65ac.jpg?crop=center&amp;height=768&amp;v=1776445349&amp;width=640 640w" sizes="6vw" class="w-full">
</picture></li>
 
<li
 class='h-30 w-25 shrink-0 overflow-clip lg:h-80 lg:w-70 opacity-0 transition-opacity duration-200 ease-cubic-out group-hover:opacity-100 group-focus:opacity-100'
 style='transition-delay:150ms'
 ><picture
 class="block scale-105 transition-transform duration-600 ease-cubic-out group-hover:scale-100 group-focus:scale-100 w-full h-full object-cover"
 style="transition-delay:150ms"><source
 media="(min-width: 1024px)"
 sizes="4vw"
 srcset="//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&height=1097&v=1768405266&width=960 960w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&height=1371&v=1768405266&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&height=2194&v=1768405266&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&height=2743&v=1768405266&width=2400 2400w"
 width="70"
 height="80"
 ><img src="//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=30&amp;v=1768405266&amp;width=25" alt="Sérum Glow &amp; Protect" width="25" height="30" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=58&amp;v=1768405266&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=115&amp;v=1768405266&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=192&amp;v=1768405266&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=384&amp;v=1768405266&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=768&amp;v=1768405266&amp;width=640 640w" sizes="6vw" class="w-full">
</picture></li>
 
 
 </ul></a></li><li><a
 
 class='group flex items-start gap-7 focus:outline-none'
 href='/collections/nouveautes'
 ><span class='block'>Nouveautés</span><ul class='flex gap-5'>
 
 
<li
 class='h-30 w-25 shrink-0 overflow-clip lg:h-80 lg:w-70 opacity-0 transition-opacity duration-200 ease-cubic-out group-hover:opacity-100 group-focus:opacity-100'
 style='transition-delay:0ms'
 ><picture
 class="block scale-105 transition-transform duration-600 ease-cubic-out group-hover:scale-100 group-focus:scale-100 w-full h-full object-cover"
 style="transition-delay:0ms"><source
 media="(min-width: 1024px)"
 sizes="4vw"
 srcset="//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&height=1097&v=1773330409&width=960 960w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&height=1371&v=1773330409&width=1200 1200w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&height=2194&v=1773330409&width=1920 1920w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&height=2743&v=1773330409&width=2400 2400w"
 width="70"
 height="80"
 ><img src="//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=30&amp;v=1773330409&amp;width=25" alt="Soin Lèvres Collagène Booster" width="25" height="30" loading="lazy" srcset="//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=58&amp;v=1773330409&amp;width=48 48w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=115&amp;v=1773330409&amp;width=96 96w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=192&amp;v=1773330409&amp;width=160 160w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=384&amp;v=1773330409&amp;width=320 320w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=768&amp;v=1773330409&amp;width=640 640w" sizes="6vw" class="w-full">
</picture></li>
 
<li
 class='h-30 w-25 shrink-0 overflow-clip lg:h-80 lg:w-70 opacity-0 transition-opacity duration-200 ease-cubic-out group-hover:opacity-100 group-focus:opacity-100'
 style='transition-delay:75ms'
 ><picture
 class="block scale-105 transition-transform duration-600 ease-cubic-out group-hover:scale-100 group-focus:scale-100 w-full h-full object-cover"
 style="transition-delay:75ms"><source
 media="(min-width: 1024px)"
 sizes="4vw"
 srcset="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&height=1097&v=1776679718&width=960 960w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&height=1371&v=1776679718&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&height=2194&v=1776679718&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&height=2743&v=1776679718&width=2400 2400w"
 width="70"
 height="80"
 ><img src="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=30&amp;v=1776679718&amp;width=25" alt="Stick Solaire Matifiant SPF50+" width="25" height="30" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=58&amp;v=1776679718&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=115&amp;v=1776679718&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=192&amp;v=1776679718&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=384&amp;v=1776679718&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=768&amp;v=1776679718&amp;width=640 640w" sizes="6vw" class="w-full">
</picture></li>
 
<li
 class='h-30 w-25 shrink-0 overflow-clip lg:h-80 lg:w-70 opacity-0 transition-opacity duration-200 ease-cubic-out group-hover:opacity-100 group-focus:opacity-100'
 style='transition-delay:150ms'
 ><picture
 class="block scale-105 transition-transform duration-600 ease-cubic-out group-hover:scale-100 group-focus:scale-100 w-full h-full object-cover"
 style="transition-delay:150ms"><source
 media="(min-width: 1024px)"
 sizes="4vw"
 srcset="//respire.co/cdn/shop/files/Respire-Solaire-Brume-Packshot.jpg?crop=center&height=1097&v=1772615223&width=960 960w,//respire.co/cdn/shop/files/Respire-Solaire-Brume-Packshot.jpg?crop=center&height=1371&v=1772615223&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Solaire-Brume-Packshot.jpg?crop=center&height=2194&v=1772615223&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Solaire-Brume-Packshot.jpg?crop=center&height=2743&v=1772615223&width=2400 2400w"
 width="70"
 height="80"
 ><img src="//respire.co/cdn/shop/files/Respire-Solaire-Brume-Packshot.jpg?crop=center&amp;height=30&amp;v=1772615223&amp;width=25" alt="Brume Solaire Protection Urbaine" width="25" height="30" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Solaire-Brume-Packshot.jpg?crop=center&amp;height=58&amp;v=1772615223&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Solaire-Brume-Packshot.jpg?crop=center&amp;height=115&amp;v=1772615223&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Solaire-Brume-Packshot.jpg?crop=center&amp;height=192&amp;v=1772615223&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Solaire-Brume-Packshot.jpg?crop=center&amp;height=384&amp;v=1772615223&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Solaire-Brume-Packshot.jpg?crop=center&amp;height=768&amp;v=1772615223&amp;width=640 640w" sizes="6vw" class="w-full">
</picture></li>
 
 
 </ul></a></li></ul></nav></section><section id="shopify-section-template--26101953266000__slice_seo_kpngHR" class="shopify-section"><div class='grid-container flex flex-col justify-between py-80 lg:flex-row lg:py-100 lg:span-px-1-wide lg-max:gap-44'><div class='flex flex-col gap-24 lg:span-w-11'>
 
 <h2 class='text-balance text-16/narrower font-black uppercase tracking-tighter lg:text-28/narrower'>
 Déodorants
 </h2>
 
 
 <div class='flex flex-col gap-12'>
 <p class='text-13 heir-a:underline'><p><span data-mce-fragment="1">Nos déodorants, à l'efficacité prouvée toute la journée, protègent chaque jour plus d'un million de clients satisfaits. Formulés <strong>sans aluminium </strong>et composés à 99% d'ingrédients d'origine <strong>naturelle</strong>, ils respectent votre peau et l'environnement. Choisissez le format qui vous convient : Nos déodorants stick sont <strong>efficaces 48 heures</strong> contre les odeurs et l’humidité. Leur texture baume non grasse et non collante s'applique sans traces blanches. Disponible en version standard et carton <strong>zéro déchet</strong>, et en plusieurs parfums naturels dont le best-seller<a title="Déodorant Solide Efficace Respire" href="https://www.respire.co/products/deodorant-stick-fleur-de-coton-efficace-48h"> Fleur de Coton</a>. Nos <a title="Déodorant Roll-On Fleur de Coton" href="https://www.respire.co/products/deodorant-roll-on-fleur-de-coton">déodorants roll-on</a> sont efficaces 24 heures contre les odeurs et l’humidité. Leur texture ultra-fraîche <strong>ne laisse pas de traces blanches sur les vêtements </strong>et leur flacon est <strong>rechargeable à l’infini.</strong><br>À la suite du succès de nos déodorants naturels, nous avons développé notre gamme <a title="Skincare et Routine Visage Mimétique, Naturelle et Efficace." href="https://www.respire.co/collections/visage"><span style="text-decoration: underline;"><strong>skincare</strong></span></a> sans ingrédients controversés : <span style="text-decoration: underline;"><strong><a title="Sérums à l'acide hyaluronique et naturels." href="https://www.respire.co/collections/serums-visage-naturels">sérums</a></strong></span>, <span style="text-decoration: underline;"><strong><a title="Crèmes Hydratantes à l'acide hyaluronique et céramides naturelles." href="https://www.respire.co/collections/cremes-visages-naturelles">crèmes hydratantes</a></strong></span>, <span style="text-decoration: underline;"><strong><a title="Nettoyants Visage efficace contre toutes les impuretés même le maquillage waterproof." href="https://www.respire.co/collections/nettoyants-visage">nettoyant &amp; démaquillant</a></strong></span>, en collaboration avec notre comité scientifique.</span></p></p>
 
 </div>
 
 </div><div><div class='overflow-clip rounded-md lg:span-w-10'>
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="32vw"
 srcset="//respire.co/cdn/shop/collections/deodorants-5701604.jpg?crop=center&height=1241&v=1780052260&width=960 960w,//respire.co/cdn/shop/collections/deodorants-5701604.jpg?crop=center&height=1552&v=1780052260&width=1200 1200w,//respire.co/cdn/shop/collections/deodorants-5701604.jpg?crop=center&height=2483&v=1780052260&width=1920 1920w,//respire.co/cdn/shop/collections/deodorants-5701604.jpg?crop=center&height=3103&v=1780052260&width=2400 2400w"
 width="464"
 height="600"
 ><img src="//respire.co/cdn/shop/collections/deodorants-5701604.jpg?crop=center&amp;height=220&amp;v=1780052260&amp;width=328" alt="Déodorants - Respire" width="328" height="220" loading="lazy" srcset="//respire.co/cdn/shop/collections/deodorants-5701604.jpg?crop=center&amp;height=32&amp;v=1780052260&amp;width=48 48w,//respire.co/cdn/shop/collections/deodorants-5701604.jpg?crop=center&amp;height=64&amp;v=1780052260&amp;width=96 96w,//respire.co/cdn/shop/collections/deodorants-5701604.jpg?crop=center&amp;height=107&amp;v=1780052260&amp;width=160 160w,//respire.co/cdn/shop/collections/deodorants-5701604.jpg?crop=center&amp;height=215&amp;v=1780052260&amp;width=320 320w,//respire.co/cdn/shop/collections/deodorants-5701604.jpg?crop=center&amp;height=429&amp;v=1780052260&amp;width=640 640w" sizes="87vw" class="w-full">
</picture>
 </div></div></div>
</section><section id="shopify-section-template--26101953266000__slice_title_wfrCjr" class="shopify-section py-100 flex flex-col gap-20">
 <h1 class='mx-auto mt-header text-balance text-center text-64/narrower font-black uppercase tracking-tighter span-w-10 lg:text-120/none lg:span-w-28 lg-max:mb-60'>
 FAQ
 </h1>
<style> #shopify-section-template--26101953266000__slice_title_wfrCjr.py-100 {padding-top: 0rem; padding-bottom: 0.25rem;} </style></section><div id="shopify-section-template--26101953266000__slice_accordion_ex6n8g" class="shopify-section"><div class='flex flex-col'><div class='accordion grid grid-rows-[1fr]'><div class='relative border-t border-grey-light'><input
 data-type='accordion'
 class='peer sr-only'
 type='checkbox'
 id='accordion_item_MNkQq3'
 
 ><label
 class='flex items-center justify-between py-14 focus:outline-none focus:ring-0 select-none cursor-pointer'
 for='accordion_item_MNkQq3'
 ><span class='text-13/none lg:text-24/none font-black py-20 lg:py-30 text-center w-full will-change-transform'>Quelle est la différence entre déodorant stick et roll-on ?</span></label><article
 class='grid grid-rows-[0fr] overflow-clip transition-[grid-template-rows] duration-500 ease-expo-out pointer-events-all'
 
 ><div class='min-h-0'><div class='min-h-0 bg-dark-green text-white text-13/none lg:text-24/none font-black text-center py-34 lg:py-44 span-px-1-wide'>
 Pour satisfaire tous les besoins, notre gamme de déodorants naturels contient à la fois des déodorants sticks et des déodorants roll-on. Il y a une double différence : la texture (solide ou liquide) et la durée d'efficacité (48h pour le stick et 24h pour le roll-on).
Si vous avez une transpiration plutôt intense, nous vous conseillons d'opter pour le déodorant stick.
 </div></div></article></div></div>
 
<div class='accordion grid grid-rows-[1fr]'><div class='relative border-t border-grey-light'><input
 data-type='accordion'
 class='peer sr-only'
 type='checkbox'
 id='accordion_item_LdUxHF'
 
 ><label
 class='flex items-center justify-between py-14 focus:outline-none focus:ring-0 select-none cursor-pointer'
 for='accordion_item_LdUxHF'
 ><span class='text-13/none lg:text-24/none font-black py-20 lg:py-30 text-center w-full will-change-transform'>Les déodorants stick sont-ils adaptés aux peaux sensibles ?</span></label><article
 class='grid grid-rows-[0fr] overflow-clip transition-[grid-template-rows] duration-500 ease-expo-out pointer-events-all'
 
 ><div class='min-h-0'><div class='min-h-0 bg-dark-green text-white text-13/none lg:text-24/none font-black text-center py-34 lg:py-44 span-px-1-wide'>
 Oui, nos déodorants sticks sont spécialement formulés pour être doux et adaptés aux peaux sensibles. Ils ne contiennent pas de sels d’aluminium, d’alcool ni de bicarbonate de soude, ce qui réduit les risques d’irritation. Nos formules intègrent des ingrédients naturels apaisants pour minimiser les irritations tout en offrant une protection efficace contre les mauvaises odeurs. Chaque produit est dermatologiquement testé pour garantir qu'il est sûr et bien toléré par tous les types de peau.
 </div></div></article></div></div>
 
<div class='accordion grid grid-rows-[1fr]'><div class='relative border-t border-grey-light'><input
 data-type='accordion'
 class='peer sr-only'
 type='checkbox'
 id='accordion_item_wVn9xy'
 
 ><label
 class='flex items-center justify-between py-14 focus:outline-none focus:ring-0 select-none cursor-pointer'
 for='accordion_item_wVn9xy'
 ><span class='text-13/none lg:text-24/none font-black py-20 lg:py-30 text-center w-full will-change-transform'>Comment utiliser correctement un déodorant stick pour maximiser son efficacité ?</span></label><article
 class='grid grid-rows-[0fr] overflow-clip transition-[grid-template-rows] duration-500 ease-expo-out pointer-events-all'
 
 ><div class='min-h-0'><div class='min-h-0 bg-dark-green text-white text-13/none lg:text-24/none font-black text-center py-34 lg:py-44 span-px-1-wide'>
 Pour obtenir les meilleurs résultats avec un déodorant stick, il est recommandé de l’appliquer sur une peau propre et sèche. Assurez-vous que vos aisselles sont complètement sèches avant l’application pour éviter toute interférence avec la formule. Appliquez le stick en effectuant des mouvements circulaires ou de haut en bas pour couvrir uniformément toute la surface de la peau. Pour une efficacité optimale, utilisez le déodorant stick après votre douche et avant de vous habiller, ce qui permet au produit de sécher correctement et de prévenir les traces sur vos vêtements.
 </div></div></article></div></div>
 
<div class='accordion grid grid-rows-[1fr]'><div class='relative border-t border-grey-light'><input
 data-type='accordion'
 class='peer sr-only'
 type='checkbox'
 id='accordion_item_x4LABL'
 
 ><label
 class='flex items-center justify-between py-14 focus:outline-none focus:ring-0 select-none cursor-pointer'
 for='accordion_item_x4LABL'
 ><span class='text-13/none lg:text-24/none font-black py-20 lg:py-30 text-center w-full will-change-transform'>Pourquoi choisir un déodorant sans sels d’aluminium ?</span></label><article
 class='grid grid-rows-[0fr] overflow-clip transition-[grid-template-rows] duration-500 ease-expo-out pointer-events-all'
 
 ><div class='min-h-0'><div class='min-h-0 bg-dark-green text-white text-13/none lg:text-24/none font-black text-center py-34 lg:py-44 span-px-1-wide'>
 Les sels d’aluminium, couramment utilisés dans de nombreux déodorants et antisudorifiques, peuvent obstruer les pores et altérer les processus naturels de transpiration. Nos déodorants roll-on sont formulés sans sels d’aluminium pour offrir une alternative plus douce et plus respectueuse de la peau. En évitant ces composés, nous favorisons une approche plus naturelle de la gestion des odeurs tout en assurant une efficacité optimale contre les mauvaises odeurs.
 </div></div></article></div></div>
 
<div class='accordion grid grid-rows-[1fr]'><div class='relative border-t border-grey-light'><input
 data-type='accordion'
 class='peer sr-only'
 type='checkbox'
 id='accordion_item_fiXRxJ'
 
 ><label
 class='flex items-center justify-between py-14 focus:outline-none focus:ring-0 select-none cursor-pointer'
 for='accordion_item_fiXRxJ'
 ><span class='text-13/none lg:text-24/none font-black py-20 lg:py-30 text-center w-full will-change-transform'>Quels sont les ingrédients principaux de vos déodorants roll-on ?</span></label><article
 class='grid grid-rows-[0fr] overflow-clip transition-[grid-template-rows] duration-500 ease-expo-out pointer-events-all'
 
 ><div class='min-h-0'><div class='min-h-0 bg-dark-green text-white text-13/none lg:text-24/none font-black text-center py-34 lg:py-44 span-px-1-wide'>
 Les déodorants roll-on Respire sont formulés avec des ingrédients soigneusement sélectionnés pour leur efficacité et leur respect de la peau. Nous utilisons des actifs antibactériens naturels pour neutraliser les mauvaises odeurs, des agents absorbants comme l’amidon de maïs pour contrôler l’humidité, et des extraits naturels pour apaiser et protéger la peau. Nos formules sont sans sels d’aluminium, sans alcool et sans bicarbonate de soude, ce qui les rend adaptés aux peaux sensibles et minimise le risque d’irritation.
 </div></div></article></div></div>
 
</div>
</div>
 </div>
 
<div id="shopify-section-utm-offer-popin" class="shopify-section hidden h-0">


</div>
 </main><!-- BEGIN sections: footer-group -->
<footer id="shopify-section-sections--26281148383568__footer" class="shopify-section shopify-section-group-footer-group bg-black text-white overflow-hidden"><div class='flex lg:span-px-1-wide lg:margin-mx-1 lg-max:flex-col'><div class='flex w-full lg:py-60 lg:gutter-gap-1 lg-max:flex-col'>

 <nav role='navigation' class='flex flex-col gap-20 lg:span-w-4'>
 <div class='accordion grid grid-rows-[1fr]'><div class='relative lg-max:border-b lg-max:!border-white lg-max:margin-px-1 border-b border-black/40'><input
 data-type='accordion'
 class='peer sr-only'
 type='checkbox'
 id='navigation_UYPYrg'
 
 ><label
 class='flex items-center justify-between py-14 focus:outline-none focus:ring-0 select-none cursor-pointer peer-checked:[&>span:last-child>span:last-child]:rotate-90'
 for='navigation_UYPYrg'
 ><span class='text-13/narrow font-bold will-change-transform'>Aide</span><span class='pointer-events-none relative flex h-12 w-12 items-center justify-center [&>span]:bg-black lg:hidden [&>span]:!bg-white'><span class='absolute block h-2 w-full lg:h-3'></span><span class='absolute block h-full w-2 transition-transform peer-checked:rotate-90 lg:w-3'></span></span></label><article
 class='grid grid-rows-[0fr] overflow-clip transition-[grid-template-rows] duration-500 ease-expo-out pointer-events-all lg:!grid-rows-[1fr]'
 
 ><div class='min-h-0'><div class='min-h-0 flex'>
 
 <ul class='flex flex-col gap-10 text-13/narrow lg-max:pb-20'>
 
 <li class='flex'><a 
 href=https://help.respire.co/fr-FR/contact 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left'
 
 
 
 
 
 
 
 
 
 
 
 
>Nous contacter </a></li>
 
 <li class='flex'><a 
 href=https://respire.app.boxia.co/track 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left'
 
 
 
 
 
 
 
 
 
 
 
 
>Suivre mon colis</a></li>
 
 <li class='flex'><a 
 href=https://www.respire.co/pages/livraison-retours 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left'
 
 
 
 
 
 
 
 
 
 
 
 
>Livraison & Retours</a></li>
 
 <li class='flex'><a 
 href=https://airtable.com/appiq5LNZWZ6YRnLZ/pagNhwcE9v7YC0SUI/form 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left'
 
 
 
 
 
 
 
 
 
 
 
 
>Devenir créateur UGC</a></li>
 
 <li class='flex'><a 
 href=https://help.respire.co/fr-FR 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left'
 
 
 
 
 
 
 
 
 
 
 
 
>Questions fréquentes</a></li>
 
 <li class='flex'><a 
 href=/blogs/conseils 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left'
 
 
 
 
 
 
 
 
 
 
 
 
>Blog & Conseils</a></li>
 
 </ul>
 
 </div></div></article></div></div>
 </nav>

 <nav role='navigation' class='flex flex-col gap-20 lg:span-w-4'>
 <div class='accordion grid grid-rows-[1fr]'><div class='relative lg-max:border-b lg-max:!border-white lg-max:margin-px-1 border-b border-black/40'><input
 data-type='accordion'
 class='peer sr-only'
 type='checkbox'
 id='navigation_FtLgjT'
 
 ><label
 class='flex items-center justify-between py-14 focus:outline-none focus:ring-0 select-none cursor-pointer peer-checked:[&>span:last-child>span:last-child]:rotate-90'
 for='navigation_FtLgjT'
 ><span class='text-13/narrow font-bold will-change-transform'>Respire</span><span class='pointer-events-none relative flex h-12 w-12 items-center justify-center [&>span]:bg-black lg:hidden [&>span]:!bg-white'><span class='absolute block h-2 w-full lg:h-3'></span><span class='absolute block h-full w-2 transition-transform peer-checked:rotate-90 lg:w-3'></span></span></label><article
 class='grid grid-rows-[0fr] overflow-clip transition-[grid-template-rows] duration-500 ease-expo-out pointer-events-all lg:!grid-rows-[1fr]'
 
 ><div class='min-h-0'><div class='min-h-0 flex'>
 
 <ul class='flex flex-col gap-10 text-13/narrow lg-max:pb-20'>
 
 <li class='flex'><a 
 href=/pages/about-us 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left'
 
 
 
 
 
 
 
 
 
 
 
 
>Notre mission</a></li>
 
 <li class='flex'><a 
 href=/pages/charte-de-formulation 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left'
 
 
 
 
 
 
 
 
 
 
 
 
>Notre charte de formulation</a></li>
 
 <li class='flex'><a 
 href=/pages/ou-nous-trouver 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left'
 
 
 
 
 
 
 
 
 
 
 
 
>Nos pharmacies partenaires</a></li>
 
 <li class='flex'><a 
 href=https://form.typeform.com/to/NCIm2YfW 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left'
 
 
 
 
 
 
 
 
 
 
 
 
>Devenir pharmacie partenaire</a></li>
 
 <li class='flex'><a 
 href=https://www.welcometothejungle.com/fr/companies/respire/jobs 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left'
 
 
 
 
 
 
 
 
 
 
 
 
>Nous rejoindre</a></li>
 
 <li class='flex'><a 
 href=https://www.respire.co/pages/programme-parrainage 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left'
 
 
 
 
 
 
 
 
 
 
 
 
>Parrainage</a></li>
 
 <li class='flex'><a 
 href=https://www.respire.co/pages/avis 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left'
 
 
 
 
 
 
 
 
 
 
 
 
>Avis Respire</a></li>
 
 </ul>
 
 </div></div></article></div></div>
 </nav>
 
 </div><div class='w-full border-neutral-80 py-60 lg:border-l lg-max:margin-px-1'><div class='span-w-10 lg:pl-[calc(0.5*var(--gutter))] lg:span-w-11 lg:span-ml-2-wide lg-max:mx-auto'><div class='lg:span-w-9 lg-max:text-center'><h2 class='mb-12 text-28 font-black uppercase tracking-tighter lg:mb-14'>Rejoignez-nous</h2><p class='font-serif text-14/none font-light tracking-tight lg:text-16/none'>Chez Respire, nous développons des soins naturels haute performance et assurons à la fois une efficacité et une sensorialité.</p><form
 action="https://services.respire.co/api/klaviyo"
 method="POST"
 class="mt-30 flex gap-4"
 
 x-data="ajaxForm"
 
 @submit.prevent="handleSubmit"
><input type="hidden" value="VtmvWc" name="listId"><div class="flex w-full flex-col gap-20"><div class="relative"><span class="absolute bottom-full left-0 block"><span class="block pb-4 pl-2 text-10/narrow font-black uppercase text-current" x-text="statusText"></span></span>
 
<div class="relative text-16/none lg:text-13/none w-full"><input
 placeholder="Email"
 type="email"
 id="email"
 name="email"
 aria-label=""
 class="font-black text-11/none rounded-md placeholder:uppercase peer appearance-none block w-full h-45 px-12 py-18 appearance-none placeholder-current focus-visible:outline-none focus-visible:ring-0 duration-300 ease-quart-out transition-colors aria-[invalid]:text-orange aria-[invalid]:border-orange bg-transparent border border-grey-light"><span
 class="pointer-events-none absolute right-12 top-1/2 -translate-y-1/2 text-current"
 x-cloak
 x-show="showTick"
 x-transition:enter="transform ease-quart-out duration-300"
 x-transition:enter-start="opacity-0 scale-50"
 x-transition:enter-end="opacity-100 scale-100"
 x-transition:leave="transform ease-quart-out duration-200"
 x-transition:leave-start="opacity-100 scale-100"
 x-transition:leave-end="opacity-0 scale-90"
 ><svg viewbox="0 0 10 8" fill="none" xmlns="http://www.w3.org/2000/svg" class="w-12"><path fill="currentColor" d="M3.225 8 0 4.558l.747-.792L3.225 6.37 9.253 0 10 .814 3.225 8Z"/><path fill="currentColor" fill-opacity=".2" d="M3.225 8 0 4.558l.747-.792L3.225 6.37 9.253 0 10 .814 3.225 8Z"/><path fill="currentColor" fill-opacity=".2" d="M3.225 8 0 4.558l.747-.792L3.225 6.37 9.253 0 10 .814 3.225 8Z"/><path fill="currentColor" fill-opacity=".2" d="M3.225 8 0 4.558l.747-.792L3.225 6.37 9.253 0 10 .814 3.225 8Z"/></svg></span>
</div></div><label
 aria-label=''
 class='text-grey relative inline-flex items-center gap-8 cursor-pointer select-none text-left text-12/narrow font-light'
 htmlfor=''
><input
 type='checkbox'
 id=''
 name=''><i aria-hidden class='relative !flex items-center justify-center shrink-0 w-16 h-16 border rounded-sm transition-[background-color,border-color] duration-300 ease-quart-out peer-checked:[&>div]:opacity-100 peer-checked:bg-white peer-checked:border-white/40 peer-focus:outline outline-1 outline-offset-1'><div class='w-10 m-auto opacity-0'><svg xmlns='http://www.w3.org/2000/svg' viewbox='0 0 12 9' fill='none'><path d="m1.4 3.8 3.8 3.6 6.2-6.2" stroke="white" stroke-linecap="round"/></svg></div></i><div>J’accepte la <a href='/policies/privacy-policy' class='underline'>politique de confidentialité</a></div></label></div><button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out bg-white hover:bg-grey-light text-black overflow-clip h-45'
 
 
 
 
 
 
 
 type='submit'
 
 
 
 
 
 
:inert='loading'><div
 class='h-full transform-gpu transition-transform duration-500 ease-quart-inout'
 :class='loading && "-translate-y-full !ease-expo-out"'
 ><div class='flex h-full items-center transition-transform'>
 <span class='text-10/none'>S&#39;inscrire</span></div><div class='absolute left-0 top-full flex h-full w-full items-center justify-center transition-transform'>
 <div
 role='status'
 class='pointer-events-none w-18'
 aria-label='Loading...'
><svg
 viewbox='0 0 100 101'
 fill='none'
 xmlns='http://www.w3.org/2000/svg'
 class='animate-[spin_600ms_linear_infinite] fill-current'
 aria-hidden='true'
 ><path d='M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z' fill='currentColor' opacity='0.3' /><path d='M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z' fill='currentFill' /></svg></div>
 </div></div></button></form></div><ul class='mt-30 flex items-center gap-24 lg-max:hidden'>
 
 <li><a 
 href=https://www.linkedin.com/company/respirenaturel/?originalSubdomain=fr 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative h-24 w-24 p-4 grid place-items-center'
 
 
aria-label="Linkedin"
 
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-linkedin'><svg viewbox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg' class='w-16 h-16'><path d="M1.82 0C.82 0 0 .82 0 1.82v12.36C0 15.18.82 16 1.82 16h12.36c1 0 1.82-.82 1.82-1.82V1.82c0-1-.82-1.82-1.82-1.82H1.82Zm0 1.45h12.36c.2 0 .37.16.37.37v12.36c0 .2-.16.37-.37.37H1.82a.36.36 0 0 1-.37-.37V1.82c0-.2.16-.37.37-.37ZM3.95 2.7a1.25 1.25 0 1 0 0 2.5 1.25 1.25 0 0 0 0-2.5Zm6.57 3.32c-1.04 0-1.73.57-2.02 1.12h-.05v-.96H6.41v6.91h2.14V9.7c0-.9.17-1.78 1.3-1.78 1.09 0 1.1 1.02 1.1 1.82v3.36h2.14V9.3c0-1.85-.4-3.27-2.57-3.27Zm-7.61.16v6.91h2.16V6.2H2.9Z" fill="currentColor"/></svg></a></li>
 
 <li><a 
 href=https://instagram.com/respirenaturel 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative h-24 w-24 p-4 grid place-items-center'
 
 
aria-label="Instagram"
 
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-instagram'><svg xmlns='http://www.w3.org/2000/svg' viewbox='0 0 17 18' fill='none' class='w-16 h-16'><path fill-rule="evenodd" clip-rule="evenodd" d="M5 .2C5.9.14 6.2.13 8.5.13s2.6.01 3.5.05c.9.04 1.53.19 2.07.4.56.21 1.08.55 1.5.98.44.42.77.94.98 1.5.21.55.36 1.16.4 2.07.04.9.05 1.2.05 3.5 0 2.31-.01 2.6-.05 3.5a6.2 6.2 0 0 1-.4 2.07 4.17 4.17 0 0 1-.98 1.5c-.42.44-.94.77-1.5.99-.54.2-1.16.35-2.06.4-.91.03-1.2.04-3.51.04-2.3 0-2.6 0-3.5-.05a6.23 6.23 0 0 1-2.07-.4 4.17 4.17 0 0 1-1.5-.97 4.17 4.17 0 0 1-.98-1.5 6.27 6.27 0 0 1-.4-2.07A62.2 62.2 0 0 1 0 8.64c0-2.32.01-2.6.05-3.51.04-.9.19-1.52.4-2.07.21-.56.54-1.08.98-1.5.42-.43.93-.77 1.5-.98C3.47.38 4.1.24 5 .19Zm6.93 1.52c-.9-.04-1.16-.05-3.43-.05-2.27 0-2.54.01-3.43.05a4.7 4.7 0 0 0-1.58.3 2.78 2.78 0 0 0-1.62 1.61c-.11.3-.25.75-.29 1.58-.04.9-.05 1.16-.05 3.43a60 60 0 0 0 .05 3.44c.04.83.18 1.28.3 1.58.13.36.35.7.63.97.27.29.6.5.98.64.3.12.75.25 1.58.3.9.03 1.16.04 3.43.04 2.27 0 2.54 0 3.43-.05a4.7 4.7 0 0 0 1.58-.3c.4-.15.68-.33.98-.63.28-.27.5-.6.64-.97.11-.3.25-.75.29-1.58.04-.9.05-1.17.05-3.44s-.01-2.54-.05-3.43a4.7 4.7 0 0 0-.3-1.58c-.15-.4-.33-.68-.63-.98-.27-.28-.6-.5-.98-.63a4.7 4.7 0 0 0-1.58-.3Zm-4.52 9.54A2.84 2.84 0 1 0 9.6 6.03a2.84 2.84 0 0 0-2.18 5.23Zm-2-5.7a4.37 4.37 0 1 1 6.18 6.17A4.37 4.37 0 0 1 5.4 5.55Zm8.43-.64a1.03 1.03 0 1 0-1.42-1.5 1.03 1.03 0 0 0 1.42 1.5Z" fill="currentColor"/></svg></a></li>
 
 <li><a 
 href=https://www.facebook.com/respireentreprise/ 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative h-24 w-24 p-4 grid place-items-center'
 
 
aria-label="Facebook"
 
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-facebook'><svg xmlns='http://www.w3.org/2000/svg' viewbox='0 0 8 18' fill='none' class='w-16 h-16'><path d="M5.15 17.14h-3.1v-8.5H0V5.72h2.06V3.99c0-2.4.62-3.85 3.35-3.85h2.27v2.94H6.26c-1.06 0-1.11.4-1.11 1.16v1.47H7.7l-.3 2.93H5.14v8.5Z" fill="currentColor"/></svg></a></li>
 
 </ul></div></div></div><div class='border-neutral-80 lg:border-t lg:py-60 lg-max:pb-60'><div class='mx-auto span-w-7 lg:span-w-10'><svg viewbox='0 0 440 128' fill='none' xmlns='http://www.w3.org/2000/svg' class='w-full'><path d="M277.23 99.77h32.89c1.05 0 1.74-.7 1.74-1.68v-3.16c0-1.06-.7-1.69-1.74-1.69h-1.05a6.87 6.87 0 0 1-6.84-6.88V31.4c0-1.05-.7-1.68-1.75-1.68h-2.72l-21.93 6.88c-1.4.35-1.74 1.05-1.74 1.68v3.44c0 1.05.7 1.4 1.4 1.4s3.41-.7 4.81-.7c3.07 0 4.82 2.04 4.82 5.13v38.82c0 3.8-3.07 6.88-6.85 6.88h-1.04c-1.05 0-1.75.7-1.75 1.69v3.09c0 1.05.7 1.68 1.75 1.68M0 41.71c0 1.05.7 1.4 1.4 1.4s3.42-.7 4.81-.7c3.08 0 4.82 2.04 4.82 5.13v38.82c0 3.8-3.07 6.88-6.84 6.88H3.14c-1.05 0-1.74.7-1.74 1.69v3.09c0 1.05.7 1.68 1.74 1.68h35.97c1.04 0 1.74-.7 1.74-1.68v-3.1c0-1.05-.7-1.68-1.74-1.68h-4.12a6.87 6.87 0 0 1-6.85-6.88V59.9c0-9.26 7.2-14.74 13.34-14.74 5.45 0 5.45 2.74 10.26 2.74a9.04 9.04 0 0 0 8.87-8.92c0-4.77-3.77-10.32-10.96-10.32-12.99 0-18.85 12.36-21.58 19.59V31.39c0-1.05-.7-1.68-1.74-1.68H23.6L1.75 36.59C.35 36.94 0 37.64 0 38.27v3.44Zm59.57 23.03c0-20.64 16.06-36.09 34.21-36.09 20.88 0 29.12 17.2 29.12 26.47 0 2.04-1.05 3.8-4.47 3.8H77.37v.34c0 17.83 10.27 27.8 21.93 27.8 9.92 0 15.43-4.84 18.5-12 .35-.7.7-1.4 2.03-1.4h1.67c1.05 0 1.75.7 1.4 2.03-2.02 10.32-9.57 25.77-29.12 25.77S59.57 86.7 59.57 64.74Zm18.5-12.43h24.65a3.81 3.81 0 0 0 3.77-3.79c0-4.84-4.12-12.7-12.64-12.7-6.56 0-13.68 5.9-15.78 16.5Zm52.72 39.53c-.35 1.4 0 2.03 1.05 2.74 1.05.7 15.08 6.88 25.35 6.88 16.4 0 26.32-7.87 26.32-21.63 0-12.7-8.58-18.18-15.43-20.64l-6.5-2.38c-2.72-1.06-14.03-3.44-14.03-12.36 0-5.13 4.82-8.57 10.62-8.57 8.24 0 14.73 8.29 14.73 13.41 0 1.06.7 1.69 1.68 1.69h3.07c1.05 0 1.75-.7 1.75-1.69V34.83c0-1.05-.7-1.4-1.75-1.68-3.07-1.06-9.92-4.43-19.83-4.43-15.09 0-25.98 7.59-25.98 19.94 0 11.73 9.22 17.2 17.1 19.94l8.6 3.09c5.45 2.03 10.26 5.83 10.26 12 0 5.48-4.47 10.6-10.96 10.6-11.31 0-16.41-9.61-16.41-17.48v-1.4c0-1.4-.7-1.69-1.68-2.04l-2.02-.35c-1.4-.35-2.03.35-2.38 1.4l-3.56 17.42Zm58.17-50.13c0 1.05.7 1.4 1.4 1.4s3.42-.7 4.82-.7c3.07 0 4.81 2.04 4.81 5.13v66.27c0 3.8-3.07 6.88-6.84 6.88h-1.05c-1.04 0-1.74.7-1.74 1.69v3.09c0 1.05.7 1.68 1.74 1.68h34.57c1.05 0 1.75-.7 1.75-1.69v-3.08c0-1.06-.7-1.69-1.75-1.69h-2.72a6.87 6.87 0 0 1-6.85-6.88V93.17c4.12 4.85 10.27 8.29 19.49 8.29 17.1 0 30.44-15.1 30.44-39.53 0-17.2-9.91-33.35-27.02-33.35-12.99 0-20.18 9.27-22.9 15.8V31.39c0-1.05-.7-1.68-1.75-1.68h-2.73l-21.92 6.88c-1.4.35-1.68 1.05-1.68 1.68v3.44h-.07Zm28.07 39.18V56.1c0-5.47 4.12-16.85 15.72-16.85 9.91 0 16.4 9.27 16.4 26.47 0 18.89-8.86 25.06-16.75 25.06-6.5 0-12.64-3.72-15.37-9.9Zm65.36-70.77c0 5.83 4.48 10.32 10.62 10.32a10.1 10.1 0 0 0 10.26-10.32c0-5.48-4.46-9.97-10.26-9.97-6.14 0-10.62 4.42-10.62 9.97Zm34.57 31.6c0 1.04.7 1.4 1.4 1.4s3.42-.7 4.82-.7c3.07 0 4.81 2.03 4.81 5.12v38.82c0 3.8-3.07 6.88-6.84 6.88h-1.05c-1.04 0-1.74.7-1.74 1.69v3.09c0 1.05.7 1.68 1.74 1.68h35.97c1.04 0 1.74-.7 1.74-1.68v-3.1c0-1.05-.7-1.68-1.74-1.68h-4.12a6.87 6.87 0 0 1-6.85-6.88V59.9c0-9.26 7.2-14.74 13.34-14.74 5.45 0 5.45 2.74 10.27 2.74a9.04 9.04 0 0 0 8.87-8.92c0-4.77-3.78-10.32-10.97-10.32-12.99 0-18.85 12.36-21.58 19.59V31.39c0-1.05-.7-1.68-1.74-1.68h-2.73l-21.92 6.88c-1.4.35-1.75 1.05-1.75 1.68l.07 3.44Zm59.57 23.02c0-20.64 16.06-36.09 34.21-36.09 20.88 0 29.12 17.2 29.12 26.47 0 2.04-1.04 3.8-4.47 3.8h-41.06v.34c0 17.83 10.27 27.8 21.93 27.8 9.92 0 15.43-4.84 18.5-12 .36-.7.7-1.4 2.03-1.4h1.75c1.04 0 1.67.7 1.4 2.03-2.03 10.32-9.57 25.77-29.13 25.77-19.48 0-34.21-14.75-34.21-36.8m18.43-12.35h24.65a3.81 3.81 0 0 0 3.77-3.79c0-4.84-4.12-12.7-12.64-12.7-6.56 0-13.75 5.9-15.78 16.5Z" fill="currentColor"/></svg></div></div><div class='grid-container flex items-center justify-between pb-16 lg:justify-normal lg-max:span-px-1-wide'><ul class='flex items-center gap-20 lg:hidden lg:gap-36'>
 
 <li><a 
 href=https://www.linkedin.com/company/respirenaturel/?originalSubdomain=fr 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative h-24 w-24 p-4 grid place-items-center'
 
 
aria-label="Linkedin"
 
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-linkedin'><svg viewbox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg' class='w-16 h-16'><path d="M1.82 0C.82 0 0 .82 0 1.82v12.36C0 15.18.82 16 1.82 16h12.36c1 0 1.82-.82 1.82-1.82V1.82c0-1-.82-1.82-1.82-1.82H1.82Zm0 1.45h12.36c.2 0 .37.16.37.37v12.36c0 .2-.16.37-.37.37H1.82a.36.36 0 0 1-.37-.37V1.82c0-.2.16-.37.37-.37ZM3.95 2.7a1.25 1.25 0 1 0 0 2.5 1.25 1.25 0 0 0 0-2.5Zm6.57 3.32c-1.04 0-1.73.57-2.02 1.12h-.05v-.96H6.41v6.91h2.14V9.7c0-.9.17-1.78 1.3-1.78 1.09 0 1.1 1.02 1.1 1.82v3.36h2.14V9.3c0-1.85-.4-3.27-2.57-3.27Zm-7.61.16v6.91h2.16V6.2H2.9Z" fill="currentColor"/></svg></a></li>
 
 <li><a 
 href=https://instagram.com/respirenaturel 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative h-24 w-24 p-4 grid place-items-center'
 
 
aria-label="Instagram"
 
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-instagram'><svg xmlns='http://www.w3.org/2000/svg' viewbox='0 0 17 18' fill='none' class='w-16 h-16'><path fill-rule="evenodd" clip-rule="evenodd" d="M5 .2C5.9.14 6.2.13 8.5.13s2.6.01 3.5.05c.9.04 1.53.19 2.07.4.56.21 1.08.55 1.5.98.44.42.77.94.98 1.5.21.55.36 1.16.4 2.07.04.9.05 1.2.05 3.5 0 2.31-.01 2.6-.05 3.5a6.2 6.2 0 0 1-.4 2.07 4.17 4.17 0 0 1-.98 1.5c-.42.44-.94.77-1.5.99-.54.2-1.16.35-2.06.4-.91.03-1.2.04-3.51.04-2.3 0-2.6 0-3.5-.05a6.23 6.23 0 0 1-2.07-.4 4.17 4.17 0 0 1-1.5-.97 4.17 4.17 0 0 1-.98-1.5 6.27 6.27 0 0 1-.4-2.07A62.2 62.2 0 0 1 0 8.64c0-2.32.01-2.6.05-3.51.04-.9.19-1.52.4-2.07.21-.56.54-1.08.98-1.5.42-.43.93-.77 1.5-.98C3.47.38 4.1.24 5 .19Zm6.93 1.52c-.9-.04-1.16-.05-3.43-.05-2.27 0-2.54.01-3.43.05a4.7 4.7 0 0 0-1.58.3 2.78 2.78 0 0 0-1.62 1.61c-.11.3-.25.75-.29 1.58-.04.9-.05 1.16-.05 3.43a60 60 0 0 0 .05 3.44c.04.83.18 1.28.3 1.58.13.36.35.7.63.97.27.29.6.5.98.64.3.12.75.25 1.58.3.9.03 1.16.04 3.43.04 2.27 0 2.54 0 3.43-.05a4.7 4.7 0 0 0 1.58-.3c.4-.15.68-.33.98-.63.28-.27.5-.6.64-.97.11-.3.25-.75.29-1.58.04-.9.05-1.17.05-3.44s-.01-2.54-.05-3.43a4.7 4.7 0 0 0-.3-1.58c-.15-.4-.33-.68-.63-.98-.27-.28-.6-.5-.98-.63a4.7 4.7 0 0 0-1.58-.3Zm-4.52 9.54A2.84 2.84 0 1 0 9.6 6.03a2.84 2.84 0 0 0-2.18 5.23Zm-2-5.7a4.37 4.37 0 1 1 6.18 6.17A4.37 4.37 0 0 1 5.4 5.55Zm8.43-.64a1.03 1.03 0 1 0-1.42-1.5 1.03 1.03 0 0 0 1.42 1.5Z" fill="currentColor"/></svg></a></li>
 
 <li><a 
 href=https://www.facebook.com/respireentreprise/ 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative h-24 w-24 p-4 grid place-items-center'
 
 
aria-label="Facebook"
 
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-facebook'><svg xmlns='http://www.w3.org/2000/svg' viewbox='0 0 8 18' fill='none' class='w-16 h-16'><path d="M5.15 17.14h-3.1v-8.5H0V5.72h2.06V3.99c0-2.4.62-3.85 3.35-3.85h2.27v2.94H6.26c-1.06 0-1.11.4-1.11 1.16v1.47H7.7l-.3 2.93H5.14v8.5Z" fill="currentColor"/></svg></a></li>
 
 </ul><div class='lg-max:hidden'><ul class='flex gap-24 text-10/none font-bold uppercase tracking-wide'>
 
<li><a 
 href=https://www.respire.co/pages/cgv 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left uppercase'
 
 
 
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-_cgv'> CGV</a></li>
 
<li><a 
 href=https://www.respire.co/policies/legal-notice 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left uppercase'
 
 
 
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-mention_légale'>Mention Légale</a></li>
 
<li><a 
 href=https://www.respire.co/policies/privacy-policy 
 
 target='_blank'
 rel='noopener noreferrer'
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left uppercase'
 
 
 
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-politique_de_confidentialité'>Politique de confidentialité</a></li>
 
<li><a 
 href=/pages/plan-du-site-1 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left uppercase'
 
 
 
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-plan_du_site'>Plan du site</a></li>
 
 <li x-data x-show='$store.gpdr.shouldShowBanner'><button 
 
 
 class='relative inline-block overflow-clip w-fit after:scale-x-0 after:origin-right after:ease-expo-out after:duration-1000 after:transition-transform after:border-b after:border-current after:bottom-0 after:left-0 after:right-0 after:absolute hover:after:scale-x-100 hover:after:duration-300 hover:after:origin-left uppercase'
 
 
@click="$store.gpdr.isSlideoutOpened=true"
 
 
 
 
 
 
 
 
 
 
data-trk='button-cta-nav-menu-cookie_settings'>Paramètrer les cookies</button></li></ul></div><div class='flex items-center gap-20 lg:ml-auto lg:pt-0'>
 <div x-data='localizationForm'>
 <form method="post" action="/localization" id="localization_form" accept-charset="UTF-8" class="shopify-localization-form" enctype="multipart/form-data"><input type="hidden" name="form_type" value="localization" /><input type="hidden" name="utf8" value="✓" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="return_to" value="/collections/deodorant" />
<div class='relative inline-block text-10/narrower font-black'><select
 name='country_code'
 id='country_code'
 value='FR'
 class='cursor-pointer appearance-none bg-transparent pr-15 uppercase focus:outline-none'
 >
 
 <option 
 value='DZ'>
 DZ / EUR
 </option>
 
 <option 
 value='DE'>
 DE / EUR
 </option>
 
 <option 
 value='AU'>
 AU / EUR
 </option>
 
 <option 
 value='AT'>
 AT / EUR
 </option>
 
 <option 
 value='BE'>
 BE / EUR
 </option>
 
 <option 
 value='CA'>
 CA / EUR
 </option>
 
 <option 
 value='CN'>
 CN / EUR
 </option>
 
 <option 
 value='CY'>
 CY / EUR
 </option>
 
 <option 
 value='KR'>
 KR / EUR
 </option>
 
 <option 
 value='DK'>
 DK / EUR
 </option>
 
 <option 
 value='ES'>
 ES / EUR
 </option>
 
 <option 
 value='EE'>
 EE / EUR
 </option>
 
 <option 
 value='US'>
 US / EUR
 </option>
 
 <option 
 value='FI'>
 FI / EUR
 </option>
 
 <option 
 value='FR'>
 FR / EUR
 </option>
 
 <option 
 value='GR'>
 GR / EUR
 </option>
 
 <option 
 value='GP'>
 GP / EUR
 </option>
 
 <option 
 value='GF'>
 GF / EUR
 </option>
 
 <option 
 value='HU'>
 HU / EUR
 </option>
 
 <option 
 value='IN'>
 IN / EUR
 </option>
 
 <option 
 value='IE'>
 IE / EUR
 </option>
 
 <option 
 value='IS'>
 IS / EUR
 </option>
 
 <option 
 value='IL'>
 IL / EUR
 </option>
 
 <option 
 value='IT'>
 IT / EUR
 </option>
 
 <option 
 value='JP'>
 JP / EUR
 </option>
 
 <option 
 value='RE'>
 RE / EUR
 </option>
 
 <option 
 value='LV'>
 LV / EUR
 </option>
 
 <option 
 value='LT'>
 LT / EUR
 </option>
 
 <option 
 value='LU'>
 LU / EUR
 </option>
 
 <option 
 value='MA'>
 MA / EUR
 </option>
 
 <option 
 value='MQ'>
 MQ / EUR
 </option>
 
 <option 
 value='MU'>
 MU / EUR
 </option>
 
 <option 
 value='YT'>
 YT / EUR
 </option>
 
 <option 
 value='MC'>
 MC / EUR
 </option>
 
 <option 
 value='NO'>
 NO / EUR
 </option>
 
 <option 
 value='NC'>
 NC / EUR
 </option>
 
 <option 
 value='NZ'>
 NZ / EUR
 </option>
 
 <option 
 value='NL'>
 NL / EUR
 </option>
 
 <option 
 value='PL'>
 PL / EUR
 </option>
 
 <option 
 value='PF'>
 PF / EUR
 </option>
 
 <option 
 value='PT'>
 PT / EUR
 </option>
 
 <option 
 value='HK'>
 HK / EUR
 </option>
 
 <option 
 value='GB'>
 GB / EUR
 </option>
 
 <option 
 value='RU'>
 RU / EUR
 </option>
 
 <option 
 value='BL'>
 BL / EUR
 </option>
 
 <option 
 value='MF'>
 MF / EUR
 </option>
 
 <option 
 value='PM'>
 PM / EUR
 </option>
 
 <option 
 value='SG'>
 SG / EUR
 </option>
 
 <option 
 value='SK'>
 SK / EUR
 </option>
 
 <option 
 value='SI'>
 SI / EUR
 </option>
 
 <option 
 value='SE'>
 SE / EUR
 </option>
 
 <option 
 value='CH'>
 CH / EUR
 </option>
 
 <option 
 value='CZ'>
 CZ / EUR
 </option>
 
 <option 
 value='TF'>
 TF / EUR
 </option>
 
 <option 
 value='TH'>
 TH / EUR
 </option>
 
 <option 
 value='TN'>
 TN / EUR
 </option>
 
 <option 
 value='TR'>
 TR / EUR
 </option>
 
 <option 
 value='VN'>
 VN / EUR
 </option>
 
 <option 
 value='WF'>
 WF / EUR
 </option>
 

 </select><div class='pointer-events-none absolute bottom-2 right-0 top-0 grid place-items-center'><svg viewbox='0 0 10 6' fill='none' xmlns='http://www.w3.org/2000/svg' class='w-10 shrink-0'><path d="M0.977051 1.25586L4.70504 4.98385" stroke="currentColor" stroke-width="1.19296" stroke-linecap="round"/><path d="M8.43311 1.25586L4.70511 4.98385" stroke="currentColor" stroke-width="1.19296" stroke-linecap="round"/></svg>
 </div></div>
 </form>
 </div>

 <div x-data='localizationForm'>
 <form method="post" action="/localization" id="localization_form" accept-charset="UTF-8" class="shopify-localization-form" enctype="multipart/form-data"><input type="hidden" name="form_type" value="localization" /><input type="hidden" name="utf8" value="✓" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="return_to" value="/collections/deodorant" />
<div class='relative inline-block text-10/narrower font-black'><select
 name='language_code'
 id='language_code'
 value='fr'
 class='cursor-pointer appearance-none bg-transparent pr-10 uppercase focus:outline-none'
 >
 
 <option 
 value='fr'>
 français
 </option>
 
 <option 
 value='es'>
 Español
 </option>
 
 <option 
 value='it'>
 Italiano
 </option>
 

 </select><div class='pointer-events-none absolute bottom-2 right-0 top-0 grid place-items-center'><svg viewbox='0 0 10 6' fill='none' xmlns='http://www.w3.org/2000/svg' class='w-10 shrink-0'><path d="M0.977051 1.25586L4.70504 4.98385" stroke="currentColor" stroke-width="1.19296" stroke-linecap="round"/><path d="M8.43311 1.25586L4.70511 4.98385" stroke="currentColor" stroke-width="1.19296" stroke-linecap="round"/></svg>
 </div></div>
 </form>
 </div>
</div></div>
</footer><section id="shopify-section-sections--26281148383568__minicart" class="shopify-section shopify-section-group-footer-group"><div
 
 x-data='{"$store.global.isMinicartVisible": false}'
 
><form
 class="fixed right-0 top-0 z-101 flex h-full w-full flex-col bg-white margin-px-1 lg:box-content lg:span-w-12"
 x-show="$store.global.isMinicartVisible"
 x-transition:enter="transition-transform ease-expo-out duration-700 transform-gpu"
 x-transition:enter-start="translate-x-full"
 x-transition:leave="transition-transform ease-quart-inout duration-700 transform-gpu"
 x-transition:leave-end="translate-x-full"
 x-cloak
 action="/cart" enctype="multipart/form-data" method="POST" novalidate
 aria-modal="true"
 role="dialog"
 x-trap.inert="$store.global.isMinicartVisible"
 @keydown.escape.window="$store.global.isMinicartVisible = false"
 x-init='$watch("$store.global.isMinicartVisible", shouldLock => $store.global.bodyScrollLock(shouldLock))'
 ><div
 
 role="heading"
 
 labelledby="panier"
 
 ><div class="relative z-2 flex h-48 items-center justify-between gap-4"><h2
 id="panier"
 class="text-13 font-black"
 
 data-ajax-cart-section
>
 Panier
 </h2><div
 x-data="cartTimer({ cartTimerMinutes: 30 })"
 class="font-serif text-center text-15 leading-narrow tracking-[0.15px] text-grey-light-2 font-light"
 :class="{ 'hidden': !cartHasItems || timeRemaining <= 0 }"
 >Votre panier est réservé pendant
 <span x-text="timeRemainingFormatted"></span></div>
 <button
 type="button"
 @click="$store.global.isMinicartVisible=false"
 class="-mr-8 p-8"
 aria-label="Fermer"
 >
 <svg fill='none' viewbox='0 0 15 14' xmlns='http://www.w3.org/2000/svg' class='w-14 h-14'><path d="M1.93 13.86.84 12.77 6.61 7 .84 1.23 1.93.14 7.7 5.91 13.47.14l1.09 1.09L8.78 7l5.78 5.77-1.09 1.09L7.7 8.09z" fill="currentColor"/></svg>
 </button></div>
 
 </div><div
 class="flex h-full flex-col overflow-y-auto overscroll-contain scrollbar-hide"
 data-lenis-prevent
>
 <section class='flex h-full flex-col gap-8 pb-20'><div data-ajax-cart-section><div class='inset absolute top-1 z-1 flex h-full w-full flex-col items-center justify-center bg-white pt-48 margin-px-1 -margin-mx-1'><p class='my-auto text-center text-50 font-black uppercase leading-narrower lg:text-64'>Votre panier est vide</p><div class="w-full"><h2 class='mb-10 text-13 font-black leading-none'>Recommandé</h2>

<div
 x-data='slideshow({groupBy:2,autoPlayInterval:0,disableLg:false,loop:false, displayChildrenCountMobile:-1, displayChildrenCountDesktop: -1})'
 
 class='relative span-w-12 mb-20'
 
><div
 x-ref='wrapper'
 @touchstart='handleTouchStart'
 class='flex [&>*]:shrink-0 justify-start items-stretch [&>*]:snap-center overflow-x-auto overscroll-x-contain scrollbar-hide snap-x snap-mandatory scroll-smooth w-full gutter-gap-1'
 >
 <article class='group relative isolate flex flex-col span-w-6 lg:span-w-4'><a
 href='/products/soin-levres-collagene-booster'><div class='relative flex-shrink-0'><span class='absolute right-0 top-0 z-1 block p-14 text-13/narrower font-bold'>[ New ]</span>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&height=1198&v=1773330409&width=960 960w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&height=1497&v=1773330409&width=1200 1200w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&height=2396&v=1773330409&width=1920 1920w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&height=2994&v=1773330409&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=242&amp;v=1773330409&amp;width=194" alt="Soin Lèvres Collagène Booster" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=60&amp;v=1773330409&amp;width=48 48w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=120&amp;v=1773330409&amp;width=96 96w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=200&amp;v=1773330409&amp;width=160 160w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=399&amp;v=1773330409&amp;width=320 320w,//respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?crop=center&amp;height=798&amp;v=1773330409&amp;width=640 640w" sizes="51vw" class="w-full" draggable="false">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&height=1198&v=1774535264&width=960 960w,//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&height=1497&v=1774535264&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&height=2396&v=1774535264&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&height=2994&v=1774535264&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&amp;height=242&amp;v=1774535264&amp;width=194" alt="Soin Lèvres Collagène Booster" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&amp;height=60&amp;v=1774535264&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&amp;height=120&amp;v=1774535264&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&amp;height=200&amp;v=1774535264&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&amp;height=399&amp;v=1774535264&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Lipcare-Collagene-Booster-Application.jpg?crop=center&amp;height=798&amp;v=1774535264&amp;width=640 640w" sizes="51vw" class="w-full" draggable="false">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Soin Lèvres Collagène Booster</h2><p class='line-clamp-1 text-13/narrow'>
 4% Peptides Pro-Collagène + SPF20
 </p></div><div class='text-13 font-black leading-none'><span>19,90€</span></div></div>
 
</a><hr class='invisible mt-10 h-0'>
 <button 
 
 
 class='relative flex justify-center items-center h-40 text-12/narrow font-bold uppercase transition-[border] ease-expo-out duration-700 hover:duration-100 border rounded-md px-16 border-black/20 hover:border-black w-full mt-auto'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:52801243021648,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Soin Lèvres Collagène Booster&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 10436180607312, Categories: ["Nouveautés","Soin Lèvres","Soins du visage","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/SoinLevrespackshotombre_2.jpg?v=1773330409&width=720", URL: "https://respire.co/products/soin-levres-collagene-booster", Price: "19,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
>Ajouter</button>
</article>
<article class='group relative isolate flex flex-col span-w-6 lg:span-w-4'><a
 href='/products/stick-solaire-anti-tache-50'><div class='relative flex-shrink-0'><span class='absolute right-0 top-0 z-1 block p-14 text-13/narrower font-bold'>[ New ]</span>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&height=1198&v=1776679718&width=960 960w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&height=1497&v=1776679718&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&height=2396&v=1776679718&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&height=2994&v=1776679718&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=242&amp;v=1776679718&amp;width=194" alt="Stick Solaire Matifiant SPF50+" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=60&amp;v=1776679718&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=120&amp;v=1776679718&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=200&amp;v=1776679718&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=399&amp;v=1776679718&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=798&amp;v=1776679718&amp;width=640 640w" sizes="51vw" class="w-full" draggable="false">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&height=1198&v=1776679718&width=960 960w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&height=1497&v=1776679718&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&height=2396&v=1776679718&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&height=2994&v=1776679718&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&amp;height=242&amp;v=1776679718&amp;width=194" alt="Stick Solaire Matifiant SPF50+" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&amp;height=60&amp;v=1776679718&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&amp;height=120&amp;v=1776679718&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&amp;height=200&amp;v=1776679718&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&amp;height=399&amp;v=1776679718&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Porte.jpg?crop=center&amp;height=798&amp;v=1776679718&amp;width=640 640w" sizes="51vw" class="w-full" draggable="false">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Stick Solaire Matifiant SPF50+</h2><p class='line-clamp-1 text-13/narrow'>
 Très Haute Protection UVA/B + Bakuchiol
 </p></div><div class='text-13 font-black leading-none'><span>13,90€</span></div></div>
 
</a><hr class='invisible mt-10 h-0'>
 <button 
 
 
 class='relative flex justify-center items-center h-40 text-12/narrow font-bold uppercase transition-[border] ease-expo-out duration-700 hover:duration-100 border rounded-md px-16 border-black/20 hover:border-black w-full mt-auto'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:49706032070992,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Stick Solaire Matifiant SPF50+&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 9746512904528, Categories: ["Nos Iconiques I Respire","Nouveautés","Soins solides","Solaires","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?v=1776679718&width=720", URL: "https://respire.co/products/stick-solaire-anti-tache-50", Price: "13,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
>Ajouter</button>
</article>
<article class='group relative isolate flex flex-col span-w-6 lg:span-w-4'><a
 href='/products/deodorant-stick-fleur-de-coton-efficace-48h'><div class='relative flex-shrink-0'>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?crop=center&height=1198&v=1763637117&width=960 960w,//respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?crop=center&height=1497&v=1763637117&width=1200 1200w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?crop=center&amp;height=242&amp;v=1763637117&amp;width=194" alt="Déodorant stick Fleur de Coton - Respire" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?crop=center&amp;height=60&amp;v=1763637117&amp;width=48 48w,//respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?crop=center&amp;height=120&amp;v=1763637117&amp;width=96 96w,//respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?crop=center&amp;height=200&amp;v=1763637117&amp;width=160 160w,//respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?crop=center&amp;height=399&amp;v=1763637117&amp;width=320 320w,//respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?crop=center&amp;height=798&amp;v=1763637117&amp;width=640 640w" sizes="51vw" class="w-full" draggable="false">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&height=1198&v=1780039061&width=960 960w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&height=1497&v=1780039061&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&height=2396&v=1780039061&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&height=2994&v=1780039061&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=242&amp;v=1780039061&amp;width=194" alt="Déodorant stick Fleur de Coton" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=60&amp;v=1780039061&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=120&amp;v=1780039061&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=200&amp;v=1780039061&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=399&amp;v=1780039061&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Deodorant-Stick-Fleur-de-Coton-Naturel-Application.jpg?crop=center&amp;height=798&amp;v=1780039061&amp;width=640 640w" sizes="51vw" class="w-full" draggable="false">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Déodorant stick Fleur de Coton</h2><p class='line-clamp-1 text-13/narrow'>
 Oxyde de Magnésium + Amidon de Maïs
 </p></div><div class='text-13 font-black leading-none'><span>11,90€</span></div></div>
 
</a><hr class='invisible mt-10 h-0'>
 <button 
 
 
 class='relative flex justify-center items-center h-40 text-12/narrow font-bold uppercase transition-[border] ease-expo-out duration-700 hover:duration-100 border rounded-md px-16 border-black/20 hover:border-black w-full mt-auto'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:47868480192848,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Déodorant stick Fleur de Coton&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 8782815199568, Categories: ["Déodorants","Déodorants Sticks","Nouveautés | Respire","Soins solides","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/deodorant-stick-fleur-de-coton-respire-6615914.jpg?v=1763637117&width=720", URL: "https://respire.co/products/deodorant-stick-fleur-de-coton-efficace-48h", Price: "11,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
>Ajouter</button>
</article>
<article class='group relative isolate flex flex-col span-w-6 lg:span-w-4'><a
 href='/products/soin-flash-boutons-tmp'><div class='relative flex-shrink-0'>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Skincare-Soin-flash-bouton_1.jpg?crop=center&height=1198&v=1775632781&width=960 960w,//respire.co/cdn/shop/files/Respire-Skincare-Soin-flash-bouton_1.jpg?crop=center&height=1497&v=1775632781&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Skincare-Soin-flash-bouton_1.jpg?crop=center&height=2396&v=1775632781&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Skincare-Soin-flash-bouton_1.jpg?crop=center&height=2994&v=1775632781&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Skincare-Soin-flash-bouton_1.jpg?crop=center&amp;height=242&amp;v=1775632781&amp;width=194" alt="Soin Flash Boutons" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Skincare-Soin-flash-bouton_1.jpg?crop=center&amp;height=60&amp;v=1775632781&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Skincare-Soin-flash-bouton_1.jpg?crop=center&amp;height=120&amp;v=1775632781&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Skincare-Soin-flash-bouton_1.jpg?crop=center&amp;height=200&amp;v=1775632781&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Skincare-Soin-flash-bouton_1.jpg?crop=center&amp;height=399&amp;v=1775632781&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Skincare-Soin-flash-bouton_1.jpg?crop=center&amp;height=798&amp;v=1775632781&amp;width=640 640w" sizes="51vw" class="w-full" draggable="false">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Skincare-Purify-Soin-Flash-Boutons-Application.png?crop=center&height=1198&v=1775633068&width=960 960w,//respire.co/cdn/shop/files/Respire-Skincare-Purify-Soin-Flash-Boutons-Application.png?crop=center&height=1497&v=1775633068&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Skincare-Purify-Soin-Flash-Boutons-Application.png?crop=center&height=2396&v=1775633068&width=1920 1920w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Skincare-Purify-Soin-Flash-Boutons-Application.png?crop=center&amp;height=242&amp;v=1775633068&amp;width=194" alt="Soin Flash Boutons" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Skincare-Purify-Soin-Flash-Boutons-Application.png?crop=center&amp;height=60&amp;v=1775633068&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Skincare-Purify-Soin-Flash-Boutons-Application.png?crop=center&amp;height=120&amp;v=1775633068&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Skincare-Purify-Soin-Flash-Boutons-Application.png?crop=center&amp;height=200&amp;v=1775633068&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Skincare-Purify-Soin-Flash-Boutons-Application.png?crop=center&amp;height=399&amp;v=1775633068&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Skincare-Purify-Soin-Flash-Boutons-Application.png?crop=center&amp;height=798&amp;v=1775633068&amp;width=640 640w" sizes="51vw" class="w-full" draggable="false">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Soin Flash Boutons</h2><p class='line-clamp-1 text-13/narrow'>
 Acide Azélaïque 10% + Acide Salicylique 2% + Prébiotiques
 </p></div><div class='text-13 font-black leading-none'><span>10,90€</span></div></div>
 
</a><hr class='invisible mt-10 h-0'>
 <button 
 
 
 class='relative flex justify-center items-center h-40 text-12/narrow font-bold uppercase transition-[border] ease-expo-out duration-700 hover:duration-100 border rounded-md px-16 border-black/20 hover:border-black w-full mt-auto'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:49662167089488,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Soin Flash Boutons&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 9729168212304, Categories: ["Crèmes","Soins du visage","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/Respire-Skincare-Soin-flash-bouton_1.jpg?v=1775632781&width=720", URL: "https://respire.co/products/soin-flash-boutons-tmp", Price: "10,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
>Ajouter</button>
</article>
<article class='group relative isolate flex flex-col span-w-6 lg:span-w-4'><a
 href='/products/serum-glow-and-protect'><div class='relative flex-shrink-0'>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&height=1198&v=1768405266&width=960 960w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&height=1497&v=1768405266&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&height=2396&v=1768405266&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&height=2994&v=1768405266&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=242&amp;v=1768405266&amp;width=194" alt="Sérum Glow &amp; Protect" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=60&amp;v=1768405266&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=120&amp;v=1768405266&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=200&amp;v=1768405266&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=399&amp;v=1768405266&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?crop=center&amp;height=798&amp;v=1768405266&amp;width=640 640w" sizes="51vw" class="w-full" draggable="false">
</picture>
 
 
 
<picture
 class="block absolute inset-0 opacity-0 transition-opacity duration-1000 ease-expo-out group-focus-within:opacity-100 group-hover:duration-100 group-hover:opacity-100 lg-max:hidden"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&height=1198&v=1770808338&width=960 960w,//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&height=1497&v=1770808338&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&height=2396&v=1770808338&width=1920 1920w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&amp;height=242&amp;v=1770808338&amp;width=194" alt="Sérum Glow &amp; Protect" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&amp;height=60&amp;v=1770808338&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&amp;height=120&amp;v=1770808338&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&amp;height=200&amp;v=1770808338&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&amp;height=399&amp;v=1770808338&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Skincare-Boost-Serum-Application.jpg?crop=center&amp;height=798&amp;v=1770808338&amp;width=640 640w" sizes="51vw" class="w-full" draggable="false">
</picture>
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Sérum Glow & Protect</h2><p class='line-clamp-1 text-13/narrow'>
 Vitamine C brevetée + SPF30
 </p></div><div class='text-13 font-black leading-none'><span>27,90€</span></div></div>
 
</a><hr class='invisible mt-10 h-0'>
 <button 
 
 
 class='relative flex justify-center items-center h-40 text-12/narrow font-bold uppercase transition-[border] ease-expo-out duration-700 hover:duration-100 border rounded-md px-16 border-black/20 hover:border-black w-full mt-auto'
 
 
x-data='{loading: false}' @click='loading=true; liquidAjaxCart.add({items:[{id:49851692024144,quantity: 1}]} , {firstCallback: () => { loading = false; var item = { Name: &quot;Sérum Glow \u0026 Protect&quot;, ProductType: "Unitaire", ProductVariant: &quot;Default Title&quot;, ProductID: 9791127093584, Categories: ["Soins du visage","Sérums","Tous les produits"], ImageURL: "https://respire.co/cdn/shop/files/Respire-Soin-Visage-Serum-Glow-Packshot.jpg?v=1768405266&width=720", URL: "https://respire.co/products/serum-glow-and-protect", Price: "27,90" }; _learnq.push(["track", "Added to Cart", item]); }})'
 
 
 
 
 
 type='button'
 
 
 
 
 
 
>Ajouter</button>
</article>

 </div><nav
 class='absolute -top-18 !mt-0 right-0'><button
 type='button'
 x-ref='prevButton'
 @click='handlePrev'
 class='slideshow-prev'
 aria-label='Page précédente'
 ><svg viewbox='0 0 18 19' fill='none' xmlns='http://www.w3.org/2000/svg' class='w-16 h-16 rotate-180'><path d="m9 14.15-.67-.68 3.84-3.84H4v-.96h8.17L8.33 4.83 9 4.15l5 5-5 5Z" fill="currentColor"/></svg></button><button
 type='button'
 x-ref='nextButton'
 @click='handleNext'
 class='slideshow-next'
 aria-label='Page suivante'
 ><svg viewbox='0 0 18 19' fill='none' xmlns='http://www.w3.org/2000/svg' class='w-16 h-16'><path d="m9 14.15-.67-.68 3.84-3.84H4v-.96h8.17L8.33 4.83 9 4.15l5 5-5 5Z" fill="currentColor"/></svg></button></nav>
</div>
 </div></div></div>

<div
 x-data='slideshow({groupBy:1,autoPlayInterval:4000,disableLg:false,loop:false, displayChildrenCountMobile:-1, displayChildrenCountDesktop: -1})'
 
 class='relative border-b border-t border-grey-light py-16 mb-8'
 
><ul
 x-ref='wrapper'
 @touchstart='handleTouchStart'
 class='flex [&>*]:shrink-0 justify-start items-stretch [&>*]:snap-center overflow-x-auto overscroll-x-contain scrollbar-hide snap-x snap-mandatory scroll-smooth'
 >
 <li class='w-full'><h3 class='text-13/none font-black'>Livraison offerte</h3><p class='text-13 text-grey-dark'>dès 45€ d'achat</p></li><li class='w-full'><h3 class='text-13/none font-black'>Un soin offert</h3><p class='text-13 text-grey-dark'>dès 70€ d'achat</p></li><li class='w-full'><h3 class='text-13/none font-black'>Livraison rapide</h3><p class='text-13 text-grey-dark'>sous 4 à 5 jours ouvrés</p></li><li class='w-full'><h3 class='text-13/none font-black'>Paiements sécurisés</h3><p class='text-13 text-grey-dark'>Par carte bancaire ou PayPal</p></li>
 </ul><div
 x-ref='dots'
 class='slideshow-dots absolute !mt-0 right-0 top-1/2 -translate-y-1/2'
 role='group'
 >
 
 <button
 class='slideshow-dot'
 :class='{"is-active": index === 0 }'
 :aria-current='index === 0'
 aria-label=' 1'
 @click='handleNavChange(0)'
 type='button'
 ></button>
 
 <button
 class='slideshow-dot'
 :class='{"is-active": index === 1 }'
 :aria-current='index === 1'
 aria-label=' 2'
 @click='handleNavChange(1)'
 type='button'
 ></button>
 
 <button
 class='slideshow-dot'
 :class='{"is-active": index === 2 }'
 :aria-current='index === 2'
 aria-label=' 3'
 @click='handleNavChange(2)'
 type='button'
 ></button>
 
 <button
 class='slideshow-dot'
 :class='{"is-active": index === 3 }'
 :aria-current='index === 3'
 aria-label=' 4'
 @click='handleNavChange(3)'
 type='button'
 ></button></div>
</div><div data-ajax-cart-section><div class='flex flex-col gap-8'></div></div></section>
 </div><div class="bg-serenade py-20 margin-px-1 -margin-mx-1" x-data=NO NUMERIC NOISE KEY 1130 x-on:liquid-ajax-cart:queue-start.document="loading=!loading" x-on:liquid-ajax-cart:queue-end.document="loading=false">
 <div data-ajax-cart-section>
 
 
 <div 
 x-data="progressBar({ value: '0.0', textTo: 'Plus que <strong>{{money}}</strong> pour bénéficier de <strong>{{product}}</strong>', textReached: 'Félicitations ! Vous avez gagné <strong>{{product}}</strong> !' })"
 x-effect="updateProgress()"
 @cart-updated.window="init()"
 class="mb-12 rounded-md bg-serenade px-10 pb-10 lg:mb-20"
 ><div x-show="!utmDiscountActive"><div><h2 class='mb-6 text-12'>
 Plus que <strong>45,00€</strong> pour bénéficier de la <strong>livraison offerte</strong> en point relais
 </h2><div class='relative h-3 w-full overflow-clip rounded-full bg-black/20' aria-label='0.0%'><span class='absolute left-0 top-0 h-full bg-black' style='width:0.0%'></span></div></div></div><div x-show="utmDiscountActive"><div><h2 class="mb-6 text-12" x-html="title"></h2><div class="relative h-3 w-full overflow-clip rounded-full bg-black/20" :aria-label="percent + '%'"><span class="absolute left-0 top-0 h-full bg-black" :style="'width:' + percent + '%'"></span></div></div></div></div></div>
 </div></form><div
 class="fixed left-0 top-0 z-100 h-full w-full bg-black/20"
 @click="$store.global.isMinicartVisible=false"
 x-show="$store.global.isMinicartVisible"
 x-transition:enter="transition-[opacity,visibility] ease-expo-out duration-700 transform-gpu"
 x-transition:enter-start="opacity-0 invisible"
 x-transition:enter-end="opacity-100 visible"
 x-transition:leave="transition-[opacity,visibility] ease-quart-inout duration-700 transform-gpu"
 x-transition:leave-start="opacity-100 visible"
 x-transition:leave-end="opacity-0 invisible"
 x-cloak
></div></div><div
 
 x-data='{"isOpened": false}'
 
><aside
 class="fixed right-0 top-0 z-101 flex h-full w-full flex-col bg-white margin-px-1 lg:box-content lg:span-w-12"
 x-show="isOpened"
 x-transition:enter="transition-transform ease-expo-out duration-700 transform-gpu"
 x-transition:enter-start="translate-x-full"
 x-transition:leave="transition-transform ease-quart-inout duration-700 transform-gpu"
 x-transition:leave-end="translate-x-full"
 x-cloak
 x-on:openfreeproducts.window="isOpened=true"
 aria-modal="true"
 role="dialog"
 x-trap.inert="isOpened"
 @keydown.escape.window="isOpened = false"
 x-init='$watch("isOpened", shouldLock => $store.global.bodyScrollLock(shouldLock))'
 ><div
 
 
 
 role="heading"
 
 labelledby="vous-avez-un-soin-offert"
 
 ><div class="relative z-2 flex h-48 items-center justify-between gap-4"><h2
 id="vous-avez-un-soin-offert"
 class="text-13 font-black"
 
 >
 Vous avez un soin offert !
 </h2>
 <button
 type="button"
 @click="isOpened=false"
 class="-mr-8 p-8"
 aria-label="Fermer"
 >
 <svg fill='none' viewbox='0 0 15 14' xmlns='http://www.w3.org/2000/svg' class='w-14 h-14'><path d="M1.93 13.86.84 12.77 6.61 7 .84 1.23 1.93.14 7.7 5.91 13.47.14l1.09 1.09L8.78 7l5.78 5.77-1.09 1.09L7.7 8.09z" fill="currentColor"/></svg>
 </button></div>
 
 </div><div
 class="flex h-full flex-col overflow-y-auto overscroll-contain scrollbar-hide"
 data-lenis-prevent
>
 <div data-ajax-cart-section x-data='freeProducts({productIds:[9746512904528], productThreshold:70 || 0})' @cart-updated.window="onCartUpdate()"><div class='flex flex-wrap gap-y-20 pb-20 gutter-gap-x-1'><article class='group relative isolate flex flex-col span-w-6 flex flex-col'><div class='relative flex-shrink-0'><span class='absolute right-0 top-0 z-1 block p-14 text-13/narrower font-bold'>[ New ]</span>
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&height=1198&v=1776679718&width=960 960w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&height=1497&v=1776679718&width=1200 1200w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&height=2396&v=1776679718&width=1920 1920w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&height=2994&v=1776679718&width=2400 2400w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=242&amp;v=1776679718&amp;width=194" alt="Stick Solaire Matifiant SPF50+" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=60&amp;v=1776679718&amp;width=48 48w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=120&amp;v=1776679718&amp;width=96 96w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=200&amp;v=1776679718&amp;width=160 160w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=399&amp;v=1776679718&amp;width=320 320w,//respire.co/cdn/shop/files/Respire-Stick-Solaire-Stick-Solaire-Prime.jpg?crop=center&amp;height=798&amp;v=1776679718&amp;width=640 640w" sizes="51vw" class="w-full">
</picture>
 
 
 
 </div><div class='mt-12 flex flex-col gap-6'>
 <div class='flex flex-col'><h2 class='text-13/narrow font-black'>Stick Solaire Matifiant SPF50+</h2><p class='line-clamp-1 text-13/narrow'>
 Très Haute Protection UVA/B + Bakuchiol
 </p></div><div class='text-13 font-black leading-none'><span>OFFERT</span><span class='ml-4 text-grey line-through'>13,90€</span></div></div>
 <div class='mt-auto'>
<button 
 
 
 class='relative flex justify-center items-center h-40 text-12/narrow font-bold uppercase transition-[border] ease-expo-out duration-700 hover:duration-100 border rounded-md px-16 border-black/20 hover:border-black mt-12 w-full'
 
 
 
 x-data
 @click='selectFreeProduct(49706032070992);isOpened=false'
 
 
 
 
 
 
 
 
 
>Sélectionner</button></div>
</article><div class='flex flex-col span-w-6'>
 
 
 
 
 
 
 <picture
 class="block"
 ><source
 media="(min-width: 1024px)"
 sizes="22vw"
 srcset="//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_7b911236-e33d-486a-b43b-5f4d8e457dc5.jpg?crop=center&height=1198&v=1736933334&width=960 960w"
 width="323"
 height="403"
 ><img src="//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_7b911236-e33d-486a-b43b-5f4d8e457dc5.jpg?crop=center&amp;height=242&amp;v=1736933334&amp;width=194" alt="" width="194" height="242" loading="lazy" srcset="//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_7b911236-e33d-486a-b43b-5f4d8e457dc5.jpg?crop=center&amp;height=60&amp;v=1736933334&amp;width=48 48w,//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_7b911236-e33d-486a-b43b-5f4d8e457dc5.jpg?crop=center&amp;height=120&amp;v=1736933334&amp;width=96 96w,//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_7b911236-e33d-486a-b43b-5f4d8e457dc5.jpg?crop=center&amp;height=200&amp;v=1736933334&amp;width=160 160w,//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_7b911236-e33d-486a-b43b-5f4d8e457dc5.jpg?crop=center&amp;height=399&amp;v=1736933334&amp;width=320 320w,//respire.co/cdn/shop/files/Skin_House_Google_Pixel_2_1_7b911236-e33d-486a-b43b-5f4d8e457dc5.jpg?crop=center&amp;height=798&amp;v=1736933334&amp;width=640 640w" sizes="51vw" class="w-full" draggable="false">
</picture>
 
 
 <div class='mt-10 flex flex-col gap-6 lg:mt-12'><h2 class='text-13/narrow font-black'>Non, merci.</h2><p class='text-13 font-black uppercase leading-none'>Merci</p></div><div class='mt-auto'>
<button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out h-40 bg-black hover:bg-grey-dark text-white mt-12 w-full'
 
 
 
 x-data
 @click='selectFreeProduct("none");$dispatch("show-no-free-gift", true);isOpened=false'
 
 
 
 
 
 
 
 
 
>Sélectionné</button></div></div></div>
 
 </div>
 </div></aside><div
 class="fixed left-0 top-0 z-100 h-full w-full bg-black/20"
 @click="isOpened=false"
 x-show="isOpened"
 x-transition:enter="transition-[opacity,visibility] ease-expo-out duration-700 transform-gpu"
 x-transition:enter-start="opacity-0 invisible"
 x-transition:enter-end="opacity-100 visible"
 x-transition:leave="transition-[opacity,visibility] ease-quart-inout duration-700 transform-gpu"
 x-transition:leave-start="opacity-100 visible"
 x-transition:leave-end="opacity-0 invisible"
 x-cloak
></div></div><style> #shopify-section-sections--26281148383568__minicart .bg-serenade {--tw-bg-opacity: 1; background-color: white;} </style></section>
<!-- END sections: footer-group --><script type='application/json' data-ajax-cart-initial-state>
 {"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":"EUR","items_subtotal_price":0,"cart_level_discount_applications":[],"checkout_charge_amount":0}
</script>
<div x-data='gpdr({preconsent:{necessary:true,performance:false,functional:false,advertising:false}, cookiesUrl:"https://edge.cookiefirst.com/prod/site-cookies?api_key=29472ba3-d46b-41a6-9042-26b28d76cbce&lang=es&version=2e7a7b93-b92e-4288-af84-4711a911f229&origin=respire.co"})'><aside
 x-cloak
 x-show='shouldShow'
 x-transition:enter='transition ease-expo-out duration-500'
 x-transition:enter-start='translate-y-full'
 x-transition:enter-end='translate-y-0'
 x-transition:leave='transition ease-quart-inout duration-500'
 x-transition:leave-start='translate-y-0'
 x-transition:leave-end='translate-y-full'
 role='alertdialog'
 class='fixed bottom-0 z-101 cursor-none touch-none border-transparent span-w-12 margin-left-1 margin-border-b-1'
 aria-labelledby='cookie-settings'
 ><div class='flex cursor-auto flex-col gap-10 bg-white p-20 lg-max:flex-col'><h2 id='cookie-settings' class='text-left text-16 font-bold'>Nous utilisons des cookies</h2><div class='text-13 leading-tight text-grey lg:mr-20 lg-max:margin-mb-1 [&_a]:underline'>
 <p>Nous pouvons les utiliser pour analyser les données de nos visiteurs, améliorer notre site web, afficher du contenu personnalisé et vous offrir une excellente expérience sur le site web. Pour plus d'informations sur les cookies que nous utilisons, ouvrez les paramètres.</p>
 </div><div class='flex w-full gap-10'><button 
 
 
 class='relative flex justify-center items-center h-40 text-12/narrow font-bold uppercase transition-[border] ease-expo-out duration-700 hover:duration-100 border rounded-md px-16 border-black/20 hover:border-black w-full'
 
 
@click="$store.gpdr.isSlideoutOpened=true"
 
 
 
 
 
 type='button'
 
 
 
 
 
 
>Je choisis</button>
<button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out h-40 bg-black hover:bg-grey-dark text-white w-full'
 
 
@click="acceptAllConsent()"
 
 
 
 
 
 type='button'
 
 
 
 
 
 
>Tout accepter</button>
 </div></div></aside><div
 
><form
 class="fixed right-0 top-0 z-101 flex h-full w-full flex-col bg-white margin-px-1 lg:box-content lg:span-w-12"
 x-show="$store.gpdr.isSlideoutOpened"
 x-transition:enter="transition-transform ease-expo-out duration-700 transform-gpu"
 x-transition:enter-start="translate-x-full"
 x-transition:leave="transition-transform ease-quart-inout duration-700 transform-gpu"
 x-transition:leave-end="translate-x-full"
 x-cloak
 ref="form" x-on:submit.prevent="submitConsent"
 aria-modal="true"
 role="dialog"
 x-trap.inert="$store.gpdr.isSlideoutOpened"
 @keydown.escape.window="$store.gpdr.isSlideoutOpened = false"
 x-init='$watch("$store.gpdr.isSlideoutOpened", shouldLock => $store.global.bodyScrollLock(shouldLock))'
 ><div
 
 
 
 role="heading"
 
 labelledby="nous-utilisons-des-cookies"
 
 ><div class="relative z-2 flex h-48 items-center justify-between gap-4"><h2
 id="nous-utilisons-des-cookies"
 class="text-13 font-black"
 
 >
 Nous utilisons des cookies
 </h2>
 <button
 type="button"
 @click="$store.gpdr.isSlideoutOpened=false"
 class="-mr-8 p-8"
 aria-label="Fermer"
 >
 <svg fill='none' viewbox='0 0 15 14' xmlns='http://www.w3.org/2000/svg' class='w-14 h-14'><path d="M1.93 13.86.84 12.77 6.61 7 .84 1.23 1.93.14 7.7 5.91 13.47.14l1.09 1.09L8.78 7l5.78 5.77-1.09 1.09L7.7 8.09z" fill="currentColor"/></svg>
 </button></div>
 <nav class='mt-20 flex text-14' role='tablist'><button 
 
 
 class='relative w-full pb-10 border-b uppercase font-bold text-12'
 
 
role="tab" @click="tabIndex=0" :class="tabIndex === 0 ? 'border-b-black' : 'border-b-grey-light'"
 
 
 
 
 
 type='button'
 
 
 
 
 
 
>Paramètres</button>
<button 
 
 
 class='relative w-full pb-10 border-b uppercase font-bold text-12'
 
 
role="tab" @click="tabIndex=1" :class="tabIndex === 1 ? 'border-b-black' : 'border-b-grey-light'"
 
 
 
 
 
 type='button'
 
 
 
 
 
 
>Cookies</button>
 </nav>
 </div><div
 class="flex h-full flex-col overflow-y-auto overscroll-contain scrollbar-hide"
 data-lenis-prevent
>
 <div role='tabpanel' id='cookie-settings-tab' aria-labelledby='cookie-settings' x-show="tabIndex === 0"><p class='mb-20 text-12'></p><div class='mb-20 text-12'><div class='mb-5 flex items-center justify-between border-b border-b-grey-light pb-5'><h3 class='text-16 font-bold'>Nécessaires</h3>
 

<div
 x-data='{ checked: true }'
 class='relative  mr-2'
><input
 type='checkbox'
 id='necessary'
 name='necessary'
 
 
 disabled
 x-model='checked'
 class='peer pointer-events-none absolute inset-0 opacity-0'
 
 aria-label='necessary'
 
 
 ><label
 for='necessary'
 class='relative inline-flex cursor-pointer select-none items-start gap-8 text-left text-grey  text-black cursor-not-allowed opacity-60 pointer-events-none before:outline-grey-blue border-solid before:block before:h-[16px] before:w-[36px] before:shrink-0 before:rounded-full before:border before:border-black before:outline-offset-1 before:transition-colors before:duration-300 before:ease-quart-out after:absolute after:left-[2px] after:top-[2px] after:block after:h-[12px] after:w-[12px] after:origin-center after:transform-gpu after:rounded-full after:border after:bg-white after:transition-transform after:duration-300 after:ease-quart-out peer-checked:before:!bg-black peer-checked:after:translate-x-[20px] peer-checked:after:bg-white peer-focus-visible:before:outline'
 >
 
 </label></div></div><p class='text-left'>Ces cookies sont nécessaires au bon fonctionnement de notre site web et ne peuvent pas être désactivés dans notre système.</p></div><div class='mb-20 text-12'><div class='mb-5 flex items-center justify-between border-b border-b-grey-light pb-5'><h3 class='text-16 font-bold'>Performance</h3>
 

<div
 x-data='{ checked: false }'
 class='relative  mr-2'
><input
 type='checkbox'
 id='performance'
 name='performance'
 
 
 x-model='checked'
 class='peer pointer-events-none absolute inset-0 opacity-0'
 
 aria-label='performance'
 
 
 ><label
 for='performance'
 class='relative inline-flex cursor-pointer select-none items-start gap-8 text-left text-grey  text-black  before:outline-grey-blue border-solid before:block before:h-[16px] before:w-[36px] before:shrink-0 before:rounded-full before:border before:border-black before:outline-offset-1 before:transition-colors before:duration-300 before:ease-quart-out after:absolute after:left-[2px] after:top-[2px] after:block after:h-[12px] after:w-[12px] after:origin-center after:transform-gpu after:rounded-full after:border after:bg-white after:transition-transform after:duration-300 after:ease-quart-out peer-checked:before:!bg-black peer-checked:after:translate-x-[20px] peer-checked:after:bg-white peer-focus-visible:before:outline'
 >
 
 </label></div></div><p class='text-left'>Nous utilisons ces cookies pour fournir des informations statistiques sur notre site web ; ils sont utilisés pour mesurer et améliorer les performances.</p></div><div class='mb-20 text-12'><div class='mb-5 flex items-center justify-between border-b border-b-grey-light pb-5'><h3 class='text-16 font-bold'>Fonctionnels</h3>
 

<div
 x-data='{ checked: false }'
 class='relative  mr-2'
><input
 type='checkbox'
 id='functional'
 name='functional'
 
 
 x-model='checked'
 class='peer pointer-events-none absolute inset-0 opacity-0'
 
 aria-label='functional'
 
 
 ><label
 for='functional'
 class='relative inline-flex cursor-pointer select-none items-start gap-8 text-left text-grey  text-black  before:outline-grey-blue border-solid before:block before:h-[16px] before:w-[36px] before:shrink-0 before:rounded-full before:border before:border-black before:outline-offset-1 before:transition-colors before:duration-300 before:ease-quart-out after:absolute after:left-[2px] after:top-[2px] after:block after:h-[12px] after:w-[12px] after:origin-center after:transform-gpu after:rounded-full after:border after:bg-white after:transition-transform after:duration-300 after:ease-quart-out peer-checked:before:!bg-black peer-checked:after:translate-x-[20px] peer-checked:after:bg-white peer-focus-visible:before:outline'
 >
 
 </label></div></div><p class='text-left'>Nous utilisons ces cookies pour améliorer les fonctionnalités et permettre la personnalisation, comme les chats en direct, les vidéos et l'utilisation des réseaux sociaux.</p></div><div class='mb-20 text-12'><div class='mb-5 flex items-center justify-between border-b border-b-grey-light pb-5'><h3 class='text-16 font-bold'>Publicité</h3>
 

<div
 x-data='{ checked: false }'
 class='relative  mr-2'
><input
 type='checkbox'
 id='advertising'
 name='advertising'
 
 
 x-model='checked'
 class='peer pointer-events-none absolute inset-0 opacity-0'
 
 aria-label='advertising'
 
 
 ><label
 for='advertising'
 class='relative inline-flex cursor-pointer select-none items-start gap-8 text-left text-grey  text-black  before:outline-grey-blue border-solid before:block before:h-[16px] before:w-[36px] before:shrink-0 before:rounded-full before:border before:border-black before:outline-offset-1 before:transition-colors before:duration-300 before:ease-quart-out after:absolute after:left-[2px] after:top-[2px] after:block after:h-[12px] after:w-[12px] after:origin-center after:transform-gpu after:rounded-full after:border after:bg-white after:transition-transform after:duration-300 after:ease-quart-out peer-checked:before:!bg-black peer-checked:after:translate-x-[20px] peer-checked:after:bg-white peer-focus-visible:before:outline'
 >
 
 </label></div></div><p class='text-left'>Ces cookies sont placés sur notre site par nos partenaires publicitaires.</p></div></div><div role='tabpanel' id='cookie-list-tab' aria-labelledby='cookie-list' x-show="tabIndex === 1"><template x-if="isLoading">
 <div
 role='status'
 class='pointer-events-none w-18'
 aria-label='Loading...'
><svg
 viewbox='0 0 100 101'
 fill='none'
 xmlns='http://www.w3.org/2000/svg'
 class='animate-[spin_600ms_linear_infinite] fill-current'
 aria-hidden='true'
 ><path d='M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z' fill='currentColor' opacity='0.3' /><path d='M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z' fill='currentFill' /></svg></div>
 </template><template x-if="!isLoading && cookies.length"><ul class='flex flex-col gap-y-20 py-20'><template x-for="cookie in cookies" :key="cookie.id"><li class="text-12"><h3 class='mb-7 border-b border-b-grey-light pb-5 text-16 font-bold' x-text="cookie.name"></h3><template x-if="cookie.desc"><p class='mb-5' x-text="cookie.desc"></p></template><template x-if="cookie.domain"><dl class='flex'><dt class='mr-5 font-bold'>Nom de domaine: </dt><dd x-text="cookie.domain"></dd></dl></template><template x-if="cookie.type"><dl class='flex'><dt class='mr-5 font-bold'>Type: </dt><dd x-text="cookie.type"></dd></dl></template><template x-if="cookie.q1"><dl class='flex'><dt class='mr-5 font-bold'>Fournisseur: </dt><dd x-text="cookie.q1"></dd></dl></template><dl class='flex'><dt class='mr-5 font-bold'>Expiration: </dt><dd x-text="cookie.expiration_time"></dd></dl></li></template></ul></template></div>
 </div><div class="bg-serenade py-20 margin-px-1 -margin-mx-1" >
 <div class='flex gutter-gap-1 lg-max:flex-col lg-max:margin-my-1'>
 <button 
 
 
 class='relative flex justify-center items-center h-40 text-12/narrow font-bold uppercase transition-[border] ease-expo-out duration-700 hover:duration-100 border rounded-md px-16 border-black/20 hover:border-black w-full'
 
 
 
 
 
 
 
 
 
 
 
 
>Enregistrer les paramètres</button>
 <button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out h-40 bg-black hover:bg-grey-dark text-white w-full'
 
 
@click="acceptAllConsent()"
 
 
 
 
 
 
 
 
 
 
>Tout accepter</button>
 </div>
 </div></form><div
 class="fixed left-0 top-0 z-100 h-full w-full bg-black/20"
 @click="$store.gpdr.isSlideoutOpened=false"
 x-show="$store.gpdr.isSlideoutOpened"
 x-transition:enter="transition-[opacity,visibility] ease-expo-out duration-700 transform-gpu"
 x-transition:enter-start="opacity-0 invisible"
 x-transition:enter-end="opacity-100 visible"
 x-transition:leave="transition-[opacity,visibility] ease-quart-inout duration-700 transform-gpu"
 x-transition:leave-start="opacity-100 visible"
 x-transition:leave-end="opacity-0 invisible"
 x-cloak
></div></div></div>





<div
 x-data="modalGeoIp"
 @keydown.escape.window="showModal = false"
 x-init='$watch("showModal", shouldLock => $store.global.bodyScrollLock(shouldLock))'
>
 
 

 
 <template x-teleport="body"><aside
 x-show="showModal"
 class="fixed inset-0 isolate z-12"
 aria-labelledby="modal-title"
 role="dialog"
 aria-modal="true"
 x-trap="showModal"
 :inert="!showModal"
 @keydown.escape.window="showModal = false"
 ><div class="grid min-h-screen place-items-center"><div
 x-cloak
 @click="showModal = false; "
 x-show="showModal"
 x-transition:enter="transition ease-out-expo duration-400"
 x-transition:enter-start="opacity-0"
 x-transition:enter-end="opacity-100"
 x-transition:leave="transition ease-in-cubic duration-300"
 x-transition:leave-start="opacity-100"
 x-transition:leave-end="opacity-0"
 class="fixed inset-0 bg-black/40 transition-opacity"
 aria-hidden="true"
 ></div><div
 x-cloak
 x-show="showModal"
 x-transition:enter="transition ease-out-expo duration-400"
 x-transition:enter-start="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
 x-transition:enter-end="opacity-100 translate-y-0 sm:scale-100"
 x-transition:leave="transition ease-in-cubic duration-300"
 x-transition:leave-start="opacity-100 translate-y-0 sm:scale-100"
 x-transition:leave-end="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
 @click.away="showModal = false"
 class="z-1 overflow-y-auto  bg-white text-black absolute bottom-20 left-1/2 -translate-x-1/2 lg:relative lg:bottom-auto lg:left-auto lg:translate-x-0 w-[calc(100%-40px)] max-w-374 lg:max-w-[464px] !px-20 !pb-20 !pt-22 rounded-lg max-h-[75vh span-w-12 span-p-1 lg:span-w-14"
 >
 
 <div class="flex items-center justify-between pb-50"><h3 class="text-12/none font-bold uppercase -tracking-tight">Région</h3><button @click="showModal = false" class="group grid h-24 w-24 cursor-pointer place-items-center focus:outline-none" type="button"><svg
 class="h-24 w-24 transition-transform duration-450 ease-expo-out group-hover:rotate-90 group-focus:rotate-90"
 xmlns="http://www.w3.org/2000/svg"
 viewbox="0 0 24 24"
 fill="none"
 stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /></svg></button></div>


 <div><h4 class="text-26/none font-black tracking-tighter text-center">Changer de localisation</h4><form id="geo-ip-form" action="/localization" method="POST" @submit="setGeoIpSession"><input type="hidden" name="_method" value="PUT"><input type="hidden" name="country_code" :value="suggestion?.country?.handle ?? ''"><input type="hidden" name="language_code" :value="suggestion?.language?.handle ?? ''"></form><div class="mt-16 px-24"><p class="text-center text-13 leading-tight font-normal" x-html="text"></p></div><template x-if="suggestion?.country?.handle"><div class="mt-32 lg:mt-48 flex flex-col gap-12">
 <button 
 
 
 class='relative flex justify-center items-center text-12/narrow font-bold rounded-md px-16 uppercase transition-[background] duration-700 hover:duration-300 ease-expo-out h-40 bg-black hover:bg-grey-dark text-white w-full'
 
 
type="submit" form="geo-ip-form"
 
 
 
 
 
 
 
 
 
 
><span x-html="labelGoToDetectedSite"></span></button>
 <button 
 
 
 class='relative flex justify-center items-center h-40 text-12/narrow font-bold uppercase transition-[border] ease-expo-out duration-700 hover:duration-100 border rounded-md px-16 border-black/20 hover:border-black w-full'
 
 
@click="showModal = false"
 
 
 
 
 
 
 
 
 
 
><span x-html="labelStayOnCurrentSite"></span></button>
 </div></template></div>


 </div></div></aside></template></div><script type='module' defer>
 document.documentElement.style.setProperty('--sbw', window.innerWidth - document.body.offsetWidth + 'px')
</script><div id="shopify-block-ARExFU25Wa0dyOGZGU__6251270934270006384" class="shopify-block shopify-app-block"><script>
  window.lsData = {};
  window.dataLayer = window.dataLayer || [];
  window.addEventListener("message", (event) => {
    if (event.data?.event) {
      window.dataLayer.push(event.data);
    }
  });
  window.dataShopStape = {
    shop: "respire.co",
    shopId: "6910672978",
  }
</script>






  <script>
    console.log("⚠️ User not logged in");
    window.localStorage.removeItem('customerShopStape');
  </script>



<script>
  window.collectionShopStape = window.collectionShopStape || {
    id: 617159885136,
    handle: "deodorant",
    products: []
  };

  try {
    window.collectionShopStape.products.push(
      
        {
          id: 10533813682512,
          title: "Déodorant stick Vanille Tonka",
          handle: "deodorant-stick-vanille-tonka",
          price: 11.9,
          compare_at_price: 0.0,
          variants: [
            
              {
                id: 53158969409872,
                title: "Default Title",
                price: 11.9,
                compare_at_price: 0.0,
                available: true
              }
            
          ]
        },
      
        {
          id: 10533855002960,
          title: "Recharge Déodorant stick Vanille Tonka",
          handle: "recharge-deodorant-stick-vanille-tonka",
          price: 10.9,
          compare_at_price: 0.0,
          variants: [
            
              {
                id: 53159300137296,
                title: "Default Title",
                price: 10.9,
                compare_at_price: 0.0,
                available: true
              }
            
          ]
        },
      
        {
          id: 8782815199568,
          title: "Déodorant stick Fleur de Coton",
          handle: "deodorant-stick-fleur-de-coton-efficace-48h",
          price: 11.9,
          compare_at_price: 0.0,
          variants: [
            
              {
                id: 47868480192848,
                title: "Default Title",
                price: 11.9,
                compare_at_price: 0.0,
                available: true
              }
            
          ]
        },
      
        {
          id: 9031400096080,
          title: "Recharge Déodorant stick Fleur de Coton",
          handle: "recharge-deodorant-stick-fleur-de-coton-efficace-48h",
          price: 10.9,
          compare_at_price: 0.0,
          variants: [
            
              {
                id: 48204010226000,
                title: "Default Title",
                price: 10.9,
                compare_at_price: 0.0,
                available: true
              }
            
          ]
        },
      
        {
          id: 9031231734096,
          title: "Déodorant stick Douceur Monoï",
          handle: "deodorant-stick-douceur-monoi-efficace-48h",
          price: 11.9,
          compare_at_price: 0.0,
          variants: [
            
              {
                id: 48203443339600,
                title: "Default Title",
                price: 11.9,
                compare_at_price: 0.0,
                available: true
              }
            
          ]
        },
      
        {
          id: 10056944058704,
          title: "Recharge Déodorant stick Douceur Monoï",
          handle: "recharge-deodorant-stick-douceur-monoi",
          price: 10.9,
          compare_at_price: 0.0,
          variants: [
            
              {
                id: 51213849166160,
                title: "Default Title",
                price: 10.9,
                compare_at_price: 0.0,
                available: true
              }
            
          ]
        },
      
        {
          id: 9031216726352,
          title: "Déodorant stick Menthe Eucalyptus",
          handle: "deodorant-stick-menthe-eucalyptus-efficace-48h",
          price: 11.9,
          compare_at_price: 0.0,
          variants: [
            
              {
                id: 48203367907664,
                title: "Default Title",
                price: 11.9,
                compare_at_price: 0.0,
                available: true
              }
            
          ]
        },
      
        {
          id: 10230175039824,
          title: "Recharge Déodorant stick Menthe Eucalyptus",
          handle: "recharge-deodorant-stick-menthe-eucalyptus",
          price: 10.9,
          compare_at_price: 0.0,
          variants: [
            
              {
                id: 51977152168272,
                title: "Default Title",
                price: 10.9,
                compare_at_price: 0.0,
                available: true
              }
            
          ]
        },
      
        {
          id: 9555900465488,
          title: "Déodorant stick Rose Pivoine",
          handle: "deodorant-stick-rose-pivoine-efficace-48h",
          price: 11.9,
          compare_at_price: 0.0,
          variants: [
            
              {
                id: 49142707585360,
                title: "Default Title",
                price: 11.9,
                compare_at_price: 0.0,
                available: true
              }
            
          ]
        },
      
        {
          id: 10059497963856,
          title: "Recharge Déodorant stick Rose Pivoine",
          handle: "recharge-deodorant-stick-rose-pivoine",
          price: 10.9,
          compare_at_price: 0.0,
          variants: [
            
              {
                id: 51236124393808,
                title: "Default Title",
                price: 10.9,
                compare_at_price: 0.0,
                available: true
              }
            
          ]
        },
      
        {
          id: 9781986787664,
          title: "Déodorant stick Yuzu Basilic Énergisant",
          handle: "deodorant-stick-yuzu-basilic",
          price: 11.9,
          compare_at_price: 0.0,
          variants: [
            
              {
                id: 49820378464592,
                title: "Default Title",
                price: 11.9,
                compare_at_price: 0.0,
                available: true
              }
            
          ]
        },
      
        {
          id: 9818114490704,
          title: "Déodorant stick Fleur de Coton 20g",
          handle: "mini-deodorant-stick-fleur-de-coton",
          price: 6.9,
          compare_at_price: 0.0,
          variants: [
            
              {
                id: 49941366440272,
                title: "Default Title",
                price: 6.9,
                compare_at_price: 0.0,
                available: true
              }
            
          ]
        }
      
    );
  } catch (e) {
    console.warn('[ShopStape] collectionShopStape error', e);
  }
</script>


<script>
  window.currentShopifyMarketStapeId = null;
  try {
    window.currentShopifyMarketStapeId = "2434826419";
  } catch (error) {
    console.error("❌ Stape Error:", error);
  }
</script>




</div><div id="shopify-block-AMXlNNXM5SWtGZ0cxR__17151115064775110295" class="shopify-block shopify-app-block"><style data-recharge-theme='{"has_theme_customization": true, "design_mode": false }'>
  .recharge-theme {
    /* App */
    --recharge-app-background: #F9F8F4;
    --recharge-app-container: 1200px;
    --recharge-app-vertical-padding: 32px;

    /* Brand colors */
    
--recharge-color-brand: #467C99;

    /* Tints */
    --recharge-color-brand-120: #38637a;
    --recharge-color-brand-20: #6b96ad;
    --recharge-color-brand-40: #90b0c2;
    --recharge-color-brand-60: #b5cbd6;
    --recharge-color-brand-75: #d1dee6;
    --recharge-color-brand-85: #e3ebf0;

    /* Neutral */
    --recharge-color-neutral: hsl(201, 35%, 7%);
    --recharge-color-neutral-80: hsl(201, 7%, 25%);
    --recharge-color-neutral-70: hsl(201, 5%, 35%);
    --recharge-color-neutral-40: hsl(201, 3%, 63%);
    --recharge-color-neutral-10: hsl(201, 2%, 91%);
    

    /* Links */
    --recharge-button-secondary: #467C99;
    --recharge-button-secondary-120: #38637a;
    --recharge-button-secondary-60: #90b0c2;

    /* Images */
    --recharge-images-ratio: 1;

    /* Cards */
    
    --recharge-cards-background: #FFFFFF;
    

    
    --recharge-cards-border-color: RGBA(0,0,0,0);
    

    /* Fonts */
    --recharge-typography-scale: 16px;
    --recharge-typography-size-1: calc(3 * var(--recharge-typography-scale));
    --recharge-typography-size-2: calc(2.25 * var(--recharge-typography-scale));
    --recharge-typography-size-3: calc(1.625 * var(--recharge-typography-scale));
    --recharge-typography-size-4: calc(1.25 * var(--recharge-typography-scale));
    --recharge-typography-size-5: calc(1 * var(--recharge-typography-scale));
    --recharge-typography-size-6: calc(.875 * var(--recharge-typography-scale));

    /** Text **/
    --recharge-typography-light: #FFFFFF;
    --recharge-typography-primary: var(--recharge-color-neutral);
    --recharge-typography-secondary: var(--recharge-color-neutral-70);

    /* Corners */
    --recharge-corners-radius: 8px;

    --recharge-button-border-radius: 8px;
    

    /* Views */
    
    --recharge-views-background: #F9F8F4;
    

    /* Buttons */
    --recharge-button-font-family: inherit;
    --recharge-button-brand: var(--recharge-color-brand);
    --recharge-button-color: #FFFFFF;
  }
</style>

</div><div id="shopify-block-AbGs2R0xnSVR3dGZhd__9271244056961380716" class="shopify-block shopify-app-block"><script type='module' src='https://cdn.shopify.com/extensions/019f13a6-ddb3-7ce0-82a9-d947e7d2543b/discount-kit-551/assets/dk_cart.js'></script>
<script type='module' src='https://cdn.shopify.com/extensions/019f13a6-ddb3-7ce0-82a9-d947e7d2543b/discount-kit-551/assets/dk_gift-selector.js'></script>




<!-- BEGIN app snippet: core_script -->







<script>
  // Initialize DiscountKit namespace
  window.discount_kit = window.discount_kit || {};

  // Configuration and data
  window.discount_kit.config = {
    auto_gift: true,
    gift_selector_enabled: true,
    refresh_on_cart_change: true,
    prevent_readd_removed_gifts: false,
    custom_cart_update_event: "discount_kit:cart_changed",
    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":"EUR","items_subtotal_price":0,"cart_level_discount_applications":[],"checkout_charge_amount":0},
    collections: [],
    compare_at_prices: [],
    conversion_rate: 1.0,
    discounts: [
      
        
        
        {"id":"gid:\/\/shopify\/DiscountAutomaticNode\/1749460648272","discountType":"CUSTOM","discountTitle":"Free product","discountStatus":"ACTIVE","hasContext":false,"discountNode":{"config":{"value":{"flavour":"v1-legacy","allowB2b":false,"allowB2B":false,"onlyB2b":false,"appliesOncePerCustomer":false,"attributeKey":"_discount_kit","bucketRules":[{"name":"ALL_RESERVED"},{"name":"Free product","productFilter":[{"id":9746512904528,"variants":[]}],"cartLineAttributeFilter":"free"}],"cartAttribute":null,"currencyCode":null,"customerOperator":"oneOf","customerTags":null,"discountApplicationStrategy":"ALL","discountRules":[{"message":"Offert","messageTranslations":null,"recurring":false,"requireAllTargets":false,"discountValue":{"percentage":{"value":"100"}},"maxRecurrences":null,"currency":null,"fixedPrice":null,"targetParts":[{"bucket":"Free product","quantity":1,"targetSelectionStrategy":"cheapest_first"}],"useCompareAtPrice":false,"useMetafieldPrice":false,"conditionParts":[{"bucket":"ALL_RESERVED","quantity":null,"total":"70","uniqueProducts":null,"uniqueVariants":null,"operator":"greaterThanOrEqual","order":0},{"bucket":"Free product","quantity":1,"total":null,"uniqueProducts":null,"uniqueVariants":null,"operator":"greaterThanOrEqual","order":1},{"bucket":"ALL_RESERVED","quantity":1,"total":null,"uniqueProducts":null,"uniqueVariants":null,"operator":"greaterThanOrEqual","order":2}]}],"discountTitle":"Free product","discountType":"CUSTOM","fillingStrategy":"first","locationIds":null,"locationOperator":"oneOf","marketHandles":null,"marketOperator":"oneOf","metafieldKey":"","metafieldNamespace":"","useMetafieldDiscounts":false,"orderDiscountApplicationStrategy":"MAXIMUM","orderDiscountRules":[],"shippingDiscountApplicationStrategy":"ALL","shippingDiscountRules":[],"usageLimit":null,"consume":false}}},"startsAt":"2024-06-13T13:05:07Z","endsAt":null}
      
    ]
  };

  // Gift products for GWP
  window.discount_kit.gift_products = [];
  
</script>

<script
  type='module'
  src='https://cdn.shopify.com/extensions/019f13a6-ddb3-7ce0-82a9-d947e7d2543b/discount-kit-551/assets/dk_core.js'
></script>
<!-- END app snippet -->




  <!-- BEGIN app snippet: gift_selector_html --><style data-shopify>
:root {
--dk-color-backgroundPrimary: #ffffff;
--dk-color-backgroundSecondary: #000000;
--dk-color-textPrimary: #000000;
--dk-color-textSecondary: #ffffff;
}
</style>
<gift-selector
  customcss=''
  refresh='true'
  showoncartpage='false'
  stopshowingafter='0'
  storefront_token='c5da6b4a008c14f4fbf5b8a09ed3712a'
>
<template id='stylesheet'>
<link rel='stylesheet' href='https://cdn.shopify.com/extensions/019f13a6-ddb3-7ce0-82a9-d947e7d2543b/discount-kit-551/assets/dk_gift-selector.css'>
</template>
<template id='modal'>
<div class='dk_gift_canvas'>
<div class='dk_gift_modal'>
<div class='dk_gift_message_container'>
<p class='dk_gift_message'>You've unlocked a free gift! Make your selections now.</p>
<button class='dk_gift_close'>
<svg
fill='#ffffff'
height='12px'
width='12px'
version='1.1'
id='Capa_1'
xmlns='http://www.w3.org/2000/svg'
xmlns:xlink='http://www.w3.org/1999/xlink'
viewbox='0 0 460.775 460.775'
xml:space='preserve'
>
<path d="M285.08,230.397L456.218,59.27c6.076-6.077,6.076-15.911,0-21.986L423.511,4.565c-2.913-2.911-6.866-4.55-10.992-4.55c-4.127,0-8.08,1.639-10.993,4.55l-171.138,171.14L59.25,4.565c-2.913-2.911-6.866-4.55-10.993-4.55c-4.126,0-8.08,1.639-10.992,4.55L4.558,37.284c-6.077,6.075-6.077,15.909,0,21.986l171.138,171.128L4.575,401.505c-6.074,6.077-6.074,15.911,0,21.986l32.709,32.719c2.911,2.911,6.865,4.55,10.992,4.55c4.127,0,8.08-1.639,10.994-4.55l171.117-171.12l171.118,171.12c2.913,2.911,6.866,4.55,10.993,4.55c4.128,0,8.081-1.639,10.992-4.55l32.709-32.719c6.074-6.075,6.074-15.909,0-21.986L285.08,230.397z"/>
</svg>
</button>
</div>
<div class='dk_gift_products'></div>
<div class='dk_gift_selections'></div>
<div class='dk_gift_action'>
<button id='dk_add-to-cart' class='dk_gift_add-to-cart' disabled>Add to cart</button>
</div>
</div>
</div>
</template>
<template id='product'>
<div class='dk_gift_product_container'>
<div class='dk_gift_product_info_wrapper'>
<div class='dk_gift_product_image'><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 525.5 525.5"><path d="M271.9 192.7c-.5-3.8-3.7-6.1-8.6-6.1-4.9 0-8 2.3-8.6 6.1-66.9 5.7-76 78.9-77.2 102-.1 2 .8 3.7 2.5 4.8 1.1.7 2.3.9 3.5.7v29.4c0 2.8 1.4 5.5 3.7 7.1 2.3 1.6 5.1 2 7.8 1.1 6-2.1 12.1-5.7 18.6-9.4 13.3-7.8 28.4-16.5 48.9-16.5 21.2 0 34.9 8.5 47 16 7.3 4.5 14.2 8.8 21.9 10.7.7.2 1.4.2 2 .2 1.9 0 3.7-.6 5.2-1.8 2.1-1.7 3.4-4.2 3.4-6.9v-29.9c.2 0 .5.1.7.1.9 0 1.9-.3 2.8-.8 1.7-1 2.6-2.8 2.5-4.8-1.2-23-10.2-96.1-76.1-102zm-8.6-3c1.8 0 4.7.4 5.5 2.8-1.8-.1-3.6-.2-5.5-.2h-.1c-1.8 0-3.6.1-5.4.2.8-2.4 3.7-2.8 5.5-2.8zM339 330.1c0 1.8-.8 3.4-2.2 4.5-1.4 1.1-3.1 1.4-4.7 1-7.2-1.8-13.9-5.9-21-10.3-12.5-7.7-26.6-16.4-48.6-16.4-21.3 0-36.7 9-50.4 16.9-6.3 3.7-12.3 7.2-18.1 9.2-1.7.6-3.5.3-5-.7-1.5-1.1-2.4-2.8-2.4-4.7v-29.9c0-.2-.1-.5-.2-.7 10.6-5.8 34.1-15 76.4-15 42.3 0 65.7 9.1 76.4 15-.1.2-.2.4-.2.7v30.4zm4.9-33.1c-.7.4-1.6.5-2.3 0-2.3-1.3-5.4-2.9-9.2-4.4.6-2.3 1.1-4.7 1.6-7.1.1-.4-.2-.8-.6-.9-.4-.1-.8.2-.9.6-.4 2.3-.9 4.6-1.5 6.8-13.3-5.3-35.1-10.9-68.3-10.9-33.2 0-55 5.6-68.2 10.9-.6-2.6-1.2-5.2-1.7-7.8-.1-.4-.5-.7-.9-.6-.4.1-.7.5-.6.9.5 2.7 1.1 5.5 1.8 8.1-3.8 1.6-6.8 3.1-9.2 4.5-.7.4-1.6.4-2.3 0-.7-.4-1.1-1.2-1.1-2 .5-9.1 2.2-26.3 8.4-43.8-.1 3.7-.1 7.5 0 11.2 0 .4.3.7.8.7.4 0 .7-.4.7-.8-.2-5.3-.1-10.6.2-15.8.6-1.5 1.2-2.9 1.8-4.4-.9 9.5-1.5 26.8 2.5 46 .1.4.4.6.7.6h.2c.4-.1.7-.5.6-.9-4.8-22.5-3-42.4-2-49.9 11.3-22.5 31.6-42.4 68-42.6v83c0 .4.3.8.8.8.4 0 .8-.3.8-.8v-83h1.5v4.4c0 .4.3.8.8.8.4 0 .8-.3.8-.8v-4.4c33.8 1.3 53 20.5 63.9 42.1 1 7.1 2.9 27.4-2 50.4-.1.4.2.8.6.9h.2c.3 0 .7-.2.7-.6 4.2-19.5 3.5-37.1 2.5-46.5.7 1.5 1.3 2.9 1.9 4.4.3 4.7.4 9.5.3 14.3 0 .4.3.8.7.8.4 0 .7-.3.8-.7.1-3.3 0-6.5-.1-9.7 6.2 17.6 7.9 34.9 8.4 44.1 0 .8-.4 1.6-1.1 2.1z"/><path d="M295.5 203.8c-2.3 0-4.1 1.8-4.1 4.1s1.8 4.1 4.1 4.1 4.1-1.8 4.1-4.1c0-2.2-1.9-4.1-4.1-4.1zm0 6.7c-1.4 0-2.6-1.2-2.6-2.6 0-1.4 1.2-2.6 2.6-2.6s2.6 1.2 2.6 2.6c0 1.4-1.2 2.6-2.6 2.6zm-64.4-6.7c-2.3 0-4.1 1.8-4.1 4.1s1.8 4.1 4.1 4.1 4.1-1.8 4.1-4.1c0-2.2-1.8-4.1-4.1-4.1zm0 6.7c-1.4 0-2.6-1.2-2.6-2.6 0-1.4 1.2-2.6 2.6-2.6s2.6 1.2 2.6 2.6c0 1.4-1.2 2.6-2.6 2.6zm105.3 90.7c-.4 0-.8.3-.8.8v24.8c0 1.6-.8 3-2.1 3.9-1.3.9-2.9 1-4.3.4-2.2-.9-4.6-2.1-7.2-3.6-.4-.2-.8-.1-1 .3-.2.4-.1.8.3 1 2.7 1.5 5.1 2.7 7.4 3.7.8.3 1.6.5 2.3.5 1.2 0 2.3-.3 3.4-1 1.7-1.1 2.8-3.1 2.8-5.1v-24.8c-.1-.6-.4-.9-.8-.9zm-19.8 23c-1-.6-2-1.2-3-1.9-2.5-1.5-5.1-3.1-7.8-4.7-.4-.2-.8-.1-1 .3-.2.4-.1.8.3 1 2.7 1.5 5.3 3.1 7.8 4.7 1 .6 2 1.2 3 1.9.1.1.3.1.4.1.3 0 .5-.1.6-.4.2-.3.1-.8-.3-1zm-14.6-8.6c-9.1-4.9-21.9-10.5-39.9-10.5-22.3 0-38.6 9.4-53.1 17.6-4.4 2.5-8.5 4.9-12.5 6.8-1.4.7-3.1.6-4.4-.2-1.4-.9-2.2-2.3-2.2-3.9v-23.5c0-.4-.3-.8-.8-.8-.4 0-.8.3-.8.8v23.5c0 2.1 1.1 4.1 2.9 5.2 1 .6 2.1.9 3.2.9.9 0 1.8-.2 2.6-.6 4.1-2 8.2-4.3 12.6-6.9 14.3-8.2 30.4-17.4 52.3-17.4 17.7 0 30.3 5.5 39.2 10.3.4.2.8.1 1-.3.4-.3.3-.8-.1-1z"/><path d="M192.7 309.8c.4 0 .8-.3.8-.8v-9.1c0-.4-.3-.8-.8-.8-.4 0-.8.3-.8.8v9.1c0 .4.4.8.8.8zm1.1 14.8c.6.4 1.4.6 2.1.6.6 0 1.1-.1 1.7-.4 3-1.4 5.9-3 8.6-4.4.4-.2.5-.7.3-1-.2-.4-.7-.5-1-.3-2.7 1.5-5.7 3-8.6 4.4-.8.4-1.6.3-2.3-.1-.7-.5-1.1-1.2-1.1-2.1v-7.7c0-.4-.3-.8-.8-.8-.4 0-.8.3-.8.8v7.7c0 1.3.7 2.6 1.9 3.3zm15.8-6.1c.1 0 .2 0 .4-.1 2.4-1.3 4.8-2.6 7.3-3.9.4-.2.5-.6.3-1s-.6-.5-1-.3c-2.5 1.3-5 2.6-7.3 3.9-.4.2-.5.7-.3 1 0 .2.3.4.6.4zm12.4-6.4c9.7-4.6 23-10 40.2-10 23.1 0 38 8.6 51.1 16.2 5 2.9 9.8 5.6 14.7 7.7.5.2 1 .3 1.6.3.8 0 1.5-.2 2.2-.7 1.1-.7 1.8-2 1.8-3.3v-22.5c0-.4-.3-.8-.8-.8s-.8.3-.8.8v22.5c0 .8-.4 1.6-1.1 2-.7.5-1.6.5-2.3.2-4.8-2.1-9.5-4.8-14.5-7.7-13.3-7.7-28.4-16.4-51.9-16.4-17.5 0-31 5.4-40.8 10.1-.4.2-.5.6-.4 1 .2.6.7.8 1 .6zm44.3-107.8c-.4 0-.8.3-.8.8v23.7c0 .4.3.8.8.8.4 0 .8-.3.8-.8v-23.7c0-.5-.4-.8-.8-.8zm-6 61c-.4 0-.8.3-.8.8v8.9c0 .4.3.8.8.8.4 0 .8-.3.8-.8v-9c-.1-.4-.4-.7-.8-.7zm0-21.5c-.4 0-.8.3-.8.8v15.3c0 .4.3.8.8.8.4 0 .8-.3.8-.8v-15.3c-.1-.4-.4-.8-.8-.8zm75.3 23c-.4 0-.8.3-.8.7-.3 3.8-.7 7.6-1.2 11.4-.1.4.2.8.6.9h.1c.4 0 .7-.3.7-.6.5-3.8 1-7.6 1.2-11.5.1-.5-.2-.9-.6-.9zm-145.6.3c-.4 0-.7.4-.7.8.3 3.5.6 7.1 1.1 10.6.1.4.4.6.7.6h.1c.4-.1.7-.4.6-.9-.5-3.4-.9-7-1.1-10.5 0-.4-.4-.7-.7-.6z"/></svg></div>
<div class='dk_gift_product_info'>
<h4 class='dk_gift_product_title'></h4>
<div class='dk_gift_product_options'></div>
<div class='dk_gift_product_unavailable' style='display: none;'>
Unavailable
</div>
<div class='dk_gift_product_prices'>
<p class='dk_gift_product_price-range'></p>
<p class='dk_gift_product_free'>0,00€</p>
</div>
</div>
</div>
<div class='dk_gift_product_actions'>
<button class='dk_gift_product_button dk_gift_product_add'>
<svg
fill='#ffffff'
width='12px'
height='12px'
version='1.1'
viewbox='0 0 45.402 45.402'
xmlns='http://www.w3.org/2000/svg'
xmlns:xlink='http://www.w3.org/1999/xlink'
xml:space='preserve'
>
<g>
<path d="M41.267,18.557H26.832V4.134C26.832,1.851,24.99,0,22.707,0c-2.283,0-4.124,1.851-4.124,4.135v14.432H4.141c-2.283,0-4.139,1.851-4.138,4.135c-0.001,1.141,0.46,2.187,1.207,2.934c0.748,0.749,1.78,1.222,2.92,1.222h14.453V41.27c0,1.142,0.453,2.176,1.201,2.922c0.748,0.748,1.777,1.211,2.919,1.211c2.282,0,4.129-1.851,4.129-4.133V26.857h14.435c2.283,0,4.134-1.867,4.133-4.15C45.399,20.425,43.548,18.557,41.267,18.557z"/>
</g>
</svg>
</button>
</div>
</div>
</template>
<template id='selection'>
<div class='dk_selection-container'>
<img src='https://cdn.shopify.com/extensions/019f13a6-ddb3-7ce0-82a9-d947e7d2543b/discount-kit-551/assets/question-mark.svg' width='16px' height='16px'>
</div>
</template>
</gift-selector>
<!-- END app snippet -->



</div><script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
</body></html>