1(function(){"use strict";const VERSION="2.0.0",FEATURE_PRIORITY=["preOrder","backInStock","comingSoon","lowStock"],ACTIVE_STATUS="ACTIVE",FEATURE_CONFIG_MAP={preOrder:{configKey:"preOrderConfig",statusKey:"preOrderStatus",enabledKey:"preOrderEnabled"},backInStock:{configKey:"backInStockConfig",statusKey:"backInStockStatus",enabledKey:"backInStockEnabled"},comingSoon:{configKey:"comingSoonConfig",statusKey:"comingSoonStatus",enabledKey:"comingSoonEnabled"},lowStock:{configKey:"lowStockConfig",statusKey:"lowStockStatus",enabledKey:"lowStockEnabled"}},FEATURE_BEHAVIOR={preOrder:{createsNewButton:!1,isDisabled:!1,hidePaymentButtons:!0},backInStock:{createsNewButton:!0,isDisabled:!1,hidePaymentButtons:!0},comingSoon:{createsNewButton:!0,isDisabled:!0,hidePaymentButtons:!0},lowStock:{createsNewButton:!1,isDisabled:!1,hidePaymentButtons:!1}},TIMING={MODAL_CHECK_INTERVAL:100,MODAL_MAX_ATTEMPTS:20,FORM_CHECK_INTERVAL:100,FORM_MAX_ATTEMPTS:30,CLOSE_CHECK_INTERVAL:200,VARIANT_DEBOUNCE:50,FETCH_DEBOUNCE:100,CART_CHECK_DELAY:1e3},FEATURE_FLAGS={ENABLE_SHOP_NOTIFY:!1},DEFAULT_BIS_COPY={smsLabel:"SMS",emailPlaceholder:"Enter your email",phonePlaceholder:"202 555 0123",smsComplianceText:"By entering your phone number, you agree to receive a one-time automated SMS sent by Timesact (Kairock Partners SRL) when this item is back in stock. Msg & data rates may apply. Reply STOP to opt out.",buttonText:"Notify Me",successMessage:"Thank you! We'll notify you when available.",successButtonText:"Got it",contactError:"Please enter an email or phone number",emailError:"Please enter a valid email address",phoneError:"Please enter an international phone number with + and country code (for example, +1 202 555 0123)",submitError:"Something went wrong. Please try again."},DIAL_CODE_COUNTRIES=[{code:"AF",label:"Afghanistan",dialCode:"+93"},{code:"AX",label:"Aland Islands",dialCode:"+358"},{code:"AL",label:"Albania",dialCode:"+355"},{code:"DZ",label:"Algeria",dialCode:"+213"},{code:"AS",label:"American Samoa",dialCode:"+1"},{code:"AD",label:"Andorra",dialCode:"+376"},{code:"AO",label:"Angola",dialCode:"+244"},{code:"AI",label:"Anguilla",dialCode:"+1"},{code:"AQ",label:"Antarctica",dialCode:"+672"},{code:"AG",label:"Antigua and Barbuda",dialCode:"+1"},{code:"AR",label:"Argentina",dialCode:"+54"},{code:"AM",label:"Armenia",dialCode:"+374"},{code:"AW",label:"Aruba",dialCode:"+297"},{code:"AU",label:"Australia",dialCode:"+61"},{code:"AT",label:"Austria",dialCode:"+43"},{code:"AZ",label:"Azerbaijan",dialCode:"+994"},{code:"BS",label:"Bahamas",dialCode:"+1"},{code:"BH",label:"Bahrain",dialCode:"+973"},{code:"BD",label:"Bangladesh",dialCode:"+880"},{code:"BB",label:"Barbados",dialCode:"+1"},{code:"BY",label:"Belarus",dialCode:"+375"},{code:"BE",label:"Belgium",dialCode:"+32"},{code:"BZ",label:"Belize",dialCode:"+501"},{code:"BJ",label:"Benin",dialCode:"+229"},{code:"BM",label:"Bermuda",dialCode:"+1"},{code:"BT",label:"Bhutan",dialCode:"+975"},{code:"BO",label:"Bolivia",dialCode:"+591"},{code:"BQ",label:"Bonaire, Sint Eustatius and Saba",dialCode:"+599"},{code:"BA",label:"Bosnia and Herzegovina",dialCode:"+387"},{code:"BW",label:"Botswana",dialCode:"+267"},{code:"BV",label:"Bouvet Island",dialCode:"+47"},{code:"BR",label:"Brazil",dialCode:"+55"},{code:"IO",label:"British Indian Ocean Territory",dialCode:"+246"},{code:"BN",label:"Brunei",dialCode:"+673"},{code:"BG",label:"Bulgaria",dialCode:"+359"},{code:"BF",label:"Burkina Faso",dialCode:"+226"},{code:"BI",label:"Burundi",dialCode:"+257"},{code:"CV",label:"Cabo Verde",dialCode:"+238"},{code:"KH",label:"Cambodia",dialCode:"+855"},{code:"CM",label:"Cameroon",dialCode:"+237"},{code:"CA",label:"Canada",dialCode:"+1"},{code:"KY",label:"Cayman Islands",dialCode:"+1"},{code:"CF",label:"Central African Republic",dialCode:"+236"},{code:"TD",label:"Chad",dialCode:"+235"},{code:"CL",label:"Chile",dialCode:"+56"},{code:"CN",label:"China",dialCode:"+86"},{code:"CX",label:"Christmas Island",dialCode:"+61"},{code:"CC",label:"Cocos Islands",dialCode:"+61"},{code:"CO",label:"Colombia",dialCode:"+57"},{code:"KM",label:"Comoros",dialCode:"+269"},{code:"CG",label:"Congo",dialCode:"+242"},{code:"CD",label:"Congo, Democratic Republic",dialCode:"+243"},{code:"CK",label:"Cook Islands",dialCode:"+682"},{code:"CR",label:"Costa Rica",dialCode:"+506"},{code:"CI",label:"Cote d'Ivoire",dialCode:"+225"},{code:"HR",label:"Croatia",dialCode:"+385"},{code:"CU",label:"Cuba",dialCode:"+53"},{code:"CW",label:"Curacao",dialCode:"+599"},{code:"CY",label:"Cyprus",dialCode:"+357"},{code:"CZ",label:"Czechia",dialCode:"+420"},{code:"DK",label:"Denmark",dialCode:"+45"},{code:"DJ",label:"Djibouti",dialCode:"+253"},{code:"DM",label:"Dominica",dialCode:"+1"},{code:"DO",label:"Dominican Republic",dialCode:"+1"},{code:"EC",label:"Ecuador",dialCode:"+593"},{code:"EG",label:"Egypt",dialCode:"+20"},{code:"SV",label:"El Salvador",dialCode:"+503"},{code:"GQ",label:"Equatorial Guinea",dialCode:"+240"},{code:"ER",label:"Eritrea",dialCode:"+291"},{code:"EE",label:"Estonia",dialCode:"+372"},{code:"SZ",label:"Eswatini",dialCode:"+268"},{code:"ET",label:"Ethiopia",dialCode:"+251"},{code:"FK",label:"Falkland Islands",dialCode:"+500"},{code:"FO",label:"Faroe Islands",dialCode:"+298"},{code:"FJ",label:"Fiji",dialCode:"+679"},{code:"FI",label:"Finland",dialCode:"+358"},{code:"FR",label:"France",dialCode:"+33"},{code:"GF",label:"French Guiana",dialCode:"+594"},{code:"PF",label:"French Polynesia",dialCode:"+689"},{code:"TF",label:"French Southern Territories",dialCode:"+262"},{code:"GA",label:"Gabon",dialCode:"+241"},{code:"GM",label:"Gambia",dialCode:"+220"},{code:"GE",label:"Georgia",dialCode:"+995"},{code:"DE",label:"Germany",dialCode:"+49"},{code:"GH",label:"Ghana",dialCode:"+233"},{code:"GI",label:"Gibraltar",dialCode:"+350"},{code:"GR",label:"Greece",dialCode:"+30"},{code:"GL",label:"Greenland",dialCode:"+299"},{code:"GD",label:"Grenada",dialCode:"+1"},{code:"GP",label:"Guadeloupe",dialCode:"+590"},{code:"GU",label:"Guam",dialCode:"+1"},{code:"GT",label:"Guatemala",dialCode:"+502"},{code:"GG",label:"Guernsey",dialCode:"+44"},{code:"GN",label:"Guinea",dialCode:"+224"},{code:"GW",label:"Guinea-Bissau",dialCode:"+245"},{code:"GY",label:"Guyana",dialCode:"+592"},{code:"HT",label:"Haiti",dialCode:"+509"},{code:"HM",label:"Heard Island and McDonald Islands",dialCode:"+672"},{code:"VA",label:"Holy See",dialCode:"+39"},{code:"HN",label:"Honduras",dialCode:"+504"},{code:"HK",label:"Hong Kong",dialCode:"+852"},{code:"HU",label:"Hungary",dialCode:"+36"},{code:"IS",label:"Iceland",dialCode:"+354"},{code:"IN",label:"India",dialCode:"+91"},{code:"ID",label:"Indonesia",dialCode:"+62"},{code:"IR",label:"Iran",dialCode:"+98"},{code:"IQ",label:"Iraq",dialCode:"+964"},{code:"IE",label:"Ireland",dialCode:"+353"},{code:"IM",label:"Isle of Man",dialCode:"+44"},{code:"IL",label:"Israel",dialCode:"+972"},{code:"IT",label:"Italy",dialCode:"+39"},{code:"JM",label:"Jamaica",dialCode:"+1"},{code:"JP",label:"Japan",dialCode:"+81"},{code:"JE",label:"Jersey",dialCode:"+44"},{code:"JO",label:"Jordan",dialCode:"+962"},{code:"KZ",label:"Kazakhstan",dialCode:"+7"},{code:"KE",label:"Kenya",dialCode:"+254"},{code:"KI",label:"Kiribati",dialCode:"+686"},{code:"KP",label:"Korea, North",dialCode:"+850"},{code:"KR",label:"Korea, South",dialCode:"+82"},{code:"KW",label:"Kuwait",dialCode:"+965"},{code:"KG",label:"Kyrgyzstan",dialCode:"+996"},{code:"LA",label:"Laos",dialCode:"+856"},{code:"LV",label:"Latvia",dialCode:"+371"},{code:"LB",label:"Lebanon",dialCode:"+961"},{code:"LS",label:"Lesotho",dialCode:"+266"},{code:"LR",label:"Liberia",dialCode:"+231"},{code:"LY",label:"Libya",dialCode:"+218"},{code:"LI",label:"Liechtenstein",dialCode:"+423"},{code:"LT",label:"Lithuania",dialCode:"+370"},{code:"LU",label:"Luxembourg",dialCode:"+352"},{code:"MO",label:"Macao",dialCode:"+853"},{code:"MG",label:"Madagascar",dialCode:"+261"},{code:"MW",label:"Malawi",dialCode:"+265"},{code:"MY",label:"Malaysia",dialCode:"+60"},{code:"MV",label:"Maldives",dialCode:"+960"},{code:"ML",label:"Mali",dialCode:"+223"},{code:"MT",label:"Malta",dialCode:"+356"},{code:"MH",label:"Marshall Islands",dialCode:"+692"},{code:"MQ",label:"Martinique",dialCode:"+596"},{code:"MR",label:"Mauritania",dialCode:"+222"},{code:"MU",label:"Mauritius",dialCode:"+230"},{code:"YT",label:"Mayotte",dialCode:"+262"},{code:"MX",label:"Mexico",dialCode:"+52"},{code:"FM",label:"Micronesia",dialCode:"+691"},{code:"MD",label:"Moldova",dialCode:"+373"},{code:"MC",label:"Monaco",dialCode:"+377"},{code:"MN",label:"Mongolia",dialCode:"+976"},{code:"ME",label:"Montenegro",dialCode:"+382"},{code:"MS",label:"Montserrat",dialCode:"+1"},{code:"MA",label:"Morocco",dialCode:"+212"},{code:"MZ",label:"Mozambique",dialCode:"+258"},{code:"MM",label:"Myanmar",dialCode:"+95"},{code:"NA",label:"Namibia",dialCode:"+264"},{code:"NR",label:"Nauru",dialCode:"+674"},{code:"NP",label:"Nepal",dialCode:"+977"},{code:"NL",label:"Netherlands",dialCode:"+31"},{code:"NC",label:"New Caledonia",dialCode:"+687"},{code:"NZ",label:"New Zealand",dialCode:"+64"},{code:"NI",label:"Nicaragua",dialCode:"+505"},{code:"NE",label:"Niger",dialCode:"+227"},{code:"NG",label:"Nigeria",dialCode:"+234"},{code:"NU",label:"Niue",dialCode:"+683"},{code:"NF",label:"Norfolk Island",dialCode:"+672"},{code:"MK",label:"North Macedonia",dialCode:"+389"},{code:"MP",label:"Northern Mariana Islands",dialCode:"+1"},{code:"NO",label:"Norway",dialCode:"+47"},{code:"OM",label:"Oman",dialCode:"+968"},{code:"PK",label:"Pakistan",dialCode:"+92"},{code:"PW",label:"Palau",dialCode:"+680"},{code:"PS",label:"Palestine",dialCode:"+970"},{code:"PA",label:"Panama",dialCode:"+507"},{code:"PG",label:"Papua New Guinea",dialCode:"+675"},{code:"PY",label:"Paraguay",dialCode:"+595"},{code:"PE",label:"Peru",dialCode:"+51"},{code:"PH",label:"Philippines",dialCode:"+63"},{code:"PN",label:"Pitcairn",dialCode:"+64"},{code:"PL",label:"Poland",dialCode:"+48"},{code:"PT",label:"Portugal",dialCode:"+351"},{code:"PR",label:"Puerto Rico",dialCode:"+1"},{code:"QA",label:"Qatar",dialCode:"+974"},{code:"RE",label:"Reunion",dialCode:"+262"},{code:"RO",label:"Romania",dialCode:"+40"},{code:"RU",label:"Russia",dialCode:"+7"},{code:"RW",label:"Rwanda",dialCode:"+250"},{code:"BL",label:"Saint Barthelemy",dialCode:"+590"},{code:"SH",label:"Saint Helena",dialCode:"+290"},{code:"KN",label:"Saint Kitts and Nevis",dialCode:"+1"},{code:"LC",label:"Saint Lucia",dialCode:"+1"},{code:"MF",label:"Saint Martin",dialCode:"+590"},{code:"PM",label:"Saint Pierre and Miquelon",dialCode:"+508"},{code:"VC",label:"Saint Vincent and the Grenadines",dialCode:"+1"},{code:"WS",label:"Samoa",dialCode:"+685"},{code:"SM",label:"San Marino",dialCode:"+378"},{code:"ST",label:"Sao Tome and Principe",dialCode:"+239"},{code:"SA",label:"Saudi Arabia",dialCode:"+966"},{code:"SN",label:"Senegal",dialCode:"+221"},{code:"RS",label:"Serbia",dialCode:"+381"},{code:"SC",label:"Seychelles",dialCode:"+248"},{code:"SL",label:"Sierra Leone",dialCode:"+232"},{code:"SG",label:"Singapore",dialCode:"+65"},{code:"SX",label:"Sint Maarten",dialCode:"+1"},{code:"SK",label:"Slovakia",dialCode:"+421"},{code:"SI",label:"Slovenia",dialCode:"+386"}
1,{code:"SB",label:"Solomon Islands",dialCode:"+677"},{code:"SO",label:"Somalia",dialCode:"+252"},{code:"ZA",label:"South Africa",dialCode:"+27"},{code:"GS",label:"South Georgia and the South Sandwich Islands",dialCode:"+500"},{code:"SS",label:"South Sudan",dialCode:"+211"},{code:"ES",label:"Spain",dialCode:"+34"},{code:"LK",label:"Sri Lanka",dialCode:"+94"},{code:"SD",label:"Sudan",dialCode:"+249"},{code:"SR",label:"Suriname",dialCode:"+597"},{code:"SJ",label:"Svalbard and Jan Mayen",dialCode:"+47"},{code:"SE",label:"Sweden",dialCode:"+46"},{code:"CH",label:"Switzerland",dialCode:"+41"},{code:"SY",label:"Syria",dialCode:"+963"},{code:"TW",label:"Taiwan",dialCode:"+886"},{code:"TJ",label:"Tajikistan",dialCode:"+992"},{code:"TZ",label:"Tanzania",dialCode:"+255"},{code:"TH",label:"Thailand",dialCode:"+66"},{code:"TL",label:"Timor-Leste",dialCode:"+670"},{code:"TG",label:"Togo",dialCode:"+228"},{code:"TK",label:"Tokelau",dialCode:"+690"},{code:"TO",label:"Tonga",dialCode:"+676"},{code:"TT",label:"Trinidad and Tobago",dialCode:"+1"},{code:"TN",label:"Tunisia",dialCode:"+216"},{code:"TR",label:"Turkiye",dialCode:"+90"},{code:"TM",label:"Turkmenistan",dialCode:"+993"},{code:"TC",label:"Turks and Caicos Islands",dialCode:"+1"},{code:"TV",label:"Tuvalu",dialCode:"+688"},{code:"UG",label:"Uganda",dialCode:"+256"},{code:"UA",label:"Ukraine",dialCode:"+380"},{code:"AE",label:"United Arab Emirates",dialCode:"+971"},{code:"GB",label:"United Kingdom",dialCode:"+44"},{code:"US",label:"United States",dialCode:"+1"},{code:"UM",label:"United States Minor Outlying Islands",dialCode:"+1"},{code:"UY",label:"Uruguay",dialCode:"+598"},{code:"UZ",label:"Uzbekistan",dialCode:"+998"},{code:"VU",label:"Vanuatu",dialCode:"+678"},{code:"VE",label:"Venezuela",dialCode:"+58"},{code:"VN",label:"Vietnam",dialCode:"+84"},{code:"VG",label:"Virgin Islands, British",dialCode:"+1"},{code:"VI",label:"Virgin Islands, U.S.",dialCode:"+1"},{code:"WF",label:"Wallis and Futuna",dialCode:"+681"},{code:"EH",label:"Western Sahara",dialCode:"+212"},{code:"YE",label:"Yemen",dialCode:"+967"},{code:"ZM",label:"Zambia",dialCode:"+260"},{code:"ZW",label:"Zimbabwe",dialCode:"+263"}],DEFAULT_SELECTORS={form:'form[action*="/cart/add"], [data-block-id="buy_buttons"] .shopify-product-form, product-sticky-bar',addToCartButton:'button[type="submit"], input[type="submit"]',addToCartButtonText:null,variant:'select[name="id"], input[type="radio"][name^="option"], .variant-input',message:'button[type="submit"]',widgets:'button[type="submit"]',badge:".product__media-gallery, .product-media-container, .product-single__media-wrapper, .product-gallery",quantityInput:'input[name="quantity"], .quantity__input',priceContainer:".price, .product__price, .product-single__price",shopifyPaymentButton:'.shopify-payment-button, [data-shopify="payment-button"]',collection:{productCard:".product-card, .card--product, .product-item, .product-card-wrapper",badge:".card__inner",form:'form[action*="/cart/add"]',addToCartButton:'button[type="submit"], input[type="submit"]',addToCartButtonText:null},quickView:{button:".quick-add__submit, .quick-view-btn, [data-quick-add], .product-card__quick-add-button",container:".quick-add-modal__content-info:visible, .quick-buy-modal:visible",form:'form[action*="/cart/add"], [data-block-id="buy_buttons"] .shopify-product-form, product-sticky-bar',addToCartButton:'button[type="submit"], input[type="submit"]',addToCartButtonText:null,variant:'select[name="id"], input[name="id"], input[type="radio"][name^="option"], .variant-input',message:'button[type="submit"]',widgets:'button[type="submit"]',badge:".product__media-gallery, .product-media-container, .product-gallery",shopifyPaymentButton:'.shopify-payment-button, [data-shopify="payment-button"]'},variantChangingTime:TIMING.VARIANT_DEBOUNCE},GRAPHQL={VARIANT_FIELDS:` 2 id 3 title 4 availableForSale 5 quantityAvailable 6 selectedOptions { name value } 7 metafield_experiences: metafield(namespace: "timesact", key: "customer_experiences") { value } 8 metafield_state: metafield(namespace: "timesact", key: "experiences_state") { value } 9 `,PRODUCT_FIELDS:` 10 id 11 handle 12 title 13 availableForSale 14 featuredImage { url } 15 `,SELLING_PLAN_FIELDS:` 16 sellingPlanGroups(first: 10) { 17 nodes { 18 name 19 sellingPlans(first: 10) { 20 nodes { 21 id 22 name 23 options { 24 name 25 value 26 } 27 } 28 } 29 } 30 } 31 `,getProductVariantsQuery(afterClause="",hasCountry=!1){var contextDirective=hasCountry?" @inContext(country: $country)":"",countryParam=hasCountry?", $country: CountryCode!":"";return` 32 query GetProductVariants($id: ID!${countryParam})${contextDirective} { 33 product(id: $id) { 34 variants(first: 250${afterClause}) { 35 pageInfo { hasNextPage endCursor } 36 nodes { ${this.VARIANT_FIELDS} } 37 } 38 } 39 } 40 `},getSingleVariantQuery(hasCountry=!1){var contextDirective=hasCountry?" @inContext(country: $country)":"",countryParam=hasCountry?", $country: CountryCode!":"";return` 41 query GetVariant($id: ID!${countryParam})${contextDirective} { 42 node(id: $id) { 43 ... on ProductVariant { ${this.VARIANT_FIELDS} } 44 } 45 } 46 `},getProductsQuery(hasCountry=!1){var contextDirective=hasCountry?" @inContext(country: $country)":"",countryParam=hasCountry?", $country: CountryCode!":"";return` 47 query GetProducts($ids: [ID!]!${countryParam})${contextDirective} { 48 nodes(ids: $ids) { 49 ... on Product { 50 ${this.PRODUCT_FIELDS} 51 variants(first: 250) { 52 nodes { ${this.VARIANT_FIELDS} } 53 } 54 ${this.SELLING_PLAN_FIELDS} 55 } 56 } 57 } 58 `},getProductByHandleFields(){return` 59 ${this.PRODUCT_FIELDS} 60 variants(first: 250) { 61 nodes { ${this.VARIANT_FIELDS} } 62 } 63 ${this.SELLING_PLAN_FIELDS} 64 `}},Utils={resolveButtonLabel($button,textSelector,app){var $result=this.findTextElement($button,textSelector,app);return this._preferBareText($button,$result,app)},_preferBareText($button,$result,app){if(!$result||!$result.length)return $result;var changed=!1,$fixed=$result.map(function(i){if((this.textContent||"").trim())return this;var btn=$button[i]||$button[0];if(!btn||btn===this)return this;var span=Utils._wrapBareButtonText(btn);return span?(changed=!0,span):this});return changed&&app&&app.log("Text element resolved from bare button text"),changed?$fixed:$result},_wrapBareButtonText(btnEl){var existing=btnEl.querySelector(":scope > span.timesact-button-text");if(existing)return existing;for(var i=0;i<btnEl.childNodes.length;i++){var node=btnEl.childNodes[i];if(node.nodeType===3&&node.nodeValue.trim()){var span=document.createElement("span");return span.className="timesact-button-text",node.nodeValue=node.nodeValue.trim(),bt
64nEl.insertBefore(span,node),span.appendChild(node),span}}return null},findTextElement($button,textSelector,app){if(!$button||!$button.length)return $button;if($button.length>1&&app&&app.$){var $=app.$;return $button.map(function(){var $btn=$(this);if(textSelector){var $custom2=$btn.find(textSelector);if($custom2.length)return $custom2[0]}var $btnText2=$btn.find("span.btn-text");if($btnText2.length)return $btnText2[0];var $span2=$btn.find("span").first();if($span2.length)return $span2[0];var $div2=$btn.find("div").first();return $div2.length?$div2[0]:this})}if(textSelector){var $custom=$button.find(textSelector);if($custom.length)return app&&app.log("Text element found via selector:",textSelector),$custom.first()}var $btnText=$button.find("span.btn-text");if($btnText.length)return $btnText.first();var $span=$button.find("span").first();if($span.length)return $span;var $div=$button.find("div").first();return $div.length?$div:$button},decodeHandle(handle){if(!handle)return handle;try{return decodeURIComponent(handle)}catch{return handle}},extractProductId($element,$,cardSelector){var dataId=$element.attr("data-product-id")||$element.find("[data-product-id]").attr("data-product-id");if(dataId)return{type:"id",value:Number(dataId)};var dataHandle=$element.attr("data-product-handle")||$element.attr("data-handle")||$element.find("[data-product-handle]").attr("data-product-handle");if(dataHandle)return{type:"handle",value:dataHandle};var $link=$element.find('a[href*="/products/"]').first();$link.length||($link=$element.closest('a[href*="/products/"]'));var dataUrl=$element.attr("data-product-url");if(dataUrl){var urlMatch=dataUrl.match(/\/products\/([^?#\/]+)/);if(urlMatch)return{type:"handle",value:Utils.decodeHandle(urlMatch[1])}}if($link.length){var href=$link.attr("href"),match=href.match(/\/products\/([^?#\/]+)/);if(match)return{type:"handle",value:Utils.decodeHandle(match[1])}}if(cardSelector){var $card=$element.closest(cardSelector);if($card.length&&$card[0]!==$element[0])return Utils.extractProductId($card,$,null)}return null},waitForElement($,selector,$container,maxAttempts,interval){return maxAttempts=maxAttempts||TIM
64ING.MODAL_MAX_ATTEMPTS,interval=interval||TIMING.MODAL_CHECK_INTERVAL,new Promise(function(resolve){var attempts=0,checkInterval=setInterval(function(){attempts++;var $element=$container?$container.find(selector):$(selector);$element.length?(clearInterval(checkInterval),resolve($element.first())):attempts>=maxAttempts&&(clearInterval(checkInterval),resolve(null))},interval)})},fromGid(gid){if(!gid)return null;var str=String(gid);if(str.indexOf("gid://")===-1)return str;var parts=str.split("/");return parts[parts.length-1]},toGid(type,id){var numericId=String(id).replace(/\D/g,"");return"gid://shopify/"+type+"/"+numericId},parseJson(str,fallback){if(!str)return fallback!==void 0?fallback:null;try{return JSON.parse(str)}catch{return fallback!==void 0?fallback:null}},autoGradient(hex){if(!hex)return hex;var r,g,b;hex=hex.replace("#",""),hex.length===3&&(hex=hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2]),r=parseInt(hex.substring(0,2),16)/255,g=parseInt(hex.substring(2,4),16)/255,b=parseInt(hex.substring(4,6),16)/255;var max=Math.max(r,g,b),min=Math.min(r,g,b),h,s,l=(max+min)/2;if(max===min)h=s=0;else{var d=max-min;s=l>.5?d/(2-max-min):d/(max+min),max===r?h=((g-b)/d+(g<b?6:0))/6:max===g?h=((b-r)/d+2)/6:h=((r-g)/d+4)/6}var h2=(h+40/360)%1;return"linear-gradient(to right, hsl("+Math.round(h*360)+","+Math.round(s*100)+"%,"+Math.round(l*100)+"%), hsl("+Math.round(h2*360)+","+Math.round(s*100)+"%,"+Math.round(l*100)+"%))"},debounce(func,wait){var timeout;return function(){var context=this,args=arguments;clearTimeout(timeout),timeout=setTimeout(function(){func.apply(context,args)},wait)}},escapeHtml(str){return str?String(str).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"):""}};function initWithJQuery($){if(window.TimesactData&&window.TimesactData.appDisabled===!0){console.info("[Timesact V2] App disabled for this shop (plan limit reached). Skipping initialization.");return}$(function(){var app=new TimesactApp($);app.init(),window.TimesactApp=app})}function loadJQuery(callback){var script=document.createElement("script");script.src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js",script.onload=function(){typeof jQuery<"u"?callback(jQuery):console.error("[Timesact V2] jQuery failed to initialize after loading")},script.onerror=function(){console.error("[Timesact V2] Failed to load jQuery")},document.head.appendChild(script)}function waitForJQuery(callback,maxAttempts){maxAttempts=maxAttempts||5;var attempts=0;function check(){attempts++,typeof jQuery<"u"&&jQuery.fn&&jQuery.fn.jquery?callback(jQuery):attempts<maxAttempts?setTimeout(check,50):loadJQuery(callback)}check()}class TimesactApp{constructor($){this.$=$,this.version=VERSION,this.data=null,this.dataManager=null,this.selectorManager=null,this.eventManager=null,this.api=null,this.storefrontClient=null,this.cartAlertManager=null,this.pageHandler=null,this.productCardsHandler=null,this.quickViewHandler=null,this.featuredProductHandler=null,this.debug=!1,this._modal=null,this.selectors=Object.assign({},DEFAULT_SELECTORS)}init(){if(!window.TimesactData){console.warn("[Timesact V2] No TimesactData found. App embed may not be installed.");return}if(this.data=window.TimesactData,this.debug=this.data.debug||!1,this.data.selectors){var custom=this.data.selectors;Object.assign(this.selectors,custom),custom.collection&&(this.selectors.collection=Object.assign({},DEFAULT_SELECTORS.collection,custom.collection)),custom.quickView&&(this.selectors.quickView=Object.assign({},DEFAULT_SELECTORS.quickView,custom.quickView))}this.log("=== Initializing Timesact V2 ==="),this.log("Version:",this.version),this.log("Page:",this.data.page),this.log("Experiences loaded:",Object.keys(this.data.experiences||{}).length),this.dataManager=new DataManager(this.data,this),this.selectorManager=new SelectorManager(this.$,this.selectors,this),this.eventManager=new EventManager(this.$,this),this.api=new Api(this.$,this),this.data.storefront&&this.data.storefront.accessToken&&(this.storefrontClient=new StorefrontClient(this.data.storefront,this),this.log("Storefront API client initialized")),this.cartAlertManager=new CartAlertManager(this),this.cartAlertManager.init(),this.log("Core managers initialized"),this._initPageHandler(),this.data.page&&this.data.page.isCartPage?(this.cartAlertManager.checkMixedCart(!0),this.cartAlertManager.checkProductAlertsOnCart()):this.cartAlertManager.hasAnyMixedAlert
64Enabled()&&this._bindMixedCartCheckOnAddToCart()}_bindMixedCartCheckOnAddToCart(){var self=this,formSelector=this.selectors.form;this.log("Mixed cart alert: add-to-cart trigger bound"),document.addEventListener("submit",function(e){var form=e.target;if(!(!form||form.nodeType!==1)){var isCartForm=!1;try{isCartForm=form.matches('form[action*="/cart/add"]')||self.$(form).closest(formSelector).length>0}catch{isCartForm=form.matches('form[action*="/cart/add"]')}isCartForm&&(clearTimeout(self._mixedCartCheckTimer),self._mixedCartCheckTimer=setTimeout(function(){self.cartAlertManager.checkMixedCart(!1)},TIMING.CART_CHECK_DELAY))}},!0)}_initPageHandler(){var page=this.data.page||{};page.isProductPage&&(this.log("--- Initializing ProductPageHandler ---"),this.pageHandler=new ProductPageHandler(this),this.pageHandler.init());var context=page.isCollectionPage?"collection":page.isSearchPage?"search":"dynamic";this.log("--- Initializing ProductCardsHandler ("+context+") ---"),this.productCardsHandler=new ProductCardsHandler(this),this.productCardsHandler.init(),this.log("--- Initializing QuickViewHandler ---"),this.quickViewHandler=new QuickViewHandler(this),this.quickViewHandler.init(),page.isCartPage||(this.log("--- Initializing FeaturedProductHandler ---"),this.featuredProductHandler=new FeaturedProductHandler(this),this.featuredProductHandler.init())}getUserCountry(){if(window.Shopify&&window.Shopify.country)return window.Shopify.country;if(this.data.userCountry)return this.data.userCountry;var acceleratedCheckout=document.querySelector("shopify-accelerated-checkout[buyer-country]");return acceleratedCheckout?acceleratedCheckout.getAttribute("buyer-country"):null}getModal(){return this._modal||(this._modal=new ModalComponent(this)),this._modal}log(){this.debug&&console.log.apply(console,["[Timesact]"].concat(Array.prototype.slice.call(arguments)))}warn(){this.debug&&console.warn.apply(console,["[Timesact WARN]"].concat(Array.prototype.slice.call(arguments)))}error(){console.error.apply(console,["[Timesact ERROR]"].concat(Array.prototype.slice.call(arguments)))}}class DataManager{constructor(data,app){this.app=app,this.raw=data,this.experiences=data.experiences||{},this.product=data.product||null,this.collection=data.collection||null,this.search=data.search||null,this.cart=data.cart||null,this.locale=data.locale||"en",this.currency=data.currency||"USD",this._variantCache=new Map,this._metaobjectToExperienceMap={},this._buildExperienceMapping(),this._initializeCache()}_buildExperienceMapping(){var self=this;Object.keys(this.experiences).forEach(function(expId){var exp=self.experiences[expId];exp.metaobjectId&&(self._metaobjectToExperienceMap[String(exp.metaobjectId)]=String(expId))}),this.app.log("Experience mapping built:",Object.keys(this._metaobjectToExperienceMap).length,"entries")}_initializeCache(){var self=this;this.product&&this.product.variants&&(this.product.variants.forEac
64h(function(v){self._variantCache.set(Number(v.id),v)}),this.app.log("Cache initialized with",this._variantCache.size,"variants from product")),[this.collection,this.search].forEach(function(source){source&&source.products&&source.products.forEach(function(p){p.defaultVariant&&self._variantCache.set(Number(p.defaultVariant.id),p.defaultVariant)})})}getExperience(experienceId){var id=String(experienceId);if(this.experiences[id])return this.experiences[id];var mappedId=this._metaobjectToExperienceMap[id];return mappedId&&this.experiences[mappedId]?this.experiences[mappedId]:null}getVariant(variantId){var id=Number(variantId);if(this._variantCache.has(id))return this._variantCache.get(id);if(this.product&&this.product.variants){var variant=this.product.variants.find(function(v){return v.id===id});if(variant)return this._variantCache.set(id,variant),variant}return null}getCurrentVariantId($form){var $=this.app.$,urlParams=new URLSearchParams(window.location.search),urlVariantId=urlParams.get("variant");if(urlVariantId)return Number(urlVariantId);var $formToCheck=$form&&$form.length?$form:$(this.app.selectors.form);if($formToCheck.length){var inputVal=$formToCheck.find('input[name="id"]').val();if(inputVal)return Number(inputVal)}if(this.product&&this.product.variants&&this.product.variants.length>0){var firstAvailable=this.product.variants.find(function(v){return v.available});return(firstAvailable||this.product.variants[0]).id}return null}getVariantExperiences(variantId){var variant=this.getVariant(variantId);if(!variant||!variant.experienceIds)return[];var self=this,userCountry=this.app.getUserCountry(),results=[],ids=Array.isArray(variant.experienceIds)?variant.experienceIds:[];return ids.forEach(function(rawId){var experienceId=self._extractExperienceId(rawId),experience=self.getExperience(experienceId);if(experience&&self._matchesMarket(experience,userCountry)){var state=variant.experiencesState?variant.experiencesState[experience.id]:null;results.push({experience,state})}}),results}getActiveFeatures(variantId){var variant=this.getVariant(variantId),variantExperiences=this.getVariantExperiences(variantId),self=this,activeFeatures=[];if(variantExperiences.length>0&&FEATURE_PRIORITY.forEach(function(featureType){var mapping2=FEATURE_CONFIG_MAP[featureType];variantExperiences.forEach(function(item){var experience=item.experience,state=item.state;experience[mapping2.enabledKey]&&(!state||state[mapping2.statusKey]!==ACTIVE_STATUS||activeFeatures.push({type:featureType,experience,config:experience[mapping2.configKey],state}))})}),activeFeatures.length===0&&variant&&!variant.available){var storeLevelBis=this._findStoreLevelExperience("backInStock");if(storeLevelBis){var mapping=FEATURE_CONFIG_MAP.backInStock;activeFeatures.push({type:"backInStock",experience:storeLevelBis,config:storeLevelBis[mapping.configKey],state:{backInStockStatus:ACTIVE_STATUS},isStoreLevel:!0})}}if(activeFeatures.length===0){var storeLevelLowStock=this.buildStoreLevelLowStockFeature(variant);storeLevelLowStock&&activeFeatures.push(storeLevelLowStock)}return activeFeatures}hasVariantData(variantId){return this._variantCache.has(Number(variantId))}addVariants(variants){var self=this;
64!variants||!Array.isArray(variants)||variants.forEach(function(v){v&&v.id&&self._variantCache.set(Number(v.id),v)})}getDefaultTexts(){var defaults={addToCart:"Add to cart",soldOut:"Sold out",unavailable:"Unavailable"};return window.variantStrings?{addToCart:window.variantStrings.addToCart||defaults.addToCart,soldOut:window.variantStrings.soldOut||defaults.soldOut,unavailable:window.variantStrings.unavailable||defaults.unavailable}:this.raw.defaultTexts?Object.assign({},defaults,this.raw.defaultTexts):defaults}_extractExperienceId(rawId){if(rawId&&typeof rawId=="object"){if(rawId.experience_id!==void 0)return String(rawId.experience_id);if(rawId.id!==void 0)return String(rawId.id)}return typeof rawId=="string"&&rawId.indexOf("gid://")!==-1?Utils.fromGid(rawId):String(rawId)}_matchesMarket(experience,userCountry){var configType=experience.marketsConfigType;if(configType==="GLOBAL"||!configType||!userCountry)return!0;if(configType==="ISO_CODE"){var markets=experience.markets||[];return markets.indexOf(userCountry)!==-1}return!0}_findStoreLevelExperience(featureType){var self=this,userCountry=this.app.getUserCountry(),storeLevelKey=featureType+"StoreLevelEnabled",enabledKey=FEATURE_CONFIG_MAP[featureType].enabledKey,candidates=[];return Object.keys(this.experiences).forEach(function(expId){var exp=self.experiences[expId];exp[storeLevelKey]&&exp[enabledKey]&&self._matchesMarket(exp,userCountry)&&candidates.push(exp)}),candidates.length===0?null:(candidates.sort(function(a,b){var dateA=a.updatedAt?new Date(a.updatedAt).getTime():0,dateB=b.updatedAt?new Date(b.updatedAt).getTime():0;return dateB-dateA}),candidates[0])}_isVariantLowStock(variant,lowStockConfig){if(!variant||!lowStockConfig)return!1;var qty=variant.inventoryQuantity,threshold=lowStockConfig.quantityThreshold;return Number.isFinite(qty)&&Number.isFinite(threshold)&&qty>0&&qty<=threshold}buildStoreLevelLowStockFeature(variant){if(!variant||!variant.available)return null;var experience=this._findStoreLevelExperience("lowStock");if(!experience)return null;var config=experience[FEATURE_CONFIG_MAP.lowStock.configKey];return this._isVariantLowStock(variant,config)?{type:"lowStock",experience,config,state:{lowStockStatus:ACTIVE_STATUS},isStoreLevel:!0}:null}}class StorefrontClient{constructor(config,app){this.app=app,this.shopDomain=config.shopDomain,this.apiVersion=config.apiVersion||"2026-01",this.accessToken=config.accessToken,this.endpoint="https://"+this.shopDomain+"/api/"+this.apiVersion+"/graphql.json",this.country=app.getUserCountry()||null}async fetchAllProductVariants(productId){for(var allVariants=[],hasNextPage=!0,cursor=null;hasNextPage;){var result=await this._fetchVariantPage(productId,cursor);result.variants&&result.variants.length>0&&(this.app.dataManager.addVariants(result.variants),allVariants=allVariants.concat(result.variants)),hasNextPage=result.hasNextPage,cursor=result.endCursor}return allVariants}async _fetchVariantPage(productId,cursor){var gid=Utils.toGid("Product",productId),afterClause=cursor?', after: "'+cursor+'"':"",hasCountry=!!this.country,query=GRAPHQL.getProductVariantsQuery(afterClause,hasCountry),variables={id:gid};hasCountry&&(variables.country=this.country);try{var response=await this._request(query,variables),variants=response.data.product.variants;return{variants:variants.nodes.map(this._parseVariant.bind(this)),hasNextPage:variants.pageInfo.hasNextPage,endCursor:variants.pageInfo.endCursor}}catch(err){return this.app.warn("StorefrontClient._fetchVariantPage error:",err),{variants:[],hasNextPage:!1,endCursor:null}}}async fetchVariant(variantId){var gid=Utils.toGid("ProductVariant",variantId),hasCountry=!!this.country,query=GRAPHQL.getSingleVariantQuery(hasCountry),variables={id:gid};hasCountry&&(variables.country=this.country);try{var response=await this._request(query,variables);if(!response.data.node)return null;var variant=this._parseVariant(response.data.node);return this.app.dataManager.addVariants([variant]),variant}catch(err){return this.app.warn("StorefrontClient.fetchVariant error:",err),null}}async fetchProducts(productIds){if(!productIds||productIds.length===0)return{};var gids=productIds.map(function(id){return Utils.toGid("Product",id)}),hasCountry=!!this.country,query=GRAPHQL.getProductsQuery(hasCountry),variables={ids:gids};hasCountry&&(variables.country=this.country);try{var response=await this._request(query,variables);return this._parseProductsResponse(response.data.nodes)}catch(err){return this.app.warn("StorefrontClient.fetchProducts error:",err),{}}}
64async fetchProductsByHandles(handles){if(!handles||handles.length===0)return{};var self=this,productFragment=GRAPHQL.getProductByHandleFields(),queryParts=handles.map(function(handle,index){return"p"+index+': productByHandle(handle: "'+handle+'") { '+productFragment+" }"}),variables={},contextDirective="",countryParam="";this.country&&(contextDirective=" @inContext(country: $country)",countryParam="($country: CountryCode!)",variables.country=this.country);var query="query"+countryParam+contextDirective+" { "+queryParts.join(" ")+" }";try{var response=await this._request(query,variables);if(!response||!response.data)return{};var result={};return handles.forEach(function(handle,index){var node=response.data["p"+index];if(node){var parsed=self._parseProductNode(node);parsed&&(result[handle]=parsed)}}),result}catch(err){return this.app.warn("StorefrontClient.fetchProductsByHandles error:",err),{}}}_parseProductNode(node){if(!node)return null;var self=this,defaultVariant=node.variants.nodes[0]?this._parseVariant(node.variants.nodes[0]):null,sellingPlanGroups=[];return node.sellingPlanGroups&&node.sellingPlanGroups.nodes&&(sellingPlanGroups=node.sellingPlanGroups.nodes.map(function(group){return{name:group.name,selling_plans:group.sellingPlans.nodes.map(function(plan){return{id:Number(Utils.fromGid(plan.id)),name:plan.name,options:plan.options||[]}})}})),{id:Number(Utils.fromGid(node.id)),handle:node.handle,title:node.title,available:node.availableForSale,featuredImage:node.featuredImage?node.featuredImage.url:null,variantCount:node.variants.nodes.length,variants:node.variants.nodes.map(function(v){return self._parseVariant(v)}),defaultVariant,sellingPlanGroups,hasExperiences:defaultVariant&&defaultVariant.experienceIds&&defaultVariant.experienceIds.length>0}}_parseProductsResponse(nodes){var self=this,result={};return nodes&&nodes.forEach(function(node){if(node){var parsed=self._parseProductNode(node);parsed&&(result[parsed.id]=parsed)}}),result}_parseVariant(node){return{id:Number(Utils.fromGid(node.id)),title:node.title,available:node.availableForSale,inventoryQuantity:node.quantityAvailable,experienceIds:this._parseExperienceIds(node.metafield_experiences),experiencesState:this._parseMetafieldJson(node.metafield_state)}}_parseExperienceIds(metafield){var data=this._parseMetafieldJson(metafield);return!data||!Array.isArray(data)?null:data.map(function(item){return typeof item=="string"?item:item&&item.experience_id&&item.experience_id.value?item.experience_id.value:item})}_parseMetafieldJson(metafield){return!metafield||!metafield.value?null:Utils.parseJson(metafield.value)}async _request(query,variables){var response=await fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json","X-Shopify-Storefront-Access-Token":this.accessToken},body:JSON.stringify({query,variables})});if(!response.ok)throw new Error("Storefront API error: "+response.status);var data=await response.json();return data.errors&&this.app.warn("GraphQL errors:",data.errors),data}}class SelectorManager{constructor($,selectors,app){this.$=$,this.selectors=selectors,this.app=app}detectProductPage(){var $=this.$,s=this.selectors,$form=$(s.form),$button=$();$form.each(function(){var $btn=$(this).find(s.addToCartButton).first();$btn.length&&($button=$button.add($btn))});var $variant=$form.find(s.variant),$message=$();$form.each(function(){var $msg=$(this).find(s.message).first();$msg.length&&($message=$message.add($msg))});var $widgets=$form.find(s.widgets).first(),$badge=$(s.badge).first(),$shopifyPaymentButton=$(s.shopifyPaymentButton);return $badge.length||($badge=$(".product__media, .product-media").first()),$message.length||($message=$button),$widgets.length||($widgets=$button.first()),this.app.log("Detected product page selectors:",{form:$form.length,button:$button.length,variant:$variant.length,badge:$badge.length}),{$form,$button,$variant,$message,$widgets,$badge,$shopifyPaymentButton,textSelector:s.addToCartButtonText}}}class EventManager{constructor($,app){this.$=$,this.app=app,this._historyPatched=!1}onVariantChange(options,callback){var self=this,$=this.$,$form=options.$form,$variant=options.$variant,namespace=options.namespace||"timesact",debounceMs=options.debounceMs||TIMING.VARIANT_DEBOUNCE,debouncedCallback=Utils.debounce(callback,debounceMs);$form.on("change."+namespace,'select, input[type="radio"], input[name="id"]',debouncedCallback),$(window).on("popstate."+namespace,debouncedCallback),this._historyPatched||this._patchHistoryApi(namespace,debouncedCallback);var observer=new MutationObserver(function(mutations){mutations.forEach(function(mutation){mutation.type==="attributes"&&(mutation.attributeName==="value"||mutation.attributeName==="checked")&&debouncedCallback()})});$variant.each(function(){observer.observe(this,{attributes:!0,attributeFilter:["value","checked"]})});var $hiddenId=$form.find('input[name="id"][type="hidden"]');if($hiddenId.length){var hiddenObserver=new MutationObserver(debouncedCallback);hiddenObserver.observe($hiddenId[0],{attributes:!0,attributeFilter:["value"]})}return function(){$form.off("."+namespace),$(window).off("."+namespace),observer.disconnect()}}_patchHistoryApi(namespace,callback){var self=this;this._originalPushState=history.pushState,this._originalReplaceState=history.replaceState,history.pushState=function(){self._originalPushState.apply(history,arguments),callback()},history.replaceState=function(){self._originalReplaceState.apply(history,arguments),callback()},this._historyPatched=!0}destroy(){this.$(document).off(".timesact"),this.$(window).off(".timesact"),this._historyPatched&&(history.pushState=this._originalPushState,history.replaceState=this._originalReplaceState,this._historyPatched=!1)}}class ComponentSet{constructor(app){this.app=app,this.$=app.$,this._components={},this._mainButton=null,this._originalButtonText=null,this._selectors=null}createAll(selectors,textSelector){this._selectors=selectors;var self=this;this._mainButton=new ButtonComponent(selectors.$button,this.app,textSelector),this._originalButtonText=this._mainButton.getText(),this._components.backInStockButton=null,this._components.c
64omingSoonButton=null,FEATURE_PRIORITY.forEach(function(type){self._components[type+"Message"]=new MessageComponent(selectors.$message,self.app,type),self._components[type+"Badge"]=new BadgeComponent(selectors.$badge,self.app,type),self._components[type+"Timer"]=new TimerComponent(selectors.$widgets,self.app,type)}),this._components.sellingPlan=new SellingPlanComponent(selectors.$form,selectors.$widgets,this.app),this._components.modal=this.app.getModal(),this.app.log("ComponentSet: created all components")}getButton(){return this._mainButton}getOriginalButtonText(){return this._originalButtonText}get(featureType,componentType){return componentType==="Button"?featureType==="mainButton"?this._mainButton:this._components[featureType+"Button"]:this._components[featureType+componentType]}createButton(featureType,text){var key=featureType+"Button";return this._components[key]&&this._components[key].remove(),this._components[key]=ButtonComponent.create(this.$,this.app,featureType,text,this._selectors.$button),this._components[key]}removeButton(featureType){var key=featureType+"Button";this._components[key]&&(this._components[key].remove(),this._components[key]=null)}reset(){var self=this;this._mainButton&&(this._mainButton.removeStyle(),this._originalButtonText&&this._mainButton.setText(this._originalButtonText),this._mainButton.enable().show()),["backInStock","comingSoon"].forEach(function(type){self.removeButton(type)}),FEATURE_PRIORITY.forEach(function(type){["Message","Badge","Timer"].forEach(function(comp){var c=self._components[type+comp];c&&c.remove&&c.remove()})}),this._components.sellingPlan&&this._components.sellingPlan.remove(),this._selectors&&this._selectors.$form&&(this._selectors.$form.find("[data-timesact-property]").remove(),this._selectors.$form.find("[data-timesact-tracking]").remove()),this._selectors&&this._selectors.$shopifyPaymentButton&&this._selectors.$shopifyPaymentButton.show()}destroy(){this.reset(),this._components={},this._mainButton=null,this._selectors=null}}class ButtonComponent{constructor($button,app,textSelector){this.$button=$button,this.$el=$button,this.app=app,this._appliedClass=null,this._textSelector=textSelector,this.$textEl=Utils.resolveButtonLabel($button,textSelector,app)}_ensureTextEl(){var detached=!this.$textEl||!this.$textEl.length;return detached||this.$textEl.each(function(){if(!document.contains(this))return detached=!0,!1}),detached&&(this.$textEl=Utils.resolveButtonLabel(this.$button,this._textSelector,this.app)),this.$textEl}static create($,app,featureType,text,$insertAfter){var $newButtons=$();return $insertAfter.each(function(){var $btn=$("<button>",{type:"button",class:"timesact-"+featureType+"-button",text}).hide();$(this).after($btn),$newButtons=$newButtons.add($btn)}),app.log("Created "+$newButtons.length+" button(s) for",featureType),new ButtonComponent($newButtons,app)}getButton(){return this.$button}setText(text){return this._ensureTextEl(),this.$textEl&&this.$textEl.length&&this.$textEl.text(text),this}getText(){return this._ensureTextEl(),this.$textEl&&this.$textEl.length?this.$textEl.first().text().trim():""}setStyle(style,featureType){if(!this.$button||!this.$button.length||!style)return this;this._appliedClass="timesact-"+featureType+"-button",this.$button.addClass(this._appliedClass);var width=style.widthType==="PERCENT"?style.width+"%":style.width+"px",height=style.heightType==="PERCENT"?style.height+"%":style.height+"px";return this.$button.attr("style","width:"+width+"!important;height:"+height+"!important;background-color:"+style.backgroundColor+"!important;border:"+style.borderWidth+"px solid "+style.borderColor+"!important;border-radius:"+style.borderRadius+"px!important;color:"+style.fontColor+"!important;font-size:"+style.fontSize+"px!important;font-style:"+style.fontStyle+"!important;font-weight:"+style.fontWeight+"!important;cursor:pointer;"),this}removeStyle(){return!this.$button||!this.$button.length?this:(this._appliedClass&&this.$button.removeClass(this._appliedClass),this.$button.removeAttr("style"),this._appliedClass=null,this)}enable(){return this.$button&&this.$button.length&&this.$button.prop("disabled",!1),this}disable(){return this.$button&&this.$button.length&&this.$button.prop("disabled",!0),this}show(){return this.$button&&this.$button.length&&this.$button.show(),this}hide(){return this.$button&&this.$button.length&&this.$button.hide(),this}remove(){return this.$button&&this.$button.length&&this.$button.remove(),this.$button=null,this.$textEl=null,this.$el=null,this}}class MessageComponent{constructor($anchor,app,featureType){this.$anchor=$anchor,this.app=app,this.featureType=featureType,this.$el=null}render(config,variant,state,featureConfig,$anchorOverride){var $anchor=$anchorOverride||this.$anchor;if(!$anchor||!$anchor.length||!config||!config.text)return this;this.remove();var text=this._populate(config.text,variant,state,featureConfig),s=config.style||{},self=this,$=this.app.$;return this.$el=$(),$anchor.each(function(){var $msg=$("<div>",{class:"timesact-"+self.featureType+"-message",html:text}).css({"font-size":(s.fontSize||14)+"px",color:s.fontColor||"#000","text-align":s.textAlign||"left","font-weight":s.fontWeight||400,"font-style":s.fontStyle||"normal",margin:"10px 0"});config.placementType==="BELOW"?$(this).after($msg):$(this).before($msg),self.$el=self.$el.add($msg)}),this}_populate(text,variant,state,featureConfig){var self=this,limit=state&&Number(state.preOrderQuantity)||0,sold=state&&Number(state.preOrderQuantitySold)||0,left=Math.max(0,limit-sold);return text.replace(/\{\{inventoryQuantity\}\}/g,variant?variant.inventoryQuantity:0).replace(/\{\{preorderQuantity\}\}/g,limit).replace(/\{\{preorderQuantityLeft\}\}/g,left).replace(/\{\{daysLeftUntilEndDate\}\}/g,state&&state.endDate?Math.max(0,Math.ceil((new Date(state.endDate)-new Date)/864e5)):0).replace(/\{\{shippingDate\}\}/g,self._getShippingDate(featureConfig)).replace(/\{\{daysLeftUntilShippingDate\}\}/g,self._getDaysLeftUntilShippingDate(featureConfig))}_getShippingDate(featureConfig){if(!featureConfig)return"";var type=featureConfig.shippingDateType,data=featureConfig.shippingDateJsonb,locale=this.app.dataManager.locale||"en",opts={day:"numeric",month:"long",year:"numeric"};
64if(!type||type==="ASAP")return"";if(type==="EXACT_DATE")return!data||!data.specificDate?"":new Date(data.specificDate).toLocaleDateString(locale,opts);if(type==="PERIOD"){if(!data)return"";var days=this._periodToDays(data.periodType,data.periodValue),date=new Date;return date.setDate(date.getDate()+days),date.toLocaleDateString(locale,opts)}if(type==="INTERVAL"){if(!data||!data.periodStart||!data.periodEnd)return"";var startDays=this._periodToDays(data.periodStart.type,data.periodStart.value),endDays=this._periodToDays(data.periodEnd.type,data.periodEnd.value),dateStart=new Date;dateStart.setDate(dateStart.getDate()+startDays);var dateEnd=new Date;return dateEnd.setDate(dateEnd.getDate()+endDays),dateStart.toLocaleDateString(locale,opts)+" - "+dateEnd.toLocaleDateString(locale,opts)}return""}_getDaysLeftUntilShippingDate(featureConfig){if(!featureConfig)return 0;var type=featureConfig.shippingDateType,data=featureConfig.shippingDateJsonb;if(!type||type==="ASAP")return 0;if(type==="EXACT_DATE")return!data||!data.specificDate?0:Math.max(0,Math.ceil((new Date(data.specificDate)-new Date)/864e5));if(type==="PERIOD")return data?this._periodToDays(data.periodType,data.periodValue):0;if(type==="INTERVAL"){if(!data||!data.periodStart||!data.periodEnd)return 0;var startDays=this._periodToDays(data.periodStart.type,data.periodStart.value),endDays=this._periodToDays(data.periodEnd.type,data.periodEnd.value);return startDays+" - "+endDays}return 0}_periodToDays(periodType,periodValue){var val=parseInt(periodValue)||1;switch(periodType){case"DAY":return val;case"WEEK":return val*7;case"MONTH":return val*30;default:return val}}show(){return this.$el&&this.$el.show(),this}hide(){return this.$el&&this.$el.hide(),this}remove(){return this.$el&&(this.$el.remove(),this.$el=null),this}}class BadgeComponent{constructor($container,app,featureType){this.$container=$container,this.app=app,this.featureType=featureType,this.$el=null}render(config){if(!this.$container||!this.$container.length||!config)return this;this.remove();var type=config.type||"RIBBON",style=config.style||{},isTop=config.top!==!1,isRight=config.right!==!1;this.$container.css("position","relative");var cls=type==="RIBBON"?"timesact-badge-ribbon":"timesact-badge";return this.$el=this.app.$('<div class="'+cls+" timesact-badge-"+this.featureType+'"><span>'+Utils.escapeHtml(config.text)+"</span></div>"),this.$container.append(this.$el),this._applyStyles(type,style,isTop,isRight),this}_applyStyles(type,style,isTop,isRight){if(this.$el){var offset=type==="RIBBON"?"-5px":"10px",pos=(isTop?"top:"+offset+";":"bottom:"+offset+";")+(isRight?"right:"+offset+";":"left:"+offset+";");if(type==="RIBBON"){var deg=isTop&&isRight?45:isTop&&!isRight?-45:!isTop&&!isRight?-135:135;this.$el.attr("style","position:absolute;"+pos+"width:75px;height:75px;overflow:hidden;z-index:1;"),this.$el.find("span").attr("style","position:absolute;top:"+(isTop?"19px":"35px")+";right:"+(isRight?"-20px":"-5px")+";display:block;width:100px;font-size:"+(style.fontSize||12)+"px;font-weight:"+(style.fontWeight||"bold")+";color:"+(style.fontColor||"#fff")+";background:"+(style.backgroundColor||"#000")+";text-align:center;line-height:20px;transform:rotate("+deg+"deg);box-shadow:0 3px 10px -5px rgba(0,0,0,1);")}else{var shape=type==="ROUNDED"?"border-radius:4rem;padding:0.6rem 1.3rem;":type==="RECTANGLE"?"padding:0.6rem 1.3rem;min-width:60px;":type==="SQUARE"?"width:"+(style.width||60)+"px;height:"+(style.width||60)+"px;":type==="CIRCLE"?"width:"+((style.width||60)+28)+"px;height:"+((style.width||60)+28)+"px;border-radius:50%;padding:14px;":"";this.$el.attr("style","position:absolute;"+pos+"z-index:1;"),this.$el.find("span").attr("style","display:inline-flex;align-items:center;justify-content:center;font-size:"+(style.fontSize||12)+"px;color:"+(style.fontColor||"#fff")+";font-weight:"+(style.fontWeight||"bold")+";background:"+(style.backgroundColor||"#000")+";text-align:center;"+shape)}}}show(){return this.$el&&this.$el.show(),this}hide(){return this.$el&&this.$el.hide(),this}remove(){return this.$el&&(this.$el.remove(),this.$el=null),this}}class TimerComponent{constructor($anchor,app,featureType){this.$anchor=$anchor,this.app=app,this.featureType=featureType,this.$el=null,this._intervalId=null,this._config=null,this._state=null,this._elements={}}render(config,state){if(!this.$anchor||!this.$anchor.length||!config||!config.isEnabled)return this;this.remove(),this._config=config,this._state=state;var content=config.content||{},dates=content.dates||{};if(!this._shouldShow(dates))return this.app.log("Timer: Not yet started, skipping"),this;var endDateSeconds=this._getEndDate(dates,state),nowSeconds=Math.floor(Date.now()/1e3);if(endDateSeconds<=nowSeconds)return this._handleOnEnd(config),this;this._createTimer(config);var placement=config.placement||"BELOW";return placement==="BELOW"?this.$anchor.after(this.$el):this.$anchor.before(this.$el),this._applyStyles(config),this._startCountdown(endDateSeconds,config),this}_shouldShow(dates){if(!dates.startDate)return!0;var startSeconds=this._parseDate(dates.startDate),nowSeconds=Math.floor(Date.now()/1e3);return startSeconds<=nowSeconds}_getEndDate(dates,state){var endAt=dates.endAt||"DATE";switch(endAt){case"END_DATE":return state&&state.endDate?this._parseDate(state.endDate):Math.floor(Date.now()/1e3);case"SHIPPING_DATE":return state&&state.shippingDate?this._parseDate(state.shippingDate):Math.floor(Date.now()/1e3);default:var type=dates.type||"CURRENT";if(type==="FIXED"){var minutes=parseInt(dates.minutes)||1440;return Math.floor(Date.now()/1e3)+minutes*60}else return this._parseDate(dates.endDate)}}_parseDate(date){if(!date)return Math.floor(Date.now()/1e3);if(date._seconds)return date._seconds;if(typeof date=="number")return date;var d=new Date(date);return Math.floor(d.getTime()/1e3)}_createTimer(config){var content=config.content||{},labels=content.labels||{days:"Days",hours:"Hrs",mins:"Mins",secs:"Secs"},$=this.app.$,ft=this.featureType;this.$el=$("<div>",{class:"timesact-timer timesact-timer-"+ft}),content.title&&(this._elements.$title=$("<h2>",{class:"timesact-timer-title",text:content.title}),this.$el.append(this._elements.$title)),content.subheading&&(this._elements.$subheading=$("<p>",{class:"timesact-timer-subheading",text:content.subheading}),this.$el.append(this._elements.$subheading));var $valueContainer=$("<div>",{class:"timesact-timer-value-container"}),units=["days","hours","mins","secs"];this._elements.$values={}
64,units.forEach(function(unit,index){var $value=$("<div>",{class:"timesact-timer-value","data-unit":unit,text:"00"}).attr("translate","no");this._elements.$values[unit]=$value,$valueContainer.append($value),index<units.length-1&&$valueContainer.append($("<div>",{class:"timesact-timer-separator",text:":"}))}.bind(this)),this.$el.append($valueContainer);var $labelsContainer=$("<div>",{class:"timesact-timer-labels-container"});units.forEach(function(unit){var $label=$("<div>",{class:"timesact-timer-label",text:labels[unit]||unit});$labelsContainer.append($label)}),this.$el.append($labelsContainer)}_applyStyles(config){var style=config.style||{},container=style.container||{},title=style.title||{},subheading=style.subheading||{},timer=style.timer||{},labels=style.labels||{};this.$el.css({"max-width":"420px",width:"100%",display:"flex","flex-direction":"column","align-items":"center","text-align":"center",overflow:"hidden","box-sizing":"border-box","margin-top":(container.marginTop||20)+"px","margin-bottom":(container.marginBottom||20)+"px","padding-top":(container.paddingTop||30)+"px","padding-bottom":(container.paddingBottom||30)+"px","padding-left":"20px","padding-right":"20px","background-color":container.background||"#2c2e4a","border-radius":(container.borderRadius||8)+"px","border-width":(container.borderSize||0)+"px","border-style":"solid","border-color":container.borderColor||"#fff"}),this._elements.$title&&this._elements.$title.css({margin:"0 0 5px 0",padding:"0","font-weight":"bold","font-size":(title.fontSize||30)+"px",color:title.color||"#c4c6e3","line-height":"1.2"}),this._elements.$subheading&&this._elements.$subheading.css({margin:"0 0 15px 0",padding:"0","font-size":(subheading.fontSize||18)+"px",color:subheading.color||"#bdc3fb","line-height":"1.5"}),this.$el.find(".timesact-timer-value-container").css({display:"flex","align-items":"center","justify-content":"center",gap:"8px"}),this.$el.find(".timesact-timer-value").css({"font-size":(timer.fontSize||44)+"px",color:timer.color||"#E84545","font-weight":"bold","font-feature-settings":"tnum","font-variant-numeric":"tabular-nums","line-height":"1","min-width":"60px"}),this.$el.find(".timesact-timer-separator").css({"font-size":(timer.fontSize||44)+"px",color:timer.color||"#E84545","font-weight":"bold","line-height":"1"}),this.$el.find(".timesact-timer-labels-container").css({display:"flex","justify-content":"center",gap:"40px","margin-top":"10px"}),this.$el.find(".timesact-timer-label").css({"font-size":(labels.fontSize||14)+"px",color:labels.color||"#bdc3fb","text-transform":"uppercase","letter-spacing":"1px","min-width":"60px"})}_startCountdown(endDateSeconds,config){var self=this,prevVals={},update=function(){var nowSeconds=Math.floor(Date.now()/1e3),diff=endDateSeconds-nowSeconds;if(diff<=0){self._handleOnEnd(config);return}var vals=self._calculateTime(diff);Object.keys(vals).forEach(function(unit){prevVals[unit]!==vals[unit]&&self._elements.$values[unit]&&self._elements.$values[unit].text(vals[unit])}),prevVals=vals};update(),this._intervalId=setInterval(update,1e3)}_calculateTime(diffSeconds){var days=Math.floor(diffSeconds/86400),hours=Math.floor(diffSeconds%86400/3600),mins=Math.floor(diffSeconds%3600/60),secs=diffSeconds%60;return{days:this._pad(days),hours:this._pad(hours),mins:this._pad(mins),secs:this._pad(secs)}}_pad(num){return num<10?"0"+num:String(num)}_handleOnEnd(config){var content=config.content||{},onceItEnds=content.onceItEnds||{},action=onceItEnds.value||"unpublish-timer",dates=content.dates||{};switch(this._stopInterval(),action){case"unpublish-timer":this.remove();break;case"repeat-the-countdown":if(dates.type==="FIXED"&&(!dates.endAt||dates.endAt==="DATE")){var self=this;setTimeout(function(){var minutes=parseInt(dates.minutes)||1440,newEndDate=Math.floor(Date.now()/1e3)+minutes*60;self._startCountdown(newEndDate,config)},500)}else this.remove();break;case"show-custom-title":if(this.$el){var customTitle=onceItEnds.customTitle||"Time ended";this.$el.html('<div class="timesact-timer-ended">'+Utils.escapeHtml(customTitle)+"</div>"),this._applyEndedStyles(config)}break;default:this.remove()}}_applyEndedStyles(config){var style=config.style||{},container=style.container||{},title=style.title||{};this.$el.find(".timesact-timer-ended").css({"font-size":(title.fontSize||24)+"px",color:title.color||"#c4c6e3","font-weight":"bold","text-align":"center",padding:"20px"})}_stopInterval(){this._intervalId&&(clearInterval(this._intervalId),this._intervalId=null)}show(){return this.$el&&this.$el.show(),this}hide(){return this.$el&&this.$el.hide(),this}remove(){return this._stopInterval(),this.$el&&(this.$el.remove(),this.$el=null),this._elements={},this}}class SellingPlanComponent{constructor($form,$anchor,app){this.$form=$form,this.$anchor=$anchor,this.app=app,this.$widget=null}render(sellingPlan,config){if(!this.$form||!this.$form.length||!sellingPlan)return this;this.remove();var isFullPayment=sellingPlan.options&&sellingPlan.options[0]&&sellingPlan.options[0].name==="FULL_PAYMENT";if(isFullPayment){var $existingInput=this.$form.find('input[name="selling_plan"]');return $existingInput.length?$existingInput.val(sellingPlan.id):this.$form.append('<input type="hidden" name="selling_plan" value="'+sellingPlan.id+'" data-timesact-selling-plan>'),this.app.log("Selling plan FULL_AMOUNT, hidden input only:",sellingPlan.id),this}config=config||{};var content=config.content||{},style=config.style||{},planLabel=content.description||sellingPlan.options&&sellingPlan.options[0]&&sellingPlan.options[0].value||sellingPlan.name||"Pre-order";return this.$widget=this.app.$('<div class="timesact-selling-plan-widget"><div class="timesact-selling-plan-wrapper"><label class="timesact-selling-plan-option"><input type="radio" name="selling_plan" value="'+sellingPlan.id+'" checked data-timesact-selling-plan><span class="timesact-selling-plan-radio"><span class="timesact-selling-plan-radio-dot"></span></span><span class="timesact-selling-plan-label">'+planLabel+"</span></label></div></div>"),this._applyStyles(style),this.$anchor.before(this.$widget),this.app.log("Rendered selling plan widget:",sellingPlan.id),this}_applyStyles(style){if(!(!this.$widget||!style)){var $=this.app.$,radioSize=style.radioSize||20,dotSize=Math.floor(radioSize*.5),selectedColor=style.radioSelectedColor||"#000000";this.$widget.find(".timesact-selling-plan-wrapper").css({padding:(style.padding||14)+"px","max-width":(style.maxWidth||500)+"px",border:(style.borderWidth||1.5)+"px solid "+(style.borderColor||"#e5e7eb"),"border-radius":(style.borderRadius||8)+"px"}),this.$widget.find(".timesact-selling-plan-label").css({"font-size":(style.fontSize||13)+"px","font-weight":style.fontWeight||400,color:style.fontColor||"#225fe2"}),this.$widget.find(".timesact-selling-plan-radio").css({width:radioSize+"px",height:radioSize+"px"}),this.$widget.find(".timesact-selling-plan-radio-dot").css({width:dotSize+"px",height:dotSize+"px","border-radius":"50%","background-color":"transparent",transition:"background-color 0.2s ease"}),this.$widget.find('input[type="radio"]').on("change",function(){var $radio=$(this).siblings(".timesact-selling-plan-radio"),$dot=$radio.find(".timesact-selling-plan-radio-dot");this.checked?($radio.css("border-color",selectedColor),$dot.css("background-color",selectedColor)):($radio.css("border-color","#d1d5db"),$dot.css("background-color","transparent"))}).trigger("change")}}remove(){return this.$form.find("[data-timesact-selling-plan]").remove(),this.$form.find("[data-timesact-property]").remove(),this.$form.find("[data-timesact-tracking]").remove(),this.$widget&&(this.$widget.remove(),this.$widget=null),this}}class ModalComponent{constructor(app){this.app=app,this.$=app.$,this.$overlay=null,this.$modal=null,this._isOpen=!1,this._config=null,this._productData=null,this._injected=!1,this._smsEnabled=!1,this._hasFormNote=!1,this._newsletterEnabled=!1}init(){this._injected||(this._injectHTML(),this._bindEvents(),this._injected=!0)}_injectHTML(){var html='<div class="timesact-modal-overlay"> </div><div class="timesact-modal" role="dialog" aria-modal="true"><div class="timesact-modal-content"><div class="timesact-modal-form-state"><button type="button" class="timesact-modal-close" aria-label="Close"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg></button><div class="timesact-modal-product"><img class="timesact-modal-product-image" src="" alt="" style="display:none;"><h3 class="timesact-modal-product-name"></h3></div><div class="timesact-modal-header"><p class="timesact-modal-description"></p></div><div class="timesact-modal-body"><div class="timesact-message timesact-message-error"></div><form class="timesact-form" novalidate><div class="timesact-form-group timesact-variant-group" style="display:none;"><select id="timesact-variant" name="variant" class="timesact-form-input timesact-variant-select"></select></div><div class="timesact-form-group timesact-email-group"><input type="email" id="timesact-email" name="email" class="timesact-form-input" placeholder="'+DEFAULT_BIS_COPY.emailPlaceholder+'" required></div><p class="timesact-modal-note"></p><button type="submit" class="timesact-submit-btn"><span class="timesact-btn-text"></span><span class="timesact-spinner" style="display:none;"></span></button>
64<div class="timesact-checkbox-group timesact-newsletter-group" style="display:none;"><input type="checkbox" id="timesact-newsletter" name="newsletter" class="timesact-checkbox"><label for="timesact-newsletter" class="timesact-checkbox-label"></label></div><div class="timesact-checkbox-group timesact-shop-notify-group" style="display:none;"><input type="checkbox" id="timesact-shop-notify" name="shop_notify" class="timesact-checkbox" checked><label for="timesact-shop-notify" class="timesact-checkbox-label">Also notify me on <svg class="timesact-shop-logo" width="40" height="16" viewBox="0 0 260 260" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#ts-clip)"><path d="M38.58 123.21C28.94 121.12 24.64 120.3 24.64 116.58C24.64 113.09 27.55 111.35 33.37 111.35C38.48 111.35 42.22 113.58 44.97 117.96C45.18 118.3 45.61 118.42 45.96 118.23L56.81 112.75C57.2 112.56 57.34 112.06 57.12 111.68C52.62 103.87 44.29 99.6 33.34 99.6C18.94 99.6 10 106.69 10 117.97C10 129.96 20.89 132.98 30.55 135.08C40.21 137.17 44.52 137.99 44.52 141.7C44.52 145.42 41.37 147.17 35.1 147.17C29.32 147.17 25.02 144.52 22.42 139.38C22.23 139 21.77 138.84 21.4 139.04L10.57 144.41C10.19 144.6 10.04 145.06 10.23 145.45C14.53 154.09 23.34 158.95 35.12 158.95C50.11 158.95 59.17 151.97 59.17 140.34C59.17 128.71 48.23 125.33 38.58 123.24V123.21Z" fill="#5433EB"/><path d="M96.74 99.6C90.58 99.6 85.15 101.78 81.24 105.67C80.99 105.9 80.59 105.73 80.59 105.4V80.59C80.59 80.16 80.25 79.82 79.82 79.82H66.25C65.82 79.82 65.48 80.16 65.48 80.59V157.58C65.48 158.01 65.82 158.35 66.25 158.35H79.82C80.25 158.35 80.59 158.01 80.59 157.58V123.81C80.59 117.29 85.59 112.28 92.32 112.28C99.06 112.28 103.94 117.18 103.94 123.81V157.58C103.94 158.01 104.28 158.35 104.71 158.35H118.29C118.71 158.35 119.05 158.01 119.05 157.58V123.81C119.05 109.62 109.76 99.61 96.74 99.61V99.6Z" fill="#5433EB"/><path d="M146.62 97.4C139.25 97.4 132.32 99.65 127.36 102.91C127.02 103.13 126.91 103.59 127.12 103.94L133.1 114.17C133.32 114.53 133.79 114.66 134.15 114.44C137.92 112.17 142.22 110.98 146.62 111.01C158.48 111.01 167.19 119.38 167.19 130.44C167.19 139.86 160.22 146.84 151.38 146.84C144.17 146.84 139.17 142.64 139.17 136.71C139.17 133.32 140.62 130.54 144.37 128.58C144.76 128.37 144.9 127.89 144.67 127.51L139.02 117.95C138.84 117.64 138.45 117.49 138.1 117.62C130.53 120.43 125.22 127.19 125.22 136.26C125.22 149.98 136.14 160.22 151.36 160.22C169.15 160.22 181.93 147.89 181.93 130.2C181.93 111.24 167.06 97.39 146.6 97.39L146.62 97.4Z" fill="#5433EB"/><path d="M221.64 99.49C214.77 99.49 208.64 102.03 204.16 106.5C203.92 106.75 203.52 106.56 203.52 106.23V100.85C203.52 100.42 203.18 100.08 202.75 100.08H189.52C189.09 100.08 188.76 100.42 188.76 100.85V177.72C188.76 178.15 189.09 178.49 189.52 178.49H203.1C203.53 178.49 203.87 178.15 203.87 177.72V152.51C203.87 152.18 204.27 152.01 204.52 152.23C208.98 156.39 214.89 158.82 221.65 158.82C237.58 158.82 250 145.91 250 129.15C250 112.39 237.56 99.48 221.65 99.48L221.64 99.49ZM219.08 145.8C210.02 145.8 203.15 138.58 203.15 129.05C203.15 119.51 210.01 112.3 219.08 112.3C228.15 112.3 234.99 119.39 234.99 129.05C234.99 138.7 228.24 145.8 219.07 145.8H219.08Z" fill="#5433EB"/></g><defs><clipPath id="ts-clip"><rect width="240" height="99.8" fill="white" transform="translate(10 79.82)"/></clipPath></defs></svg></label></div></form></div><div class="timesact-modal-footer"><p class="timesact-powered-by">Powered by <a href="https://timesact.com" target="_blank">Timesact</a></p></div></div><div class="timesact-modal-success"><div class="timesact-success-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="20 6 9 17 4 12"></polyline></svg></div><h3 class="timesact-success-title"></h3><button type="button" class="timesact-success-close"></button></div></div></div>',$html=this.$(html);this.$("body").append($html),this.$overlay=$html.filter(".timesact-modal-overlay"),this.$modal=$html.filter(".timesact-modal")}_bindEvents(){var self=this;this.$modal.find(".timesact-modal-close, .timesact-success-close").on("click",function(){self.close()}),this.$overlay.on("click",function(){self.close()}),this.$(document).on("keydown.timesact-modal",function(e){e.key==="Escape"&&self._isOpen&&self.close()}),this.$modal.find(".timesact-form").on("submit",function(e){e.preventDefault(),self._handleSubmit()}),this.$modal.find(".timesact-variant-select").on("change",function(){self._productData&&(self._productData.variantId=Number(self.$(this).val()),self._productData.variantName=self.$(this).find("option:selected").text(),self.app.log("Modal variant changed:",self._productData.variantId,self._productData.variantName))})}open(config,productData){this.app.log("Modal: open() called, _isOpen:",this._isOpen),this.app.log("Modal: productData:",JSON.stringify({productId:productData.productId,variantId:productData.variantId,variantName:productData.variantName,productName:productData.productName})),this._isOpen&&this.close(),this.init(),this._config=config,this._productData=productData;var $img=this.$modal.find(".timesact-modal-product-image");productData.productImage?$img.attr("src",productData.productImage).attr("alt",productData.productName||"").show():$img.hide(),this.$modal.find(".timesact-modal-product-name").text(productData.productName||""),this._applyConfig(config),this._resetState(),this._populateVariants(productData.variants,productData.variantId),this.$overlay.addClass("timesact-modal-open"),this.$modal.addClass("timesact-modal-open"),this._isOpen=!0,this.$("body").css("overflow","hidden")}close(){if(this.app.log("Modal: close() called, _isOpen:",this._isOpen),!this._isOpen){this.app.log("Modal: close() skipped - already closed");return}this.$overlay.removeClass("timesact-modal-open"),this.$modal.removeClass("timesact-modal-open"),this._isOpen=!1,this._productData=null,this._config=null,this.$("body").css("overflow",""),this._resetState(),this.app.log("Modal: close() complete")}_applyConfig(config){var form=config&&config.notifyMeForm;this._smsEnabled=!!(form&&form.smsEnabled===!0);var content=form&&form.content||{};if(this._hasFormNote=!!content.note,this._newsletterEnabled=!!(form&&form.newsletter&&form.newsletter.isEnabled),this._renderSmsFields(content),this.$modal.find(".timesact-modal-note").toggle(this._hasFormNote),this.$modal.find(".timesact-ne
64wsletter-group").toggle(this._newsletterEnabled),!form){this._formConfig=null;return}this._formConfig=form;var newsletter=form.newsletter||{},style=form.style||{};this.$modal.find(".timesact-modal-description").text(content.description||""),this.$modal.find("#timesact-email").attr("placeholder",content.emailPlaceholder||DEFAULT_BIS_COPY.emailPlaceholder),this.$modal.find(".timesact-btn-text").text(content.buttonText||DEFAULT_BIS_COPY.buttonText),this.$modal.find(".timesact-modal-note").text(content.note||""),this.$modal.find(".timesact-success-title").text(content.successMessage||DEFAULT_BIS_COPY.successMessage),this.$modal.find(".timesact-success-close").text(content.successButtonText||DEFAULT_BIS_COPY.successButtonText),this.$modal.find('label[for="timesact-newsletter"]').text(newsletter.label||""),this.$modal.find(".timesact-shop-notify-group").toggle(FEATURE_FLAGS.ENABLE_SHOP_NOTIFY),this.$modal.find(".timesact-powered-by").toggle(form.showBranding!==!1);var fontSize=style.fontSize||16,borderRadius=style.borderRadius||8,fieldsBorderRadius=style.fieldsBorderRadius||4,headingColor=style.headingColor||"#000000",textColor=style.textColor||"#333333",buttonTextColor=style.buttonTextColor||"#FFFFFF",buttonBackgroundColor=style.buttonBackgroundColor||"#000000";this.$modal.find(".timesact-modal-content").css({"border-radius":borderRadius+"px"}),this.$modal.find(".timesact-modal-description").css({color:textColor,"font-size":fontSize+"px"}),this.$modal.find(".timesact-modal-note").css({color:textColor,"font-size":fontSize+"px",margin:"10px 0"}),this.$modal.find(".timesact-sms-compliance").css({color:textColor}),this.$modal.find(".timesact-checkbox-label").css({color:textColor,"font-size":fontSize+"px"}),this.$modal.find(".timesact-form-input").css({"border-radius":fieldsBorderRadius+"px","font-size":fontSize+"px"}),this.$modal.find(".timesact-submit-btn").css({background:style.useGradient?Utils.autoGradient(buttonBackgroundColor):buttonBackgroundColor,color:buttonTextColor,"border-radius":fieldsBorderRadius+"px","font-size":fontSize+"px"}),this.$modal.find(".timesact-success-title").css({color:headingColor,"font-size":Math.round(fontSize*1.25)+"px"}),this.$modal.find(".timesact-success-close").css({"background-color":buttonBackgroundColor,color:buttonTextColor,"border-radius":fieldsBorderRadius+"px","font-size":fontSize+"px"}),this.$modal.find(".timesact-success-icon svg").css({stroke:buttonBackgroundColor}),this.$modal.find(".timesact-message-error").css({"font-size":fontSize+"px"})}_renderSmsFields(content){if(this.$modal.find(".timesact-phone-group, .timesact-sms-compliance").remove(),this.$modal.find("#timesact-email").prop("required",!this._smsEnabled),!!this._smsEnabled){var userCountry=typeof this.app.getUserCountry=="function"?this.app.getUserCountry():this.app.data&&this.app.data.userCountry;userCountry=String(userCountry||"US").toUpperCase();var hasUserCountry=DIAL_CODE_COUNTRIES.some(function(country){return country.code===userCountry}),selectedCountry=hasUserCountry?userCountry:"US",countryOptions=DIAL_CODE_COUNTRIES.map(function(country){var selected=country.code===selectedCountry?" selected":"";return'<option value="'+country.code+'" data-dial-code="'+country.dialCode+'" title="'+country.label+'"'+selected+">"+country.code+" ("+country.dialCode+")</option>"}).join(""),phoneHtml='<div class="timesact-form-group timesact-phone-group"><label id="timesact-phone-label" for="timesact-phone" class="timesact-form-label timesact-sms-label"></label><div class="timesact-phone-row"><select id="timesact-country" name="country" class="timesact-form-input timesact-country-select" aria-label="Country calling code">'+countryOptions+'</select><input type="tel" id="timesact-phone" name="phone" class="timesact-form-input timesact-phone-input" autocomplete="tel-national" inputmode="tel" aria-labelledby="timesact-phone-label"></div></div>',complianceHtml='<p class="timesact-sms-compliance"></p>';this.$modal.find(".timesact-email-group").after(phoneHtml),this.$modal.find(".timesact-submit-btn").after(complianceHtml),this.$modal.find(".timesact-sms-label").text(content.smsLabel||DEFAULT_BIS_COPY.smsLabel);var phonePlaceholder=content.phonePlaceholder||DEFAULT_BIS_COPY.phonePlaceholder;this.$modal.find("#timesact-phone").attr("placeholder",phonePlaceholder);var complianceText=content.smsComplianceText||DEFAULT_BIS_COPY.smsComplianceText;this.$modal.find(".timesact-sms-compliance").text(complianceText)}}_resetState(){this.app.log("Modal: resetting state");var form=this.$modal.find(".timesact-form")[0];form&&form.reset(),this.$modal.find("#timesact-email, #timesact-phone").val("").removeClass("timesact-input-error"),this.$modal.find(".timesact-message-error").removeClass("timesact-message-show").text(""),this.$modal.find("#timesact-ne
64wsletter").prop("checked",!1),this.$modal.find("#timesact-shop-notify").prop("checked",!0),this.$modal.find(".timesact-modal-form-state").removeAttr("style").show(),this.$modal.find(".timesact-modal-success").removeClass("timesact-show").removeAttr("style"),this._setLoading(!1)}_populateVariants(variants,selectedVariantId){var $group=this.$modal.find(".timesact-variant-group"),$select=this.$modal.find(".timesact-variant-select"),$=this.$;if($select.empty(),!variants||variants.length<=1){$group.hide();return}variants.forEach(function(v){var label=v.title||"Variant "+v.id,$option=$("<option>").val(v.id).text(label);Number(v.id)===Number(selectedVariantId)&&$option.prop("selected",!0),$select.append($option)}),$group.show()}_setLoading(loading){var $btn=this.$modal.find(".timesact-submit-btn");$btn.prop("disabled",loading),$btn.find(".timesact-btn-text").toggle(!loading),$btn.find(".timesact-spinner").toggle(loading)}_getActiveField(channel){var content=this._formConfig&&this._formConfig.content||{},isSms=channel==="SMS",$input=this.$modal.find(isSms?"#timesact-phone":"#timesact-email"),rawValue=String($input.val()||"").trim(),value=rawValue;if(isSms&&rawValue){var dialCode=String(this.$modal.find("#timesact-country option:selected").attr("data-dial-code")||""),nationalNumber=rawValue.replace(/[\s().-]/g,"");rawValue.charAt(0)==="+"&&nationalNumber.indexOf(dialCode)===0&&(nationalNumber=nationalNumber.slice(dialCode.length)),value=dialCode+nationalNumber}return{channel:isSms?"SMS":"EMAIL",$input,provided:rawValue.length>0,value,validator:isSms?this._validatePhone:this._validateEmail,errorMessage:isSms?content.phoneErrorMessage||DEFAULT_BIS_COPY.phoneError:DEFAULT_BIS_COPY.emailError}}async _handleSubmit(){var content=this._formConfig&&this._formConfig.content||{},errorMessage=content.errorMessage||DEFAULT_BIS_COPY.submitError,fields=[this._getActiveField("EMAIL")];this._smsEnabled&&fields.push(this._getActiveField("SMS"));var providedFields=fields.filter(function(field){return field.provided});if(providedFields.length===0){fields.forEach(function(field){field.$input.addClass("timesact-input-error")}),this._showError(this._smsEnabled?DEFAULT_BIS_COPY.contactError:DEFAULT_BIS_COPY.emailError);return}var invalidFields=providedFields.filter(function(field){var isValid=field.validator(field.value);return field.$input.toggleClass("timesact-input-error",!isValid),!isValid});if(fields.filter(function(field){return!field.provided}).forEach(function(field){field.$input.removeClass("timesact-input-error")}),invalidFields.length>0){this._showError(invalidFields[0].errorMessage);return}this.$modal.find(".timesact-message-error").removeClass("timesact-message-show").text(""),this._setLoading(!0);try{var self=this,commonPayload={productId:String(this._productData.productId),variantId:String(this._productData.variantId),variantName:this._productData.variantName,productName:this._productData.productName,customerExperienceId:this._productData.customerExperienceId||null},results=await Promise.all(providedFields.map(function(field){var payload=Object.assign({},commonPayload,{type:field.channel,value:field.value,subscribeToNewsletter:field.channel==="EMAIL"&&self.$modal.find("#timesact-newsletter").is(":checked")});return self.app.api.submitBisSubscription(payload).then(function(){return{field,error:null}}).catch(function(err){return{field,error:err}})})),successful=results.filter(function(result){return!result.error}),failed=results.filter(function(result){return result.error}),failureMessages=failed.map(function(result){var channelName=result.field.channel==="EMAIL"?"email":"SMS";return"Could not submit your "+channelName+" notification: "+(result.error.message||errorMessage)});if(successful.length>0){if(failed.length>0){var savedChannels=successful.map(function(result){return result.field.channel==="EMAIL"?"email":"SMS"}).join(" and ");this.$modal.find(".timesact-success-title").text("Your "+savedChannels+" notification was saved. "+failureMessages.join(" "))}this._showSuccess()}else this._showError(failureMessages.join(" "))}catch(err){this._showError(err.message||errorMessage)}
64finally{this._setLoading(!1)}}_validateEmail(email){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)}_validatePhone(phone){var normalized=String(phone||"").replace(/[\s().-]/g,"");return/^\+\d{7,15}$/.test(normalized)}_showError(message){this.$modal.find(".timesact-message-error").text(message).addClass("timesact-message-show")}_showSuccess(){this.$modal.find(".timesact-modal-form-state").hide(),this.$modal.find(".timesact-modal-success").addClass("timesact-show")}}class Api{constructor($,app){this.$=$,this.app=app,this.baseUrl="/apps/timesact/v2"}async submitBisSubscription(payload){var self=this;return this.app.log("BIS subscription request:",payload),new Promise(function(resolve,reject){self.$.ajax({url:self.baseUrl+"/notifications/back-in-stock",type:"POST",contentType:"application/json; charset=utf-8",dataType:"json",data:JSON.stringify(payload)}).done(function(){self.app.log("BIS subscription success"),resolve()}).fail(function(xhr){if(xhr.status===409){self.app.log("BIS subscription already exists (409) - treating as success"),resolve();return}var errorMsg=DEFAULT_BIS_COPY.submitError;try{var response=xhr.responseJSON||JSON.parse(xhr.responseText);response.message&&(errorMsg=response.message)}catch{}self.app.warn("BIS subscription failed:",xhr.status,errorMsg),reject(new Error(errorMsg))})})}}class CartAlertManager{constructor(app){this.app=app,this._alertModal=null,this._dismissedAlerts={},this._currentAlertKey=null,this._queue=[]}init(){this._loadDismissed()}_loadDismissed(){try{var stored=localStorage.getItem("timesact_dismissed_alerts");stored&&(this._dismissedAlerts=JSON.parse(stored))}catch{}}_saveDismissed(){try{localStorage.setItem("timesact_dismissed_alerts",JSON.stringify(this._dismissedAlerts))}catch{}}checkMixedCart(isCartPage){if(this._dismissedAlerts.mixedCart){this.app.log(`Mixed cart alert: skipped, dismissed via "don't show again"`);return}var self=this;this._fetchCart().then(function(cart){return!cart||!cart.items||cart.items.length===0?(self.app.log("Mixed cart alert: cart empty or fetch failed"),null):isCartPage?cart:self._ensureVariantData(cart.items).then(function(){return cart})}).then(function(cart){if(cart){var hasPreOrder=!1,hasRegular=!1,preOrderCEIds=[];if(cart.items.forEach(function(item){var preOrderInfo=self._getPreOrderInfo(item);preOrderInfo.isPreOrder?(hasPreOrder=!0,preOrderInfo.ceId&&preOrderCEIds.push(preOrderInfo.ceId)):hasRegular=!0}),self.app.log("Mixed cart alert: check",{isCartPage,items:cart.items.length,hasPreOrder,hasRegular,preOrderCEIds}),hasPreOrder&&hasRegular){var config=self._getMixedCartConfigFromCEs(preOrderCEIds);if(config&&config.isEnabled){var triggers=config.triggers||{},allowed=isCartPage?triggers.onCartPage!==!1:triggers.onButtonClick!==!1;self.app.log("Mixed cart alert: config found, triggers:",triggers,"allowed:",allowed),allowed&&self._showAlert("mixed",config,null)}else self.app.log("Mixed cart alert: no enabled config on pre-order CEs",preOrderCEIds,config)}}})}async _fetchCart(){try{var response=await fetch("/cart.js");return await response.json()}catch{return null}}_getPreOrderInfo(item){if(item.selling_plan_allocation){var ceId=this._getCEIdBySellingPlan(String(item.selling_plan_allocation.selling_plan.id));if(ceId)return{isPreOrder:!0,ceId}}var variantId=item.variant_id||item.variantId,ceId=this._getCEIdByPreOrderStatus(variantId);return ceId?{isPreOrder:!0,ceId}:(ceId=this._getCEIdFromVariantData(variantId),ceId?{isPreOrder:!0,ceId}:item.properties&&item.properties._timesact_preorder==="true"?{isPreOrder:!0,ceId:null}:{isPreOrder:!1,ceId:null})}_matchesMarket(experienceOrId){var dataManager=this.app.dataManager,experience=experienceOrId&&typeof experienceOrId=="object"?experienceOrId:dataManager.getExperience(experienceOrId);return experience?dataManager._matchesMarket(experience,this.app.getUserCountry()):!1}_getCEIdBySellingPlan(sellingPlanId){var experiences=this.app.dataManager.experiences;for(var expId in experiences){var exp=experiences[expId];if(exp.preOrderEnabled&&exp.preOrderConfig&&String(exp.preOrderConfig.sellingPlanId)===sellingPlanId){if(!this._matchesMarket(exp))continue;return expId}}return null}_getCEIdByPreOrderStatus(variantId){var dataManager=this.app.dataManager;if(dataManager.cart&&dataManager.cart.items)for(var i=0;i<dataManager.cart.items.length;i++){var item=dataManager.cart.items[i];if(item.variantId===variantId&&item.experiencesState){for(var expId in item.experiencesState)if(item.experiencesState[expId].preOrderStatus===ACTIVE_STATUS){if(!this._matchesMarket(expId))continue;return expId}}}return null}_getCEIdFromVariantData(variantId){if(!variantId)return null;var variant=this.app.dataManager.getVariant(variantId);if(!variant||!variant.experiencesState)return null;for(var expId in variant.experiencesState){var state=variant.experiencesState[expId];if(state&&state.preOrderStatus===ACTIVE_STATUS){if(!this._matchesMarket(expId))continue;return expId}}return null}
64hasAnyMixedAlertEnabled(){var experiences=this.app.dataManager.experiences;for(var expId in experiences){var exp=experiences[expId];if(!(!exp||!exp.preOrderEnabled||!exp.preOrderConfig)){var ui=exp.preOrderConfig.uiConfig;if(!(!ui||!ui.cart||!ui.cart.mixedAlert||!ui.cart.mixedAlert.isEnabled)&&this._matchesMarket(exp))return!0}}return!1}_ensureVariantData(items){var self=this,dataManager=this.app.dataManager,client=this.app.storefrontClient,missing=[];return items.forEach(function(item){var variantId=item.variant_id||item.variantId;variantId&&(dataManager.hasVariantData(variantId)||missing.indexOf(variantId)===-1&&missing.push(variantId))}),missing.length?client?(this.app.log("Cart alerts: fetching variant data for cart lines",missing),Promise.all(missing.map(function(id){return client.fetchVariant(id)})).then(function(){},function(){})):(this.app.log("Cart alerts: no Storefront API client, cannot resolve CE for cart lines",missing),Promise.resolve()):Promise.resolve()}_getMixedCartConfigFromCEs(ceIds){for(var experiences=this.app.dataManager.experiences,i=0;i<ceIds.length;i++){var exp=experiences[ceIds[i]];if(!(exp&&!this._matchesMarket(exp))&&exp&&exp.preOrderConfig&&exp.preOrderConfig.uiConfig&&exp.preOrderConfig.uiConfig.cart&&exp.preOrderConfig.uiConfig.cart.mixedAlert)return exp.preOrderConfig.uiConfig.cart.mixedAlert}return null}checkProductAlertsOnCart(){var cartItems=this.app.dataManager.cart&&this.app.dataManager.cart.items;if(!(!cartItems||!cartItems.length))for(var shownCEs={},i=0;i<cartItems.length;i++){var item=cartItems[i],preOrderInfo=this._getPreOrderInfo(item);if(preOrderInfo.isPreOrder&&preOrderInfo.ceId){if(shownCEs[preOrderInfo.ceId])continue;var alertConfig=this._getProductAlertConfigForCE(preOrderInfo.ceId);if(alertConfig&&alertConfig.isEnabled){this.showProductAlert(alertConfig,preOrderInfo.ceId,!0),shownCEs[preOrderInfo.ceId]=!0;break}}}}showProductAlert(config,ceId,isCartPage){if(!(!config||!config.isEnabled)&&this._matchesMarket(ceId)){var triggers=config.triggers||{};if(!(isCartPage&&triggers.onCartPage===!1)&&!(!isCartPage&&triggers.onButtonClick!==!0)){var alertId="ce_"+ceId;this._dismissedAlerts[alertId]||this._showAlert("product",config,alertId)}}}_getProductAlertConfigForCE(ceId){var exp=this.app.dataManager.experiences[ceId];return exp&&!this._matchesMarket(exp)?null:exp&&exp.preOrderEnabled&&exp.preOrderConfig&&exp.preOrderConfig.uiConfig&&exp.preOrderConfig.uiConfig.cart&&exp.preOrderConfig.uiConfig.cart.alert?exp.preOrderConfig.uiConfig.cart.alert:null}_showAlert(type,config,alertId){var self=this;this._alertModal||(this._alertModal=new CartAlertModal(this.app));var key=type+":"+(alertId||"");if(this._alertModal._isOpen){if(key===this._currentAlertKey)return;var alreadyQueued=this._queue.some(function(q){return q.key===key});alreadyQueued||(this._queue.push({key,type,config,alertId}),this.app.log("Cart alert queued:",key));return}this._currentAlertKey=key,this._alertModal.open(config,function(dismissed){self._currentAlertKey=null,dismissed&&(type==="mixed"?self._dismissedAlerts.mixedCart=!0:alertId&&(self._dismissedAlerts[alertId]=!0),self._saveDismissed()),self._showNextQueued()})}_showNextQueued(){for(var self=this;this._queue.length;){var next=this._queue.shift();if(!(next.type==="mixed"&&this._dismissedAlerts.mixedCart)&&!(next.alertId&&this._dismissedAlerts[next.alertId])){setTimeout(function(){self._showAlert(next.type,next.config,next.alertId)},0);return}}}}class CartAlertModal{constructor(app){this.app=app,this.$=app.$,this.$overlay=null,this.$modal=null,this._isOpen=!1,this._onClose=null,this._injected=!1}init(){this._injected||(this._injectHTML(),this._bindEvents(),this._injected=!0)}_injectHTML(){var html='<div class="timesact-alert-overlay"> </div><div class="timesact-alert-modal" role="dialog" aria-modal="true"><div class="timesact-alert-content"><h2 class="timesact-alert-header"></h2><p class="timesact-alert-body"></p><button type="button" class="timesact-alert-button"></button><label class="timesact-alert-dismiss"><input type="checkbox" class="timesact-alert-dismiss-checkbox"><span class="timesact-alert-dismiss-text"></span></label></div></div>';this.$("body").append(html),this.$overlay=this.$(".timesact-alert-overlay"),this.$modal=this.$(".timesact-alert-modal")}_bindEvents(){var self=this;this.$modal.find(".timesact-alert-button").on("click",function(){self.close()}),this.$overlay.on("click",function(){self.close()}),this.$(document).on("keydown.timesact-alert",function(e){e.key==="Escape"&&self._isOpen&&self.close()})}open(config,onClose){if(!this._isOpen){this.init(),this._onClose=onClose;var content=config.content||{},style=config.style||{};this.$modal.find(".timesact-alert-header").text(content.title||"Important Notice"),this.$modal.find(".timesact-alert-body").text(content.message||""),this.$modal.find(".timesact-alert-button").text(content.buttonText||"OK"),this.$modal.find(".timesact-alert-dismiss-text").text(content.dismissLabel||"Don't show this again"),this.$modal.find(".timesact-alert-button").css({"background-color":style.buttonBackgroun
64dColor||"#f70427",color:style.buttonTextColor||"#FFFFFF"}),this.$modal.find(".timesact-alert-dismiss-checkbox").prop("checked",!1),this.$overlay.addClass("timesact-alert-open"),this.$modal.addClass("timesact-alert-open"),this._isOpen=!0,this.$("body").css("overflow","hidden")}}close(){if(this._isOpen){var dismissed=this.$modal.find(".timesact-alert-dismiss-checkbox").is(":checked");this.$overlay.removeClass("timesact-alert-open"),this.$modal.removeClass("timesact-alert-open"),this._isOpen=!1,this.$("body").css("overflow",""),this._onClose&&this._onClose(dismissed)}}}class BaseFeatureHandler{constructor(app){this.app=app,this.$=app.$,this.dataManager=app.dataManager,this.components=null}_applyFeature(featureType,config,variant,state,hasPreOrder,experience){var behavior=FEATURE_BEHAVIOR[featureType],uiConfig=config.uiConfig,btn=uiConfig.button;if(this.app.log("Applying feature:",featureType),behavior.createsNewButton){var newButton=this.components.createButton(featureType,btn.text);btn.type==="CUSTOM"&&btn.style&&newButton.setStyle(btn.style,featureType),behavior.isDisabled&&newButton.disable(),newButton.show(),hasPreOrder||(this.components.getButton().hide(),behavior.hidePaymentButtons&&this.components._selectors.$shopifyPaymentButton&&this.components._selectors.$shopifyPaymentButton.hide())}else{var mainButton=this.components.getButton();mainButton.setText(btn.text),btn.type==="CUSTOM"&&btn.style&&mainButton.setStyle(btn.style,featureType),mainButton.enable().show(),behavior.hidePaymentButtons&&this.components._selectors.$shopifyPaymentButton&&this.components._selectors.$shopifyPaymentButton.hide()}if(uiConfig.message&&uiConfig.message.text){var $msgAnchor=behavior.createsNewButton&&newButton?newButton.$el:null;this.components.get(featureType,"Message").render(uiConfig.message,variant,state,config,$msgAnchor)}if(uiConfig.badge&&uiConfig.badge.isEnabled&&uiConfig.badge.text&&this.components.get(featureType,"Badge").render(uiConfig.badge),uiConfig.timer&&uiConfig.timer.isEnabled&&this.components.get(featureType,"Timer").render(uiConfig.timer,state),featureType==="preOrder"){var isWithoutPO=config.purchaseOptionMode==="WITHOUT_PURCHASE_OPTION",$form=this.components&&this.components._selectors&&this.components._selectors.$form||this.selectors&&this.selectors.$form||null;if(isWithoutPO&&$form&&$form.length){var cart=uiConfig.cart||{},labelKey=cart.labelKey||"Pre-order",labelValue=cart.labelValue||"Delivers as soon as available.";$form.find("[data-timesact-property]").remove();var $prop=this.app.$("<input>",{type:"hidden",name:"properties["+labelKey+"]",value:labelValue,"data-timesact-property":""});$form.append($prop),this.app.log("Injected cart property:",labelKey,"=",labelValue)}else if(config.sellingPlanId){var sellingPlan=this._findSellingPlan(config.sellingPlanId);sellingPlan?this.components.get("","sellingPlan").render(sellingPlan,uiConfig.sellingPlanWidget):this.app.log("Selling plan not found in product data, skipping injection:",config.sellingPlanId)}$form&&$form.length&&($form.find("[data-timesact-tracking]").remove(),$form.append('<input type="hidden" name="properties[_timesact_preorder]" value="true" data-timesact-tracking>'))}return{featureType,config,experience,variant,state}}_findSellingPlan(sellingPlanId,sellingPlanGroups){for(var groups=sellingPlanGroups||this.dataManager.product&&this.dataManager.product.sellingPlanGroups||[],targetId=Number(sellingPlanId),i=0;i<groups.length;i++){var group=groups[i];if(!(group.app_id&&group.app_id!=="timesact")){for(var plans=group.selling_plans||[],j=0;j<plans.length;j++)if(plans[j].id===targetId)return plans[j]}}return null}_getCurrentVariantId($form){var $select=$form.find('select[name="id"]');if($select.length&&Number($select.val()))return Number($select.val());var $radio=$form.find('input[name="id"]:checked');if($radio.length&&Number($radio.val()))return Number($radio.val());var $hidden=$form.find('input[name="id"][type="hidden"]');if($hidden.length&&Number($hidden.val()))return Number($hidden.val());for(var $scope=$form,$json=this.$(),i=0;i<8&&$scope.length&&!$json.length;i++)$scope=$scope.parent(),$json=$scope.find("[data-current-variant-json]").first();if($json.length)try{var v=JSON.parse(($json.val()||$json.text()||"").trim());if(v&&Number(v.id))return Number(v.id)}catch{}return null}}class ProductPageHandler extends BaseFeatureHandler{constructor(app){super(app),this.selectorManager=app.selectorManager,this.eventManager=app.eventManager,this.selectors={},this.currentVariantId=null,this._unbindVariantChange=null,this._currentCartAlertConfig=null,this._currentCartAlertCEId=null,this._variantsFetchPromise=null}init(){if(this.app.log("ProductPageHandler.init()"),!this._productHasExperiences()){this.app.log("No experiences attached to this product. Skipping initialization.");return}this.selectors=this.selectorManager.detectProductPage(),this.components=new ComponentSet(this.app),this.components.createAll(this.selectors,this.selectors.textSelector);var product=this.dataManager.product;product&&product.variantCount>250&&this.app.storefrontClient&&(this.app.log("Product has "+product.variantCount+" variants (>250), fetching remaining..."),this._variantsFetchPromise=this.app.storefrontClient.fetchAllProductVariants(product.id)),this.currentVariantId=this.dataManager.getCurrentVariantId(this.selectors.$form),this.currentVariantId&&(this.app.log("Initial variant:",this.currentVariantId),this._applyFeaturesForVariant(this.currentVariantId)),this._bindVariantChangeEvents(),this._bindAddToCartEvents(),this.app.log("ProductPageHandler initialized")}_productHasExperiences(){var product=this.dataManager.product;
64if(!product||!product.variants)return!1;var hasDirectExperiences=product.variants.some(function(v){return v.experienceIds&&v.experienceIds.length>0});return hasDirectExperiences?!0:this.dataManager._findStoreLevelExperience("backInStock")!==null||this.dataManager._findStoreLevelExperience("lowStock")!==null}_bindVariantChangeEvents(){var self=this;this._unbindVariantChange=this.eventManager.onVariantChange({$form:this.selectors.$form,$variant:this.selectors.$variant,namespace:"timesact-product",debounceMs:this.app.selectors.variantChangingTime||TIMING.VARIANT_DEBOUNCE},function(){var newVariantId=self.dataManager.getCurrentVariantId(self.selectors.$form);newVariantId&&newVariantId!==self.currentVariantId&&(self.app.log("--- Variant changed:",self.currentVariantId,"\u2192",newVariantId,"---"),self.currentVariantId=newVariantId,self._applyFeaturesForVariant(newVariantId))})}_bindAddToCartEvents(){var self=this;this.selectors.$form.on("submit.timesact",function(){self._currentCartAlertConfig&&self._currentCartAlertCEId&&self.app.cartAlertManager.showProductAlert(self._currentCartAlertConfig,self._currentCartAlertCEId,!1)})}_refreshSelectorsIfNeeded(){var $=this.app.$,stale=!1;this.selectors.$form.each(function(){if(!$.contains(document,this))return stale=!0,!1}),stale||this.selectors.$button.each(function(){if(!$.contains(document,this))return stale=!0,!1}),stale&&(this.app.log("Selectors stale, re-detecting..."),this.components&&this.components.reset(),this._unbindVariantChange&&(this._unbindVariantChange(),this._unbindVariantChange=null),this.selectors=this.selectorManager.detectProductPage(),this.components=new ComponentSet(this.app),this.components.createAll(this.selectors,this.selectors.textSelector),this.selectors.$form.off(".timesact"),this._bindAddToCartEvents(),this._bindVariantChangeEvents())}_applyFeaturesForVariant(variantId){var self=this;if(this._refreshSelectorsIfNeeded(),this.dataManager.hasVariantData(variantId)){this._applyFeatures(variantId);return}if(this._variantsFetchPromise){this._variantsFetchPromise.then(function(){self.dataManager.hasVariantData(variantId)?self._applyFeatures(variantId):self._fetchAndApplyVariant(variantId)});return}this._fetchAndApplyVariant(variantId)}_fetchAndApplyVariant(variantId){var self=this;this.app.storefrontClient?this.app.storefrontClient.fetchVariant(variantId).then(function(){self._applyFeatures(variantId)}):this._applyFeatures(variantId)}_applyFeatures(variantId){var variant=this.dataManager.getVariant(variantId),activeFeatures=this.dataManager.getActiveFeatures(variantId);if(this.app.log("Applying features for variant",variantId),this.app.log(" Active features:",activeFeatures.length>0?activeFeatures.map(function(f){return f.type}).join(", "):"none"),this.components.reset(),this._currentCartAlertConfig=null,this._currentCartAlertCEId=null,activeFeatures.length===0){this._applyDefaultState(variant);return}var hasPreOrder=activeFeatures.some(function(f){return f.type==="preOrder"}),self=this;activeFeatures.forEach(function(feature){var result=self._applyFeature(feature.type,feature.config,variant,feature.state,hasPreOrder,feature.experience);feature.type==="preOrder"&&feature.config.uiConfig.cart&&feature.config.uiConfig.cart.alert&&(self._currentCartAlertConfig=feature.config.uiConfig.cart.alert,self._currentCartAlertCEId=feature.experience.id),feature.type==="backInStock"&&self._setupBisClickHandler(feature.config,feature.experience,variant)})}_setupBisClickHandler(config,experience,variant){var self=this,bisButton=this.components.get("backInStock","Button");if(bisButton){var product=this.dataManager.product;bisButton.$el.on("click.timesact",function(){var currentVariant=self.dataManager.getVariant(self.currentVariantId);self.components.get("","modal").open(config.uiConfig,{productId:product?product.id:null,variantId:self.currentVariantId,variantName:currentVariant?currentVariant.title:"",productName:product?product.title:"",productImage:product?product.featuredImage:null,variants:product?product.variants:[],customerExperienceId:experience?experience.id:null})})}}_applyDefaultState(variant){this.app.log("Applying default state");var texts=this.dataManager.getDefaultTexts(),button=this.components.getButton();variant&&!variant.available?button.setText(texts.soldOut).disable():button.setText(texts.addToCart).enable(),button.show(),this.selectors.$shopifyPaymentButton.show()}destroy(){this._unbindVariantChange&&this._unbindVariantChange(),this.selectors.$form.off(".timesact"),this.components&&this.components.reset()}}function collectionModalUiConfig(uiConfig){var collectionForm=uiConfig&&uiConfig.collection&&uiConfig.collection.notifyMeForm,baseForm=collectionForm||uiConfig&&uiConfig.notifyMeForm;return Object.assign({},uiConfig,{notifyMeForm:Object.assign({},baseForm,{smsEnabled:!!(collectionForm&&collectionForm.smsEnabled===!0)})})}class ProductCardsHandler{constructor(app){this.app=app,this.$=app.$,this.dataManager=app.dataManager,this._processedCards=new WeakSet,this._observer=null,this._pendingFetches=new Map,this._fetchDebounceTimer=null,this._productCache=[]}init(){this.app.log("ProductCardsHandler.init()"),this._processVisibleCards(),this._setupObserver(),this.app.log("ProductCardsHandler initialized")}_processVisibleCards(){var self=this,selector=this.app.selectors.collection.productCard;this.$(selector).each(function(){self._processCard(self.$(this))})}_processCard($card){if(!this._processedCards.has($card[0])){this._processedCards.add($card[0]);var extracted=Utils.extractProductId($card,this.$,this.app.selectors.collection.productCard);if(extracted){if(extracted.type==="id"){var productData=this._getProductData(extracted.value);if(productData){this._applyFeaturesForCard($card,productData);return}}this.app.storefrontClient&&this._queueFetch(extracted,$card)}}}_getProductData(productId){for(var id=Number(productId),sources=this._getProductDataSources(),i=0;i<sources.length;i++){var found=sources[i].find(function(p){return Number(p.id)===id});if(found)return found}return null}_getProductDataSources(){var sources=[],dm=this.dataManager;return dm.collection&&dm.collection.products&&sources.push(dm.collection.products),dm.search&&dm.search.products&&sources.push(dm.search.products),this._productCache.length>0&&sources.push(this._productCache),sources}_queueFetch(extracted,$card){var key=extracted.type+":"+extracted.value;this._pendingFetches.has(key)||this._pendingFetches.set(key,[]),this._pendingFetches.get(key).push({$card,extracted}),clearTimeout(this._fetchDebounceTimer),this._fetchDebounceTimer=setTimeout(this._processFetchQueue.bind(this),TIMING.FETCH_DEBOUNCE)}
64async _processFetchQueue(){if(this._pendingFetches.size!==0){var self=this,handles=[],ids=[],items=[];if(this._pendingFetches.forEach(function(cardItems,key){var extracted=cardItems[0].extracted;items.push({key,cards:cardItems,extracted}),extracted.type==="handle"?handles.push(extracted.value):ids.push(extracted.value)}),this._pendingFetches.clear(),handles.length>0)try{var results=await this.app.storefrontClient.fetchProductsByHandles(handles);items.forEach(function(item){if(item.extracted.type==="handle"){var productData=results[item.extracted.value];productData&&(self._productCache.push(productData),item.cards.forEach(function(cardItem){self._applyFeaturesForCard(cardItem.$card,productData)}))}})}catch(err){this.app.warn("Fetch by handles failed:",err)}if(ids.length>0)try{var results=await this.app.storefrontClient.fetchProducts(ids);items.forEach(function(item){if(item.extracted.type==="id"){var productData=results[item.extracted.value];productData&&(self._productCache.push(productData),item.cards.forEach(function(cardItem){self._applyFeaturesForCard(cardItem.$card,productData)}))}})}catch(err){this.app.warn("Fetch by IDs failed:",err)}}}_applyFeaturesForCard($card,productData){var defaultVariant=productData.defaultVariant;if(defaultVariant){var activeFeatures=this._getActiveFeaturesForProduct(productData);if(activeFeatures.length!==0){var self=this;activeFeatures.forEach(function(feature){self._applyBadge($card,feature,productData)});var priorityFeature=activeFeatures[0];priorityFeature&&this._applyButton($card,priorityFeature,productData)}}}_getActiveFeaturesForProduct(productData){var self=this,defaultVariant=productData.defaultVariant,activeFeatures=[],userCountry=this.app.getUserCountry();if(defaultVariant&&defaultVariant.experienceIds){var ids=Array.isArray(defaultVariant.experienceIds)?defaultVariant.experienceIds:[];FEATURE_PRIORITY.forEach(function(featureType){var mapping2=FEATURE_CONFIG_MAP[featureType];ids.forEach(function(rawId){var experienceId=self.dataManager._extractExperienceId(rawId),experience=self.dataManager.getExperience(experienceId);if(!(!experience||!experience[mapping2.enabledKey])&&self.dataManager._matchesMarket(experience,userCountry)){var state=defaultVariant.experiencesState?defaultVariant.experiencesState[experience.id]:null;!state||state[mapping2.statusKey]!==ACTIVE_STATUS||activeFeatures.push({type:featureType,experience,config:experience[mapping2.configKey],state})}})})}if(activeFeatures.length===0&&defaultVariant&&!defaultVariant.available){var isSingleVariant=productData.variantCount===1||productData.variants&&productData.variants.length===1;if(isSingleVariant){var storeLevelBis=this.dataManager._findStoreLevelExperience("backInStock");if(storeLevelBis){var mapping=FEATURE_CONFIG_MAP.backInStock;activeFeatures.push({type:"backInStock",experience:storeLevelBis,config:storeLevelBis[mapping.configKey],state:{backInStockStatus:ACTIVE_STATUS},isStoreLevel:!0})}}}var isSingleVariantForLowStock=productData.variantCount===1||productData.variants&&productData.variants.length===1;if(activeFeatures.length===0&&isSingleVariantForLowStock){var storeLevelLowStock=this.dataManager.buildStoreLevelLowStockFeature(defaultVariant);storeLevelLowStock&&activeFeatures.push(storeLevelLowStock)}return activeFeatures}_applyBadge($card,feature,productData){var uiConfig=feature.config.uiConfig,collectionBadge=uiConfig.collection&&uiConfig.collection.badge||uiConfig.badge;if(!(!collectionBadge||!collectionBadge.isEnabled||!collectionBadge.text)){var $badge=$card.find(this.app.selectors.collection.badge).first();$badge.length||($badge=$card);var badgeComponent=new BadgeComponent($badge,this.app,feature.type);badgeComponent.render(collectionBadge)}}_applyButton($card,feature,productData){var uiConfig=feature.config.uiConfig,buttonConfig=uiConfig.collection&&uiConfig.collection.button||uiConfig.button;if(buttonConfig){var $form=$card.find(this.app.selectors.collection.form),$button=$form.length?$form.find(this.app.selectors.collection.addToCartButton).first():$card.find(this.app.selectors.collection.addToCartButton).first();if($button.length){var $textEl=Utils.findTextElement($button,this.app.selectors.collection.addToCartButtonText,this.app);if(buttonConfig.text&&$textEl.text().trim()&&$textEl.text(buttonConfig.text),buttonConfig.type==="CUSTOM"&&buttonConfig.style&&this._applyButtonStyle($button,buttonConfig.style,feature.type),feature.type==="preOrder"&&$form.length){var isWithoutPO=feature.config.purchaseOptionMode==="WITHOUT_PURCHASE_OPTION";if($form.find("[data-timesact-selling-plan]").remove(),$form.find("[data-timesact-property]").remove(),$form.find("[data-timesact-tracking]").remove(),isWithoutPO){var cart=feature.config.uiConfig&&feature.config.uiConfig.cart||{},labelKey=cart.labelKey||"Pre-order",labelValue=cart.labelValue||"Delivers as soon as available.",$prop=this.app.$("<input>",{type:"hidden",name:"properties["+labelKey+"]",value:labelValue,"data-timesact-property":""});$form.append($prop),this.app.log("Collection: Injected cart property:",labelKey,"=",labelValue)}else if(feature.config.sellingPlanId){var sellingPlan=this._findSellingPlan(feature.config.sellingPlanId,productData);sellingPlan?($form.append('<input type="hidden" name="selling_plan" value="'+sellingPlan.id+'" data-timesact-selling-plan>'),this.app.log("Collection: Injected selling plan:",sellingPlan.id)):this.app.log("Collection: selling plan
64not found in product data, skipping:",feature.config.sellingPlanId)}$form.append('<input type="hidden" name="properties[_timesact_preorder]" value="true" data-timesact-tracking>')}feature.type==="backInStock"&&this._setupBisClickHandler($card,$button,feature,productData),feature.type==="comingSoon"&&$button.prop("disabled",!0)}}}_findSellingPlan(sellingPlanId,productData){if(!productData||!productData.sellingPlanGroups)return null;for(var targetId=Number(sellingPlanId),groups=productData.sellingPlanGroups,i=0;i<groups.length;i++)for(var plans=groups[i].selling_plans||[],j=0;j<plans.length;j++)if(plans[j].id===targetId)return plans[j];return null}_applyButtonStyle($button,style,featureType){$button.addClass("timesact-collection-"+featureType+"-button");var width=style.widthType==="AUTO"?"auto":style.width+(style.widthType==="PERCENT"?"%":"px"),height=style.heightType==="AUTO"?"auto":style.height+(style.heightType==="PERCENT"?"%":"px");$button.attr("style","width:"+width+"!important;height:"+height+"!important;background-color:"+style.backgroundColor+"!important;border:"+style.borderWidth+"px solid "+style.borderColor+"!important;border-radius:"+style.borderRadius+"px!important;color:"+style.fontColor+"!important;font-size:"+style.fontSize+"px!important;cursor:pointer;")}_setupBisClickHandler($card,$button,feature,productData){var self=this,uiConfig=feature.config.uiConfig;$button.prop("disabled",!1).removeAttr("disabled"),$button.is("a")&&$button.attr("href","javascript:void(0);"),$button.attr("type")==="submit"&&$button.attr("type","button");var $form=$button.closest("form");$form.length&&$form.on("submit.timesact-bis",function(e){return e.preventDefault(),!1}),$button.on("click.timesact",function(e){e.preventDefault(),e.stopPropagation(),self.app.getModal().open(collectionModalUiConfig(uiConfig),{productId:productData.id,variantId:productData.defaultVariant?productData.defaultVariant.id:null,variantName:productData.defaultVariant?productData.defaultVariant.title:"",productName:productData.title,productImage:productData.featuredImage||null,variants:productData.variants||[],customerExperienceId:feature.experience?feature.experience.id:null})})}_setupObserver(){var self=this,selector=this.app.selectors.collection.productCard;this._observer=new MutationObserver(function(mutations){var newCards=[];mutations.forEach(function(mutation){mutation.addedNodes.forEach(function(node){if(node.nodeType===1){var $node=self.$(node);$node.is(selector)&&newCards.push($node),$node.find(selector).each(function(){newCards.push(self.$(this))})}})}),newCards.length>0&&(self.app.log("MutationObserver: found",newCards.length,"new cards"),newCards.forEach(function($card){self._processCard($card)}))}),this._observer.observe(document.body,{childList:!0,subtree:!0})}destroy(){this._observer&&(this._observer.disconnect(),this._observer=null)}}class QuickViewHandler extends BaseFeatureHandler{constructor(app){super(app),this._activeModal=null,this._productData=null,this._unbindVariantChange=null,this._boundQuickViewClick=null,this._modalCheckInterval=null,this._closeCheckInterval=null}init(){this.app.log("QuickViewHandler.init()"),this._bindQuickViewButtons(),this.app.log("QuickViewHandler initialized")}_bindQuickViewButtons(){var self=this,buttonSelector=this.app.selectors.quickView.button;this._boundQuickViewClick=function(e){var trigger=e.target.closest(buttonSelector);trigger&&(self.app.log("Quick view trigger matched:",buttonSelector),self._onQuickViewButtonClick(self.$(trigger)))},document.addEventListener("click",this._boundQuickViewClick,!0)}_onQuickViewButtonClick($button){var self=this,extracted=Utils.extractProductId($button,this.$,this.app.selectors.collection.productCard);if(!extracted){this.app.log("Could not extract product info from quick view button");return}this.app.log("Quick view product:",extracted.type,"=",extracted.value),this._waitForModal(function($modal){self._handleModalOpen($modal,extracted)})}_waitForModal(callback){var self=this,containerSelector=this.app.selectors.quickView.container,attempts=0;this._modalCheckInterval&&clearInterval(this._modalCheckInterval),this._modalCheckInterval=setInterval(function(){attempts++;var $modal=self.$(containerSelector).filter(":visible").first();$modal.length?(clearInterval(self._modalCheckInterval),self._modalCheckInterval=null,callback($modal)):attempts>=TIMING.MODAL_MAX_ATTEMPTS&&(clearInterval(self._modalCheckInterval),self._modalCheckInterval=null,self.app.log("Quick view modal not found after timeout"))},TIMING.MODAL_CHECK_INTERVAL)}async _handleModalOpen($modal,extracted){this._activeModal&&this._handleModalClose(),this._activeModal=$modal;var $form=await this._waitForForm($modal);if($form){var productData=await this._fetchProductData(extracted);if(productData){this._productData=productData;var selectors=this._detectSelectors($modal,$form);this.components=new ComponentSet(this.app),this.components.createAll(selectors,selectors.textSelector);var variantId=this._getCurrentVariantId($form);variantId&&this._applyFeaturesForVariant(variantId),this._bindVariantChangeEvents($form,selectors.$variant),this._watchForModalClose($modal)}}}_waitForForm($modal){var self=this;return Utils.waitForElement(this.$,this.app.selectors.quickView.form,$modal,TIMING.FORM_MAX_ATTEMPTS,TIMING.FORM_CHECK_INTERVAL)}async _fetchProductData(extracted){if(!this.app.storefrontClient)return null;try{if(extracted.type==="id"){var result=await this.app.storefrontClient.fetchProducts([extracted.value]);return result[extracted.value]||null}else{var result=await this.app.storefrontClient.fetchProductsByHandles([extracted.value]);return result[extracted.value]||null}}catch(err){return this.app.warn("Quick view fetch error:",err),null}}_detectSelectors($modal,$form){var qs=this.app.selectors.quickView,triggerSelector=qs.button,$button=$form.find(qs.addToCartButton).not(triggerSelector).first();$button.length||($button=$modal.find(qs.addToCartButton).not(triggerSelector).first());var $variant=$form.find(qs.variant),$message=$form.find(qs.message).not(triggerSelector);$message.length||($message=$button);var $widgets=$form.find(qs.widgets).not(triggerSelector);$widgets.length||($widgets=$button);var $badge=$modal.find(qs.badge).first();$badge.length||($badge=$modal);var $shopifyPaymentButton=$modal.find(qs.shopifyPaymentButton);return{$form,$button,$variant,$message,$widgets,$badge,$shopifyPaymentButton,textSelector:qs.addToCartButtonText}}_applyFeaturesForVariant(variantId){if(this.components){var variant=this._getVariant(variantId);if(variant){this.components.reset();var experiences=this._getVariantExperiences(variant),activeFeatures=[],self=this;if(FEATURE_PRIORITY.forEach(function(featureType){var mapping2=FEATURE_CONFIG_MAP[featureType];
64experiences.forEach(function(exp){exp.experience[mapping2.enabledKey]&&(!exp.state||exp.state[mapping2.statusKey]!==ACTIVE_STATUS||activeFeatures.push({type:featureType,experience:exp.experience,config:exp.experience[mapping2.configKey],state:exp.state}))})}),activeFeatures.length===0&&!variant.available){var storeLevelBis=this.dataManager._findStoreLevelExperience("backInStock");if(storeLevelBis){var mapping=FEATURE_CONFIG_MAP.backInStock;activeFeatures.push({type:"backInStock",experience:storeLevelBis,config:storeLevelBis[mapping.configKey],state:{backInStockStatus:ACTIVE_STATUS},isStoreLevel:!0})}}if(activeFeatures.length===0){var storeLevelLowStock=this.dataManager.buildStoreLevelLowStockFeature(variant);storeLevelLowStock&&activeFeatures.push(storeLevelLowStock)}if(activeFeatures.length===0){this._applyDefaultState(variant);return}var hasPreOrder=activeFeatures.some(function(f){return f.type==="preOrder"});activeFeatures.forEach(function(feature){self._applyFeature(feature.type,feature.config,variant,feature.state,hasPreOrder,feature.experience),feature.type==="backInStock"&&self._setupBisClickHandler(feature.config,feature.experience,variant)})}}}_applyDefaultState(variant){this.app.log("QuickView: Applying default state");var texts=this.dataManager.getDefaultTexts(),button=this.components.getButton();variant&&!variant.available?button.setText(texts.soldOut).disable():button.setText(texts.addToCart).enable(),button.show(),this.components._selectors&&this.components._selectors.$shopifyPaymentButton&&this.components._selectors.$shopifyPaymentButton.show()}_getVariant(variantId){if(!this._productData||!this._productData.variants)return null;var vid=Number(variantId);return this._productData.variants.find(function(v){return Number(v.id)===vid})}_getVariantExperiences(variant){var self=this,results=[],userCountry=this.app.getUserCountry();if(!variant.experienceIds)return results;var ids=Array.isArray(variant.experienceIds)?variant.experienceIds:[];return ids.forEach(function(rawId){var experienceId=self.dataManager._extractExperienceId(rawId),experience=self.dataManager.getExperience(experienceId);if(experience&&self.dataManager._matchesMarket(experience,userCountry)){var state=variant.experiencesState?variant.experiencesState[experience.id]:null;results.push({experience,state})}}),results}_setupBisClickHandler(config,experience,variant){var self=this,bisButton=this.components.get("backInStock","Button");bisButton&&bisButton.$el.on("click.timesact-quickview-bis",function(e){e.preventDefault(),e.stopPropagation(),self.components.get("","modal").open(collectionModalUiConfig(config.uiConfig),{productId:self._productData?self._productData.id:null,variantId:variant?variant.id:null,variantName:variant?variant.title:"",productName:self._productData?self._productData.title:"",productImage:self._productData?self._productData.featuredImage:null,variants:self._productData?self._productData.variants:[],customerExperienceId:experience?experience.id:null})})}_findSellingPlan(sellingPlanId){return this._productData?BaseFeatureHandler.prototype._findSellingPlan.call(this,sellingPlanId,this._productData.sellingPlanGroups):null}_bindVariantChangeEvents($form,$variant){var self=this,$=this.$;this._unbindVariantChange=this.app.eventManager.onVariantChange({$form,$variant,namespace:"timesact-quickview",debounceMs:this.app.selectors.variantChangingTime||TIMING.VARIANT_DEBOUNCE},function(){var variantId=self._getCurrentVariantId($form);variantId&&self._applyFeaturesForVariant(variantId)});var lastVariantId=this._getCurrentVariantId($form),modalRef=this._activeModal;this._variantPollInterval=setInterval(function(){if(!modalRef||!modalRef.is(":visible")){clearInterval(self._variantPollInterval),self._variantPollInterval=null;return}var qs=self.app.selectors.quickView,$currentForm=modalRef.find(qs.form).first();if($currentForm.length){var currentVariantId=self._getCurrentVariantId($currentForm);if(currentVariantId&¤tVariantId!==lastVariantId){if(lastVariantId=currentVariantId,!$.contains(document,$form[0])){self.components&&self.components.destroy();var selectors=self._detectSelectors(modalRef,$currentForm);self.components=new ComponentSet(self.app),self.components.createAll(selectors,selectors.textSelector)}self._applyFeaturesForVariant(currentVariantId)}}},300)}_watchForModalClose($modal){var self=this;this._closeCheckInterval=setInterval(function(){(!$modal.is(":visible")||!self.$.contains(document,$modal[0]))&&(clearInterval(self._closeCheckInterval),self._handleModalClose())},TIMING.CLOSE_CHECK_INTERVAL)}_handleModalClose(){this.components&&this.components.reset(),this._unbindVariantChange&&(this._unbindVariantChange(),this._unbindVariantChange=null),this._variantPollInterval&&(clearInterval(this._variantPollInterval),this._variantPollInterval=null),this._closeCheckInterval&&(clearInterval(this._closeCheckInterval),this._closeCheckInterval=null),this._activeModal=null,this._productData=null,this.components=null,this.app.log("Quick view cleaned up")}destroy(){this._boundQuickViewClick&&(document.removeEventListener("click",this._boundQuickViewClick,!0),this._boundQuickViewClick=null),this._modalCheckInterval&&clearInterval(this._modalCheckInterval),this._handleModalClose()}}class FeaturedProductHandler extends BaseFeatureHandler{constructor(app){super(app),this._instances=new WeakMap,this._trackedForms=[],this._processedForms=new WeakSet,this._observer=null,this._pendingFetches=new Map,this._fetchDebounceTimer=null,this._instanceCounter=0,this._productData=null}init(){this.app.log("FeaturedProductHandler.init()"),this._processVisibleForms(),this._setupObserver(),this.app.log("FeaturedProductHandler initialized")}_processVisibleForms(){var self=this,selector=this.app.selectors.form;this.$(selector).each(function(){self._processForm(self.$(this))})}
64_processForm($form){var formEl=$form[0];if(formEl&&!this._processedForms.has(formEl)&&!this._shouldExclude($form)){this._processedForms.add(formEl);var extracted=Utils.extractProductId($form,this.$,null);if(!extracted){this.app.log("FeaturedProduct: could not extract product id from form, skipping");return}var productData=this._getProductFromCache(extracted);if(productData){this._setupInstance($form,productData);return}this.app.storefrontClient&&this._queueFetch(extracted,$form)}}_shouldExclude($form){var formEl=$form[0],$=this.$,ph=this.app.pageHandler;if(ph&&ph.selectors&&ph.selectors.$form&&ph.selectors.$form.length){var isMain=!1;if(ph.selectors.$form.each(function(){if(this===formEl||$.contains(this,formEl))return isMain=!0,!1}),isMain)return!0}var cardSel=this.app.selectors.collection&&this.app.selectors.collection.productCard;if(cardSel&&$form.closest(cardSel).length)return!0;var qvSel=this.app.selectors.quickView&&this.app.selectors.quickView.container;return!!(qvSel&&$form.closest(qvSel).length||$form.closest("product-sticky-bar").length)}_getProductFromCache(extracted){var dm=this.dataManager;if(dm.collection&&dm.collection.products){var found=this._findInCache(dm.collection.products,extracted);if(found)return found}if(dm.search&&dm.search.products){var found=this._findInCache(dm.search.products,extracted);if(found)return found}var pch=this.app.productCardsHandler;if(pch&&pch._productCache&&pch._productCache.length){var found=this._findInCache(pch._productCache,extracted);if(found)return found}return null}_findInCache(products,extracted){if(extracted.type==="id"){var id=Number(extracted.value);return products.find(function(p){return Number(p.id)===id})||null}return products.find(function(p){return p.handle===extracted.value})||null}_queueFetch(extracted,$form){var key=extracted.type+":"+extracted.value;this._pendingFetches.has(key)||this._pendingFetches.set(key,[]),this._pendingFetches.get(key).push({$form,extracted}),clearTimeout(this._fetchDebounceTimer),this._fetchDebounceTimer=setTimeout(this._processFetchQueue.bind(this),TIMING.FETCH_DEBOUNCE)}async _processFetchQueue(){if(this._pendingFetches.size!==0){var self=this,handles=[],ids=[],items=[];if(this._pendingFetches.forEach(function(formItems,key){var extracted=formItems[0].extracted;items.push({key,forms:formItems,extracted}),extracted.type==="handle"?handles.push(extracted.value):ids.push(extracted.value)}),this._pendingFetches.clear(),handles.length>0)try{var results=await this.app.storefrontClient.fetchProductsByHandles(handles);items.forEach(function(item){if(item.extracted.type==="handle"){var productData=results[item.extracted.value];productData&&(self._shareToProductCardsCache(productData),item.forms.forEach(function(formItem){self._setupInstance(formItem.$form,productData)}))}})}catch(err){this.app.warn("FeaturedProduct fetch by handles failed:",err)}if(ids.length>0)try{var results=await this.app.storefrontClient.fetchProducts(ids);items.forEach(function(item){if(item.extracted.type==="id"){var productData=results[item.extracted.value];productData&&(self._shareToProductCardsCache(productData),item.forms.forEach(function(formItem){self._setupInstance(formItem.$form,productData)}))}})}catch(err){this.app.warn("FeaturedProduct fetch by IDs failed:",err)}}}_shareToProductCardsCache(productData){var pch=this.app.productCardsHandler;if(pch&&pch._productCache&&productData){var exists=pch._productCache.some(function(p){return Number(p.id)===Number(productData.id)});exists||pch._productCache.push(productData)}}_setupInstance($form,productData){var formEl=$form[0];if(!this._instances.has(formEl)){if(!this._productHasExperiences(productData)){this.app.log("FeaturedProduct: product has no Timesact experiences, skipping",productData.handle||productData.id);return}var selectors=this._detectSelectors($form);if(!selectors.$button||!selectors.$button.length){this.app.log("FeaturedProduct: no ATC button found in form, skipping");return}var components=new ComponentSet(this.app);components.createAll(selectors,selectors.textSelector);var instance={id:++this._instanceCounter,$form,formEl,selectors,components,productData,unbindVariantChange:null,currentVariantId:null};this._instances.set(formEl,instance),this._trackedForms.push(formEl);var variantId=this._getCurrentVariantId($form);variantId&&(instance.currentVariantId=variantId,this._applyFeaturesForInstance(instance,variantId)),this._bindVariantChange(instance)}}_productHasExperiences(productData){if(!productData||!productData.variants)return!1;var hasDirect=productData.variants.some(function(v){return v.experienceIds&&v.experienceIds.length>0});return hasDirect?!0:this.dataManager._findStoreLevelExperience("backInStock")!==null||this.dataManager._findStoreLevelExperience("lowStock")!==null}_detectSelectors($form){var s=this.app.selectors,$button=$form.find(s.addToCartButton).first(),$variant=$form.find(s.variant),$message=$form.find(s.message).first();$message.length||($message=$button);var $widgets=$form.find(s.widgets).first();$widgets.length||($widgets=$button);var $=this.$,mediaSel=s.badge+", .product__media-wrapper, .product__media-list",$candidates=$form.parents("section, .shopify-section, .featured-product, [data-section-type], [data-section-id]"),$badge=$(),$scope=$();$candidates.each(function(){var $found=$(this).find(mediaSel).first();if($found.length)return $badge=$found,$scope=$(this),!1}
64),$badge.length||($scope=$candidates.last(),$scope.length||($scope=$form.parent()),$badge=$scope);var $shopifyPaymentButton=$form.find(s.shopifyPaymentButton);return{$form,$button,$variant,$message,$widgets,$badge,$shopifyPaymentButton,textSelector:s.addToCartButtonText}}_bindVariantChange(instance){var self=this,namespace="timesact-featured-"+instance.id;instance.unbindVariantChange=this.app.eventManager.onVariantChange({$form:instance.$form,$variant:instance.selectors.$variant,namespace,debounceMs:this.app.selectors.variantChangingTime||TIMING.VARIANT_DEBOUNCE},function(){var newVariantId=self._getCurrentVariantId(instance.$form);newVariantId&&newVariantId!==instance.currentVariantId&&(self.app.log("FeaturedProduct variant changed:",instance.currentVariantId,"\u2192",newVariantId),instance.currentVariantId=newVariantId,self._applyFeaturesForInstance(instance,newVariantId))})}_applyFeaturesForInstance(instance,variantId){var variant=this._getInstanceVariant(instance,variantId);if(variant){this.components=instance.components,this._productData=instance.productData,this.components.reset();var experiences=this._getInstanceVariantExperiences(variant),activeFeatures=this._buildActiveFeatures(experiences,variant);if(activeFeatures.length===0){this._applyInstanceDefaultState(instance,variant);return}var hasPreOrder=activeFeatures.some(function(f){return f.type==="preOrder"}),self=this;activeFeatures.forEach(function(feature){self._applyFeature(feature.type,feature.config,variant,feature.state,hasPreOrder,feature.experience),feature.type==="backInStock"&&self._setupBisClickHandler(instance,feature.config,feature.experience,variant)})}}_getInstanceVariant(instance,variantId){if(!instance.productData||!instance.productData.variants)return null;var vid=Number(variantId);return instance.productData.variants.find(function(v){return Number(v.id)===vid})||null}_getInstanceVariantExperiences(variant){var self=this,results=[],userCountry=this.app.getUserCountry();if(!variant.experienceIds)return results;var ids=Array.isArray(variant.experienceIds)?variant.experienceIds:[];return ids.forEach(function(rawId){var experienceId=self.dataManager._extractExperienceId(rawId),experience=self.dataManager.getExperience(experienceId);if(experience&&self.dataManager._matchesMarket(experience,userCountry)){var state=variant.experiencesState?variant.experiencesState[experience.id]:null;results.push({experience,state})}}),results}_buildActiveFeatures(experiences,variant){var activeFeatures=[];if(FEATURE_PRIORITY.forEach(function(featureType){var mapping2=FEATURE_CONFIG_MAP[featureType];experiences.forEach(function(exp){exp.experience[mapping2.enabledKey]&&(!exp.state||exp.state[mapping2.statusKey]!==ACTIVE_STATUS||activeFeatures.push({type:featureType,experience:exp.experience,config:exp.experience[mapping2.configKey],state:exp.state}))})}),activeFeatures.length===0&&variant&&!variant.available){var storeLevelBis=this.dataManager._findStoreLevelExperience("backInStock");if(storeLevelBis){var mapping=FEATURE_CONFIG_MAP.backInStock;activeFeatures.push({type:"backInStock",experience:storeLevelBis,config:storeLevelBis[mapping.configKey],state:{backInStockStatus:ACTIVE_STATUS},isStoreLevel:!0})}}if(activeFeatures.length===0){var storeLevelLowStock=this.dataManager.buildStoreLevelLowStockFeature(variant);storeLevelLowStock&&activeFeatures.push(storeLevelLowStock)}return activeFeatures}_applyInstanceDefaultState(instance,variant){var texts=this.dataManager.getDefaultTexts(),button=instance.components.getButton();variant&&!variant.available?button.setText(texts.soldOut).disable():button.setText(texts.addToCart).enable(),button.show(),instance.components._selectors&&instance.components._selectors.$shopifyPaymentButton&&instance.components._selectors.$shopifyPaymentButton.show()}_setupBisClickHandler(instance,config,experience,variant){var bisButton=instance.components.get("backInStock","Button");if(bisButton){var productData=instance.productData;bisButton.$el.off("click.timesact-featured").on("click.timesact-featured",function(e){e.preventDefault(),e.stopPropagation(),instance.components.get("","modal").open(config.uiConfig,{productId:productData?productData.id:null,variantId:variant?variant.id:null,variantName:variant?variant.title:"",productName:productData?productData.title:"",productImage:productData?productData.featuredImage:null,variants:productData?productData.variants:[],customerExperienceId:experience?experience.id:null})})}}
64_findSellingPlan(sellingPlanId){return this._productData?BaseFeatureHandler.prototype._findSellingPlan.call(this,sellingPlanId,this._productData.sellingPlanGroups):null}_setupObserver(){var self=this,selector=this.app.selectors.form;this._observer=new MutationObserver(function(mutations){var newForms=[];mutations.forEach(function(mutation){mutation.addedNodes.forEach(function(node){if(node.nodeType===1){var $node=self.$(node);$node.is(selector)&&newForms.push($node),$node.find(selector).each(function(){newForms.push(self.$(this))})}})}),newForms.length>0&&(self.app.log("FeaturedProduct MutationObserver: found",newForms.length,"new form(s)"),newForms.forEach(function($form){self._processForm($form)}))}),this._observer.observe(document.body,{childList:!0,subtree:!0})}destroy(){this._observer&&(this._observer.disconnect(),this._observer=null);var self=this;this._trackedForms.forEach(function(formEl){var instance=self._instances.get(formEl);instance&&(instance.unbindVariantChange&&instance.unbindVariantChange(),instance.components&&instance.components.destroy(),instance.$form.off(".timesact-featured-"+instance.id),self._instances.delete(formEl))}),this._trackedForms=[],this._fetchDebounceTimer&&(clearTimeout(this._fetchDebounceTimer),this._fetchDebounceTimer=null),this._pendingFetches.clear()}}waitForJQuery(function($){initWithJQuery($)})})(); 65//# sourceMappingURL=/cdn/shop/t/78/assets/timesact.js.map?v=127462919642403718351787774084
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.