1<!DOCTYPE html> 2<html class="no-js" lang="en"> 3 <head> 4 <title>Pink Zebra Home - Sign in</title> 5 <link rel="dns-prefetch preconnect" href="https://cdn11.bigcommerce.com/s-9khen3dncu" crossorigin><link rel="dns-prefetch preconnect" href="https://fonts.googleapis.com/" crossorigin><link rel="dns-prefetch preconnect" href="https://fonts.gstatic.com/" crossorigin> 6 <meta name="description" content="Ready to change your life? Join Pink Zebra and become a Consultant today!"><meta name='platform' content='bigcommerce.stencil' /> 7 8 9 10 <style type="text/css" media="screen, print"> 11 @font-face { 12 font-family: "Northwell"; 13 src: url("https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/fonts/Northwell.ttf"); 14 } 15 @font-face { 16 font-family: "Poppins-Regular"; 17 src: url("https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/fonts/Poppins-Regular.ttf"); 18 } 19 @font-face { 20 font-family: "Fresh Mango"; 21 src: url("https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/fonts/FreshMango-regular.ttf"); 22 } 23 @font-face { 24 font-family: "Fresh Mango Italic"; 25 src: url("https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/fonts/FreshMango-italic.ttf"); 26 } 27 </style> 28 29
29<script> 30 window.PZ_API_EP = { 31 'consultant': { 32 'personalInfo': 'consultants/personal_info', 33 'isCancelledConsultant': 'consultants/is_cancelled_consultant', 34 'getConsultantInfo': 'consultants/get_consultant_info', 35 'removeSFProduct': 'consultants/remove_scent_flirt_products_from_cart', 36 'checkSFSubscription': 'consultants/check_scentflirt_subscription', 37 'findByFields': 'consultants/find_by_fields', 38 'downLineReport': 'consultants/downline_report', 39 'downLineReportExport': 'consultants/downline_report/export', 40 'profile': 'consultants/profile', 41 'bankDetails': 'consultants/banking_details', 42 'dashboard': 'consultants/dashboard', 43 'notifications': 'consultants/notifications', 44 'promotion': 'consultants/promotion', 45 'orders': 'consultants/orders', 46 'ordersReportExport': 'consultants/orders_report/export', 47 'customerReport': 'consultants/customer_report', 48 'customerReportExport': 'consultants/customers_report/export', 49 'addUserHandles': 'consultants/add_user_handles', 50 'validateWebsite': 'consultants/business-info/validate', 51 'sampleProgramStatus': 'sample_program/join/status', 52 'sampleProgramSubscribe': 'sample_program/join/subscribe', 53 'sampleProgramMetrics': 'sample_program/consultants/sample-metrics', 54 'sampleProgramOrders': 'sample_program/consultants/sample-orders', 55 'shipComValidate': 'consultants/shipcom/validate', 56 'checkWebsiteFeePaid': 'consultants/consultant/fee_paid', 57 'checkConsultantChangeEligibility': 'consultants/check_consultant_change_eligibility', 58 'changeConsultant': 'consultants/change_consultant', 59 'checkSubscriptionConsultantChangeEligibility': 'consultants/check_subscription_consultant_change_eligibility', 60 'changeSubscriptionConsultant': 'consultants/change_subscription_consultant', 61 }, 62 'sampleProgram': { 63 'checkCustomerEligibility': 'sample_program/check_eligibility', 64 }, 65 'contact': { 66 'setLegalAddress': '/contacts/legal-address', 67 'getLegalAddress': '/contacts/get-legal-address', 68 'getConsultant': 'contacts/get-consultant', 69 'validateContact': 'contacts/validate_contact', 70 'createCustomer': 'contacts/create_customer', 71 'customerDetails': 'contacts/customer_details', 72 'contactRewards': 'contacts/rewards', 73 'registerConsent': 'contacts/register_consent', 74 'getConsentStatus': 'contacts/check_consent' 75 }, 76 'cart': { 77 'addMeta': 'carts/meta', 78 'getCartMetaFields': 'carts/:cartId/meta', 79 }, 80 'join': { 81 'proccessJoinCart': 'joins/proccess_join_cart', 82 'verifyConsultant': 'joins/consultants/verify', 83 'applyDiscount': 'joins/checkout/apply-discount', 84 'businessInfoValidate': 'consultants/business-info/validate', 85 'rules': 'joins/rules', 86 'cart': 'joins/cart', 87 'cartDetails': 'joins/cart/details', 88 'cartCategories': 'joins/cart/categories', 89 'cartCategoriesProducts': 'joins/cart/categories/products', 90 'cartProducts': 'joins/cart/:joinCartId/products', 91 'recommendedProducts': 'joins/cart/recommended-products', 92 }, 93 'checkout': { 94 'activeRewards': 'checkout/active_rewards', 95 'validateAddress': 'checkout/validate_address', 96 'applyRewards': 'checkout/apply_rewards', 97 'binCheck': 'checkout/bin_check', 98 'binCheckStored': 'checkout/bin_check_stored', 99 }, 100 'segment': { 101 'setCustomerSegment': 'segments/add_customer_segment', 102 'setCustomerSegmentForce': 'segments/add_customer_segment_force', 103 'getCustomerSegment': 'segments/get_customer_segments', 104 'isCustomerInSegment': 'segments/is_customer_in_segment' 105 }, 106 'sitevibe': { 107 'customerReferral': 'sitevibes/customer_referrals', 108 'getCustomerReferral': 'sitevibes/customer_referrals?email=:email', 109 }, 110 'subscription': { 111 'newPromo': 'subscriptions/new_promotion', 112 'cancel': 'subscriptions/cancel', 113 'pause': 'subscriptions/pause', 114 'list': 'subscriptions/list', 115 'info': 'subscriptions/info', 116 'check_instrument': 'subscriptions/check_instrument', 117 'subscription_by_order': 'subscriptions/subscription_by_order', 118 'update_instrument_token': 'subscriptions/update_instrument_token', 119 'update_shipping_address': 'subscriptions/update_shipping_address', 120 'appendBundleProduct': 'subscriptions/append_bundle_product', 121 'removeBundleProduct': 'subscriptions/remove_bundle_product', 122 'updateBundleProduct': 'subscriptions/update_bundle_product', 123 'invoices': 'subscriptions/list_invoices', 124 'payments': 'subscriptions/list_payments', 125 'customerFailedInvoices': 'subscriptions/all_failed_invoices', 126 'invoicePaymentStatus': 'subscriptions/invoice_payment_status', 127 'bill_new_invoice': 'subscriptions/bill_new_invoice',
128 'retry_invoice': 'subscriptions/retry_fail_payment', 129 'subscriptions_without_instrument': 'subscriptions/subscriptions_without_instrument', 130 'bcd_availability': 'subscriptions/bcd_availability', 131 'change_bcd': 'subscriptions/change_bcd', 132 }, 133 'ticket': { 134 'topics': 'tickets/topics', 135 'create': 'tickets/create', 136 'list': 'tickets/list', 137 }, 138 'order': { 139 'validateChangeRep': 'orders/validate_change_rep', 140 'changeRep': 'orders/change_rep', 141 'orderDetails': 'orders/:orderId', 142 'checkOverride': 'orders/check_order_override_status', 143 }, 144 'parties': { 145 'getPartyId': 'parties/get_party_id', 146 'list': 'parties/list', 147 'close': 'parties/close', 148 }, 149 'report': { 150 'getCycleInfo': 'consultants/reports/cycles_info', 151 'getReportGenerationStatus': 'consultants/reports/generation_status', 152 'getReportFile': 'consultants/reports/get_report_file', 153 'generateFinancialReport': 'consultants/reports/financial_report' 154 }, 155 'shipments': { 156 'checkOrderShippingDate': 'shipments/check_order_shipping_days', 157 }, 158 'featureAccess': { 159 'evaluate': 'settings/features-access', 160 'list': 'settings/features-access-list' 161 } 162 }; 163 164 function fillUrl(url, params) { 165 return url.replace(/:([a-zA-Z]+)/g, (_, key) => params[key]); 166 } 167 168 // window.PZ_API_EP.order.orderDetails 169</script>
169 <link href="https://cdn11.bigcommerce.com/s-9khen3dncu/product_images/favicon.png?t=1738339656" rel="shortcut icon"> 170 <meta name="viewport" content="width=device-width, initial-scale=1"> 171
171<script type="application/json" id="bc-store-data"> 172 { 173 "fbAppId": "270454785773283", 174 "checkoutId": "", 175 "gqlApiHeaders": { 176 "Content-Type": "application/json", 177 "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJjaWQiOlsxXSwiY29ycyI6WyJodHRwczovL3Bpbmt6ZWJyYWhvbWUuY29tIl0sImVhdCI6MTc5MDUwNjc1NiwiaWF0IjoxNzkwMzMzOTU2LCJpc3MiOiJCQyIsInNpZCI6MTAwMjU0ODA5MCwic3ViIjoiQkMiLCJzdWJfdHlwZSI6MCwidG9rZW5fdHlwZSI6MX0.Dbbz5Ky_KmgYOqRNc1mNuklCGA8U9ANSp2dp5XrHfP_fERT3ZwmFrRT_ZM97Q6g0oEvbpO9Q1zJRl-0DJN1jjA" 178 }, 179 "webPackPublicPath": "https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/dist/" 180 } 181 </script>
181 182
182<script> 183 fetch('/api/storefront/carts', {credentials: 'include'}) 184 .then(function(response) {return response.json();}) 185 .then(async myJson => { 186 window.CART__ID = myJson.length > 0 ? myJson[0].id : null; 187 }) 188 .catch(error => console.error('Request failed', error)); 189 </script>
189 190
190<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/data-loader.js"></script>
vendor: 72 bytes, lines 190-191
190 191 <script async src="https://www.googletagmanager.com/gtag/js?id=
191G-9YLBCB8HM1
vendor: 20 bytes, lines 191-192
191"></script> 192
192<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/marketing/marketing.js"></script>
192 193
193<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
193 194
194<script defer src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/gsap.min.js"></script>
194 195
195<script defer src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/ScrollTrigger.min.js"></script>
195 196
196<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
196 197
197<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/audit/journey-config.js"></script>
197 198
198<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/audit/journey-recorder.js"></script>
198 199
199<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/theme/modules/base-setup.js"></script>
199 200
200<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/theme/modules/fetch-customer-consultant.js"></script>
200 201
201<script> 202 // Global fallback from Theme Settings 203 window.THEME_CATEGORY_SORT = "BEST_SELLING"; 204 205 // Map of labels for sorting values 206 window.SORT_LABELS = { 207 "FEATURED": "Featured Items", 208 "NEWEST": "New Arrivals", 209 "BEST_SELLING": "Best Sellers", 210 "A_TO_Z": "A to Z", 211 "Z_TO_A": "Z to A", 212 "BEST_REVIEWED": "Top Rated", 213 "LOWEST_PRICE": "Price Low to High", 214 "HIGHEST_PRICE": "Price High to Low" 215 }; 216 </script>
216 217
217<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/settings.js"></script>
217 218
218<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/cache/cache-config.js"></script>
218 219
219<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/cache/pz-idb.js"></script>
219 220
220<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/cache/tab-lock.js"></script>
220 221
221<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/cache/segments-cache.js"></script>
221 222
222<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/cache/consent-cache.js"></script>
222 223
223<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/cache/feature-access-cache.js"></script>
223 224
224<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/cache/parties-cache.js"></script>
224 225
225<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/cache/subscriptions-cache.js"></script>
225 226
226<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/cache/rewards-cache.js"></script>
226 227
227<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/cache/referrals-cache.js"></script>
227 228
228<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/cache/tickets-cache.js"></script>
228 229
229<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/theme/global/classes/cart-handler.js"></script>
229 230
230<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/theme/global/classes/login-handler.js"></script>
230 231
231<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/theme/global/classes/consultant-handler.js"></script>
231 232
232<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/theme/global/classes/shogun-products-handler.js"></script>
232 233
233<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/theme/global/classes/subscription-handler.js"></script>
233 234 235
235<script async src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/dist/theme-bundle.head_async.js"></script>
235 236 237 <link href="https://fonts.googleapis.com/css?family=Lato:700,500,400&display=block" rel="stylesheet"> 238 239
239<script async src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/dist/theme-bundle.font.js"></script>
239 240
240<script defer src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/library/slick.min.js"></script>
240 241
241<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/theme/modules/axios-request-handler.js"></script>
241 242 243 <link data-stencil-stylesheet href="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/css/theme-e3eb3260-99a2-013f-8035-366d5547be73.css" rel="stylesheet"> 244 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/notyf@3/notyf.min.css"> 245
245<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/theme/modules/global-functions.js"></script>
245 246 <!-- Start Tracking Code for analytics_siteverification --> 247 248<meta name="google-site-verification" content="xr1-ov0_OylCXT8RiDgGSL5zu3rxXVo90eZ-yk2R0Ok" /> 249 250<!-- End Tracking Code for analytics_siteverification --> 251 252
253<script type="text/javascript" src="https://checkout-sdk.bigcommerce.com/v1/loader.js" defer ></script>
vendor: 77 bytes, lines 253-254
253 254<script src="https://www.google.com/recaptcha/api.js" async defer></script>
255<script type="text/javascript"> 256var BCData = {}; 257</script>
257 258
259<script data-cfasync="false" data-dd-sm-ignore="true" data-cookieconsent="ignore" id="wsa-tag-manager-tags" nonce=""> 260</script > 261 262</script>
vendor: 2 bytes, line 262
262
263<script data-cfasync="false" data-dd-sm-ignore="true" data-cookieconsent="ignore" id="wsa-tag-manager-javascript-h-test" nonce="">!function(w,d){if(d.location.href.indexOf('showHidden=true')<0&&d.location.href.indexOf('shogun.page/previews')<0){w.TagRocket=w.TagRocket||{};var T=w.TagRocket;T.teh=[];w.onerror=function(m,s,l,c,e){T.teh.push((l?(l+' '):'')+(c?(c+' '):'')+m+(m.colno?(':'+m.colno):'')+(s?(' '+s):''));};function a(s){var e=d.createElement('script'),h=d.getElementsByTagName('head')[0];e.appendChild(d.createTextNode(s));h.insertBefore(e,h.firstChild)}a('()=>{};window.arrowFunctions=1');a('async function a(){};window.asyncFunctions=1');var m=new Date().toISOString(),q='wsa-tag-manager-javascript-',z;T.tah=function(s){w.dataLayer=w.dataLayer||[];if(!w.gtag){w.gtag=function(){dataLayer.push(arguments)};gtag('js',new Date);t=d.createElement('script');t.async=!0;t.setAttribute('src','https://www.googletagmanager.com/gtag/js?id=G-7XTJM93TLW');d.head.appendChild(t)};if(!w.wsa_tre){var n='denied';gtag('consent',{functionality_storage:n,ad_storage:n,analytics_storage:n,ad_user_data:n,ad_personalization:n,personalization_storage:n,security_storage:n});gtag('config',"G-7XTJM93TLW",{groups:'TagRocketErrorTracking',send_page_view:false});gtag('config',"G-0XNHDCESR7",{groups:'TagRocketErrorTracking',send_page_view:false});gtag('event','tag_rocket_error',{send_to:["G-0XNHDCESR7"],description:'Script Failure',app_version:'3.48.21',tag_rocket_version:'1.95',ua:navigator.userAgent});};w.wsa_tre=1;if(w.console)console.error('Tag Rocket (h): '+s,T.teh);T.teh.forEach(function(e){gtag('event','app_error',{send_to:'G-7XTJM93TLW',scope:s,description:s+' 3.48.21 h '+e,message:'h '+e,app_version:'3.48.21',automatic:1,tag_rocket_version:'1.95',pagedatetime:m,datetime:m,ua:navigator.userAgent,tags:"|unknown",environment:'Production'})})};p=function(){if(!T.ts&&!d.getElementById(q+'second'))T.tah('Header Script Missing');else if(!T.tss)T.tah('Header Script Failure1');else if(!T.ts)T.tah('Header Script Failure2');if(!T.tm&&!d.getElementById(q+'main'))T.tah('Footer Script Missing');else if(!T.tm)T.tah('Footer Script Failure')};if(w.addEventListener)w.addEventListener('DOMContentLoaded',p);else w.attachEvent('onDOMContentLoaded',p)}}(window,document)</script>
263
264<script data-cfasync="false" data-dd-sm-ignore="true" data-cookieconsent="ignore" id="wsa-tag-manager-javascript-second" nonce=""> 265/* 266 Web Site Advantage: Tag Rocket App 1 of 2 Head [1.95.88286] Proprietary Runtime 267 https://bigcommerce.websiteadvantage.com.au/tag-rocket/ 268 Licensed for use only by authorised Web Site Advantage customers. 269 Copyright (C) 2020 - 2026 Web Site Advantage Pty Ltd. 270*/ 271 272!function(w,d){if(d.location.href.indexOf('showHidden=true')<0&&d.location.href.indexOf('shogun.page/previews')<0){w.TagRocket=w.TagRocket||{};var T=w.TagRocket;T.tss=1;T.tags='gads|ga4|tiktok';T.l='';var eet=new Date,eei=0,eer=0,eea='G-7XTJM93TLW';T.ecq=[];T.ec=function(){if(T.consent.analytics)gtag.apply(null,arguments);else T.ecq.push(arguments)};T.a=function(s,e,c,o){if(T.bae)return;try{if(!eei){eei=1;if(!w.gtag){w.gtag=function(){dataLayer.push(arguments)}}T.ec('config',eea,{groups:'TagRocketErrorTracking',send_page_view:false})}if(!eer){eer=1;T.ct=c;if(w.console)console.error('Tag Rocket: '+s+': '+e,o||'');T.ct=1;var z=e?e.substring(0,255):'-missing-';T.ec('event','app_error',{send_to:eea,scope:s,description:s+' 3.48.21 '+z,message:z,app_version:'3.48.21',automatic:1,tag_rocket_version:'1.95',pagedatetime:eet.toISOString(),datetime:new Date().toISOString(),ua:navigator.userAgent,tags:T.countryCode+'|'+T.tags,timesinceload:new Date-eet,environment:'Production'});eer=0}}catch(x){try{T.ec('event','app_error',{send_to:eea,scope:'AppErrorError',description:'3.48.21 '+x,message:''+x,app_version:'3.48.21',tag_rocket_version:'1.95',pagedatetime:eet.toISOString(),datetime:new Date().toISOString(),ua:navigator.userAgent,tags:T.countryCode+'|'+T.tags,timesinceload:new Date-eet,environment:'Production'})}catch(y){}}};T.eq=T.eq||[];if(w.addEventListener){w.addEventListener('error',function(){T.ef.apply(T,arguments)},{passive:!0,capture:!1})}else if(w.attachEvent){w.attachEvent('onerror',function(){T.ef.apply(T,arguments)})}if(!T.ef){T.ef=function(){T.eq.push(arguments)}};if(!T.cf){T.cq=T.cq||[];T.cf=function(){T.cq.push(arguments)};if(w.console){T.ce=console.error;console.error=function(){T.ce.apply(console,arguments);T.cf.apply(T,arguments)}}};try{T.et=function(a){return typeof a!=='undefined'};T.dQ='NewPromotionsAdded';T.el=[];T.em=0;T.cA=function(){T.ek(function(a){a.forEach(function(b){T.e(b.addedNodes,function(c){if(T.bw(c,T.bo)=='promotion'&&T.bv(c,'found')){T.el.push(c)}T.e(T.ei(c,"["+T.bo+"='promotion']"),function(e){if(T.bv(e,'found')){T.el.push(e)}})})});if(T.be(T.el)&&!T.em){T.N(function(){T.em=T.aU(function(){T.em=0;T.f(T.dQ,{elements:T.el});T.el=[]},100,'New Promotions Added')})}})};T.ed=[];T.ee=0;T.eg=function(a){T.e(a,function(b){T.ed=T.ed.concat(T.bl(b));if(T.bw(b,T.bo)=='list'&&T.eh(b)&&T.bv(b,'found')){T.ed.push(b)}T.e(T.ei(b,"["+T.bo+"='list']"),function(c){if(T.eh(c)&&T.bv(c,'found')){T.ed.push(c)}})})};T.ej=function(){T.N(function(){if(T.be(T.ed)){if(T.ee)T.dY(T.ee);T.ee=T.aU(function(){T.f(T.df,{elements:T.ed});T.ed=[];T.ee=0},500,'New Products Added')}})};T.cz=function(e){T.ek(function(f){f.forEach(function(g){T.eg(g.addedNodes)});T.ej()},e||d.body)};T.df='NewProductsAdded';T.aS='UserDataUpdated';T.bB=function(a){return d.querySelector(a)};T.bC=function(a){return d.getElementById(a)};T.ep=function(a){return d.createElement(a)};T.ei=function(a,b){if(!a.querySelectorAll)return[];var c=a.querySelectorAll(b);if(Array.from)return Array.from(c);else return c};T.bn=function(a){return T.ei(d,a)};T.eh=function(a){var b=T.bw(a,T.bp);return b&&!isNaN(parseInt(b,10))};T.E=function(a){return T.et(a)&&a!==null};T.w=function(a){return a===0||(T.E(a)&&a!==''&&!isNaN(a))};T.ev=function(a){var b=String.fromCodePoint;if(b){return b(a)}return ''};T.eu=function(a,b,c){var e=[].slice.call(a).map(function(f){if(c||typeof(f)==='function')return f;try{return T.D(f)}catch(g){if(Array.isArray(f)){return[].concat(f)}else return f}});if(T.be(e)){e[0]=T.ev(b)+' %cTag Rocket: %c'+e[0];e.splice(1,0,'color:none;');e.splice(1,0,'color:#28a300;')}return e};T.ck=function(){if(w.console)console.warn.apply(console,T.eu(arguments,0x1F6A8,1))};T.cL=function(){if(w.console)console.error.apply(console,T.eu(arguments,0x26A0,1))};T.an=function(a,b){return a.sort(function(c,e){return e.price*e.quantity-c.price*c.quantity}).slice(0,b)};T.cT=function(a,b,c,e){var f,g=function(h){if(h>=T.be(a))c&&c();else T.aU(function(){T.t('SB95',function(){f=b(a[h],h);if(T.et(f))c&&c(f);else g(h+1)},1)},0,'Yield '+h+' '+e)};g(0)};T.e=function(a,b){var c,e,f=T.be(a);if(a&&f)for(c=0;c<f;c++){e=b(a[c],c);if(T.et(e))return e}};T.V=function(a,b){if(a)return a.indexOf(b)>-1};T.dq=function(a,b){if(a&&T.be(a))for(var c=0;c<T.be(a);c++){if(a[c]===b)return true}};T.en=function(a,b,c){a.setAttribute(b,c)};T.p=function(a,b,c){if(T.E(c)&&c!=='')a[b]=c};T.cv=function(a,b){if(!b||!a)return a;var c=b.split('.'),e=a[c.shift()];return T.cv(e,c.join('.'))};T.t=function(a,b,c,e){if(!T.block){try{c&&b.apply(this,e)}catch(f){T.a(a,''+f,1,f)}}};T.by=function(a,b,c,e){var f,g=function(){if(f){clearInterval(f);f=0};T.t.call(this,'SB24',c,1,arguments)};if(b==T.aa&&d.readyState!="loading"){T.aU(g,0,T.aa+' has passed')}else{e=e||{};if(!T.E(e.passive)){e.passive=!0}if(b==T.aa){f=T.bF('SB98',1,function(){if(d.readyState!="loading"){clearInterval(f);f=0;T.aU(g,0,T.aa+' detected by interval')}},50)}a.addEventListener&&a.addEventListener(b,g,e)||a.attachEvent&&a.attachEvent('on'+b,g)}};T.Z=function(a,b){T.by(w,a,function(){if(!b.done){b.done=1;b()}},{once:!0})};T.cb=function(a,b){try{return JSON.stringify(a,b)}catch(c){throw ''+T.cb.caller+' '+c}};T.ch=function(a){return a&&JSON.parse(a)};T.D=function(a){return T.ch(T.cb(a))};T.du=function(a){return T.cb(a)=='{}'};T.ac=function(a){var b=Object(a),c,e,f,g=arguments;for(c=1;c<g.length;c++){e=g[c];if(e!=null){for(f in e){if(Object.prototype.hasOwnProperty.call(e,f))b[f]=e[f]}}}return b};T.be=function(a){return a.length};T.bR=function(a){try{if(!localStorage||T.es)return!1;return localStorage.removeItem(a)}catch(b){T.a('SB63','Incognito Safari has blocked localStorage. This stops us tracking things like add to cart events',1,b);T.es=!0}};T.bz=function(a){try{if(!localStorage||T.es)return!1;return localStorage.getItem(a)}catch(b){T.a('SB61','Incognito Safari has blocked localStorage. This stops us tracking things like add to cart events',1,b);T.es=!0}};T.bA=function(a,b){try{if(!localStorage||T.es)return!1;localStorage.setItem(a,b)}catch(c){T.a('SB60','Incognito Safari has blocked localStorage. This stops us tracking things like add to cart events',1,c);T.es=!0}};T.dT=function(a){d.cookie=a+'=;expires='+new Date(99,1).toUTCString()+';path=/'};T.ay=function(a){var b=d.cookie.match(new RegExp('(^| )'+a+'=([^;]+)')),c=b&&unescape(b[2])||'';return c=='deleted'?'':c};T.S=function(a){var b=w.performance;return b&&b.getEntriesByType&&b.getEntriesByType(a)};T.R=function(){var a=navigator;return a.connection||a.mozConnection||a.webkitConnection};T.P=function(a,b,c){return(a||'').replace(b,c||'')};T.aB=function(a){a=(a||'').trim().toLowerCase();return a.replace(/^([^@]*)(@(?:gmail|googlemail)\.com)$/,function(b,c,e){return c.replace(/\./g,'')+e})};T.bh=function(a){return T.P(T.P(T.aB(a),/([^a-z0-9 _])/g),/ +/g,'_')};T.T=function(a,b){b=b||255;if(!a)return '(missing)';a=T.P((''+a).trim(),/ *(\r\n|\n|\r) */gm,' ');if(T.be(a)<=b)return a;return a.substring(0,b-3)+'...'};
272T.cM=function(a,b){var c='',e='';switch(b){case 'AU':c='0011';e='61';break;case 'US':case 'CA':c='011';e='1';break;case 'GB':c='011';e='44';break;case 'IT':c='00';e='39';break}a=T.P(a,/[^\d+]+/g);if(c)a=T.P(a,new RegExp('^'+c),'+');if(a[0]!='+'&&e){a='+'+T.P(e+a,/^0/)}return a};T.bx=function(a,b){return a.hasAttribute(b)};T.bv=function(a,b){var c='data-tagrocket-'+b;if(T.bx(a,c))return 0;T.en(a,c,'1');return 1};T.bF=function(a,b,c,e){var f=setInterval(function(){T.t(a,function(){try{c()}catch(g){if(b)clearInterval(f);throw g}},1)},e);return f};T.cx=function(a,b,c,e){if(a)T.dY(a);return T.aU(b,c,e)};T.dY=function(a){clearTimeout(a)};T.aU=function(a,b,c){return setTimeout(a,b,'Tag Rocket '+(c||''))};T.bG=function(a,b,c){T.dz('query getCartMetafields{site{cart{metafields(namespace:"bc_storefront" keys:["'+b+'"]){edges{node{entityId}}}}}}',function(e,f){T.t('SB82',function(){if(e>0){var g='createCartMetafield',h='',i=T.cv(f,'data.site.cart.metafields.edges');if(i&&i.length){g='updateCartMetafield';h=' metafieldEntityId:'+i[0].node.entityId}T.dz('mutation '+g+'{cart{'+g+'(input:{cartEntityId:"'+a+'" data:{key:"'+b+'" value:"'+T.cb(c).replace(/"/g,'\\"')+'"}'+h+'}){metafield{id entityId key value}errors{...on Error{message}}}}}',function(e,j){T.t('SB83',function(){if(e>0){}},1)})}},1)})};T.er=function(a){T.cE.appendChild(a)};T.eo=function(a,b,c){b=b||{};if(b.onvisible&&d.hidden){T.Z('visibilitychange',function(){T.eo(a,b,c)});return};var e=T.ep(a),f;if(b.id&&T.bC(b.id))return;for(var g in b){T.en(e,g,b[g])}e.onload=e.onreadystatechange=function(){f=e.readyState;if(!f||f=='loaded'||f=='complete'){if(c)c();c=null}};T.er(e);return e};T.aT=function(a,b,c){b=b||{};b.src=a;if(!T.E(b.async))b.async=!0;if(T.cI)b.nonce=T.cI;if(!T.E(b.onvisible)&&T.pageType!='orderconfirmation')b.onvisible=!0;if(T.pageType!='orderconfirmation'||T.d.updated){T.eo('script',b,c)}else{T.o(T.aS,function(){T.eo('script',b,c)})}};T.dI=function(a){if(T.bx(a,'data-list-name'))return T.bw(a,'data-list-name');if(a.parentElement)return T.dI(a.parentElement)};T.U=function(){var a=T.bB('head meta[name="description"]');if(a)return T.bw(a,'content');};T.cK=function(a){var b=w.location.href.match(new RegExp('[?&]'+a+'=([^&]*)'));return decodeURIComponent(b&&b[1]||'')};T.ek=function(a,b,c){if(w.MutationObserver)T.Z(T.aa,function(){c=c||{childList:!0,subtree:!0};b=b||d.body;if(!b)throw 'no target';new MutationObserver(a).observe(b,c)})};T.aL=function(a,b){if(a&&a.event_log)a.event_log+=b};T.dQ='NewPromotionsAdded';T.el=[];T.em=0;T.cA=function(){T.ek(function(a){a.forEach(function(b){T.e(b.addedNodes,function(c){if(T.bw(c,T.bo)=='promotion'&&T.bv(c,'found')){T.el.push(c)}T.e(T.ei(c,"["+T.bo+"='promotion']"),function(e){if(T.bv(e,'found')){T.el.push(e)}})})});if(T.be(T.el)&&!T.em){T.N(function(){T.em=T.aU(function(){T.em=0;T.f(T.dQ,{elements:T.el});T.el=[];},100,'New Promotions Added')})}});};T.ed=[];T.ee=0;T.eg=function(a){T.e(a,function(b){T.ed=T.ed.concat(T.bl(b));if(T.bw(b,T.bo)=='list'&&T.eh(b)&&T.bv(b,'found')){T.ed.push(b)}T.e(T.ei(b,"["+T.bo+"='list']"),function(c){if(T.eh(c)&&T.bv(c,'found')){T.ed.push(c)}})})};T.ej=function(){T.N(function(){if(T.be(T.ed)){if(T.ee)T.dY(T.ee);T.ee=T.aU(function(){T.f(T.df,{elements:T.ed});T.ed=[];T.ee=0},500,'New Products Added')}})};T.cz=function(e){T.ek(function(f){f.forEach(function(g){T.eg(g.addedNodes);});T.ej();},e||d.body)};T.df='NewProductsAdded';T.aC='PromotionsVisible';T.dP=function(a){T.bk(T.aC,a)};T.bi=function(a,b){if(T.dq(['orderconfirmation','checkout','cart'],T.pageType))return;var c,e=[];T.e(a.infos||a.items||a,function(f){c=f.product||f;if(!c.completed){e.push(c);}});if (T.be(e)&&T.cK('showHidden')!='true'&&!T.V(e[0].name,'Package Protection')&&!T.cF){T.a('SB55e',''+T.be(e)+' incomplete products on '+b+' '+e[0].productId+' '+e[0].name,1,e);}};T.dL=function(a,b){var c="["+T.bo+"='list']["+T.bp+"='"+a+"']";if(b)c="[data-list-name='"+T.P(b,/['"\\]/g,'\\$&')+"'] "+c;return T.bB(c)};T.n='ProductsVisible';T.dN=function(a,b){if(T.bj||T.cu)a.search=T.bj||T.cu;T.bi(a,T.n);T.cX(T.n,a,b)};T.dZ=function(a){T.t('SB19b',function(){var b,c={},e;T.e(a,function(f){if(!f.seen){f.seen=1;b=f.callback.name+f.id;if(!c[b])c[b]=[];c[b].push(f)}});for(var g in c){e=c[g][0];e.callback({infos:c[g],list:e.list})}},1)};T.eb=0;T.ea=[];T.dU=function(a){a.visibleTime=0;
272if(!T.E(a.minVisibleTime))a.minVisibleTime=2e3;var b,c=new IntersectionObserver(function(e){T.e(e,function(f){if(f.isIntersecting){a.lastVisible=new Date;a.trigger='visible';b=T.aU(function(){c.disconnect();T.ea.push(a);if(T.eb)return;T.eb=T.aU(function(){T.eb=0;if(T.be(T.ea)){T.dZ(T.ea);T.ea=[];}},1e3,'Visible Ticking')},a.minVisibleTime-a.visibleTime,'On First Visible')}else{if(b)T.dY(b);if(a.lastVisible){a.visibleTime+=new Date-a.lastVisible;a.lastVisible=0}}})},{threshold:[0.5]});c.observe(a.e)};T.dW=[];T.dX=0;T.dV=function(a){T.dW.push(a)};T.cB=function(){T.t('SB18c',function(){var b,c,e=0,f=1,g=function(a){if(a.seen)return false;if(a.e&&a.e.getBoundingClientRect){try{b=a.e.getBoundingClientRect()}catch(h){}if(b){return b.top>-b.height/2&&b.left>-b.width/2&&b.bottom-b.height/2<=(w.innerHeight||T.Y.clientHeight)&&b.right-b.width/2<=(w.innerWidth||T.Y.clientWidth)}}return a.percent<T.dX},i=function(j,k){if(!k&&c)return;T.dY(c);c=T.aU(function(){c=0;T.t('SB18a',function(){l()},1)},j,'Scroll Tick '+k)} ,l=function(){var m=[],n=1,o,p,q,r=d.body;q=w.pageYOffset,p=w.innerHeight;if(r&&r.scrollHeight){if(f==1)f=r.scrollHeight;if(T.Y.clientHeight)n=T.Y.clientHeight;if(q&&p)n=q+p;}o=n/f;if(o>T.dX){T.dX=o;e=n;T.t('SB18b',function(){T.e(T.dW,function(a){a.trigger='scroll '+o;if(g(a)&&T.be(m)<=5)m.push(a)});if(T.be(m)){T.dZ(m);i(6e3,1)}},1);}};T.by(d,'scroll',function(){i(1e3,0);});T.Z('load',function(){l()})},1);};T.dO=function(a){if(a.e&&('IntersectionObserver' in window)){T.dU(a)}else{T.dV(a)}};T.dS=function(a,b,c,e){if(!w._bcCsrfProtectionPatched&&e<10){T.aU(function(){T.dS(a,b,c,e+1)},100,'XMLHttpRequest Wait '+e)}else{var f=new XMLHttpRequest();e=e||1;f.onreadystatechange=function(){if(this.readyState==4){if(this.status!=200){if(e<12){T.aU(function(){T.dS(a,b,c,e+1)},1e3,'XMLHttpRequest Retry '+e)}else{T.a('SB36','Request Failed after '+e+' attempts : '+a+' '+this.status,1,f);b(0,this.status)}}else{b(1,f.responseText?T.ch(f.responseText):'-missing-')}}};f.open(c?'POST':'GET',a,true);f.withCredentials=true;f.setRequestHeader('Content-type','application/json');if(c){f.setRequestHeader('Authorization','Bearer '+T.cJ);f.send(T.cb({query:c}))}else{f.send()}}};T.dR=function(a,b,c,e,f,g){if(T.V(w.location.href,'googleusercontent.com')){c(0,'googleusercontent.com')}else{e=e||0;f=f||0;g=g||[];b=b||{};e++;if(a!='/graphql'&&!w._bcCsrfProtectionPatched&&e<10){T.aU(function(){T.dR(a,b,c,e,f,g)},100,'Fetch Wait '+e)}else{f++;if(f==2&&a!='/graphql'){T.dT('XSRF-TOKEN');T.dT('SF-CSRF-TOKEN');g.push('TokenReset')}w.fetch(a,b).then(function(h){var i,j=h.headers.get('cf-ray');g.push(h.status);h.text().then(function(k){if(h.ok){if(T.be(f)>1)T.a('SB30c','Fetch '+g.join('/')+' Success after fail '+a+' '+e,1,h);try{i=T.ch(k)}catch(l){c(0,'status='+h.status+'; JSON parse error '+l+'; body='+k);throw 'JSON parse error '+l+' '+a}try{c(i?1:0,i||'-empty-')}catch(l){throw 'onComplete error '+l+' '+a}}else{if(f<3&&![400,404,410,429].includes(h.status)){T.aU(function(){T.dR(a,b,c,e,f,g)},1e3*f,'Fetch '+f)}else{try{T.a('SB30','Fetch '+g.join('/')+' Last Fail '+a+' '+e+' ['+j+']',1,h);if(!0)T.a('SB30',k,1,h);if(!1&&j)T.a('SB30d','cf-ray: '+j,1,h);c(0,'status='+h.status+'; body='+k)}catch(l){T.a('SB30b','Fetch '+a+' onComplete '+(l.message||l),1,l)}}}})}).catch(function(m){if(!m.message||!m.message.match(/^(cancel|annul|brochen|NetworkError when|Failed to fetch|ì·¨ìë¨)/)){g.push(m.message||m);if(f<3){T.aU(function(){T.dR(a,b,c,e,f,g)},1e3,'Fetch Error '+f)}else{if(!T.cF)T.a('SB29','Fetch '+g.join('/')+' Last Error '+a,1,m);c(0,m.message||m)}}else c(-1,m.message||m)})}}};T.dz=function(a,b){var c='/graphql';if(w.fetch){T.dR(c,{method:'POST',credentials:'same-origin',headers:{'Content-Type':'application/json',Authorization:'Bearer '+T.cJ},body:T.cb({query:a})},b)}else{T.dS(c,b,a)}};T.bJ=function(a,b){if(w.fetch){T.dR(a,{credentials:'include'},b)}else{T.dS(a,b)}};T.bu=function(){T.o(T.dQ,function(a){T.br(T.bt(a.elements))})};T.br=function(a){T.e(a,function(b){if(!b.e)b.e=T.bB("["+T.bo+"='promotion']["+T.bp+"='"+b.id+"']");var c=b.location=='top'?0.1:0.9;if(b.e){if(T.bv(b.e,'registered')){T.dO({se: T.dM,id:'',e:b.e,promotion:b,percent:c,callback:T.dP});T.by(b.e,'click',function(){T.bk(T.aE,b)})}}else{T.dO({se: T.dM,id:'',e:b.e,promotion:b,percent:c,callback:T.dP})}})};T.aE='PromotionClicked';T.dK=0;T.bg=function(a,b){T.dK++;T.e(a.items,function(c,e){if(!b||T.dq(b,c)){c.e=c.e||T.dL(c.productId,a.listName);var f={se:T.dM,id:T.dK,e:c.e,product:c,list:a};if(c.e){if(T.bv(c.e,'registered')){f.callback=T.dN;f.percent=e/T.be(a.items);T.dO(f);T.by(c.e,'click',function(){if(!f.seen)T.dN({infos:[f],list:a});T.bk(T.ai,f);})}}else{f.callback=T.dN;f.percent=e/T.be(a.items);T.dO(f);}}})};T.ai='ProductClicked';T.bt=function(a){var b,c,e,f,g=[];if(!a)a=T.bn("["+T.bo+"='promotion']["+T.bp+"]");T.e(a,function(h){b=T.bw(h,T.bp);c=T.bw(h,'data-name');e=T.bw(h,'data-position');f={e:h};if(b)f.id=parseInt(b,10);if(c)f.name=c;if(e)f.location=e;g.push(f)});return g};T.bm=function(a){var b,c,e=[],f=T.dH(e,a);if(T.be(e)){T.bf({reason:'List',items:e},function(g){for(b in f){c=f[b];
272if(T.cC)c.category=T.cC;T.bg(c,g.items)}})}};T.dG=[];T.dH=function(a,b){var c,e,f,g,h,i={},j,k,l,m,n,o,p=['{','blogid','pageid','categoryid','ssib'],q='data-tagrocket-searchprovider';T.e(b,function(r){j=T.dI(r)||'Page:'+T.cD;c=j.split(':')[0].trim();m=j;if(T.V(m,':'))m=m.split(':')[1].trim();i[j]=i[j]||{id:T.bh(j),type:c,listName:j,name:m,items:[]};n=T.dG[j]||0;f=T.bw(r,T.bp);e=T.bw(r,'data-product-price');l=T.bw(r,'data-product-category');g=T.bw(r,'data-name');h=T.bw(r,'data-product-brand');o=T.bw(r,'data-position');k={e:r,index:n};if(f)k.productId=parseInt(f,10);if(isNaN(k.productId)){if(!T.dJ&&f&&p.some&&p.some(function(m){f.indexOf(m)!=0})){T.dJ=1;T.a('SB43','Page contains invalid '+T.bp+' value:'+f,1,r)}}else{T.bv(r,'found');if(T.bv(r,'got')){if(T.w(e))k.price=parseFloat(e);if(l)k.category={path:l,breadcrumbs:[l]};if(T.bx(r,q))k.searchprovider=T.bw(r,q);if(T.j)k.currency=T.j;if(!isNaN(o))k.index=parseInt(o,10)-1;T.dG[j]=n+1;a.push(k);i[j].items.push(k)}}});return i};T.ca=function(a){var b='(unknown)';if(a&&a.nodeName){b=T.aB(a.nodeName);if(b=='body')return 'html>body';if(b=='head')return 'html>head';if(a.id)return b+'#'+a.id;if(a.className&&T.be(a.className))b+='.'+a.className.split(/[ ,]+/).join('.');if(a.parentElement)b=T.ca(a.parentElement)+'>'+b;return b}};T.r=function(a,b){if(isNaN(a))return a;if(!b)b=0;var c=Math.pow(10,b),e=Number.EPSILON||2.220446049250313e-16;return Math.round((a+e)*c)/c};T.dF='GetValue';T.getProductId=function(a,b,c,e,f){if(c.type=='giftCertificate')return c.type;var g=(c.isVariant&&f?f:e);if(g.length<1)return;return T.P(T.P(T.P(T.P(T.P(T.P(T.P(T.P(T.P(T.P(T.P((T.e(g.split('||'),function(h){if((!T.V(h,'[[psku]]')||c.productSku)&&(!T.V(h,'[[pmpn]]')||c.productMpn)&&(!T.V(h,'[[pupc]]')||c.productUpc)&&(!T.V(h,'[[pgtin]]')||c.productGtin)&&(!T.V(h,'[[vname]]')||c.variantName)&&(!T.V(h,'[[vid]]')||c.variantId)&&(!T.V(h,'[[vsku]]')||c.variantSku)&&(!T.V(h,'[[vmpn]]')||c.variantMpn)&&(!T.V(h,'[[vupc]]')||c.variantUpc)&&(!T.V(h,'[[vgtin]]')||c.variantGtin))return h})||'[[pid]]'),/\[\[pid\]\]/ig,c.productId),/\[\[pmpn\]\]/ig,c.productMpn),/\[\[pupc\]\]/ig,c.productUpc),/\[\[pgtin\]\]/ig,c.productGtin),/\[\[psku\]\]/ig,c.productSku),/\[\[vname\]\]/ig,c.variantName),/\[\[vid\]\]/ig,c.variantId),/\[\[vsku\]\]/ig,c.variantSku),/\[\[vmpn\]\]/ig,c.variantMpn),/\[\[vupc\]\]/ig,c.variantUpc),/\[\[vgtin\]\]/ig,c.variantGtin)};T.bP=function(a){T.d.updated=!0;try{var b=a.billingAddress;T.p(b,'phone',T.cM(b.phone,b.countryCode));T.p(T.d,'email',T.aB(b.email));T.p(T.d,'phone',b.phone);T.p(T.d,'first_name',b.firstName);T.p(T.d,'last_name',b.lastName);T.p(T.d,'street',b.address1);T.p(T.d,'city',b.city);T.p(T.d,'state',b.stateOrProvince);T.p(T.d,'postal_code',b.postalCode);T.p(T.d,'country_code',b.countryCode);if(b.address2)T.d.street=(T.d.street?T.d.street+',':'')+b.address2;}catch(c){T.a('SB56','Failed to update user data',1,c);}T.bk(T.aS,T.d);};T.aS='UserDataUpdated';T.dA=function(a,b){if(a.variants.edges){return T.e(a.variants.edges,function(c){if(c.node.entityId==b)return c.node})}};T.dB=function(a){var b='',c;T.e(a.options.edges,function(e,f){c=e.node;if(f)b+=',';b+=c.displayName+':';T.e(c.values.edges,function(g){b+=' '+g.node.label})});return b};T.dx='ProductDataGathered';T.dy='CartDataGathered';T.bf=function(a,b){T.t('SB26c',function(){var c=a.cart,e,f,g,h,i=[],j=[],k=T.cK('showHidden')=='true',l=function(i){a.requests++;var m=i.slice(0,25),n=j.filter(function(o){return T.dq(m,o.p)&&!T.dq(n,o.v)}).map(function(o){return o.v});f='query Products{site{';if(h){f+='id:product(entityId:'+e[0].productId+'){entityId sku mpn upc gtin variants(skus:['+T.cb(h)+']){edges{node{entityId}}}} product(sku:'+T.cb(h)+'){'}else{f+='products(first:25 entityIds:'+T.cb(m)+'){edges{node{'}f+='entityId sku name path defaultImage{url(width:1000)}mpn upc gtin brand{name} categories{edges{node{name entityId breadcrumbs(depth:10 first:50){edges{node{name}}}}}}';if(c&&T.be(n)){if(T.be(n)>250)T.a('SB26','Can only get 250 variants. There are '+T.be(n),1,n);f+='variants(first:250 entityIds:'+T.cb(n.slice(0,250))+'){edges{node{entityId mpn upc gtin options(first:50){edges{node{displayName values(first:50){edges{node{label}}}}}}}}}';}f+='twoVariants:variants(first:2){edges{node{entityId sku}}}';if(!h)f+='}}';f+='}}}';T.dz(f,function(p,q){T.t('SB32',function(){if(p>0){if(q.errors&&T.be(q.errors))throw 'graphql '+q.errors[0].message;T.e(e,function(o){var r,s,t,u,v,x,y,z,aa,ab,ac,ad,ae;if(h){y=T.cv(q,'data.site.product');z=T.cv(q,'data.site.id.sku');aa=T.cv(q,'data.site.id.mpn');ab=T.cv(q,'data.site.id.upc');ac=T.cv(q,'data.site.id.gtin');x=T.cv(q,'data.site.id.variants.edges');if(x)o.variantId=T.cv(x[0],'node.entityId');delete o.productSku}else{ad=T.cv(q,'data.site.products.edges');if(!ad)T.a('SB32x',T.cb(q),1,q);y=T.e(ad,function(af){if(!af||!af.node)T.a('SB32z',T.cb(q),1,q);if(af&&af.node&&af.node.entityId==o.productId)return af.node});if(y)z=y.sku}if(y){o.completed=!0;var ag,ah=[],ai=o.sku,aj=y.name,ak=y.path,al=y.defaultImage,am=y.mpn,an=y.upc,ao=y.gtin,ap=y.brand,aq=o.variantId;ai=ai||h;if(z)o.productSku=z;if(ai&&z!=ai)o.variantSku=ai;if(aj)o.name=aj;if(al){o.defaultImage=al;if(al.url)al.data=T.P(al.url,'/1000w/','/{:size}/')};
272if(ak)o.url=T.cG+ak;if(h){if(aa)o.productMpn=aa;else delete o.productMpn;if(ab)o.productUpc=ab;else delete o.productUpc;if(ac)o.productGtin=ac;else delete o.productGtin;if(am&&aa!=am)o.variantMpn=am;if(an&&ab!=an)o.variantUpc=an;if(ao&&ac!=ao)o.variantGtin=ao;}else{if(am)o.productMpn=am;if(an)o.productUpc=an;if(ao)o.productGtin=ao;}if(ap&&ap.name)o.brand=ap.name;o.isVariant=(ai&&(!z||z!=ai))==!0;if(o.isVariant&&aq&&c){ae=T.dA(y,aq);if(ae){if(ae.options)o.variantName=T.dB(ae);if(ae.mpn)o.variantMpn=ae.mpn;if(ae.upc)o.variantUpc=ae.upc;if(ae.gtin)o.variantGtin=ae.gtin}else{T.a('SB27','Failed to get extra variant information for variant: '+aq,1,y);o.variantName='(id='+aq+')'}};v=T.cv(y,'twoVariants.edges');if(T.be(v)>0){ag=v[0].node;if(!o.isVariant)o.hasVariants=T.be(v)>1||!(o.productSku==ag.sku||ag.sku=='');if(T.be(v)<2&&!o.variantId)o.variantId=ag.entityId;if(o.hasVariants)o.firstVariantSku=ag.sku};o.categories=ah;t=T.cv(y,'categories.edges');T.e(t,function(ar){if(!ar||!ar.node){T.a('SB32c',T.cb(t),1,t)}else{s={id:ar.node.entityId,name:ar.node.name,breadcrumbs:[]};ah.push(s);u=T.cv(ar,'node.breadcrumbs.edges');if(!u){T.a('SB32b',T.cb(t),1,t)}else{T.e(u,function(as){s.breadcrumbs.push(as.node.name);});s.path=s.breadcrumbs.join("/");if(!r||r.id>s.id)r=s}}});o.category=r}})}else{if(T.pageType!='orderconfirmation'&&p==0&&!T.cF)T.a(a.reason,'Failed to get extra information for '+T.be(m)+',ok='+p+',status='+q,1,m)}if(T.be(i)>25){l(i.slice(25))}else{if(p>0&&!c&&!T.cF){var at=[];T.e(e,function(o){if(!o.completed)at.push(o)});if(T.be(at)&&!k){if(g)T.a('SB55d','Could not get extra product data for URL sku '+g,1,{issues:at,items:e});else if(h)T.a('SB55a','Could not get extra product data for sku '+h,1,{issues:at,items:e});else T.a('SB55b',a.reason+' '+a.requests+' Could not get extra product data for '+T.be(at)+' out of '+T.be(e)+' items. '+at[0].productId,1,{issues:at,items:e});T.a('SB55c',T.cb(q),1,q)}}if(a.reason==T.v&&T.be(e)&&!e[0].variantId&&T.dC)e[0].variantId=T.dC;b(a)}},1)})};if(a.reason==T.v){g=T.cK('sku');h=a.items[0].sku||g;}if(c){c.items=[];var au=c.lineItems;if(au)T.e([].concat(au.physicalItems,au.digitalItems,au.giftCertificates),function(av){if(c.currency&&c.currency.code)av.currency=c.currency.code;if(!T.w(av.price))av.price=av.salePrice;if(!T.w(av.price))av.price=av.list_price;if(av.type=='giftCertificate'){av.price=av.amount;av.productId='giftCertificate';av.quantity=1;av.isTaxable=av.taxable;av.completed=!0}if(av&&!av.parentId)c.items.push(av)});else{T.a('SB26b','Missing lineItems '+a.reason+' '+T.cb(a.response||c),1,c);return}}e=a.items||c.items;a.items=e;if(c)c.items=e;T.products=T.products||[];T.products.push(e);var aw=0;if(c){if(T.j&&!c.currency)c.currency={code:T.j};var ax,ay=c.baseAmount,az=c.cartAmount,ba=c.coupons;if(ay&&az)c.totalDiscount=ay-az;if(ba)c.couponCodes=ba.map(function(bb){return bb.code}).join(', ')}T.e(e,function(o){var bc=o.discountAmount,bd=o.couponAmount;if(!o.productId&&o.product_id)o.productId=o.product_id;if(!o.variantId&&o.variant_id)o.variantId=o.variant_id;ax=0;if(bc)ax+=bc;if(bd){ax+=bd;if(c&&c.couponCodes)o.couponCodes=c.couponCodes}if(ax){o.totalDiscount=ax;aw+=ax}if(o.type!='giftCertificate'&&o.productId&&!T.dq(i,o.productId))i.push(o.productId);if(o.variantId)j.push({p:o.productId,v:o.variantId});});if(c&&c.orderAmount)c.totalDiscount=(c.discountAmount||0)+aw;if(!T.be(i)){T.N(function(){b(a)})}else{a.requests=0;l(i);}},1)};T.t('SB33',function(){var a=T.cv(w,'prototype'),b=T.cv(a,'send'),c=T.cv(a,'open'),e=w.fetch;if(!T.xe){if(c){a.open=function(f,g){this.rurl=g;return c.apply(this,arguments)}}if(b&&b.apply){a.send=function(){var h=this;T.by(h,'readystatechange',function(){if(h.readyState==4&&(h.status>399||h.status==0)){T.xe(h)}});return b.apply(this,arguments)}}}T.xq=T.xq||[];T.xe=function(i){T.xq.push(i)};if(!T.fe){if(e&&e.apply){w.fetch=function(g){/*This detects fetch errors.Please look up the stack for the real cause of the error*/return e.apply(this,arguments).then(function(j){if(j.status>399)T.fe({type:'status',url:j.url,message:j.status});return j}).catch(function(k){T.fe({type:T.aP,url:g.url||g,message:k.stack||k.message||k});throw k})}}}T.fq=T.fq||[];T.fe=function(l){T.fq.push(l)};},1);T.cy=function(){var a=0,b=0;T.dD='XMLHttpRequestResponseError';T.xe=function(c){a++;
272if(T.cE){T.cE.dataset.xhrErrors=a;T.cE.dataset.xhrErrorsInfo=(T.cE.dataset.xhrErrorsInfo||'')+' '+(c.responseURL||c.rurl)+' '+c.status+' '+c.statusText+' '+c.readyState;};if(d.visibilityState!='hidden'&&a<6)T.bk(T.dD,c)};if(T.xq){T.e(T.xq,function(c){T.xe(c)})}T.dE='FetchResponseError';T.fe=function(e){b++;if(T.cE){T.cE.dataset.fetchErrors=b;T.cE.dataset.fetchErrorsInfo=(T.cE.dataset.fetchErrorsInfo||'')+' '+e.url+' '+T.T(e.message,30);};if(!(e.type==T.aP&&d.visibilityState=='hidden')){if(b<6)T.bk(T.dE,e)}};if(T.fq){T.e(T.fq,function(e){T.fe(e)})}};T.cards=[];T.bl=function(a){var b=[],c,e;T.e(['dfd-data-product-id','data-compare-id'],function(f){T.e(T.ei(a,'['+f+']'),function(g){e=g.closest('.dfd-results-grid');if(e){c=g.closest('.dfd-card')||g;if(T.bv(c,'found')){T.en(c,T.bp,T.bw(g,f));T.en(c,T.bo,'list');T.en(c,'data-tagrocket-searchprovider','DooFinder');b.push(c)}}});});if(T.be(b))T.cards.push({node:a,cards:b});return b};T.bd=function(){return T.bn("["+T.bo+"]["+T.bp+"]").length>0};T.bK=function(a){if(!localStorage)return;T.N(function(){var b,c,e,f=T.ch(T.bz('wsa-c')),g=f||{version:'n/a'},h,i,j={};T.bU=0;T.e(a.items,function(k){var l=k.productSku,m=k.variantName,n=k.brand,o=k.sku,p=k.quantity;if(T.bU<3){b='id.'+k.id+'.p'+k.productId;if(k.variantId)b+='.v'+k.variantId;c={productId:k.productId,quantity:p,price:k.price,name:k.name,category:k.category};if(l)c.productSku=l;if(m)c.variantName=m;if(n)c.brand=n;if(o)c.sku=o;e=p;i=g[b];if(i)e-=i.quantity;e&&T.bT(e,k,a);j[b]=c}g[b]=null});j.version='1.0';T.bA('wsa-c',T.cb(j));for(h in g){i=g[h];i&&i.quantity&&T.bT(-i.quantity,i,a)}});};T.bw=function(a,b,c){if(a.getAttribute)return T.T(a.getAttribute(b),c)};T.by(w,'visibilitychange',function(){if(T.be(T.ea)){T.dZ(T.ea);T.ea=[]}});T.cC='';T.app={a:'3.48.21',v:'1.95.88286',d:'2026/09/04 04:27'};T.j='USD';T.aq='USD';T.cD="Pink Zebra Home - Sign in";T.cE=d.getElementsByTagName('head')[0];T.Y=d.documentElement;T.bo='data-event-type';T.bp='data-entity-id';T.aa='DOMContentLoaded';T.aP='exception';T.instantLoad='';T.dataTagEnabled='false';T.m='page_view';T.h='config';T.O='event';T.cF=T.V(w.location.href,'translate.goog');T.pageType='login';T.cG='https://pinkzebrahome.com';if(T.bx(T.Y,'data-country'))T.countryCode=T.bw(T.Y,'data-country');else if('')T.countryCode='';if(T.bx(T.Y,'data-region'))T.regionCode=T.bw(T.Y,'data-region');else if('')T.regionCode='';T.cH=false;T.cI="";T.b='allow_enhanced_conversions';T.cJ="eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJjaWQiOlsxXSwiY29ycyI6WyJodHRwczovL3Bpbmt6ZWJyYWhvbWUuY29tIl0sImVhdCI6MTc5MDUwNjc1NiwiaWF0IjoxNzkwMzMzOTU2LCJpc3MiOiJCQyIsInNpZCI6MTAwMjU0ODA5MCwic3ViIjoiQkMiLCJzdWJfdHlwZSI6MCwidG9rZW5fdHlwZSI6MX0.Dbbz5Ky_KmgYOqRNc1mNuklCGA8U9ANSp2dp5XrHfP_fERT3ZwmFrRT_ZM97Q6g0oEvbpO9Q1zJRl-0DJN1jjA";T.bj=T.cK('search_query');if(!T.bj)T.bj=T.cK('search_query_adv');if(T.bj)T.pageType=T.pageType+'_search';var a=T.S('navigation');T.cr=a&&a[0];T.X=T.E(d.hidden)?''+d.hidden:'unknown';T.W='unknown';if(T.cr){var b=T.cr.type,c=d.prerendering||b=='prerender',e=T.cr.activationStart,f=T.cr.deliveryType,g=f||'network';if(b=='reload')g='reload';if(f=='navigational-prefetch')g='prefetch';if(f=='cache')g='disk-cache';if(b=='back_forward'&&f=='cache')g='bfcache-miss-disk-cache';T.W=T.E(c)?(c?'prerender':(e>99?'prerender-until-script':g)):g;T.by(w,'pageshow',function(h){if(h.persisted)T.W='bfcache'});}T.d={};T.userData=T.d;T.userDataUpdated=function(){T.bk(T.aS,T.d)};if(T.countryCode)T.d.country_code=T.countryCode;if(T.regionCode)T.d.region_code=T.regionCode;T.bR('wsa-ce');T.bR('wsa-se');T.cN=[];T.cO=function(a){if(typeof a!='string')return a;
272if(a[0]!='^')a='^'+a;if(a[T.be(a)-1]!='$'||a[T.be(a)-2]=='\\')a=a+'$';return new RegExp(a)};T.o=function(a,b,c,e){if(!a){T.a('On event missing event text:'+c,'');return};if(!c)c=a;if(T.be(arguments)<4)e=!0;if(!a||(!e&&e!=false)||!c||!b){T.a('OnEvent bad data',a,b,c,e)}T.cN.push({r:T.cO(a),c:b,s:c,p:e})};T.cP=[];T.on=function(a,b){if(!a)T.a('On event missing eventRegexText');if(!b)T.a('On event missing callback');T.cP.push({r:T.cO(a),c:b,s:'C'+T.be(T.cP),p:!0})};T.cQ=function(f,g,h){T.e(f,function(i){if(i.r.test(g))T.t(i.s,i.c,i.p,[h,g])})};T.cR=function(f,g,h){T.e(f,function(i){if(i.r.test(g))T.t(i.s,i.c,i.p,[h,g])})};T.cS=function(f,g,h,b){T.cT(f.filter(function(i){return i.r.test(g)}),function(i){T.t(i.s,i.c,i.p,[h,g])},b,g)};T.cU=function(g,h){h.cancelDataLayerEvents=h.cancelDataLayerEvents||!1;T.cQ(T.cP,g,h);if(!h.cancelBuiltInEvents)T.cQ(T.cN,g,h);if(!h.cancelDataLayerEvents){w.dataLayer.push({event:'tagRocket'+g,tagRocketData:h})}return h};T.cV=function(g,h,b){h.cancelDataLayerEvents=h.cancelDataLayerEvents||!1;T.cS(T.cP,g,h,function(){if(!h.cancelBuiltInEvents)T.cS(T.cN,g,h,function(){if(!h.cancelDataLayerEvents){w.dataLayer.push({event:'tagRocket'+g,tagRocketData:h})}b&&b(h)});else{if(!h.cancelDataLayerEvents){w.dataLayer.push({event:'tagRocket'+g,tagRocketData:h})}b&&b(h)}});};T.cW=function(g,h){h.cancelDataLayerEvents=h.cancelDataLayerEvents||!1;T.cR(T.cP,g,h);if(!h.cancelBuiltInEvents)T.cR(T.cN,g,h);if(!h.cancelDataLayerEvents){w.dataLayer.push({event:'tagRocket'+g,tagRocketData:h})}return h};T.f=function(g,h){h.cancelBuiltInEvents=!1;return T.cU(g,h)};T.bk=function(g,h){T.N(function(){T.f(g,h)})};T.cX=function(g,h,b){h.cancelBuiltInEvents=!1;T.cV(g,h,function(j){b&&b(j)})};T.cY=function(g,h){h.cancelBuiltInEvents=!1;return T.cW(g,h)};T.aJ=function(g,h){h.cancel=!1;T.cU(g,h);return!h.cancel};T.cZ=function(g,h){h.cancel=!1;T.cW(g,h);return!h.cancel};w.dataLayer=w.dataLayer||[];T.da=[];T.gp=[];T.L=function(){if(!T.db&&T.dc){T.db=!0;try{while(T.be(T.da)){var a=T.da[0];T.da.splice(0, 1);gtag.apply(null,a)}if(T.dd){while(T.be(T.gp)){var a=T.gp[0];T.gp.splice(0, 1);gtag.apply(null,a)}}}finally{T.db=!1;}}};T.J=function(b){if(!w.gtag||!w.gtag.tagrocket){w.gtag=function(c,e,f){var a=arguments;if(T.dc){var g=f&&f.send_to||[],h=Array.isArray(g)?g:[g],i=["g-0xnhdcesr7","tagrocket","googleanalyticsfour"];if(c==T.h&&e&&T.V(i,e.toLowerCase())&&((f&&f.send_page_view===!1)!=!0)){T.dd=!0}if(c==T.O){if(e==T.m){if(h.some(function(j){return T.V(i,j.toLowerCase())})){T.de=!0}}else if(!T.dd&&(h.some(function(j){return T.V(i,j.toLowerCase())}))){T.aL(f,'v');T.gp.push(a);return}}try{if(TextEncoder){var s=new TextEncoder().encode(T.cb(k)).byteLength;if(s>16e3)T.a('GT5','Gtag Payload Too Large '+s,1,arguments)}}catch(l){}T.aL(f,'e');dataLayer.push(a);if(T.de){T.de=!1;T.dd=!0;T.L()}}else{if(c=='consent')dataLayer.push(a);else{T.aL(f,'p');T.da.push(a)}}};w.gtag.tagrocket=!0;return!0}};T.J('Start');dataLayer.splice(0).forEach(function(a){gtag.apply(null,a)});T.o(T.n,function(a){var b=[];T.e(a.infos,function(c){b.push(T.q({id:T.u(c.product)}))});T.k(a.search?'view_search_results':'view_item_list',{items:b})},'GA4',1);T.o(T.n,function(a){var b=[],c=a.list,e=c.listName,f={items:b},g;T.p(f,'currency',T.j);T.e(a.infos,function(h){g=T.aj(h.product,(h.e?'element':'stencil')+' '+h.trigger+' '+(h.product.searchprovider?h.product.searchprovider:''));if(g)b.push(g)});if(c.category&&c.type!=c.category)e=c.type+':'+c.category;T.ad('view_item_list',T.ak(f,e,c.id))},'GF3d',1);T.o(T.n,function(a){var b=a.list,c='ViewContent',e=a.infos.map(function(f){return T.aV(f.product,{path:b.type})}),g={content_type:'product_group',contents:e,content_ids:e.map(function(f){return f.content_id}),description:b.category||b.type};if(a.search){g.query=a.search;c='Search'}if(e.length>0)T.aR(c,g)},'TT4',1);T.o(T.aC,function(a){T.e(a.infos,function(b){T.aD('view_promotion',b.promotion)})},'GF40',1);T.o(T.ai,function(a){var b=T.aj(a.product),c={items:[b]};T.p(c,'currency',T.j);if(b)T.ad('select_item',T.ak(c,a.list.listName,a.list.id))},'GF3c',1);T.o(T.aE,function(a){T.aD('select_promotion',a)},'GF41',1);T.o(T.aE,function(a){T.aR('ClickButton',{content_id:'banner-'+a.id,content_name:a.name,content_category:'Banner '+a.location});},'TT13',1);T.o(T.df,function(a){T.bm(a.elements)});T.dg='consent';T.dh='default';T.di='update';T.dj='denied';T.dk='granted';T.M='ConsentChanged';T.dl='ConsentPreChanged';T.ax={gtagConsentModeV2:'basic',consentSource:'bc',bcEnabled:T.cH,enabled:T.cH};T.consent=T.ax;T.gtmConsent=function(a,b){T.dm(b||'gtm',a)};T.t('SB7',function(){var a,b,c=function(a){var e=!0;T.aM=T.dn=T.K=T.do=T.dp=e;T.ax.analytics=T.aM;T.ax.functional=T.dn;T.ax.targetingAdvertising=T.K;T.ax.adUserData=T.do;T.ax.adPersonalization=T.dp;};a=T.ay('bc_consent');c(a);T.bF('SB7b',1,function(){b=T.ay('bc_consent');if(a!=b){a=b;c(b);T.f(T.dl,T.ax);T.f(T.M,T.ax)}},500)},1);T.t('SB14',function(){T.updateConsent=function(a,b,c){T.a('SB14','updateConsent called when Tag Rocket is set to use the BigCommerce consent system',1,T.ax);var e,f,g=function(h){switch(h){case true:case T.dk:return!0;case false:case T.dj:return!1;default:return null;}};if(typeof a==='object'&&a!==null){e=a}else{e={};f=g(a);if(f!=null)e.analytics_storage=f?T.dk:T.dj;f=g(b);if(f!=null)e.functionality_storage=f?T.dk:T.dj;f=g(c);if(f!=null)e.ad_storage=f?T.dk:T.dj};T.ax.trLast=e;gtag(T.dg,T.di,e)}},1);T.dr='ConsentEstablished';T.Z(T.aa,function(){T.ax.established='bc';T.dc=!0;T.cX(T.dr,T.ax)});
272T.N=function(a){if(T.dc)a(!0);else T.o(T.dr,a)};T.t('SB84',function(){T.dm=function(a,b){var c='['+T.countryCode+'-'+T.regionCode+'] external Consent Mode '+a+" command detected while Tag Rocket is set to using the BC Banner. Possibly because BigCommerce's BODL GA4 solution is enabled.",e=T.D({o:b,c:T.ax}),f=T.ax.trLast;if(f&&!T.ax.errorSent&&(f.ad_storage!=b.ad_storage||f.analytics_storage!=b.analytics_storage||f.functionality_storage!=b.functionality_storage)){T.ax.errorSent=!0;if(T.bz('wsa-cme'))T.ck(c,e);else T.a('SB91',c,1,e);T.bA('wsa-cme','-')}}},1);T.ds=!0;T.dt=function(){var a=w.google_tag_data,b=T.dh,c=a&&a.ics&&a.ics.entries,e={},f,g;if(c){for(f in c){g=c[f];if(T.E(g.update)){e[f]=g.update?T.dk:T.dj;b=T.di}else if(T.E(g.default))e[f]=g.default?T.dk:T.dj}if(!T.du(e)){a=T.ax.googleTagData;if(!a||T.cb(e)!=T.cb(a)||(b==T.di&&T.ds)){T.ds=!1;T.ax.googleTagData=T.D(e);T.dm('google_tag_data_'+b,e)}}}};T.bF('SB81',0,T.dt,500);T.N(function(){T.J('WhenConsentEstablished');T.L()});T.dv=0;T.t('SB15',function(){w.dataLayer=w.dataLayer||[];var a,b=w.dataLayer,c=b.push,e=function(f,g){if(f&&f.length>2&&f[0]==T.dg)T.dm('dl_'+f[1]+'_'+g,f[2])};for(a=0;a<b.length;a++){e(b[a],'before')};b.push=function(){var h=[].slice.call(arguments,0);T.J('dataLayer.push');c.apply(b,h);h.forEach(function(i){e(i,'push')});T.L()};},1);T.init=function(){T.cL('The Tag Rocket API needs to be enabled to use it. Administration->Global Settings')};T.Z(T.aa,function(){if(T.i)T.e(T.i,function(){T.init()});});T.I=[];T.g=function(){T.J('GtagAdvertisingConsent');if(T.K)gtag.apply(null,arguments);else T.I.push(arguments);T.L()};T.o(T.M,function(){T.J('GtagAdvertisingConsent ConsentChanged');if(T.K){T.e(T.I,function(a){gtag.apply(null,a)});T.I=[];T.L()}});T.k=function(b,c,e){if(!c.send_to)c.send_to="AW-10776808640";c['developer_id.dODEzZj']=true;T.N(function(){T.t('GA91',function(){var f=''+d.location;if(e)gtag('set','page_location',e);T.g(T.O,b,c);if(e)gtag('set','page_location',f)},1)})};T.aK=[];T.ab=function(a,b,c){var e=T.J('GtagAnalyticsConsent');T.aL(c,e?'r':'o');if(T.aM){T.aL(c,'d');gtag.apply(null,arguments);}else{T.aL(c,'q');T.aK.push(arguments)}T.L()};T.o(T.M,function(){T.J('GtagAnalyticsConsent ConsentChanged');if(T.aM){T.e(T.aK,function(f){gtag.apply(null,f);});T.aK=[];T.L()}});T.aN=0;T.aO=0;T.aH=Date.now();T.ad=function(g,c){try{if(g==T.aP){T.aO++;if(T.aO>15)return};var h=T.ac({},T.Q,c);T.aN++;h['developer_id.dODEzZj']=true;if(!gtag)T.a('GF43',g+': No gtag',1,h);T.N(function(i){T.t('GF91',function(){h.send_to="G-0XNHDCESR7";T.aL(h,i?'y':'n');T.ab(T.O,g,h)},1)});}catch(j){T.a('GF42',g+': '+j,1,j);throw j}};gtag('set','developer_id.dODEzZj',true);T.o(T.dl,function(){T.ax.trLast={ad_user_data:T.do?T.dk:T.dj,ad_personalization:T.dp?T.dk:T.dj,analytics_storage:T.aM?T.dk:T.dj,functionality_storage:T.dn?T.dk:T.dj,ad_storage:T.K?T.dk:T.dj};T.J('ConsentChanged1');gtag(T.dg,T.di,T.ax.trLast);dataLayer.push({event:'bc_consent_update'});T.L()});T.o(T.M,function(){if(T.aM&&T.ecq){T.J('ConsentChanged2');T.e(T.ecq,function(a){gtag.apply(null,a)});T.ecq=[];T.L()}});if(T.cH){T.ax.trLast={ad_user_data:T.do?T.dk:T.dj,ad_personalization:T.dp?T.dk:T.dj,functionality_storage:T.dn?T.dk:T.dj,ad_storage:T.K?T.dk:T.dj,analytics_storage:T.aM?T.dk:T.dj};gtag(T.dg,T.dh,T.ax.trLast);};T.bR('wsa-cm');gtag('set','cookie_flags','SameSite=None;Secure');T.dw=function(){var a={address:{}},b=a.address;T.p(a,'email',T.d.email);T.p(a,'phone_number',T.d.phone);T.p(b,'first_name',T.d.first_name);T.p(b,'last_name',T.d.last_name);T.p(b,'street',T.d.street);T.p(b,'city',T.d.city);T.p(b,'postal_code',T.d.postal_code);if(T.du(b)){delete a.address}else{T.p(b,'region',T.d.region_code||T.d.state);T.p(b,'country',T.d.country_code);}if(!T.du(a))gtag('set','user_data',a)};T.o(T.aS,function(){T.dw()});T.dw();gtag('js',new Date);T.t('TT1',function(){var t='ttq',ttq;w.TiktokAnalyticsObject=t;ttq=w[t]=w[t]||[];ttq.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie"],ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);ttq.instance=function(t){for(var e=ttq.a[t]||[],n=0;n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e},ttq.load=function(e,n){var i="https://analytics.tiktok.com/i18n/pixel/events.js";ttq.a=ttq.a||{},ttq.a[e]=[],ttq.a[e].b=i,ttq.c=ttq.c||{},ttq.c[e]=+new Date,ttq.e=ttq.e||{},ttq.e[e]=n||{}};T.aQ=[];T.aR=function(){T.aQ.push(arguments)};ttq.track2=T.aR;ttq.load("D07P7U3C77UAB6445LB0");var f={},g=function(){T.p(f,'email',T.d.email);T.p(f,'phone_number',T.d.phone);
272T.p(f,'external_id',T.d.id);if(f)ttq.identify(f)};g();T.o(T.aS,function(){g()});ttq.page()},1);T.bb='https://www.googletagmanager.com/gtag/js?id=G-0XNHDCESR7';T.N(function(){T.t('GA2',function(){var a={groups:["TagRocket","GoogleAds"]};a[T.b]=!0;T.p(a,'user_id',T.d.id);T.g(T.h,"AW-10776808640",a);},1);T.t('GF1',function(){var a={},b={},c={send_page_view:false,groups:['TagRocket','GoogleAnalyticsFour']};T.Q=a;var e={};T.p(e,'customer_id',T.d.id);T.p(e,'customer_group_name',T.d.customer_group_name);T.p(e,'customer_group_id',T.d.customer_group_id);T.p(e,'user_currency_code',T.j);gtag('set','user_properties',e);var f='',g=T.R(),h=T.S("resource"),i,j,k='unknown';b.meta_description=T.T(T.U());b.content_group=T.pageType;a.page_type=T.pageType;if(!w.arrowFunctions)f+='arrowFunctions ';if(!w.asyncFunctions)f+='asyncFunctions ';if(!w.fetch)f+='fetch ';if(!w.MutationObserver)f+='MutationObserver ';if(!w.addEventListener)f+='addEventListener ';b.missing_features=f.trim()||'(none)';if(h){j=h.find(function(l){return l.initiatorType=='early-hints'});i=h.find(function(l){return (T.V(l.name,'googleapis.com')||T.V(l.name,'fonts.gstatic.com'))&&!l.duration&&!l.transferSize});k=i?'hot':(j?'warm':'cold')}a.effective_connection_type=g&&g.effectiveType||'unknown';a.save_data=(g&&T.E(g.saveData))?''+g.saveData:'unknown';a.delivery_type=T.W;a.initially_hidden=T.X;a.resource_loading=k;var m=T.Y,n=d.body;a.width=w.innerWidth||(m&&m.clientWidth);a.height=w.innerHeight||(m&&m.clientHeight);a.pixel_ratio=w.devicePixelRatio;if(!a.width)T.Z(T.aa,function(){a.width=n&&n.clientWidth;a.height=n&&n.clientHeight});T.p(a,'active_currency_code',T.j);a.country_code=T.countryCode;T.p(a,'user_id',T.d.id);c.allow_ad_personalization_signals=!1;c[T.b]=!0;T.ab(T.h,"G-0XNHDCESR7",T.ac(c,a));b=T.ac(b,a);T.ad(T.m,b)},1);T.t('GA2b',function(){var a={page_type:T.pageType};T.p(a,'customer_group_name',T.d.customer_group_name);T.p(a,'customer_group_id',T.d.customer_group_id);T.p(a,'currency_code',T.j);T.k(T.m,a)},1)})}catch(e){T.teh=T.teh||[];T.teh.push(e);if(T.a)T.a('HEAD',''+e,1,e);else if(T.tah)T.tah('Head Script ISSUE')}T.ts=1}}(window,document) 273 274</script>
274 275 276
276<script type=text/javascript> 277 /* >> TriplePixel :: start*/ 278 window.TriplePixelData={TripleName:"store-9khen3dncu.mybigcommerce.com",ver:"2.17",plat:"bigcommerce",isHeadless:false,product:{id:"",name:"",price:""},checkout:{id:"",ship_email:""},user:{em:""}},function(W,H,A,L,E,_,B,N){function O(U,T,P,H,R){void 0===R&&(R=!1),H=new XMLHttpRequest,P?(H.open("POST",U,!0),H.setRequestHeader("Content-Type","text/plain")):H.open("GET",U,!0),H.send(JSON.stringify(P||{})),H.onreadystatechange=function(){4===H.readyState&&200===H.status?(R=H.responseText,U.includes("/first")?eval(R):P||(N[B]=R)):(299<H.status||H.status<200)&&T&&!R&&(R=!0,O(U,T-1,P))}}if(N=window,!N[H+"sn"]){N[H+"sn"]=1,L=function(){return Date.now().toString(36)+"_"+Math.random().toString(36)};try{A.setItem(H,1+(0|A.getItem(H)||0)),(E=JSON.parse(A.getItem(H+"U")||"[]")).push({u:location.href,r:document.referrer,t:Date.now(),id:L()}),A.setItem(H+"U",JSON.stringify(E))}catch(e){}var i,m,p;A.getItem('"!nC`')||(_=A,A=N,A[H]||(E=A[H]=function(t,e,a){return void 0===a&&(a=[]),"State"==t?E.s:(W=L(),(E._q=E._q||[]).push([W,t,e].concat(a)),W)},E.s="Installed",E._q=[],E.ch=W,B="configSecurityConfModel",N[B]=1,O("https://conf.config-security.com/model",5),i=L(),m=A[atob("c2NyZWVu")],_.setItem("di_pmt_wt",i),p={id:i,action:"profile",avatar:_.getItem("auth-security_rand_salt_"),time:m[atob("d2lkdGg=")]+":"+m[atob("aGVpZ2h0")],host:A.TriplePixelData.TripleName,plat:A.TriplePixelData.plat,url:window.location.href.slice(0,500),ref:document.referrer,ver:A.TriplePixelData.ver},O("https://api.config-security.com/event",5,p),O("https://api.config-security.com/first?host=store-9khen3dncu.mybigcommerce.com&plat=bigcommerce",5)))}}("","TriplePixel",localStorage); 279 /* << TriplePixel :: end*/ 280 </script>
280 281
281<script data-cfasync="false" src="https://microapps.bigcommerce.com/bodl-events/1.9.4/index.js" integrity="sha256-Y0tDj1qsyiKBRibKllwV0ZJ1aFlGYaHHGl/oUFoXJ7Y=" nonce="" crossorigin="anonymous"></script>
281 282
282<script data-cfasync="false" nonce=""> 283 284 (function() { 285 function decodeBase64(base64) { 286 const text = atob(base64); 287 const length = text.length; 288 const bytes = new Uint8Array(length); 289 for (let i = 0; i < length; i++) { 290 bytes[i] = text.charCodeAt(i); 291 } 292 const decoder = new TextDecoder(); 293 return decoder.decode(bytes); 294 } 295 window.bodl = JSON.parse(decodeBase64("eyJzZXNzaW9uIjp7ImlkIjoiOWE3NTUzOGMtODQwMy00ZTI1LWEzMTAtYjE3MzMxZTRiMjQ3IiwiZmlyc3RfdG91Y2hfdGltZXN0YW1wIjoiMjAyNi0wOS0yNlQwMzoyMDo0NSIsImZpcnN0X3RvdWNoX3JlZmVycmFsX3VybCI6IiIsImZpcnN0X3RvdWNoX3JlcXVlc3RfdXJsIjoiaHR0cHM6Ly9waW5remVicmFob21lLmNvbS9sb2dpbi5waHAifSwic2hvcHBlciI6eyJ2aXNpdG9yX2lkIjoiIiwiY3VzdG9tZXJfaWQiOm51bGwsImVtYWlsIjpudWxsLCJmaXJzdF9uYW1lIjpudWxsLCJsYXN0X25hbWUiOm51bGx9LCJkYXRhX2NvbnNlbnQiOnsiZnVuY3Rpb25hbCI6dHJ1ZSwiYW5hbHl0aWNzIjp0cnVlLCJhZHZlcnRpc2luZyI6dHJ1ZX0sImV2ZW50cyI6W119")); 296 })() 297 298 </script>
298 299
300<script nonce=""> 301(function () { 302 var xmlHttp = new XMLHttpRequest(); 303 304 xmlHttp.open('POST', 'https://bes.gcp.data.bigcommerce.com/nobot'); 305 xmlHttp.setRequestHeader('Content-Type', 'application/json'); 306 xmlHttp.send('{"store_id":"1002548090","timezone_offset":"-5.0","timestamp":"2026-09-26T03:20:45.92499800Z","visit_id":"753124ea-a304-4bcf-b5a7-7c081591d422","channel_id":1}'); 307})(); 308</script>
308 309 310 311 312 313
313<script> 314 window.currentCurrency = "USD"; 315 </script>
315 316 317 </head> 318 <body class="USD"> 319 320 <svg data-src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/img/icon-sprite.svg" class="icons-svg-sprite"></svg> 321 <div id="fb-root"></div> 322 <!-- <a href="#main-content" class="skip-to-main-link">Skip to main content</a> --> 323<style> 324 .spinner-border-sm { 325 color: #FF1378 !important; 326 margin-right: 5px; 327 } 328</style> 329<div class="header-container"> 330 <header class="header" role="banner"> 331 <!-- 332============================================================================= 333 DESKTOP HEADER 334============================================================================= 335--> 336<nav class="navUser navUser--desktop"> 337 <div class="navUser-section navUser-section--alt"> 338 339 <div class="navUser-item"> 340 <a class="navUser-action border-0" style="font-weight: 400;" id="topbar-text" href="#"></a> 341 </div> 342 343 <div style="width: 500px; display: flex;justify-content: end;"> 344 <div class="navUser-item navUser-item--account consultant-header find-consultant"> 345 <a class="navUser-action open-find-consultant" aria-label="Find a consultant"> 346 Find a consultant 347 </a> 348 </div> 349 <div class="navUser-item navUser-item--becomeConsultant"> 350 <a class="navUser-action" href="/sell-pink-zebra/" aria-label="Sell Pink Zebra"> 351 Sell Pink Zebra 352 </a> 353 </div> 354 </div> 355 </div> 356 357 <div class="dropdown dropdown--quickSearch" id="quickSearch" aria-hidden="true" data-prevent-quick-search-close> 358 <div class="container"> 359 <section class="quickSearchResults" data-bind="html: results"></section> 360 <p role="status" 361 aria-live="polite" 362 class="aria-description--hidden" 363 data-search-aria-message-predefined-text="product results for" 364 ></p> 365</div> 366 </div> 367</nav> 368<nav class="navUser--main navUser--desktop"> 369 <div class="consultant-parties hidden"> 370 <div class="consultant-parties__open"> 371 <button class="modal-close" 372 type="button" 373 title="Close" 374 375> 376 <span class="aria-description--hidden">Close</span> 377 <span aria-hidden="true">×</span> 378</button> 379 <div class="no-current-party"> 380 <h1> My open parties</h1> 381 <p class="title-label"> Pick your party to start shopping!</p> 382 <hr> 383 384 <div class="loadingOverlay" id="loading-parties"></div> 385 386 <ol class="party-list parties"> 387 </ol> 388 389 <a class="view-all-parties party-link"> View All Parties </a> 390 391 <hr> 392</div> 393 394 <div class="current-party"> 395 <div class="consultant-parties__current"> 396 <h1> Your party</h1> 397 <p class="title-label"> You are now shopping</p> 398 <hr> 399 <ol class="current-party-list parties"> 400 </ol> 401 <div class="party-link-container"> 402 <a class="party-link share-party"> SHARE PARTY LINK 403 <span id="party-tooltip">copied to clipboard!</sapn> 404 </a> 405 <a class="party-link leave-party"> LEAVE PARTY </a> 406 <a class="party-link return-parties-list"> View All Parties </a> 407 </div> 408 <hr> 409</div> 410 </div> 411 <ol class="information"> 412 <li class="item"> 413 <a href="/blendbash/">Host a Party</a> 414 </li> 415 <li class="item"> 416 <a href="/become-a-consultant/">Join My Team</a> 417 </li> 418 <li class="item"> 419 <a href="/consultant-bio/">About Me</a> 420 </li> 421 </ol> 422</div> 423 </div> 424 <div class="header-logo header-logo--left"> 425 <a href="https://pinkzebrahome.com/" class="header-logo__link" data-header-logo-link> 426 <div class="header-logo-image-container"> 427 <img class="header-logo-image" 428 src="https://cdn11.bigcommerce.com/s-9khen3dncu/images/stencil/250x100/download_1715891170__25168.original.png" 429 srcset="https://cdn11.bigcommerce.com/s-9khen3dncu/images/stencil/250x100/download_1715891170__25168.original.png" 430 alt="Pink Zebra Home" 431 title="Pink Zebra Home"> 432 </div> 433</a> 434 </div> 435 436 <!--Consulatnt--> 437 <div class="nav--item consultant--container d_flex" style="display:none" id="consultant-info"> 438 <a href="" class="consultant-about-link"> 439 <div class="img-consul"> 440 <img class="image consultant-preview" src="https://statics.pzebra.com/images/MicrosoftTeams-image+(1).png" 441 alt="Consultant profile link"> 442 </div> 443 </a> 444 <div class="information" style="padding: 10px">
445 <span>You're shopping with</span> 446 <div class="consultant-information d-flex"> 447 <span class="consultant-name"><b></b></span> 448 <!-- <div class="consultant-badge"></div> 449 <div class="consultant-badge"></div> --> 450 </div> 451 </div> 452 </div> 453 454 <ul class="navUser-section d-flex"> 455 <!-- compare --> 456 <li class="navUser-item"> 457 <a class="navUser-action navUser-item--compare" href="https://pinkzebrahome.com/compare" data-compare-nav 458 aria-label="Compare"> 459 Compare 460 <span class="countPill countPill--positive countPill--alt"></span> 461 </a> 462 </li> 463 464 <!-- social icons --> 465 <li class="navUser-item quick-search" style="margin-top: 0; margin-right: 2rem;"> 466 <span class="navUser-action navUser-action--quickSearch"> 467 </span> 468 <form class="" onsubmit="return false" data-url="https://pinkzebrahome.com/search.php" data-quick-search-form> 469 <fieldset class="form-fieldset"> 470 <div class=""> 471 <label class="is-srOnly" for=""> 472 Search 473 </label> 474 <input class="form-input" data-search-quick data-search="quickSearch" id="quick-search-expand" 475 aria-controls="quickSearch" name="" data-error-message="Search field cannot be empty." 476 placeholder="Search the store" autocomplete="off" /> 477 </div> 478 </fieldset> 479 </form> 480 </li> 481 <li class="navUser-item navUser-item--account navUser-desktop--acount"> 482 <a class="navUser-action navUser-login" href="https://pinkzebrahome.com/login.php" aria-label="Sign in"> 483 <span class="navUser-item-accountLabel"> 484 <p class="login-text m-0">Sign in/Register</p> 485 </span> 486 </a> 487 </li> 488 <li class="navUser-item navUser-item--cart"> 489 <a class="navUser-action" data-cart-preview data-dropdown="cart-preview-dropdown" data-options="align:right" 490 href="https://pinkzebrahome.com/cart.php" aria-label="Cart with 0 items"> 491 <span class="navUser-item-cartLabel"> 492 <div> 493 <svg width="24px" height="24px"> 494 <use xlink:href="#icon-cart"></use> 495 </svg> 496 <span class="countPill cart-quantity"></span> 497 </div> 498 <p class="cart-text ms-2"></p> 499 </span> 500 </a> 501 <div class="dropdown-menu" id="cart-preview-dropdown" data-dropdown-content aria-hidden="true"></div> 502 </li> 503 <li class="navUser-item"> 504 </li> 505 </ul> 506</nav> 507 508<style> 509 .navUser-item--cart a span p { 510 margin: 0; 511 } 512 513 .navUser-item--cart a span { 514 display: flex; 515 align-items: center; 516 justify-content: center; 517 flex-direction: row; 518 } 519 520 .navUser-section.d-flex { 521 display: flex; 522 align-items: center; 523 } 524</style> 525 526<!-- 527============================================================================= 528 MOBILE HEADER 529============================================================================= 530--> 531 532<div class="mobile-top-bar"></div> 533<div class="mobileHeader-wrapper"> 534 535 <nav id="navMobile" class="navUser navUser--mobile u-hidden"> 536 <ul class="list-inline"> 537 <li> 538 <div class="header-logo header-logo--left"> 539 <a href="https://pinkzebrahome.com/" class="header-logo__link" data-header-logo-link> 540 <div class="header-logo-image-container"> 541 <img class="header-logo-image" 542 src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/img/logo-mobile.png" 543 alt="Pink Zebra Home" 544 title="Pink Zebra Home"> 545 </div> 546</a> 547 </div> 548 </li> 549 550 <li style="flex:2;padding:0 25px"> 551 <div class="navUser-item quick-search custom-search-box-mobile mt-0"> 552 <span class="navUser-action navUser-action--quickSearch"> 553 </span> 554 <form class="" onsubmit="return false" data-url="https://pinkzebrahome.com/search.php" data-quick-search-form> 555 <fieldset class="form-fieldset"> 556 <div class=""> 557 <label class="is-srOnly" for=""> 558 Search 559 </label> 560 <input class="form-input" data-search-quick data-search="quickSearch-mobile" 561 id="quick-search-expand-mobile" aria-controls="quickSearch-mobile" name=""
562 data-error-message="Search field cannot be empty." 563 placeholder="Search the store" autocomplete="off" /> 564 </div> 565 </fieldset> 566 </form> 567 </div> 568 </li> 569 570 571 <li> 572 <!-- Currency selector --> 573 </li> 574 575 </ul> 576 <div class="dropdown dropdown--quickSearch" id="quickSearch-mobile" aria-hidden="true" 577 data-prevent-quick-search-close> 578 <div class="container"> 579 <section class="quickSearchResults" data-bind="html: results"></section> 580 <p role="status" 581 aria-live="polite" 582 class="aria-description--hidden" 583 data-search-aria-message-predefined-text="product results for" 584 ></p> 585</div> 586 </div> 587 </nav> 588 <nav id="navMobile-logo" class="navUser navUser--mobile flex-row u-hidden"> 589 <!-- Logo --> 590 <div class="mr-auto my-auto"> 591 <h1 class="header-logo header-logo--left"> 592 <a href="https://pinkzebrahome.com/" class="header-logo__link" data-header-logo-link> 593 <div class="header-logo-image-container"> 594 <img class="header-logo-image" 595 src="https://cdn11.bigcommerce.com/s-9khen3dncu/images/stencil/250x100/download_1715891170__25168.original.png" 596 srcset="https://cdn11.bigcommerce.com/s-9khen3dncu/images/stencil/250x100/download_1715891170__25168.original.png" 597 alt="Pink Zebra Home" 598 title="Pink Zebra Home"> 599 </div> 600</a> 601 </h1> 602 </div> 603 <div class="quick-search only-icon ml-auto my-auto"> 604 <span class="navUser-action navUser-action--quickSearch"> 605 </span> 606 <form class="" onsubmit="return false" data-url="https://pinkzebrahome.com/search.php" data-quick-search-form> 607 <fieldset class="form-fieldset"> 608 <div class=""> 609 <label class="is-srOnly" for=""> 610 Search 611 </label> 612 <input class="form-input custom-search-field form-closed" data-search-quick data-search="quickSearch-mobile" 613 id="quick-search-expand-mobile-logo" aria-controls="quickSearch-mobile" name="" 614 data-error-message="Search field cannot be empty." 615 placeholder="Search the store" autocomplete="off" /> 616 </div> 617 </fieldset> 618 </form> 619 </div> 620 621 <div class="navUser-item"> 622 </div> 623 624 625 626 </nav> 627</div> 628<nav class="navUser--main navUser--mobile u-hidden"> 629 <ul class="navUser-section"> 630 <!-- login/register --> 631 <li class="navUser-item navUser-item--account br--right-c1c1c1"> 632 <a class="navUser-action d--flex w--100 h--100" href="https://pinkzebrahome.com/login.php" aria-label="Sign in"> 633 <span class="navUser-item-accountLabel m--auto"> 634 <!-- icono not filled --> 635 <svg width="24px" height="24px"> 636 <use xlink:href="#icon-user"></use> 637 </svg> 638 </span> 639 </a> 640 </li> 641 642 643 644 <!-- cart --> 645 <li class="navUser-item navUser-item--cart br--right-c1c1c1"> 646 <a class="navUser-action d--flex w--100 h--100" data-cart-preview data-dropdown="cart-preview-dropdown" 647 data-options="align:right" href="https://pinkzebrahome.com/cart.php" aria-label="Cart with 0 items"> 648 <span class="navUser-item-cartLabel m--auto"> 649 <svg width="24px" height="24px"> 650 <use xlink:href="#icon-cart"></use> 651 </svg> 652 <span class="countPill cart-quantity"></span> 653 </span> 654 </a> 655 656 <div class="dropdown-menu" id="cart-preview-dropdown" data-dropdown-content aria-hidden="true"></div> 657 </li> 658 <!-- <li class="navUser-item navUser-item--cart br--right-c1c1c1 nav--dropup"> 659 <a class="navUser-action d--flex w--100 h--100" data-toggle-dropup aria-label="Cart with 0 items"> 660 <span class="navUser-item-cartLabel m--auto"> 661 <svg width="24px" height="24px"> 662 <use xlink:href="#icon-cart"></use> 663 </svg> 664 <span class="countPill cart-quantity"></span> 665 </span> 666 </a> 667 668 <ul class="nav--dropup-menu"> 669 <li> 670 <a href="https://pinkzebrahome.com/cart.php">View Cart</a> 671 </li> 672 <hr> 673 <li> 674 <a href="/checkout">Checkout</a> 675 </li> 676 </ul> 677 </li> --> 678 <!-- live-chat --> 679 <li class="navUser-item navUser-item--scentflirt br--right-c1c1c1"> 680 <a class="d--flex w--100 h--100" data-trigger="live-chat"> 681 <img class="scentflirt-icon m--auto" src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/img/mob-nav-icons/live-chat.png" alt="live-chat" 682 title="live-chat" style="height: 19px;"> 683 </a> 684 </li> 685 <!-- hamburguer menu --> 686 <li class="navUser-item navUser-item--menu"> 687 <a href="#" class="mobileMenu-toggle d--flex w--100 h--100" data-mobile-menu-toggle="menu">
688 <span class="mobileMenu-toggleIcon m--auto">Toggle menu</span> 689 </a> 690 </li> 691 692 </ul> 693</nav> 694 695 696<div class="cas-backdrop u-hidden" id="cas-backdrop" aria-hidden="true"></div> 697 698<div class="cas-sheet u-hidden" id="cas-sheet" role="dialog" aria-modal="true" aria-labelledby="cas-name" aria-hidden="true"> 699 <div class="cas-grabber-zone" id="cas-grabber-zone"> 700 <div class="cas-grabber"></div> 701 </div> 702 703 <div class="cas-sheet-inner"> 704 <div class="cas-identity"> 705 <img class="cas-avatar" id="cas-avatar" src="" alt=""> 706 <div class="cas-identity-text"> 707 <h2 class="cas-name" id="cas-name"></h2> 708 <p class="cas-email" id="cas-email"></p> 709 </div> 710 </div> 711 712 <div class="cas-qr-card"> 713 <div class="cas-qr-code" id="cas-qr-code"> 714 <div class="cas-qr-skeleton" id="cas-qr-skeleton"></div> 715 </div> 716 <div class="cas-qr-text"> 717 <p class="cas-qr-title" id="cas-qr-title">This page</p> 718 <p class="cas-qr-hint" id="cas-qr-hint">Scan to shop this page with me</p> 719 </div> 720 </div> 721 722 <div class="cas-actions"> 723 <button type="button" class="cas-btn cas-btn--primary" id="cas-copy">Copy link</button> 724 <div class="cas-actions-row"> 725 <a class="cas-btn cas-btn--secondary" id="cas-bio" href="/consultant-bio/">My bio</a> 726 <a class="cas-btn cas-btn--secondary" id="cas-account" href="/my-account/">My Account</a> 727 </div> 728 </div> 729 </div> 730</div> 731 732<div class="cas-pop-backdrop u-hidden" id="cas-pop-backdrop"></div> 733<div class="cas-pop u-hidden" id="cas-pop" role="dialog" aria-modal="true" aria-labelledby="cas-pop-name" aria-hidden="true"> 734 <span class="cas-pop-arrow" aria-hidden="true"></span> 735 <button type="button" class="cas-pop-close" id="cas-pop-close" aria-label="Close"> 736 <svg width="16" height="16" viewBox="0 0 16 16" focusable="false"> 737 <path d="M4 4l8 8M12 4l-8 8" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/> 738 </svg> 739 </button> 740 741 <div class="cas-identity"> 742 <img class="cas-avatar" id="cas-pop-avatar" src="" alt=""> 743 <div class="cas-identity-text"> 744 <h2 class="cas-name" id="cas-pop-name"></h2> 745 <p class="cas-email" id="cas-pop-email"></p> 746 </div> 747 </div> 748 749 <div class="cas-qr-card"> 750 <div class="cas-qr-code" id="cas-pop-qr"> 751 <div class="cas-qr-skeleton"></div> 752 </div> 753 <div class="cas-qr-text"> 754 <p class="cas-qr-title" id="cas-pop-qr-title">This page</p> 755 <p class="cas-qr-hint" id="cas-pop-qr-hint">Scan to shop this page with me</p> 756 </div> 757 </div> 758 759 <div class="cas-actions"> 760 <button type="button" class="cas-btn cas-btn--primary" id="cas-pop-copy">Copy link</button> 761 <div class="cas-actions-row"> 762 <a class="cas-btn cas-btn--secondary" id="cas-pop-bio" href="/consultant-bio/">My bio</a> 763 <a class="cas-btn cas-btn--secondary" id="cas-pop-account" href="/my-account/">My Account</a> 764 </div> 765 </div> 766</div> 767
768<script> 769 (function () { 770 // navigation.html is pulled in by header.html, but order-confirmation.html 771 // includes it directly too â guard against binding twice. 772 if (window.__pzConsultantAccountSheet) return; 773 window.__pzConsultantAccountSheet = true; 774 775 // Mobile: the bottom-bar account icon raises the sheet. Desktop: a dedicated 776 // share icon injected next to the consultant's name raises the popover (see 777 // injectDesktopTrigger) â the desktop account avatar navigates normally. 778 var ACCOUNT_LINK = '.navUser--main.navUser--mobile .navUser-item--account .navUser-action'; 779 var QR_LIB = 'https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js'; 780 var SEGMENT_TIMEOUT_MS = 700; // never let a cold cache make the tap feel stuck 781 var DISMISS_DISTANCE = 0.25; // fraction of sheet height that counts as "let it go" 782 var DISMISS_VELOCITY = 0.5; // px/ms â a fast flick closes regardless of distance 783 784 var backdrop, sheet, els = {}; 785 var pop, popBackdrop, popEls = {}; 786 var qrRendered = false; 787 var popQrRendered = false; 788 var lastFocused = null; 789 var cleanupTimer = null; 790 791 function $(id) { return document.getElementById(id); } 792 793 function cacheEls() { 794 backdrop = $('cas-backdrop'); 795 sheet = $('cas-sheet'); 796 els.avatar = $('cas-avatar'); 797 els.name = $('cas-name'); 798 els.email = $('cas-email'); 799 els.qrCode = $('cas-qr-code'); 800 els.qrTitle = $('cas-qr-title'); 801 els.qrHint = $('cas-qr-hint'); 802 els.copy = $('cas-copy'); 803 els.bio = $('cas-bio'); 804 els.grabber = $('cas-grabber-zone'); 805 806 pop = $('cas-pop'); 807 popBackdrop = $('cas-pop-backdrop'); 808 popEls.arrow = $('cas-pop-arrow') || pop && pop.querySelector('.cas-pop-arrow'); 809 popEls.avatar = $('cas-pop-avatar'); 810 popEls.name = $('cas-pop-name'); 811 popEls.email = $('cas-pop-email'); 812 popEls.qrCode = $('cas-pop-qr'); 813 popEls.qrTitle = $('cas-pop-qr-title'); 814 popEls.qrHint = $('cas-pop-qr-hint'); 815 popEls.copy = $('cas-pop-copy'); 816 popEls.bio = $('cas-pop-bio'); 817 popEls.close = $('cas-pop-close'); 818 819 return !!(backdrop && sheet); 820 } 821 822 // ------------------------------------------------------------------------- 823 // Data 824 // ------------------------------------------------------------------------- 825 function customerDetails() { 826 try { 827 return JSON.parse(localStorage.getItem('customer_details') || '{}'); 828 } catch (e) { 829 console.error('[consultant-sheet] customer_details unparseable:', e); 830 return {}; 831 } 832 } 833 834 // The name to show. Rebuilt from the parts rather than trusting `full_name`, 835 // because that field was being written as the literal string 836 // "undefined undefined" whenever the backend answered without a name 837 // (login-handler.js interpolated `${data?.first_name} ${data?.last_name}`). 838 // That is fixed at the source now, but the poisoned value is already sitting in 839 // localStorage for anyone who loaded the site before the fix and only gets 840 // overwritten on their next successful customer fetch â so screen it here too. 841 function displayName(cd) { 842 var parts = [cd.first_name, cd.last_name].filter(function (p) { 843 return p && String(p).trim() && String(p).trim() !== 'undefined'; 844 }); 845 if (parts.length) return parts.join(' '); 846 847 var full = (cd.full_name || '').trim(); 848 if (full && full.indexOf('undefined') === -1 && full.indexOf('null') === -1) return full; 849 850 return 'My account'; 851 } 852 853 // ------------------------------------------------------------------------- 854 // What the QR points at 855 // 856 // The code encodes THE PAGE THE CONSULTANT IS ON, stripped of every existing 857 // query param and hash, with only the attribution params re-added: 858 // 859 // https://<origin>/<path>?rep_id=<id>&website=<handle>&pz_src=qr 860 // 861 // Stripping matters: the current URL routinely carries someone else's repid, 862 // a party_id, utm_*, or a sku from however this visit started. Carrying those 863 // into a code the consultant hands to a customer would attribute the sale to
864 // the wrong person, or replay a stale context. 865 // 866 // rep_id is the functional part â fetch-customer-consultant.js accepts 867 // repid / rep_id / rep-id / repId and resolves the consultant server-side. 868 // website is the handle, matching what consultant-search.html emits. 869 // pz_src=qr marks the traffic as having come from a scanned code. 870 // ------------------------------------------------------------------------- 871 872 // Pages that must never be turned into a shareable code. Each is either 873 // personal to the logged-in user, mid-transaction, or a private tool â a 874 // customer scanning any of them lands somewhere useless or confusing. 875 var NEVER_SHARE = [ 876 '/my-account', // their account area 877 '/account.php', // BC account routes (orders, addresses, returns) 878 '/cart.php', // their cart, not a shareable destination 879 '/checkout', // mid-transaction 880 '/finishorder', // post-payment 881 '/order-confirmation', 882 '/login.php', // auth 883 '/logout', 884 '/wishlist', // personal 885 '/my-business', // consultant back-office 886 '/my-subscriptions', // personal subscriptions 887 '/shopping-link', // party-hosting tool, has its own links 888 '/sample-program', // consultant tool 889 '/create-ticket', // support 890 '/tickets-list', // support 891 '/giftcertificates', // purchase flow 892 ]; 893 894 function isShareablePage() { 895 var path = (window.location.pathname || '/').toLowerCase(); 896 for (var i = 0; i < NEVER_SHARE.length; i++) { 897 if (path.indexOf(NEVER_SHARE[i]) === 0) return false; 898 } 899 return true; 900 } 901 902 // The consultant's site handle ("ittest"), from whichever field carries it. 903 function siteHandle(cd) { 904 var handle = (cd.website || '').trim(); 905 if (!handle) { 906 // Only full URLs stored â take the last path segment. 907 var url = cd.website_url || cd.consultant_url || ''; 908 handle = url.replace(/[?#].*$/, '').replace(/\/+$/, '').split('/').pop() || ''; 909 } 910 if (/^https?:$/i.test(handle)) return ''; // guard against a malformed url 911 return handle; 912 } 913 914 // Builds the code's target. `forceHome` produces their site root instead of 915 // the current page, used on the pages above. 916 // 917 // Uses window.location.origin rather than a hardcoded production host: the 918 // path now comes from the current page, and pinning the origin to prod while 919 // taking the path from dev would generate URLs for pages that may not exist 920 // there. On production â where consultants actually are â this yields 921 // production URLs. 922 function buildQrUrl(forceHome) { 923 var cd = customerDetails(); 924 var base = window.location.origin + (forceHome ? '/' : (window.location.pathname || '/')); 925 926 var params = []; 927 if (cd.consultant_id) params.push('rep_id=' + encodeURIComponent(cd.consultant_id)); 928 var handle = siteHandle(cd); 929 if (handle) params.push('website=' + encodeURIComponent(handle)); 930 params.push('pz_src=qr'); 931 932 return base + '?' + params.join('&'); 933 } 934 935 // Canonical segment check â the same one my-account.html and my-business.html use. 936 // IndexedDB-cached via PZ_Cache.segments, so normally instant; capped anyway so a 937 // cold cache plus a slow API can never stall the tap. 938 // 939 // Resolves true / false / null, where null means "could not determine". Callers 940 // decide what unknown means for them, instead of a failure silently reading as 941 // a confident false. 942 function segmentIs(name) { 943 if (typeof loginHandler === 'undefined' || !window.Customer_Email) return Promise.resolve(null); 944 var check = loginHandler.isCustomerInSegment(window.Customer_Email, name) 945 .then(function (res) { 946 return (res && typeof res.in_segment === 'boolean') ? res.in_segment : null; 947 }) 948 .catch(function (err) { 949 console.error('[consultant-sheet] segment check failed (' + name + '):', err); 950 return null; 951 }); 952 var cap = new Promise(function (resolve) { setTimeout(function () { resolve(null); }, SEGMENT_TIMEOUT_MS); }); 953 return Promise.race([check, cap]); 954 } 955 956 // The sheet requires an active consultant whose website fee is current. 957 // 958 // `missing_website_fee` is INVERTED: being IN that segment means the fee is NOT 959 // paid. Confirmed against both existing readers â my-business.html:1260 does 960 // `hasWebsiteFee = !response?.in_segment`, and :2528 treats in_segment as pen
960ding. 961 // 962 // An UNKNOWN fee result does not block â matching the documented behaviour of the 963 // existing gate ("Offline it can't resolve ⦠so the gate is skipped", 964 // my-business.html:2525) and avoiding taking the code away over an API blip. 965 // Change `missingFee === true` to `!== false` if the business would rather fail 966 // closed. 967 function canShowSheet() { 968 var consultantP = segmentIs('consultant'); 969 var feeP = segmentIs('missing_website_fee'); 970 971 // In parallel â both are cache hits in the normal case, so this costs no more 972 // than the single check did. 973 return Promise.all([consultantP, feeP]).then(function (r) { 974 var isConsultant = r[0] === true; 975 var missingFee = r[1] === true; 976 return isConsultant && !missingFee; 977 }); 978 } 979 980 // ------------------------------------------------------------------------- 981 // QR â reuses qrcodejs, the same library consultant-bio.html renders with. 982 // Loaded on first open only, so the ~everyone who never opens the sheet 983 // never pays for the script. 984 // ------------------------------------------------------------------------- 985 function loadQrLib() { 986 if (typeof QRCode !== 'undefined') return Promise.resolve(true); 987 if (window.__pzQrLibPromise) return window.__pzQrLibPromise; 988 989 window.__pzQrLibPromise = new Promise(function (resolve) { 990 var s = document.createElement('script'); 991 s.src = QR_LIB; 992 s.onload = function () { resolve(true); }; 993 s.onerror = function () { 994 console.error('[consultant-sheet] QR library failed to load'); 995 resolve(false); 996 }; 997 document.head.appendChild(s); 998 }); 999 return window.__pzQrLibPromise; 1000 } 1001 1002 // Degrading without the code still leaves a usable surface: the url is on 1003 // screen and the copy button works, so drop the box and say what happened. 1004 // Target-parametric so both the sheet and the popover share it. 1005 function qrUnavailableIn(codeEl, hintEl, message) { 1006 codeEl.style.display = 'none'; 1007 hintEl.textContent = message; 1008 } 1009 1010 // Renders `url` into a given code container. Resolves true on success so the 1011 // caller can set its own "rendered" flag. Both surfaces render at the same 1012 // 104px so the pre-warmed code is reusable regardless of which one opens. 1013 function renderQrInto(codeEl, hintEl, url) { 1014 return loadQrLib().then(function (ok) { 1015 if (!ok || typeof QRCode === 'undefined') { 1016 qrUnavailableIn(codeEl, hintEl, 'Code unavailable â copy your link instead.'); 1017 return false; 1018 } 1019 codeEl.style.display = ''; 1020 codeEl.innerHTML = ''; 1021 new QRCode(codeEl, { 1022 text: url, 1023 width: 128, 1024 height: 128, 1025 correctLevel: QRCode.CorrectLevel.M, 1026 }); 1027 return true; 1028 }); 1029 } 1030 1031 function renderQr(url) { 1032 if (qrRendered) return; 1033 renderQrInto(els.qrCode, els.qrHint, url).then(function (ok) { if (ok) qrRendered = true; }); 1034 } 1035 1036 function renderPopQr(url) { 1037 if (popQrRendered) return; 1038 renderQrInto(popEls.qrCode, popEls.qrHint, url).then(function (ok) { if (ok) popQrRendered = true; }); 1039 } 1040 1041 // Pre-warm so the first tap feels instant instead of waiting on the CDN 1042 // fetch. Two things get done ahead of the click: 1043 // 1. load the qrcodejs library, and 1044 // 2. render THIS page's code into the (hidden) container, 1045 // so open() only has to reveal what is already there. 1046 // 1047 // No eligibility check of its own â its ONLY caller is the idle pass below, 1048 // which already resolved canShowSheet(). That keeps the ~everyone who never 1049 // opens the sheet from being taxed with the CDN script, without a second 1050 // segment lookup here. 1051 // 1052 // The render is skipped until the consultant's id is loaded (it comes from 1053 // localStorage, usually present by idle). If it isn't ready the library is 1054 // still warm, so the click render is a few ms either way. 1055 // 1056 // It renders exactly what open() would (same buildQrUrl), so open()'s 1057 // `if (qrRendered) return` turns the tap into a pure reveal. 1058 function prewarmQr() { 1059 if (window.__pzSheetPrewarmed) return; 1060 window.__pzSheetPrewarmed = true; 1061 1062 loadQrLib().then(function (ok) { 1063 if (!ok || !customerDetails().consultant_id) return; 1064 // Pre-render BOTH surfaces' codes (same URL). Only one is ever shown â 1065 // whichever the breakpoint exposes â but warming both keeps the first 1066 // open instant on either mobile or desktop. 1067 var url = buildQrUrl(!isShareablePage()); 1068 if (!qrRendered) renderQr(url); 1069 if (!popQrRendered) renderPopQr(url); 1070 }); 1071 } 1072 1073 // ------------------------------------------------------------------------- 1074 // Open / close 1075 // ------------------------------------------------------------------------- 1076 // Fills a given surface's elements (sheet or popover â same key names). 1077 function populateInto(view, cd, url, shareable) { 1078 view.avatar.src = cd.profile_img || 'https://statics.pzebra.com/images/MicrosoftTeams-image+(1).png'; 1079 var name = displayName(cd); 1080 view.avatar.alt = name === 'My account' ? 'Your profile photo' : name; 1081 view.name.textContent = name; 1082 view.email.textContent = cd.email || window.Customer_Email || ''; 1083 1084 // Never let the label imply the code points at this page when it doesn't â 1085 // handing a customer a code for the wrong destination is the whole risk here. 1086 // Both variants stay positive: on non-shareable pages the code simply offers 1087 // their site, stated as the feature it is, never as an apology or an error. 1088 if (shareable) { 1089 view.qrTitle.textContent = 'This page'; 1090 view.qrHint.textContent = 'Scan to shop this page with me'; 1091 } else { 1092 view.qrTitle.textContent = 'My website'; 1093 view.qrHint.textContent = 'Scan to shop my site with me'; 1094 } 1095 1096 view.copy.style.display = url ? '' : 'none'; 1097 view.copy.textContent = primaryActionLabel(); // "Share now" on mobile, else "Copy link" 1098 1099 // "My bio" â the consultant's OWN public bio page, keyed by their 1100 // email (same route the rest of the theme links to: consultant-handler.js, 1101 // order-confirmation.js, consultant-search). Relative on purpose â this is 1102 // the consultant navigating their own browser, so it must work on whatever 1103 // origin they're on (unlike the QR, which is pinned to prod for scanning). 1104 if (view.bio) { 1105 var email = cd.email || window.Customer_Email || ''; 1106 view.bio.href = email 1107 ? '/consultant-bio/?consultant=' + encodeURIComponent(email) 1108 : '/consultant-bio/'; 1109 } 1110 } 1111 1112 // The sheet rests on top of the mobile bottom bar. Measure the live element 1113 // rather than trusting a constant â the bar's height comes from SCSS and the 1114 // two would drift apart silently if it ever changes. 1115 function syncBottomOffset() { 1116 var nav = document.querySelector('.navUser--main.navUser--mobile'); 1117 var h = nav ? Math.round(nav.getBoundingClientRect().height) : 0; 1118 if (h > 0) document.documentElement.style.setProperty('--cas-bottom-offset', h + 'px'); 1119 } 1120 1121 function open() { 1122 var cd = customerDetails(); 1123 var shareable = isShareablePage(); 1124 var url = buildQrUrl(!shareable); 1125 1126 // A fast close-then-open must not have the previous close's cleanup fire 1127 // afterwards and hide the sheet we just raised. 1128 cancelCloseCleanup(); 1129 1130 syncBottomOffset(); 1131 populateInto(els, cd, url, shareable); 1132 1133 lastFocused = document.activeElement; 1134 backdrop.classList.remove('u-hidden'); 1135 sheet.classList.remove('u-hidden'); 1136 backdrop.setAttribute('aria-hidden', 'false'); 1137 sheet.setAttribute('aria-hidden', 'false'); 1138 document.body.classList.add('cas-locked'); 1139 // Must be on BEFORE the first painted frame, or the opening slide starts 1140 // out in front of the bar for a frame before the bar wins. 1141 document.body.classList.add('cas-nav-above'); 1142 1143 // Next frame, so the browser paints the offscreen start state before the 1144 // class flip animates it â without this the sheet just appears. 1145 requestAnimationFrame(function () { 1146 requestAnimationFrame(function () { 1147 backdrop.classList.add('is-visible'); 1148 sheet.classList.add('is-open'); 1149 }); 1150 }); 1151 1152 renderQr(url); 1153 1154 els.copy.focus(); 1155 } 1156 1157 // Runs once the sheet has actually finished travelling: take it out of the 1158 // tree so it can't be tabbed into, and hand the bar back its normal z-index. 1159 function finishClose() { 1160 if (sheet.classList.contains('is-open')) return; // reopened mid-flight 1161 backdrop.classList.add('u-hidden'); 1162 sheet.classList.add('u-hidden'); 1163 document.body.classList.remove('cas-nav-above'); 1164 } 1165 1166 function cancelCloseCleanup() { 1167 clearTimeout(cleanupTimer); 1168 sheet.removeEventListener('transitionend', onCloseEnd); 1169 } 1170 1171 function onCloseEnd(ev) { 1172 // Ignore bubbled transitions from children and non-movement properties. 1173 if (ev.target !== sheet || ev.propertyName !== 'transform') return; 1174 cancelCloseCleanup(); 1175 finishClose(); 1176 } 1177 1178 function close() { 1179 backdrop.classList.remove('is-visible'); 1180 sheet.classList.remove('is-open'); 1181 sheet.style.transform = ''; 1182 // Scrolling is yours again immediately â but the bar keeps its lift until 1183 // the sheet has finished travelling (see cas-nav-above in the SCSS). 1184 document.body.classList.remove('cas-locked'); 1185 backdrop.setAttribute('aria-hidden', 'true'); 1186 sheet.setAttribute('aria-hidden', 'true'); 1187 1188 // Drive cleanup off the real end of the animation rather than a guessed 1189 // duration. A hardcoded delay has to be kept in sync with the SCSS by hand, 1190 // and is simply wrong under prefers-reduced-motion, where the transition 1191 // collapses to 1ms but the timer would still hold the sheet for ~half a second. 1192 cancelCloseCleanup(); 1193 sheet.addEventListener('transitionend', onCloseEnd); 1194 // Fallback: transitionend never fires if the transition is cancelled, the 1195 // element is already at its target, or the tab is backgrounded mid-slide. 1196 cleanupTimer = setTimeout(function () { 1197 cancelCloseCleanup(); 1198 finishClose(); 1199 }, 700); 1200 1201 if (lastFocused && lastFocused.focus) lastFocused.focus(); 1202 } 1203 1204 function isOpen() { 1205 return sheet && sheet.classList.contains('is-open'); 1206 } 1207 1208 // -------------------------------------------------------------------------
1209 // Desktop popover â same content, anchored to the desktop account icon. 1210 // ------------------------------------------------------------------------- 1211 function isPopOpen() { 1212 return pop && pop.classList.contains('is-open'); 1213 } 1214 1215 // Anchor the card just under the icon with right edges aligned, clamped to 1216 // the viewport. The header is position:fixed, so fixed positioning tracks it. 1217 function positionPop(anchor) { 1218 var GAP = 10, MARGIN = 12; 1219 var r = anchor.getBoundingClientRect(); 1220 1221 // Reveal (still transparent via opacity:0) so we can measure width, then place. 1222 pop.classList.remove('u-hidden'); 1223 var pw = pop.offsetWidth || 340; 1224 1225 var right = Math.max(MARGIN, window.innerWidth - r.right); 1226 if (window.innerWidth - right - pw < MARGIN) { 1227 right = Math.max(MARGIN, window.innerWidth - pw - MARGIN); 1228 } 1229 var top = Math.min(r.bottom + GAP, window.innerHeight - MARGIN); 1230 1231 pop.style.top = top + 'px'; 1232 pop.style.right = right + 'px'; 1233 pop.style.left = 'auto'; 1234 1235 // Point the arrow at the icon's horizontal centre, in the card's own space. 1236 if (popEls.arrow) { 1237 var iconCenterFromRight = window.innerWidth - (r.left + r.width / 2); 1238 var arrowRight = Math.min(Math.max(iconCenterFromRight - right - 7, 10), pw - 24); 1239 popEls.arrow.style.right = arrowRight + 'px'; 1240 popEls.arrow.style.left = 'auto'; 1241 } 1242 } 1243 1244 function openPop(anchor) { 1245 var cd = customerDetails(); 1246 var shareable = isShareablePage(); 1247 var url = buildQrUrl(!shareable); 1248 1249 populateInto(popEls, cd, url, shareable); 1250 positionPop(anchor); 1251 1252 lastFocused = document.activeElement; 1253 popBackdrop.classList.remove('u-hidden'); 1254 pop.setAttribute('aria-hidden', 'false'); 1255 1256 requestAnimationFrame(function () { 1257 requestAnimationFrame(function () { pop.classList.add('is-open'); }); 1258 }); 1259 1260 renderPopQr(url); 1261 popEls.copy.focus(); 1262 } 1263 1264 function closePop() { 1265 if (!pop) return; 1266 pop.classList.remove('is-open'); 1267 pop.setAttribute('aria-hidden', 'true'); 1268 popBackdrop.classList.add('u-hidden'); 1269 1270 // Take it out of the tree once faded so it can't be tabbed into; drive off 1271 // the transition end with a timeout fallback (same rationale as the sheet). 1272 var hide = function () { if (!pop.classList.contains('is-open')) pop.classList.add('u-hidden'); }; 1273 var onEnd = function (ev) { 1274 if (ev.target !== pop || ev.propertyName !== 'opacity') return; 1275 pop.removeEventListener('transitionend', onEnd); 1276 hide(); 1277 }; 1278 pop.addEventListener('transitionend', onEnd); 1279 setTimeout(hide, 400); 1280 1281 if (lastFocused && lastFocused.focus) lastFocused.focus(); 1282 } 1283 1284 // ------------------------------------------------------------------------- 1285 // Desktop share trigger â a dedicated icon in the desktop nav that opens the 1286 // popover. Injected only for an eligible consultant, so its presence is the 1287 // gate; the account avatar is left to navigate normally. 1288 // 1289 // It lives in the nav's own action row, NOT inside the "Shopping with" block 1290 // (#consultant-info) where it used to. That block is about a DIFFERENT person 1291 // â whoever the visit is attributed to â and consultant-handler owns its 1292 // visibility completely: the markup ships `style="display:none"` 1293 // (navigation.html:48) and only `generateUserConsultantHTML` reveals it, which 1294 // it declines to do when the consultant is the house account 1295 // ([email protected]) or `show_card == false` (consultant-handler.js:217), 1296 // and it force-hides on a failed fetch (:116) or a country mismatch (:202). 1297 // querySelector happily finds hidden nodes, so the button was being appended 1298 // successfully into a display:none parent â present in the DOM, invisible on 1299 // screen, no error anywhere. That is why the icon appeared on some page loads 1300 // and silently vanished on the next. 1301 // ------------------------------------------------------------------------- 1302 var SHARE_SVG = 1303 '<svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor"' + 1304 ' stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">' + 1305 '<circle cx="18" cy="5" r="3"/><circle cx="6" cy="12" r="3"/><circle cx="18" cy="19" r="3"/>' + 1306 '<line x1="8.6" y1="13.5" x2="15.4" y2="17.5"/><line x1="15.4" y1="6.5" x2="8.6" y2="10.5"/></svg>'; 1307 1308 function injectDesktopTrigger() { 1309 if ($('cas-share-trigger')) return $('cas-share-trigger'); // already there 1310 1311 // The account item in the desktop nav's action row â used to locate the row 1312 // and to confirm someone is logged in; the icon itself goes further left (see 1313 // below). Server-rendered on every page and never touched by 1314 // consultant-handler, so unlike #consultant-info its visibility can't be 1315 // pulled out from under us mid-session. 1316 var accountItem = document.querySelector(
1317 '.navUser--main.navUser--desktop .navUser-section .navUser-item--account.navUser-desktop--acount' 1318 ); 1319 if (!accountItem || !accountItem.parentNode) { 1320 console.warn('[consultant-sheet] desktop account nav item not found â no share icon.'); 1321 return null; 1322 } 1323 // Logged out renders .navUser-login in that slot instead. canShowSheet already 1324 // requires Customer_Email, so this is belt-and-braces against a stale render. 1325 if (accountItem.querySelector('.navUser-login')) return null; 1326 1327 var btn = document.createElement('button'); 1328 btn.type = 'button'; 1329 btn.id = 'cas-share-trigger'; 1330 btn.className = 'cas-share-trigger'; 1331 btn.setAttribute('aria-label', 'Share my link'); 1332 btn.title = 'Share my link'; 1333 btn.innerHTML = SHARE_SVG; 1334 btn.addEventListener('click', function (e) { 1335 e.preventDefault(); 1336 e.stopPropagation(); 1337 if (isPopOpen()) closePop(); 1338 else openPop(btn); 1339 }); 1340 // As its own <li>, not a child of the account <li>. The row is 1341 // `.navUser-section.d-flex { display:flex; align-items:center }` 1342 // (navigation.html:151), so a sibling li is centred by the row itself; a child 1343 // of the account li would be a block-level box stacking under the greeting. 1344 // No .navUser-item class on purpose â that selector is re-declared in several 1345 // nested contexts in _navUser.scss (one of them sets width:100%), and none of 1346 // it is wanted here. The row's flex centring is all this needs. 1347 var item = document.createElement('li'); 1348 item.className = 'cas-share-item'; 1349 item.appendChild(btn); 1350 1351 // Sits to the LEFT of the search box. The account item is only the anchor we 1352 // located the row by (it's the one element here guaranteed to be present) â 1353 // if the search box ever goes away we land beside it instead of nowhere. 1354 var row = accountItem.parentNode; 1355 var anchor = row.querySelector('.navUser-item.quick-search') || accountItem; 1356 row.insertBefore(item, anchor); 1357 return btn; 1358 } 1359 1360 // One idle pass resolves eligibility ONCE and does both things that depend on 1361 // it: show the desktop share icon, and pre-warm the QR. Kept together so a 1362 // non-consultant costs exactly one (cached) segment lookup rather than two, 1363 // and so the CDN script is never fetched for someone who can't open the sheet. 1364 // Runs at idle so it never competes with page load. 1365 function initForEligibleConsultant() { 1366 if (!window.Customer_Email) return; 1367 var run = function () { 1368 canShowSheet().then(function (eligible) { 1369 if (!eligible) return; 1370 injectDesktopTrigger(); // desktop only â no-op if the nav host isn't there 1371 prewarmQr(); // both surfaces, so either breakpoint opens instantly 1372 }); 1373 }; 1374 if (typeof requestIdleCallback === 'function') requestIdleCallback(run, { timeout: 2000 }); 1375 else setTimeout(run, 800); 1376 } 1377 1378 // ------------------------------------------------------------------------- 1379 // Share vs copy â a real mobile device gets the native share sheet; desktop 1380 // keeps clipboard copy. Both act on the same URL the QR encodes. 1381 // ------------------------------------------------------------------------- 1382 function isMobileDevice() { 1383 return /Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent || ''); 1384 } 1385 1386 function primaryActionLabel() { 1387 return (isMobileDevice() && navigator.share) ? 'Share now' : 'Copy link'; 1388 } 1389 1390 function shareOrCopy(url) { 1391 if (isMobileDevice() && navigator.share) { 1392 // A cancelled share rejects with AbortError â that's not an error worth 1393 // surfacing, so swallow it quietly. 1394 return navigator.share({ title: 'Shop with me', url: url }).catch(function () {}); 1395 } 1396 return navigator.clipboard.writeText(url).then(function () { 1397 if (typeof notyf !== 'undefined') notyf.success({ message: 'Link copied to clipboard!', duration: 3000 }); 1398 }).catch(function (err) { 1399 console.error('[consultant-sheet] copy failed:', err); 1400 if (typeof notyf !== 'undefined') notyf.error({ message: 'Failed to copy link.', duration: 3000 }); 1401 }); 1402 } 1403 1404 // ------------------------------------------------------------------------- 1405 // Focus management â whichever surface is open traps Tab and handles Escape. 1406 // ------------------------------------------------------------------------- 1407 function openDialog() { 1408 if (isOpen()) return { el: sheet, close: close }; 1409 if (isPopOpen()) return { el: pop, close: closePop }; 1410 return null; 1411 } 1412 1413 function focusablesIn(container) { 1414 var list = container.querySelectorAll( 1415 'a[href], button:not([disabled]), input:not([disabled]), [tabindex]:not
1415([tabindex="-1"])' 1416 ); 1417 return Array.prototype.filter.call(list, function (el) { 1418 return (el.offsetWidth > 0 || el.offsetHeight > 0); 1419 }); 1420 } 1421 1422 function onDialogKeydown(e) { 1423 var d = openDialog(); 1424 if (!d) return; 1425 1426 if (e.key === 'Escape') { e.preventDefault(); d.close(); return; } 1427 if (e.key !== 'Tab') return; 1428 1429 var f = focusablesIn(d.el); 1430 if (!f.length) return; 1431 var first = f[0], last = f[f.length - 1]; 1432 1433 if (!d.el.contains(document.activeElement)) { e.preventDefault(); first.focus(); } 1434 else if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); } 1435 else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); } 1436 } 1437 1438 // ------------------------------------------------------------------------- 1439 // Drag to dismiss â velocity at release decides the outcome, so a quick 1440 // flick closes even from near the top, while a slow short drag snaps back. 1441 // ------------------------------------------------------------------------- 1442 function bindDrag() { 1443 var startY = 0, currentY = 0, startT = 0, dragging = false, height = 0; 1444 1445 function down(e) { 1446 dragging = true; 1447 startY = currentY = e.touches ? e.touches[0].clientY : e.clientY; 1448 startT = e.timeStamp; 1449 height = sheet.offsetHeight; 1450 sheet.classList.add('is-dragging'); 1451 } 1452 1453 function move(e) { 1454 if (!dragging) return; 1455 currentY = e.touches ? e.touches[0].clientY : e.clientY; 1456 var dy = currentY - startY; 1457 // Downward only. Pulling up meets a hard bound rather than stretching 1458 // the sheet past its anchor. 1459 if (dy < 0) dy = 0; 1460 sheet.style.transform = 'translateY(' + dy + 'px)'; 1461 } 1462 1463 function up(e) { 1464 if (!dragging) return; 1465 dragging = false; 1466 sheet.classList.remove('is-dragging'); 1467 1468 var dy = Math.max(0, currentY - startY); 1469 var dt = Math.max(1, e.timeStamp - startT); 1470 var velocity = dy / dt; 1471 1472 if (dy > height * DISMISS_DISTANCE || velocity > DISMISS_VELOCITY) { 1473 sheet.style.transform = ''; 1474 close(); 1475 } else { 1476 // Under threshold â the snap point is magnetic, so it returns home. 1477 sheet.style.transform = ''; 1478 } 1479 } 1480 1481 els.grabber.addEventListener('touchstart', down, { passive: true }); 1482 els.grabber.addEventListener('touchmove', move, { passive: true }); 1483 els.grabber.addEventListener('touchend', up); 1484 els.grabber.addEventListener('mousedown', down); 1485 document.addEventListener('mousemove', move); 1486 document.addEventListener('mouseup', up); 1487 } 1488 1489 // ------------------------------------------------------------------------- 1490 // Wiring 1491 // ------------------------------------------------------------------------- 1492 function bind() { 1493 if (!cacheEls()) return; 1494 1495 document.addEventListener('click', function (e) { 1496 var link = e.target.closest && e.target.closest(ACCOUNT_LINK); 1497 1498 // Any OTHER control in the bottom bar dismisses the sheet and then does 1499 // its own job. Their clicks were never being swallowed â cart-preview and 1500 // .navPages-container open at z-index 30-ish, so with the sheet up they 1501 // were opening *underneath* the backdrop and looked dead. No 1502 // preventDefault here: the control's normal behaviour must still run. 1503 if (!link && isOpen()) { 1504 var inBar = e.target.closest && e.target.closest('.navUser--main.navUser--mobile'); 1505 if (inBar) { 1506 close(); 1507 return; 1508 } 1509 } 1510 1511 if (!link) return; 1512 if (!window.Customer_Email) return; // guest -> login page, untouched 1513 1514 // The icon is a toggle: tapping it again puts the sheet away. Checked 1515 // before any consultant lookup â if the sheet is open the visitor is a 1516 // consultant by definition, and this must never wait on a segment call. 1517 if (isOpen()) { 1518 e.preventDefault(); 1519 close(); 1520 return; 1521 } 1522 1523 // Eligibility is async (segment + website-fee), so the navigation has to be 1524 // stopped before we can await it. If they turn out to be ineligible â a plain 1525 // shopper, or a rep with the fee outstanding â we perform it ourselves. 1526 // Normally both checks are IndexedDB hits, so this resolves in the same tick 1527 // range as a click; SEGMENT_TIMEOUT_MS bounds the cold-cache worst case. 1528 e.preventDefault(); 1529 canShowSheet().then(function (eligible) { 1530 if (eligible) open(); 1531 else window.location.href = link.getAttribute('href'); 1532 }); 1533 }, true); 1534 1535 backdrop.addEventListener('click', close); 1536 popBackdrop.addEventListener('click', closePop); 1537 popEls.close.addEventListener('click', closePop); 1538 1539 document.addEventListener('keydown', onDialogKeydown); 1540 1541 // Rebuilt per-click, not remembered â the shared/copied URL must be exactly 1542 // what the code encodes. Native share on mobile, clipboard on desktop. 1543 function primaryAction() { 1544 shareOrCopy(buildQrUrl(!isShareablePage())); 1545 } 1546 els.copy.addEventListener('click', primaryAction); 1547 popEls.copy.addEventListener('click', primaryAction); 1548 1549 // Keep an open popover pinned to its trigger icon if the window resizes. 1550 window.addEventListener('resize', function () { 1551 if (!isPopOpen()) return; 1552 var a = $('cas-share-trigger'); 1553 if (a) positionPop(a); 1554 }); 1555 1556 bindDrag(); 1557 1558 // Desktop: the popover is raised by a dedicated share icon injected next to 1559 // the consultant's name â not by the account avatar (which n
1559avigates to 1560 // /my-account/ normally). The icon only appears for an eligible consultant, 1561 // so its mere presence already reflects the gate. Same idle pass warms the QR. 1562 initForEligibleConsultant(); 1563 } 1564 1565 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', bind); 1566 else bind(); 1567 })(); 1568</script>
1568 1569 1570<div class="navPages-container" id="menu" data-menu> 1571 <div class="banners shop-with-banner-mob" style="display: none;"> 1572 <div class="shop-with-container"> 1573 1574 </div> 1575</div> 1576 1577<div class="consultant-header--mobile" style="display: none;"> 1578 <a class="open-find-consultant navUser-action" aria-label="Find a consultant" > 1579 Find a consultant 1580 </a> 1581</div> 1582 1583<!-- <nav class="navPages navPages--special"> 1584 <div class="consultant-header--mobile" style="background: #ffffff; display: none;"> 1585 <a class="navUser-action text-left pl-30" aria-label="Become a consultant" href="/sell-pink-zebra" style="color: #000000;"> 1586 Become a Consultant 1587 </a> 1588 </div> 1589</nav> --> 1590 1591
1591<script type="application/json" id="nav-categories"> 1592 { 1593 "id": "1176", 1594 "name": "Top Navigation", 1595 "url": "https://pinkzebrahome.com/top-navigation/", 1596 "children": { 1597 "1257": { 1598 "id": "1257", 1599 "name": "Shop New", 1600 "url": "https://pinkzebrahome.com/top-navigation/shop-new-pztv/" 1601 }, 1602 "1178": { 1603 "id": "1178", 1604 "name": "Wax Melts & Warmers", 1605 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/" 1606 , 1607 "children": [ 1608 { 1609 "id": "1179", 1610 "name": "Shop By Category", 1611 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/" 1612 , 1613 "children": [ 1614 { 1615 "id": "1294", 1616 "name": "Paisley's New Monthly Fragrance", 1617 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/paisleys-new-monthly-fragrance/", 1618 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1619 }, 1620 { 1621 "id": "940", 1622 "name": "Wax Melts 16 oz Cartons", 1623 "url": "https://pinkzebrahome.com/fragrance-wax-warmers/sprinkles-wax-melts/16-oz-carton/", 1624 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1625 }, 1626 { 1627 "id": "939", 1628 "name": "Wax Melts 3.75 oz Bags", 1629 "url": "https://pinkzebrahome.com/fragrance-wax-warmers/sprinkles-wax-melts/3-75-oz-bags/", 1630 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1631 }, 1632 { 1633 "id": "791", 1634 "name": "Simmer Pot Warmers", 1635 "url": "https://pinkzebrahome.com/fragrance-wax-warmers/simmer-pot/", 1636 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1637 }, 1638 { 1639 "id": "792", 1640 "name": "Simmering Light Warmers", 1641 "url": "https://pinkzebrahome.com/fragrance-wax-warmers/simmering-lights/", 1642 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1643 }, 1644 { 1645 "id": "931", 1646 "name": "Accent Shades", 1647 "url": "https://pinkzebrahome.com/fragrance-wax-warmers/accent-shades/", 1648 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1649 }, 1650 { 1651 "id": "1107", 1652 "name": "Glimmer Candles", 1653 "url": "https://pinkzebrahome.com/fragrance-wax-and-warmers/glimmer-candles/", 1654 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1655 }, 1656 { 1657 "id": "1208", 1658 "name": "Bundles", 1659 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/bundles/", 1660 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1661 }, 1662 { 1663 "id": "1209", 1664 "name": "Shop All", 1665 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/shop-all/", 1666 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1667 }, 1668 { 1669 "id": "1180", 1670 "name": "SALE", 1671 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/sale/", 1672 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1673 } 1674 ] 1675 }, 1676 { 1677 "id": "1181", 1678 "name": "Shop By Collection", 1679 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-collection/" 1680 , 1681 "children": [ 1682 { 1683 "id": "1417", 1684 "name": "Headache-Friendly Fragrances", 1685 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-collection/headache-friendly-fragrances/", 1686 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1687 }, 1688 { 1689 "id": "1121", 1690 "name": "Subscribe & Save", 1691 "url": "https://pinkzebrahome.com/product-type/autoship/", 1692 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1693 } 1694 ] 1695 }, 1696 { 1697 "id": "1186", 1698 "name": "Shop By Essence", 1699 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/" 1700 , 1701 "children": [ 1702 { 1703 "id": "1187", 1704 "name": "Bakery", 1705 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/bakery/", 1706 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1707 }, 1708 { 1709 "id": "1188", 1710 "name": "Floral", 1711 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/floral/", 1712 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1713 }, 1714 { 1715 "id": "1189", 1716 "name": "Fresh & Clean", 1717 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/fresh-clean/", 1718 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1719 }, 1720 { 1721 "id": "1190", 1722 "name": "Fruity", 1723 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/fruity/", 1724 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1725 }, 1726 { 1727 "id": "1191", 1728 "name": "Wellness", 1729 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/wellness/", 1730 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1731 }, 1732 { 1733 "id": "1192", 1734 "name": "Wood & Spice", 1735 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/wood-spice/", 1736 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1737 } 1738 ] 1739 }, 1740 { 1741 "id": "1197", 1742 "name": "Banner Category", 1743 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/banner-category/" 1744 , 1745 "children": [ 1746 { 1747 "id": "1198", 1748 "name": "Shop our new collection drop!", 1749 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/banner-category/shop-our-new-collection-drop/", 1750 "image": "https://cdn11.bigcommerce.com/s-9khen3dncu/images/stencil/200w/m/shopnewnav2__72956.original.jpg" 1751 }, 1752 { 1753 "id": "1199", 1754 "name": "Shop Sce
1754ntFlirt Exclusives", 1755 "url": "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/banner-category/test-banner-name-2/", 1756 "image": "https://cdn11.bigcommerce.com/s-9khen3dncu/images/stencil/200w/g/shopnewnav2__02268.original.jpg" 1757 } 1758 ] 1759 } 1760 ] 1761 }, 1762 "1173": { 1763 "id": "1173", 1764 "name": "Oil & Diffusersâ", 1765 "url": "https://pinkzebrahome.com/oil-diffusers/" 1766 , 1767 "children": [ 1768 { 1769 "id": "1210", 1770 "name": "Shop By Category", 1771 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/" 1772 , 1773 "children": [ 1774 { 1775 "id": "788", 1776 "name": "Diffuser Oil 3.75 oz", 1777 "url": "https://pinkzebrahome.com/fragrance-oil-diffusers/diffuser-oil/", 1778 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1779 }, 1780 { 1781 "id": "1295", 1782 "name": "Paisley's New Monthly Fragrance", 1783 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/paisleys-new-monthly-fragrance/", 1784 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1785 }, 1786 { 1787 "id": "1123", 1788 "name": "Diffuser Oil 16 oz", 1789 "url": "https://pinkzebrahome.com/product-type/diffuser-oil-16-oz/", 1790 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1791 }, 1792 { 1793 "id": "1127", 1794 "name": "Ultrasonic Aroma Diffusers", 1795 "url": "https://pinkzebrahome.com/product-type/ultrasonic-oil-diffusers/", 1796 "image": "https://cdn11.bigcommerce.com/s-9khen3dncu/images/stencil/200w/j/untitled%20design%20%283%29__95192.original.gif" 1797 }, 1798 { 1799 "id": "1108", 1800 "name": "Wireless Diffusers", 1801 "url": "https://pinkzebrahome.com/fragrance-oil-diffusers/wireless-diffusers/", 1802 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1803 }, 1804 { 1805 "id": "937", 1806 "name": "Reed Diffusers", 1807 "url": "https://pinkzebrahome.com/fragrance-oil-diffusers/reed-diffusers/", 1808 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1809 }, 1810 { 1811 "id": "1286", 1812 "name": "Plug In Diffusers", 1813 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/plug-in-diffusers/", 1814 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1815 }, 1816 { 1817 "id": "1254", 1818 "name": "Bundles", 1819 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/bundles/", 1820 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1821 }, 1822 { 1823 "id": "1255", 1824 "name": "Shop All", 1825 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/shop-all/", 1826 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1827 }, 1828 { 1829 "id": "1251", 1830 "name": "SALE", 1831 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/sale/", 1832 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1833 } 1834 ] 1835 }, 1836 { 1837 "id": "1211", 1838 "name": "Shop By Collection", 1839 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-collection/" 1840 , 1841 "children": [ 1842 { 1843 "id": "1418", 1844 "name": "Headache-Friendly Fragrances", 1845 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-collection/headache-friendly-fragrances/", 1846 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1847 }, 1848 { 1849 "id": "1451", 1850 "name": "Subscribe & Save", 1851 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-collection/autoship/", 1852 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1853 } 1854 ] 1855 }, 1856 { 1857 "id": "1212", 1858 "name": "Shop By Essence", 1859 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/" 1860 , 1861 "children": [ 1862 { 1863 "id": "1217", 1864 "name": "Bakery", 1865 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/bakery/", 1866 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1867 }, 1868 { 1869 "id": "1218", 1870 "name": "Floral", 1871 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/floral/", 1872 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1873 }, 1874 { 1875 "id": "1219", 1876 "name": "Fresh & Clean", 1877 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/fresh-clean/", 1878 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1879 }, 1880 { 1881 "id": "1220", 1882 "name": "Fruity", 1883 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/fruity/", 1884 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1885 }, 1886 { 1887 "id": "1221", 1888 "name": "Wellness", 1889 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/wellness/", 1890 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1891 }, 1892 { 1893 "id": "1222", 1894 "name": "Wood & Spice", 1895 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/wood-spice/", 1896 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1897 } 1898 ] 1899 }, 1900 { 1901 "id": "1271", 1902 "name": "Banner Category", 1903 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/banner-category/" 1904 , 1905 "children": [ 1906 { 1907 "id": "1272", 1908 "name": "Shop our new collection drop!", 1909 "url": "https://pinkzebrahome.com/top-navigation/oil-diffusers/banner-category/shop-our-new-collection-drop/", 1910 "image": "https://cdn11.bigcommerce.com/s-9khen3dncu/images/stencil/200w/n/shopnewnav2__72043.original.jpg" 1911 }, 1912 { 1913 "id": "1273", 1914 "name": "Shop Sce
1914ntFlirt Exclusive", 1915 "url": "https://pinkzebrahome.com/oil-diffusers/top-navigation/banner-category/shop-scentflirt-exclusive/", 1916 "image": "https://cdn11.bigcommerce.com/s-9khen3dncu/images/stencil/200w/r/shopnewnav2__80749.original.jpg" 1917 } 1918 ] 1919 } 1920 ] 1921 }, 1922 "1174": { 1923 "id": "1174", 1924 "name": "Home Care", 1925 "url": "https://pinkzebrahome.com/top-navigation/home-care/" 1926 , 1927 "children": [ 1928 { 1929 "id": "1223", 1930 "name": "Shop By Category", 1931 "url": "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-category/" 1932 , 1933 "children": [ 1934 { 1935 "id": "919", 1936 "name": "Room Spray", 1937 "url": "https://pinkzebrahome.com/home-pet-care/room-spray/", 1938 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1939 }, 1940 { 1941 "id": "798", 1942 "name": "Dish Soap", 1943 "url": "https://pinkzebrahome.com/home-pet-care/kitchen-collection/dish-soap/", 1944 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1945 }, 1946 { 1947 "id": "795", 1948 "name": "Hand Soap", 1949 "url": "https://pinkzebrahome.com/body-care/hand-soap/", 1950 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1951 }, 1952 { 1953 "id": "799", 1954 "name": "Multi-Purpose Cleaners", 1955 "url": "https://pinkzebrahome.com/home-pet-care/kitchen-collection/all-purpose-cleaner/", 1956 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1957 }, 1958 { 1959 "id": "1125", 1960 "name": "Stain Removers", 1961 "url": "https://pinkzebrahome.com/product-type/stain-removers/", 1962 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1963 }, 1964 { 1965 "id": "1124", 1966 "name": "Wipes", 1967 "url": "https://pinkzebrahome.com/product-type/wipes/", 1968 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1969 }, 1970 { 1971 "id": "920", 1972 "name": "Insect Repellent", 1973 "url": "https://pinkzebrahome.com/home-pet-care/natural-insect-repellent-collection/", 1974 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1975 }, 1976 { 1977 "id": "1227", 1978 "name": "Shop All", 1979 "url": "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-category/shop-all/", 1980 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1981 } 1982 ] 1983 }, 1984 { 1985 "id": "1224", 1986 "name": "Shop By Collection", 1987 "url": "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-collection/" 1988 , 1989 "children": [ 1990 { 1991 "id": "1419", 1992 "name": "Headache-Friendly Fragrances", 1993 "url": "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-collection/headache-friendly-fragrances/", 1994 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 1995 }, 1996 { 1997 "id": "1228", 1998 "name": "Air Care+ Odor Neutralizing Collectionâ", 1999 "url": "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-collection/air-care-odor-neutralizing-collection/", 2000 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2001 }, 2002 { 2003 "id": "797", 2004 "name": "Kitchen Collection", 2005 "url": "https://pinkzebrahome.com/home-pet-care/kitchen-collection/", 2006 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2007 }, 2008 { 2009 "id": "1229", 2010 "name": "Natural Insect Repellent Collectionâ", 2011 "url": "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-collection/natural-insect-repellent-collection/", 2012 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2013 } 2014 ] 2015 }, 2016 { 2017 "id": "1225", 2018 "name": "Shop By Essence", 2019 "url": "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/" 2020 , 2021 "children": [ 2022 { 2023 "id": "1230", 2024 "name": "Bakery", 2025 "url": "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/bakery/", 2026 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2027 }, 2028 { 2029 "id": "1231", 2030 "name": "Floral", 2031 "url": "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/floral/", 2032 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2033 }, 2034 { 2035 "id": "1232", 2036 "name": "Fresh & Cleanâ", 2037 "url": "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/fresh-clean/", 2038 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2039 }, 2040 { 2041 "id": "1233", 2042 "name": "Fruity", 2043 "url": "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/fruity/", 2044 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2045 }, 2046 { 2047 "id": "1234", 2048 "name": "Wellnessâ", 2049 "url": "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/wellness/", 2050 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2051 }, 2052 { 2053 "id": "1235", 2054 "name": "Wood & Spiceâ", 2055 "url": "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/wood-spice/", 2056 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2057 } 2058 ] 2059 }, 2060 { 2061 "id": "1274", 2062 "name": "Banner Category", 2063 "url": "https://pinkzebrahome.com/home-care-pet/top-navigation/banner-category/" 2064 , 2065 "children": [ 2066 { 2067 "id": "1275", 2068 "name": "Shop our new collection drop!", 2069 "url": "https://pinkzebrahome.com/top-navigation/home-care/banner-category/shop-our-new-collection-drop/", 2070 "image": "https://cdn11.bigcommerce.com/s-9khen3dncu/images/stencil/200w/z/shopne
2070wnav1__32276.original.jpg" 2071 }, 2072 { 2073 "id": "1276", 2074 "name": "Shop ScentFlirt Exclusives", 2075 "url": "https://pinkzebrahome.com/home-care-pet/top-navigation/banner-category/shop-scentflirt-exclusives/", 2076 "image": "https://cdn11.bigcommerce.com/s-9khen3dncu/images/stencil/200w/w/shopnewnav2__92627.original.jpg" 2077 } 2078 ] 2079 } 2080 ] 2081 }, 2082 "794": { 2083 "id": "794", 2084 "name": "Body Care", 2085 "url": "https://pinkzebrahome.com/body-care/" 2086 , 2087 "children": [ 2088 { 2089 "id": "1236", 2090 "name": "Shop By Category", 2091 "url": "https://pinkzebrahome.com/body-care/top-navigation/shop-by-category/" 2092 , 2093 "children": [ 2094 { 2095 "id": "803", 2096 "name": "Hydrating Body Wash", 2097 "url": "https://pinkzebrahome.com/body-care/body-wash/", 2098 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2099 }, 2100 { 2101 "id": "1111", 2102 "name": "Luxe Body Oil", 2103 "url": "https://pinkzebrahome.com/body-care/luxe-body-oil/", 2104 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2105 }, 2106 { 2107 "id": "1112", 2108 "name": "Hydrating Body Lotion Spray", 2109 "url": "https://pinkzebrahome.com/body-care/hydrating-body-lotion-spray/", 2110 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2111 }, 2112 { 2113 "id": "1239", 2114 "name": "Shop All", 2115 "url": "https://pinkzebrahome.com/body-care/top-navigation/shop-by-category/shop-all/", 2116 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2117 } 2118 ] 2119 }, 2120 { 2121 "id": "1237", 2122 "name": "Shop By Essence", 2123 "url": "https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/" 2124 , 2125 "children": [ 2126 { 2127 "id": "1240", 2128 "name": "Bakeryâ", 2129 "url": "https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/bakery/", 2130 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2131 }, 2132 { 2133 "id": "1241", 2134 "name": "Floral", 2135 "url": "https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/floral/", 2136 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2137 }, 2138 { 2139 "id": "1242", 2140 "name": "Fresh & Cleanâ", 2141 "url": "https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/fresh-clean/", 2142 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2143 }, 2144 { 2145 "id": "1243", 2146 "name": "Fruityâ", 2147 "url": "https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/fruity/", 2148 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2149 }, 2150 { 2151 "id": "1244", 2152 "name": "Wellnessâ", 2153 "url": "https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/wellness/", 2154 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2155 }, 2156 { 2157 "id": "1245", 2158 "name": "Wood & Spiceâ", 2159 "url": "https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/wood-spice/", 2160 "image": "https://cdn11.bigcommerce.com/s-hs0ei5ji1f/images/stencil/200w/j/body__90300.original.png" 2161 } 2162 ] 2163 }, 2164 { 2165 "id": "1277", 2166 "name": "Banner Category", 2167 "url": "https://pinkzebrahome.com/body-care/top-navigation/banner-category/" 2168 , 2169 "children": [ 2170 { 2171 "id": "1278", 2172 "name": "Shop our new collection drop!", 2173 "url": "https://pinkzebrahome.com/top-navigation/body-care/banner-category/shop-our-new-collection-drop/", 2174 "image": "https://cdn11.bigcommerce.com/s-9khen3dncu/images/stencil/200w/r/shopne
2174wnav2__31508.original.jpg" 2175 }, 2176 { 2177 "id": "1279", 2178 "name": "Shop ScentFlirt Exclusives", 2179 "url": "https://pinkzebrahome.com/body-care/top-navigation/banner-category/shop-scentflirt-exclusives/", 2180 "image": "https://cdn11.bigcommerce.com/s-9khen3dncu/images/stencil/200w/q/shopnewnav2__10991.original.jpg" 2181 } 2182 ] 2183 } 2184 ] 2185 } 2186 } 2187 } 2188 </script>
2188 2189 2190<nav class="navPages"> 2191 <ul class="navPages-list nav-pages-categories"> 2192 <li class="navPages-item"> 2193 2194 <a class="navPages-action" href="https://pinkzebrahome.com/top-navigation/shop-new-pztv/" aria-label="Shop New"> 2195 Shop New 2196 </a> 2197 </li> 2198 <li class="navPages-item"> 2199 2200 <a class="navPages-action has-subMenu trigger-nav-banner" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/" data-collapsible="navPages-1178" 2201 data-site-urls='[ 2202 "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/" 2203 , "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/paisleys-new-monthly-fragrance/" 2204 , "https://pinkzebrahome.com/fragrance-wax-warmers/sprinkles-wax-melts/16-oz-carton/" 2205 , "https://pinkzebrahome.com/fragrance-wax-warmers/sprinkles-wax-melts/3-75-oz-bags/" 2206 , "https://pinkzebrahome.com/fragrance-wax-warmers/simmer-pot/" 2207 , "https://pinkzebrahome.com/fragrance-wax-warmers/simmering-lights/" 2208 , "https://pinkzebrahome.com/fragrance-wax-warmers/accent-shades/" 2209 , "https://pinkzebrahome.com/fragrance-wax-and-warmers/glimmer-candles/" 2210 , "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/bundles/" 2211 , "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/shop-all/" 2212 , "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/sale/" 2213 ,"https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-collection/" 2214 , "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-collection/headache-friendly-fragrances/" 2215 , "https://pinkzebrahome.com/product-type/autoship/" 2216 ,"https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/" 2217 , "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/bakery/" 2218 , "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/floral/" 2219 , "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/fresh-clean/" 2220 , "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/fruity/" 2221 , "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/wellness/" 2222 , "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/wood-spice/" 2223 ,"https://pinkzebrahome.com/top-navigation/wax-melts-warmers/banner-category/" 2224 , "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/banner-category/shop-our-new-collection-drop/" 2225 , "https://pinkzebrahome.com/top-navigation/wax-melts-warmers/banner-category/test-banner-name-2/" 2226 ]' data-nav-category-id="1178"> 2227 Wax Melts & Warmers 2228 <i class="icon navPages-action-moreIcon" aria-hidden="true"><svg><use xlink:href="#icon-chevron-down" /></svg></i> 2229 </a> 2230 <div class="navPage-subMenu nav-mega-menu-block w-auto" id="navPages-1178" aria-hidden="true" tabindex="-1" data-nav-category-id="1178"> 2231 <div class="pr_25px"> 2232 <p class="navPages--list-heading desktopOnly"> 2233 Shop By Category 2234 </p> 2235 <div class="d_none"> 2236 <a class="navPages-action navPages--subMenu-action has-subMenu" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/" data-collapsible="navPages-subMenu-1179"> 2237 Shop By Category 2238 <i class="icon navPages-action-moreIcon" aria-hidden="true"><svg><use xlink:href="#icon-chevron-down" /></svg></i> 2239 </a> 2240 </div> 2241 <ul class="desktopOnly"> 2242 <li class="navPages--list-childList-item"> 2243 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/paisleys-new-monthly-fragrance/" aria-label="Paisley's New Monthly Fragrance"> 2244 Paisley's New Monthly Fragrance 2245 </a> 2246 </li> 2247 <li class="navPages--list-childList-item"> 2248 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-wax-warmers/sprinkles-wax-melts/16-oz-carton/" aria-label="Wax Melts 16 oz Cartons"> 2249 Wax Melts 16 oz Cartons 2250 </a> 2251 </li> 2252 <li class="navPages--list-childList-item"> 2253 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-wax-warmers/sprinkles-wax-melts/3-75-oz-bags/" aria-label="Wax Melts 3.75 oz Bags"> 2254 Wax Melts 3.75 oz Bags 2255 </a> 2256 </li> 2257 <li class="navPages--list-childList-item"> 2258 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-wax-warmers/simmer-pot/" aria-label="Simmer Pot Warmers"> 2259 Simmer Pot Warmers 2260 </a> 2261 </li> 2262 <li class="navPages--list-childList-item"> 2263 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-wax-warmers/simmering-lights/" aria-label="Simmering Light Warmers"> 2264 Simmering Light Warmers 2265 </a> 2266 </li> 2267 <li class="navPages--list-childList-item"> 2268 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-wax-warmers/accent-shades/" aria-label="Accent Shades"> 2269 Accent Shades 2270 </a> 2271 </li> 2272 <li class="navPages--list-childList-item"> 2273 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-wax-and-warmers/glimmer-candles/" aria-label="Glimmer Candles"> 2274 Glimmer Candles 2275 </a> 2276 </li> 2277 <li class="navPages--list-childList-item"> 2278 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/bundles/" aria-label="Bundles"> 2279 Bundles 2280 </a> 2281 </li> 2282 <li class="navPages--list-childList-item"> 2283 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/shop-all/" aria-label="Shop All"> 2284 Shop All 2285 </a> 2286 </li> 2287 <li class="navPages--list-childList-item"> 2288 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/sale/" aria-label="SALE"> 2289 SALE 2290 </a> 2291 </li> 2292 </ul> 2293 <div class="mobileOnly"> 2294 <div class="navPage-subMenu d-block p-0" id="navPages-subMenu-1179" aria-hidden="false" tabindex="-1"> 2295 <ul class="ml-0 navPages--subMenu-list"> 2296 <li class="navPages--list-childList-item"> 2297 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/paisleys-new-monthly-fragrance/" aria-label="Paisley's New Monthly Fragrance"> 2298 Paisley's New Monthly Fragrance 2299 </a> 2300 </li> 2301 <li class="navPages--list-childList-item"> 2302 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-wax-warmers/sprinkles-wax-melts/16-oz-carton/" aria-label="Wax Melts 16 oz Cartons"> 2303 Wax Melts 16 oz Cartons 2304 </a> 2305 </li> 2306 <li class="navPages--list-childList-item"> 2307 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-wax-warmers/sprinkles-wax-melts/3-75-oz-bags/" aria-label="Wax Melts 3.75 oz Bags"> 2308 Wax Melts 3.75 oz Bags 2309 </a> 2310 </li> 2311 <li class="navPages--list-childList-item"> 2312 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-wax-warmers/simmer-pot/" aria-label="Simmer Pot Warmers"> 2313 Simmer Pot Warmers 2314 </a> 2315 </li> 2316 <li class="navPages--list-childList-item"> 2317 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-wax-warmers/simmering-lights/" aria-label="Simmering Light Warmers"> 2318 Simmering Light Warmers 2319 </a> 2320 </li> 2321 <li class="navPages--list-childList-item"> 2322 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-wax-warmers/accent-shades/" aria-label="Accent Shades"> 2323 Accent Shades 2324 </a> 2325 </li> 2326 <li class="navPages--list-childList-item"> 2327 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-wax-and-warmers/glimmer-candles/" aria-label="Glimmer Candles"> 2328 Glimmer Candles 2329 </a> 2330 </li> 2331 <li class="navPages--list-childList-item"> 2332 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/bundles/" aria-label="Bundles"> 2333 Bundles 2334 </a> 2335 </li> 2336 <li class="navPages--list-childList-item"> 2337 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/shop-all/" aria-label="Shop All"> 2338 Shop All 2339 </a> 2340 </li> 2341 <li class="navPages--list-childList-item"> 2342 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-category/sale/" aria-label="SALE"> 2343 SALE 2344 </a> 2345 </li> 2346 </ul> 2347 </div> 2348 </div> 2349 </div> 2350 <div class="pr_25px"> 2351 <p class="navPages--list-heading desktopOnly"> 2352 Shop By Collection 2353 </p> 2354 <div class="mobileOnly"> 2355 <a class="navPages-action navPages--subMenu-action has-subMenu" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-collection/" data-collapsible="navPages-subMenu-1181"> 2356 Shop By Collection 2357 <i class="icon navPages-action-moreIcon" aria-hidden="true"><svg><use xlink:href="#icon-chevron-down" /></svg></i> 2358 </a> 2359 </div> 2360 <ul class="desktopOnly"> 2361 <li class="navPages--list-childList-item"> 2362 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-collection/headache-friendly-fragrances/" aria-label="Headache-Friendly Fragrances"> 2363 Headache-Friendly Fragrances 2364 </a> 2365 </li> 2366 <li class="navPages--list-childList-item"> 2367 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/product-type/autoship/" aria-label="Subscribe & Save"> 2368 Subscribe & Save 2369 </a> 2370 </li> 2371 </ul> 2372 <div class="mobileOnly"> 2373 <div class="navPage-subMenu " id="navPages-subMenu-1181" aria-hidden="true" tabindex="-1"> 2374 <ul class="ml-0 navPages--subMenu-list"> 2375 <li class="navPages--list-childList-item"> 2376 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-collection/headache-friendly-fragrances/" aria-label="Headache-Friendly Fragrances"> 2377 Headache-Friendly Fragrances 2378 </a> 2379 </li> 2380 <li class="navPages--list-childList-item"> 2381 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/product-type/autoship/" aria-label="Subscribe & Save"> 2382 Subscribe & Save 2383 </a> 2384 </li> 2385 </ul> 2386 </div> 2387 </div> 2388 </div> 2389 <div class="pr_25px"> 2390 <p class="navPages--list-heading desktopOnly"> 2391 Shop By Essence 2392 </p> 2393 <div cla
2393ss="mobileOnly"> 2394 <a class="navPages-action navPages--subMenu-action has-subMenu" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/" data-collapsible="navPages-subMenu-1186"> 2395 Shop By Essence 2396 <i class="icon navPages-action-moreIcon" aria-hidden="true"><svg><use xlink:href="#icon-chevron-down" /></svg></i> 2397 </a> 2398 </div> 2399 <ul class="desktopOnly"> 2400 <li class="navPages--list-childList-item"> 2401 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/bakery/" aria-label="Bakery"> 2402 Bakery 2403 </a> 2404 </li> 2405 <li class="navPages--list-childList-item"> 2406 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/floral/" aria-label="Floral"> 2407 Floral 2408 </a> 2409 </li> 2410 <li class="navPages--list-childList-item"> 2411 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/fresh-clean/" aria-label="Fresh & Clean"> 2412 Fresh & Clean 2413 </a> 2414 </li> 2415 <li class="navPages--list-childList-item"> 2416 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/fruity/" aria-label="Fruity"> 2417 Fruity 2418 </a> 2419 </li> 2420 <li class="navPages--list-childList-item"> 2421 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/wellness/" aria-label="Wellness"> 2422 Wellness 2423 </a> 2424 </li> 2425 <li class="navPages--list-childList-item"> 2426 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/wood-spice/" aria-label="Wood & Spice"> 2427 Wood & Spice 2428 </a> 2429 </li> 2430 </ul> 2431 <div class="mobileOnly"> 2432 <div class="navPage-subMenu " id="navPages-subMenu-1186" aria-hidden="true" tabindex="-1"> 2433 <ul class="ml-0 navPages--subMenu-list"> 2434 <li class="navPages--list-childList-item"> 2435 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/bakery/" aria-label="Bakery"> 2436 Bakery 2437 </a> 2438 </li> 2439 <li class="navPages--list-childList-item"> 2440 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/floral/" aria-label="Floral"> 2441 Floral 2442 </a> 2443 </li> 2444 <li class="navPages--list-childList-item"> 2445 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/fresh-clean/" aria-label="Fresh & Clean"> 2446 Fresh & Clean 2447 </a> 2448 </li> 2449 <li class="navPages--list-childList-item"> 2450 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/fruity/" aria-label="Fruity"> 2451 Fruity 2452 </a> 2453 </li> 2454 <li class="navPages--list-childList-item"> 2455 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/wellness/" aria-label="Wellness"> 2456 Wellness 2457 </a> 2458 </li> 2459 <li class="navPages--list-childList-item"> 2460 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/top-navigation/wax-melts-warmers/shop-by-essence/wood-spice/" aria-label="Wood & Spice"> 2461 Wood & Spice 2462 </a> 2463 </li> 2464 </ul> 2465 </div> 2466 </div> 2467 </div> 2468 <div class="desktopOnly nav-banner" desktop-nav-menu-banner="1"></div> 2469 <div class="desktopOnly nav-banner" desktop-nav-menu-banner="2"></div> 2470 </div> 2471 </li> 2472 <li class="navPages-item"> 2473 2474 <a class="navPages-action has-subMenu trigger-nav-banner" href="https://pinkzebrahome.com/oil-diffusers/" data-collapsible="navPages-1173" 2475 data-site-urls='[ 2476 "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/" 2477 , "https://pinkzebrahome.com/fragrance-oil-diffusers/diffuser-oil/" 2478 , "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/paisleys-new-monthly-fragrance/" 2479 , "https://pinkzebrahome.com/product-type/diffuser-oil-16-oz/" 2480 , "https://pinkzebrahome.com/product-type/ultrasonic-oil-diffusers/" 2481 , "https://pinkzebrahome.com/fragrance-oil-diffusers/wireless-diffusers/" 2482 , "https://pinkzebrahome.com/fragrance-oil-diffusers/reed-diffusers/" 2483 , "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/plug-in-diffusers/" 2484 , "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/bundles/" 2485 , "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/shop-all/" 2486 , "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/sale/" 2487 ,"https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-collection/" 2488 , "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-collection/headache-friendly-fragrances/" 2489 , "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-collection/autoship/" 2490 ,"https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/" 2491 , "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/bakery/" 2492 , "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/floral/" 2493 , "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/fresh-clean/" 2494 , "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/fruity/" 2495 , "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/wellness/" 2496 , "https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/wood-spice/" 2497 ,"https://pinkzebrahome.com/oil-diffusers/top-navigation/banner-category/" 2498 , "https://pinkzebrahome.com/top-navigation/oil-diffusers/banner-category/shop-our-new-collection-drop/" 2499 , "https://pinkzebrahome.com/oil-diffusers/top-navigation/banner-category/shop-scentflirt-exclusive/" 2500 ]' data-nav-category-id="1173"> 2501 Oil & Diffusersâ 2502 <i class="icon navPages-action-moreIcon" aria-hidden="true"><svg><use xlink:href="#icon-chevron-down" /></svg></i> 2503 </a> 2504 <div class="navPage-subMenu nav-mega-menu-block w-auto" id="navPages-1173" aria-hidden="true" tabindex="-1" data-nav-category-id="1173"> 2505 <div class="pr_25px"> 2506 <p class="navPages--list-heading desktopOnly"> 2507 Shop By Category 2508 </p> 2509 <div class="d_none"> 2510 <a class="navPages-action navPages--subMenu-action has-subMenu" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/" data-collapsible="navPages-subMenu-1210"> 2511 Shop By Category 2512 <i class="icon navPages-action-moreIcon" aria-hidden="true"><svg><use xlink:href="#icon-chevron-down" /></svg></i> 2513 </a> 2514 </div> 2515 <ul class="desktopOnly"> 2516 <li class="navPages--list-childList-item"> 2517 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-oil-diffusers/diffuser-oil/" aria-label="Diffuser Oil 3.75 oz"> 2518 Diffuser Oil 3.75 oz 2519 </a> 2520 </li> 2521 <li class="navPages--list-childList-item"> 2522 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/paisleys-new-monthly-fragrance/" aria-label="Paisley's New Monthly Fragrance"> 2523 Paisley's New Monthly Fragrance 2524 </a> 2525 </li> 2526 <li class="navPages--list-childList-item"> 2527 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/product-type/diffuser-oil-16-oz/" aria-label="Diffuser Oil 16 oz"> 2528 Diffuser Oil 16 oz 2529 </a> 2530 </li> 2531 <li class="navPages--list-childList-item"> 2532 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/product-type/ultrasonic-oil-diffusers/" aria-label="Ultrasonic Aroma Diffusers"> 2533 Ultrasonic Aroma Diffusers 2534 </a> 2535 </li> 2536 <li class="navPages--list-childList-item"> 2537 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-oil-diffusers/wireless-diffusers/" aria-label="Wireless Diffusers"> 2538 Wireless Diffusers 2539 </a> 2540 </li> 2541 <li class="navPages--list-childList-item"> 2542 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-oil-diffusers/reed-diffusers/" aria-label="Reed Diffusers"> 2543 Reed Diffusers 2544 </a> 2545 </li> 2546 <li class="navPages--list-childList-item"> 2547 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/plug-in-diffusers/" aria-label="Plug In Diffusers"> 2548 Plug In Diffusers 2549 </a> 2550 </li> 2551 <li class="navPages--list-childList-item"> 2552 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/bundles/" aria-label="Bundles"> 2553 Bundles 2554 </a> 2555 </li> 2556 <li class="navPages--list-childList-item"> 2557 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/shop-all/" aria-label="Shop All"> 2558 Shop All 2559 </a> 2560 </li> 2561 <li class="navPages--list-childList-item"> 2562 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/sale/" aria-label="SALE"> 2563 SALE 2564 </a> 2565 </li> 2566 </ul> 2567 <div class="mobileOnly"> 2568 <div class="navPage-subMenu d-block p-0" id="navPages-subMenu-1210" aria-hidden="false" tabindex="-1"> 2569 <ul class="ml-0 navPages--subMenu-list"> 2570 <li class="navPages--list-childList-item"> 2571 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-oil-diffusers/diffuser-oil/" aria-label="Diffuser Oil 3.75 oz"> 2572 Diffuser Oil 3.75 oz 2573 </a> 2574 </li> 2575 <li class="navPages--list-childList-item"> 2576 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/paisleys-new-monthly-fragrance/" aria-label="Paisley's New Monthly Fragrance"> 2577 Paisley's New Monthly Fragrance 2578 </a> 2579 </li> 2580 <li class="navPages--list-childList-item"> 2581 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/product-type/diffuser-oil-16-oz/" aria-label="Diffuser Oil 16 oz"> 2582 Diffuser Oil 16 oz 2583 </a> 2584 </li> 2585 <li class="navPages--list-childList-item"> 2586 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/product-type/ultrasonic-oil-diffusers/" aria-label="Ultrasonic Aroma Diffusers"> 2587 Ultrasonic Aroma Diffusers 2588 </a> 2589 </li> 2590 <li class="navPages--list-childList-item"> 2591 <a cl
2591ass="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-oil-diffusers/wireless-diffusers/" aria-label="Wireless Diffusers"> 2592 Wireless Diffusers 2593 </a> 2594 </li> 2595 <li class="navPages--list-childList-item"> 2596 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/fragrance-oil-diffusers/reed-diffusers/" aria-label="Reed Diffusers"> 2597 Reed Diffusers 2598 </a> 2599 </li> 2600 <li class="navPages--list-childList-item"> 2601 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/plug-in-diffusers/" aria-label="Plug In Diffusers"> 2602 Plug In Diffusers 2603 </a> 2604 </li> 2605 <li class="navPages--list-childList-item"> 2606 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/bundles/" aria-label="Bundles"> 2607 Bundles 2608 </a> 2609 </li> 2610 <li class="navPages--list-childList-item"> 2611 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/shop-all/" aria-label="Shop All"> 2612 Shop All 2613 </a> 2614 </li> 2615 <li class="navPages--list-childList-item"> 2616 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-category/sale/" aria-label="SALE"> 2617 SALE 2618 </a> 2619 </li> 2620 </ul> 2621 </div> 2622 </div> 2623 </div> 2624 <div class="pr_25px"> 2625 <p class="navPages--list-heading desktopOnly"> 2626 Shop By Collection 2627 </p> 2628 <div class="mobileOnly"> 2629 <a class="navPages-action navPages--subMenu-action has-subMenu" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-collection/" data-collapsible="navPages-subMenu-1211"> 2630 Shop By Collection 2631 <i class="icon navPages-action-moreIcon" aria-hidden="true"><svg><use xlink:href="#icon-chevron-down" /></svg></i> 2632 </a> 2633 </div> 2634 <ul class="desktopOnly"> 2635 <li class="navPages--list-childList-item"> 2636 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-collection/headache-friendly-fragrances/" aria-label="Headache-Friendly Fragrances"> 2637 Headache-Friendly Fragrances 2638 </a> 2639 </li> 2640 <li class="navPages--list-childList-item"> 2641 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-collection/autoship/" aria-label="Subscribe & Save"> 2642 Subscribe & Save 2643 </a> 2644 </li> 2645 </ul> 2646 <div class="mobileOnly"> 2647 <div class="navPage-subMenu " id="navPages-subMenu-1211" aria-hidden="true" tabindex="-1"> 2648 <ul class="ml-0 navPages--subMenu-list"> 2649 <li class="navPages--list-childList-item"> 2650 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-collection/headache-friendly-fragrances/" aria-label="Headache-Friendly Fragrances"> 2651 Headache-Friendly Fragrances 2652 </a> 2653 </li> 2654 <li class="navPages--list-childList-item"> 2655 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-collection/autoship/" aria-label="Subscribe & Save"> 2656 Subscribe & Save 2657 </a> 2658 </li> 2659 </ul> 2660 </div> 2661 </div> 2662 </div> 2663 <div class="pr_25px"> 2664 <p class="navPages--list-heading desktopOnly"> 2665 Shop By Essence 2666 </p> 2667 <div class="mobileOnly"> 2668 <a class="navPages-action navPages--subMenu-action has-subMenu" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/" data-collapsible="navPages-subMenu-1212"> 2669 Shop By Essence 2670 <i class="icon navPages-action-moreIcon" aria-hidden="true"><svg><use xlink:href="#icon-chevron-down" /></svg></i> 2671 </a> 2672 </div> 2673 <ul class="desktopOnly"> 2674 <li class="navPages--list-childList-item"> 2675 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/bakery/" aria-label="Bakery"> 2676 Bakery 2677 </a> 2678 </li> 2679 <li class="navPages--list-childList-item"> 2680 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/floral/" aria-label="Floral"> 2681 Floral 2682 </a> 2683 </li> 2684 <li class="navPages--list-childList-item"> 2685 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/fresh-clean/" aria-label="Fresh & Clean"> 2686 Fresh & Clean 2687 </a> 2688 </li> 2689 <li class="navPages--list-childList-item"> 2690 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/fruity/" aria-label="Fruity"> 2691 Fruity 2692 </a> 2693 </li> 2694 <li class="navPages--list-childList-item"> 2695 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/wellness/" aria-label="Wellness"> 2696 Wellness 2697 </a> 2698 </li> 2699 <li class="navPages--list-childList-item"> 2700 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/wood-spice/" aria-label="Wood & Spice"> 2701 Wood & Spice 2702 </a> 2703 </li> 2704 </ul> 2705 <div class="mobileOnly"> 2706 <div class="navPage-subMenu " id="navPages-subMenu-1212" aria-hidden="true" tabindex="-1"> 2707 <ul class="ml-0 navPages--subMenu-list"> 2708 <li class="navPages--list-childList-item"> 2709 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/bakery/" aria-label="Bakery"> 2710 Bakery 2711 </a> 2712 </li> 2713 <li class="navPages--list-childList-item"> 2714 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/floral/" aria-label="Floral"> 2715 Floral 2716 </a> 2717 </li> 2718 <li class="navPages--list-childList-item"> 2719 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/fresh-clean/" aria-label="Fresh & Clean"> 2720 Fresh & Clean 2721 </a> 2722 </li> 2723 <li class="navPages--list-childList-item"> 2724 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/fruity/" aria-label="Fruity"> 2725 Fruity 2726 </a> 2727 </li> 2728 <li class="navPages--list-childList-item"> 2729 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/wellness/" aria-label="Wellness"> 2730 Wellness 2731 </a> 2732 </li> 2733 <li class="navPages--list-childList-item"> 2734 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/oil-diffusers/top-navigation/shop-by-essence/wood-spice/" aria-label="Wood & Spice"> 2735 Wood & Spice 2736 </a> 2737 </li> 2738 </ul> 2739 </div> 2740 </div> 2741 </div> 2742 <div class="desktopOnly nav-banner" desktop-nav-menu-banner="1"></div> 2743 <div class="desktopOnly nav-banner" desktop-nav-menu-banner="2"></div> 2744 </div> 2745 </li> 2746 <li class="navPages-item"> 2747 2748 <a class="navPages-action has-subMenu trigger-nav-banner" href="https://pinkzebrahome.com/top-navigation/home-care/" data-collapsible="navPages-1174" 2749 data-site-urls='[ 2750 "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-category/" 2751 , "https://pinkzebrahome.com/home-pet-care/room-spray/" 2752 , "https://pinkzebrahome.com/home-pet-care/kitchen-collection/dish-soap/" 2753 , "https://pinkzebrahome.com/body-care/hand-soap/" 2754 , "https://pinkzebrahome.com/home-pet-care/kitchen-collection/all-purpose-cleaner/" 2755 , "https://pinkzebrahome.com/product-type/stain-removers/" 2756 , "https://pinkzebrahome.com/product-type/wipes/" 2757 , "https://pinkzebrahome.com/home-pet-care/natural-insect-repellent-collection/" 2758 , "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-category/shop-all/" 2759 ,"https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-collection/" 2760 , "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-collection/headache-friendly-fragrances/" 2761 , "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-collection/air-care-odor-neutralizing-collection/" 2762 , "https://pinkzebrahome.com/home-pet-care/kitchen-collection/" 2763 , "https://pinkzebrahome.com/home-pet-care/kitchen-collection/fabric-mist/" 2764 , "https://pinkzebrahome.com/home-pet-care/kitchen-collection/laundry-boost/" 2765 , "https://pinkzebrahome.com/home-pet-care/kitchen-collection/foaming-soap/" 2766 , "https://pinkzebrahome.com/home-pet-care/kitchen-collection/dryer-ball/" 2767 , "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-collection/natural-insect-repellent-collection/" 2768 ,"https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/" 2769 , "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/bakery/" 2770 , "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/floral/" 2771 , "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/fresh-clean/" 2772 , "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/fruity/" 2773 , "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/wellness/" 2774 , "https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/wood-spice/" 2775 ,"https://pinkzebrahome.com/home-care-pet/top-navigation/banner-category/" 2776 , "https://pinkzebrahome.com/top-navigation/home-care/banner-category/shop-our-new-collection-drop/" 2777 , "https://pinkzebrahome.com/home-care-pet/top-navigation/banner-category/shop-scentflirt-exclusives/" 2778 ]' data-nav-category-id="1174"> 2779 Home Care 2780 <i class="icon navPages-action-moreIcon" aria-hidden="true"><svg><use xlink:href="#icon-chevron-down" /></svg></i> 2781 </a> 2782 <div class="navPage-subMenu nav-mega-menu-block w-auto" id="navPages-1174" aria-hidden="true" tabindex="-1" data-nav-category-id="1174"> 2783 <div class="pr_25px"> 2784 <p class="navPages--list-heading desktopOnly"> 2785 Shop By Category 2786 </p> 2787 <div class="d_none"> 2788 <a class="navPages-action navPages--subMenu-action has-subMenu" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-category/" data-collapsible="navPages-subMenu-1223"> 2789 Shop By Category 2790 <i class="icon navPages-action-moreIcon" aria-hidden="true"><svg><use xlink:href="#icon-chevron-down" /></svg></i> 2791 </a> 2792 </div> 2793 <ul class="desktopOnly"> 2794 <li class="navPages--list-childList-item"> 2795 <a class="navPages--list-childList-action" href="h
2795ttps://pinkzebrahome.com/home-pet-care/room-spray/" aria-label="Room Spray"> 2796 Room Spray 2797 </a> 2798 </li> 2799 <li class="navPages--list-childList-item"> 2800 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-pet-care/kitchen-collection/dish-soap/" aria-label="Dish Soap"> 2801 Dish Soap 2802 </a> 2803 </li> 2804 <li class="navPages--list-childList-item"> 2805 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/hand-soap/" aria-label="Hand Soap"> 2806 Hand Soap 2807 </a> 2808 </li> 2809 <li class="navPages--list-childList-item"> 2810 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-pet-care/kitchen-collection/all-purpose-cleaner/" aria-label="Multi-Purpose Cleaners"> 2811 Multi-Purpose Cleaners 2812 </a> 2813 </li> 2814 <li class="navPages--list-childList-item"> 2815 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/product-type/stain-removers/" aria-label="Stain Removers"> 2816 Stain Removers 2817 </a> 2818 </li> 2819 <li class="navPages--list-childList-item"> 2820 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/product-type/wipes/" aria-label="Wipes"> 2821 Wipes 2822 </a> 2823 </li> 2824 <li class="navPages--list-childList-item"> 2825 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-pet-care/natural-insect-repellent-collection/" aria-label="Insect Repellent"> 2826 Insect Repellent 2827 </a> 2828 </li> 2829 <li class="navPages--list-childList-item"> 2830 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-category/shop-all/" aria-label="Shop All"> 2831 Shop All 2832 </a> 2833 </li> 2834 </ul> 2835 <div class="mobileOnly"> 2836 <div class="navPage-subMenu d-block p-0" id="navPages-subMenu-1223" aria-hidden="false" tabindex="-1"> 2837 <ul class="ml-0 navPages--subMenu-list"> 2838 <li class="navPages--list-childList-item"> 2839 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-pet-care/room-spray/" aria-label="Room Spray"> 2840 Room Spray 2841 </a> 2842 </li> 2843 <li class="navPages--list-childList-item"> 2844 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-pet-care/kitchen-collection/dish-soap/" aria-label="Dish Soap"> 2845 Dish Soap 2846 </a> 2847 </li> 2848 <li class="navPages--list-childList-item"> 2849 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/hand-soap/" aria-label="Hand Soap"> 2850 Hand Soap 2851 </a> 2852 </li> 2853 <li class="navPages--list-childList-item"> 2854 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-pet-care/kitchen-collection/all-purpose-cleaner/" aria-label="Multi-Purpose Cleaners"> 2855 Multi-Purpose Cleaners 2856 </a> 2857 </li> 2858 <li class="navPages--list-childList-item"> 2859 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/product-type/stain-removers/" aria-label="Stain Removers"> 2860 Stain Removers 2861 </a> 2862 </li> 2863 <li class="navPages--list-childList-item"> 2864 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/product-type/wipes/" aria-label="Wipes"> 2865 Wipes 2866 </a> 2867 </li> 2868 <li class="navPages--list-childList-item"> 2869 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-pet-care/natural-insect-repellent-collection/" aria-label="Insect Repellent"> 2870 Insect Repellent 2871 </a> 2872 </li> 2873 <li class="navPages--list-childList-item"> 2874 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-category/shop-all/" aria-label="Shop All"> 2875 Shop All 2876 </a> 2877 </li> 2878 </ul> 2879 </div> 2880 </div> 2881 </div> 2882 <div class="pr_25px"> 2883 <p class="navPages--list-heading desktopOnly"> 2884 Shop By Collection 2885 </p> 2886 <div class="mobileOnly"> 2887 <a class="navPages-action navPages--subMenu-action has-subMenu" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-collection/" data-collapsible="navPages-subMenu-1224"> 2888 Shop By Collection 2889 <i class="icon navPages-action-moreIcon" aria-hidden="true"><svg><use xlink:href="#icon-chevron-down" /></svg></i> 2890 </a> 2891 </div> 2892 <ul class="desktopOnly"> 2893 <li class="navPages--list-childList-item"> 2894 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-collection/headache-friendly-fragrances/" aria-label="Headache-Friendly Fragrances"> 2895 Headache-Friendly Fragrances 2896 </a> 2897 </li> 2898 <li class="navPages--list-childList-item"> 2899 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-collection/air-care-odor-neutralizing-collection/" aria-label="Air Care+ Odor Neutralizing Collectionâ"> 2900 Air Care+ Odor Neutralizing Collectionâ 2901 </a> 2902 </li> 2903 <li class="navPages--list-childList-item"> 2904 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-pet-care/kitchen-collection/" aria-label="Kitchen Collection"> 2905 Kitchen Collection 2906 </a> 2907 </li> 2908 <li class="navPages--list-childList-item"> 2909 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-collection/natural-insect-repellent-collection/" aria-label="Natural Insect Repellent Collectionâ"> 2910 Natural Insect Repellent Collectionâ 2911 </a> 2912 </li> 2913 </ul> 2914 <div class="mobileOnly"> 2915 <div class="navPage-subMenu " id="navPages-subMenu-1224" aria-hidden="true" tabindex="-1"> 2916 <ul class="ml-0 navPages--subMenu-list"> 2917 <li class="navPages--list-childList-item"> 2918 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-collection/headache-friendly-fragrances/" aria-label="Headache-Friendly Fragrances"> 2919 Headache-Friendly Fragrances 2920 </a> 2921 </li> 2922 <li class="navPages--list-childList-item"> 2923 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-collection/air-care-odor-neutralizing-collection/" aria-label="Air Care+ Odor Neutralizing Collectionâ"> 2924 Air Care+ Odor Neutralizing Collectionâ 2925 </a> 2926 </li> 2927 <li class="navPages--list-childList-item"> 2928 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-pet-care/kitchen-collection/" aria-label="Kitchen Collection"> 2929 Kitchen Collection 2930 </a> 2931 </li> 2932 <li class="navPages--list-childList-item"> 2933 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-collection/natural-insect-repellent-collection/" aria-label="Natural Insect Repellent Collectionâ"> 2934 Natural Insect Repellent Collectionâ 2935 </a> 2936 </li> 2937 </ul> 2938 </div> 2939 </div> 2940 </div> 2941 <div class="pr_25px"> 2942 <p class="navPages--list-heading desktopOnly"> 2943 Shop By Essence 2944 </p> 2945 <div class="mobileOnly"> 2946 <a class="navPages-action navPages--subMenu-action has-subMenu" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/" data-collapsible="navPages-subMenu-1225"> 2947 Shop By Essence 2948 <i class="icon navPages-action-moreIcon" aria-hidden="true"><svg><use xlink:href="#icon-chevron-down" /></svg></i> 2949 </a> 2950 </div> 2951 <ul class="desktopOnly"> 2952 <li class="navPages--list-childList-item"> 2953 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/bakery/" aria-label="Bakery"> 2954 Bakery 2955 </a> 2956 </li> 2957 <li class="navPages--list-childList-item"> 2958 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/floral/" aria-label="Floral"> 2959 Floral 2960 </a> 2961 </li> 2962 <li class="navPages--list-childList-item"> 2963 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/fresh-clean/" aria-label="Fresh & Cleanâ"> 2964 Fresh & Cleanâ 2965 </a> 2966 </li> 2967 <li class="navPages--list-childList-item"> 2968 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/fruity/" aria-label="Fruity"> 2969 Fruity 2970 </a> 2971 </li> 2972 <li class="navPages--list-childList-item"> 2973 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/wellness/" aria-label="Wellnessâ"> 2974 Wellnessâ 2975 </a> 2976 </li> 2977 <li class="navPages--list-childList-item"> 2978 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/wood-spice/" aria-label="Wood & Spiceâ"> 2979 Wood & Spiceâ 2980 </a> 2981 </li> 2982 </ul> 2983 <div class="mobileOnly"> 2984 <div class="navPage-subMenu " id="navPages-subMenu-1225" aria-hidden="true" tabindex="-1"> 2985 <ul class="ml-0 navPages--subMenu-list"> 2986 <li class="navPages--list-childList-item"> 2987 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/bakery/" aria-label="Bakery"> 2988 Bakery 2989 </a> 2990 </li> 2991 <li class="navPages--list-childList-item"> 2992 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/floral/" aria-label="Floral"> 2993 Floral 2994 </a> 2995 </li> 2996 <li class="navPages--list-childList-item"> 2997 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/fresh-clean/" aria-label="Fresh & Cleanâ"> 2998 Fresh & Cleanâ 2999 </a> 3000
3000 </li> 3001 <li class="navPages--list-childList-item"> 3002 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/fruity/" aria-label="Fruity"> 3003 Fruity 3004 </a> 3005 </li> 3006 <li class="navPages--list-childList-item"> 3007 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/wellness/" aria-label="Wellnessâ"> 3008 Wellnessâ 3009 </a> 3010 </li> 3011 <li class="navPages--list-childList-item"> 3012 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/home-care-pet/top-navigation/shop-by-essence/wood-spice/" aria-label="Wood & Spiceâ"> 3013 Wood & Spiceâ 3014 </a> 3015 </li> 3016 </ul> 3017 </div> 3018 </div> 3019 </div> 3020 <div class="desktopOnly nav-banner" desktop-nav-menu-banner="1"></div> 3021 <div class="desktopOnly nav-banner" desktop-nav-menu-banner="2"></div> 3022 </div> 3023 </li> 3024 <li class="navPages-item"> 3025 3026 <a class="navPages-action has-subMenu trigger-nav-banner" href="https://pinkzebrahome.com/body-care/" data-collapsible="navPages-794" 3027 data-site-urls='[ 3028 "https://pinkzebrahome.com/body-care/top-navigation/shop-by-category/" 3029 , "https://pinkzebrahome.com/body-care/body-wash/" 3030 , "https://pinkzebrahome.com/body-care/luxe-body-oil/" 3031 , "https://pinkzebrahome.com/body-care/hydrating-body-lotion-spray/" 3032 , "https://pinkzebrahome.com/body-care/top-navigation/shop-by-category/shop-all/" 3033 ,"https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/" 3034 , "https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/bakery/" 3035 , "https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/floral/" 3036 , "https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/fresh-clean/" 3037 , "https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/fruity/" 3038 , "https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/wellness/" 3039 , "https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/wood-spice/" 3040 ,"https://pinkzebrahome.com/body-care/top-navigation/banner-category/" 3041 , "https://pinkzebrahome.com/top-navigation/body-care/banner-category/shop-our-new-collection-drop/" 3042 , "https://pinkzebrahome.com/body-care/top-navigation/banner-category/shop-scentflirt-exclusives/" 3043 ]' data-nav-category-id="794"> 3044 Body Care 3045 <i class="icon navPages-action-moreIcon" aria-hidden="true"><svg><use xlink:href="#icon-chevron-down" /></svg></i> 3046 </a> 3047 <div class="navPage-subMenu nav-mega-menu-block w-auto" id="navPages-794" aria-hidden="true" tabindex="-1" data-nav-category-id="794"> 3048 <div class="pr_25px"> 3049 <p class="navPages--list-heading desktopOnly"> 3050 Shop By Category 3051 </p> 3052 <div class="d_none"> 3053 <a class="navPages-action navPages--subMenu-action has-subMenu" href="https://pinkzebrahome.com/body-care/top-navigation/shop-by-category/" data-collapsible="navPages-subMenu-1236"> 3054 Shop By Category 3055 <i class="icon navPages-action-moreIcon" aria-hidden="true"><svg><use xlink:href="#icon-chevron-down" /></svg></i> 3056 </a> 3057 </div> 3058 <ul class="desktopOnly"> 3059 <li class="navPages--list-childList-item"> 3060 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/body-wash/" aria-label="Hydrating Body Wash"> 3061 Hydrating Body Wash 3062 </a> 3063 </li> 3064 <li class="navPages--list-childList-item"> 3065 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/luxe-body-oil/" aria-label="Luxe Body Oil"> 3066 Luxe Body Oil 3067 </a> 3068 </li> 3069 <li class="navPages--list-childList-item"> 3070 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/hydrating-body-lotion-spray/" aria-label="Hydrating Body Lotion Spray"> 3071 Hydrating Body Lotion Spray 3072 </a> 3073 </li> 3074 <li class="navPages--list-childList-item"> 3075 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/top-navigation/shop-by-category/shop-all/" aria-label="Shop All"> 3076 Shop All 3077 </a> 3078 </li> 3079 </ul> 3080 <div class="mobileOnly"> 3081 <div class="navPage-subMenu d-block p-0" id="navPages-subMenu-1236" aria-hidden="false" tabindex="-1"> 3082 <ul class="ml-0 navPages--subMenu-list"> 3083 <li class="navPages--list-childList-item"> 3084 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/body-wash/" aria-label="Hydrating Body Wash"> 3085 Hydrating Body Wash 3086 </a> 3087 </li> 3088 <li class="navPages--list-childList-item"> 3089 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/luxe-body-oil/" aria-label="Luxe Body Oil"> 3090 Luxe Body Oil 3091 </a> 3092 </li> 3093 <li class="navPages--list-childList-item"> 3094 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/hydrating-body-lotion-spray/" aria-label="Hydrating Body Lotion Spray"> 3095 Hydrating Body Lotion Spray 3096 </a> 3097 </li> 3098 <li class="navPages--list-childList-item"> 3099 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/top-navigation/shop-by-category/shop-all/" aria-label="Shop All"> 3100 Shop All 3101 </a> 3102 </li> 3103 </ul> 3104 </div> 3105 </div> 3106 </div> 3107 <div class="pr_25px"> 3108 <p class="navPages--list-heading desktopOnly"> 3109 Shop By Essence 3110 </p> 3111 <div class="mobileOnly"> 3112 <a class="navPages-action navPages--subMenu-action has-subMenu" href="https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/" data-collapsible="navPages-subMenu-1237"> 3113 Shop By Essence 3114 <i class="icon navPages-action-moreIcon" aria-hidden="true"><svg><use xlink:href="#icon-chevron-down" /></svg></i> 3115 </a> 3116 </div> 3117 <ul class="desktopOnly"> 3118 <li class="navPages--list-childList-item"> 3119 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/bakery/" aria-label="Bakeryâ"> 3120 Bakeryâ 3121 </a> 3122 </li> 3123 <li class="navPages--list-childList-item"> 3124 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/floral/" aria-label="Floral"> 3125 Floral 3126 </a> 3127 </li> 3128 <li class="navPages--list-childList-item"> 3129 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/fresh-clean/" aria-label="Fresh & Cleanâ"> 3130 Fresh & Cleanâ 3131 </a> 3132 </li> 3133 <li class="navPages--list-childList-item"> 3134 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/fruity/" aria-label="Fruityâ"> 3135 Fruityâ 3136 </a> 3137 </li> 3138 <li class="navPages--list-childList-item"> 3139 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/wellness/" aria-label="Wellnessâ"> 3140 Wellnessâ 3141 </a> 3142 </li> 3143 <li class="navPages--list-childList-item"> 3144 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/wood-spice/" aria-label="Wood & Spiceâ"> 3145 Wood & Spiceâ 3146 </a> 3147 </li> 3148 </ul> 3149 <div class="mobileOnly"> 3150 <div class="navPage-subMenu " id="navPages-subMenu-1237" aria-hidden="true" tabindex="-1"> 3151 <ul class="ml-0 navPages--subMenu-list"> 3152 <li class="navPages--list-childList-item"> 3153 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/bakery/" aria-label="Bakeryâ"> 3154 Bakeryâ 3155 </a> 3156 </li> 3157 <li class="navPages--list-childList-item"> 3158 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/floral/" aria-label="Floral"> 3159 Floral 3160 </a> 3161 </li> 3162 <li class="navPages--list-childList-item"> 3163 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/fresh-clean/" aria-label="Fresh & Cleanâ"> 3164 Fresh & Cleanâ 3165 </a> 3166 </li> 3167 <li class="navPages--list-childList-item"> 3168 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/fruity/" aria-label="Fruityâ"> 3169 Fruityâ 3170 </a> 3171 </li> 3172 <li class="navPages--list-childList-item"> 3173 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/wellness/" aria-label="Wellnessâ"> 3174 Wellnessâ 3175 </a> 3176 </li> 3177 <li class="navPages--list-childList-item"> 3178 <a class="navPages--list-childList-action" href="https://pinkzebrahome.com/body-care/top-navigation/shop-by-essence/wood-spice/" aria-label="Wood & Spiceâ"> 3179 Wood & Spiceâ 3180 </a> 3181 </li> 3182 </ul> 3183 </div> 3184 </div> 3185 </div> 3186 <div class="desktopOnly nav-banner" desktop-nav-menu-banner="1"></div> 3187 <div class="desktopOnly nav-banner" desktop-nav-menu-banner="2"></div> 3188 </div> 3189 </li> 3190 3191 3192<li class="navPages-item"> 3193 <a class="navPages-action has-subMenu hide-nav-banner" href="/scentflirt/" data-site-urls='["/scentflirt/","/earn-rewards/"]' 3194 data-collapsible="navPages-ScentFlirts" aria-label="ScentFlirt Subscription" aria-controls="navPages-ScentFlirts" 3195 aria-expanded="true"> 3196 ScentFlirt Subscription 3197 <i class="icon navPages-action-moreIcon" aria-hidden="true"> 3198 <svg> 3199 <use href="#icon-chevron-down"></use> 3200 </svg> 3201 </i> 3202 </a> 3203 <div class="navPage-subMenu" id="navPages-ScentFlirts" aria-hidden="false" tabindex="-1"> 3204 <div> 3205 <ul class="navPage-subMenu-list"> 3206 <li class="navPage-subMenu-item"> 3207 <a class="navPage-subMenu-action navPages-action " 3208 href="/scentflirt/" aria-label="ScentFlirt Subscription"> 3209 ScentFlirt Subscription 3210 </a> 3211 </li> 3212 <li class="navPage-subMenu-item"> 3213 <a class="navPage-subMenu-action navPages-action " 3214 href="/scentflirt-exclusive/" aria-label="ScentFlirt Exclusive"> 3215 ScentFlirt Exclusive 3216 </a> 3217 </li> 3218 <li class="navPage-subMenu-item"> 3219 <a class="navPage-subMenu-action navPages-action " 3220 href="/earn-rewards" aria-label="ScentFlirt Member"> 3221 Refer a Friend 3222 </a> 3223 </li> 3224 3225 </ul> 3226 </div> 3227 </div> 3228</li> 3229<li class="navPages-item"> 3230 <a class="navPages-action" data-site-url="/share-and-earn" href="/share-and-earn" data-site-urls='["/share-and-earn"]' 3231 aria-label="Share & Earn"> 3232 Share & Earn 3233 </a> 3234</li> 3235<li class="navPages-item mobileOnl
3235y"> 3236 <a class="navPages-action" data-site-url="/sell-pink-zebra" href="/sell-pink-zebra" data-site-urls='["/sell-pink-zebra"]' 3237 aria-label="Share & Earn"> 3238 Sell Pink Zebra 3239 </a> 3240</li> 3241<li class="navPages-item"> 3242 <a class="navPages-action" data-site-url="/pztv" href="/pztv" data-site-urls='["/pztv"]' 3243 aria-label="Share & Earn"> 3244 PZTV Live Shopping 3245 </a> 3246</li> <li class="mobileOnly"> 3247 <div style="display: flex; justify-content: space-around;"> 3248 <div class="nav-banner" mobile-nav-menu-banner="1"></div> 3249 <div class="nav-banner" mobile-nav-menu-banner="2"></div> 3250 </div> 3251 </li> 3252 </ul> 3253 <ul class="navPages-list navPages-list--user"> 3254 <li class="navPages-item"> 3255 <a class="navPages-action" href="https://pinkzebrahome.com/giftcertificates.php" 3256 aria-label="Gift Certificates"> 3257 Gift Certificates 3258 </a> 3259 </li> 3260 <li class="navPages-item"> 3261 <a class="navPages-action" href="https://pinkzebrahome.com/login.php" aria-label="Sign in"> 3262 Sign in 3263 </a> 3264 or 3265 <a class="navPages-action" href="https://pinkzebrahome.com/login.php?action=create_account" aria-label="Register"> 3266 Register 3267 </a> 3268 </li> 3269 </ul> 3270</nav> 3271<div class="consultant-parties hidden"> 3272 <div class="consultant-parties__open"> 3273 <button class="modal-close" 3274 type="button" 3275 title="Close" 3276 3277> 3278 <span class="aria-description--hidden">Close</span> 3279 <span aria-hidden="true">×</span> 3280</button> 3281 <div class="no-current-party"> 3282 <h1> My open parties</h1> 3283 <p class="title-label"> Pick your party to start shopping!</p> 3284 <hr> 3285 3286 <div class="loadingOverlay" id="loading-parties"></div> 3287 3288 <ol class="party-list parties"> 3289 </ol> 3290 3291 <a class="view-all-parties party-link"> View All Parties </a> 3292 3293 <hr> 3294</div> 3295 3296 <div class="current-party"> 3297 <div class="consultant-parties__current"> 3298 <h1> Your party</h1> 3299 <p class="title-label"> You are now shopping</p> 3300 <hr> 3301 <ol class="current-party-list parties"> 3302 </ol> 3303 <div class="party-link-container"> 3304 <a class="party-link share-party"> SHARE PARTY LINK 3305 <span id="party-tooltip">copied to clipboard!</sapn> 3306 </a> 3307 <a class="party-link leave-party"> LEAVE PARTY </a> 3308 <a class="party-link return-parties-list"> View All Parties </a> 3309 </div> 3310 <hr> 3311</div> 3312 </div> 3313 <ol class="information"> 3314 <li class="item"> 3315 <a href="/blendbash/">Host a Party</a> 3316 </li> 3317 <li class="item"> 3318 <a href="/become-a-consultant/">Join My Team</a> 3319 </li> 3320 <li class="item"> 3321 <a href="/consultant-bio/">About Me</a> 3322 </li> 3323 </ol> 3324</div> 3325</div></div> 3326 <div data-content-region="header_navigation_bottom--global"></div> 3327 </header> 3328 <div data-content-region="header_bottom--global"><div data-layout-id="9b508de5-a4e7-4877-aece-74f48a1f9c2c"> <div data-sub-layout-container="b79aa5b2-3825-4af8-b44b-3ccb52642950" data-layout-name="Layout"> 3329 <style data-container-styling="b79aa5b2-3825-4af8-b44b-3ccb52642950"> 3330 [data-sub-layout-container="b79aa5b2-3825-4af8-b44b-3ccb52642950"] { 3331 box-sizing: border-box; 3332 display: flex; 3333 flex-wrap: wrap; 3334 z-index: 0; 3335 position: relative; 3336 height: ; 3337 padding-top: 0px; 3338 padding-right: 0px; 3339 padding-bottom: 0px; 3340 padding-left: 0px; 3341 margin-top: 0px; 3342 margin-right: 0px; 3343 margin-bottom: 0px; 3344 margin-left: 0px; 3345 border-width: 0px; 3346 border-style: solid; 3347 border-color: #333333; 3348 } 3349 3350 [data-sub-layout-container="b79aa5b2-3825-4af8-b44b-3ccb52642950"]:after { 3351 display: block; 3352 position: absolute; 3353 top: 0; 3354 left: 0; 3355 bottom: 0; 3356 right: 0; 3357 background-size: cover; 3358 z-index: auto; 3359 } 3360 </style> 3361 3362 <div data-sub-layout="a7e2d349-299e-4636-8462-84c0b63749ed"> 3363 <style data-column-styling="a7e2d349-299e-4636-8462-84c0b63749ed"> 3364 [data-sub-layout="a7e2d349-299e-4636-8462-84c0b63749ed"] { 3365 display: flex; 3366 flex-direction: column; 3367 box-sizing: border-box; 3368 flex-basis: 100%; 3369 max-width: 100%; 3370 z-index: 0; 3371 position: relative; 3372 height: ; 3373 padding-top: 0px; 3374 padding-right: 10.5px; 3375 padding-bottom: 0px; 3376 padding-left: 10.5px; 3377 margin-top: 0px; 3378 margin-right: 0px; 3379 margin-bottom: 0px; 3380 margin-left: 0px; 3381 border-width: 0px; 3382 border-style: solid; 3383 border-color: #333333; 3384 justify-content: center; 3385 } 3386 [data-sub-layout="a7e2d349-299e-4636-8462-84c0b63749ed"]:after { 3387 display: block; 3388 position: absolute; 3389 top: 0; 3390 left: 0; 3391 bottom: 0; 3392 right: 0; 3393 background-size: cover; 3394 z-index: auto; 3395 } 3396 @media only screen and (max-width: 700px) { 3397 [data-sub-layout="a7e2d349-299e-4636-8462-84c0b63749ed"] { 3398 flex-basis: 100%; 3399 max-width: 100%; 3400 } 3401 } 3402 </style> 3403 <div data-widget-id="d58cada0-b187-4328-b29f-5dc2f6d45926" data-placement-id="bf5ae346-58cf-4414-96ca-36b907ccca73" data-placement-status="ACTIVE"><style> 3404 .shop-now-link { 3405 display:none; 3406 } 3407</style> 3408</div> 3409 </div> 3410</div> 3411 3412</div></div> 3413 <div data-content-region="header_bottom"></div> 3414</div> 3415<!-- Modals Ends Here --> 3416<div class="loadingOverlay pdp-update"></div>
3416<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/toggleLoader.js"></script>
3416 3417 <main class="body" id="main-content" role="main" data-currency-code="USD"> 3418 3419 <div class="container"> 3420 <div class="login"> 3421 <h1 class="page-heading">Sign in</h1> 3422 <div class="login-row"> 3423 <form class="login-form form" action="https://pinkzebrahome.com/login.php?action=check_login" method="post"> 3424 <h2 class="login-title">Returning Customers</h2> 3425 3426 3427 <div class="form-field"> 3428 <label class="form-label" for="login_email">Email Address</label> 3429 <input class="form-input" name="login_email" id="login_email" type="email"> 3430 </div> 3431 <div class="form-field"> 3432 <label class="form-label" for="login_pass">Password</label> 3433 <div class="password-wrapper"> 3434 <a class="button-toggle-password sso-hideable" alt="Show or hide your password" href="#"></a> 3435 <input autocomplete="password" id="login_pass" type="password" class="form-input" name="login_pass" value="" required> 3436 </div> 3437 </div> 3438 <div class="form-actions"> 3439 <input type="submit" class="button button--primary" value="Sign in"> 3440 <a class="forgot-password" href="https://pinkzebrahome.com/login.php?action=reset_password">Forgot your password?</a> 3441 </div> 3442 </form> 3443 <div class="new-customer"> 3444 <h2 class="login-title">New Customer?</h2> 3445 <p class="new-customer-intro">Create an account with us and you'll be able to:</p> 3446 <ul class="new-customer-fact-list"> 3447 <li class="new-customer-fact">Check out faster</li> 3448 <li class="new-customer-fact">Save multiple shipping addresses</li> 3449 <li class="new-customer-fact">Access your order history</li> 3450 <li class="new-customer-fact">Save items to your Wishlist</li> 3451 <li class="new-customer-fact">Receive faster help with order issues</li> 3452 </ul> 3453 <a class="new-customer-create" href="https://pinkzebrahome.com/login.php?action=create_account"><button class="button button--primary">Create My Account</button></a> 3454 </div> 3455 </div> 3456</div> 3457 3458 </div> 3459 <div id="modal" class="modal" data-reveal data-prevent-quick-search-close> 3460 <button class="modal-close" 3461 type="button" 3462 title="Close" 3463 3464> 3465 <span class="aria-description--hidden">Close</span> 3466 <span aria-hidden="true">×</span> 3467</button> 3468 <div class="modal-content"></div> 3469 <div class="loadingOverlay"></div> 3470</div> 3471 <div id="alert-modal" class="modal modal--alert modal--small" data-reveal data-prevent-quick-search-close> 3472 <div class="alert-icon error-icon"> 3473 <span class="icon-content"> 3474 <span class="line line-left"></span> 3475 <span class="line line-right"></span> 3476 </span> 3477 </div> 3478 3479 <div class="alert-icon warning-icon"> 3480 <div class="icon-content">!</div> 3481 </div> 3482 3483 <div class="alert-icon success-icon"> 3484 <svg class="checkmark" viewBox="0 0 52 52"> 3485 <circle class="checkmark-circle" cx="26" cy="26" r="25" fill="none" /> 3486 <path class="checkmark-check" fill="none" d="M14 27l8 8 16-16" /> 3487 </svg> 3488 </div> 3489 3490 <div class="modal-content"></div> 3491 3492 <div class="button-container"> 3493 <button type="button" class="confirm button" data-reveal-close>OK</button> 3494 <button type="button" class="cancel button" data-reveal-close>Cancel</button> 3495 </div> 3496</div> 3497</main> <footer class="footer" role="contentinfo"> 3498 <h2 class="footer-title-sr-only">Footer Start</h2> 3499 <div class="container container-footer"> 3500 <section class="footer-info"> 3501 <div class="footer-info-wrapper"> 3502 <article class="footer-info-col info-col-subscribe mobile-version" data-section-type="newsletterSubscription"> 3503 <h3 class="footer-info-heading web-version">Be the first to hear about new products, sales and more!</h3> 3504<!-- <div class="subscription-form-heading-wrapper mobile-version"> --> 3505 3506 <!-- <h3 class="footer-info-heading">Join our </h3> 3507 <h3 class="footer-info-heading-newsletter"> Newsletter</h3> 3508 <div class="subscription-form-heading-decor"></div> --> 3509<!-- </div> --> 3510<!-- <p class="exlusive-offerse">Be the first to hear about new products, sales and more!</p> --> 3511 3512<form class="form" action="https://pinkzebrahome.com/subscribe.php" method="post" id="nl-subscription-form"> 3513 <fieldset class="form-fieldset"> 3514 <input type="hidden" name="action" value="subscribe"> 3515 <input type="hidden" name="nl_first_name" id="nl_first_name" value="bc"> 3516 <input type="hidden" name="check" value="1"> 3517 3518 <div class="form-field"> 3519 <label class="form-label is-srOnly" for="nl_email">Email Address</label> 3520 <div class="form-prefixPostfix wrap"> 3521 <!-- Data Inputs --> 3522 <input class="form-input" 3523 id="nl_email" 3524 name="nl_email" 3525 type="email" 3526 value="" 3527 placeholder="Enter email" 3528 required 3529 > 3530 3531 <input class="form-input mt-3" 3532 id="nl_phone" 3533 name="nl_phone" 3534 type="text" 3535 value="+1" 3536 placeholder="Enter phone number" 3537 required 3538 > 3539 3540 <!-- Checkboxes (Listening to inputs to enable/disable) --> 3541 <div class="nl-legal-container"> 3542 3543 <div class="nl-checkbox-row"> 3544 <label class="nl-cb-label"> 3545 <input type="checkbox" class="nl-custom-cb" disabled>
3546 <span class="nl-cb-box"></span> 3547 <span class="nl-cb-text">Yes, Iâd like to receive marketing emails from Pink Zebra Home.</span> 3548 </label> 3549 </div> 3550 3551 <div class="nl-checkbox-row"> 3552 <label class="nl-cb-label"> 3553 <input type="checkbox" class="nl-custom-cb" disabled> 3554 <span class="nl-cb-box"></span> 3555 <span class="nl-cb-text">Yes, I'd like to receive marketing text messages from Pink Zebra Home.</span> 3556 </label> 3557 </div> 3558 3559 <div class="nl-checkbox-row"> 3560 <div class="legal-info"> 3561 <p style="margin:0">For more information on how we process your data for marketing communication. View our <a href="/privacy-policy" target="_blank">Privacy Policy</a></p> 3562 </div> 3563 </div> 3564 </div> 3565 3566 <!-- <input class="button button--primary form-prefixPostfix-button--postfix ms-0 mt-3" 3567 type="submit" 3568 value="Sign me Up" 3569 > --> 3570 </div> 3571 </div> 3572 </fieldset> 3573</form> 3574 3575<style> 3576 .nl-cb-label { 3577 display: flex; 3578 align-items: center; 3579 cursor: pointer; 3580 font-size: 12px; 3581 opacity: 0.4; 3582 transition: opacity 0.3s; 3583 /* Quitamos pointer-events: none para que siempre sea clickeable el área */ 3584 } 3585 3586 /* Cuando el input hijo NO está disabled, aclaramos el label */ 3587 .nl-cb-label:has(.nl-custom-cb:not(:disabled)) { 3588 opacity: 1; 3589 } 3590 3591 .nl-custom-cb { 3592 position: absolute; 3593 opacity: 0; 3594 width: 0; 3595 height: 0; 3596 } 3597 3598 .nl-cb-box { 3599 width: 16px; 3600 height: 16px; 3601 border: 2px solid #fe1378; 3602 border-radius: 3px; 3603 margin-right: 8px; 3604 flex-shrink: 0; 3605 position: relative; 3606 } 3607 3608 @media (max-width: 768px) { 3609 .nl-cb-box { 3610 border-color: #ffffff; 3611 } 3612 } 3613 3614 .nl-custom-cb:checked + .nl-cb-box { 3615 background-color: #fe1378; 3616 } 3617 3618 .nl-custom-cb:checked + .nl-cb-box::after { 3619 content: '\2713'; 3620 position: absolute; 3621 color: #fff; 3622 font-size: 11px; 3623 top: 50%; 3624 left: 50%; 3625 transform: translate(-50%, -50%); 3626 } 3627</style> 3628
3629<script> 3630(function () { 3631 // footer.html renders this partial twice (.mobile-version + .web-version, CSS toggles which 3632 // shows) â guard so only the first copy's script wires up listeners/interval; it already 3633 // operates on ALL '#nl-subscription-form' matches, so the duplicate copy needs no init of its own. 3634 if (window.__nlSubscriptionFormInit) return; 3635 window.__nlSubscriptionFormInit = true; 3636 3637 let cachedEmail = ""; 3638 let cachedPhone = ""; 3639 let emailRetryCount = 0; 3640 let phoneRetryCount = 0; 3641 let lastRetriedEmail = ""; 3642 let lastRetriedPhone = ""; 3643 const check = { 3644 email: (val) => /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(val.trim()), 3645 phone: (val) => { 3646 const digits = val.replace(/\D/g, ''); 3647 return digits.length === 11 && digits.startsWith('1'); 3648 } 3649 }; 3650 3651 function getFormData() { 3652 const forms = document.querySelectorAll('#nl-subscription-form'); 3653 let email = "", phone = ""; 3654 forms.forEach(f => { 3655 const emailInp = f.querySelector('input[name="nl_email"]'); 3656 const phoneInp = f.querySelector('input[name="nl_phone"]'); 3657 const e = emailInp ? emailInp.value : ""; 3658 const p = phoneInp ? phoneInp.value : ""; 3659 if (e.length > email.length) email = e; 3660 if (p.length > phone.length) phone = p; 3661 }); 3662 return { email, phone }; 3663 } 3664 3665 function formatPhone(val) { 3666 if (!val || val === '+1') return '+1'; 3667 let digits = String(val).replace(/\D/g, ''); 3668 if (digits.startsWith('1')) { 3669 digits = digits.substring(1); 3670 } 3671 return '+1' + digits; 3672 } 3673 3674 function initFormValues() { 3675 const customerDetails = JSON.parse(localStorage.getItem('customer_details')) || {}; 3676 const forms = document.querySelectorAll('#nl-subscription-form'); 3677 3678 forms.forEach(f => { 3679 const emailInp = f.querySelector('input[name="nl_email"]'); 3680 const phoneInp = f.querySelector('input[name="nl_phone"]'); 3681 3682 // 1. Priorizamos LocalStorage si existe data de la API 3683 if (emailInp && customerDetails.email) { 3684 emailInp.value = customerDetails.email; 3685 } 3686 3687 if (phoneInp) { 3688 const storedPhone = customerDetails.phone || customerDetails.mobile_number; 3689 3690 // Si la API tiene un teléfono, lo usamos (aunque sea el "5") 3691 if (storedPhone) { 3692 phoneInp.value = formatPhone(String(storedPhone)); 3693 } else { 3694 // Si no, formateamos lo que traiga Handlebars 3695 phoneInp.value = formatPhone(phoneInp.value); 3696 } 3697 } 3698 }); 3699 updateAllForms(); 3700 } 3701 3702 let isUpdating = false; 3703 async function updateAllForms() { 3704 if (isUpdating) return; 3705 3706 const forms = document.querySelectorAll('#nl-subscription-form'); 3707 3708 // 1. Recopilar datos del formulario que tenga algo escrito 3709 let currentEmail = ""; 3710 let currentPhone = ""; 3711 3712 forms.forEach(f => { 3713 const e = f.querySelector('input[name="nl_email"]').value; 3714 const p = f.querySelector('input[name="nl_phone"]').value; 3715 if (e.length > currentEmail.length) currentEmail = e; 3716 if (p.length > currentPhone.length) currentPhone = p; 3717 }); 3718 3719 const isEmailOk = check.email(currentEmail); 3720 const isPhoneOk = check.phone(currentPhone); 3721 3722 if (currentEmail === cachedEmail && currentPhone === cachedPhone) { 3723 updateCheckboxStates(isEmailOk, isPhoneOk, currentEmail, currentPhone); 3724 return; 3725 } 3726 3727 isUpdating = true; 3728 try { 3729 // ONE consent lookup by email. check_consent is EMAIL-centric: given the email it 3730 // returns ALL of the contact's consents (marketing_email + marketing_sms), so we mark 3731 // BOTH checkboxes from that single response â no separate phone-only lookup (that one 3732 // couldn't reflect the contact's consents). Phone-only (valid phone, no valid email) 3733 // keeps its own lookup below. 3734 const markFromConsents = (consents) => { 3735 const emailStatus = consents?.marketing_email?.status?.toLowerCase(); 3736 const phoneStatus = consents?.marketing_sms?.status?.toLowerCase(); 3737 const emailChecked = emailStatus === 'granted' && consents?.marketing_email?.has_synced === true; 3738 const phoneChecked = phoneStatus === 'granted' && consents?.marketing_sms?.has_synced === true;
3739 forms.forEach(f => { 3740 const cbs = f.querySelectorAll('.nl-custom-cb'); 3741 if (cbs[0] && (emailStatus === 'granted' || emailStatus === 'declined')) cbs[0].checked = emailChecked; 3742 if (cbs[1] && isPhoneOk && (phoneStatus === 'granted' || phoneStatus === 'declined')) cbs[1].checked = phoneChecked; 3743 }); 3744 }; 3745 3746 if (isEmailOk && (currentEmail != cachedEmail || currentPhone != cachedPhone)) { 3747 try { 3748 const response = await loginHandler.getConsentStatus({ email: currentEmail, phone: isPhoneOk ? currentPhone : undefined }); 3749 cachedEmail = currentEmail; 3750 cachedPhone = currentPhone; 3751 emailRetryCount = 0; 3752 phoneRetryCount = 0; 3753 if (response?.success) markFromConsents(response.consents); // owner-guard may return undefined 3754 } catch (error) { 3755 if (lastRetriedEmail !== currentEmail) { 3756 lastRetriedEmail = currentEmail; 3757 emailRetryCount = 1; 3758 } else { 3759 emailRetryCount++; 3760 } 3761 if (emailRetryCount >= 3) { 3762 cachedEmail = currentEmail; 3763 cachedPhone = currentPhone; 3764 forms.forEach(f => { 3765 const cbs = f.querySelectorAll('.nl-custom-cb'); 3766 if (cbs[0]) cbs[0].checked = false; 3767 if (cbs[1] && isPhoneOk) cbs[1].checked = false; 3768 }); 3769 } else { 3770 throw error; 3771 } 3772 } 3773 } 3774 // No phone-only branch: consent lookup is ALWAYS email-driven (email returns all consents, 3775 // incl. marketing_sms). A valid phone without a valid owner email can't be resolved. 3776 3777 if (!isEmailOk) cachedEmail = ""; 3778 3779 updateCheckboxStates(isEmailOk, isPhoneOk, currentEmail, currentPhone); 3780 } catch (error) { 3781 console.error("Error in updateAllForms:", error); 3782 } finally { 3783 isUpdating = false; 3784 } 3785 } 3786 3787 function updateCheckboxStates(isEmailOk, isPhoneOk, currentEmail, currentPhone) { 3788 const forms = document.querySelectorAll('#nl-subscription-form'); 3789 forms.forEach(f => { 3790 const emailInp = f.querySelector('input[name="nl_email"]'); 3791 const phoneInp = f.querySelector('input[name="nl_phone"]'); 3792 const cbs = f.querySelectorAll('.nl-custom-cb'); 3793 3794 if (document.activeElement !== emailInp) emailInp.value = currentEmail; 3795 if (document.activeElement !== phoneInp) phoneInp.value = currentPhone; 3796 3797 if (cbs[0]) { 3798 cbs[0].disabled = !isEmailOk; 3799 if (!isEmailOk) cbs[0].checked = false; 3800 } 3801 if (cbs[1]) { 3802 cbs[1].disabled = !isPhoneOk; 3803 if (!isPhoneOk) cbs[1].checked = false; 3804 } 3805 }); 3806 } 3807 3808 let isProcessing = false; 3809 3810 document.addEventListener('change', async function(e) { 3811 const label = e.target.closest('.nl-cb-label'); 3812 if (!e.target.classList.contains('nl-custom-cb')) return; 3813 const checkbox = e.target; 3814 if (checkbox.disabled) return; 3815 3816 e.stopImmediatePropagation(); 3817 isProcessing = true; 3818 3819 const newState = !!checkbox.checked; 3820 const form = checkbox.closest('#nl-subscription-form'); 3821 const allCbs = Array.from(form.querySelectorAll('.nl-custom-cb')); 3822 const index = allCbs.indexOf(checkbox); 3823 3824 document.querySelectorAll('#nl-subscription-form').forEach(f => { 3825 const targets = f.querySelectorAll('.nl-custom-cb'); 3826 if (targets[index] && targets[index] !== checkbox) { 3827 targets[index].checked = newState; 3828 } 3829 }); 3830 3831 const { email, phone } = getFormData(); 3832 const action = newState ? 'GRANTED' : 'DECLINED'; 3833 const type = index === 0 ? 'MARKETING_EMAIL' : 'MARKETING_SMS'; 3834 const labelText = checkbox.closest('.nl-cb-label').querySelector('.nl-cb-text').innerText; 3835 const customerDetails = JSON.parse(localStorage.getItem('customer_details')) || {}; 3836 3837 try { 3838 if (loginHandler?.registerConsent) { 3839 await loginHandler.registerConsent( 3840 email || customerDetails.email, 3841 action, 3842 type, 3843 labelText, 3844 window.location.origin + '/privacy-policy', 3845 '1.0', 3846 null, 3847 null, 3848 { 3849 "url": window.location.origin, 3850 "page": window.location.pathname, 3851 "phone": phone || customerDetails.phone, 3852 "message": labelText, 3853 "navigator_datetime": new Date().toISOString(), 3854 "privacy_policy_language": "en", 3855 "rep_id": localStorage.getItem('repid') || null, 3856 "lead": true, 3857 "lead_source": "Website", 3858 "first_name": customerDetails.first_name || "", 3859 "last_name": customerDetails.last_name || "" 3860 }, 3861 null 3862 ); 3863 } 3864 if (type == "MARKETING_EMAIL") {
3865 notyf.success("Thank you for joining our mailing list. You'll be sent the next issue of our newsletter shortly"); 3866 } else { 3867 notyf.success("Thank you for joining our SMS mailing list. You'll be sent the next issue of our newsletter shortly"); 3868 } 3869 } catch (err) { 3870 console.error('[Consent] Error:', err); 3871 notyf.error('Error registering consent, please try again later'); 3872 } finally { 3873 setTimeout(() => { isProcessing = false; }, 100); 3874 } 3875 }, true); 3876 3877 document.addEventListener('input', (e) => { 3878 if (e.target.name === 'nl_email' || e.target.name === 'nl_phone') { 3879 3880 const newValue = e.target.value; 3881 3882 document.querySelectorAll('#nl-subscription-form').forEach(f => { 3883 const emailInp = f.querySelector('input[name="nl_email"]'); 3884 const phoneInp = f.querySelector('input[name="nl_phone"]'); 3885 const cbs = f.querySelectorAll('.nl-custom-cb'); 3886 3887 if (e.target.name === 'nl_email' && emailInp !== e.target) { 3888 emailInp.value = newValue; 3889 } 3890 if (e.target.name === 'nl_phone' && phoneInp !== e.target) { 3891 phoneInp.value = newValue; 3892 } 3893 3894 if (e.target.name === 'nl_email' && cbs[0]) { 3895 cbs[0].checked = false; 3896 cbs[0].disabled = true; 3897 } 3898 if (e.target.name === 'nl_phone' && cbs[1]) { 3899 cbs[1].checked = false; 3900 cbs[1].disabled = true; 3901 } 3902 }); 3903 3904 } 3905 3906 if (e.target.name === 'nl_phone') { 3907 let digits = e.target.value.replace(/\D/g, ''); 3908 if (digits.length > 0 && !digits.startsWith('1')) digits = '1' + digits; 3909 e.target.value = digits.length > 0 ? '+' + digits.slice(0, 11) : ''; 3910 } 3911 3912 updateAllForms(); 3913 }); 3914 3915 // Wait for the full document to parse before the first pass: footer.html renders this partial 3916 // twice (.mobile-version + .web-version), and this script runs inline as the FIRST copy parses 3917 // â the second copy's form doesn't exist in the DOM yet. Running here (instead of immediately) 3918 // guarantees querySelectorAll('#nl-subscription-form') sees both by the time markFromConsents runs. 3919 function boot() { 3920 initFormValues(); 3921 setInterval(updateAllForms, 1000); 3922 } 3923 if (document.readyState === 'loading') { 3924 document.addEventListener('DOMContentLoaded', boot); 3925 } else { 3926 boot(); 3927 } 3928 3929 // bfcache restore (back/forward button) resumes this exact JS state without re-running any 3930 //
3930<script> tag, so cachedEmail/cachedPhone can be stale â force a fresh consent check. 3931 window.addEventListener('pageshow', function (e) { 3932 if (!e.persisted) return; 3933 cachedEmail = ""; 3934 cachedPhone = ""; 3935 updateAllForms(); 3936 }); 3937})(); 3938</script>
3938 </article> 3939 <article class="footer-info-col footer-info-col--small logo-section-wrapper" data-section-type="footer-categories"> 3940 <div class="logo-section"> 3941 <svg class="footer--logo"></svg> 3942 <p class="footer-logo-down-text">Pink Zebra's mission is to change the lives of all those who use our home fragrance products. We proudly produce all our fragrance products right here in the USA in Sugar Land, TX!</p> 3943 </div> 3944 </article> 3945 <div class="mobile-version"> 3946 <div class="socialLinks-wrapper"> 3947 <p class="sosial-links-paragraph">Sprinkle. Snap. Share.</p> 3948 <ul class="socialLinks socialLinks--alt"> 3949 <li class="socialLinks-item"> 3950 <a class="icon icon--facebook" 3951 href="https://www.facebook.com/PinkZebraHome/" 3952 target="_blank" 3953 rel="noopener" 3954 title="Facebook" 3955 > 3956 <span class="aria-description--hidden">Facebook</span> 3957 <svg class="facebook-icon"> 3958 <use href="#icon-facebook"/> 3959 </svg> 3960 </a> 3961 </li> 3962 <li class="socialLinks-item"> 3963 <a class="icon icon--instagram" 3964 href="https://www.instagram.com/pinkzebrahome/" 3965 target="_blank" 3966 rel="noopener" 3967 title="Instagram" 3968 > 3969 <span class="aria-description--hidden">Instagram</span> 3970 <svg class="instagram-icon"> 3971 <use href="#icon-instagram"/> 3972 </svg> 3973 </a> 3974 </li> 3975 <li class="socialLinks-item"> 3976 <a class="icon icon--youtube" 3977 href="https://www.youtube.com/user/PaisleyPinkZebra" 3978 target="_blank" 3979 rel="noopener" 3980 title="Youtube" 3981 > 3982 <span class="aria-description--hidden">Youtube</span> 3983 <svg class="youtube-icon"> 3984 <use href="#icon-youtube"/> 3985 </svg> 3986 </a> 3987 </li> 3988 <li class="socialLinks-item"> 3989 <a class="icon icon--" 3990 href="https://www.tiktok.com/@pinkzebrahome" 3991 target="_blank" 3992 rel="noopener" 3993 title="Tiktok" 3994 > 3995 <span class="aria-description--hidden">Tiktok</span> 3996 <svg class="tiktok-icon"> 3997 <use href="#icon-tiktok"/> 3998 </svg> 3999 </a> 4000 </li> 4001 <li class="socialLinks-item"> 4002 <a class="icon icon--pinterest" 4003 href="https://www.pinterest.com/pinkzebrahome/" 4004 target="_blank" 4005 rel="noopener" 4006 title="Pinterest" 4007 > 4008 <span class="aria-description--hidden">Pinterest</span> 4009 <svg class="pinterest-icon"> 4010 <use href="#icon-pinterest"/> 4011 </svg> 4012 </a> 4013 </li> 4014 </ul> 4015</div> 4016 </div> 4017 4018 <article class="footer-info-col footer-info-col--small links-section mobile-version" data-section-type="footer-categories"> 4019 <div class="have-questions-block"> 4020 <h3 class="footer-info-heading">HAVE QUESTIONS? WE HAVE ANSWERS</h3> 4021 <div class="have-questions-block-wrapper"> 4022 <a class="have-questions-block-item web-version" href="tel:8557465932"> 4023 <span class="have-questions-block-item-span"> 4024 <svg class="pz-phone-icon"> 4025 <use href="#icon-PZ_Phone"></use> 4026 </svg> 4027 </span> 4028 <span class="have-questions-block-item-span phone">855-746-5932</span> 4029</a> 4030 <a class="have-questions-block-item web-version" href="mailto:[email protected]"> 4031 <span class="have-questions-block-item-span"> 4032 <svg class="pz-email-2-icon"> 4033 <use href="#icon-email_2"></use> 4034 </svg> 4035 </span> 4036 <span class="have-questions-block-item-span" >
4036[email protected]</span> 4037</a> 4038</div> 4039 </div> 4040 </article> 4041 <article class="footer-info-col footer-info-col--small links-section" data-section-type="footer-categories"> 4042 <button type="button" class="collapsible toggle-title open-collapse-button" data-mobile-button-name="QUICK LINKS"> 4043 <div class="collapsible-button-name-wrapper"> 4044 <span>QUICK LINKS</span> 4045 <a class="shop-up-to-list-item" data-mobile-button-name="QUICK LINKS"></a> 4046 </div> 4047 <span class="no-active-tab"> 4048 4049 <svg class="plus-icon"> 4050 <use href="#icon-plus"></use> 4051 </svg> 4052 4053 </span> 4054 <span class="active-tab"> 4055 <svg class="minus-icon"> 4056 <use href="#icon-minus"></use> 4057 </svg> 4058 </span> 4059</button> 4060 <div class="content"> 4061 <div data-content-region="footer-info-col-1--global"><div data-layout-id="773bc94e-7bed-4ef0-8006-6f6cef32f07f"> <div data-sub-layout-container="36401381-fdb5-44a0-b7f5-678dbc78f780" data-layout-name="Layout"> 4062 <style data-container-styling="36401381-fdb5-44a0-b7f5-678dbc78f780"> 4063 [data-sub-layout-container="36401381-fdb5-44a0-b7f5-678dbc78f780"] { 4064 box-sizing: border-box; 4065 display: flex; 4066 flex-wrap: wrap; 4067 z-index: 0; 4068 position: relative; 4069 height: ; 4070 padding-top: 0px; 4071 padding-right: 0px; 4072 padding-bottom: 0px; 4073 padding-left: 0px; 4074 margin-top: 0px; 4075 margin-right: 0px; 4076 margin-bottom: 0px; 4077 margin-left: 0px; 4078 border-width: 0px; 4079 border-style: solid; 4080 border-color: #333333; 4081 } 4082 4083 [data-sub-layout-container="36401381-fdb5-44a0-b7f5-678dbc78f780"]:after { 4084 display: block; 4085 position: absolute; 4086 top: 0; 4087 left: 0; 4088 bottom: 0; 4089 right: 0; 4090 background-size: cover; 4091 z-index: auto; 4092 } 4093 </style> 4094 4095 <div data-sub-layout="c083c3c8-60a3-46ad-b4c7-7d67c078df6a"> 4096 <style data-column-styling="c083c3c8-60a3-46ad-b4c7-7d67c078df6a"> 4097 [data-sub-layout="c083c3c8-60a3-46ad-b4c7-7d67c078df6a"] { 4098 display: flex; 4099 flex-direction: column; 4100 box-sizing: border-box; 4101 flex-basis: 100%; 4102 max-width: 100%; 4103 z-index: 0; 4104 position: relative; 4105 height: ; 4106 padding-top: 0px; 4107 padding-right: 10.5px; 4108 padding-bottom: 0px; 4109 padding-left: 10.5px; 4110 margin-top: 0px; 4111 margin-right: 0px; 4112 margin-bottom: 0px; 4113 margin-left: 0px; 4114 border-width: 0px; 4115 border-style: solid; 4116 border-color: #333333; 4117 justify-content: center; 4118 } 4119 [data-sub-layout="c083c3c8-60a3-46ad-b4c7-7d67c078df6a"]:after { 4120 display: block; 4121 position: absolute; 4122 top: 0; 4123 left: 0; 4124 bottom: 0; 4125 right: 0; 4126 background-size: cover; 4127 z-index: auto; 4128 } 4129 @media only screen and (max-width: 700px) { 4130 [data-sub-layout="c083c3c8-60a3-46ad-b4c7-7d67c078df6a"] { 4131 flex-basis: 100%; 4132 max-width: 100%; 4133 } 4134 } 4135 </style> 4136 <div data-widget-id="1f7e7db3-9d13-42dc-8fb9-05dc9a5d68ad" data-placement-id="3afee65a-7618-4c81-badf-2301a4928d37" data-placement-status="ACTIVE"><style> 4137 ul.footer-info-list li a.section-links:hover { 4138 color: #ff1378 !important; 4139 text-decoration: none; 4140 } 4141 .section-links.link-color { 4142 color:; 4143 } 4144</style> 4145 4146 4147<ul class="footer-info-list"> 4148 <li><a href="#" class="footer-heading-link"><b>Quick Links</b></a></li> 4149 4150 <li><a class="section-links link-color" href="/shop-by-fragrance/fragrance/">Shop Fragrances</a></li> 4151 <li><a class="section-links link-color" href="/shop-new-products" style="color:rgba(0,0,0,1);">Shop New Collection</a></li> 4152 <li><a class="section-links link-color" href="/scentflirt" style="color:rgba(0,0,0,1);">ScentFlirt Subscription</a></li> 4153 <li><a class="section-links link-color" href="/scentflirt-exclusive" style="color:rgba(0,0,0,1);">ScentFlirt Exclusive</a></li> 4154 <li><a class="section-links link-color" href="/pztv" style="color:rgba(0,0,0,1);">Watch PZTV</a></li> 4155 <li><a class="section-links link-color" href="/share-and-earn">Share & Earn</a></li> 4156 <li><a class="section-links link-color" href="/sell-pink-zebra" style="color:rgba(0,0,0,1);">Sell Pink Zebra</a></li> 4157 <li><a class="section-links link-color" href="">Find a Consultant</a></li> 4158</ul></div> 4159 </div> 4160</div> 4161 4162</div></div> 4163 </div> 4164 </article> 4165 <article class="footer-info-col footer-info-col--small links-section" data-section-type="footer-categories"> 4166 <button type="button" class="collapsible toggle-title open-collapse-button" data-mobile-button-name="CUSTOMER CARE"> 4167 <div class="collapsible-button-name-wrapper">
4168 <span>CUSTOMER CARE</span> 4169 <a class="shop-up-to-list-item" data-mobile-button-name="CUSTOMER CARE"></a> 4170 </div> 4171 <span class="no-active-tab"> 4172 4173 <svg class="plus-icon"> 4174 <use href="#icon-plus"></use> 4175 </svg> 4176 4177 </span> 4178 <span class="active-tab"> 4179 <svg class="minus-icon"> 4180 <use href="#icon-minus"></use> 4181 </svg> 4182 </span> 4183</button> 4184 <div class="content"> 4185 <div data-content-region="footer-info-col-2--global"><div data-layout-id="49c83bb1-5070-4ae6-92ab-c361dbfac29e"> <div data-sub-layout-container="3fe70549-ad64-4141-80b0-22918c2b823b" data-layout-name="Layout"> 4186 <style data-container-styling="3fe70549-ad64-4141-80b0-22918c2b823b"> 4187 [data-sub-layout-container="3fe70549-ad64-4141-80b0-22918c2b823b"] { 4188 box-sizing: border-box; 4189 display: flex; 4190 flex-wrap: wrap; 4191 z-index: 0; 4192 position: relative; 4193 height: ; 4194 padding-top: 0px; 4195 padding-right: 0px; 4196 padding-bottom: 0px; 4197 padding-left: 0px; 4198 margin-top: 0px; 4199 margin-right: 0px; 4200 margin-bottom: 0px; 4201 margin-left: 0px; 4202 border-width: 0px; 4203 border-style: solid; 4204 border-color: #333333; 4205 } 4206 4207 [data-sub-layout-container="3fe70549-ad64-4141-80b0-22918c2b823b"]:after { 4208 display: block; 4209 position: absolute; 4210 top: 0; 4211 left: 0; 4212 bottom: 0; 4213 right: 0; 4214 background-size: cover; 4215 z-index: auto; 4216 } 4217 </style> 4218 4219 <div data-sub-layout="f8a8d6ef-663a-4968-90d2-aac51c2c571b"> 4220 <style data-column-styling="f8a8d6ef-663a-4968-90d2-aac51c2c571b"> 4221 [data-sub-layout="f8a8d6ef-663a-4968-90d2-aac51c2c571b"] { 4222 display: flex; 4223 flex-direction: column; 4224 box-sizing: border-box; 4225 flex-basis: 100%; 4226 max-width: 100%; 4227 z-index: 0; 4228 position: relative; 4229 height: ; 4230 padding-top: 0px; 4231 padding-right: 10.5px; 4232 padding-bottom: 0px; 4233 padding-left: 10.5px; 4234 margin-top: 0px; 4235 margin-right: 0px; 4236 margin-bottom: 0px; 4237 margin-left: 0px; 4238 border-width: 0px; 4239 border-style: solid; 4240 border-color: #333333; 4241 justify-content: center; 4242 } 4243 [data-sub-layout="f8a8d6ef-663a-4968-90d2-aac51c2c571b"]:after { 4244 display: block; 4245 position: absolute; 4246 top: 0; 4247 left: 0; 4248 bottom: 0; 4249 right: 0; 4250 background-size: cover; 4251 z-index: auto; 4252 } 4253 @media only screen and (max-width: 700px) { 4254 [data-sub-layout="f8a8d6ef-663a-4968-90d2-aac51c2c571b"] { 4255 flex-basis: 100%; 4256 max-width: 100%; 4257 } 4258 } 4259 </style> 4260 <div data-widget-id="8eb3cabf-661b-41df-a7c3-7e6beaa4dd3e" data-placement-id="89d05daa-dc53-4955-af38-f76696636aeb" data-placement-status="ACTIVE"><style> 4261 ul.footer-info-list li a.section-links:hover { 4262 color: #ff1378 !important; 4263 text-decoration: none; 4264 } 4265 .section-links.link-color { 4266 color:; 4267 } 4268</style> 4269 4270 4271<ul class="footer-info-list"> 4272 <li class="custom-care"><a href="#" class="footer-heading-link"><b>Customer care</b></a></li> 4273 4274 <li><a class="section-links link-color" href="/returns-and-exchanges" style="color:rgba(0,0,0,1);">Returns/Exchanges</a></li> 4275 <li><a class="section-links link-color" href="/faq">FAQ</a></li> 4276 <li><a class="section-links link-color" href="/contact">Contact Us</a></li> 4277</ul></div> 4278 </div> 4279</div> 4280 4281</div></div> 4282 </div> 4283 </article> 4284 <article class="footer-info-col footer-info-col--small links-section" data-section-type="footer-categories"> 4285 <button type="button" class="collapsible toggle-title open-collapse-button" data-mobile-button-name="COMPANY"> 4286 <div class="collapsible-button-name-wrapper">
4287 <span>COMPANY</span> 4288 <a class="shop-up-to-list-item" data-mobile-button-name="COMPANY"></a> 4289 </div> 4290 <span class="no-active-tab"> 4291 4292 <svg class="plus-icon"> 4293 <use href="#icon-plus"></use> 4294 </svg> 4295 4296 </span> 4297 <span class="active-tab"> 4298 <svg class="minus-icon"> 4299 <use href="#icon-minus"></use> 4300 </svg> 4301 </span> 4302</button> 4303 <div class="content"> 4304 <div data-content-region="footer-info-col-3--global"><div data-layout-id="e186c4f3-f261-4408-b33e-95e6c144d8b8"> <div data-sub-layout-container="e6f0074c-7474-425b-aa21-122e6568df0b" data-layout-name="Layout"> 4305 <style data-container-styling="e6f0074c-7474-425b-aa21-122e6568df0b"> 4306 [data-sub-layout-container="e6f0074c-7474-425b-aa21-122e6568df0b"] { 4307 box-sizing: border-box; 4308 display: flex; 4309 flex-wrap: wrap; 4310 z-index: 0; 4311 position: relative; 4312 height: ; 4313 padding-top: 0px; 4314 padding-right: 0px; 4315 padding-bottom: 0px; 4316 padding-left: 0px; 4317 margin-top: 0px; 4318 margin-right: 0px; 4319 margin-bottom: 0px; 4320 margin-left: 0px; 4321 border-width: 0px; 4322 border-style: solid; 4323 border-color: #333333; 4324 } 4325 4326 [data-sub-layout-container="e6f0074c-7474-425b-aa21-122e6568df0b"]:after { 4327 display: block; 4328 position: absolute; 4329 top: 0; 4330 left: 0; 4331 bottom: 0; 4332 right: 0; 4333 background-size: cover; 4334 z-index: auto; 4335 } 4336 </style> 4337 4338 <div data-sub-layout="7a0dfc47-d409-42e4-a4ee-9dc36a98c610"> 4339 <style data-column-styling="7a0dfc47-d409-42e4-a4ee-9dc36a98c610"> 4340 [data-sub-layout="7a0dfc47-d409-42e4-a4ee-9dc36a98c610"] { 4341 display: flex; 4342 flex-direction: column; 4343 box-sizing: border-box; 4344 flex-basis: 100%; 4345 max-width: 100%; 4346 z-index: 0; 4347 position: relative; 4348 height: ; 4349 padding-top: 0px; 4350 padding-right: 10.5px; 4351 padding-bottom: 0px; 4352 padding-left: 10.5px; 4353 margin-top: 0px; 4354 margin-right: 0px; 4355 margin-bottom: 0px; 4356 margin-left: 0px; 4357 border-width: 0px; 4358 border-style: solid; 4359 border-color: #333333; 4360 justify-content: center; 4361 } 4362 [data-sub-layout="7a0dfc47-d409-42e4-a4ee-9dc36a98c610"]:after { 4363 display: block; 4364 position: absolute; 4365 top: 0; 4366 left: 0; 4367 bottom: 0; 4368 right: 0; 4369 background-size: cover; 4370 z-index: auto; 4371 } 4372 @media only screen and (max-width: 700px) { 4373 [data-sub-layout="7a0dfc47-d409-42e4-a4ee-9dc36a98c610"] { 4374 flex-basis: 100%; 4375 max-width: 100%; 4376 } 4377 } 4378 </style> 4379 <div data-widget-id="bc4503fb-3bb5-4ec5-8a94-615a57d2109b" data-placement-id="a853dc02-5035-4f3a-8727-4623e7bff301" data-placement-status="ACTIVE"><style> 4380 ul.footer-info-list li a.section-links:hover { 4381 color: #ff1378 !important; 4382 text-decoration: none; 4383 } 4384 .section-links.link-color { 4385 color:; 4386 } 4387</style> 4388 4389 4390<ul class="footer-info-list"> 4391 <li><a href="#" class="footer-heading-link"><b>COMPANY</b></a></li> 4392 4393 <li><a class="section-links link-color" href="/our-culture" style="color:rgba(0,0,0,1);">Our Culture </a></li> 4394 <li><a class="section-links link-color" href="/our-ingredients">Our Ingredients</a></li> 4395 <li><a class="section-links link-color" href="/heroes">Heroes Charitable Program</a></li> 4396</ul></div> 4397 </div> 4398</div> 4399 4400</div></div> 4401 </div> 4402 </article>
4403 <article class="footer-info-col info-col-subscribe web-version" data-section-type="newsletterSubscription"> 4404 <h3 class="footer-info-heading web-version">Be the first to hear about new products, sales and more!</h3> 4405<!-- <div class="subscription-form-heading-wrapper mobile-version"> --> 4406 4407 <!-- <h3 class="footer-info-heading">Join our </h3> 4408 <h3 class="footer-info-heading-newsletter"> Newsletter</h3> 4409 <div class="subscription-form-heading-decor"></div> --> 4410<!-- </div> --> 4411<!-- <p class="exlusive-offerse">Be the first to hear about new products, sales and more!</p> --> 4412 4413<form class="form" action="https://pinkzebrahome.com/subscribe.php" method="post" id="nl-subscription-form"> 4414 <fieldset class="form-fieldset"> 4415 <input type="hidden" name="action" value="subscribe"> 4416 <input type="hidden" name="nl_first_name" id="nl_first_name" value="bc"> 4417 <input type="hidden" name="check" value="1"> 4418 4419 <div class="form-field"> 4420 <label class="form-label is-srOnly" for="nl_email">Email Address</label> 4421 <div class="form-prefixPostfix wrap"> 4422 <!-- Data Inputs --> 4423 <input class="form-input" 4424 id="nl_email" 4425 name="nl_email" 4426 type="email" 4427 value="" 4428 placeholder="Enter email" 4429 required 4430 > 4431 4432 <input class="form-input mt-3" 4433 id="nl_phone" 4434 name="nl_phone" 4435 type="text" 4436 value="+1" 4437 placeholder="Enter phone number" 4438 required 4439 > 4440 4441 <!-- Checkboxes (Listening to inputs to enable/disable) --> 4442 <div class="nl-legal-container"> 4443 4444 <div class="nl-checkbox-row"> 4445 <label class="nl-cb-label"> 4446 <input type="checkbox" class="nl-custom-cb" disabled> 4447 <span class="nl-cb-box"></span> 4448 <span class="nl-cb-text">Yes, Iâd like to receive marketing emails from Pink Zebra Home.</span> 4449 </label> 4450 </div> 4451 4452 <div class="nl-checkbox-row"> 4453 <label class="nl-cb-label"> 4454 <input type="checkbox" class="nl-custom-cb" disabled> 4455 <span class="nl-cb-box"></span> 4456 <span class="nl-cb-text">Yes, I'd like to receive marketing text messages from Pink Zebra Home.</span> 4457 </label> 4458 </div> 4459 4460 <div class="nl-checkbox-row"> 4461 <div class="legal-info"> 4462 <p style="margin:0">For more information on how we process your data for marketing communication. View our <a href="/privacy-policy" target="_blank">Privacy Policy</a></p> 4463 </div> 4464 </div> 4465 </div> 4466 4467 <!-- <input class="button button--primary form-prefixPostfix-button--postfix ms-0 mt-3" 4468 type="submit" 4469 value="Sign me Up" 4470 > --> 4471 </div> 4472 </div> 4473 </fieldset> 4474</form> 4475 4476<style> 4477 .nl-cb-label { 4478 display: flex; 4479 align-items: center; 4480 cursor: pointer; 4481 font-size: 12px; 4482 opacity: 0.4; 4483 transition: opacity 0.3s; 4484 /* Quitamos pointer-events: none para que siempre sea clickeable el área */ 4485 } 4486 4487 /* Cuando el input hijo NO está disabled, aclaramos el label */ 4488 .nl-cb-label:has(.nl-custom-cb:not(:disabled)) { 4489 opacity: 1; 4490 } 4491 4492 .nl-custom-cb { 4493 position: absolute; 4494 opacity: 0; 4495 width: 0; 4496 height: 0; 4497 } 4498 4499 .nl-cb-box { 4500 width: 16px; 4501 height: 16px; 4502 border: 2px solid #fe1378; 4503 border-radius: 3px; 4504 margin-right: 8px; 4505 flex-shrink: 0; 4506 position: relative; 4507 } 4508 4509 @media (max-width: 768px) { 4510 .nl-cb-box { 4511 border-color: #ffffff; 4512 } 4513 } 4514 4515 .nl-custom-cb:checked + .nl-cb-box { 4516 background-color: #fe1378; 4517 } 4518 4519 .nl-custom-cb:checked + .nl-cb-box::after { 4520 content: '\2713'; 4521 position: absolute; 4522 color: #fff; 4523 font-size: 11px; 4524 top: 50%; 4525 left: 50%; 4526 transform: translate(-50%, -50%); 4527 } 4528</style> 4529
4530<script> 4531(function () { 4532 // footer.html renders this partial twice (.mobile-version + .web-version, CSS toggles which 4533 // shows) â guard so only the first copy's script wires up listeners/interval; it already 4534 // operates on ALL '#nl-subscription-form' matches, so the duplicate copy needs no init of its own. 4535 if (window.__nlSubscriptionFormInit) return; 4536 window.__nlSubscriptionFormInit = true; 4537 4538 let cachedEmail = ""; 4539 let cachedPhone = ""; 4540 let emailRetryCount = 0; 4541 let phoneRetryCount = 0; 4542 let lastRetriedEmail = ""; 4543 let lastRetriedPhone = ""; 4544 const check = { 4545 email: (val) => /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(val.trim()), 4546 phone: (val) => { 4547 const digits = val.replace(/\D/g, ''); 4548 return digits.length === 11 && digits.startsWith('1'); 4549 } 4550 }; 4551 4552 function getFormData() { 4553 const forms = document.querySelectorAll('#nl-subscription-form'); 4554 let email = "", phone = ""; 4555 forms.forEach(f => { 4556 const emailInp = f.querySelector('input[name="nl_email"]'); 4557 const phoneInp = f.querySelector('input[name="nl_phone"]'); 4558 const e = emailInp ? emailInp.value : ""; 4559 const p = phoneInp ? phoneInp.value : ""; 4560 if (e.length > email.length) email = e; 4561 if (p.length > phone.length) phone = p; 4562 }); 4563 return { email, phone }; 4564 } 4565 4566 function formatPhone(val) { 4567 if (!val || val === '+1') return '+1'; 4568 let digits = String(val).replace(/\D/g, ''); 4569 if (digits.startsWith('1')) { 4570 digits = digits.substring(1); 4571 } 4572 return '+1' + digits; 4573 } 4574 4575 function initFormValues() { 4576 const customerDetails = JSON.parse(localStorage.getItem('customer_details')) || {}; 4577 const forms = document.querySelectorAll('#nl-subscription-form'); 4578 4579 forms.forEach(f => { 4580 const emailInp = f.querySelector('input[name="nl_email"]'); 4581 const phoneInp = f.querySelector('input[name="nl_phone"]'); 4582 4583 // 1. Priorizamos LocalStorage si existe data de la API 4584 if (emailInp && customerDetails.email) { 4585 emailInp.value = customerDetails.email; 4586 } 4587 4588 if (phoneInp) { 4589 const storedPhone = customerDetails.phone || customerDetails.mobile_number; 4590 4591 // Si la API tiene un teléfono, lo usamos (aunque sea el "5") 4592 if (storedPhone) { 4593 phoneInp.value = formatPhone(String(storedPhone)); 4594 } else { 4595 // Si no, formateamos lo que traiga Handlebars 4596 phoneInp.value = formatPhone(phoneInp.value); 4597 } 4598 } 4599 }); 4600 updateAllForms(); 4601 } 4602 4603 let isUpdating = false; 4604 async function updateAllForms() { 4605 if (isUpdating) return; 4606 4607 const forms = document.querySelectorAll('#nl-subscription-form'); 4608 4609 // 1. Recopilar datos del formulario que tenga algo escrito 4610 let currentEmail = ""; 4611 let currentPhone = ""; 4612 4613 forms.forEach(f => { 4614 const e = f.querySelector('input[name="nl_email"]').value; 4615 const p = f.querySelector('input[name="nl_phone"]').value; 4616 if (e.length > currentEmail.length) currentEmail = e; 4617 if (p.length > currentPhone.length) currentPhone = p; 4618 }); 4619 4620 const isEmailOk = check.email(currentEmail); 4621 const isPhoneOk = check.phone(currentPhone); 4622 4623 if (currentEmail === cachedEmail && currentPhone === cachedPhone) { 4624 updateCheckboxStates(isEmailOk, isPhoneOk, currentEmail, currentPhone); 4625 return; 4626 } 4627 4628 isUpdating = true; 4629 try { 4630 // ONE consent lookup by email. check_consent is EMAIL-centric: given the email it 4631 // returns ALL of the contact's consents (marketing_email + marketing_sms), so we mark 4632 // BOTH checkboxes from that single response â no separate phone-only lookup (that one 4633 // couldn't reflect the contact's consents). Phone-only (valid phone, no valid email) 4634 // keeps its own lookup below. 4635 const markFromConsents = (consents) => { 4636 const emailStatus = consents?.marketing_email?.status?.toLowerCase(); 4637 const phoneStatus = consents?.marketing_sms?.status?.toLowerCase(); 4638 const emailChecked = emailStatus === 'granted' && consents?.marketing_email?.has_synced === true; 4639 const phoneChecked = phoneStatus === 'granted' && consents?.marketing_sms?.has_synced === true;
4640 forms.forEach(f => { 4641 const cbs = f.querySelectorAll('.nl-custom-cb'); 4642 if (cbs[0] && (emailStatus === 'granted' || emailStatus === 'declined')) cbs[0].checked = emailChecked; 4643 if (cbs[1] && isPhoneOk && (phoneStatus === 'granted' || phoneStatus === 'declined')) cbs[1].checked = phoneChecked; 4644 }); 4645 }; 4646 4647 if (isEmailOk && (currentEmail != cachedEmail || currentPhone != cachedPhone)) { 4648 try { 4649 const response = await loginHandler.getConsentStatus({ email: currentEmail, phone: isPhoneOk ? currentPhone : undefined }); 4650 cachedEmail = currentEmail; 4651 cachedPhone = currentPhone; 4652 emailRetryCount = 0; 4653 phoneRetryCount = 0; 4654 if (response?.success) markFromConsents(response.consents); // owner-guard may return undefined 4655 } catch (error) { 4656 if (lastRetriedEmail !== currentEmail) { 4657 lastRetriedEmail = currentEmail; 4658 emailRetryCount = 1; 4659 } else { 4660 emailRetryCount++; 4661 } 4662 if (emailRetryCount >= 3) { 4663 cachedEmail = currentEmail; 4664 cachedPhone = currentPhone; 4665 forms.forEach(f => { 4666 const cbs = f.querySelectorAll('.nl-custom-cb'); 4667 if (cbs[0]) cbs[0].checked = false; 4668 if (cbs[1] && isPhoneOk) cbs[1].checked = false; 4669 }); 4670 } else { 4671 throw error; 4672 } 4673 } 4674 } 4675 // No phone-only branch: consent lookup is ALWAYS email-driven (email returns all consents, 4676 // incl. marketing_sms). A valid phone without a valid owner email can't be resolved. 4677 4678 if (!isEmailOk) cachedEmail = ""; 4679 4680 updateCheckboxStates(isEmailOk, isPhoneOk, currentEmail, currentPhone); 4681 } catch (error) { 4682 console.error("Error in updateAllForms:", error); 4683 } finally { 4684 isUpdating = false; 4685 } 4686 } 4687 4688 function updateCheckboxStates(isEmailOk, isPhoneOk, currentEmail, currentPhone) { 4689 const forms = document.querySelectorAll('#nl-subscription-form'); 4690 forms.forEach(f => { 4691 const emailInp = f.querySelector('input[name="nl_email"]'); 4692 const phoneInp = f.querySelector('input[name="nl_phone"]'); 4693 const cbs = f.querySelectorAll('.nl-custom-cb'); 4694 4695 if (document.activeElement !== emailInp) emailInp.value = currentEmail; 4696 if (document.activeElement !== phoneInp) phoneInp.value = currentPhone; 4697 4698 if (cbs[0]) { 4699 cbs[0].disabled = !isEmailOk; 4700 if (!isEmailOk) cbs[0].checked = false; 4701 } 4702 if (cbs[1]) { 4703 cbs[1].disabled = !isPhoneOk; 4704 if (!isPhoneOk) cbs[1].checked = false; 4705 } 4706 }); 4707 } 4708 4709 let isProcessing = false; 4710 4711 document.addEventListener('change', async function(e) { 4712 const label = e.target.closest('.nl-cb-label'); 4713 if (!e.target.classList.contains('nl-custom-cb')) return; 4714 const checkbox = e.target; 4715 if (checkbox.disabled) return; 4716 4717 e.stopImmediatePropagation(); 4718 isProcessing = true; 4719 4720 const newState = !!checkbox.checked; 4721 const form = checkbox.closest('#nl-subscription-form'); 4722 const allCbs = Array.from(form.querySelectorAll('.nl-custom-cb')); 4723 const index = allCbs.indexOf(checkbox); 4724 4725 document.querySelectorAll('#nl-subscription-form').forEach(f => { 4726 const targets = f.querySelectorAll('.nl-custom-cb'); 4727 if (targets[index] && targets[index] !== checkbox) { 4728 targets[index].checked = newState; 4729 } 4730 }); 4731 4732 const { email, phone } = getFormData(); 4733 const action = newState ? 'GRANTED' : 'DECLINED'; 4734 const type = index === 0 ? 'MARKETING_EMAIL' : 'MARKETING_SMS'; 4735 const labelText = checkbox.closest('.nl-cb-label').querySelector('.nl-cb-text').innerText; 4736 const customerDetails = JSON.parse(localStorage.getItem('customer_details')) || {}; 4737 4738 try { 4739 if (loginHandler?.registerConsent) { 4740 await loginHandler.registerConsent( 4741 email || customerDetails.email, 4742 action, 4743 type, 4744 labelText, 4745 window.location.origin + '/privacy-policy', 4746 '1.0', 4747 null, 4748 null, 4749 { 4750 "url": window.location.origin, 4751 "page": window.location.pathname, 4752 "phone": phone || customerDetails.phone, 4753 "message": labelText, 4754 "navigator_datetime": new Date().toISOString(), 4755 "privacy_policy_language": "en", 4756 "rep_id": localStorage.getItem('repid') || null, 4757 "lead": true, 4758 "lead_source": "Website", 4759 "first_name": customerDetails.first_name || "", 4760 "last_name": customerDetails.last_name || "" 4761 }, 4762 null 4763 ); 4764 } 4765 if (type == "MARKETING_EMAIL") {
4766 notyf.success("Thank you for joining our mailing list. You'll be sent the next issue of our newsletter shortly"); 4767 } else { 4768 notyf.success("Thank you for joining our SMS mailing list. You'll be sent the next issue of our newsletter shortly"); 4769 } 4770 } catch (err) { 4771 console.error('[Consent] Error:', err); 4772 notyf.error('Error registering consent, please try again later'); 4773 } finally { 4774 setTimeout(() => { isProcessing = false; }, 100); 4775 } 4776 }, true); 4777 4778 document.addEventListener('input', (e) => { 4779 if (e.target.name === 'nl_email' || e.target.name === 'nl_phone') { 4780 4781 const newValue = e.target.value; 4782 4783 document.querySelectorAll('#nl-subscription-form').forEach(f => { 4784 const emailInp = f.querySelector('input[name="nl_email"]'); 4785 const phoneInp = f.querySelector('input[name="nl_phone"]'); 4786 const cbs = f.querySelectorAll('.nl-custom-cb'); 4787 4788 if (e.target.name === 'nl_email' && emailInp !== e.target) { 4789 emailInp.value = newValue; 4790 } 4791 if (e.target.name === 'nl_phone' && phoneInp !== e.target) { 4792 phoneInp.value = newValue; 4793 } 4794 4795 if (e.target.name === 'nl_email' && cbs[0]) { 4796 cbs[0].checked = false; 4797 cbs[0].disabled = true; 4798 } 4799 if (e.target.name === 'nl_phone' && cbs[1]) { 4800 cbs[1].checked = false; 4801 cbs[1].disabled = true; 4802 } 4803 }); 4804 4805 } 4806 4807 if (e.target.name === 'nl_phone') { 4808 let digits = e.target.value.replace(/\D/g, ''); 4809 if (digits.length > 0 && !digits.startsWith('1')) digits = '1' + digits; 4810 e.target.value = digits.length > 0 ? '+' + digits.slice(0, 11) : ''; 4811 } 4812 4813 updateAllForms(); 4814 }); 4815 4816 // Wait for the full document to parse before the first pass: footer.html renders this partial 4817 // twice (.mobile-version + .web-version), and this script runs inline as the FIRST copy parses 4818 // â the second copy's form doesn't exist in the DOM yet. Running here (instead of immediately) 4819 // guarantees querySelectorAll('#nl-subscription-form') sees both by the time markFromConsents runs. 4820 function boot() { 4821 initFormValues(); 4822 setInterval(updateAllForms, 1000); 4823 } 4824 if (document.readyState === 'loading') { 4825 document.addEventListener('DOMContentLoaded', boot); 4826 } else { 4827 boot(); 4828 } 4829 4830 // bfcache restore (back/forward button) resumes this exact JS state without re-running any 4831 //
4831<script> tag, so cachedEmail/cachedPhone can be stale â force a fresh consent check. 4832 window.addEventListener('pageshow', function (e) { 4833 if (!e.persisted) return; 4834 cachedEmail = ""; 4835 cachedPhone = ""; 4836 updateAllForms(); 4837 }); 4838})(); 4839</script>
4839 </article> 4840 </div> 4841 </section> 4842 </div> 4843 <div class="web-version mt-5"> 4844 <div class="socialLinks-wrapper"> 4845 <p class="sosial-links-paragraph">Sprinkle. Snap. Share.</p> 4846 <ul class="socialLinks socialLinks--alt"> 4847 <li class="socialLinks-item"> 4848 <a class="icon icon--facebook" 4849 href="https://www.facebook.com/PinkZebraHome/" 4850 target="_blank" 4851 rel="noopener" 4852 title="Facebook" 4853 > 4854 <span class="aria-description--hidden">Facebook</span> 4855 <svg class="facebook-icon"> 4856 <use href="#icon-facebook"/> 4857 </svg> 4858 </a> 4859 </li> 4860 <li class="socialLinks-item"> 4861 <a class="icon icon--instagram" 4862 href="https://www.instagram.com/pinkzebrahome/" 4863 target="_blank" 4864 rel="noopener" 4865 title="Instagram" 4866 > 4867 <span class="aria-description--hidden">Instagram</span> 4868 <svg class="instagram-icon"> 4869 <use href="#icon-instagram"/> 4870 </svg> 4871 </a> 4872 </li> 4873 <li class="socialLinks-item"> 4874 <a class="icon icon--youtube" 4875 href="https://www.youtube.com/user/PaisleyPinkZebra" 4876 target="_blank" 4877 rel="noopener" 4878 title="Youtube" 4879 > 4880 <span class="aria-description--hidden">Youtube</span> 4881 <svg class="youtube-icon"> 4882 <use href="#icon-youtube"/> 4883 </svg> 4884 </a> 4885 </li> 4886 <li class="socialLinks-item"> 4887 <a class="icon icon--" 4888 href="https://www.tiktok.com/@pinkzebrahome" 4889 target="_blank" 4890 rel="noopener" 4891 title="Tiktok" 4892 > 4893 <span class="aria-description--hidden">Tiktok</span> 4894 <svg class="tiktok-icon"> 4895 <use href="#icon-tiktok"/> 4896 </svg> 4897 </a> 4898 </li> 4899 <li class="socialLinks-item"> 4900 <a class="icon icon--pinterest" 4901 href="https://www.pinterest.com/pinkzebrahome/" 4902 target="_blank" 4903 rel="noopener" 4904 title="Pinterest" 4905 > 4906 <span class="aria-description--hidden">Pinterest</span> 4907 <svg class="pinterest-icon"> 4908 <use href="#icon-pinterest"/> 4909 </svg> 4910 </a> 4911 </li> 4912 </ul> 4913</div> 4914 </div> 4915 <div class="copyright-wrapper"> 4916 <div class="footer-copyright"> 4917 <div class="footer-copyright-paragraphs-wrapper"> 4918 <div class="footer-copyright"> 4919 <a href="/terms-and-conditions" class="powered-by">Terms and Conditions</a> | <a href="/privacy-policy" class="powered-by">Privacy Policy</a> | <a href="/app-privacy-policy" class="powered-by">App Privacy Policy</a> | <a href="/accessibility" class="powered-by">Accessibility</a> 4920 </div> 4921 <div class="footer-copyright"> 4922 <p class="powered-by">Copyright © 2026 Pink Zebra Home All rights reserved</p> 4923 </div> 4924 4925 </div> 4926 </div> 4927 </div> 4928 </div> 4929 <div data-content-region="ssl_site_seal--global"></div> 4930</footer> 4931<a class="back-to-top-button-wrapper" href="#"> 4932 <span class="back-to-top-button"> 4933 <span class="to-top-button-span">top</span> 4934 <svg class="arrow-up"> 4935 <use href="#icon-north"/> 4936 </svg> 4937 </span> 4938</a> 4939 <div class="c--modal find-consultant-modal" tabindex="-1" style="--bs-modal-width: 575px;"> 4940 <div class="c--modal-dialog"> 4941 <div class="c--modal-content"> 4942 <div class="search-consultant-by-location"> 4943 <h4 class="c--modal-heading mt-0 mb_26px">SEARCH FOR A CONSULTANT BY LOCATION</h4> 4944 <p class="c--modal-subheading mb_19px">
4944Find a consultant in your area!</p> 4945 <form class="search-consultant-form mb_47px" id="search-consultant-form-location"> 4946 <div class="d-flex"> 4947 <div class="mt-0 my-md-auto mr_11px"> 4948 <div class="form-group form-group-small mb-0"> 4949 <input type="checkbox" id="searchByLocation" name="searchByLocation"><label class="mb-0 mt-0" for="searchByLocation"></label> 4950 </div> 4951 </div> 4952 <div class="mt-0 my-md-auto"> 4953 <span class="location--checkbox"> 4954 Use my location to find a Consultant near me. 4955 </span> 4956 </div> 4957 </div> 4958 <input type="hidden" id="zipCodesInput" name="zip_codes[]"> 4959 <button class="consultant-search-submit button button--primary pl_40px pr_40px mt_39px mb-0 find-by-location" type="submit" search-btn-disabled="location" disabled>FIND A CONSULTANT</button> 4960 </form> 4961 <a href="#" type="button" id="show-adv--search" class="adv-search-link">Advanced Search</a> 4962 </div> 4963 4964 <div class="adv-consultant-search" style="display: none;"> 4965 <div class="mb_25px"> 4966 <a href="#" id="show-location--search" class="back--to-location-search c--modal-link"> < Back</a> 4967 </div> 4968 <h4 class="mb_25px c--modal-heading mt_0px">SEARCH FOR A CONSULTANT BY NAME</h4> 4969 <p class="c--modal-subheading mb_27px">Find a Consultant by searching for their first or last name or initials.</p> 4970 <form class="search-consultant-form" id="search-consultant-form-name"> 4971 <div class="" style="gap: 20px;"> 4972 <div class="input mb_10px"> 4973 <label for="firstName" class="d-block mb_8px">First Name</label> 4974 <input class="consultant-search-input" type="text" id="firstName" name="firstName"> 4975 </div> 4976 <div class="input"> 4977 <label for="lastName" class="d-block mb_8px">Last Name</label> 4978 <input class="consultant-search-input" type="text" id="lastName" name="lastName"> 4979 </div> 4980 </div> 4981 <button class="consultant-search-submit button button--primary pl_40px pr_40px mt_25px" type="submit" search-btn-disabled="consultant-name" disabled>FIND A CONSULTANT</button> 4982 </form> 4983 <hr class="mt_28px mb_36px"> 4984 <h4 class="c--modal-heading mt-0 mb_19px">FIND A CONSULTANT IN YOUR AREA</h4> 4985 <p class="c--modal-subheading mb_19px">Shop with your local Consultant!</p> 4986 <form class="search-consultant-form" id="search-consultant-form-city"> 4987 <div class="d-flex flex-wrap w--100" style="gap: 20px;"> 4988 <div class="mb_10px flex--1 min_w_207px"> 4989 <label for="city" class="d-block mb_8px">City</label> 4990 <input class="consultant-search-input" type="text" id="city" name="city"> 4991 </div> 4992 <div class="flex--1 min_w_207px"> 4993 <label for="zipcode" class="d-block mb_8px">Zip Code</label> 4994 <input class="consultant-search-input" type="text" id="zipcode" name="zip_codes[]"> 4995 </div> 4996 </div> 4997 <button class="consultant-search-submit button button--primary pl_40px pr_40px mt_25px" type="submit" search-btn-disabled="zip-code" disabled>FIND A CONSULTANT</button> 4998 </form> 4999 </div> 5000 <button class="mx-auto mb-0 modal-close find-consultant-modal-close">x</button> 5001 </div> 5002 </div> 5003</div> <!-- Modals Goes Here --> 5004<div class="c--modal preview-login-modal" tabindex="-1" style="z-index: 999999;background: #888 url(https://cdn11.bigcommerce.com/r-d23a8a754c97263a25c1d5066e7abdd011b8d3e9/themes/__master/images/coming-soon.jpg) no-repeat center center; background-size: cover;"> 5005 <div class="c--modal-dialog modal-v-centered" style=" max-width: 500px"> 5006 <div class="c--modal-content text-center"> 5007 <h4 class="c--modal-heading mb_24px">We're Under Maintenance!</h4> 5008 <p class="c--modal-subheading mb_27px">Check back at 7 am CST to explore our new website</p> 5009 <h4 class="c--modal-heading">Developer Login</h4> 5010 <form id="preview-login-form" method="post"> 5011 <div class="row"> 5012 <div class="col-12"> 5013 <div class="alertBox alertBox--error login--error mt_27px" style="display: none;"> 5014 <div class="alertBox-column alertBox-icon my-auto"> 5015 <icon glyph="ic-error" class="icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
5015<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"></path></svg></icon> 5016 </div> 5017 <p class="alertBox-column alertBox-message"> 5018 <span id="alertBox-message-text">Your email address or password is incorrect. Please try again.</span> 5019 </p> 5020 </div> 5021 </div> 5022 <div class="col-sm-6 mt_27px"> 5023 <div class="form-field" id="preview-email-div"> 5024 <label for="preview_login_email" id="preview-email-label" class="form-label">EMAIL ADDRESS<sup>*</sup></label> 5025 <input autocomplete="email" id="preview_login_email" type="email" class="form-input" name="preview_login_email" value="" required> 5026 </div> 5027 </div> 5028 <div class="col-sm-6 mt_27px"> 5029 <div class="form-field"> 5030 <label for="preview_login_pass" id="preview-password-label" class="form-label">PASSWORD<sup>*</sup></label> 5031 <div class="password-wrapper"> 5032 <a class="button-toggle-password sso-hideable" alt="Show or hide your password" href="#"></a> 5033 <input autocomplete="password" id="preview_login_pass" type="password" class="form-input" name="preview_login_pass" value="" required> 5034 </div> 5035 </div> 5036 </div> 5037 <div class="col-12"> 5038 <div class="d-flex flex-wrap mt_27px"> 5039 <div class="card-action text-left my-auto mb-0"> 5040 <button type="submit" class="button button--primary form_submit me-4 mb-0 popup-signin-button" id="preview-signin-button">SIGN IN</button> 5041 </div> 5042 <a href="https://pinkzebrahome.com/login.php?action=reset_password" class="my-auto fo-pass">Forgot your password?</a> 5043 </div> 5044 </div> 5045 </div> 5046 </form> 5047 </div> 5048 </div> 5049</div> <div class="c--modal vimeo-video-modal" tabindex="-1"> 5050 <div class="c--modal-dialog"> 5051 <div class="c--modal-content text-center"> 5052 <button class="mx-auto mb-0 modal-close vimeo-video-modal-close">x</button> 5053 <div style="padding:100% 0 0 0;position:relative;"><iframe id="vimeo-video-link" 5054 frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media" 5055 style="position:absolute;top:0;left:0;width:100%;height:100%;"></iframe></div> 5056
5056<script src="https://player.vimeo.com/api/player.js"></script>
5056 5057 </div> 5058 </div> 5059</div> <div class="c--modal surcharge--modal" tabindex="-1"> 5060 <div class="c--modal-dialog"> 5061 <div class="c--modal-content text-center"> 5062 <button class="mx-auto mb-0 modal-close" style="top: 22px;" onclick="hideModalPopUp('surcharge--modal');">x</button> 5063 <h4 class="c--modal-heading mb_24px">Tariff Recovery</h4> 5064 <p class="c--modal-subheading mb_27px">Due to recent US tariff charges, a 4% fee has been added to keep prices stable.</p> 5065 </div> 5066 </div> 5067</div> <div class="c--modal invalid-consultant-modal" tabindex="-1"> 5068 <div class="c--modal-dialog"> 5069 <div class="c--modal-content text-center"> 5070 <button class="mx-auto mb-0 modal-close" style="top: 22px;" onclick="hideModalPopUp('invalid-consultant-modal');">x</button> 5071 <h4 class="c--modal-heading mb_24px">Invalid Consultant Alert!</h4> 5072 <p class="c--modal-subheading mb_27px">Cross border consultants are not allowed please chose a different consultant.</p> 5073 </div> 5074 </div> 5075</div> <style> 5076 #sitevibes-loyalty-refer-a-friend .sv-loyalty-refer-friend-referrals-item--pending{ 5077 background-color:#898487 5078 } 5079 #sitevibes-loyalty-refer-a-friend .sv-loyalty-refer-friend-referrals-item--pending *{ 5080 color:#000000; 5081 } 5082 #sitevibes-loyalty-refer-a-friend .sv-loyalty-refer-friend-referrals-item--confirmed{ 5083 background-color:#000000 5084 } 5085 #sitevibes-loyalty-refer-a-friend .sv-loyalty-refer-friend-referrals-item--redeemed{ 5086 background-color:#FF1378 5087 } 5088 5089 #sitevibes-loyalty-refer-a-friend .sv-widget .sv-loyalty-refer-friend{ 5090 background-color:transparent; 5091 border:none; 5092 } 5093 5094 #sitevibes-loyalty-refer-a-friend .sv-widget .sv-loyalty-refer-friend-form-input input{ 5095 border-radius: 20px; 5096 height: 40px; 5097 font-size: .875rem; 5098 } 5099 5100 #sitevibes-loyalty-refer-a-friend .sv-widget a.sv-brand-kit-button>span, #sitevibes-loyalty-refer-a-friend .sv-widget button.sv-brand-kit-button>span{ 5101 color:#ffffff; 5102 } 5103 #sitevibes-loyalty-refer-a-friend .sv-widget a.sv-brand-kit-button:not(.sv-disabled), #sitevibes-loyalty-refer-a-friend .sv-widget button.sv-brand-kit-button:not(.sv-disabled){ 5104 background-color: #ff1378; 5105 border-color: #ff1378; 5106 color: #ffffff; 5107 font-weight: 700; 5108 height: 40px; 5109 border-radius: 20px; 5110 } 5111 5112 #sitevibes-loyalty-refer-a-friend .sv-widget .sv-loyalty-refer-friend-form-input-error{ 5113 text-align:left; 5114 } 5115 5116 @media screen and (max-width: 459px) { 5117 #sitevibes-loyalty-refer-a-friend .sv-widget .sv-loyalty-refer-friend-tab{ 5118 padding: 4px 10px !important; 5119 } 5120 } 5121 5122 .refer-a-friend-modal [modal-close-btn]{ 5123 position:absolute; 5124 right:20px; 5125 top:20px; 5126 } 5127 5128 </style> 5129 5130 <div class="c--modal refer-a-friend-modal" tabindex="-1"> 5131 <div class="c--modal-dialog mt_150px mb_100px"> 5132 <div class="c--modal-content text-center"> 5133 <div id="sitevibes-loyalty-refer-a-friend"></div> 5134 <div> 5135 <button type="submit" modal-close-btn="true" data-close="refer-a-friend-modal" class="mb-0">X</button> 5136 </div> 5137 </div> 5138 </div> 5139 </div> <div class="c--modal refer-a-friend-consultant-modal" tabindex="-1"> 5140 <div class="c--modal-dialog"> 5141 <div class="c--modal-content text-center"> 5142 <button class="mx-auto mb-0 modal-close" style="top: 22px;" onclick="hideModalPopUp('refer-a-friend-consultant-modal');">x</button> 5143 <h4 class="c--modal-heading mb_24px">Oops! Youâre Already Part of the Herd!</h4> 5144 <p class="c--modal-subheading mb_27px">The ScentFlirt Referral Program is designed just for customers, but donât worry, you can still encourage your customers to share the love so they earn the Referral Rewards which helps you grow your business and reach your goals!</p> 5145 <div class="d-flex flex-wrap" style="justify-content: space-around;"> 5146 <!-- <button class="button button--primary modal-button" onclick="copyReferralUrl()">SHARE WITH CUSTOMERS</button> 5147
5147<script> 5148 function copyReferralUrl() { 5149 const url = window.location.href; 5150 navigator.clipboard.writeText(url).then(() => { 5151 notyf.success('Link copied successfully!'); 5152 }).catch(err => { 5153 notyf.error('Failed to copy link!'); 5154 console.error('Failed to copy: ', err); 5155 }); 5156 } 5157 </script>
5157 --> 5158 <a href="/shop-by-fragrance/fragrance/" class="button button--primary modal-button">CONTINUE SHOPPING</a> 5159 </div> 5160 </div> 5161 </div> 5162</div> <div class="c--modal already-a-consultant-modal" tabindex="-1"> 5163 <div class="c--modal-dialog"> 5164 <div class="c--modal-content text-center"> 5165 <button class="mx-auto mb-0 modal-close" onclick="window.location.href='/'">x</button> 5166 <h4 class="c--modal-heading mb_24px">YOU'RE ALREADY A PART OF THE HERD!</h4> 5167 <p class="c--modal-subheading mb_27px">We noticed that you are already registered as a Consultant, so you are not eligible to purchase another Join Kit.</p> 5168 <p class="c--modal-subheading mb_27px">But let us show you some of the fragrances and decor recently released that you can use to grow your business!</p> 5169 <a href="/" class="button button--primary modal-button mx-auto mb-0">SHOW ME NEW PRODUCT</a> 5170 </div> 5171 </div> 5172</div> <div class="c--modal good-to-see-you-consultant-modal" tabindex="-1"> 5173 <div class="c--modal-dialog"> 5174 <div class="c--modal-content text-center"> 5175 <button class="mx-auto mb-0 modal-close" onclick="window.location.href='/'">x</button> 5176 <h4 class="c--modal-heading mb_24px">GOOD TO SEE YOU!</h4> 5177 <p class="c--modal-subheading mb_27px">We noticed that you have been registered as a Consultant within the last six months, so you are not elegible to purchase another Join Kit at this time. After resigning, former Consultants must wait six months before signing up to become a Consultant again.</p> 5178 <p class="c--modal-subheading mb_27px">But let us show you some of the fragrances and decor recently released that you can use in your personal space!</p> 5179 <a href="/" class="button button--primary modal-button mx-auto mb-0">SHOW ME NEW PRODUCT</a> 5180 </div> 5181 </div> 5182</div> <div class="c--modal join-not-available-modal" tabindex="-1"> 5183 <div class="c--modal-dialog"> 5184 <div class="c--modal-content text-center"> 5185 <button class="mx-auto mb-0 modal-close" onclick="window.location.href='/'">x</button> 5186 <h4 class="c--modal-heading mb_24px">Thank you so much for your interest in joining Pink Zebra!</h4> 5187 <p class="c--modal-subheading mb_27px">At this time, we are no longer accepting new consultant enrollments in Canada, as our business operations there will be closing at the end of this month.</p> 5188 <p class="c--modal-subheading mb_27px">We are truly grateful for your enthusiasm and support, and we hope to serve you again in the future in other ways.</p> 5189 <a href="/shop-new-products/" class="button button--primary modal-button mx-auto mb-0">SHOW ME NEW PRODUCT</a> 5190 </div> 5191 </div> 5192</div> <div class="c--modal join-temporary-offline-modal" tabindex="-1"> 5193 <div class="c--modal-dialog"> 5194 <div class="c--modal-content text-center"> 5195 <button class="mx-auto mb-0 modal-close" onclick="window.location.href='/'">x</button> 5196 <h4 class="c--modal-heading mb_24px">Big Things Ahead!</h4> 5197 <p class="c--modal-subheading mb_27px">Our Join Special page is taking a short break while we prep for a join special. Itâll be back soon and ready for you to grab!</p> 5198 <a href="/shop-new-products/" class="button button--primary modal-button mx-auto mb-0">SHOW ME NEW PRODUCT</a> 5199 </div> 5200 </div> 5201</div> <div class="c--modal website-fee-not-paid-modal" tabindex="-1"> 5202 <div class="c--modal-dialog"> 5203 <div class="c--modal-content text-center"> 5204 <button class="mx-auto mb-0 modal-close" onclick="window.location.href='/'">x</button> 5205 <h4 class="c--modal-heading mb_24px">ACTION REQUIRED:</h4> 5206 <p class="c--modal-subheading-pink mb_27px">Payment Needed to Restore Your Website Access</p> 5207 <p class="c--modal-subheading mb_27px">We noticed that your website fee for this month was not successfully processed due to a payment issueâeither an expired card, insufficient funds, or another billing error. As a result, your website access has been temporarily disabled.</p> 5208 <p class="c--modal-subheading mb_27px">To restore access, please update your payment details and complete your website fee payment by clicking the button below.</p> 5209 <p class="c--modal-subheading mb_27px">Once the payment is received, your website will be reinstated automatically. If you have any questions or need assistance updating your payment method, please reach out to Customer Service.</p> 5210 <a id="pay-website-fee" class="button button--primary modal-button mx-auto mb-0" data-product-sku="Website Monthly Fee">PAY NOW</a> 5211 </div> 5212 </div> 5213</div> 5214
5215<script> 5216 document.getElementById('pay-website-fee')?.addEventListener('click', async function (e) { 5217 e.preventDefault(); 5218 5219 const button = e.currentTarget; 5220 button.classList.add('is-loading', 'disabled-button'); 5221 5222 const sku = button.getAttribute('data-product-sku'); 5223 if (!sku) { 5224 notyf?.error({ message: 'Product SKU is missing.', duration: 3000 }); 5225 button.classList.remove('is-loading', 'disabled-button'); 5226 return; 5227 } 5228 5229 try { 5230 const product = await fetchProductDetailsViaSKU(sku); 5231 if (!product) { 5232 notyf?.error({ message: 'Product not found!', duration: 3000 }); 5233 button.classList.remove('is-loading', 'disabled-button'); 5234 return; 5235 } 5236 5237 const productOptions = []; 5238 if (product.options?.edges?.length) { 5239 product.options.edges.forEach(({ node }) => { 5240 if (node.isRequired) { 5241 productOptions.push({ 5242 optionId: node.entityId, 5243 optionValue: node.values.edges[0].node.entityId, 5244 }); 5245 } 5246 }); 5247 } 5248 5249 const axiosOptions = { 5250 method: 'POST', 5251 url: `/api/storefront/carts${window.CART__ID ? `/${window.CART__ID}/items` : ''}`, 5252 headers: { 5253 Accept: 'application/json', 5254 'Content-Type': 'application/json' 5255 }, 5256 data: { 5257 lineItems: [{ 5258 quantity: 1, 5259 productId: product.entityId, 5260 ...(productOptions.length > 0 && { optionSelections: productOptions }) 5261 }], 5262 locale: 'en' 5263 } 5264 }; 5265 5266 const response = await axios(axiosOptions); 5267 const data = response.data; 5268 5269 if (data.id) { 5270 window.location.href = window.location.origin + '/checkout'; 5271 } else { 5272 button.classList.remove('is-loading', 'disabled-button'); 5273 notyf?.error({ message: 'Failed to add product to cart.', duration: 3000 }); 5274 } 5275 5276 } catch (error) { 5277 button.classList.remove('is-loading', 'disabled-button'); 5278 notyf?.error({ message: 'An error occurred. Please try again.', duration: 3000 }); 5279 } 5280 }); 5281</script>
5281 <div class="c--modal subscription-not-available-modal" tabindex="-1"> 5282 <div class="c--modal-dialog"> 5283 <div class="c--modal-content text-center"> 5284 <button class="mx-auto mb-0 modal-close" onclick="window.location.href='/'">x</button> 5285 <h4 class="c--modal-heading mb_24px">Thank you so much for your interest in our subscription products!</h4> 5286 <p class="c--modal-subheading mb_27px">At this time, we are no longer accepting new orders for subscription products in Canada, as our business operations there will be closing at the end of this month.</p> 5287 <p class="c--modal-subheading mb_27px">We are truly grateful for your enthusiasm and support, and we hope to serve you again in the future in other ways.</p> 5288 <a href="/shop-new-products/" class="button button--primary modal-button mx-auto mb-0">SHOW ME NEW PRODUCT</a> 5289 </div> 5290 </div> 5291</div> <div class="c--modal sf-subscription-modal" style="--bs-modal-width: 564px;" tabindex="-1"> 5292 <div class="c--modal-dialog"> 5293 <div class="c--modal-content text-center"> 5294 <img class="mr-auto ml-auto" data-sf-modal="logo" src="https://cdn11.bigcommerce.com/s-9khen3dncu/images/stencil/original/image-manager/scentflirt-logo.png?t=1725879160" alt="" width="247px" height="75px"> 5295 <h4 class="c--modal-heading mt_10px mb_25px" data-sf-modal="heading">JOIN SCENTFLIRT AND GET IMMEDIATE ACCESS TO SCENTFLIRT EXCLUSIVE SHOPPING!</h4> 5296 <p class="c--modal-subheading-pink mb_10px" data-sf-modal="subheading" style="font-weight:700;"></p> 5297 <p class="c--modal-subheading mb_27px" data-sf-modal="subheading2"></p> 5298 <p class="c--modal-description mb_30px" data-sf-modal="pricing"></p> 5299 5300 <button class="button button--primary modal-button ml-auto mr-auto mb_25px add-subscription-to-cart" data-sf-modal="cta-button" data-product-id="4068" data-product-sku="9990002" data-type="modal-true" data-modal-name="sf-subscription-modal">ADD SCENTFLIRT TO MY CART</button> 5301 <div class="d-flex flex-wrap"> 5302 <a href="/scentflirt" class="c--modal-link " data-sf-modal="learn-more-link">LEARN MORE</a> 5303 <button class="ml-auto mb-0 c--modal-link close-sf-subscription-modal">CONTINUE SHOPPING</button> 5304 </div> 5305 <hr class="mt_25px mb_20px sf-login-divider"> 5306 <div class="sf-login-section" style="display:none;"> 5307 <p class="c--modal-subheading mb_20px" data-sf-modal="login-subheading">Sign in now to shop ScentFlirt exclusive products.</p> 5308 <form id="sf-exclusive-login-form" method="post"> 5309 <div class="row"> 5310 <div class="col-12 text-left"> 5311 <div class="alertBox alertBox--error sf--login--error mt_10px" style="display: none;"> 5312 <div class="alertBox-column alertBox-icon my-auto"> 5313 <icon glyph="ic-error" class="icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"></path></svg></icon> 5314 </div> 5315 <p class="alertBox-column alertBox-message"> 5316 <span id="alertBox-message-text">Your email address or password is incorrect. Please try again. If you've forgotten your sign in details, just click the 'Forgot your password?' link below.</span> 5317 </p> 5318 </div> 5319 </div> 5320 <div class="col-12 text-left"> 5321 <div class="alertBox alertBox--error login--error" style="display: none;"> 5322 <div class="alertBox-column alertBox-icon my-auto"> 5323 <icon glyph="ic-error" class="icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
5323<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"></path></svg></icon> 5324 </div> 5325 <p class="alertBox-column alertBox-message"> 5326 <span id="alertBox-message-text">Your email address or password is incorrect. Please try again. If you've forgotten your sign in details, just click the 'Forgot your password?' link below.</span> 5327 </p> 5328 </div> 5329 </div> 5330 <div class="col-sm-6 col-12"> 5331 <div class="form-field text-left mb-3"> 5332 <label for="login_email" id="email-label" class="form-label">EMAIL ADDRESS</label> 5333 <input autocomplete="email" type="email" class="form-input" name="login_email" value="" required> 5334 </div> 5335 </div> 5336 <div class="col-sm-6 col-12"> 5337 <div class="form-field text-left mb-3"> 5338 <label for="login_pass" id="password-label" class="form-label">PASSWORD</label> 5339 <input autocomplete="password" type="password" class="form-input" name="login_pass" value="" required> 5340 </div> 5341 </div> 5342 <div class="col-12"> 5343 <div class="d-flex flex-wrap mt_10px mb_15px"> 5344 <button type="submit" class="button button--primary form_submit me-4 mb-0 popup-signin-button" id="popup-signin-button">SIGN IN</button> 5345 <a href="https://pinkzebrahome.com/login.php?action=reset_password" class="my-auto fo-pass">Forgot your password?</a> 5346 </div> 5347 </div> 5348 </div> 5349 </form> 5350 </div> 5351 <button class="sf-login-toggle" onclick="$jQ('.sf-login-section').slideToggle(200); $jQ(this).toggleClass('is-open');"> 5352 <span data-sf-modal="login-heading">Already a ScentFlirt member?</span> 5353 <svg class="sf-login-chevron" width="12" height="12" viewBox="0 0 12 12"><path d="M2 8l4-4 4 4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg> 5354 </button> 5355 <button class="mx-auto mb-0 modal-close" onclick="hideSfModal();">x</button> 5356 </div> 5357 </div> 5358</div> <div class="c--modal sf-subscription-complete-modal" style="--bs-modal-width: 564px;" tabindex="-1"> 5359 <div class="c--modal-dialog"> 5360 <div class="c--modal-content text-center"> 5361 <img src="https://cdn11.bigcommerce.com/s-9khen3dncu/images/stencil/original/image-manager/scentflirt-logo.png?t=1725879160" alt="" width="180px" height="auto" class="mr-auto ml-auto mb_10px"> 5362 <h4 class="c--modal-heading mt_10px mb_10px sf-confirm-title">You're in!</h4> 5363 <p class="c--modal-subheading-pink mb_10px sf-confirm-subtitle" style="font-size:20px;">Welcome to ScentFlirt Preferred</p> 5364 <p class="c--modal-subheading mb_27px sf-confirm-body">Get ready to discover our most exclusive fragrances, curated just for you.</p> 5365 <a class="button button--primary modal-button ml-auto mr-auto sf-confirm-cta sf-confirm-delayed" href="javascript:void(0);">OK</a> 5366 <div class="d-flex justify-content-center mt_10px"> 5367 <button class="c--modal-link sf-confirm-secondary" style="display:none; background:none; border:none; cursor:pointer;">CONTINUE SHOPPING</button> 5368 </div> 5369 </div> 5370 </div> 5371</div> <div class="c--modal no-instruments-assigned-modal" tabindex="-1"> 5372 <div class="c--modal-dialog"> 5373 <div class="c--modal-content text-center"> 5374 <button class="mx-auto mb-0 modal-close" onclick="closeModalAndSetTimer()">x</button> 5375 <h4 class="c--modal-heading mb_24px"> 5376 KEEP YOUR SUBSCRIPTIONS GOING! 5377 </h4> 5378 <p class="c--modal-subheading mb_27px"> 5379 You have active subscriptions but no payment method on file. Add one now to keep your subscriptions without interruption. 5380 </p> 5381 <p class="c--modal-subheading mb_27px"> 5382 Subscriptions without a payment method: 5383 </p> 5384 <div data-subscription-without-instruments></div> 5385 <a href="/account.php?action=payment_methods" data-add-payment-method class="button button--primary modal-button mx-auto mb-0">ADD A PAYMENT METHOD</a> 5386 </div> 5387 </div> 5388</div> 5389
5390<script> 5391 function closeModalAndSetTimer(){ 5392 try { 5393 // Set 24-hour cooldown (in ms since epoch) so modal won't show again in that period 5394 const STORAGE_KEY = 'noInstrumentsLastShownAt'; 5395 const SESSION_KEY = 'noInstrumentsSessionNextAllowedAt'; 5396 const TWENTY_FOUR_HOURS_MS = 24 * 60 * 60 * 1000; 5397 const nextAt = String(Date.now() + TWENTY_FOUR_HOURS_MS); 5398 localStorage.setItem(STORAGE_KEY, nextAt); 5399 sessionStorage.setItem(SESSION_KEY, nextAt); 5400 } catch (e) {} 5401 hideModalPopUp('no-instruments-assigned-modal'); 5402 } 5403</script>
5403 <div class="c--modal sitevibes-referral-modal" tabindex="-1" style="display: none;"> 5404 <div class="c--modal-dialog"> 5405 <div class="c--modal-content"> 5406 <form id="sb-referral-form" method="post" class="pr_40px pl_40px"> 5407 <h4 class="c--modal-heading text-center"> 5408 Refer A Friend 5409 </h4> 5410 <div class="mt_27px"> 5411 <div class="form-field text-center"> 5412 <h4 class="c--modal-heading" style="text-transform: none;letter-spacing: 0;"> 5413 Share ScentFlirt with a friend and earn rewards! 5414 </h4> 5415 <p class="c--modal-subheading">Enter your friend's email address below to get started.</p> 5416 <div class="alertBox alertBox--error mt_27px" data-email-already-joined style="display: none;"> 5417 <div class="alertBox-column alertBox-icon my-auto"> 5418 <icon glyph="ic-error" class="icon" aria-hidden="true"> 5419 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> 5420 <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"></path> 5421 </svg> 5422 </icon> 5423 </div> 5424 <p class="alertBox-column alertBox-message"> 5425 <span id="referred-email-error-message"></span> 5426 </p> 5427 </div> 5428 <input autocomplete="email" id="referral_email" type="email" class="form-input" name="referral_email" value="" required placeholder="Enter your friend's email address" data-disable-until-sv-ready /> 5429 </div> 5430 </div> 5431 <div class="mt_27px"> 5432 <div class="card-action text-center my-auto mb-0"> 5433 <button type="submit" class="button button--primary mb-0" data-disable-until-sv-ready> 5434 Send Referral 5435 </button> 5436 </div> 5437 </div> 5438 <div class="text-center mt_15px" style="display: none;"> 5439 <p> 5440 <a href="#" data-copy-sb-referral-link data-disable-until-sv-ready> 5441 Copy Referral Link 5442 </a> 5443 </p> 5444 </div> 5445 </form> 5446 <div class="text-center" style="display: none;" data-sv-referral-success> 5447 <div class="mt_27px"> 5448 <h4 class="c--modal-heading"> 5449 Thank you for your referral to ScentFlirt. 5450 </h4> 5451 <p class="c--modal-subheading"> 5452 Once your friend signs up for ScentFlirt, you will receive your reward! 5453 </p> 5454 </div> 5455 <button class="button button--primary mb-0 mt-3" data-send-another-referral> 5456 Send Another Referral 5457 </button> 5458 <p class="mt-4"> 5459 Check the status of your referrals in My Account, under Referrals or <a href="/rewards">click here</a>. 5460 </p> 5461 </div> 5462 <button class="mx-auto mb-0 modal-close" onclick="hideModalPopUp('sitevibes-referral-modal');">x</button> 5463 </div> 5464 </div> 5465</div>
5466<script> 5467 let sv_consultantId = null; 5468 let sv_referral_link = null; 5469 5470 document.querySelectorAll('[data-disable-until-sv-ready]').forEach(function (el) { 5471 el.setAttribute('disabled', true); 5472 }); 5473 5474 async function getSitevibesLink(email) { 5475 sv_consultantId = await consultantHandler.getConsultantRepId(email); 5476 let response = await make_PZ_API_Request('PZ_BASE_URL', 'sitevibes/loyalty_customer?app_id=openapi-test&email=' + email, 'GET'); 5477 if (response.status) { 5478 sv_referral_link = response.data.customer.loyalty_referral_url + "&repid=" + sv_consultantId; 5479 } 5480 document.querySelectorAll('[data-disable-until-sv-ready]').forEach(function (el) { 5481 el.removeAttribute('disabled'); 5482 }); 5483 } 5484 5485 document.addEventListener("DOMContentLoaded", function () { 5486 if (window.Customer_Email) { 5487 getSitevibesLink(window.Customer_Email); 5488 } 5489 const form = document.getElementById("sb-referral-form"); 5490 form.addEventListener("submit", async function (e) { 5491 e.preventDefault(); 5492 if (document.querySelector('[data-email-already-joined]')) { 5493 document.querySelector('[data-email-already-joined]').style.display = "none"; 5494 } 5495 5496 const button = form.querySelector("button[type='submit']"); 5497 button.classList.add('is-loading'); 5498 button.setAttribute('disabled', true); 5499 5500 const referringEmail = ""; 5501 const consultantId = await consultantHandler.getConsultantRepId(referringEmail); 5502 const referredEmail = document.getElementById("referral_email").value; 5503 const landingPageUrl = window.location.origin + "/6-months-scentflirt/?repid=" + consultantId; 5504 5505 if (!referredEmail) { 5506 button.classList.remove('is-loading'); 5507 button.removeAttribute('disabled'); 5508 notyf.error("Please enter a valid email address."); 5509 return; 5510 } 5511 5512 const response = await make_PZ_API_Request('PZ_BASE_URL', window.PZ_API_EP.sitevibe.customerReferral, 'POST', { 5513 app_id: "openapi-test", 5514 referring_email: referringEmail, 5515 referred_email: referredEmail, 5516 landing_page_url: landingPageUrl, 5517 }); 5518 5519 button.classList.remove('is-loading'); 5520 button.removeAttribute('disabled'); 5521 5522 if (response.status) { 5523 document.getElementById("referral_email").value = ""; 5524 // notyf.success(response.message); 5525 document.querySelector('[data-sv-referral-success]').style.display = "block"; 5526 form.style.display = "none"; 5527 } else { 5528 // notyf.error(response?.message || "An error occurred. Please try again."); 5529 document.getElementById("referral_email").value = ""; 5530 if (response.message && document.querySelector('[data-email-already-joined]')) { 5531 if (response.message.toLowerCase().includes("referral for this email already exists.")) { 5532 document.getElementById("referred-email-error-message").innerText = "This email already joined the ScentFlirt fun through a referral. Try another email to keep spreading the scent love!"; 5533 } else if (response.message.toLowerCase().includes("contact has existing scentflirt order")) { 5534 document.getElementById("referred-email-error-message").innerText = "This email already joined the ScentFlirt fun. Try another email to keep spreading the scent love!"; 5535 } else { 5536 document.getElementById("referred-email-error-message").innerText = response.message; 5537 } 5538 document.querySelector('[data-email-already-joined]').style.display = "block"; 5539 } else { 5540 if (document.querySelector('[data-email-already-joined]')) { 5541 document.querySelector('[data-email-already-joined]').style.display = "none"; 5542 } 5543 notyf.error(response?.message || "An error occurred. Please try again."); 5544 } 5545 } 5546 5547 }); 5548 5549 document.querySelector('[data-send-another-referral]').addEventListener('click', function (e) { 5550 e.preventDefault(); 5551 document.querySelector('[data-sv-referral-success]').style.display = "none"; 5552 form.style.display = "block"; 5553 }); 5554 5555 document.querySelector('[data-copy-sb-referral-link]').addEventListener('click', async function (e) { 5556 e.preventDefault(); 5557 e.target.classList.add('is-loading'); 5558 e.target.setAttribute('disabled', true); 5559 await navigator.clipboard.writeText(sv_referral_link); 5560 e.target.classList.remove('is-loading'); 5561 e.target.removeAttribute('disabled'); 5562 notyf.success("Referral link copied to clipboard"); 5563 }); 5564 }); 5565</script>
5565 <div class="c--modal account-created-modal" style="--bs-modal-width: 564px;" tabindex="-1"> 5566 <div class="c--modal-dialog"> 5567 <div class="c--modal-content text-center"> 5568 <button class="mx-auto mb-0 modal-close" modal-close-btn="true" data-close="account-created-modal" type="button" aria-label="Close">x</button> 5569 <h4 class="c--modal-heading mb_24px account-created-modal__heading">Your account has been created</h4> 5570 <p class="c--modal-subheading mb_27px account-created-modal__message"></p> 5571 <button type="button" class="button button--primary modal-button mx-auto mb-0" modal-close-btn="true" data-close="account-created-modal">CONTINUE SHOPPING</button> 5572 </div> 5573 </div> 5574</div> 5575
5576<script> 5577 // Layer 1 (non-bundled): no modules, uses $jQ / showModalPopUp from base-setup.js. 5578 (function () { 5579 var STORAGE_KEY = 'pz_account_created'; 5580 // The destination page can redirect again on its own (segment routing rewrites the URL 5581 // from a Script Manager tag, consultant/login handlers can navigate). So the payload is 5582 // NOT consumed on render â it survives those hops and is only cleared when the customer 5583 // actually dismisses the modal, or when it goes stale. 5584 var MAX_AGE_MS = 5 * 60 * 1000; 5585 5586 function clearPayload() { 5587 try { 5588 sessionStorage.removeItem(STORAGE_KEY); 5589 } catch (e) { /* nothing to clear */ } 5590 } 5591 5592 function readPayload() { 5593 var raw; 5594 try { 5595 raw = sessionStorage.getItem(STORAGE_KEY); 5596 } catch (e) { 5597 console.warn('account-created-modal but sessionStorage unavailable', e); 5598 return null; 5599 } 5600 if (!raw) return null; 5601 5602 var payload; 5603 try { 5604 payload = JSON.parse(raw); 5605 } catch (e) { 5606 clearPayload(); 5607 return null; 5608 } 5609 5610 if (payload.ts && (Date.now() - payload.ts) > MAX_AGE_MS) { 5611 clearPayload(); 5612 return null; 5613 } 5614 return payload; 5615 } 5616 5617 function show(payload) { 5618 var $modal = $jQ('.account-created-modal'); 5619 if (!$modal.length) { 5620 return false; 5621 } 5622 5623 if (payload.heading) $modal.find('.account-created-modal__heading').text(payload.heading); 5624 // `message` is rendered by Handlebars from the `create_account.created.intro` lang 5625 // string, which is intentionally HTML (it bolds the store name / email). 5626 if (payload.message) $modal.find('.account-created-modal__message').html(payload.message); 5627 5628 $modal.find('[modal-close-btn="true"]').on('click', clearPayload); 5629 5630 showModalPopUp('account-created-modal'); 5631 return true; 5632 } 5633 5634 function init() { 5635 // The partial ships in every layout, so it also renders on the account-created page 5636 // that writes the payload. Don't fire there â that page is mid-redirect and the 5637 // customer would see the modal twice. 5638 if (document.querySelector('[data-account-created]')) { 5639 return; 5640 } 5641 5642 var payload = readPayload(); 5643 if (!payload) return; 5644 5645 if (show(payload)) return; 5646 5647 // Markup wasn't ready â retry once the element appears (base-setup.js helper). 5648 if (typeof window.customReady === 'function') { 5649 window.customReady('.account-created-modal', function () { show(payload); }); 5650 } 5651 } 5652 5653 if (document.readyState === 'loading') { 5654 document.addEventListener('DOMContentLoaded', init); 5655 } else { 5656 init(); 5657 } 5658 })(); 5659</script>
5659 5660 <div class="c--modal get-free-sample--modal" tabindex="-1" style="--bs-modal-width: 575px;"> 5661 <div class="c--modal-dialog"> 5662 <div class="c--modal-content"> 5663 <!-- Step 1: Form --> 5664 <div id="sample-form-step" style="display: block;"> 5665 <h4 class="c--modal-heading">WANT TO TRY<br>BEFORE YOU BUY?</h4> 5666 <p class="c--modal-subheading-pink">Snag a FREE sampleâjust fill out the quick form below.</p> 5667 <p class="c--modal-subheading">Plus, get early access to scentsational deals, insider tips and first 5668 peeks at what's coming next!</p> 5669 <form id="sample-program-signup-form" class="sample--program-forms" method="post" novalidate> 5670 <div class="form-container"> 5671 <div class="form-error" style="display: none;"> 5672 <div class="alertBox alertBox--error signup--error"> 5673 <div class="alertBox-column alertBox-icon"> 5674 <icon glyph="ic-error" class="icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" 5675 width="24" height="24" viewBox="0 0 24 24"> 5676 <path 5677 d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"> 5678 </path> 5679 </svg></icon> 5680 </div> 5681 <p class="alertBox-column alertBox-message"> 5682 <span id="signup-alertBox-message-text"></span> 5683 </p> 5684 </div> 5685 </div> 5686 5687 <div class="form-row"> 5688 <div class="form-field-half"> 5689 <input id="get_sample_first_name" type="text" class="form-input" name="get_sample_first_name" 5690 placeholder="FIRST NAME" required> 5691 <div class="invalid-feedback" data-error="0.first_name"></div> 5692 </div> 5693 <div class="form-field-half"> 5694 <input id="get_sample_last_name" type="text" class="form-input" name="get_sample_last_name" 5695 placeholder="LAST NAME" required> 5696 <div class="invalid-feedback" data-error="0.last_name"></div> 5697 </div> 5698 </div> 5699 5700 <div class="form-row"> 5701 <div class="form-field-full"> 5702 <input id="get_sample_email" type="email" class="form-input" name="get_sample_email" 5703 placeholder="EMAIL" required> 5704 <div class="invalid-feedback" data-error="0.email"></div> 5705 </div> 5706 </div> 5707 5708 <div class="form-row"> 5709 <div class="form-field-full"> 5710 <input id="get_sample_address1" type="text" class="form-input" name="get_sample_address1" 5711 placeholder="ADDRESS 1" value="" required> 5712 <div class="invalid-feedback" data-error="0.address1"></div> 5713 </div> 5714 </div> 5715 5716 <div class="form-row"> 5717 <div class="form-field-full"> 5718 <input id="get_sample_address2" type="text" class="form-input" name="get_sample_address2" 5719 placeholder="ADDRESS 2" value=""> 5720 <div class="invalid-feedback" data-error="0.address2"></div> 5721 </div> 5722 </div> 5723 5724 <div class="form-row city-state-zip-row"> 5725 <div class="form-field-city"> 5726 <input id="get_sample_city" type="text" class="form-input" name="get_sample_city" placeholder="CITY" 5727 value="" required> 5728 <div class="invalid-feedback" data-error="0.city"></div> 5729 </div> 5730 <div class="city_state"> 5731 <div class="form-field-state"> 5732 <!-- <input type="text" class="form-input" 5733 placeholder="STATE" value="" required> --> 5734 <select id="get_sample_state" name="get_sample_state" class="form-select"><option value="">Select a state</option></select> 5735 <div class="invalid-feedback" data-error="0.state"></div> 5736 </div> 5737 <div class="form-field-zip"> 5738 <input id="get_sample_zip" type="text" class="form-input" name="get_sample_zip" placeholder="ZIP" 5739 value="" required> 5740 <div class="invalid-feedback" data-error="0.zip"></div> 5741 </div> 5742 </div> 5743 </div> 5744 5745 <div class="form-row"> 5746 <div class="form-field-full"> 5747 <input id="get_sample_phone" type="text" class="form-input" name="get_sample_phone" placeholder="PHONE" 5748 value="+1" required> 5749 <div class="invalid-feedback" data-error="0.phone"></div> 5750 </div> 5751 </div> 5752 5753 <!-- Password field for non-logged-in users --> 5754 <div class="form-row"> 5755 <div id="password-field-row" class="form-field-full"> 5756 <div class="password-wrapper"> 5757 <a class="button-toggle-password sso-hideable" alt="Show or hide your password" href="#"></a> 5758 <input id="get_sample_password" type="password" class="form-input" name="get_sample_password" 5759 placeholder="PASSWORD" value="" minlength="10" maxlength="20" autocomplete="new-password" required 5760 title="Password must be 10â20 characters and include at least one uppercase letter, one number, and one special character."> 5761 </div> 5762 <div class="invalid-feedback" style="color: rgb(255, 0, 0);" data-error="0.password"></div> 5763 <div id="password-requirements" class="password-requirements" aria-l
5763ive="polite" style="margin-top:6px;"> 5764 <ul style="list-style:none; padding-left:0; margin:8px 0 0 0; font-size: 13px; line-height: 1.4; color:#444;"> 5765 <li><span id="pw-req-length-check" style="display:inline-block; width:16px; color:#9e9e9e;">â</span> 10â20 characters</li> 5766 <li><span id="pw-req-upper-check" style="display:inline-block; width:16px; color:#9e9e9e;">â</span> At least one uppercase letter</li> 5767 <li><span id="pw-req-number-check" style="display:inline-block; width:16px; color:#9e9e9e;">â</span> At least one number</li> 5768 <li><span id="pw-req-special-check" style="display:inline-block; width:16px; color:#9e9e9e;">â</span> At least one special character</li> 5769 </ul> 5770 </div> 5771 </div> 5772 </div> 5773 5774 <legal-opt-in 5775 link="/privacy-policy" 5776 consent-type="marketing_email,marketing_sms" 5777 email="" 5778 phone="" 5779 program-name="sample_program_enrollment" 5780 mode='listener' 5781 email-input-id='get_sample_email' 5782 phone-input-id='get_sample_phone' 5783 listener-button-id='get-sample-button' 5784 > 5785 </legal-opt-in> 5786 <div class="form-submit"> 5787 <button type="submit" class="button button--primary--filled mb-0 sample-submit--button" 5788 id="get-sample-button">GET MY FREE SAMPLE</button> 5789 </div> 5790 </div> 5791</form> 5792 5793 5794 </div> 5795 5796 <!-- Step 2: OTP Verification --> 5797 <div id="otp-verification-step" style="display: none;"> 5798 <h4 class="c--modal-heading">VERIFY YOUR PHONE</h4> 5799 <p class="c--modal-subheading-pink">We've sent a verification code to <span 5800 id="otp-phone-display"></span></p> 5801 <p class="c--modal-subheading">Enter the 6-digit code below to complete your free sample request.</p> 5802 <div class="form-container"> 5803 <div class="form-error" id="otp-error" style="display: none;"> 5804 <div class="alertBox alertBox--error"> 5805 <div class="alertBox-column alertBox-icon"> 5806 <icon glyph="ic-error" class="icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" 5807 width="24" height="24" viewBox="0 0 24 24"> 5808 <path 5809 d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"> 5810 </path> 5811 </svg></icon> 5812 </div> 5813 <p class="alertBox-column alertBox-message"> 5814 <span id="otp-error-message"></span> 5815 </p> 5816 </div> 5817 </div> 5818 5819 <div class="form-row"> 5820 <div class="form-field-full"> 5821 <input id="otp-code" type="text" class="form-input" name="otp_code" placeholder="ENTER 6-DIGIT CODE" 5822 maxlength="6" pattern="[0-9]{6}" required> 5823 <div class="invalid-feedback" data-error="otp"></div> 5824 </div> 5825 </div> 5826 5827 <div class="form-submit"> 5828 <button type="button" class="button button--primary--filled mb-0" id="verify-otp-button">VERIFY CODE</button> 5829 </div> 5830 5831 <div class="otp-actions" style="text-align: center; margin-top: 20px;"> 5832 <p>Didn't receive the code?</p> 5833 <button type="button" class="button mb-0" id="resend-otp-button" style="margin-right: 10px;">RESEND 5834 CODE</button> 5835 <button type="button" class="button mb-0" id="change-phone-button">CHANGE PHONE</button> 5836 </div> 5837</div> </div> 5838 5839 <div id="loading-step" style="display: none;"> 5840 <div class="sample-program-loading-step"> 5841 <div class="spinner"></div> 5842 <h4 class="loading-text">VERIFYING...</h4> 5843 <p class="loading-subtext">Please wait while we confirm your code and set up your account.</p> 5844 </div> 5845 </div> 5846 5847 <div id="after-login-step" style="display: none;"> 5848 <div class="sample-program-after-login-step"> 5849 <div class="success-text"> 5850 <div style=" 5851 color: #ff1378; 5852 font-size: 64px;margin-bottom: 12px; 5853 transform: scale(1.5) translateY(0px); 5854 display: flex; justify-content: center; 5855 align-items: center;" 5856 >â</div> 5857 <h4 class="c--modal-heading">LOGIN SUCCESS!</h4> 5858 </div> 5859 </div> 5860 </div> 5861 5862 <!-- "You Are Already IN!" Modal --> 5863 <div id="already-enrolled-step" style="display: none;"> 5864 <div style="text-align: center;"> 5865 <h5 class="c--modal-pink-heading">Looks like youâre already part of our Pink Zebra family!</h5> 5866 <p class="c--modal-subheading">This free sample offer is for new customers only â but weâd love for 5867 you to check out our newest fragrances and exclusive deals!</p> 5868 <div class="form-submit" style="margin-top: 30px;"> 5869 <a type="button" class="button button--primary--filled mb-0" onclick="handleClickShopNow()">Shop 5870 Now</a> 5871 </div> 5872 </div> 5873 </div> 5874 5875 <button class="modal-close" onclick="closeGetFreeSampleModal()">Ã</button> 5876 </div> 5877 </div> 5878</div>
5879<script> 5880 let currentStep = 'form'; 5881 let formData = {}; 5882 let otpResendCount = 0; 5883 let otpMaxAttempts = 3; // from settings 5884 let otpRequestDelaySec = 30; // from settings 5885 let popupDelaySec = 5; // from settings 5886 let popupShowOnce = true; // from settings 5887 let programEnabled = true; // from settings 5888 let enabledCountries = ['US']; // from settings 5889 let programStatus = 'active'; 5890 let notEligibleMessage = ''; 5891 let noSampleModalRoutes = []; 5892 let testMode = false; 5893 let keywordForTestMode = ''; 5894 let showSampleProgramPage = false; 5895 let orderId = null; 5896 let defaultConsultantId = null; 5897 let restrictedModalParams = {}; 5898 5899 const PASSWORD_REQUIREMENTS_TEXT = 'Password must be 10â20 characters and include at least one uppercase letter, one number, and one special character.'; 5900 5901 // Session flag: ensure modal shows only once per browser session 5902 const SESSION_MODAL_SHOWN_KEY = 'getFreeSampleModalShownInSession'; 5903 // 24-hour cooldown: prevent re-showing within 24 hours across sessions (useful on persistent mobile sessions) 5904 const PERSIST_MODAL_LAST_SHOWN_KEY = 'getFreeSampleModalLastShownAt'; 5905 const PERSIST_MODAL_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours 5906 // const PERSIST_MODAL_TTL_MS = 1 * 60 * 1000; // 1 minute for testing 5907 5908 // Internal flag to ensure we only mark session/24h cooldown if the modal was actually opened 5909 window.__getFreeSampleModalWasOpened = window.__getFreeSampleModalWasOpened || false; 5910 5911 // Validation helpers 5912 function isValidUSPhone(phone) { 5913 const v = String(phone || '').trim(); 5914 return /^\+1\d{10}$/.test(v); 5915 } 5916 5917 function isValidEmail(email) { 5918 return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(email || '').trim()); 5919 } 5920 5921 function isValidName(name) { 5922 // Allow anything except digits 0-9 5923 return /^[^\d]+$/.test(String(name || '').trim()); 5924 } 5925 5926 // Password must be at least 8 chars, include letters (with at least one uppercase), a number, and a special character 5927 function isValidPassword(pwd) { 5928 const v = String(pwd || ''); 5929 // 10â20 chars, at least 1 uppercase, 1 number, 1 special 5930 return /^(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9]).{10,20}$/.test(v); 5931 } 5932 5933 function getPasswordChecks(pwd) { 5934 const v = String(pwd || ''); 5935 return { 5936 length: v.length >= 10 && v.length <= 20, 5937 upper: /[A-Z]/.test(v), 5938 number: /\d/.test(v), 5939 special: /[^A-Za-z0-9]/.test(v), 5940 }; 5941 } 5942 5943 function updatePasswordChecklistUI(pwd) { 5944 const checks = getPasswordChecks(pwd); 5945 const set = (id, ok) => { 5946 const el = document.getElementById(id); 5947 if (!el) return; 5948 el.textContent = ok ? 'â' : 'â'; 5949 el.style.color = ok ? '#28a745' : '#9e9e9e'; 5950 }; 5951 set('pw-req-length-check', checks.length); 5952 set('pw-req-upper-check', checks.upper); 5953 set('pw-req-number-check', checks.number); 5954 set('pw-req-special-check', checks.special); 5955 } 5956 5957 // Helper to safely get .value from settings 5958 async function getSettingValue(path, fallback, opts = {}) { 5959 try { 5960 const obj = await window.get_PZ_Setting(path, opts); 5961 // alert(`Path: ${path} Type ${typeof obj} => ${obj}`) 5962 if (obj && typeof obj === 'object' && 'value' in obj) return obj.value; 5963 return obj ?? fallback; 5964 } catch (e) { 5965 return fallback; 5966 } 5967 } 5968 5969 async function loadSampleProgramSettings() { 5970 try { await window.get_PZ_Schema_Config('sample_program'); } catch { } 5971 programEnabled = await getSettingValue('sample_program.customer_sample_program.is_enabled.value', true, { forceRefresh: true }); 5972 popupDelaySec = parseInt(await getSettingValue('sample_program.customer_sample_program.popup_delay_seconds.value', 5)) || 5; 5973 popupShowOnce = !!(await getSettingValue('sample_program.customer_sample_program.popup_show_once.value', true)); 5974 enabledCountries = (await getSettingValue('sample_program.customer_sample_program.enabled_countries.value', ['US'])) || ['US']; 5975 otpMaxAttempts = parseInt(await getSettingValue('sample_program.customer_sample_program.otp.max_attempts.value', 3)) || 3; 5976 otpRequestDelaySec = parseInt(await getSettingValue('sample_program.customer_sample_program.otp.request_delay.value', 30)) || 30; 5977 programStatus = await getSettingValue('sample_program.customer_sample_program.program_status.value', 'active'); 5978 notEligibleMessage = await getSettingValue('sample_program.customer_sample_program.new_customer_message.value', '') || ''; 5979 noSampleModalRoutes = await getSettingValue('sample_program.customer_sample_program.restricted_modal_routes.value', []) || []; 5980 5981 restrictedModalParams = await getSettingValue('sample_program.customer_sample_program.restricted_modal_params.value', {}) || {}; 5982
5983 // TEST MODE IS DEPRECATED DUE THE SAMPLE PROGRAM IS OUT TESTING GROUND, BUT KEEPING THE SETTING IN CASE WE WANT TO REUSE IT FOR FUTURE TESTING PURPOSES 5984 // testMode = await getSettingValue('sample_program.customer_sample_program.test_mode.enabled.value', false, { forceRefresh: true }) || false; 5985 // keywordForTestMode = await getSettingValue('sample_program.customer_sample_program.test_mode.keyword_param_url.value', '') || ''; 5986 // consultantPermissionList = await getSettingValue('sample_program.customer_sample_program.customer_permission_email_list', '') || ''; 5987 5988 defaultConsultantId = await getSettingValue('sample_program.customer_sample_program.default_values.default_consultant_id.value', '') || ''; 5989 } 5990 5991 function getDefaultCountryContext() { 5992 const countryCode = (window.StoreFront?.countryCode || window.themeSettings?.storeCountryCode || 'US'); 5993 const countryName = countryCode === 'CA' ? 'Canada' : 'United States'; 5994 return { code: countryCode, name: countryName }; 5995 } 5996 5997 // Safe storage utility to prevent crashes in private browsing / blocked cookie environments 5998 const storage = { 5999 get(key, type = 'session') { 6000 try { 6001 const store = type === 'local' ? localStorage : sessionStorage; 6002 return store.getItem(key); 6003 } catch (e) { 6004 return null; 6005 } 6006 }, 6007 set(key, value, type = 'session') { 6008 try { 6009 const store = type === 'local' ? localStorage : sessionStorage; 6010 store.setItem(key, value); 6011 return true; 6012 } catch (e) { 6013 return false; 6014 } 6015 }, 6016 remove(key, type = 'session') { 6017 try { 6018 const store = type === 'local' ? localStorage : sessionStorage; 6019 store.removeItem(key); 6020 return true; 6021 } catch (e) { 6022 return false; 6023 } 6024 } 6025 }; 6026 6027 let eligibilityCheckPromise = null; 6028 6029 async function shouldShowModalNow() { 6030 return false 6031 if (eligibilityCheckPromise) { 6032 return eligibilityCheckPromise; 6033 } 6034 6035 eligibilityCheckPromise = (async () => { 6036 try { 6037 const result = await evaluateEligibility(); 6038 showSampleProgramPage = result.showPage; 6039 return result.showModal; 6040 } catch (error) { 6041 console.error('[Eligibility Check] Unexpected failure:', error); 6042 showSampleProgramPage = false; 6043 return false; 6044 } 6045 })(); 6046 6047 return eligibilityCheckPromise; 6048 } 6049 6050 async function evaluateEligibility() { 6051 const urlParams = new URLSearchParams(window.location.search); 6052 6053 if (restrictedModalParams && Object.keys(restrictedModalParams).some(key => 6054 urlParams.has(key) && String(urlParams.get(key)) === String(restrictedModalParams[key]) 6055 )) { 6056 return { showModal: false, showPage: true }; 6057 } 6058 6059 const eligibilityKey = 'sp_eligibility_checked'; 6060 const lastRepIdKey = 'sp_last_rep_id_checked'; 6061 const lastTimeCheckedRepIDKey = 'sp_last_time_checked_rep_id'; 6062 const lastCustomerCheckKey = 'sp_last_customer_check'; 6063 const lastTimeCheckedCustomerKey = 'sp_last_time_checked_customer'; 6064 const repEligibilityKey = 'sp_rep_eligible'; 6065 const customerEligibilityKey = 'sp_customer_eligible'; 6066 6067 const params = new URLSearchParams(window.location.search); 6068 const currentRepId = params.get("repid") || params.get("rep_id") || storage.get('repid', 'local'); 6069 const lastRepId = storage.get(lastRepIdKey); 6070 const lastCustomerCheck = storage.get(lastCustomerCheckKey); 6071 const currentCustomerEmail = window.Customer_Email || false; 6072 const now = Date.now(); 6073 const COOLDOWN_12H_MS = 12 * 60 * 60 * 1000; 6074 6075 const lastTimeCheckedRepID = parseInt(storage.get(lastTimeCheckedRepIDKey), 10) || 0; 6076 const lastTimeCheckedCustomer = parseInt(storage.get(lastTimeCheckedCustomerKey), 10) || 0; 6077 6078 // Rep ID needs checking if the ID changed OR if it's been more than 12 hours since the last check 6079 const repIdCheckNeed = currentRepId !== lastRepId || (now - lastTimeCheckedRepID) > COOLDOWN_12H_MS; 6080 6081 let customerEmailCheckNeed = false; 6082 if (!window.Customer_Email) { 6083 customerEmailCheckNeed = true; 6084 } else { 6085 // Logged-in customer needs checking if email changed OR if it's been more than 12 hours since the last check 6086 const emailChanged = String(currentCustomerEmail).toLowerCase() !== String(lastCustomerCheck).toLowerCase(); 6087 const timeElapsed = (now - lastTimeCheckedCustomer) > COOLDOWN_12H_MS; 6088 customerEmailCheckNeed = emailChanged || timeElapsed; 6089 } 6090 6091 const eligibility = storage.get(eligibilityKey); 6092 let repEligibility = storage.get(repEligibilityKey) || 'eligible'; 6093 let customerEligibility = window.Customer_Email ? (storage.get(customerEligibilityKey) || 'eligible') : 'eligible'; 6094 6095 if (!repIdCheckNeed && !customerEmailCheckNeed && eligibility === 'not_eligible') { 6096 return { showModal: false, showPage: false }; 6097 } 6098 6099 if (!!window.Cart__ID === true) { 6100 return { showModal: false, showPage: false }; 6101 } else if (window.Cart__ID === null || window.Cart__ID === undefined || window.Cart__ID === '') { 6102 try { 6103 const axiosOptions = { 6104 method: 'GET', 6105 url: `/api/storefront/carts`, 6106 headers: { 6107 Accept: 'application/json', 6108 'Content-Type': 'application/json' 6109 } 6110 }; 6111 const response = await axios(axiosOptions) 6112 if (response?.data?.length > 0) { 6113 return { showModal: false, showPage: false }; 6114 } 6115 } catch (error) { 6116 console.error('[Eligibility Check] Cart API check failed:', error); 6117 } 6118 } 6119 6120 if (repIdCheckNeed || eligibility === null) { 6121 if (currentRepId) { 6122 try {
6123 const repCheckResponse = await make_PZ_API_Request( 6124 'PZ_BASE_URL', 6125 '/sample_program/check-rep-id', 6126 'POST', 6127 { 6128 body: { 6129 rep_id: parseInt(currentRepId, 10), 6130 url: window.location.href 6131 } 6132 } 6133 ); 6134 storage.set(lastRepIdKey, String(currentRepId || '')); 6135 storage.set(lastTimeCheckedRepIDKey, String(Date.now())); 6136 6137 if (repCheckResponse?.success === false) { 6138 repEligibility = 'not_eligible'; 6139 storage.set(repEligibilityKey, 'not_eligible'); 6140 storage.set(eligibilityKey, 'not_eligible'); 6141 return { showModal: false, showPage: false }; 6142 } else { 6143 repEligibility = 'eligible'; 6144 storage.set(repEligibilityKey, 'eligible'); 6145 } 6146 } catch (error) { 6147 console.error('[Eligibility Check] Rep ID verification failed:', error); 6148 // Set last rep ID and timestamp to avoid infinite retry loops on consecutive calls 6149 storage.set(lastRepIdKey, String(currentRepId || '')); 6150 storage.set(lastTimeCheckedRepIDKey, String(Date.now())); 6151 } 6152 } else { 6153 repEligibility = 'eligible'; 6154 storage.set(repEligibilityKey, 'eligible'); 6155 } 6156 } 6157 6158 if (!programEnabled) { 6159 return { showModal: false, showPage: false }; 6160 } 6161 if (programStatus && programStatus !== 'active') { 6162 return { showModal: false, showPage: false }; 6163 } 6164 6165 const { code } = getDefaultCountryContext(); 6166 if (Array.isArray(enabledCountries) && enabledCountries.length > 0 && !enabledCountries.includes(code)) { 6167 return { showModal: false, showPage: false }; 6168 } 6169 6170 const isRestrictedRoute = noSampleModalRoutes.some(route => window.location.pathname.includes(route)); 6171 const hasSessionEntry = !!storage.get(SESSION_MODAL_SHOWN_KEY); 6172 6173 if (hasSessionEntry && !isRestrictedRoute) { 6174 const lastShown = parseInt(storage.get(PERSIST_MODAL_LAST_SHOWN_KEY, 'local'), 10); 6175 if (lastShown && (Date.now() - lastShown) < PERSIST_MODAL_TTL_MS) { 6176 return { showModal: false, showPage: false }; 6177 } 6178 } 6179 6180 if (window.Customer_Email && (customerEmailCheckNeed || eligibility === null)) { 6181 try { 6182 const response = await make_PZ_API_Request( 6183 'PZ_BASE_URL', 6184 window.PZ_API_EP.sampleProgram.checkCustomerEligibility, 6185 'POST', 6186 { 6187 body: { 6188 user_email: window.Customer_Email 6189 } 6190 } 6191 ); 6192 storage.set(lastCustomerCheckKey, String(currentCustomerEmail || '')); 6193 storage.set(lastTimeCheckedCustomerKey, String(Date.now())); 6194 6195 if (response?.success === true) { 6196 customerEligibility = 'eligible'; 6197 storage.set(customerEligibilityKey, 'eligible'); 6198 } else { 6199 customerEligibility = 'not_eligible'; 6200 storage.set(customerEligibilityKey, 'not_eligible'); 6201 storage.set(eligibilityKey, 'not_eligible'); 6202 return { showModal: false, showPage: false }; 6203 } 6204 } catch (error) { 6205 console.error('[Eligibility Check] Customer eligibility verification failed:', error); 6206 customerEligibility = 'not_eligible'; 6207 storage.set(customerEligibilityKey, 'not_eligible'); 6208 storage.set(eligibilityKey, 'not_eligible'); 6209 storage.set(lastCustomerCheckKey, String(currentCustomerEmail || '')); 6210 storage.set(lastTimeCheckedCustomerKey, String(Date.now())); 6211 return { showModal: false, showPage: false }; 6212 } 6213 } 6214 6215 if (repEligibility === 'eligible' && customerEligibility === 'eligible') { 6216 if (eligibility !== 'eligible') { 6217 storage.set(eligibilityKey, 'eligible'); 6218 } 6219 } else { 6220 storage.set(eligibilityKey, 'not_eligible'); 6221 return { showModal: false, showPage: false }; 6222 } 6223 6224 if (isRestrictedRoute) { 6225 return { showModal: false, showPage: true }; 6226 } 6227 6228 return { showModal: true, showPage: true }; 6229 } 6230 6231 function markModalShownOnce() { 6232 try { 6233 sessionStorage.setItem(SESSION_MODAL_SHOWN_KEY, '1'); 6234 } catch (e) { /* ignore */ } 6235 6236 try { 6237 localStorage.setItem(PERSIST_MODAL_LAST_SHOWN_KEY, String(Date.now())); 6238 } catch (e) { /* ignore */ } 6239 } 6240 6241 function getStates() { 6242 const currencyCode = document.getElementById('main-content').getAttribute('data-currency-code') || 'USD'; 6243 const country = currencyCode === 'CAD' ? 'Canada' : 'United%20States'; 6244 6245 const url = `${window.location.origin}/remote/v1/country-states/${country}`; 6246 axios.get(url) 6247 .then(response => { 6248 const states = response.data.data.states; 6249 const stateInput = document.getElementById('get_sample_state'); 6250 if (stateInput) { 6251 // Clear existing options 6252 stateInput.innerHTML = ''; 6253 // Add a default option 6254 const defaultOption = document.createElement('option'); 6255 defaultOption.value = ''; 6256 defaultOption.textContent = 'Select State'; 6257 stateInput.appendChild(defaultOption); 6258 // Populate with fetched states
6259 states.forEach(state => { 6260 const option = document.createElement('option'); 6261 option.value = state.name; 6262 option.textContent = state.label; 6263 stateInput.appendChild(option); 6264 }); 6265 } 6266 }); 6267 } 6268 6269 document.addEventListener('DOMContentLoaded', async () => { 6270 await loadSampleProgramSettings(); 6271 6272 const currentPath = window.location.pathname; 6273 const isRestrictedRoute = noSampleModalRoutes.some(route => currentPath.includes(route)); 6274 const isDedicatedPage = currentPath.includes('/sample-program'); 6275 6276 // Abort execution completely on restricted routes, except for the dedicated landing page 6277 if (isRestrictedRoute && !isDedicatedPage) { 6278 return; 6279 } 6280 6281 getStates(); 6282 // Initialize password UI state if password field is present 6283 const pw = document.getElementById('get_sample_password'); 6284 if (pw) { 6285 updatePasswordChecklistUI(pw.value || ''); 6286 } 6287 // Suppress native validation tooltip for password field; we'll handle inline 6288 document.addEventListener('invalid', function (e) { 6289 const t = e.target; 6290 if (t && t.id === 'get_sample_password') { 6291 e.preventDefault(); 6292 } 6293 }, true); 6294 6295 if (await shouldShowModalNow()) { 6296 setTimeout(() => { 6297 showModalPopUp('get-free-sample--modal'); 6298 // mark that we actually opened the modal during this page lifecycle 6299 try { window.__getFreeSampleModalWasOpened = true; } catch (e) { } 6300 document.getElementById('sample-form-step').style.display = 'block'; 6301 }, Math.max(0, popupDelaySec) * 1000); 6302 } 6303 if (showSampleProgramPage) { 6304 const sampleProgramPageMainSection = document.querySelector(".sp--forms-section"); 6305 const noSampleProgramMessage = document.querySelector(".no-sample-program"); 6306 const spSideImageSection = document.querySelector("#sp-side-image-section"); 6307 const sampleFormStep = document.querySelector("#sample-form-step"); 6308 const spHeader = document.querySelector("#sp-header"); 6309 if (sampleProgramPageMainSection) { sampleProgramPageMainSection.style.display = "flex"; } 6310 if (noSampleProgramMessage) { noSampleProgramMessage.style.display = "none"; } 6311 if (spSideImageSection) { spSideImageSection.style.display = "block"; } 6312 if (sampleFormStep) { sampleFormStep.style.display = "block"; } 6313 if (spHeader) { spHeader.style.display = "block"; } 6314 } 6315 }); 6316 6317 // Form submission handler 6318 document.addEventListener('submit', async function (e) { 6319 if (e.target.id === 'sample-program-signup-form') { 6320 e.preventDefault(); 6321 await handleSampleProgramFormSubmission(); 6322 } 6323 }); 6324 6325 async function handleSampleProgramFormSubmission() { 6326 try { 6327 // Show loading state 6328 const submitButton = document.getElementById('get-sample-button'); 6329 const originalText = submitButton.textContent; 6330 submitButton.textContent = 'SUBMITTING...'; 6331 submitButton.disabled = true; 6332 6333 // Collect form data 6334 formData = { 6335 first_name: document.getElementById('get_sample_first_name').value, 6336 last_name: document.getElementById('get_sample_last_name').value, 6337 email: document.getElementById('get_sample_email').value, 6338 address1: document.getElementById('get_sample_address1').value, 6339 address2: document.getElementById('get_sample_address2').value, 6340 city: document.getElementById('get_sample_city').value, 6341 state: document.getElementById('get_sample_state').value, 6342 zip: document.getElementById('get_sample_zip').value, 6343 phone: document.getElementById('get_sample_phone').value, 6344 password: document.getElementById('get_sample_password')?.value || '' 6345 }; 6346 // Store credentials for auto-login after OTP verification 6347 // sessionStorage is used as volatile storage without persistence 6348 storage.set('sample_program_customer_email', formData.email); 6349 storage.set('sample_program_customer_password', formData.password); 6350 6351 // Validate required fields 6352 if (!validateSampleProgramFormData(formData)) { 6353 submitButton.textContent = originalText; 6354 submitButton.disabled = false; 6355 return; 6356 } 6357 6358 // get rep id from the url 6359 const params = new URLSearchParams(window.location.search); 6360 let repId = params.get('repid'); 6361 if (!repId) { repId = localStorage.getItem('repid'); } 6362 6363 // Submit to API to trigger OTP 6364 const { code: countryCode, name: countryName } = getDefaultCountryContext();
6365 const phoneE164 = toE164(formData.phone, countryCode); 6366 const payload = { 6367 user_first_name: formData.first_name, 6368 user_last_name: formData.last_name, 6369 user_password: formData.password || '', 6370 user_email: formData.email, 6371 user_phone: phoneE164, 6372 user_address_1: formData.address1, 6373 user_address_2: formData.address2, 6374 user_city: formData.city, 6375 user_state: formData.state, 6376 user_zip: formData.zip, 6377 user_country: countryName, 6378 user_country_code: countryCode 6379 }; 6380 6381 if (repId) { 6382 payload["user_rep_id"] = repId; 6383 if (window.PZJourney) window.PZJourney.record('sample_program_rep_sent', { rep: Number(repId) || null, source: 'url_or_storage' }, 'a sample-program lead was attributed to this rep'); // shadow-audit only 6384 } else { 6385 payload["user_rep_id"] = String(defaultConsultantId); 6386 if (window.PZJourney) window.PZJourney.record('sample_program_rep_sent', { rep: Number(defaultConsultantId) || null, source: 'hardcoded_default' }, 'a sample-program lead fell back to the default rep'); // shadow-audit only 6387 } 6388 6389 let response; 6390 try { 6391 response = await window.make_PZ_API_Request('PZ_BASE_URL', '/sample_program/enrollment/request', 'POST', { body: payload }); 6392 } catch (err) { 6393 console.error(err); 6394 // 6395 if (err.status === 409) { 6396 showSampleProgramAlreadyInModal(); 6397 return; 6398 } 6399 // 6400 const msg = err?.response?.data?.error || err?.error || 'An error occurred. Please try again.'; 6401 notyf.error({ 6402 message: msg, 6403 duration: 6000, 6404 dismissible: true, 6405 }); 6406 showSampleFormError(msg); 6407 submitButton.textContent = originalText; 6408 submitButton.disabled = false; 6409 return; 6410 } 6411 6412 if (response && response.success) { 6413 showSampleProgramOTPStep(); 6414 } else { 6415 notyf.error({ 6416 message: response?.data?.error || notEligibleMessage || 'An error occurred. Please try again.', 6417 duration: 6000, 6418 dismissible: true, 6419 }); 6420 showSampleFormError(response?.data?.error || notEligibleMessage || 'An error occurred. Please try again.'); 6421 } 6422 6423 submitButton.textContent = originalText; 6424 submitButton.disabled = false; 6425 6426 } catch (error) { 6427 console.error('Error submitting form:', error); 6428 showSampleFormError('An error occurred. Please try again.'); 6429 6430 const submitButton = document.getElementById('get-sample-button'); 6431 submitButton.textContent = 'GET MY FREE SAMPLE'; 6432 submitButton.disabled = false; 6433 } 6434 } 6435 6436 function validateSampleProgramFormData(data) { 6437 const requiredFields = ['first_name', 'last_name', 'email', 'address1', 'city', 'state', 'zip', 'phone']; 6438 6439 for (let field of requiredFields) { 6440 if (!data[field] || String(data[field]).trim() === '') { 6441 showSampleFormError(`${field.replace('_', ' ').toUpperCase()} is required.`); 6442 return false; 6443 } 6444 } 6445 6446 // Name validation: no numbers, cannot start with a number 6447 if (!isValidName(data.first_name)) { 6448 showSampleFormError('First name must contain letters only and cannot start with a number.'); 6449 return false; 6450 } 6451 if (!isValidName(data.last_name)) { 6452 showSampleFormError('Last name must contain letters only and cannot start with a number.'); 6453 return false; 6454 } 6455 6456 if (!isValidEmail(data.email)) { 6457 showSampleFormError('Please enter a valid email address.'); 6458 return false; 6459 } 6460 6461 if (!isValidUSPhone(data.phone)) { 6462 showSampleFormError('Enter your phone number with country code +1 and 10 digits (e.g., +19016605560)'); 6463 return false; 6464 } 6465 6466 // Password: only required for non-logged-in users; must meet complexity rules 6467 const isLoggedIn = !!window.Customer_Email; 6468 if (!isLoggedIn) { 6469 if (!isValidPassword(data.password)) { 6470 const row = document.getElementById('password-field-row'); 6471 const feedback = row ? row.querySelector('.invalid-feedback[data-error="0.password"]') : null; 6472 if (feedback) { 6473 feedback.textContent = PASSWORD_REQUIREMENTS_TEXT; 6474 feedback.style.display = 'block'; 6475 } 6476 const pwInput = document.getElementById('get_sample_password'); 6477 if (pwInput) { 6478 pwInput.setAttribute('aria-invalid', 'true'); 6479 pwInput.classList.add('is-invalid'); 6480 pwInput.focus(); 6481 } 6482 return false;
6483 } else { 6484 const row = document.getElementById('password-field-row'); 6485 const feedback = row ? row.querySelector('.invalid-feedback[data-error="0.password"]') : null; 6486 if (feedback) { 6487 feedback.textContent = ''; 6488 feedback.style.display = 'none'; 6489 } 6490 const pwInput = document.getElementById('get_sample_password'); 6491 if (pwInput) { 6492 pwInput.removeAttribute('aria-invalid'); 6493 pwInput.classList.remove('is-invalid'); 6494 } 6495 } 6496 } 6497 6498 return true; 6499 } 6500 6501 // mockSubmitFormAndSendOTP removed (replaced by API) 6502 6503 function showSampleProgramOTPStep() { 6504 document.getElementById('sample-form-step')?.style.setProperty('display', 'none'); 6505 document.getElementById('otp-verification-step')?.style.setProperty('display', 'block'); 6506 document.getElementById('success-step')?.style.setProperty('display', 'none'); 6507 document.getElementById('loading-step')?.style.setProperty('display', 'none'); 6508 6509 // Display phone number 6510 document.getElementById('otp-phone-display').textContent = formatPhoneNumber(formData.phone); 6511 6512 currentStep = 'otp'; 6513 6514 // Clear any previous errors 6515 hideOTPError(); 6516 6517 // Focus on OTP input 6518 document.getElementById('otp-code').focus(); 6519 } 6520 6521 async function showSampleProgramSuccessRedirect() { 6522 // Mark user as not eligible in this session since they have successfully requested a sample 6523 storage.set('sp_eligibility_checked', 'not_eligible'); 6524 6525 await performAutoLogin(); 6526 hideLoadingState(); 6527 6528 const afterLoginStep = document.getElementById('after-login-step'); 6529 if (afterLoginStep) afterLoginStep.style.display = 'none'; 6530 const isLoggedIn = !!window.Customer_Email; 6531 const isDedicatedPage = window.location.pathname.includes('/sample-program') 6532 6533 if (!isDedicatedPage) { 6534 6535 if (isLoggedIn) { 6536 hideLoadingState(); 6537 const afterLoginStep = document.getElementById('after-login-step'); 6538 if (afterLoginStep) afterLoginStep.style.display = 'block'; 6539 await new Promise(resolve => setTimeout(resolve, 2000)); 6540 } 6541 6542 const modalKey = 'getFreeSampleModalLastClosed'; 6543 localStorage.setItem(modalKey, new Date().getTime()); 6544 await window.contextRedirect({ to: `/thank-you-shopping-sample?order_id=${orderId}` }); 6545 } else { 6546 hideLoadingState(); 6547 6548 document.querySelectorAll('.sp--header').forEach(el => el.style.display = 'none'); 6549 6550 const sideImage = document.getElementById('sp-side-image-section'); 6551 if (sideImage) { 6552 sideImage.style.setProperty('display', 'none', 'important'); 6553 } 6554 6555 document.getElementById('success-step')?.style.setProperty('display', 'block'); 6556 currentStep = 'success'; 6557 } 6558 } 6559 6560 function showLoadingState(message = 'VERIFYING...', subtext = 'Please wait while we confirm your code and set up your account.') { 6561 document.getElementById('sample-form-step')?.style.setProperty('display', 'none'); 6562 document.getElementById('otp-verification-step')?.style.setProperty('display', 'none'); 6563 document.getElementById('success-step')?.style.setProperty('display', 'none'); 6564 document.getElementById('already-enrolled-step')?.style.setProperty('display', 'none'); 6565 6566 const loadingStep = document.getElementById('loading-step'); 6567 if (loadingStep) { 6568 loadingStep.style.display = 'block'; 6569 const msgEl = loadingStep.querySelector('.loading-text'); 6570 if (msgEl) msgEl.textContent = message; 6571 const subEl = loadingStep.querySelector('.loading-subtext'); 6572 if (subEl) subEl.textContent = subtext; 6573 } 6574 } 6575 6576 function hideLoadingState() { 6577 const loadingStep = document.getElementById('loading-step'); 6578 if (loadingStep) { 6579 loadingStep.style.display = 'none'; 6580 } 6581 } 6582 6583 function showSampleProgramAlreadyInModal() { 6584 document.getElementById('sample-form-step').style.display = 'none'; 6585 document.getElementById('otp-verification-step').style.display = 'none'; 6586 document.getElementById('already-enrolled-step').style.display = 'block'; 6587 6588 // currentStep = 'success'; 6589 } 6590 6591 function goBackToSampleProgramForm() { 6592 document.getElementById('sample-form-step')?.style.setProperty('display', 'block'); 6593 document.getElementById('otp-verification-step')?.style.setProperty('display', 'none'); 6594 document.getElementById('success-step')?.style.setProperty('display', 'none'); 6595 document.getElementById('loading-step')?.style.setProperty('display', 'none'); 6596 6597 currentStep = 'form'; 6598 6599 // Clear form errors 6600 hideSampleFormError(); 6601 } 6602 6603 // OTP verification handlers 6604 document.addEventListener('click', async function (e) { 6605 if (e.target.id === 'verify-otp-button') { 6606 await handleOTPVerification(); 6607 } else if (e.target.id === 'resend-otp-button') { 6608 await handleResendOTP(); 6609 } else if (e.target.id === 'change-phone-button') { 6610 goBackToSampleProgramForm(); 6611 } 6612 }); 6613 6614 const performAutoLogin = async () => { 6615 const email = storage.get('sample_program_customer_email') || formData.email; 6616 const password = storage.get('sample_program_customer_password') || formData.password; 6617 6618 if (email && password) { 6619 6620 // Wait a bit before attempting login to allow backend to finish user creation 6621 // This handles the race condition between OTP verification and user creation 6622 // BigCommerce can take several seconds to propagate the new user index 6623 const delays = [0, 200, 200, 200, 200]; // Increased delays: 3s, 5s, 8s, 10s 6624 let attempt = 0; 6625 let loginSuccess = false;
6626 6627 for (const delay of delays) { 6628 attempt++; 6629 6630 // Wait before attempting 6631 await new Promise(resolve => setTimeout(resolve, delay)); 6632 6633 try { 6634 // Attempt login 6635 await loginHandler.login_User_Async({ 6636 login_email: email, 6637 login_pass: password, 6638 }, false); 6639 6640 // If we reach here without error, check if customer exists 6641 const customerCheck = await loginHandler.getBCCustomerDetails(false); 6642 if (customerCheck?.data?.customer) { 6643 loginSuccess = true; 6644 storage.remove('sample_program_customer_password'); 6645 storage.remove('sample_program_customer_email'); 6646 // Redirect to home as requested 6647 break; 6648 } 6649 } catch (error) { 6650 6651 // If this is the last attempt, log final failure 6652 if (attempt === delays.length) { 6653 console.error('Auto-login failed after all attempts. User can login manually.'); 6654 notyf.error({ 6655 message: 'Please login with your credentials to continue.', 6656 duration: 5000, 6657 dismissible: true, 6658 }); 6659 } 6660 } 6661 } 6662 6663 // Clean up sessionStorage after all attempts 6664 // sessionStorage.removeItem('sample_program_customer_email'); 6665 // sessionStorage.removeItem('sample_program_customer_password'); 6666 } else { 6667 console.warn('Auto-login skipped: credentials not found in sessionStorage'); 6668 } 6669 }; 6670 6671 async function handleOTPVerification() { 6672 try { 6673 const otpCode = document.getElementById('otp-code').value; 6674 6675 if (!otpCode || otpCode.length !== 6) { 6676 showOTPError('Please enter a valid 6-digit code.'); 6677 return; 6678 } 6679 6680 // Show loading state 6681 const verifyButton = document.getElementById('verify-otp-button'); 6682 const originalText = verifyButton.textContent; 6683 verifyButton.textContent = 'VERIFYING...'; 6684 verifyButton.disabled = true; 6685 showLoadingState('VERIFYING...', 'Please wait while we confirm your code.'); 6686 6687 // Verify OTP via API 6688 const response = await verifyOTPWithAPI(otpCode); 6689 6690 const responseCode = response?.details?.code 6691 // Helper function to perform auto-login 6692 6693 if (response.success) { 6694 orderId = response?.details?.new_order_bc_id; 6695 verifyButton.textContent = 'LOGGING IN...'; 6696 showLoadingState('LOGGING IN...', 'We are finalizing your account and getting everything ready.'); 6697 await showSampleProgramSuccessRedirect(); 6698 } else { 6699 // alert(`Response Code: ${responseCode}`); 6700 if (responseCode === 'order_not_created_but_placed') { 6701 notyf.error({ 6702 message: response.message, 6703 duration: 10000, 6704 dismissible: true, 6705 }); 6706 verifyButton.textContent = 'LOGGING IN...'; 6707 showLoadingState('LOGGING IN...', 'We are finalizing your account and getting everything ready.'); 6708 await showSampleProgramSuccessRedirect(); 6709 } else { 6710 hideLoadingState(); 6711 document.getElementById('otp-verification-step').style.display = 'block'; 6712 showOTPError(response.message || 'Invalid code. Please try again.'); 6713 } 6714 } 6715 verifyButton.textContent = originalText; 6716 verifyButton.disabled = false; 6717 6718 } catch (error) { 6719 console.error('Error verifying OTP:', error); 6720 hideLoadingState(); 6721 document.getElementById('otp-verification-step').style.display = 'block'; 6722 showOTPError('An error occurred. Please try again.'); 6723 6724 const verifyButton = document.getElementById('verify-otp-button'); 6725 verifyButton.textContent = 'VERIFY CODE'; 6726 verifyButton.disabled = false; 6727 } 6728 } 6729 6730 async function handleResendOTP() { 6731 // Clear OTP input 6732 document.getElementById('otp-code').value = ''; 6733 if (otpResendCount >= otpMaxAttempts) { 6734 showOTPError('Maximum resend attempts reached. Please try again later.'); 6735 return; 6736 } 6737 6738 try { 6739 // Show loading state 6740 const resendButton = document.getElementById('resend-otp-button'); 6741 const originalText = resendButton.textContent; 6742 resendButton.textContent = 'SENDING...'; 6743 resendButton.disabled = true; 6744 6745 // Resend via API 6746 const response = await resendOTPViaAPI(); 6747 6748 if (response.success) { 6749 otpResendCount++; 6750 // Update button text to show countdown or disable after max attempts 6751 if (otpResendCount >= otpMaxAttempts) { 6752 resendButton.textContent = 'MAX ATTEMPTS REACHED'; 6753 resendButton.disabled = true; 6754 } else { 6755 resendButton.textContent = originalText; 6756 resendButton.disabled = false;
6757 // Optional: Add countdown timer 6758 startResendCoolDown(resendButton); 6759 } 6760 6761 6762 hideOTPError(); 6763 } else { 6764 showOTPError(response.message || 'Failed to resend code. Please try again.'); 6765 resendButton.textContent = originalText; 6766 resendButton.disabled = false; 6767 } 6768 6769 } catch (error) { 6770 console.error('Error resending OTP:', error); 6771 showOTPError('An error occurred. Please try again.'); 6772 6773 const resendButton = document.getElementById('resend-otp-button'); 6774 resendButton.textContent = 'RESEND CODE'; 6775 resendButton.disabled = false; 6776 } 6777 } 6778 6779 function startResendCoolDown(button) { 6780 let countdown = parseInt(otpRequestDelaySec) || 30; 6781 const originalText = button.textContent; 6782 6783 button.disabled = true; 6784 const interval = setInterval(() => { 6785 button.textContent = `RESEND CODE (${countdown}s)`; 6786 countdown--; 6787 6788 if (countdown < 0) { 6789 clearInterval(interval); 6790 button.textContent = originalText; 6791 button.disabled = false; 6792 } 6793 }, 1000); 6794 } 6795 6796 async function verifyOTPWithAPI(code) { 6797 const { code: countryCode } = getDefaultCountryContext(); 6798 const phoneE164 = toE164(formData.phone, countryCode); 6799 try { 6800 const response = await window.make_PZ_API_Request('PZ_BASE_URL', '/sample_program/enrollment/confirm', 'POST', { 6801 body: { 6802 user_phone: phoneE164, 6803 user_otp: code, 6804 }, 6805 }); 6806 return response; 6807 } catch (err) { 6808 return { success: false, message: err?.response?.data?.error || err?.error || 'OTP verification failed', details: err?.response?.data?.details || {} }; 6809 } 6810 } 6811 6812 async function resendOTPViaAPI() { 6813 // Call dedicated resend endpoint 6814 const { code: countryCode } = getDefaultCountryContext(); 6815 const phoneE164 = toE164(formData.phone, countryCode); 6816 try { 6817 const response = await window.make_PZ_API_Request('PZ_BASE_URL', '/sample_program/enrollment/resend_otp', 'POST', { body: { user_phone: phoneE164 } }); 6818 return response; 6819 } catch (err) { 6820 return { success: false, message: err?.response?.data?.error || err?.error || 'Failed to resend code' }; 6821 } 6822 } 6823 6824 function toE164(input, countryCode = 'US') { 6825 // Normalize to E.164 for US/CA: always +1 followed by 10 digits 6826 const raw = String(input || ''); 6827 let digits = raw.replace(/\D/g, ''); 6828 const isUSCA = countryCode === 'US' || countryCode === 'CA'; 6829 if (isUSCA) { 6830 if (digits.startsWith('1')) { 6831 // Keep country code and next 10 digits 6832 return '+1' + digits.slice(1, 11); 6833 } 6834 // If 10+ digits without leading 1, take first 10 as national 6835 return '+1' + digits.slice(0, 10); 6836 } 6837 // Fallback for other countries (not expected here) 6838 return (raw.trim().startsWith('+') ? raw.trim() : `+${digits}`); 6839 } 6840 6841 // Error handling functions 6842 function showSampleFormError(message) { 6843 const errorElement = document.querySelector('.form-error'); 6844 const errorMessageElement = document.querySelector('.form-error .alertBox-message'); 6845 if (errorMessageElement) errorMessageElement.textContent = message; 6846 if (errorElement) errorElement.style.display = 'block'; 6847 } 6848 6849 function hideSampleFormError() { 6850 const errorElement = document.querySelector('.form-error'); 6851 errorElement.style.display = 'none'; 6852 } 6853 6854 function showOTPError(message) { 6855 const errorElement = document.getElementById('otp-error'); 6856 const errorMessageElement = document.querySelector('#otp-error .alertBox-message'); 6857 if (errorMessageElement) errorMessageElement.textContent = message; 6858 if (errorElement) errorElement.style.display = 'block'; 6859 } 6860 6861 function hideOTPError() { 6862 const errorElement = document.getElementById('otp-error'); 6863 errorElement.style.display = 'none'; 6864 } 6865 6866 // Utility functions 6867 function formatPhoneNumber(phone) { 6868 const cleaned = String(phone || '').replace(/\D/g, ''); 6869 let d = cleaned; 6870 // If +1XXXXXXXXXX, drop the leading 1 for display formatting 6871 if (cleaned.length === 11 && cleaned.startsWith('1')) { 6872 d = cleaned.slice(1); 6873 } 6874 if (d.length === 10) { 6875 return `(${d.substring(0, 3)}) ${d.substring(3, 6)}-${d.substring(6)}`; 6876 } 6877 return phone; 6878 } 6879 6880 // Input formatting and constraints 6881 // Normalize pasted/typed phone to +1XXXXXXXXXX (US/CA) 6882 document.addEventListener('paste', function (e) { 6883 if (e.target.id === 'get_sample_phone') { 6884 e.preventDefault(); 6885 const clip = (e.clipboardData || window.clipboardData); 6886 const text = clip ? (clip.getData('text') || '') : '';
6887 const digits = String(text).replace(/\D/g, ''); 6888 let normalized; 6889 if (digits.startsWith('1')) { 6890 normalized = '+1' + digits.slice(1, 11); 6891 } else { 6892 normalized = '+1' + digits.slice(0, 10); 6893 } 6894 e.target.value = normalized || '+1'; 6895 } 6896 }); 6897 6898 document.addEventListener('input', function (e) { 6899 if (e.target.id === 'otp-code') { 6900 // Only allow numbers 6901 e.target.value = e.target.value.replace(/\D/g, ''); 6902 return; 6903 } 6904 6905 if (e.target.id === 'get_sample_first_name' || e.target.id === 'get_sample_last_name') { 6906 // Strip digits anywhere 6907 const cur = e.target.value || ''; 6908 const cleaned = cur.replace(/[0-9]/g, ''); 6909 if (cleaned !== cur) e.target.value = cleaned; 6910 return; 6911 } 6912 6913 if (e.target.id === 'get_sample_phone') { 6914 // Always coerce to +1 followed by up to 10 digits (US/CA only) 6915 const digits = String(e.target.value || '').replace(/\D/g, ''); 6916 let normalized; 6917 if (digits.startsWith('1')) { 6918 normalized = '+1' + digits.slice(1, 11); 6919 } else { 6920 normalized = '+1' + digits.slice(0, 10); 6921 } 6922 e.target.value = normalized || '+1'; 6923 return; 6924 } 6925 6926 // Live password validation to update checklist (do not disable submit) 6927 if (e.target.id === 'get_sample_password') { 6928 const val = String(e.target.value || ''); 6929 updatePasswordChecklistUI(val); 6930 // Do not show inline error during typing; always hide it on input 6931 const row = document.getElementById('password-field-row'); 6932 const feedback = row ? row.querySelector('.invalid-feedback[data-error="0.password"]') : null; 6933 const pwInput = document.getElementById('get_sample_password'); 6934 if (feedback) { feedback.textContent = ''; feedback.style.display = 'none'; } 6935 if (pwInput) { pwInput.removeAttribute('aria-invalid'); pwInput.classList.remove('is-invalid'); } 6936 return; 6937 } 6938 }); 6939 6940 async function closeGetFreeSampleModal() { 6941 const modalKey = 'getFreeSampleModalLastClosed'; 6942 localStorage.setItem(modalKey, new Date().getTime()); 6943 hideModalPopUp('get-free-sample--modal'); 6944 // Set session and 24-hour cooldown only if modal was actually opened by our code 6945 try { 6946 if (window.__getFreeSampleModalWasOpened) { 6947 markModalShownOnce(); 6948 window.__getFreeSampleModalWasOpened = false; // prevent duplicate marking 6949 } 6950 } catch (e) { } 6951 resetSampleFormState(); 6952 6953 } 6954 6955 function handleClickShopNow() { 6956 closeGetFreeSampleModal(); 6957 window.open("/shop-new-products/", "_self"); 6958 } 6959 6960 function resetSampleFormState() { 6961 // Reset to first step 6962 document.getElementById('sample-form-step')?.style.setProperty('display', 'block'); 6963 document.getElementById('otp-verification-step')?.style.setProperty('display', 'none'); 6964 document.getElementById('success-step')?.style.setProperty('display', 'none'); 6965 document.getElementById('loading-step')?.style.setProperty('display', 'none'); 6966 6967 // Clear form data 6968 formData = {}; 6969 currentStep = 'form'; 6970 otpResendCount = 0; 6971 6972 // Clear OTP input 6973 document.getElementById('otp-code').value = ''; 6974 6975 // Hide errors 6976 hideSampleFormError(); 6977 hideOTPError(); 6978 6979 // Reset button states 6980 const verifyButton = document.getElementById('verify-otp-button'); 6981 verifyButton.textContent = 'VERIFY CODE'; 6982 verifyButton.disabled = false; 6983 6984 const resendButton = document.getElementById('resend-otp-button'); 6985 resendButton.textContent = 'RESEND CODE'; 6986 resendButton.disabled = false; 6987 6988 const submitButton = document.getElementById('get-sample-button'); 6989 submitButton.textContent = 'GET MY FREE SAMPLE'; 6990 submitButton.disabled = false; 6991 } 6992 6993 document.addEventListener("DOMContentLoaded", function () { 6994 const emailInput = document.getElementById('get_sample_email'); 6995 const phoneInput = document.getElementById('get_sample_phone'); 6996 const legalComponent = document.querySelector('legal-opt-in'); 6997 6998 function syncData() { 6999 if (legalComponent) { 7000 legalComponent.setAttribute('email', emailInput.value); 7001 legalComponent.setAttribute('phone', phoneInput.value); 7002 7003 legalComponent.email = emailInput.value; 7004 legalComponent.phone = phoneInput.value; 7005 } 7006 } 7007 7008 if (emailInput && phoneInput) { 7009 emailInput.addEventListener('input', syncData); 7010 phoneInput.addEventListener('input', syncData); 7011 7012 setTimeout(syncData, 500); 7013 } 7014 }); 7015</script>
7015 <div class="c--modal product-details--modal" tabindex="-1" style="--bs-modal-width: 852px;"> 7016 <div class="c--modal-dialog"> 7017 <div class="c--modal-content"> 7018 <div class="c--modal-body"> 7019 <div class="product-details--modal__content"> 7020 <div class="product-details--modal__image"> 7021 <img product-detail-main-image src="" alt="Product Image" /> 7022 </div> 7023 7024 <div class="product-details--modal__info"> 7025 <h3 product-detail-name></h3> 7026 <p><span class="product-categories"><span product-detail-categories></span> | </span><span product-detail-sku></span></p> 7027 <p product-detail-reviews></p> 7028 <p product-detail-price></p> 7029 <div product-detail-addToCart></div> 7030 </div> 7031 </div> 7032 <div class="product-details--modal__description"> 7033 <h4 class="description-heading">DESCRIPTION</h4> 7034 <hr> 7035 <p product-detail-description></p> 7036 </div> 7037 </div> 7038 7039 <button class="modal-close" onclick="hideModalPopUp('product-details--modal')">Ã</button> 7040 </div> 7041 </div> 7042</div> 7043
7043<script type="module" src="https://cdn.jsdelivr.net/npm/@shoelace-style/[email protected]/cdn/components/spinner/spinner.js"></script>
7043 7044
7044<script src="https://cdn.jsdelivr.net/npm/notyf@3/notyf.min.js"></script>
7044 7045
7045<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/notifications/notyf.js"></script>
7045 7046
7046<script> 7047 function onThemeBundleMain() { 7048 window.stencilBootstrap("login", "{\"zoomSize\":\"680x680\",\"productSize\":\"260x260\",\"genericError\":\"Oops! Something went wrong.\",\"urls\":{\"home\":\"https://pinkzebrahome.com/\",\"brands\":\"https://pinkzebrahome.com/brands/\",\"search\":\"https://pinkzebrahome.com/search.php\",\"compare\":\"https://pinkzebrahome.com/compare\",\"sitemap\":\"https://pinkzebrahome.com/sitemap.php\",\"contact_us_submit\":\"https://pinkzebrahome.com/pages.php?action=sendContactForm\",\"subscribe\":{\"action\":\"https://pinkzebrahome.com/subscribe.php\"},\"checkout\":{\"single_address\":\"https://pinkzebrahome.com/checkout\",\"multiple_address\":\"https://pinkzebrahome.com/checkout.php?action=multiple\"},\"account\":{\"orders\":{\"all\":\"https://pinkzebrahome.com/account.php?action=order_status\",\"completed\":\"https://pinkzebrahome.com/account.php?action=view_orders\",\"save_new_return\":\"https://pinkzebrahome.com/account.php?action=save_new_return\"},\"returns\":\"https://pinkzebrahome.com/account.php?action=view_returns\",\"addresses\":\"https://pinkzebrahome.com/account.php?action=address_book\",\"inbox\":\"https://pinkzebrahome.com/account.php?action=inbox\",\"send_message\":\"https://pinkzebrahome.com/account.php?action=send_message\",\"add_address\":\"https://pinkzebrahome.com/account.php?action=add_shipping_address\",\"update_action\":\"https://pinkzebrahome.com/account.php?action=update_account\",\"details\":\"https://pinkzebrahome.com/account.php?action=account_details\",\"recent_items\":\"https://pinkzebrahome.com/account.php?action=recent_items\",\"index\":\"https://pinkzebrahome.com/account.php\",\"wishlists\":{\"all\":\"https://pinkzebrahome.com/wishlist.php\",\"add\":\"https://pinkzebrahome.com/wishlist.php?action=addwishlist\",\"edit\":\"https://pinkzebrahome.com/wishlist.php?action=editwishlist\",\"delete\":\"https://pinkzebrahome.com/wishlist.php?action=deletewishlist\"},\"payment_methods\":{\"all\":\"https://pinkzebrahome.com/account.php?action=payment_methods\"}},\"auth\":{\"login\":\"https://pinkzebrahome.com/login.php\",\"check_login\":\"https://pinkzebrahome.com/login.php?action=check_login\",\"create_account\":\"https://pinkzebrahome.com/login.php?action=create_account\",\"save_new_account\":\"https://pinkzebrahome.com/login.php?action=save_new_account\",\"forgot_password\":\"https://pinkzebrahome.com/login.php?action=reset_password\",\"send_password_email\":\"https://pinkzebrahome.com/login.php?action=send_password_email\",\"save_new_password\":\"https://pinkzebrahome.com/login.php?action=save_new_password\",\"logout\":\"https://pinkzebrahome.com/login.php?action=logout\"},\"cart\":\"https://pinkzebrahome.com/cart.php\",\"product\":{\"post_review\":\"https://pinkzebrahome.com/postreview.php\"},\"gift_certificate\":{\"purchase\":\"https://pinkzebrahome.com/giftcertificates.php\",\"redeem\":\"https://pinkzebrahome.com/giftcertificates.php?action=redeem\",\"balance\":\"https://pinkzebrahome.com/giftcertificates.php?action=balance\"},\"rss\":{\"products\":[]}},\"secureBaseUrl\":\"https://pinkzebrahome.com\",\"cartId\":null,\"template\":\"pages/auth/login\",\"validationDictionaryJSON\":\"{\\\"locale\\\":\\\"en\\\",\\\"locales\\\":{\\\"validation_messages.valid_email\\\":\\\"en\\\",\\\"validation_messages.password\\\":\\\"en\\\",\\\"validation_messages.password_match\\\":\\\"en\\\",\\\"validation_messages.invalid_password\\\":\\\"en\\\",\\\"validation_messages.field_not_blank\\\":\\\"en\\\",\\\"validation_messages.certificate_amount\\\":\\\"en\\\",\\\"validation_messages.certificate_amount_range\\\":\\\"en\\\",\\\"validation_messages.price_min_evaluation\\\":\\\"en\\\",\\\"validation_messages.price_max_evaluation\\\":\\\"en\\\",\\\"validation_messages.price_min_not_entered\\\":\\\"en\\\",\\\"validation_messages.price_max_not_entered\\\":\\\"en\\\",\\\"validation_messages.price_invalid_value\\\":\\\"en\\\",\\\"validation_messages.invalid_gift_certificate\\\":\\\"en\\\"},\\\"translations\\\":{\\\"validation_messages.valid_email\\\":\\\"You must enter a valid email.\\\",\\\"validation_messages.password\\\":\\\"You must enter a password.\\\",\\\"validation_messages.password_match\\\":\\\"Your passwords do not match.\\\",\\\"validation_messages.invalid_password\\\":\\\"Passwords must be at least 7 characters and contain both alphabetic and numeric characters.\\\",\\\"validation_messages.field_not_blank\\\":\\\" field cannot be blank.\\\",\\\"validation_messages.certificate_amount\\\":\\\"You must enter a gift certificate amount.\\\",\\\"validation_messages.certificate_amount_range\\\":\\\"You must enter a certificate amount between [MIN] and [MAX]\\\",\\\"validation_messages.price_min_evaluation\\\":\\\"Min. price must be less than max. price.\\\",\\\"validation_messages.price_max_evaluation\\\":\\\"Min. price must be less than max. price.\\\",\\\"validation_messages.price_min_not_entered\\\":\\\"Min. price is required.\\\",\\\"validation_messages.price_max_n
7048ot_entered\\\":\\\"Max. price is required.\\\",\\\"validation_messages.price_invalid_value\\\":\\\"Input must be greater than 0.\\\",\\\"validation_messages.invalid_gift_certificate\\\":\\\"Please enter your valid certificate code.\\\"}}\",\"validationFallbackDictionaryJSON\":\"{\\\"locale\\\":\\\"en\\\",\\\"locales\\\":{\\\"validation_fallback_messages.valid_email\\\":\\\"en\\\",\\\"validation_fallback_messages.password\\\":\\\"en\\\",\\\"validation_fallback_messages.password_match\\\":\\\"en\\\",\\\"validation_fallback_messages.invalid_password\\\":\\\"en\\\",\\\"validation_fallback_messages.field_not_blank\\\":\\\"en\\\",\\\"validation_fallback_messages.certificate_amount\\\":\\\"en\\\",\\\"validation_fallback_messages.certificate_amount_range\\\":\\\"en\\\",\\\"validation_fallback_messages.price_min_evaluation\\\":\\\"en\\\",\\\"validation_fallback_messages.price_max_evaluation\\\":\\\"en\\\",\\\"validation_fallback_messages.price_min_not_entered\\\":\\\"en\\\",\\\"validation_fallback_messages.price_max_not_entered\\\":\\\"en\\\",\\\"validation_fallback_messages.price_invalid_value\\\":\\\"en\\\",\\\"validation_fallback_messages.invalid_gift_certificate\\\":\\\"en\\\"},\\\"translations\\\":{\\\"validation_fallback_messages.valid_email\\\":\\\"You must enter a valid email.\\\",\\\"validation_fallback_messages.password\\\":\\\"You must enter a password.\\\",\\\"validation_fallback_messages.password_match\\\":\\\"Your passwords do not match.\\\",\\\"validation_fallback_messages.invalid_password\\\":\\\"Passwords must be at least 7 characters and contain both alphabetic and numeric characters.\\\",\\\"validation_fallback_messages.field_not_blank\\\":\\\" field cannot be blank.\\\",\\\"validation_fallback_messages.certificate_amount\\\":\\\"You must enter a gift certificate amount.\\\",\\\"validation_fallback_messages.certificate_amount_range\\\":\\\"You must enter a certificate amount between [MIN] and [MAX]\\\",\\\"validation_fallback_messages.price_min_evaluation\\\":\\\"Min. price must be less than max. price.\\\",\\\"validation_fallback_messages.price_max_evaluation\\\":\\\"Min. price must be less than max. price.\\\",\\\"validation_fallback_messages.price_min_not_entered\\\":\\\"Min. price is required.\\\",\\\"validation_fallback_messages.price_max_not_entered\\\":\\\"Max. price is required.\\\",\\\"validation_fallback_messages.price_invalid_value\\\":\\\"Input must be greater than 0.\\\",\\\"validation_fallback_messages.invalid_gift_certificate\\\":\\\"Please enter your valid certificate code.\\\"}}\",\"validationDefaultDictionaryJSON\":\"{\\\"locale\\\":\\\"en\\\",\\\"locales\\\":{\\\"validation_default_messages.valid_email\\\":\\\"en\\\",\\\"validation_default_messages.password\\\":\\\"en\\\",\\\"validation_default_messages.password_match\\\":\\\"en\\\",\\\"validation_default_messages.invalid_password\\\":\\\"en\\\",\\\"validation_default_messages.field_not_blank\\\":\\\"en\\\",\\\"validation_default_messages.certificate_amount\\\":\\\"en\\\",\\\"validation_default_messages.certificate_amount_range\\\":\\\"en\\\",\\\"validation_default_messages.price_min_evaluation\\\":\\\"en\\\",\\\"validation_default_messages.price_max_evaluation\\\":\\\"en\\\",\\\"validation_default_messages.price_min_not_entered\\\":\\\"en\\\",\\\"validation_default_messages.price_max_not_entered\\\":\\\"en\\\",\\\"validation_default_messages.price_invalid_value\\\":\\\"en\\\",\\\"validation_default_messages.invalid_gift_certificate\\\":\\\"en\\\"},\\\"translations\\\":{\\\"validation_default_messages.valid_email\\\":\\\"You must enter a valid email.\\\",\\\"validation_default_messages.password\\\":\\\"You must enter a password.\\\",\\\"validation_default_messages.password_match\\\":\\\"Your passwords do not match.\\\",\\\"validation_default_messages.invalid_password\\\":\\\"Passwords must be at least 7 characters and contain both alphabetic and numeric characters.\\\",\\\"validation_default_messages.field_not_blank\\\":\\\"The field cannot be blank.\\\",\\\"validation_default_messages.certificate_amount\\\":\\\"You must enter a gift certificate amount.\\\",\\\"validation_default_messages.certificate_amount_range\\\":\\\"You must enter a certificate amount between [MIN] and [MAX]\\\",\\\"validation_default_messages.price_min_evaluation\\\":\\\"Min. price must be less than max. price.\\\",\\\"validation_default_messages.price_max_evaluation\\\":\\\"Min. price must be less than max. price.\\\",\\\"validation_default_messages.price_min_not_entered\\\":\\\"Min. price is required.\\\",\\\"validation_default_messages.price_max_n
7048ot_entered\\\":\\\"Max. price is required.\\\",\\\"validation_default_messages.price_invalid_value\\\":\\\"Input must be greater than 0.\\\",\\\"validation_default_messages.invalid_gift_certificate\\\":\\\"Please enter your valid certificate code.\\\"}}\",\"carouselArrowAndDotAriaLabel\":\"Go to slide [SLIDE_NUMBER] of [SLIDES_QUANTITY]\",\"carouselActiveDotAriaLabel\":\"active\",\"carouselContentAnnounceMessage\":\"You are currently on slide [SLIDE_NUMBER] of [SLIDES_QUANTITY]\",\"themeSetting\":{\"optimizedCheckout-formChecklist-color\":\"#333333\",\"homepage_featured_products_show_carousel_arrows\":true,\"homepage_new_products_column_count\":4,\"optimizedCheckout-buttonPrimary-backgroundColorActive\":\"#000000\",\"optimizedCheckout-colorFocus\":\"#FF1378\",\"fontSize-root\":16,\"show_accept_amex\":false,\"optimizedCheckout-buttonPrimary-borderColorDisabled\":\"transparent\",\"homepage_top_products_count\":4,\"brandpage_products_per_page\":24,\"color-secondaryDarker\":\"\",\"color-secondaryLighter\":\"#F2F8FF\",\"card--alternate-color--hover\":\"#ffffff\",\"navUser-color\":\"#000000\",\"color-textBase--active\":\"#FF1378\",\"show_powered_by\":false,\"preview_catr_items_limit\":5,\"show_accept_amazonpay\":false,\"category_page_products_per_page\":24,\"social_icon_placement_bottom\":\"bottom_none\",\"button--secondary-colorHover\":\"#FF1378\",\"fontSize-h4\":14,\"checkRadio-borderColor\":\"#9F9F9F\",\"color-primaryDarker\":\"\",\"optimizedCheckout-buttonPrimary-colorHover\":\"#ffffff\",\"brand_size\":\"190x250\",\"optimizedCheckout-logo-position\":\"left\",\"optimizedCheckout-discountBanner-backgroundColor\":\"#e5e5e5\",\"color-textLink--hover\":\"#FF1378\",\"pdp-sale-price-label\":\"\",\"optimizedCheckout-headingPrimary-font\":\"Google_Lato_700\",\"logo_size\":\"250x100\",\"tab-mobile-borderColor\":\"#9F9F9F\",\"optimizedCheckout-formField-backgroundColor\":\"#ffffff\",\"optimizedCheckout-buttonSecondary-backgroundColorHover\":\"#f5f5f5\",\"PZ_Hero_Text_CTA_Text_value\":\"Lorem ipsum dolor sit amet, sequat.\",\"footer-backgroundColor\":\"#FFF0F7\",\"navPages-color\":\"#373737\",\"productpage_reviews_count\":9,\"optimizedCheckout-step-borderColor\":\"#dddddd\",\"scentflirt_products_img\":{\"196\":\"/content/kit-detail-189.png\",\"197\":\"/content/kit-detail-190.png\",\"198\":\"/content/kit-detail-191.png\"},\"show_accept_paypal\":false,\"paymentbuttons-paypal-label\":\"checkout\",\"paymentbuttons-paypal-shape\":\"rect\",\"optimizedCheckout-discountBanner-textColor\":\"#333333\",\"pdp-retail-price-label\":\"\",\"optimizedCheckout-buttonPrimary-font\":\"Google_Lato_500\",\"optimizedCheckout-backgroundImage-size\":\"1000x400\",\"pdp_sold_out_label\":\"\",\"carousel-dot-color\":\"#5D5D5D\",\"button--disabled-backgroundColor\":\"#FFFFFF\",\"blockquote-cite-font-color\":\"#999999\",\"optimizedCheckout-formField-shadowColor\":\"transparent\",\"special-font\":\"Northwell\",\"container-fill-base\":\"#ffffff\",\"homepage_featured_products_column_count\":4,\"button--default-color\":\"#FF1378\",\"pace-progress-backgroundColor\":\"#999999\",\"color-textLink--active\":\"#FF1378\",\"scentflirt_addon_option_ids\":{\"171\":{\"optionId\":\"122\",\"optionValue\":\"119\"}},\"optimizedCheckout-loadingToaster-backgroundColor\":\"#333333\",\"color-textHeading\":\"#FF1378\",\"show_accept_discover\":false,\"bc_base_url\":\"https://api.bigcommerce.com/\",\"scentflirt_comparison_chart\":\"/content/chart_comparison.png\",\"optimizedCheckout-formField-errorColor\":\"#d14343\",\"spinner-borderColor-dark\":\"#999999\",\"input-font-color\":\"#9F9F9F\",\"select-bg-color\":\"#ffffff\",\"navUser-main-dropdown-borderColor\":\"#ffffff\",\"show_accept_mastercard\":false,\"show_custom_fields_tabs\":false,\"color_text_product_sale_badges\":\"#ffffff\",\"optimizedCheckout-link-font\":\"Google_Lato_500\",\"homepage_show_carousel_arrows\":false,\"supported_payment_methods\":[\"card\",\"paypal\",\"bank\"],\"carousel-arrow-bgColor\":\"transparent\",\"lazyload_mode\":\"lazyload+lqip\",\"carousel-title-color\":\"#FF1378\",\"custom_heading_value\":\"\",\"show_accept_googlepay\":false,\"card--alternate-borderColor\":\"#FF1378\",\"homepage_new_products_count\":5,\"button--disabled-color\":\"#9F9F9F\",\"USA_states\":[{\"name\":\"Alabama\",\"abbreviation\":\"AL\"},{\"name\":\"Alaska\",\"abbreviation\":\"AK\"},{\"name\":\"American Samoa\",\"abbreviation\":\"AS\"}
7048,{\"name\":\"Arizona\",\"abbreviation\":\"AZ\"},{\"name\":\"Arkansas\",\"abbreviation\":\"AR\"},{\"name\":\"California\",\"abbreviation\":\"CA\"},{\"name\":\"Colorado\",\"abbreviation\":\"CO\"},{\"name\":\"Connecticut\",\"abbreviation\":\"CT\"},{\"name\":\"Delaware\",\"abbreviation\":\"DE\"},{\"name\":\"District Of Columbia\",\"abbreviation\":\"DC\"},{\"name\":\"Federated States Of Micronesia\",\"abbreviation\":\"FM\"},{\"name\":\"Florida\",\"abbreviation\":\"FL\"},{\"name\":\"Georgia\",\"abbreviation\":\"GA\"},{\"name\":\"Guam\",\"abbreviation\":\"GU\"},{\"name\":\"Hawaii\",\"abbreviation\":\"HI\"},{\"name\":\"Idaho\",\"abbreviation\":\"ID\"},{\"name\":\"Illinois\",\"abbreviation\":\"IL\"},{\"name\":\"Indiana\",\"abbreviation\":\"IN\"},{\"name\":\"Iowa\",\"abbreviation\":\"IA\"},{\"name\":\"Kansas\",\"abbreviation\":\"KS\"},{\"name\":\"Kentucky\",\"abbreviation\":\"KY\"},{\"name\":\"Louisiana\",\"abbreviation\":\"LA\"},{\"name\":\"Maine\",\"abbreviation\":\"ME\"},{\"name\":\"Marshall Islands\",\"abbreviation\":\"MH\"},{\"name\":\"Maryland\",\"abbreviation\":\"MD\"},{\"name\":\"Massachusetts\",\"abbreviation\":\"MA\"},{\"name\":\"Michigan\",\"abbreviation\":\"MI\"},{\"name\":\"Minnesota\",\"abbreviation\":\"MN\"},{\"name\":\"Mississippi\",\"abbreviation\":\"MS\"},{\"name\":\"Missouri\",\"abbreviation\":\"MO\"},{\"name\":\"Montana\",\"abbreviation\":\"MT\"},{\"name\":\"Nebraska\",\"abbreviation\":\"NE\"},{\"name\":\"Nevada\",\"abbreviation\":\"NV\"},{\"name\":\"New Hampshire\",\"abbreviation\":\"NH\"},{\"name\":\"New Jersey\",\"abbreviation\":\"NJ\"},{\"name\":\"New Mexico\",\"abbreviation\":\"NM\"},{\"name\":\"New York\",\"abbreviation\":\"NY\"},{\"name\":\"North Carolina\",\"abbreviation\":\"NC\"},{\"name\":\"North Dakota\",\"abbreviation\":\"ND\"},{\"name\":\"Northern Mariana Islands\",\"abbreviation\":\"MP\"},{\"name\":\"Ohio\",\"abbreviation\":\"OH\"},{\"name\":\"Oklahoma\",\"abbreviation\":\"OK\"},{\"name\":\"Oregon\",\"abbreviation\":\"OR\"},{\"name\":\"Palau\",\"abbreviation\":\"PW\"},{\"name\":\"Pennsylvania\",\"abbreviation\":\"PA\"},{\"name\":\"Puerto Rico\",\"abbreviation\":\"PR\"},{\"name\":\"Rhode Island\",\"abbreviation\":\"RI\"},{\"name\":\"South Carolina\",\"abbreviation\":\"SC\"},{\"name\":\"South Dakota\",\"abbreviation\":\"SD\"},{\"name\":\"Tennessee\",\"abbreviation\":\"TN\"},{\"name\":\"Texas\",\"abbreviation\":\"TX\"},{\"name\":\"Utah\",\"abbreviation\":\"UT\"},{\"name\":\"Vermont\",\"abbreviation\":\"VT\"},{\"name\":\"Virgin Islands\",\"abbreviation\":\"VI\"},{\"name\":\"Virginia\",\"abbreviation\":\"VA\"},{\"name\":\"Washington\",\"abbreviation\":\"WA\"},{\"name\":\"West Virginia\",\"abbreviation\":\"WV\"},{\"name\":\"Wisconsin\",\"abbreviation\":\"WI\"},{\"name\":\"Wyoming\",\"abbreviation\":\"WY\"}],\"navUser-main-dropdown-backgroundColor\":\"#ffffff\",\"PZ_Hero_Text_CTA_Button_Text_link\":\"#\",\"color-grey\":\"#999999\",\"body-font\":\"Google_Lato_400\",\"paymentbuttons-paypal-accelerated-content-font-weight\"
7048:\"400\",\"carousel-play-pause-button-textColor--hover\":\"#474747\",\"color_hover_product_sale_badges\":\"#000000\",\"color-price\":\"#FF1378\",\"color-primaryDark\":\"#FF1378\",\"pdp_sale_badge_label\":\"\",\"optimizedCheckout-buttonPrimary-borderColorActive\":\"transparent\",\"navPages-subMenu-backgroundColor\":\"#ffffff\",\"show_quick_payment_buttons\":true,\"optimizedCheckout-step-textColor\":\"#ffffff\",\"button--primary-backgroundColor\":\"#ffffff\",\"optimizedCheckout-formField-borderColor\":\"#cccccc\",\"checkRadio-color\":\"#FF1378\",\"show_product_dimensions\":false,\"optimizedCheckout-link-color\":\"#476bef\",\"card-figcaption-button-background\":\"#FF1378\",\"icon-color-hover\":\"#FF1378\",\"optimizedCheckout-headingSecondary-font\":\"Google_Lato_700\",\"headings-font\":\"Google_Lato_700\",\"label-backgroundColor\":\"#cccccc\",\"button--primary-backgroundColorHover\":\"#FF1378\",\"show_product_reviews\":true,\"button--default-borderColor\":\"transparent\",\"pdp-non-sale-price-label\":\"\",\"button--disabled-borderColor\":\"#9F9F9F\",\"label-color\":\"#ffffff\",\"select-arrow-color\":\"#FF1378\",\"logo_fontSize\":28,\"alert-backgroundColor\":\"#ffffff\",\"optimizedCheckout-logo-size\":\"250x100\",\"navUser-main-color-hover\":\"#000000\",\"default_image_brand\":\"img/BrandDefault.gif\",\"navUser-main-color\":\"#FF1378\",\"button--secondary-backgroundColorHover\":\"#ffffff\",\"card-title-color\":\"#000000\",\"button--secondary-colorActive\":\"#FF1378\",\"optimizedCheckout-headingSecondary-color\":\"#000000\",\"carousel-arrow-color--hover\":\"#FF1378\",\"color-price-pdp\":\"#000000\",\"scentflirt_addon_ids\":\"[171]\",\"product_list_display_mode\":\"grid\",\"paymentbanners-cartpage-logo-type\":\"primary\",\"fontSize-h5\":12,\"icon-ratingFullFilter\":\"#9F9F9F\",\"optimizedCheckout-link-hoverColor\":\"#002fe1\",\"product_size\":\"260x260\",\"paymentbuttons-paypal-color\":\"gold\",\"homepage_show_carousel\":false,\"optimizedCheckout-body-backgroundColor\":\"#ffffff\",\"carousel-arrow-borderColor\":\"transparent\",\"button--default-borderColorActive\":\"transparent\",\"header-backgroundColor\":\"#FFFFFF\",\"color_badge_product_sold_out_badges\":\"#007dc6\",\"color-greyDarkest\":\"#000000\",\"color_badge_product_sale_badges\":\"#007dc6\",\"price_ranges\":true,\"productpage_videos_count\":8,\"color-greyDark\":\"#666666\",\"optimizedCheckout-buttonSecondary-borderColorHover\":\"#999999\",\"optimizedCheckout-discountBanner-iconColor\":\"#333333\",\"optimizedCheckout-buttonSecondary-borderColor\":\"#cccccc\",\"optimizedCheckout-loadingToaster-textColor\":\"#ffffff\",\"optimizedCheckout-buttonPrimary-colorDisabled\":\"#ffffff\",\"optimizedCheckout-formField-placeholderColor\":\"#999999\",\"navUser-color-hover\":\"#FF1378\",\"default_image_gift_certificate\":\"img/GiftCertificate.png\",\"color-textBase--hover\":\"#FF1378\",\"color-errorLight\":\"#ffdddd\",\"club_pink_subscriber_id\":5,\"icon-ratingFull\":\"#FF1378\",\"social_icon_placement_top\":false,\"blog_size\":\"190x250\",\"shop_by_price_visibility\":true,\"optimizedCheckout-buttonSecondary-colorActive\":\"#000000\",\"paymentbanners-proddetailspage-color\":\"white\",\"color-warningLight\":\"#fffdea\",\"show_product_weight\":true,\"paymentbuttons-provider-sorting\":[\"paypal\",\"paypal-credit\",\"paypal-venmo\",\"googlepay\",\"applepay\"],\"optimizedCheckout-orderSummary-backgroundColor\":\"#ffffff\",\"button--default-colorActive\":\"#FFF0F7\",\"masterpass-button-color\":\"black\",\"color-info\":\"#666666\",\"free_shipping_on_order\":\"FREE SHIPPING ON ORDERS OF $60+\",\"paymentbuttons-paypal-accelerated-content-font-family\":\"Lato, Arial, Helvetica, sans-serif\",\"scentflirt_products_ids\":\"[196,197,198,171]\",\"button--secondary-backgroundColor\":\"#FF1378\",\"show_product_quick_view\":false,\"button--default-borderColorHover\":\"transparent\",\"card--alternate-backgroundColor\":\"#ffffff\",\"hide_content_navigation\":false,\"amazon-button-color\":\"Gold\",\"optimizedCheckout-formChecklist-backgroundColorSelected\":\"#f5f5f5\",\"pdp-price-label\":\"\",\"show_copyright_footer\":true,\"swatch_option_size\":\"22x22\",\"optimizedCheckout-orderSummary-borderColor\":\"#707070\",\"color-primaryAccent\":\"#FF1378\",\"optimizedCheckout-show-logo\":\"none\",\"carousel-description-color\":\"#FFFFFF\",\"o
7048ptimizedCheckout-formChecklist-backgroundColor\":\"#ffffff\",\"subscription_products_ids\":\"[171]\",\"checkRadio-borderColor-checked\":\"#FF1378\",\"fontSize-h2\":21,\"optimizedCheckout-step-backgroundColor\":\"#757575\",\"color-textBase\":\"#000000\",\"pz_base_url\":\"https://subscriptions.pzebra.dev/api/v1/\",\"color-warning\":\"#f1a500\",\"paymentbuttons-paypal-accelerated-content-color\":\"white\",\"productgallery_size\":\"500x659\",\"pz_api_endpoint\":\"https://api2.pzebra.com/pzCore\",\"carousel-play-pause-button-textColor\":\"8f8f8f\",\"optimizedCheckout-headingPrimary-color\":\"#000000\",\"alert-color\":\"#333333\",\"shop_by_brand_show_footer\":false,\"card-figcaption-button-color\":\"#ffffff\",\"paymentbuttons-paypal-accelerated-content-label\":\"checkout\",\"color-textSecondary--active\":\"#333333\",\"optimizedCheckout-formField-inputControlColor\":\"#FFFFFF\",\"optimizedCheckout-contentPrimary-color\":\"#000000\",\"optimizedCheckout-buttonSecondary-font\":\"Google_Lato_500\",\"storeName-color\":\"#FF1378\",\"form-label-font-color\":\"#000000\",\"consultant\":{\"find\":{\"title\":\"Find a consultant in your area\",\"description\":\"Shop with your local consultant\"},\"label\":{\"change_my_consultant\":\"Change my consultant\",\"my_parties\":\"My parties\"},\"default_consultant\":\"ittest 1\",\"default_consultant_attribute_key\":\"1\",\"search\":{\"title\":\"Search for a consultant by name\",\"description\":\"Find a Consultant by searching for their first or last name or initials.\"}},\"PZ_Hero_Text_CTA_Button_Text_value\":\"SHOP ALL DIFFUSERS OILS\",\"searchpage_products_per_page\":24,\"testing_url\":\"https://pinkzebra.atdemo.live/\",\"optimizedCheckout-backgroundImage\":\"\",\"color-greyLightest\":\"#e5e5e5\",\"optimizedCheckout-header-backgroundColor\":\"#FF1378\",\"productpage_related_products_count\":10,\"optimizedCheckout-buttonSecondary-backgroundColorActive\":\"#e5e5e5\",\"color-textLink\":\"#7B7B7B\",\"color-greyLighter\":\"#cccccc\",\"category_default_sort\":\"BEST_SELLING\",\"paymentbanners-homepage-ratio\":\"8x1\",\"color-secondaryDark\":\"\",\"fontSize-h6\":11,\"carousel-arrow-color\":\"#FF1378\",\"productpage_similar_by_views_count\":10,\"aws_cloudfront_url\":\"https://d2olgbsrw4fnsq.cloudfront.net/dev/\",\"pdp-custom-fields-tab-label\":\"\",\"afterpay-button-color\":\"black-mint\",\"navUser-main-background-color\":\"#ffffff\",\"optimizedCheckout-buttonPrimary-color\":\"#ffffff\",\"show_product_swatch_names\":true,\"loadingOverlay-backgroundColor\":\"#ffffff\",\"paymentbanners-proddetailspage-ratio\":\"8x1\",\"navPages-subMenu-separatorColor\":\"#ffffff\",\"navPages-color-hover\":\"#FF1378\",\"button--secondary-color\":\"#ffffff\",\"input-bg-color\":\"#ffffff\",\"color-infoLight\":\"#dfdfdf\",\"paymentbanners-homepage-color\":\"white\",\"googlepay-button-color\":\"black\",\"product_sale_badges\":\"none\",\"default_image_product\":\"img/ProductDefault.gif\",\"navUser-dropdown-borderColor\":\"#ffffff\",\"optimizedCheckout-buttonPrimary-colorActive\":\"#ffffff\",\"color-greyMedium\":\"#757575\",\"optimizedCheckout-formChecklist-borderColor\":\"#cccccc\",\"fontSize-h1\":25,\"homepage_featured_products_count\":20,\"color-greyLight\":\"#999999\",\"paymentbuttons-paypal-accelerated-border-color\":\"black\",\"optimizedCheckout-logo\":\"\",\"icon-ratingEmpty\":\"#FFFFFF\",\"show_product_details_tabs\":true,\"icon-color\":\"#FF1378\",\"aws_url\":\"https://8qz6kpk3g8.execute-api.us-east-1.amazonaws.com/dev/\",\"checkout-paymentbuttons-paypal-shape\":\"rect\",\"overlay-backgroundColor\":\"#333333\",\"input-border-color-active\":\"#FF1378\",\"hide_contact_us_page_heading\":false,\"container-fill-dark\":\"#e5e5e5\",\"product_sold_out_badges\":\"none\",\"homepage_show_carousel_play_pause_button\":false,\"optimizedCheckout-buttonPrimary-backgroundColorDisabled\":\"#cccccc\",\"button--primary-color\":\"#FF1378\",\"focusTooltip-backgroundColor\":\"#313440\",\"optimizedCheckout-buttonPrimary-borderColorHover\":\"transparent\",\"color-successLight\":\"#d5ffd8\",\"paymentbuttons-number-of-buttons\":1,\"color-greyDarker\":\"#333333\",\"show_product_quantity_box\":true,\"element-border-color\":\"#707070\",\"color-success\":\"#008a06\",\"spinner-borderColor-light\":\"#ffffff\",\"zoom_size\":\"680x680\",\"color-white\":\"#ffffff\",\"color_hover_product_sold_out_badges\":\"#000000\",\"facet_price_range\":[{\"min\":0,\"max\":15,\"label\":\"$0â$15\"},{\"min\":15,\"max\":25,\"label\":\"$15â$25\"},{\"min\":25,\"max\":40,\"label\":\"$25â$40\"},{\"min\":40,\"max\":45,\"label\":\"$40â$45\"},{\"min\":45,\"max\":50,\"label\":\"$45â$50\"},{\"min\":50,\"max\":60,\"label\":\"$50â$60\"},{\"min\":60,\"max\":10000,\"label\":\"$60 & UP\"}],\"optimizedCheckout-buttonSecondary-backgroundColor\":\"#ffffff\",\"productview_thumb_size\":\"50x50\",\"fontSize-h3\":16,\"optimizedCheckout-header-borderColor\":\"#dddddd\",\"paymentbuttons-container\":\"medium\",\"carousel-dot-color-active\":\"#FF1378\",\"input-border-color\":\"#9F9F9F\",\"optimizedCheckout-buttonPrimary-backgroundColor\":\"#333333\",\"color-secondary\":\"#ABCAE9\",\"carousel-play-pause-button-borderColor\":\"#ffffff\",\"carousel-bgColor\":\"transparent\",\"checkout-paymentbuttons-paypal-color\":\"black\",\"button--primary-backgroundColorActive\":\"#FF1378\",\"color-textSecondary--hover\":\"#333333\",\"color-availability-text\":\"#008000\",\"color-whitesBase\":\"#e5e5e5\",\"body-bg\":\"#ffffff\",\"dropdown--quickSearch-backgroundColor\":\"#ffffff\",\"navUser-dropdown-backgroundColor\":\"#ffffff\",\"color-primary\":\"#FF1378\",\"scentflirt_subscriber_type_id\":4,\"optimizedCheckout-contentSecondary-font\":\"Google_Lato_400\",\"optimizedCheckout-contentPrimary-font\":\"Google_Lato_400\",\"navUser-main-indicator-backgroundColor\":\"#333333\",\"supported_card_type_icons\":[\"american_express\",\"diners_club\",\"discover\",\"mastercard\",\"unionpay\",\"visa\"],\"navigation_design\":\"simple\",\"optimizedCheckout-formField-textColor\":\"#333333\",\"color-black\":\"#ffffff\",\"focusTooltip-textColor\":\"#ffffff\",\"homepage_top_products_column_count\":4,\"hide_page_heading\":false,\"checkout-paymentbuttons-paypal-size\":\"large\",\"optimizedCheckout-buttonSecondary-colorHover\":\"#333333\",\"button--primary-colorActive\":\"#ffffff\",\"paymentbanners-cartpage-logo-position\":\"left\",\"homepage_stretch_carousel_images\":false,\"optimizedCheckout-contentSecondary-color\":\"#757575\",\"card-title-color-hover\":\"#FF1378\",\"checkout-paymentbuttons-paypal-label\":\"pay\",\"hide_breadcrumbs\":false,\"show_accept_klarna\":false,\"applePay-button\":\"black\",\"modal
7048-fill-base\":\"FFF7FA\",\"thumb_size\":\"100x100\",\"navUser-background-color\":\"#F2F8FF\",\"optimizedCheckout-buttonPrimary-borderColor\":\"#333333\",\"navUser-indicator-backgroundColor\":\"#333333\",\"optimizedCheckout-buttonSecondary-borderColorActive\":\"#757575\",\"optimizedCheckout-header-textColor\":\"#333333\",\"optimizedCheckout-show-backgroundImage\":false,\"optimizedCheckout-formField-shipping-inputControlColor\":\"#FF1378\",\"color-primaryLight\":\"#FFF0F7\",\"color-blackLight\":\"#221f20\",\"hide_blog_page_heading\":false,\"hide_category_page_heading\":true,\"scentflirt_kit_ids\":\"[196,197,198]\",\"optimizedCheckout-text-font\":\"Google_Lato_400\",\"banner--deafault-backgroundColor\":\"#FF1378\",\"show_accept_visa\":false,\"logo-position\":\"left\",\"carousel-dot-bgColor\":\"#ffffff\",\"optimizedCheckout-form-textColor\":\"#666666\",\"paymentbuttons-paypal-accelerated-checkout-color\":\"#444\",\"optimizedCheckout-buttonSecondary-color\":\"#333333\",\"button--icon-svg-color\":\"#FF1378\",\"color-secondaryLight\":\"#D5EAFF\",\"alert-color-alt\":\"#ffffff\",\"color_text_product_sold_out_badges\":\"#ffffff\",\"checkRadio-backgroundColor\":\"#ffffff\",\"facebook_app_id\":\"270454785773283\",\"optimizedCheckout-buttonPrimary-backgroundColorHover\":\"#666666\",\"carousel-play-pause-button-bgColor\":\"#ffffff\",\"input-disabled-bg\":\"#F8F8F8\",\"PZ_Hero_Text_CTA_Heading_value\":\"DIFFUSERS OIL\",\"button--default-colorHover\":\"#FFF0F7\",\"paymentbanners-cartpage-text-color\":\"black\",\"dropdown--wishList-backgroundColor\":\"#ffffff\",\"container-border-global-color-base\":\"#707070\",\"productthumb_size\":\"120x120\",\"button--primary-colorHover\":\"#ffffff\",\"color-error\":\"#cc4749\",\"button--secondary-backgroundColorActive\":\"#ffffff\",\"homepage_blog_posts_count\":3,\"color-textSecondary\":\"#000000\",\"gallery_size\":\"300x300\"},\"storefrontAPIToken\":\"eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJjaWQiOlsxXSwiY29ycyI6WyJodHRwczovL3Bpbmt6ZWJyYWhvbWUuY29tIl0sImVhdCI6MTc5MDUwNjc1NiwiaWF0IjoxNzkwMzMzOTU2LCJpc3MiOiJCQyIsInNpZCI6MTAwMjU0ODA5MCwic3ViIjoiQkMiLCJzdWJfdHlwZSI6MCwidG9rZW5fdHlwZSI6MX0.Dbbz5Ky_KmgYOqRNc1mNuklCGA8U9ANSp2dp5XrHfP_fERT3ZwmFrRT_ZM97Q6g0oEvbpO9Q1zJRl-0DJN1jjA\",\"customer\":null,\"pzAPIEndpoint\":\"https://api2.pzebra.com/pzCore\",\"pageType\":\"login\",\"outOfStock\":\"Out Of Stock\",\"priceRange\":[{\"min\":0,\"max\":15,\"label\":\"$0â$15\"},{\"min\":15,\"max\":25,\"label\":\"$15â$25\"},{\"min\":25,\"max\":40,\"label\":\"$25â$40\"},{\"min\":40,\"max\":45,\"label\":\"$40â$45\"},{\"min\":45,\"max\":50,\"label\":\"$45â$50\"},{\"min\":50,\"max\":60,\"label\":\"$50â$60\"},{\"min\":60,\"max\":10000,\"label\":\"$60 & UP\"}],\"subscription_products_ids\":\"[171]\",\"club_pink\":\"Club Pink members\",\"preferred\":\"ScentFlirt members\",\"exclusive\":\"ScentFlirt members exclusive\",\"scentflirt_ids\":\"[196,197,198,171]\",\"useValidEmail\":\"Please use a valid email address, such as [email protected].\",\"enterPass\":\"You must enter a password.\"}").load(); 7049 } 7050 </script>
7050 7051
7051<script async defer src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/dist/theme-bundle.main.js" onload="onThemeBundleMain()"></script>
7051 7052 7053 7054
7054<script defer src="https://connect.facebook.net/en_US/sdk.js"></script>
7054 7055
7055<script defer src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/theme/modules/pztv-integration.js"></script>
7055 7056
7056<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/theme/modules/show-consultant-form.js"></script>
7056 7057
7057<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/theme/modules/localstorage-and-cart-meta-api.js"></script>
7057 7058
7058<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/theme/modules/wishlist.js"></script>
7058 7059
7059<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/theme/modules/mobile-menu-setting.js"></script>
7059 7060
7060<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/theme/modules/sf-modal-content.js"></script>
7060 7061
7061<script type="text/javascript" src="https://cdn11.bigcommerce.com/shared/js/csrf-protection-header-5eeddd5de78d98d146ef4fd71b2aedce4161903e.js"></script>
vendor: 1 bytes, line 7061
7061
7062<script src='https://na.shgcdn3.com/collector.js' async ></script>
7062<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/gsap.min.js"></script>
vendor: 1 bytes, line 7062
7062
7063<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/ScrollTrigger.min.js"></script>
vendor: 1 bytes, line 7063
7063
7064<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.20.3/TweenMax.min.js"></script>
7064<script> 7065 !function(c,n,r,t){if(!c[r]){var i,d,p=[];d="PROD"!==t&&t?"STAGING"===t?"https://cdn.gladly.qa/gladly/chat-sdk/widget.js":t:"https://cdn.gladly.com/chat-sdk/widget.js",c[r]={init:function(){i=arguments;var e={then:function(t){return p.push({type:"t",next:t}),e},catch:function(t){return p.push({type:"c",next:t}),e}};return e}},c.__onHelpAppHostReady__=function(t){if(delete c.__onHelpAppHostReady__,(c[r]=t).loaderCdn=d,i)for(var e=t.init.apply(t,i),n=0;n<p.length;n++){var a=p[n];e="t"===a.type?e.then(a.next):e.catch(a.next)}},function(){try{var t=n.getElementsByTagName("script")[0],e=n.createElement("script");e.async=!0,e.src=d+"?q="+(new Date).getTime(),t.parentNode.insertBefore(e,t)}catch(t){}}()}} 7066 (window,document,'Gladly','PROD') 7067</script>
7067<script> 7068 window.gladlyConfig = { 7069 appId: 'pinkzebrahome.com' 7070 }; 7071</script>
7071
7071<script> 7072 (function() { 7073 window.shogunVariables = {}; 7074 window.shogunVariables.orderId = ''; 7075 })(); 7076 </script>
vendor: 1 bytes, line 7076
7076
7077<script data-cfasync="false" data-dd-sm-ignore="true" data-cookieconsent="ignore" id="wsa-tag-manager-javascript-f-test" nonce="">!function(w,d){if(d.location.href.indexOf('showHidden=true')<0&&d.location.href.indexOf('shogun.page/previews')<0){w.TagRocket=w.TagRocket||{};var T=w.TagRocket;T.tef=[];w.onerror=function(m,s,l,c,e){T.tef.push((l?(l+' '):'')+(c?(c+' '):'')+m+(m.colno?(':'+m.colno):'')+(s?(' '+s):''));};var m=new Date().toISOString(),q='wsa-tag-manager-javascript-',z;T.taf=function(s){w.dataLayer=w.dataLayer||[];if(!w.gtag){w.gtag=function(){dataLayer.push(arguments)};gtag('js',new Date);t=d.createElement('script');t.async=!0;t.setAttribute('src','https://www.googletagmanager.com/gtag/js?id=G-7XTJM93TLW');d.head.appendChild(t)};if(!w.wsa_tre){var n='denied';gtag('consent',{functionality_storage:n,ad_storage:n,analytics_storage:n,ad_user_data:n,ad_personalization:n,personalization_storage:n,security_storage:n});gtag('config',"G-7XTJM93TLW",{groups:'TagRocketErrorTracking',send_page_view:false});gtag('config',"G-0XNHDCESR7",{groups:'TagRocketErrorTracking',send_page_view:false});gtag('event','tag_rocket_error',{send_to:["G-0XNHDCESR7"],description:'Script Failure',app_version:'3.48.21',tag_rocket_version:'1.95',ua:navigator.userAgent});};w.wsa_tre=1;if(w.console)console.error('Tag Rocket (f): '+s,T.tef);T.tef.forEach(function(e){gtag('event','app_error',{send_to:'G-7XTJM93TLW',scope:s,description:s+' 3.48.21 f '+e,message:'f '+e,app_version:'3.48.21',automatic:1,tag_rocket_version:'1.95',pagedatetime:m,datetime:m,ua:navigator.userAgent,tags:"|unknown",environment:'Production'})})};p=function(){if(!T.ts&&!d.getElementById(q+'second'))T.taf('Header Script Missing');else if(!T.tss)T.taf('Header Script Failure1');else if(!T.ts)T.taf('Header Script Failure2');if(!T.tm&&!d.getElementById(q+'main'))T.taf('Footer Script Missing');else if(!T.tm)T.taf('Footer Script Failure')};if(w.addEventListener)w.addEventListener('DOMContentLoaded',p);else w.attachEvent('onDOMContentLoaded',p)}}(window,document)</script>
vendor: 2 bytes, line 7077
7077
7078<script data-cfasync="false" data-dd-sm-ignore="true" data-cookieconsent="ignore" id="wsa-tag-manager-javascript-main" nonce=""> 7079/* 7080 Web Site Advantage: Tag Rocket App 2 of 2 Footer [1.95.88285] Proprietary Runtime 7081 Licensed for use only by authorised Web Site Advantage customers. 7082 Copyright (C) 2020 - 2026 Web Site Advantage Pty Ltd. 7083*/ 7084 7085!function(w,d){if(d.location.href.indexOf('showHidden=true')<0&&d.location.href.indexOf('shogun.page/previews')<0){var T=w.TagRocket;try{if(!T||T.block)return;T.y=function(a){return T.H(T.u(a))};T.u=function(a){return T.H(T.getProductId('GoogleAds','ItemGroupId',a,"[[psku]]"))};T.q=function(a){a.google_business_vertical='retail';return a};T.H=function(a){return T.P(a,/ /g)};T.ak=function(a,b,c){a.item_list_name=b;a.item_list_id=c;if(a.items)T.e(a.items,function(e){T.ak(e,b,c)});return a};T.ae=function(a){var b=a.couponCodes,c=a.taxTotal,e=a.shippingMethod,f,g=[],h;T.e(T.an(a.items,200),function(i){h=T.aj(i);if(h)g.push(h)});f={value:a.grandTotal,currency:a.currency.code,items:g};T.p(f,'tax',c);T.p(f,'coupon',b);T.p(f,'shipping_tier',e);return f};T.aj=function(a,b){var c=a.price,e=a.totalDiscount,f=a.couponCodes,g=a.category,h=a.quantity,i=a.index,j=a.brand,k,l={item_id:T.aI(a),item_name:a.name};if(T.w(c))l.price=c;if(a.isVariant){k=a.variantName;if(k)l.item_variant=''+k}if(e)l.discount=T.r(e/(h||1),2);T.p(l,'coupon',f);T.p(l,'reason',b);T.p(l,'quantity',h);T.p(l,'index',i);l.item_brand=j?j:'(no brand)';var m='(no visible category)',n=[m];if(g){n=g.breadcrumbs;m=g.path}l.item_category=m;l.item_category2=n.slice(0,1).join("/");l.item_category3=n.slice(0,2).join("/");l.item_category4=n.slice(0,3).join("/");l.item_category5=n.slice(0,4).join("/");if(T.aJ('GoogleAnalyticsFourItemPending',{product:a,item:l}))return l};T.aI=function(a){return T.getProductId('GA4','ItemGroupId',a,"[[psku]]")};T.aD=function(a,b){var c=T.T(b.name);T.t('GF27',function(){T.ad(a,{promotion_id:b.id,promotion_name:c,creative_name:c,creative_slot:b.location,items:[{promotion_id:b.id,promotion_name:c,creative_name:c,creative_slot:b.location}]})},1)};T.aV=function(a,b){var c=a.price,e=a.brand,f={content_id:T.aY(a),content_type:'product_group',content_name:a.name};b=b||a.category;if(b)f.content_category=b.path;if(e)f.brand=e;if(T.w(c))f.price=c;return f};T.aW=function(a,b){var c=a.price,e=a.brand,f=a.quantity,g=a.category,h={content_id:T.aZ(a),content_type:'product',content_name:a.name};if(g)h.content_category=g.path;if(e)h.brand=e;if(b)h.quantity=Math.abs(b);else if(f)h.quantity=f;if(T.w(c))h.price=c;return h};T.aY=function(a){return T.getProductId('TikTok','ItemGroupId',a,"[[psku]]")};T.aZ=function(a){return T.getProductId('TikTok','ItemId',a,"[[psku]]","[[vsku]]")};T.Z('load',function(){T.aU(function(){T.N(function(){T.t('TT2',function(){var a=function(){T.aT('https://analytics.tiktok.com/i18n/pixel/events.js?sdkid=D07P7U3C77UAB6445LB0&lib=ttq',{},function(){var b=w['ttq'];T.aR=function(){b.track.apply(b,arguments)};b.track2=T.aR;T.e(T.aQ,function(c){T.aU(function(){T.aR.apply(T,c)},500,'TikTok Queue')})})};if(T.K){a()}else{T.o(T.M,function(){if(T.K){a()}})}},1);T.t('GT2a',function(){if(T.K||T.aM){T.bc=!0;T.aT(T.bb)};T.o(T.M,function(){if(T.K||T.aM&&!T.bc){T.bc=!0;T.aT(T.bb)}})},1)});T.al='SearchPage';T.o(T.al,function(a){T.ad('search',{search_term:a.term})},'GF5',1);if(T.bj){T.bk(T.al,{term:T.bj})}T.t('SB21',function(){T.bl(d);if(T.bd()){T.bm(T.bn("["+T.bo+"='list']["+T.bp+"]"))}},1);if(T.bd()){T.t('SB21b',function(){T.br(T.bt());T.bu()},1)}if(!T.bd()){ }T.aA='LinkClick';T.o(T.aA,function(a){var b={link_url:T.T(a.href),description:T.T(a.label),value:a.value};T.p(b,'currency',T.j);T.ad('click_'+(T.aB(T.T(a.category)).split(" ")[0]),b)},'GF22',1);T.o(T.aA,function(a){T.aR('ClickButton',{value:a.value,currency:T.j,content_id:a.href,content_name:a.label,content_category:a.category})},'TT12',1);T.t('SB17',function(){var a='Social',b=function(c){return new RegExp('^https?://[a-zA-Z.]*'+c,'i')},e=[{f:/^tel:/i,g:'Phone',h:'@',i:0.0},{f:/^mailto:/i,g:'Email',h:'@',i:0.0},{f:/^https?:\/\//i,j:1,g:'Outbound Link',h:'@',i:0.0},{f:/^.*\.(pdf|zip|docx|doc|txt|msi|xlsx|xls|rtf|csv|exe|7z|pkg|rar|gz|zip|avi|mov|mp4|wmv|mp3|wav|wma)?(\?.*)?$/i,g:'Download',h:'@',i:0.0},{f:b('facebook.com/'),g:a,h:'Facebook',i:0.0},{f:b('plus.google.com/'),g:a,h:'Google+',i:0.0},{f:b('linkedin.com/'),g:a,h:'LinkedIn',i:0.0},{f:b('youtube.com/'),g:a,h:'YouTube',i:0.0},{f:b('twitter.com/'),g:a,h:'Twitter',i:0.0},{f:b('instagram.com/'),g:a,h:'Instagram',i:0.0},{f:b('pinterest.com/'),g:a,h:'Pinterest',i:0.0},{f:b('tumblr.com/'),g:a,h:'Tumblr',i:0.0}],k=[/^https?:\/\/cdn[0-9]+\.bigcommerce\.com\//i,/^https?:\/\/[^\/]*\.mybigcommerce\.com\//i],l=function(m){return T.e(k,function(n){if(m.match(n))return 1})},o=function(p){if(T.bv(p.tag,'clicked-'+T.P(p.category,/\s+/g))){if
7085(T.bw(p.tag,'target')=='_blank'){T.aU(function(){T.bk(T.aA,p)},0,'LinkClick Yield')}else{T.bk(T.aA,p)}}return true},m,q=d.getElementsByTagName('a');T.e(q,function(r){if(T.bx(r,'href')){m=T.bw(r,'href');if(!l(m)){T.e(e,function(s){if((!s.j||w.location.host!=r.host)&&m.match(s.f)){T.by(r,'click',(function(){var p={tag:r,href:m,category:s.g,label:T.P(s.h,'@',m),value:s.i};return function(){return o(p)}})())}})}}})},1)},1e3,'Wait For On Load')});T.at='SiteLogin';T.au='SiteLogout';T.o(T.at,function(a){T.ad('login',{method:a.method})},'GF17',1);T.o(T.au,function(){T.ad('logout',{method:'site'})},'GF18',1);T.t('SB1',function(){var a=T.d.id?'y':'n',b=T.bz('wsa-l')||'n',c='site';if(b!=a){if(a=='y'){T.bk(T.at,{method:c})}else{T.bk(T.au,{})}T.bA('wsa-l',a)}},1);T.t('SB8b',function(){var a=T.bB("form[action='/subscribe.php']"),b=T.bC('nl_email');if(a&&b){T.by(a,'submit',function(){T.bA('wsa-se',T.aB(b.value))})}},1);T.C='CheckoutStep5OrderCompleted';T.o(T.C,function(a){var b=a.orderAmount,c=[],e=0,f=0,g={value:b,currency:a.currency.code,transaction_id:''+a.orderId},h={value:b,currency:a.currency.code,transaction_id:''+a.orderId};if(a.totalDiscount){g.discount=a.totalDiscount;f=g.discount}T.e(a.items,function(i){e+=i.listPrice;c.push({id:T.y(i),price:i.listPrice,quantity:i.quantity,google_business_vertical:'retail'})});g.items=c;h.items=T.D(c);if(T.E(a.new_customer))g.new_customer=a.new_customer;g.send_to="AW-10776808640/99vbCLWwwJYaEMCZ5JIo";T.k('purchase',g,''+d.location+'/order-'+T.F,);T.k('purchase',h,''+d.location+'/order-'+T.F,)},'GA6',1);T.o(T.C,function(a){var b=a.couponCodes,c=a.paymentMethod,e=a.shippingMethod,f,g={method:'www',tax:a.taxTotal,shipping:a.shippingCostTotal,value:a.orderAmount,currency:a.currency.code,transaction_id:''+a.orderId,items:[]},h;T.p(g,'new_customer',a.new_customer);T.p(g,'coupon',b);T.p(g,'payment_type',c);T.p(g,'shipping_tier',e);T.e(T.an(a.items,200),function(i){f=T.aj(i);if(f)g.items.push(f)});h=T.D(g);T.ad('add_payment_info',g);T.ad('purchase',h)},'GF8',1);T.o(T.C,function(a){var b=a.items.map(function(c){return T.aW(c)});T.aR('AddPaymentInfo');T.aR('Purchase',{content_type:'product',value:a.orderAmount,currency:a.currency.code,contents:b,content_ids:b.map(function(e){return e.content_id})},{event_id:'p'+a.orderId})},'TT11',1);T.processOrder=function(a){T.t('SB11',function(){var b=new Date(),c=T.bz('wsa-ci');if(c!=a){T.F=a;T.bJ('/api/storefront/orders/'+a,function(e,f){T.t('SB11b',function(){if(e>0){try{var g=new Date("2024-07-31"),h=new Date("2024-07-31"),i=new Date(b.getTime()-466560e5),j=T.bz('wsa-lo'),k;if(j){k=new Date(j);f.new_customer=k<i}else if(g<i||(!c&&h<i))f.new_customer=!0}catch(l){T.a('SB25b','new_customer error: '+(l.message||l),1,l)}T.order=f;f.shippingMethod=T.bz('wsa-sm');f.paymentMethod=T.bz('wsa-pm');T.bP(f);T.bf({reason:'Order',cart:f},function(m){T.bi(m,'Order');f=m.cart;T.f(T.C,f);T.bQ=!0;while(T.gq&&T.be(T.gq)){var n=T.gq[0];T.gq.splice(0,1);gtag.apply(null,n)}T.bA('wsa-ci',T.F);T.bA('wsa-lo',b.toISOString());T.bR('wsa-c');T.bR('wsa-cc');T.bR('wsa-sm');T.bR('wsa-pm')})}else{T.a('SB25','Failed to get order: '+f+' '+T.F,1)}},1)})}},1)};T.x='CartItemChanged';T.ao='CartPage';T.bS=0;T.o(T.x,function(a){var b=a.item,c=a.change;if(c>
70850)T.k('add_to_cart',{value:b.price*c,currency:b.currency,items:[{id:T.y(b),google_business_vertical:'retail'}]})},'GA5',1);T.o(T.x,function(a){var b=a.item,c=a.change;if(c>0)T.k('conversion',{send_to:"AW-10776808640/aOvFCIbkwpYaEMCZ5JIo",value:b.price*c,currency:b.currency})},'GA1',1);T.o(T.x,function(a){var b=a.item,c=a.change,e=c>0&&'add_to_cart'||'remove_from_cart',f=T.aj(b),g={currency:b.currency,value:T.r(Math.abs(b.price*c),3),items:[f]};if(f){f.quantity=Math.abs(c);T.ad(e,g)}},'GF4',1);T.o(T.x,function(a){if(a.change>0){var b=a.item,c=[T.aW(b,a.change)];T.aR('AddToCart',{content_type:'product',currency:b.currency,value:b.price*a.change,contents:c,content_ids:c.map(function(e){return e.content_id})})}},'TT4',1);T.o(T.ao,function(a){var b,c=[];T.e(T.an(a.items,200),function(e){b=T.aj(e);if(b)c.push(b)});T.ad('view_cart',{value:a.grandTotal,currency:a.currency.code,items:c})},'GF10',1);T.bT=function(a,b,c){T.bU++;var e={change:a,cart:c,item:b,currency:c.currency.code,price:b.price,quantity:b.quantity,productId:b.productId,productSku:b.productSku,name:b.name};T.bk(T.x,e)};T.checkCart=function(f){var g='Check';if(!localStorage||Math.abs(new Date-T.bS)<50)return;T.bS=new Date;T.t('SB12',function(){T.bR('wsa-cc');T.bJ('/api/storefront/carts',function(h,i){T.t('SB12b',function(){if(h>0){if(i&&T.be(i)){T.bf({reason:g,cart:i[0],response:i},function(e){T.bi(e,g);var c=e.cart;T.bK(c)})}else{T.bK({items:[],currency:{code:T.j}})}}},1)})},1)};if(!T.bz('wsa-c')||T.bz('wsa-cc')=='y')T.checkCart();T.bV='JavaScriptError';T.bW=0;T.bX='LoadError';T.bY=0;T.ef=function(a,b,c,e,f){if(!T.bZ){var g,h,i='',j='',k,l,m=a.target;T.bZ=1;try{if(m&&m!=w&&m.nodeName){T.bZ=a;l=m.getAttribute('src');if(!l)l=m.getAttribute('href');if(l){if(!l.indexOf||l.indexOf('bat.bing')<0){T.bZ.targetUrl=l;T.bZ.targetPath=T.ca(m);if(T.bY<6){T.bk(T.bX,T.bZ)}}};return}try{if(a){if(typeof a=='string'){h='Message';i=a}else{b=a.filename;c=a.lineno;e=a.colno;f=a.error;i=a.message;if(a.filename){h='Event'}else if(a.originalEvent){g=a.originalEvent;h='Intercepted Event';b=b||g.filename;c=c||g.lineno;e=e||g.colno;f=f||g.error;i=i||g.message}else{h='Object';i=T.cb(a,Object.getOwnPropertyNames(a))}}}i=i||'Unknown';if(b)j+=b;if(c){if(j!=='')j+=': ';j+='L'+c;if(e)j+=' C'+e}if(j!=='')j+=': ';j+=i;k=h+' error=';if(f){if(typeof f=='string'){k+=f}else{k+=T.cb(f,Object.getOwnPropertyNames(f))}}else{k+='null'}}catch(f){h='Handler ERROR';i='The error processor had an error! '+f;T.a('OE1',i,1,f)}finally{if(!i.indexOf)T.a('OE2','No message.indexOf because it is a '+(typeof i),1,f);if(!i.indexOf||i.indexOf('Invalid login')<0){if(i=='{"isTrusted":true}')i='Cross Origin Script Error';T.bZ={type:h,message:i,filename:b,lineno:c,colno:e,error:f,action:j,label:k};T.bW++;if(T.bW<6){T.bk(T.bV,T.bZ)}}}}finally{T.bZ=0}}};if(T.eq){T.e(T.eq,function(n){T.ef.apply(T,n)})};T.cc='ConsoleError';T.ct=1;T.cd=0;T.cg=function(a){T.cd++;if(T.cd<6&&T.ct){var b='',c=0,e;while(T.be(b)<200&&T.be(a)>c){e=a[c];if(b)b+=', ';if(typeof e=='string')b+=e;else b+=T.cb(e);c++};if(b)T.bk(T.cc,{message:b})}};T.cf=function(){T.cg(arguments)};if(T.cq)T.e(T.cq,function(a){T.cg(a)});T.ba='JsonLdError';T.o(T.ba,function(a){T.a((a.element.id&&a.element.id.startsWith('wsa-rich-snippets'))?'JsonLdUs':'JsonLdOther',a.error,0,a.element)},1);T.aU(function(){T.e(T.bn("script[type='application/ld+json']"),function(a){if(a.text.trim()!=''){try{T.ch(T.P(T.P(a.text.trim(),/^(\/\/\s*)?<!\[CDATA\[|(\/\/\s*)?\]\]>$/g),/\n|\r|\t/g))}catch(b){T.bk(T.ba,{error:''+b,element:a})}}})},6e3,'Json-LD Check');T.aF='WebVitalsComplete';T.ci='WebVitalsPending';T.cj={};T.o(T.aF,function(a){var b=a.metric,c=b.attribution,e=T.R(),f={metric_id:b.id,metric_value:T.r(b.value,3),value:T.r(b.delta,3)};f.metric_rating=b.rating;if(b.debugTarget){f.debug_target=b.debugTarget.substring(0,100);f.debug_target2=b.debugTarget.substring(100)}T.p(f,'load_state',c.loadState);T.p(f,'lcp_url',c.url);T.p(f,'ttfb',c.timeToFirstByte);T.p(f,'lcp_resource_load_delay',c.resourceLoadDelay);T.p(f,'lcp_element_render_delay',c.elementRenderDelay);T.p(f,'inp_interaction_type',c.interactionType);T.p(f,'inp_interaction_time',c.interactionTime);T.p(f,'cls_largest_shift_time',c.largestShiftTime);T.p(f,'ttfb_waiting_duration',c.waitingDuration);if(e){T.p(f,'downlink',e.downlink);T.p(f,'rtt',e.rtt)}T.ad(b.name,f)},'GF28',1);T.t('SB16',function(){var a=function(b){if(!b.value&&b.value!=0){T.a('SB16b','Web Vital '+b.name+' missing value',1,b);T.ck('Web Vital '+b.name+' missing value',b);return}var c=b.attribution;if(c)b.debugTarget=c.element||c.target||c.interactionTarget||c.largestShiftTarget;T.cj[b.name]=b;T.N(function(){if(T.aJ(T.ci,{metric:b})){T.f(T.aF,{metric:b});T.cj[b.name]=b}})};T.aT('https://unpkg.com/[email protected]/dist/web-vitals.attribution.iife.js',{crossOrigin:"anonymous",fetchPriority:"low",onvisible:!1},function(){var e=webVitals;e.onFCP(a);e.onLCP(a);e.onCLS(a);e.onTTFB(a);e.onINP(a);if(T.cl)T.cl()})},1);T.aG='PerformanceMetrics';T.o(T.aG,function(a){var b=a.metrics,c=b.responseEnd,e=T.R(),f={},g={};if(e){T.p(f,'downlink',e.downlink);T.p(f,'rtt',e.rtt);T.p(g,'downlink',e.downlink);T.p(g,'rtt',e.rtt)}if(c){f.metric_value=c;f.metric_id='ttlb'+T.aH;f.metric_rating=c<=800?'good':(c>1800?'poor':'needs-improvement');T.ad('TTLB',f)}c=b.finalResponseHeadersStart;if(c){g.metric_value=c;g.metric_id='frhs'+T.aH;g.metric_rating=c<=800?'good':(c>1800?'poor':'needs-improvement');T.ad('FRHS',g)}},'GF33b',1);T.cm=1;T.cn=function(){if(T.cm&&d.visibilityState=='hidden'){T.cm=0;T.co('hidden')}};T.cp=function(){if(T.cm){T.cm=0;T.co('pagehide')}};T.co=function(a){var b={},c=T.cj,e=T.cr;if(e){['activationStart','fetchStart','requestStart','responseStart','responseEnd','domContentLoadedEventStart','domContentLoadedEventEnd','loadEventStart','loadEventEnd','transferSize','finalResponseHeadersStart','type','redirectCount'].forEach(function(f){if(e[f]||e[f]==0)b[f]=T.r(e[f])});if(c.FCP)b.fcp=T.r(c.FCP.value);if(c.CLS){b.cls=T.r(c.CLS.value,3);if(c.CLS.debugTarget){b.clsSelectorPart1=c.CLS.debugTarget.slice(0,100);b.clsSelectorPart2=c.CLS.debugTarget.slice(100)}}if(c.LCP){b.lcp=T.r(c.LCP.value);if(c.LCP.debugTarget){b.lcpSelectorPart1=c.LCP.debugTarget.slice(0,100);b.lcpSelectorPart2=c.LCP.debugTarget.slice(100)}}T.e(T.S('paint'),function(g){if(g.name=='first-paint')b.fp=T.r(g.startTime)});T.cs=b;T.bk(T.aG,{eventType:a,metrics:b})}};T.cl=function(){T.by(w,'visibilitychange',T.cn);T.Z('pagehide',T.cp)};T.N(function(){var a=0,b='StencilUtils',c=b+' Check ';e=function(){a++;
7085if(w.stencilUtils){T.bk(b,w.stencilUtils);['cart-item-add-remote','cart-item-remove-remote'].forEach(function(a){w.stencilUtils.hooks.on(a,function(b){T.t('SB13',function(){T.checkCart()},1)})});T.am='QuickSearch';T.o(T.am,function(a){T.ad('quick_search',{search_term:a.term})},'GF5b',1);w.stencilUtils.hooks.on('search-quick',function(a){T.cu=T.cv(a,'target.value');T.cw=T.cx(T.cw,function(){if(T.cu&&T.be(T.cu)>2)T.bk(T.am,{term:T.cu})},1e3)})}else a<9&&T.aU(e,1e3,c+a)};T.aU(e,1,c)});T.cy();T.cz();T.cA();T.cB()}catch(e){T.tef=T.tef||[];T.tef.push(e);if(T.a)T.a('FOOT',''+e,1,e);else if(T.taf)T.taf('Footer Script ISSUE')}T.tm=1}}(window,document) 7086 7087</script>
7087
7088<script> 7089const sm_customer_email = "" 7090const sm_PZ_API_BASE_URL = ((window.location.origin === "http://localhost:3000")|| (window.location.origin === "https://pinkzebrahome.com")) ? 'https://api.pzebra.com/pzCore/' : 'https://api.pzebra.dev/pzCore/'; 7091const sm_PZ_API_KEY = ((window.location.origin === "http://localhost:3000")|| (window.location.origin === "https://pinkzebrahome.com")) ? 'CcnelxxstV85XvVMGJZcY34O7kBbAjtxazBsnhXE' : 'aLPW0lIlXjcKFGVjNnDh91HQSujdEIo4uu2159Jj'; 7092const sm_PZ_HEADERS = { 7093 accept: 'application/json', 7094 'content-type': 'application/json', 7095 'x-api-key': sm_PZ_API_KEY 7096} 7097 7098/** 7099 * Segment Routing Manager 7100 * 7101 * Dynamically injects customer segment data into URL parameters based on configuration rules. 7102 * This system allows for contextual personalization by exposing segment membership through 7103 * URL params while maintaining privacy through value aliasing. 7104 * 7105 * Flow: 7106 * 1. Fetches segment routing configuration from settings 7107 * 2. Retrieves current customer's segment memberships 7108 * 3. Evaluates each segment rule against current page path 7109 * 4. Injects applicable segments into URL params using configured aliases 7110 * 7111 * Pattern Matching Support: 7112 * - Exact match: "/shop" matches only /shop 7113 * - Wildcard suffix: "/shop/*" matches /shop, /shop/, /shop/products, etc. 7114 * - Wildcard prefix: "*\checkout" matches /checkout, /cart/checkout, /secure/checkout 7115 * - Contains: "*account*" matches /my-account, /user/account/settings, etc. 7116 * - Global: "*" matches all pages 7117 * 7118 */ 7119const sm_segment_routing_manager = async (customer_email) => { 7120 const queryPath = window.location.pathname; 7121 7122 // Guard: Require authenticated customer 7123 if (!customer_email) { 7124 // console.log('No customer email found; skipping segment injection.'); 7125 return; 7126 } 7127 7128 const [Segment_Routing, segmentResponse] = await Promise.all([ 7129 // Request 1: Get segment routing configuration 7130 fetch(`${sm_PZ_API_BASE_URL}settings/web/config?schema=${encodeURIComponent('Storefront_Segment_Routing')}&_t=${Date.now()}`, { 7131 method: 'GET', 7132 headers: sm_PZ_HEADERS 7133 }).then(res => res.json()), 7134 7135 // Request 2: Get customer segments 7136 fetch(`${sm_PZ_API_BASE_URL}segments/get_customer_segments`, { 7137 method: 'POST', 7138 headers: sm_PZ_HEADERS, 7139 body: JSON.stringify({ body: { email: customer_email } }) 7140 }).then(res => res.json()) 7141 ]); 7142 7143 // Validate configuration structure 7144 if (!Segment_Routing?.config?.storefront_segment_routing || 7145 !Segment_Routing?.config?.storefront_segment_routing?.segments_rules || 7146 !Segment_Routing?.config?.storefront_segment_routing?.enabled 7147 ) { 7148 console.warn('Segment routing is disabled or improperly configured'); 7149 return; 7150 } 7151 7152 const {exposure_method, global_config, segments_rules } = Segment_Routing.config.storefront_segment_routing; 7153 7154 // Extract customer's segment memberships 7155 let userSegmentsNames = []; 7156 try { 7157 userSegmentsNames = (segmentResponse.segments || []).map(seg => seg.segment_name); 7158 // console.log('Customer segments:', userSegmentsNames); 7159 } catch (error) { 7160 console.error('Error fetching user segments:', error); 7161 return; 7162 } 7163 7164 /* Path Pattern Matcher */ 7165 const pathMatches = (path, pattern) => { 7166 // Normalize paths: remove trailing slash for consistency 7167 const normalizedPath = path.endsWith('/') && path.length > 1 7168 ? path.slice(0, -1) 7169 : path; 7170 const normalizedPattern = pattern.endsWith('/') && pattern.length > 1 7171 ? pattern.slice(0, -1) 7172 : pattern; 7173 7174 // Global wildcard 7175 if (normalizedPattern === '*') return true; 7176 7177 // Contains pattern: *keyword* 7178 if (normalizedPattern.startsWith('*') && normalizedPattern.endsWith('*')) { 7179 const keyword = normalizedPattern.slice(1, -1); 7180 return normalizedPath.includes(keyword); 7181 } 7182 7183 // Suffix wildcard: /path/* 7184 if (normalizedPattern.endsWith('/*')) { 7185 const basePath = normalizedPattern.slice(0, -2); 7186 return normalizedPath === basePath || normalizedPath.startsWith(basePath + '/'); 7187 } 7188 7189 // Prefix wildcard: */path 7190 if (normalizedPattern.startsWith('*/')) { 7191 const endPath = normalizedPattern.slice(1); // Remove leading * 7192 return normalizedPath === endPath || normalizedPath.endsWith(endPath); 7193 } 7194 7195 // Exact match 7196 return normalizedPath === normalizedPattern; 7197 }; 7198 7199 /** 7200 * Check if current path is in exclusion list 7201 * @param {string[]} excludeList - Array of path patterns to exclude 7202 * @returns {boolean} True if current path matches any exclusion pattern 7203 */
7204 const isPathExcluded = (excludeList) => { 7205 return excludeList.some(pattern => pathMatches(queryPath, pattern)); 7206 }; 7207 7208 /** 7209 * Check if page is explicitly targeted (not via global wildcard) 7210 * This is used to determine if a segment rule should override global exclusions 7211 * 7212 * @param {string[]} targetPages - Array of target path patterns 7213 * @returns {boolean} True if path is explicitly targeted (not just via "*") 7214 */ 7215 const isExplicitlyTargeted = (targetPages) => { 7216 return targetPages.some(pattern => { 7217 if (pattern === '*') return false; // Global wildcard is not explicit 7218 return pathMatches(queryPath, pattern); 7219 }); 7220 }; 7221 7222 // Evaluate segment rules and build injection list 7223 const segmentsToInject = []; 7224 7225 for (const rule of segments_rules) { 7226 // console.log(`[Segment Routing] Evaluating segment rule: ${rule.internal_name}`); 7227 7228 // Rule must be enabled 7229 if (!rule.enabled) { 7230 // console.log(`[Segment Routing] ${rule.internal_name} Skipped: Rule disabled`); 7231 continue; 7232 } 7233 7234 // Customer must be in this segment 7235 if (!userSegmentsNames.includes(rule.internal_name)) { 7236 // console.log(`[Segment Routing] ${rule.internal_name} Skipped: Customer not in segment`); 7237 continue; 7238 } 7239 7240 // Current page must be in target pages 7241 const isTargetPage = rule.target_pages.some(pattern => pathMatches(queryPath, pattern)); 7242 if (!isTargetPage) { 7243 // console.log(`[Segment Routing] ${rule.internal_name} Skipped: Page not in target_pages`); 7244 continue; 7245 } 7246 7247 // Page must not be in rule-specific exclusions 7248 if (isPathExcluded(rule.exclude_pages)) { 7249 // console.log(`[Segment Routing] ${rule.internal_name} Skipped: Page in rule exclusion list`); 7250 continue; 7251 } 7252 7253 // Check global exclusions (can be overridden by explicit targeting) 7254 const isGloballyExcluded = isPathExcluded(global_config.always_exclude_pages); 7255 const isExplicitTarget = isExplicitlyTargeted(rule.target_pages); 7256 7257 if (isGloballyExcluded && !isExplicitTarget) { 7258 // console.log(`[Segment Routing] ${rule.internal_name} Skipped: Page globally excluded and not explicitly targeted`); 7259 continue; 7260 } 7261 7262 // Rule passes all checks - add to injection queue 7263 // console.log(`[Segment Routing] ${rule.internal_name} Approved for injection`); 7264 segmentsToInject.push({ 7265 key: rule.param_key || global_config.default_key, 7266 value: rule.value_alias || rule.internal_name, 7267 internal_name: rule.internal_name 7268 }); 7269 } 7270 7271 // Exit early if no segments qualify for injection 7272 if (segmentsToInject.length === 0) { 7273 // console.log('[Segment Routing] No applicable segments for current page'); 7274 return; 7275 } 7276 7277 // Inject segments via configured exposure method 7278 if (exposure_method === 'url_param') { 7279 const urlParams = new URLSearchParams(window.location.search); 7280 7281 // Group segments by parameter key 7282 const segmentsByKey = {}; 7283 segmentsToInject.forEach(seg => { 7284 if (!segmentsByKey[seg.key]) { 7285 segmentsByKey[seg.key] = []; 7286 } 7287 segmentsByKey[seg.key].push(seg.value); 7288 }); 7289 7290 // Add or update URL parameters 7291 Object.entries(segmentsByKey).forEach(([key, values]) => { 7292 const paramValue = values.join(global_config.multi_segment_separator); 7293 urlParams.set(key, paramValue); 7294 }); 7295 7296 // Update URL without triggering page reload 7297 const newURL = `${window.location.pathname}?${urlParams.toString()}${window.location.hash}`; 7298 window.history.replaceState({}, '', newURL); 7299 7300 // console.log('[Segment Routing] Segments injected to URL:', segmentsByKey); 7301 } else { 7302 console.warn(`[Segment Routing] Exposure method "${exposure_method}" is currently disabled`); 7303 } 7304} 7305// exc 7306try { sm_segment_routing_manager(sm_customer_email)} 7307catch (error) { console.warn("Segment routing fatal error", error)} 7308</script>
7308<script> 7309 var dfCurrencyCode = 'USD'; 7310 var dfGroupId = parseInt(""); 7311 var dfChannelId = parseInt("1"); 7312 var dfPageType = 'login'; 7313 var dfProductId = ''; 7314 7315 var dfCategoryName = ''; 7316 var dfBreadcrumbs = [{"url":"https:\u002f\u002fpinkzebrahome.com\u002f","name":"Home"},{"url":"\u002flogin.php","name":"Login"}]; 7317 var items = dfBreadcrumbs.slice(1); 7318 if (dfPageType === 'product') { 7319 items = items.slice(0, -1); 7320 } 7321 if (items.length > 0) { 7322 dfCategoryName = items 7323 .map(function(item) { return item.name; }) 7324 .join(' > '); 7325 } 7326 7327</script>
vendor: 1 bytes, line 7327
7327
7328<script src="https://us1-config.doofinder.com/2.x/4543d0a9-707e-439f-8294-1e23846191ea.js" async></script>
7328
7328<script> 7329 (function () { 7330 // Framed page = not a shopper: the dashboard's heatmap loads the 7331 // live store in an iframe, and BigCommerce's own previews frame 7332 // it too. Tracking there would mint device ids, pageviews and 7333 // replay uploads for the person LOOKING at analytics. Nothing 7334 // below runs; __pzReady never appears, so the funnel and purchase 7335 // blocks stay silent as well. 7336 try { 7337 if (window.self !== window.top) return; 7338 } catch (e) { 7339 return; 7340 } 7341 var HOST = 'https://crud.pinkzebrahome.com'; 7342 var WEBSITE_ID = 'a2d2ec29-dc40-4933-8e0d-05729f18d86f'; 7343 var STAFF_EMAIL = /@pinkzebrahome\.com$/i; 7344 // Used when pz/config.js is missing or unreachable. 7345 // 'staff' is the safe default: real customers are never 7346 // tracked by accident, and the canary keeps working even 7347 // if the config file was never deployed. 7348 var DEFAULT_MODE = 'staff'; 7349 7350 function loadScript(src, tagged, onload, onerror) { 7351 var s = document.createElement('script'); 7352 s.src = src; 7353 if (tagged) { 7354 s.setAttribute('data-website-id', WEBSITE_ID); 7355 // Doofinder rewrites the URL hash on every keystroke; 7356 // without this each one counts as a pageview. 7357 s.setAttribute('data-exclude-hash', 'true'); 7358 // Send/accept the collector's own cookie (server- 7359 // assigned device id, HttpOnly, never readable here). 7360 // Cross-origin but same site, so Lax cookies travel. 7361 s.setAttribute('data-fetch-credentials', 'include'); 7362 } 7363 if (onload) s.onload = onload; 7364 if (onerror) s.onerror = onerror; 7365 document.head.appendChild(s); 7366 } 7367 7368 // Record every page (owner decision 2026-09-08). Until then only 7369 // /cart, /checkout* and logged-in customers loaded the recorder; 7370 // that rule is kept below in case the volume has to be cut back: 7371 // replace `return true;` with the block that follows it. 7372 function shouldRecord() { 7373 return true; 7374 // var p = location.pathname; 7375 // if (p.indexOf('/cart') === 0) return true; 7376 // if (p.indexOf('/checkout') === 0) return true; 7377 // return Boolean(readCustomer()); 7378 } 7379 7380 // Who is logged in: the theme's own customer-data JSON block (rendered 7381 // on every page while logged in, for the theme's code, so a theme 7382 // release cannot drop it). __pzCustomer, a block only we knew about, 7383 // was wiped by a release on 2026-09-08: kept as a fallback only. 7384 function readCustomer() { 7385 var c = window.__pzCustomer; 7386 if (c && c.id) return c; 7387 var el = document.getElementById('customer-data'); 7388 if (!el) return null; 7389 var d; 7390 try { 7391 d = JSON.parse(el.textContent); 7392 } catch (e) { 7393 return null; 7394 } 7395 if (!d || !d.id) return null; 7396 var out = { 7397 id: d.id, 7398 email: d.email, 7399 phone: d.phone, 7400 name: d.name, 7401 customer_type: d.groupName 7402 }; 7403 // Not in the theme's JSON yet (storefront repo change pending). 7404 if (typeof d.storeCredit === 'number') out.store_credit = d.storeCredit; 7405 // The theme's login handler keeps a richer profile in 7406 // localStorage `customer_details` (CRM contact id, photo, 7407 // address, sponsor, rank...). It is written at login and 7408 // survives a logout without a storage clear, so it only 7409 // counts when the `customerId` stored with it is the 7410 // customer the page itself says is logged in. 7411 var extra = readCustomerDetails(d.id); 7412 for (var k in extra) { 7413 if (Object.prototype.hasOwnProperty.call(extra, k)) out[k] = extra[k]; 7414 } 7415 return out; 7416 } 7417 7418 // A scalar id as a trimmed string; anything else (missing, 7419 // empty, an object) is dropped by the caller. 7420 function asId(v) { 7421 if (typeof v === 'number' && isFinite(v)) return String(v); 7422 if (typeof v === 'string') return v.trim(); 7423 return undefined; 7424 } 7425 7426 // A photo URL worth storing. The theme fills profile_img and 7427 // selected_consultant.rep_image with this placeholder when the
7428 // consultant never uploaded one: that is "no photo". 7429 var NO_PHOTO = 'https://statics.pzebra.com/images/MicrosoftTeams-image+(1).png'; 7430 function asImage(v) { 7431 if (typeof v !== 'string') return undefined; 7432 v = v.trim(); 7433 if (v.indexOf('https://') !== 0 && v.indexOf('http://') !== 0) return undefined; 7434 if (v === NO_PHOTO) return undefined; 7435 return v; 7436 } 7437 7438 function readStoredJson(key) { 7439 try { 7440 return JSON.parse(localStorage.getItem(key) || 'null'); 7441 } catch (e) { 7442 return null; 7443 } 7444 } 7445 7446 function readCustomerDetails(customerId) { 7447 var out = {}; 7448 var storedId = null; 7449 try { 7450 storedId = localStorage.getItem('customerId'); 7451 } catch (e) { 7452 } 7453 if (storedId === null || String(storedId) !== String(customerId)) return out; 7454 var cd = readStoredJson('customer_details'); 7455 if (!cd || typeof cd !== 'object') return out; 7456 // Ids go out as strings: the collector stores a number as 7457 // "19948384.0000", which is what the profile would show. 7458 var copy = { 7459 contact_id: asId(cd.contact_id), 7460 profile_img: asImage(cd.profile_img), 7461 address: cd.address, 7462 city: cd.city, 7463 state: cd.state, 7464 postal_code: asId(cd.postal_code), 7465 country: cd.country, 7466 // consultants only 7467 consultant_id: asId(cd.consultant_id), 7468 rank: cd.current_rank, 7469 company_name: cd.company_name, 7470 website_url: cd.website_url 7471 }; 7472 // For a customer the sponsor is the consultant they were 7473 // signed up under; for a consultant it is their upline. 7474 if (cd.sponsor && typeof cd.sponsor === 'object') { 7475 copy.sponsor_id = asId(cd.sponsor.id); 7476 copy.sponsor_name = cd.sponsor.full_name; 7477 } 7478 for (var k in copy) { 7479 if (copy[k] !== undefined && copy[k] !== null && copy[k] !== '') out[k] = copy[k]; 7480 } 7481 return out; 7482 } 7483 7484 // The consultant this browser shops under (the theme's `repid` / 7485 // `selected_consultant`): the sale's attribution. Set for 7486 // logged-in customers and for visitors who arrive through a 7487 // consultant's link and never log in. 7488 function readRep() { 7489 var out = {}; 7490 var sc = readStoredJson('selected_consultant'); 7491 var repId = null; 7492 try { 7493 repId = localStorage.getItem('repid'); 7494 } catch (e) { 7495 } 7496 // The theme writes whatever it has, including "null". 7497 if (repId === 'null' || repId === 'undefined') repId = null; 7498 if (!repId && sc && sc.repID) repId = sc.repID; 7499 repId = asId(repId); 7500 if (repId) out.rep_id = repId; 7501 if (sc && sc.full_name) out.rep_name = sc.full_name; 7502 if (sc) { 7503 var repImg = asImage(sc.rep_image); 7504 if (repImg) out.rep_img = repImg; 7505 } 7506 return out; 7507 } 7508 7509 function identifyCustomer() { 7510 var c = readCustomer(); 7511 var rep = readRep(); 7512 if (!c || !c.id) { 7513 // Anonymous, but shopping under a consultant: the 7514 // attribution is still worth a session property. 7515 if (rep.rep_id) window.pinkzebra.identify(rep); 7516 return false;
7517 } 7518 for (var r in rep) { 7519 if (Object.prototype.hasOwnProperty.call(rep, r)) c[r] = rep[r]; 7520 } 7521 var props = {}; 7522 for (var k in c) { 7523 if (!Object.prototype.hasOwnProperty.call(c, k) || k === 'id') continue; 7524 var v = c[k]; 7525 // BC pads customer_group_name with a trailing space 7526 if (typeof v === 'string') v = v.trim(); 7527 if (v === '' || v === null || v === undefined) continue; 7528 props[k] = v; 7529 } 7530 window.pinkzebra.identify(String(c.id), props); 7531 return true; 7532 } 7533 7534 function start(mode) { 7535 // 'off' and any unknown value fail closed. 7536 if (mode !== 'all' && mode !== 'staff') return; 7537 if (mode === 'staff') { 7538 var c = readCustomer(); 7539 if (!c || !c.email || !STAFF_EMAIL.test(String(c.email).trim())) return; 7540 } 7541 loadScript(HOST + '/menu.js', true, function () { 7542 identifyCustomer(); 7543 // The funnel blocks below wait for this flag, so no 7544 // track() can ever run before identify(). The 7545 // tracker's automatic pageview fires at readyState 7546 // 'complete', which this load also precedes. 7547 window.__pzReady = true; 7548 if (shouldRecord()) loadScript(HOST + '/recorder.js', true); 7549 }); 7550 } 7551 7552 // Decide only when BOTH are in: pz/config.js (the mode) and 7553 // DOMContentLoaded (the theme's customer-data JSON in the head). 7554 var pending = 2; 7555 var mode = DEFAULT_MODE; 7556 function armed() { 7557 pending -= 1; 7558 if (pending === 0) start(mode); 7559 } 7560 7561 // Loaded as a script, not fetch(): no CORS needed from the 7562 // storefront origin. Cache-busted so a mode flip on the 7563 // server applies on every visitor's next page load. 7564 loadScript(HOST + '/pz/config.js?t=' + Date.now(), false, function () { 7565 if (window.__pzConfig && window.__pzConfig.mode) { 7566 mode = String(window.__pzConfig.mode); 7567 } 7568 armed(); 7569 }, armed); 7570 7571 if (document.readyState === 'loading') { 7572 document.addEventListener('DOMContentLoaded', armed); 7573 } else { 7574 armed(); 7575 } 7576 })(); 7577 </script>
7577 7578
7578<script> 7579 (function () { 7580 // __pzReady is set by the gate above only after menu.js has 7581 // loaded AND identify() has run, so anything behind whenPz 7582 // lands in the identified session. When tracking is gated 7583 // off, __pzReady never appears and every send is a no-op. 7584 function whenPz(fn, tries) { 7585 if (window.__pzReady) return fn(); 7586 if (tries <= 0) return; 7587 setTimeout(function () { whenPz(fn, tries - 1); }, 250); 7588 } 7589 7590 function num(v) { 7591 var n = Number(v); 7592 return isFinite(n) ? n : null; 7593 } 7594 7595 function productContext() { 7596 var ctx = {}; 7597 var idInput = document.querySelector('input[name="product_id"]'); 7598 if (idInput && idInput.value) ctx.product_id = idInput.value; 7599 try { 7600 var attrs = window.BCData && window.BCData.product_attributes; 7601 if (attrs) { 7602 if (attrs.sku) ctx.sku = attrs.sku; 7603 var price = attrs.price && (attrs.price.with_tax || attrs.price.without_tax); 7604 if (price && num(price.value) !== null) ctx.price = num(price.value); 7605 } 7606 } catch (e) { 7607 } 7608 var title = document.querySelector('h1.productView-title'); 7609 if (title) ctx.name = title.textContent.replace(/\s+/g, ' ').trim().slice(0, 200); 7610 return ctx; 7611 } 7612 7613 function isProductPage() { 7614 return Boolean(document.querySelector('input[name="product_id"]') || 7615 (window.BCData && window.BCData.product_attributes)); 7616 } 7617 7618 function trackViewProduct() { 7619 if (!isProductPage()) return; 7620 whenPz(function () { window.pinkzebra.track('view-product', productContext()); }, 80); 7621 } 7622 7623 function bindAddToCart() { 7624 document.addEventListener('click', function (event) { 7625 var target = event.target; 7626 if (!target || !target.closest) return; 7627 var btn = target.closest('#form-action-addToCart, [data-button-type="add-cart"], form[action*="cart.php"] [type="submit"]'); 7628 if (!btn) { 7629 // Vue listing cards: the direct add button is a plain 7630 // anchor with no tracking attributes - match its label. 7631 var candidate = target.closest('a.button, button.button'); 7632 if (candidate && 7633 /^add to cart$/i.test((candidate.textContent || '').replace(/\s+/g, ' ').trim())) { 7634 btn = candidate; 7635 } 7636 } 7637 if (!btn) return; 7638 // Listing-card "options" buttons navigate to the product page 7639 // instead of adding; the real add is tracked there. 7640 if ((btn.className || '').indexOf('button--options') > -1) return; 7641 var data = productContext(); 7642 if (data.product_id) { 7643 var qty = document.querySelector('input[name="qty[]"], input[name="qty"]'); 7644 if (qty && num(qty.value) !== null) data.quantity = num(qty.value); 7645 } else { 7646 // Listing/category card: product data lives on the card 7647 var pid = btn.getAttribute('data-product-id'); 7648 var href = btn.getAttribute('data-href') || btn.getAttribute('href') || ''; 7649 if (!pid) { 7650 var m = href.match(/[?&]product_id=(\d+)/); 7651 if (m) pid = m[1]; 7652 } 7653 if (pid) data.product_id = String(pid); 7654 // .card (exact token): [class*=card] would stop at 7655 // inner wrappers like card-action 7656 var card = btn.closest('.card'); 7657 if (card) { 7658 var t = card.querySelector('.product_title, .card-title, h3, h4'); 7659 if (t) data.name = t.textContent.replace(/\s+/g, ' ').trim().slice(0, 200); 7660 var priceEl = card.querySelector('[class*="price"]'); 7661 if (priceEl) { 7662 // Last number wins: sale cards read "Was $40 Now $29.99" 7663 var pm = (priceEl.textContent || '').replace(/,/g, '').match(/\d+(?:\.\d+)?/g); 7664 if (pm && pm.length) data.price = Number(pm[pm.length - 1]); 7665 } 7666 var link = card.querySelector('a[href*="/"]'); 7667 if (link && !data.product_id) { 7668 data.product_path = (link.getAttribute('href') || '').slice(0, 200); 7669 } 7670 } 7671 data.quantity = 1; 7672 } 7673 // cart_id ties this click to the begin-checkout of the same cart, so
7674 // the funnel is measured per cart and survives a session cut (login 7675 // at checkout, next-day return). The theme sets window.CART__ID at 7676 // page load; an empty cart has no id until the add lands, so ONE 7677 // later, non-blocking lookup is made and the event goes out with or 7678 // without the id. Nothing here waits on the click path. 7679 if (window.CART__ID) data.cart_id = String(window.CART__ID); 7680 whenPz(function () { 7681 if (data.cart_id) { 7682 window.pinkzebra.track('add-to-cart', data); 7683 return; 7684 } 7685 var sent = false; 7686 function send() { 7687 if (sent) return; 7688 sent = true; 7689 window.pinkzebra.track('add-to-cart', data); 7690 } 7691 setTimeout(function () { 7692 if (sent) return; 7693 fetch('/api/storefront/carts', {credentials: 'same-origin', keepalive: true}) 7694 .then(function (r) { return r.ok ? r.json() : null; }) 7695 .then(function (carts) { 7696 var cart = carts && carts[0]; 7697 if (cart && cart.id) { 7698 data.cart_id = String(cart.id); 7699 window.CART__ID = cart.id; 7700 } 7701 send(); 7702 }) 7703 .catch(send); 7704 }, 1200); 7705 setTimeout(send, 3000); 7706 window.addEventListener('pagehide', send); 7707 }, 80); 7708 }, true); 7709 } 7710 7711 function trackBeginCheckout() { 7712 var p = location.pathname; 7713 if (p.indexOf('/checkout') !== 0) return; 7714 if (p.indexOf('/checkout/order-confirmation') === 0) return; 7715 // Behind whenPz so gated-off visitors never hit the 7716 // storefront cart API for nothing. 7717 whenPz(function () { 7718 fetch('/api/storefront/carts', {credentials: 'same-origin'}) 7719 .then(function (r) { return r.ok ? r.json() : null; }) 7720 .then(function (carts) { 7721 var cart = carts && carts[0]; 7722 var data = {}; 7723 var guard = 'pz.begin-checkout'; 7724 if (cart) { 7725 guard += '.' + cart.id; 7726 data.cart_id = cart.id; 7727 if (num(cart.cartAmount) !== null) data.cart_total = num(cart.cartAmount); 7728 try { 7729 var items = cart.lineItems || {}; 7730 var count = 0; 7731 ['physicalItems', 'digitalItems', 'customItems'].forEach(function (k) { 7732 (items[k] || []).forEach(function (i) { count += i.quantity || 1; }); 7733 }); 7734 if (count > 0) data.items = count; 7735 } catch (e) { 7736 } 7737 } 7738 try { 7739 if (sessionStorage.getItem(guard)) return; 7740 } catch (e) { 7741 } 7742 window.pinkzebra.track('begin-checkout', data).then(function () { 7743 try { 7744 sessionStorage.setItem(guard, '1'); 7745 } catch (e) { 7746 } 7747 }); 7748 }) 7749 .catch(function () { 7750 }); 7751 }, 80); 7752 } 7753 7754 // Heuristic: error alert boxes appearing during checkout. Message text
7755 // is included so noisy matches can be refined with real data. 7756 function watchCheckoutErrors() { 7757 if (location.pathname.indexOf('/checkout') !== 0) return; 7758 if (!window.MutationObserver) return; 7759 var selector = '[class*="alertBox--error"], [class*="notification--error"], [class*="alert--error"]'; 7760 var sent = {}; 7761 7762 function report(el) { 7763 var message = (el.textContent || '').replace(/\s+/g, ' ').trim().slice(0, 200); 7764 if (message.length < 4 || sent[message]) return; 7765 sent[message] = true; 7766 window.pinkzebra.track('checkout-error', {message: message, path: location.pathname}); 7767 } 7768 7769 var observer = new MutationObserver(function (mutations) { 7770 for (var i = 0; i < mutations.length; i++) { 7771 var nodes = mutations[i].addedNodes; 7772 for (var j = 0; j < nodes.length; j++) { 7773 var node = nodes[j]; 7774 if (!node || node.nodeType !== 1) continue; 7775 if (node.matches && node.matches(selector)) { 7776 report(node); 7777 } else if (node.querySelector) { 7778 var el = node.querySelector(selector); 7779 if (el) report(el); 7780 } 7781 } 7782 } 7783 }); 7784 7785 // whenPz resolves after DOMContentLoaded (the gate waits 7786 // for it), so document.body exists; gated-off visitors 7787 // never pay for the observer. 7788 whenPz(function () { 7789 observer.observe(document.body, {childList: true, subtree: true}); 7790 }, 80); 7791 } 7792 7793 function init() { 7794 trackViewProduct(); 7795 bindAddToCart(); 7796 trackBeginCheckout(); 7797 watchCheckoutErrors(); 7798 } 7799 7800 if (document.readyState === 'loading') { 7801 document.addEventListener('DOMContentLoaded', init); 7802 } else { 7803 init(); 7804 } 7805 })(); 7806 </script>
7806 7807
7807<script> 7808 (function () { 7809 // Site search. The Doofinder live layer puts the query in the 7810 // URL hash on every keystroke (#4543/classic/...&q=pumpkin) and 7811 // writes "44 results found" / "No results found" into a 7812 // screen-reader-only node of its Search view. One `search` 7813 // event per distinct query per page, 2 s after the last 7814 // change, carrying the results count once the layer answered. 7815 // BigCommerce's own results page (Enter in the box) is covered 7816 // too: the query travels in ?search_query=. 7817 var SEARCH_DELAY = 2000; 7818 var RESULTS_WAIT = 2500; 7819 var MIN_LENGTH = 2; 7820 var sent = {}; 7821 var timer = null; 7822 7823 function normalize(q) { 7824 return String(q || '').trim().toLowerCase().replace(/\s+/g, ' ').slice(0, 100); 7825 } 7826 7827 function decode(v) { 7828 try { 7829 return decodeURIComponent(String(v).replace(/\+/g, ' ')); 7830 } catch (e) { 7831 return String(v); 7832 } 7833 } 7834 7835 function currentQuery() { 7836 var m = location.hash.match(/[?&#]q=([^&]*)/); 7837 if (m) return decode(m[1]); 7838 var inputs = document.querySelectorAll('input[data-search-quick]'); 7839 for (var i = 0; i < inputs.length; i++) { 7840 if (inputs[i].value) return inputs[i].value; 7841 } 7842 return ''; 7843 } 7844 7845 // null while the layer has not answered yet (or is closed) 7846 function layerResults() { 7847 var root = document.querySelector('.dfd-root[data-dfd-view="Search"]'); 7848 if (!root || root.hidden) return null; 7849 var nodes = root.querySelectorAll('.sr-only'); 7850 for (var i = 0; i < nodes.length; i++) { 7851 var t = nodes[i].textContent || ''; 7852 if (/no results/i.test(t)) return 0; 7853 var m = t.match(/(\d[\d,]*)\s+results?/i); 7854 if (m) return parseInt(m[1].replace(/,/g, ''), 10); 7855 } 7856 return null; 7857 } 7858 7859 function send(q, source, results) { 7860 if (sent[q]) return; 7861 sent[q] = true; 7862 var data = {query: q, source: source}; 7863 if (results !== null && results !== undefined) data.results = results; 7864 window.pinkzebra.track('search', data); 7865 } 7866 7867 function sendWhenAnswered(q) { 7868 var started = Date.now(); 7869 (function attempt() { 7870 if (sent[q]) return; 7871 var n = layerResults(); 7872 if (n === null && Date.now() - started < RESULTS_WAIT) return setTimeout(attempt, 250); 7873 send(q, 'doofinder', n); 7874 })(); 7875 } 7876 7877 function schedule() { 7878 clearTimeout(timer); 7879 timer = setTimeout(function () { 7880 if (!window.__pzReady) return; 7881 var q = normalize(currentQuery()); 7882 if (q.length < MIN_LENGTH) return; 7883 sendWhenAnswered(q); 7884 }, SEARCH_DELAY); 7885 } 7886 7887 window.addEventListener('hashchange', schedule); 7888 document.addEventListener('input', function (e) { 7889 var el = e.target; 7890 if (el && el.matches && el.matches('input[data-search-quick]')) schedule(); 7891 }, true); 7892 7893 // The classic results page: query in the URL, count in the 7894 // page heading when the theme prints one. 7895 if (location.pathname === '/search.php') { 7896 var m = location.search.match(/[?&]search_query=([^&]*)/); 7897 var q = m ? normalize(decode(m[1])) : ''; 7898 if (q.length >= MIN_LENGTH) { 7899 var tries = 120; 7900 (function poll() { 7901 if (!window.__pzReady) { 7902 if (tries-- > 0) return setTimeout(poll, 250); 7903 return; 7904 } 7905 var n = null; 7906 var heading = document.querySelector('.page-heading, h1'); 7907 var hm = heading && (heading.textContent || '').match(/(\d[\d,]*)\s+results?/i); 7908 if (hm) n = parseInt(hm[1].replace(/,/g, ''), 10); 7909 send(q, 'search-page', n); 7910 })(); 7911 } 7912 } 7913 })(); 7914 </script>
7914 7915
7915<script> 7916 (function () { 7917 // A consultant join never reaches /checkout/order-confirmation: 7918 // the theme's checkout redirects to /thank-you-join the moment 7919 // BigCommerce shows the confirmation skeleton (checkout-default.js, 7920 // waitForOrderResult), so the block below has to run there too. 7921 // On that page the order id is not in the DOM: the theme's 7922 // login handler writes it to localStorage `recent_order` once 7923 // the backend knows the order, which can take a moment -- and 7924 // until then `recent_order` may still hold the customer's 7925 // PREVIOUS order. The id seen during checkout is remembered so 7926 // only a NEW one counts. 7927 var JOIN_PAGE = location.pathname === '/thank-you-join'; 7928 var PREV_ORDER_KEY = 'pz.join.prev_order'; 7929 7930 function recentOrderId() { 7931 try { 7932 var r = JSON.parse(localStorage.getItem('recent_order') || 'null'); 7933 return r ? validOrderId(r.order_id) : null; 7934 } catch (e) { 7935 return null; 7936 } 7937 } 7938 7939 if (location.pathname.indexOf('/checkout') === 0 && 7940 location.pathname.indexOf('/checkout/order-confirmation') !== 0) { 7941 try { 7942 sessionStorage.setItem(PREV_ORDER_KEY, recentOrderId() || ''); 7943 } catch (e) { 7944 } 7945 return; 7946 } 7947 if (!JOIN_PAGE && location.pathname.indexOf('/checkout/order-confirmation') !== 0) return; 7948 7949 // A real BC order id is a positive integer. BC has rendered 7950 // orderId 0 in checkout-config (and the page text can echo 7951 // it): a 0 is not a lost purchase, it is a FAKE order that
7952 // joins with nothing and, worse, a shared dedupe key 7953 // (pz.purchase.0) that then blocks that browser's next 7954 // real purchase. Never accept it. 7955 function validOrderId(id) { 7956 var s = id === undefined || id === null ? '' : String(id); 7957 return /^[1-9][0-9]*$/.test(s) ? s : null; 7958 } 7959 7960 function orderIdFromConfig() { 7961 try { 7962 var el = document.getElementById('checkout-config'); 7963 if (el) { 7964 var cfg = JSON.parse(el.textContent); 7965 return validOrderId(cfg && cfg.orderId); 7966 } 7967 } catch (e) { 7968 } 7969 return null; 7970 } 7971 7972 function orderIdFromDom() { 7973 var m = document.body && document.body.innerText.match(/order number is[^0-9]*([0-9]+)/i); 7974 return m ? validOrderId(m[1]) : null; 7975 } 7976 7977 // /thank-you-join: the query string when the theme passes it, 7978 // otherwise `recent_order` -- but never the id already there 7979 // when the checkout started (that one is an older order). 7980 function orderIdFromJoinPage() { 7981 var m = location.search.match(/[?&](?:orderId|order_id)=([^&]*)/); 7982 if (m) { 7983 var q = null; 7984 try { 7985 q = validOrderId(decodeURIComponent(m[1])); 7986 } catch (e) { 7987 } 7988 if (q) return q; 7989 } 7990 var recent = recentOrderId(); 7991 if (!recent) return null; 7992 var prev = null; 7993 try { 7994 prev = sessionStorage.getItem(PREV_ORDER_KEY); 7995 } catch (e) { 7996 } 7997 return prev !== null && recent === prev ? null : recent; 7998 } 7999 8000 // Marks a purchase that came through the join page, so the 8001 // two paths can be told apart in the data. 8002 function tagged(data) { 8003 if (JOIN_PAGE) data.confirmation = '
8003join'; 8004 return data; 8005 } 8006 8007 // No usable order id but the tracker is up: count the 8008 // purchase with the id ABSENT (countable as "unknown") rather 8009 // than a fake one, guarded per page so a reload can't double it. 8010 function firePurchaseWithoutId() { 8011 var key = 'pz.purchase.noid.' + location.pathname + location.search; 8012 try { 8013 if (sessionStorage.getItem(key)) return; 8014 sessionStorage.setItem(key, '1'); 8015 } catch (e) { 8016 } 8017 pinkzebra.track('purchase', tagged({currency: 'USD', order_id_missing: true})); 8018 } 8019 8020 function num(v) { 8021 return typeof v === 'number' && isFinite(v) ? v : null; 8022 } 8023 8024 function firePurchase(orderId) { 8025 var key = 'pz.purchase.' + orderId; 8026 try { 8027 if (localStorage.getItem(key)) return; 8028 } catch (e) { 8029 } 8030 8031 var sent = false; 8032 8033 function send(data) { 8034 if (sent) return; 8035 sent = true; 8036 pinkzebra.track('purchase', tagged(data)).then(function () { 8037 try { 8038 localStorage.setItem(key, '1'); 8039 } catch (e) { 8040 } 8041 }); 8042 } 8043 8044 // The order detail below takes a round trip the visitor may 8045 // not wait for. If the page goes away first, the purchase 8046 // leaves NOW with what is certain, the order id, instead of 8047 // dying with the tab. `partial` marks it: the order counts, 8048 // its amount is not known to the dashboard. 8049 function sendPartial() { 8050 send({order_id: orderId, currency: 'USD', partial: true}); 8051 } 8052 window.addEventListener('pagehide', sendPartial); 8053 document.addEventListener('visibilitychange', function () { 8054 if (document.visibilityState === 'hidden') sendPartial(); 8055 }); 8056 8057 fetch('/api/storefront/orders/' + orderId, {credentials: 'same-origin'}) 8058 .then(function (r) { 8059 return r.ok ? r.json() : null; 8060 }) 8061 .then(function (order) { 8062 var data = {order_id: orderId, currency: 'USD'}; 8063 if (order) { 8064 if (order.currency && order.currency.code) data.currency = order.currency.code; 8065 var paid = num(order.orderAmount); 8066 var subtotal = num(order.baseAmount); 8067 var discount = num(order.discountAmount) || 0; 8068 // Coupons are NOT in discountAmount: the API lists them 8069 // apart. Without this a couponed order's net was its 8070 // pre-coupon subtotal (orderAmount was already right). 8071 var coupon = 0; 8072 if (order.coupons && order.coupons.length) { 8073 for (var i = 0; i < order.coupons.length; i++) { 8074 coupon += num(order.coupons[i].discountedAmount) || 0; 8075 } 8076 } 8077 coupon = Math.round(coupon * 100) / 100; 8078 var shipping = num(order.shippingCostTotal) || 0; 8079 var tax = num(order.taxTotal) || 0; 8080 // Raw components: consumers sum what they need. A 8081 // null travels as-is = "unknown" (countable), never 8082 // silently replaced by a different number. 8083 data.subtotal = subtotal; 8084 data.discount = discount; 8085 data.coupon_discount = coupon; 8086 data.shipping = shipping; 8087 data.tax = tax; 8088 data.order_total = paid; 8089 data.charged = paid; 8090 // ONE revenue definition, ALWAYS the same: tax is 8091 // never revenue, shipping is not either, discount 8092 // and coupons subtract. When subtotal is unknown the key is 8093 // OMITTED, never a fallback number (a non-numeric 8094 // value in a *revenue* data_key would abort the 8095 // whole event insert -- the revenue MV runs 8096 // toDecimal64 on it): absence IS the null. 8097 if (subtotal !== null) { 8098 data.net_revenue = Math.round((subtotal - discount - coupon) * 100) / 100; 8099 if (paid !== null) { 8100 var fullValue = Math.round((subtotal - discount - coupon + shipping + tax) * 100) / 100; 8101 var credit = Math.round((fullValue - paid) * 100) / 100; 8102 if (credit > 0) data.credit_used = credit; 8103 if (paid === 0 && fullValue > 0) data.paid_with_credit = true; 8104 } 8105 } 8106 } 8107 send(data); 8108 }) 8109 .catch(function () { 8110 send({order_id: orderId, currency: 'USD'}); 8111 }); 8112 } 8113 8114 // __pzReady (not just window.pinkzebra): guarantees the 8115 // purchase lands in the identified session and that 8116 // gated-off visitors never hit the order API. 60s of 8117 // polling: slow mobiles took longer than the old 20s. 8118 var tries = 240; 8119 (function poll() { 8120 var id = JOIN_PAGE ? orderIdFromJoinPage() : (orderIdFromConfig() || orderIdFromDom()); 8121 if (id && window.__pzReady) return firePurchase(id); 8122 if (tries-- > 0) return setTimeout(poll, 250); 8123 if (window.__pzReady) firePurchaseWithoutId(); 8124 })(); 8125 })(); 8126 </script>
8126 8127 8128 8129
8129<script type="module" src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/shogun/index.js"></script>
8129 8130
8130<script src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/theme/doc-ready.js"></script>
8130 8131
8131<script defer src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/audit/journey-viewer.js"></script>
8131 8132
8132<script defer src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/audit/journey-cart-sink.js"></script>
8132 8133
8133<script defer src="https://cdn11.bigcommerce.com/s-9khen3dncu/stencil/d4cea4a0-99a2-013f-a855-120a24f73952/e/c98a9ca0-8e5d-013f-f3bf-328227f9e273/js/helpers/devtools/devtools-warning.js"></script>
8133 8134 8135
8135<script>window.__CF$cv$params={r:'a40f2276cb7b99f0',t:'MTc5MDM5Mjg0NQ==',u:'01a0dbbac7e67726ad04caa0bc250fbf',ut:'8H1k2.hpFUzNy1120Znv.3XeARyG8eMgOUUISe9YWjk-1790392846-1.2.1.1-jozdh.FjFy8jKPtxYZNVLBnorTnSY97wIfVJaVvYgp2jLa1pTwed.Cq0_d1e81hQ4T3MARR_uGzBdKnNG.7LhSJ7pqGm3tWUEBDys4pjcqQ',i:60};(function(){if(!document.body)return;var s=document.createElement('script');s.src='/cdn-cgi/challenge-platform/scripts/precursor/main.js';document.head.appendChild(s);})();</script>
8135</body> 8136</html>
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.