1<!doctype html> 2<!-- 3 ___ ___ ___ ___ 4 / /\ /__/\ / /\ / /\ 5 / /:/_ \ \:\ / /:/ / /::\ 6 / /:/ /\ ___ ___ \ \:\ / /:/ / /:/\:\ 7 / /:/ /:/ /__/\ / /\ ___ \ \:\ / /:/ ___ / /:/ \:\ 8 /__/:/ /:/ \ \:\ / /:/ /__/\ \__\:\ /__/:/ / /\ /__/:/ \__\:\ 9 \ \:\/:/ \ \:\ /:/ \ \:\ / /:/ \ \:\ / /:/ \ \:\ / /:/ 10 \ \::/ \ \:\/:/ \ \:\ /:/ \ \:\ /:/ \ \:\ /:/ 11 \ \:\ \ \::/ \ \:\/:/ \ \:\/:/ \ \:\/:/ 12 \ \:\ \__\/ \ \::/ \ \::/ \ \::/ 13 \__\/ \__\/ \__\/ \__\/ 14-------------------------------------------------------------------- 15# Spark v2.7.0 16# Documentation: https://fluorescent.co/help/spark/ 17# Purchase: https://themes.shopify.com/themes/spark/ 18# A product by Fluorescent: https://fluorescent.co/ 19-------------------------------------------------------------------- 20--> 21<html class="no-js" lang="en" style="--announcement-height: 1px;"> 22<head>
22<script data-source-attribution="shopify.event_observer.bootstrap"> 23(function(){let e=navigator,t=`prototype`,n=`sendBeacon`,r=e[n],i=fetch,a=XMLHttpRequest[t],{open:o,send:s}=a,c=`EventListener`,l=`add${c}`,u=`remove${c}`,d=EventTarget[t],f=d[l],p=d[u],m=e=>Error((e=document.currentScript)&&[e?.src,e?.id||e?.dataset?.sourceAttribution]),h=(e=[],t=0)=>(e.p=n=>e[t++%1e3]=n,[e,t=>(e.forEach(e.p=t),e.length=0)]),[g,_]=h(),[v,y]=h(),b,x=new WeakMap,S=e=>e&&g.p([e,b||[m()]]);d[l]=function(e,t,n){let r=this,i=t?.handleEvent||t,a=x.get(t),o=m();i?.call&&!a&&x.set(t,a=function(e){b=[o,e.type];try{i.call(t==i?this:t,e)}finally{b=null}}),v.p([e,o,a,r?.tagName||r+``,r?.id]),f.call(r,e,a||t,n)},d[u]=function(e,t,n){p.call(this,e,x.get(t)||t,n)},a.open=function(e,t){x.set(this,[t+``,e]),o.apply(this,arguments)},a.send=function(e){S(x.get(this)),s.call(this,e)},fetch=(e,t)=>(S([(e?.url||e)+``,t?.method]),i(e,t)),e[n]=(t,n)=>(S([t+``,``]),r.call(e,t,n)),setTimeout(()=>import("//horror-vacui.com/cdn/shopifycloud/storefront/assets/storefront/event_observer_reporter-ed358274.js").then(e=>e.$(_,y,f,i,`61810966677`)))})(); 24//# sourceURL=event-observer-collector.js 25</script>
25 26 27 28 29 30 31 32 33 34 35 36<link id="TW_LINK" href="https://css.twik.io/6496146d980dc.css" onload="window.TWIK_SB && window.TWIK_SB()" rel="stylesheet"/>
36<script>!function(){window.TWIK_ID="6496146d980dc",localStorage.tw_init=1;var t=document.documentElement;if(window.TWIK_SB=function(){t.style.visibility="",t.style.opacity=""},window.TWIK_RS=function(){var t=document.getElementById("TW_LINK");t&&t.parentElement&&t.parentElement.removeChild(t)},setTimeout(TWIK_RS,localStorage.tw_init?2e3:6e3),setTimeout(TWIK_SB,localStorage.tw_init?250:1e3),document.body)return TWIK_RS();t.style.visibility="hidden",t.style.opacity=0}();</script>
36<script id="TW_SCRIPT" onload="window.TWIK_SB && window.TWIK_SB()" src="https://cdn.twik.io/tcs.js"></script>
36 37 <meta charset="UTF-8"> 38 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 39 <meta name="viewport" content="width=device-width,initial-scale=1"> 40 <meta name="google-site-verification" content="NbsxwWVHmLl0qkuvAvz-WrQxYNPg7UYwVRMdkcDhPrw" /> 41 <link rel="canonical" href="https://horror-vacui.com/blogs/news"> 42 <link rel="preconnect" href="https://cdn.shopify.com" crossorigin><link rel="shortcut icon" href="//horror-vacui.com/cdn/shop/files/favicon_1_32x32.jpg?v=1658138021" type="image/png"><title>News 43– HORROR VACUI</title> 44 45 46 47 48 49 50 51 52 53 54<meta name="description" content="HORROR VACUI" /> 55<meta property="og:url" content="https://horror-vacui.com/blogs/news"> 56<meta property="og:site_name" content="HORROR VACUI"> 57<meta property="og:type" content="website"> 58<meta property="og:title" content="News"> 59<meta property="og:description" content="HORROR VACUI"> 60<meta property="og:image" content="http://horror-vacui.com/cdn/shop/files/IMG_0032_2250x4000.jpg?v=1762253358"> 61<meta property="og:image:secure_url" content="https://horror-vacui.com/cdn/shop/files/IMG_0032_2250x4000.jpg?v=1762253358"> 62 63 64 65<meta name="twitter:title" content="News"> 66<meta name="twitter:description" content="HORROR VACUI"> 67<meta name="twitter:card" content="summary_large_image"> 68<meta name="twitter:image" content="https://horror-vacui.com/cdn/shop/files/IMG_0032_2250x4000.jpg?v=1762253358"> 69<meta name="twitter:image:width" content="480"> 70<meta name="twitter:image:height" content="480"> 71 72
72<script> 73 console.log('Spark v2.7.0 by Fluorescent'); 74 75 document.documentElement.className = document.documentElement.className.replace('no-js', ''); 76 77 window.theme = { 78 version: 'v2.7.0', 79 moneyFormat: "${{amount}}", 80 strings: { 81 name: "HORROR VACUI", 82 accessibility: { 83 play_video: "Play", 84 pause_video: "Pause" 85 }, 86 product: { 87 no_shipping_rates: "Shipping rate unavailable", 88 country_placeholder: "Country\/Region", 89 review: "Write a review" 90 }, 91 products: { 92 product: { 93 unavailable: "Unavailable", 94 unitPrice: "Unit price", 95 unitPriceSeparator: "per", 96 sku: "SKU" 97 } 98 }, 99 quickCart: { 100 addProductQuantity: "Subtract product quantity", 101 removeProductQuantity: "Add product quantity", 102 removeProduct: "Remove", 103 quantity: "Quantity" 104 } 105 }, 106 routes: { 107 root: "/", 108 cart: { 109 base: "/cart", 110 add: "/cart/add", 111 change: "/cart/change", 112 clear: "/cart/clear", 113 // Manual routes until Shopify adds support 114 shipping: "/cart/shipping_rates", 115 }, 116 // Manual routes until Shopify adds support 117 products: "/products", 118 productRecommendations: "/recommendations/products", 119 predictive_search_url: '/search/suggest' 120 }, 121 } 122 123 124</script>
124 125 126 <style> 127 @font-face { 128 font-family: "EB Garamond"; 129 font-weight: 400; 130 font-style: normal; 131 font-display: swap; 132 src: url("//horror-vacui.com/cdn/fonts/ebgaramond/ebgaramond_n4.f03b4ad40330b0ec2af5bb96f169ce0df8a12bc0.woff2") format("woff2"), 133 url("//horror-vacui.com/cdn/fonts/ebgaramond/ebgaramond_n4.73939a8b7fe7c6b6b560b459d64db062f2ba1a29.woff") format("woff"); 134} 135 136 @font-face { 137 font-family: "EB Garamond"; 138 font-weight: 400; 139 font-style: normal; 140 font-display: swap; 141 src: url("//horror-vacui.com/cdn/fonts/ebgaramond/ebgaramond_n4.f03b4ad40330b0ec2af5bb96f169ce0df8a12bc0.woff2") format("woff2"), 142 url("//horror-vacui.com/cdn/fonts/ebgaramond/ebgaramond_n4.73939a8b7fe7c6b6b560b459d64db062f2ba1a29.woff") format("woff"); 143} 144 145 146 @font-face { 147 font-family: "EB Garamond"; 148 font-weight: 400; 149 font-style: normal; 150 font-display: swap; 151 src: url("//horror-vacui.com/cdn/fonts/ebgaramond/ebgaramond_n4.f03b4ad40330b0ec2af5bb96f169ce0df8a12bc0.woff2") format("woff2"), 152 url("//horror-vacui.com/cdn/fonts/ebgaramond/ebgaramond_n4.73939a8b7fe7c6b6b560b459d64db062f2ba1a29.woff") format("woff"); 153} 154 155 @font-face { 156 font-family: "EB Garamond"; 157 font-weight: 700; 158 font-style: normal; 159 font-display: swap; 160 src: url("//horror-vacui.com/cdn/fonts/ebgaramond/ebgaramond_n7.d08d282a03b4a9cde493a0a5c170eb41fd0a48a6.woff2") format("woff2"), 161 url("//horror-vacui.com/cdn/fonts/ebgaramond/ebgaramond_n7.7c8306185882f01a9ed6edf77ce46bbf9dd53b41.woff") format("woff"); 162} 163 164 @font-face { 165 font-family: "EB Garamond"; 166 font-weight: 400; 167 font-style: italic; 168 font-display: swap; 169 src: url("//horror-vacui.com/cdn/fonts/ebgaramond/ebgaramond_i4.8a8d350a4bec29823a3db2f6d6a96a056d2e3223.woff2") format("woff2"), 170 url("//horror-vacui.com/cdn/fonts/ebgaramond/ebgaramond_i4.ac4f3f00b446eda80de7b499ddd9e019a66ddfe2.woff") format("woff"); 171} 172 173 @font-face { 174 font-family: "EB Garamond"; 175 font-weight: 700; 176 font-style: italic; 177 font-display: swap; 178 src: url("//horror-vacui.com/cdn/fonts/ebgaramond/ebgaramond_i7.a554120900e2a1ba4ba64bd80ad36a8fd44041f5.woff2") format("woff2"), 179 url("//horror-vacui.com/cdn/fonts/ebgaramond/ebgaramond_i7.7101ca1f5cf9647cc8a47fe8b7268d197f62e702.woff") format("woff"); 180} 181 182 183 :root { 184 --color-text: #1d1d1d; 185 --color-text-meta: rgba(29, 29, 29, 0.6); 186 --color-text-link: #000000; 187 --color-text-error: #C71B1B; 188 --color-text-success: #21b646; 189 190 --color-background: #ffffff; 191 --color-background-transparent: rgba(255, 255, 255, 0.8); 192 --color-border: #f4f4f4; 193 --color-overlay: #181818; 194 --color-overlay-transparent: rgba(24, 24, 24, 0.6); 195 196 --color-background-meta: #f5f5f5; 197 --color-background-darker-meta: #e8e8e8; 198 --color-foreground-meta: rgba(29, 29, 29, 0.6); 199 200 --color-border-input: #f4f4f4; 201 --color-text-input: #1d1d1d; 202 203 --color-background-button: #ffe9e8; 204 --color-background-button-hover: #ff8782; 205 --color-text-button: #1d1d1d; 206 --color-icon: rgba(29, 29, 29, 0.4); 207 --color-icon-darker: rgba(29, 29, 29, 0.6); 208 209 --color-background-sale-badge: #181818; 210 --color-text-sale-badge: #ffffff; 211 --color-background-sold-badge: #fbd3cc; 212 --color-text-sold-badge: #000000; 213 214 --color-background-contrast: #ffffff; 215 --color-background-meta-contrast: #f5f5f5; 216 --color-background-darker-meta-contrast: #e8e8e8; 217 --color-foreground-meta-contrast: rgba(0, 0, 0, 0.6); 218 --color-text-contrast: #000000; 219 --color-text-meta-contrast: rgba(0, 0, 0, 0.6); 220 --color-border-contrast: #3d3d3d; 221 --color-background-button-contrast: #000000; 222 --color-background-button-hover-contrast: #333333; 223 --color-text-button-contrast: #ffffff; 224 --color-text-link-contrast: #000000; 225 226 --color-text-header: #ffffff; 227 --color-background-header: #fbd3cc; 228 --color-background-header-transparent: rgba(251, 211, 204, 0); 229 --color-icon-header: #ffffff; 230 --color-shadow-header: rgba(0, 0, 0, 0.15); 231 232 --color-background-footer: #ffffff; 233 --color-text-footer: #1d1d1d; 234 235 --color-text-popover: #131313; 236 --color-text-meta-popover: rgba(19, 19, 19, 0.6); 237 --color-background-popover: #f4f4f4; 238 --color-background-meta-popover: #eaeaea; 239 --color-background-darker-meta-popover: #dddddd; 240 --color-background-button-popover: #131313; 241 --color-background-button-hover-popover: #464646; 242 --color-text-button-popover: #131313; 243 --color-border-popover: #d4d4d4; 244 --color-border-meta-popover: #a1a1a1; 245 246 --button-style: uppercase; 247 --button-shape: 0; 248 249 --font-logo: "EB Garamond", serif; 250 --font-logo-weight: 400; 251 --font-logo-style: normal; 252 --logo-font-size: 37px; 253 --logo-text-transform: none; 254 --logo-letter-spacing: 0.0em; 255 256 --font-heading: "EB Garamond", serif; 257 --font-heading-weight: 400; 258 --font-heading-style: normal;
259 --font-heading-light-weight: light; 260 --font-heading-text-transform: none; 261 --font-heading-base-letter-spacing: 0.025em; 262 --font-heading-base-size: 48px; 263 264 --font-body: "EB Garamond", serif; 265 --font-body-weight: 400; 266 --font-body-style: normal; 267 --font-body-italic: italic; 268 --font-body-bold-weight: 700; 269 --font-body-base-letter-spacing: 0.05em; 270 --font-body-base-size: 16px; 271 --font-body-base-line-height: 1.56; 272 273 --font-product-title-text-transform: none; 274 --font-product-title-base-letter-spacing: 0.125em; 275 276 /* Typography */ 277 --font-size-heading-1-large: 64px; 278 --line-height-heading-1-large: 44; 279 280 --font-size-heading-1-base: 48px; 281 --line-height-heading-1-base: 1.08; 282 283 --font-size-heading-2-large: 36px; 284 --line-height-heading-2-large: 1.22; 285 286 --font-size-heading-2-base: 28px; 287 --line-height-heading-2-base: 1.29; 288 289 --font-size-heading-3-base: 24px; 290 --line-height-heading-3-base: 1.33; 291 292 --font-size-heading-4-base: 20px; 293 --line-height-heading-4-base: 1.4; 294 295 --font-size-body-large: 21px; 296 --line-height-body-large: 1.5; 297 298 --font-size-body-base: 16px; 299 --line-height-body-base: 1.56; 300 301 --font-size-body-small: 14px; 302 --line-height-body-small: 1.75; 303 304 --font-size-body-x-small: 12px; 305 --line-height-body-x-small: 1.85; 306 307 /* Shopify pay specific */ 308 --payment-terms-background-color: #f5f5f5; 309 } 310</style> 311 <link href="//horror-vacui.com/cdn/shop/t/26/assets/theme.css?v=8871305132358273461728237194" rel="stylesheet" type="text/css" media="all" /> 312 <link href="//horror-vacui.com/cdn/shop/t/26/assets/custom.css?v=98528082273817684791728237194" rel="stylesheet" type="text/css" media="all" /> 313
313<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script>
313<meta name="facebook-domain-verification" content="vi3sjvdy3nffgs94idlybhlzp5bex0"> 314<meta name="google-site-verification" content="kZ8ort0vE-GMtcBKrk0bK34iIe9T52VI26qOsFm20wE"> 315<meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/61810966677/digital_wallets/dialog"> 316<meta id="in-context-paypal-metadata" data-shop-id="61810966677" data-venmo-supported="false" data-environment="production" data-locale="en_US" data-paypal-v4="true" data-currency="USD"> 317<link rel="ucp" href="/.well-known/ucp" version="2026-08-25"><link rel="alternate" type="application/atom+xml" title="Feed" href="/blogs/news.atom" /> 318<link rel="alternate" hreflang="x-default" href="https://horror-vacui.com/blogs/news"> 319<link rel="alternate" hreflang="en" href="https://horror-vacui.com/blogs/news"> 320<link rel="alternate" hreflang="en-GB" href="https://horror-vacui.com/en-im/blogs/news"> 321<link rel="alternate" hreflang="en-CA" href="https://horror-vacui.com/en-za/blogs/news"> 322<link rel="alternate" hreflang="en-MX" href="https://horror-vacui.com/en-za/blogs/news"> 323<link rel="alternate" hreflang="en-JP" href="https://horror-vacui.com/en-jp/blogs/news"> 324<link rel="alternate" hreflang="en-AU" href="https://horror-vacui.com/en-au/blogs/news"> 325<link rel="alternate" hreflang="en-KR" href="https://horror-vacui.com/en-kr/blogs/news"> 326<link rel="alternate" hreflang="en-CH" href="https://horror-vacui.com/en-ch/blogs/news"> 327<link rel="alternate" hreflang="en-SE" href="https://horror-vacui.com/en-se/blogs/news"> 328<link rel="alternate" hreflang="en-DK" href="https://horror-vacui.com/en-dk/blogs/news"> 329<link rel="alternate" hreflang="en-TW" href="https://horror-vacui.com/en-tw/blogs/news"> 330<link rel="alternate" hreflang="en-CN" href="https://horror-vacui.com/en-cn/blogs/news"> 331<link rel="alternate" hreflang="en-SG" href="https://horror-vacui.com/en-sg/blogs/news"> 332<link rel="alternate" hreflang="en-AE" href="https://horror-vacui.com/en-ae/blogs/news">
333<script async="async" src="/checkouts/internal/preloads.js?locale=en-US"></script>
vendor: 1 bytes, line 333
333
334<script id="apple-pay-shop-capabilities" type="application/json">{"shopId":61810966677,"countryCode":"DE","currencyCode":"USD","merchantCapabilities":["supports3DS"],"merchantId":"gid:\/\/shopify\/Shop\/61810966677","merchantName":"HORROR VACUI","requiredBillingContactFields":["postalAddress","email","phone"],"requiredShippingContactFields":["postalAddress","email","phone"],"shippingType":"shipping","supportedNetworks":["visa","maestro","masterCard","amex"],"total":{"type":"pending","label":"HORROR VACUI","amount":"1.00"},"shopifyPaymentsEnabled":true,"supportsSubscriptions":true}</script>
vendor: 1 bytes, line 334
334
335<script id="shopify-features" type="application/json">{"accessToken":"af8fa094312dc901e07a2cc60f6d78d4","betas":["rich-media-storefront-analytics"],"domain":"horror-vacui.com","predictiveSearch":true,"shopId":61810966677,"locale":"en"}</script>
vendor: 1 bytes, line 335
335
336<script>var Shopify = Shopify || {}; 337Shopify.shop = "horror-vacui-shop.myshopify.com"; 338Shopify.locale = "en"; 339Shopify.currency = {"active":"USD","rate":"1.12"}; 340Shopify.country = "US"; 341Shopify.theme = {"name":"FW2024 shopify-horrorvacui\/main","id":174423933275,"schema_name":"Spark","schema_version":"2.7.0","theme_store_id":null,"role":"main"}; 342Shopify.theme.handle = "null"; 343Shopify.theme.style = {"id":null,"handle":null}; 344Shopify.cdnHost = "horror-vacui.com/cdn"; 345Shopify.routes = Shopify.routes || {}; 346Shopify.routes.root = "/"; 347Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js"; 348Shopify.SignInWithShop = Shopify.SignInWithShop || {}; 349Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {}; 350Shopify.SignInWithShop.User.recognized = false;</script>
vendor: 1 bytes, line 350
350
351<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
vendor: 1 bytes, line 351
351
352<script>!function(o){function n(){var o=[];function n(){o.push(Array.prototype.slice.apply(arguments))}return n.q=o,n}var t=o.Shopify=o.Shopify||{};t.loadFeatures=n(),t.autoloadFeatures=n()}(window);</script>
vendor: 1 bytes, line 352
352
353<script> 354 window.Shopify = window.Shopify || {}; 355 window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {}; 356 window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.25 }; 357 window.Shopify.SignInWithShop.eligible = true; 358</script>
vendor: 1 bytes, line 358
358
359<script id="shop-js-analytics" type="application/json">{"pageType":"blog"}</script>
vendor: 1 bytes, line 359
359
360<script defer="defer" async type="module" src="https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"></script>
vendor: 1 bytes, line 360
360
361<script type="module"> 362 await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"); 363 364 window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true}); 365 366</script>
vendor: 1 bytes, line 366
366
367<script> 368 window.Shopify = window.Shopify || {}; 369 if (!window.Shopify.featureAssets) window.Shopify.featureAssets = {}; 370 window.Shopify.featureAssets['shop-js'] = {"avatar":["modules/v2/loader.avatar.en.esm.js"],"checkout-modal":["modules/v2/loader.checkout-modal.en.esm.js"],"init-customer-accounts-sign-up":["modules/v2/loader.init-customer-accounts-sign-up.en.esm.js"],"init-customer-accounts":["modules/v2/loader.init-customer-accounts.en.esm.js"],"init-fed-cm":["modules/v2/loader.init-fed-cm.en.esm.js"],"init-shop-cart-sync":["modules/v2/loader.init-shop-cart-sync.en.esm.js"],"init-shop-email-lookup-coordinator":["modules/v2/loader.init-shop-email-lookup-coordinator.en.esm.js"],"init-shop-for-new-customer-accounts":["modules/v2/loader.init-shop-for-new-customer-accounts.en.esm.js"],"init-shop-user-recognition":["modules/v2/loader.init-shop-user-recognition.en.esm.js"],"init-windoid":["modules/v2/loader.init-windoid.en.esm.js"],"lead-capture":["modules/v2/loader.lead-capture.en.esm.js"],"listener":["modules/v2/loader.listener.en.esm.js"],"pay-button":["modules/v2/loader.pay-button.en.esm.js"],"payment-terms":["modules/v2/loader.payment-terms.en.esm.js"],"shop-button":["modules/v2/loader.shop-button.en.esm.js"],"shop-cart-sync":["modules/v2/loader.shop-cart-sync.en.esm.js"],"shop-cash-offers":["modules/v2/loader.shop-cash-offers.en.esm.js"],"shop-follow-button":["modules/v2/loader.shop-follow-button.en.esm.js"],"shop-login-button":["modules/v2/loader.shop-login-button.en.esm.js"],"shop-login":["modules/v2/loader.shop-login.en.esm.js"],"shop-toast-manager":["modules/v2/loader.shop-toast-manager.en.esm.js"],"shop-user-recognition":["modules/v2/loader.shop-user-recognition.en.esm.js"]}; 371</script>
vendor: 1 bytes, line 371
371
372<script>(function() { 373 var isLoaded = false; 374 function asyncLoad() { 375 if (isLoaded) return; 376 isLoaded = true; 377 var urls = ["https:\/\/cdn.nfcube.com\/c001648ffe72672265fe5262ba5efb76.js?shop=horror-vacui-shop.myshopify.com","https:\/\/static.klaviyo.com\/onsite\/js\/XBSsrf\/klaviyo.js?company_id=XBSsrf\u0026shop=horror-vacui-shop.myshopify.com","\/\/d1liekpayvooaz.cloudfront.net\/apps\/customizery\/customizery.js?shop=horror-vacui-shop.myshopify.com"]; 378 for (var i = 0; i < urls.length; i++) { 379 var s = document.createElement('script'); 380 s.type = 'text/javascript'; 381 s.async = true; 382 s.src = urls[i]; 383 var x = document.getElementsByTagName('script')[0]; 384 x.parentNode.insertBefore(s, x); 385 } 386 }; 387 if(window.attachEvent) { 388 window.attachEvent('onload', asyncLoad); 389 } else { 390 window.addEventListener('load', asyncLoad, false); 391 } 392})();</script>
vendor: 1 bytes, line 392
392
393<script id="__st">var __st={"a":61810966677,"offset":7200,"reqid":"c5815a7e-1255-46f1-b9e0-032dc864dcd1-1790441860","pageurl":"horror-vacui.com\/blogs\/news","s":"blogs-84267368597","u":"6a8340561520","p":"blog","rtyp":"blog","rid":84267368597};</script>
vendor: 1 bytes, line 393
393
394<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
vendor: 1 bytes, line 394
394
395<script id="captcha-bootstrap">!function(){'use strict';const t='contact',e='account',n='new_comment',o=[[t,t],['blogs',n],['comments',n],[t,'customer']],c=[[e,'customer_login'],[e,'guest_login'],[e,'recover_customer_password'],[e,'create_customer']],r=t=>t.map((([t,e])=>`form[action*='/${t}']:not([data-nocaptcha='true']) input[name='form_type'][value='${e}']`)).join(','),a=t=>()=>t?[...document.querySelectorAll(t)].map((t=>t.form)):[];function s(){const t=[...o],e=r(t);return a(e)}const i='password',u='form_key',d=['recaptcha-v3-token','g-recaptcha-response','h-captcha-response',i],f=()=>{try{return window.sessionStorage}catch{return}},m='__shopify_v',_=t=>t.elements[u];function p(t,e,n=!1){try{const o=window.sessionStorage,c=JSON.parse(o.getItem(e)),{data:r}=function(t){const{data:e,action:n}=t;return t[m]||n?{data:e,action:n}:{data:t,action:n}}(c);for(const[e,n]of Object.entries(r))t.elements[e]&&(t.elements[e].value=n);n&&o.removeItem(e)}catch(o){console.error('form repopulation failed',{error:o})}}const l='form_type',E='cptcha';function T(t){t.dataset[E]=!0}const w=window,h=w.document,L='Shopify',v='ce_forms',y='captcha';let A=!1;((t,e)=>{const n=(g='f06e6c50-85a8-45c8-87d0-21a2b65856fe',I='https://cdn.shopify.com/shopifycloud/storefront-forms-hcaptcha/ce_storefront_forms_captcha_hcaptcha.v1.5.3.iife.js',D={infoText:'Protected by hCaptcha',privacyText:'Privacy',termsText:'Terms'},(t,e,n)=>{const o=w[L][v],c=o.bindForm;if(c)return c(t,g,e,D).then(n);var r;o.q.push([[t,g,e,D],n]),r=I,A||(h.body.append(Object.assign(h.createElement('script'),{id:'captcha-provider',async:!0,src:r})),A=!0)});var g,I,D;w[L]=w[L]||{},w[L][v]=w[L][v]||{},w[L][v].q=[],w[L][y]=w[L][y]||{},w[L][y].protect=function(t,e){n(t,void 0,e),T(t)},Object.freeze(w[L][y]),function(t,e,n,w,h,L){const[v,y,A,g]=function(t,e,n){const i=e?o:[],u=t?c:[],d=[...i,...u],f=r(d),m=r(i),_=r(d.filter((([t,e])=>n.includes(e))));return[a(f),a(m),a(_),s()]}(w,h,L),I=t=>{const e=t.target;return e instanceof HTMLFormElement?e:e&&e.form},D=t=>v().includes(t);t.addEventListener('submit',(t=>{const e=I(t);if(!e)return;const n=D(e)&&!e.dataset.hcaptchaBound&&!e.dataset.recaptchaBound,o=_(e),c=g().includes(e)&&(!o||!o.value);(n||c)&&t.preventDefault(),c&&!n&&(function(t){try{if(!f())return;!function(t){const e=f();if(!e)return;const n=_(t);if(!n)return;const o=n.value;o&&e.removeItem(o)}(t);const e=Array.from(Array(32),(()=>Math.random().toString(36)[2])).join('');!function(t,e){_(t)||t.append(Object.assign(document.createElement('input'),{type:'hidden',name:u})),t.elements[u].value=e}(t,e),function(t,e){const n=f();if(!n)return;const o=[...t.querySelectorAll(`input[type='${i}']`)].map((({name:t})=>t)),c=[...d,...o],r={};for(const[a,s]of new FormData(t).entries())c.includes(a)||(r[a]=s);n.setItem(e,JSON.stringify({[m]:1,action:t.action,data:r}))}(t,e)}catch(e){console.error('failed to persist form',e)}}(e),e.submit())}));const S=(t,e)=>{t&&!t.dataset[E]&&(n(t,e.some((e=>e===t))),T(t))};for(const o of['focusin','change'])t.addEventListener(o,(t=>{const e=I(t);D(e)&&S(e,y())}));const B=e.get('form_key'),M=e.get(l),P=B&&M;t.addEventListener('DOMContentLoaded',(()=>{const t=y();if(P)for(const e of t)e.elements[l].value===M&&p(e,B);[...new Set([...A(),...v().filter((t=>'true'===t.dataset.shopifyCaptcha))])].forEach((e=>S(e,t)))}))}(h,new URLSearchParams(w.location.search),n,t,e,['guest_login'])})(!0,!0)}();</script>
vendor: 1 bytes, line 395
395
396<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" defer="defer" src="//horror-vacui.com/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
vendor: 1 bytes, line 396
396
397<script>(function () {var userAgent = navigator.userAgent;var platform = navigator.platform;var maxTouchPoints = navigator.maxTouchPoints || 0;var isIOS = /iPad|iPhone|iPod/.test(platform) || (platform === 'MacIntel' && maxTouchPoints > 1);var isMacSafari = platform.indexOf('Mac') === 0 && /Safari/.test(userAgent) && !/Chrome|Chromium|CriOS|FxiOS|Edg|OPR|Android/.test(userAgent);var isAppleSafari = isIOS || isMacSafari;if (isAppleSafari) {fetch('/sf_private_access_tokens' + location.search).catch(function () {});}function browserMajorVersion(pattern) {var match = userAgent.match(pattern);return match ? parseInt(match[1], 10) : null;}function shouldLoadAutosizesPolyfill() {if (!window.PerformanceObserver?.supportedEntryTypes?.includes('paint')) {return false;}var chromeVersion = browserMajorVersion(/Chrome\/(\d+)/);if (chromeVersion !== null) {return chromeVersion < 126;}var firefoxVersion = browserMajorVersion(/Firefox\/(\d+)/);if (firefoxVersion !== null) {return firefoxVersion < 150;}var safariVersion = isAppleSafari ? browserMajorVersion(/Version\/(\d+).*Safari\//) : null;if (safariVersion !== null) {return safariVersion < 27;}return true;}if (shouldLoadAutosizesPolyfill()) {var autosizesScript = document.createElement('script');autosizesScript.async = true;autosizesScript.crossOrigin = 'anonymous';autosizesScript.src = "//horror-vacui.com/cdn/shopifycloud/storefront/assets/storefront/autosizes-84416378.js";(document.head || document.documentElement).appendChild(autosizesScript);}window.ShopifyAnalytics = window.ShopifyAnalytics || {};window.ShopifyAnalytics.performance = window.ShopifyAnalytics.performance || {};(function () {var LONG_FRAME_THRESHOLD = 50;var longAnimationFrames = [];var activeRafId = null;function collectLongFrames() {var previousTime = null;function rafMonitor(now) {if (activeRafId === null) {return;}var delta = now - previousTime;if (delta > LONG_FRAME_THRESHOLD) {longAnimationFrames.push({startTime: previousTime,endTime: now,});}previousTime = now;activeRafId = requestAnimationFrame(rafMonitor);}previousTime = performance.now();activeRafId = requestAnimationFrame(rafMonitor);}if (!window.PerformanceObserver?.supportedEntryTypes?.includes('long-animation-frame')) {collectLongFrames();var timeoutId = setTimeout(function () {cancelAnimationFrame(activeRafId);}, 10000);window.ShopifyAnalytics.performance.getLongAnimationFrames = function (stopCollection) {if (stopCollection === undefined) {stopCollection = false;}if (stopCollection) {clearTimeout(timeoutId);cancelAnimationFrame(activeRafId);}return longAnimationFrames;};}})();})();</script>
397<script id="shopify-origin-trials" async="async" integrity="sha256-qJbe/jEZBHtr5W/BlA2cKAz3vkXu6vJQyLjgvgCC86g=" src="//cdn.shopify.com/shopifycloud/storefront/assets/storefront/origin_trials-318ab40a.js" crossorigin="anonymous" onload="window.__shopifyOriginTrialsDone = true" onerror="window.__shopifyOriginTrialsDone = true"></script>
vendor: 1 bytes, line 397
397
398<script> 399 window.Shopify = window.Shopify || {}; 400 window.Shopify.MCP = window.Shopify.MCP || {}; 401 window.Shopify.MCP.enabled = true; 402 window.Shopify.MCP.shop = "horror-vacui-shop.myshopify.com"; 403 window.Shopify.MCP.mcpEndpoint = "https:\/\/horror-vacui.com\/api\/mcp"; 404 window.Shopify.MCP.tools = [{"name":"search_shop_policies_and_faqs","description":"Used to get facts about the stores policies, products, or services.\nSome examples of questions you can ask are:\n - What is your return policy?\n - What is your shipping policy?\n - What is your phone number?\n - What are your hours of operation?\"\n","inputSchema":{"$schema":"https:\/\/json-schema.org\/draft\/2020-12\/schema","type":"object","properties":{"query":{"type":"string","description":"A natural language query."},"context":{"type":"string","description":"Additional information about the request such as user demographics, mood, location, or other relevant details that could help in tailoring the response appropriately."}},"required":["query"]}}]; 405</script>
vendor: 1 bytes, line 405
405
406<script>(()=>{var d="shopify:webmcp_adapter_loaded",n=Symbol.for("shopify.webmcp_adapter_loading");function s(c,a,{win:r=window,doc:o=document}={}){function p(){try{return r.localStorage.getItem(d)==="true"}catch{return!1}}function l(){try{r.localStorage.setItem(d,"true")}catch{}}function u(){return typeof(o.modelContext||r.navigator?.modelContext)?.registerTool=="function"}function f(){if(r[n]||!u())return;let t=o.head||o.getElementsByTagName("head")[0];if(!t)return;let e=o.createElement("script");e.type="module",e.crossOrigin="anonymous",a&&(e.integrity=a),e.src=c,e.addEventListener("load",l,{once:!0}),e.addEventListener("error",()=>{r[n]=!1},{once:!0}),t.appendChild(e),r[n]=!0}function _(t){let e=o.getElementById("shopify-origin-trials");if(!e||r.__shopifyOriginTrialsDone){t();return}e.addEventListener("load",t,{once:!0}),e.addEventListener("error",t,{once:!0})}function i(){_(()=>r.setTimeout(f,0))}function m(){o.addEventListener("DOMContentLoaded",i,{once:!0})}p()?i():m()}s("\/\/horror-vacui.com\/cdn\/shopifycloud\/storefront\/assets\/storefront\/webmcp-c6b62ece.js","sha256-ke4DDuBjdvea3vxLWxHc9E9nq8zihuG4IfYEGbb77ys=");})(); 407</script>
vendor: 1 bytes, line 407
407
408<script data-source-attribution="shopify.dynamic_checkout.dynamic.init">var Shopify=Shopify||{};Shopify.PaymentButton=Shopify.PaymentButton||{isStorefrontPortableWallets:!0,init:function(){window.Shopify.PaymentButton.init=function(){};var t=document.createElement("script");t.src="https://horror-vacui.com/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}}; 409</script>
vendor: 1 bytes, line 409
409
410<script data-source-attribution="shopify.dynamic_checkout.buyer_consent"> 411 function portableWalletsHideBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.add("hidden"),t.setAttribute("aria-hidden","true"),n.removeEventListener("click",e))}function portableWalletsShowBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.remove("hidden"),t.removeAttribute("aria-hidden"),n.addEventListener("click",e))}window.Shopify?.PaymentButton&&(window.Shopify.PaymentButton.hideBuyerConsent=portableWalletsHideBuyerConsent,window.Shopify.PaymentButton.showBuyerConsent=portableWalletsShowBuyerConsent); 412</script>
vendor: 1 bytes, line 412
412
413<script data-source-attribution="shopify.dynamic_checkout.cart.bootstrap">document.addEventListener("DOMContentLoaded",(function(){function t(){return document.querySelector("shopify-accelerated-checkout-cart, shopify-accelerated-checkout")}if(t())Shopify.PaymentButton.init();else{new MutationObserver((function(e,n){t()&&(Shopify.PaymentButton.init(),n.disconnect())})).observe(document.body,{childList:!0,subtree:!0})}})); 414</script>
vendor: 1 bytes, line 414
414
415<script id='scb4127' type='text/javascript' async='' src='https://horror-vacui.com/cdn/shopifycloud/privacy-banner/storefront-banner.js'></script>
415<link id="shopify-accelerated-checkout-styles" rel="stylesheet" media="screen" href="https://horror-vacui.com/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css" crossorigin="anonymous"> 416<style id="shopify-accelerated-checkout-cart"> 417 #shopify-buyer-consent { 418 margin-top: 1em; 419 display: inline-block; 420 width: 100%; 421} 422 423#shopify-buyer-consent.hidden { 424 display: none; 425} 426 427#shopify-subscription-policy-button { 428 background: none; 429 border: none; 430 padding: 0; 431 text-decoration: underline; 432 font-size: inherit; 433 cursor: pointer; 434} 435 436#shopify-subscription-policy-button::before { 437 box-shadow: none; 438} 439 440 </style> 441
442<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
442 443<link rel="dns-prefetch" href="https://cdn.secomapp.com/"> 444<link rel="dns-prefetch" href="https://ajax.googleapis.com/"> 445<link rel="dns-prefetch" href="https://cdnjs.cloudflare.com/"> 446<link rel="preload" as="stylesheet" href="//horror-vacui.com/cdn/shop/t/26/assets/sca-pp.css?v=178374312540912810101728237194"> 447 448<link rel="stylesheet" href="//horror-vacui.com/cdn/shop/t/26/assets/sca-pp.css?v=178374312540912810101728237194"> 449
449<script> 450 451 SCAPPShop = {}; 452 453 </script>
453
454<script type="text/javascript"> 455 window.Rivo = window.Rivo || {}; 456 window.Rivo.common = window.Rivo.common || {}; 457 window.Rivo.common.shop = { 458 permanent_domain: 'horror-vacui-shop.myshopify.com', 459 currency: "EUR", 460 money_format: "${{amount}}", 461 id: 61810966677 462 }; 463 464 465 window.Rivo.common.template = 'blog'; 466 window.Rivo.common.cart = {}; 467 window.Rivo.common.vapid_public_key = "BJuXCmrtTK335SuczdNVYrGVtP_WXn4jImChm49st7K7z7e8gxSZUKk4DhUpk8j2Xpiw5G4-ylNbMKLlKkUEU98="; 468 window.Rivo.global_config = {"asset_urls":{"loy":{"api_js":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/ba_rivo_api.js?v=1711433133","lp_js":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/ba_rivo_lp.js?v=1728357978","lp_css":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/ba_rivo_lp.css?v=1726524319","profile_js":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/ba_rivo_profile.js?v=1728357977","profile_css":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/ba_rivo_profile.css?v=1728531230","init_js":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/ba_loy_init.js?v=1728219104","referrals_js":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/ba_loy_referrals.js?v=1711433131","referrals_css":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/ba_loy_referrals.css?v=1700287043","widget_js":"https:\/\/cdn.shopify.com\/s\/files\/1\/0037\/2110\/1430\/t\/963\/assets\/ba_loy_widget.js?v=1728252181","widget_css":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/ba_loy_widget.css?v=1692840875","page_init_js":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/ba_loy_page_init.js?v=1711433130","page_widget_js":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/ba_loy_page_widget.js?v=1711432435","page_widget_css":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/ba_loy_page.css?v=1693059047","page_preview_js":"\/assets\/msg\/loy_page_preview.js","app_proxy_applications_js":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/app_proxy_application.js?v=1708835151","app_proxy_membership_js":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/app_proxy_membership.js?v=1708835152"},"forms":{"init_js":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/ba_forms_init.js?v=1711433134","widget_js":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/ba_forms_widget.js?v=1711433135","forms_css":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/ba_forms.css?v=1691714518"},"global":{"helper_js":"https:\/\/cdn.shopify.com\/s\/files\/1\/0194\/1736\/6592\/t\/1\/assets\/ba_tracking.js?v=1710750015"}},"proxy_paths":{"loy":"\/apps\/ba-loy","app_metrics":"\/apps\/ba-loy\/app_metrics","push_subscription":"\/apps\/ba-loy\/push"},"aat":["loy"],"pv":false,"sts":false,"bam":false,"batc":false,"base_money_format":"⬠{{amount_with_comma_separator}}","online_store_version":2,"loy_js_api_enabled":false,"hide_console_ad":false,"shop":{"id":61810966677,"name":"HORROR VACUI","domain":"horror-vacui.com"},"theme_extension_local_assets":false}; 469 470 471 472 window.Rivo.loy_config = {"brand_theme_settings":{"enabled":false,"button_bg":"#2932fc","header_bg":"#2932fc","desc_color":"#737376","icon_color":"#3a3a3a","link_color":"#2932fc","visibility":"both","cards_shape":"rounded","hide_widget":false,"launcher_bg":"#286ef8","mobile_icon":"star","mobile_text":"Rewards","title_color":"#212b36","banner_image":"","desktop_icon":"star","desktop_text":"Rewards","inputs_shape":"rounded","primary_font":"Inter","buttons_shape":"rounded","mobile_layout":"icon_with_text","primary_color":"#2932fc","desktop_layout":"icon_with_text","launcher_shape":"circle","secondary_font":"Inter","container_shape":"rounded","mobile_placement":"right","button_text_color":"#fff","desktop_placement":"right","header_text_color":"#fff","powered_by_hidden":false,"launcher_text_color":"#ffffff","mobile_side_spacing":20,"desktop_side_spacing":20,"panel_order_settings":{"vip":3,"points":1,"referrals":2},"mobile_bottom_spacing":20,"desktop_bottom_spacing":20,"hide_widget_permanently":false,"hide_widget_launcher_on_mobile":false},"launcher_style_settings":{"enabled":false,"button_bg":"#2932fc","header_bg":"#2932fc","de
472sc_color":"#737376","icon_color":"#3a3a3a","link_color":"#2932fc","visibility":"both","cards_shape":"rounded","hide_widget":false,"launcher_bg":"#286ef8","mobile_icon":"star","mobile_text":"Rewards","title_color":"#212b36","banner_image":"","desktop_icon":"star","desktop_text":"Rewards","inputs_shape":"rounded","primary_font":"Inter","buttons_shape":"rounded","mobile_layout":"icon_with_text","primary_color":"#2932fc","desktop_layout":"icon_with_text","launcher_shape":"circle","secondary_font":"Inter","container_shape":"rounded","mobile_placement":"right","button_text_color":"#fff","desktop_placement":"right","header_text_color":"#fff","powered_by_hidden":false,"launcher_text_color":"#ffffff","mobile_side_spacing":20,"desktop_side_spacing":20,"panel_order_settings":{"vip":3,"points":1,"referrals":2},"mobile_bottom_spacing":20,"desktop_bottom_spacing":20,"hide_widget_permanently":false,"hide_widget_launcher_on_mobile":false},"points_program_enabled":false,"referral_program_enabled":false,"membership_program_enabled":false,"vip_program_enabled":false,"vip_program_tier_type":"points_earned","vip_program_period":"lifetime","floating_widget_settings":{"enabled":false,"button_bg":"#2932fc","header_bg":"#2932fc","desc_color":"#737376","icon_color":"#3a3a3a","link_color":"#2932fc","visibility":"both","cards_shape":"rounded","hide_widget":false,"launcher_bg":"#286ef8","mobile_icon":"star","mobile_text":"Rewards","title_color":"#212b36","banner_image":"","desktop_icon":"star","desktop_text":"Rewards","inputs_shape":"rounded","primary_font":"Inter","buttons_shape":"rounded","mobile_layout":"icon_with_text","primary_color":"#2932fc","desktop_layout":"icon_with_text","launcher_shape":"circle","secondary_font":"Inter","container_shape":"rounded","mobile_placement":"right","button_text_color":"#fff","desktop_placement":"right","header_text_color":"#fff","powered_by_hidden":false,"launcher_text_color":"#ffffff","mobile_side_spacing":20,"desktop_side_spacing":20,"panel_order_settings":{},"mobile_bottom_spacing":20,"desktop_bottom_spacing":20,"hide_widget_permanently":false,"hide_widget_launcher_on_mobile":false,"desktop_launcher_icon":null,"mobile_launcher_icon":null},"domain_name":"loyalty.rivo.io","font_settings":{},"translations":{"vip_perks":"Perks","vip_tiers":"VIP Tiers","general_by":"by","vip_reward":"VIP reward","vip_status":"VIP Status","general_day":"Day","social_like":"Like","social_share":"Share","vip_benefits":"Benefits","general_error":"Hmm, something went wrong, please try again shortly","general_month":"Month","general_point":"Point","general_spend":"you spend","general_spent":"Spent","social_follow":"Follow","tos_expiry_at":"Reward expires on {{expiry_date}}.","vip_tier_desc":"Gain access to exclusive rewards.","general_credit":"Credit","general_points":"Points","general_redeem":"Redeem","general_reward":"reward","vip_tier_spend":"Spend {{amount}}","general_credits":"Credits","general_go_back":"Go back","general_rewards":"Rewards","general_sign_in":"Sign in","general_sign_up":"Sign up","referrals_title":"Referral Program","review_complete":"Post a product review","general_share_on":"Share on","general_you_have":"You have","tos_free_product":"Reward only applies to {{product_name}}","acct_creation_btn":"Start Earning","general_edit_date":"Edit Date","general_save_date":"Save date","general_signed_up":"signed up","member_point_desc":"Earn points and turn these into rewards!","referral_complete":"Complete a Referral","tos_expiry_months":"Expires {{expiry_months}} month(s) after being redeemed.","vip_tier_achieved":"Unlocked {{tier_name}}","vip_tier_added_to":"Added to {{tier_name}}","acct_creation_desc":"Get rewarded for being an awesome customer","general_apply_code":"Apply code","general_share_link":"Share your Personal Link","referrals_email_to":"To","vip_achieved_until":"Achieved until","vip_tier_to_unlock":"to unlock","visitor_point_desc":"Earn points and turn these into rewards!","acct_creation_title":"Join and Earn Rewards","general_reward_show":"Show","member_header_title":"{points}","member_point_header":"Points","referrals_completed":"referrals completed so far","vip_tier_dropped_to":"Fell to {{tier_name}}","vip_tier_on_highest":"You did it! You're on the highest tier ð","general_balance_text":"store credit","general_past_rewards":"Past rewards","general_product_page":"product page","general_ways_to_earn":"Ways to earn","general_your_rewards":"Your rewards","referrals_email_send":"Send email","referrals_get_reward":"Get your","referrals_share_link":"Share this link with a friend for them to claim the reward","social_facebook_like"
472:"Like page on Facebook","social_tiktok_follow":"Follow on TikTok","social_twitter_share":"Share link on Twitter","tos_min_order_amount":"Applies to all orders over {{min_order_amount}}.","vip_tier_earn_points":"Earn {{points}} Points","vip_tier_retained_to":"Kept {{tier_name}}","vip_tier_vip_history":"VIP History","visitor_header_title":"ð Rewards Program","visitor_point_header":"Earn Points","acct_creation_sign_in":"Already a member?","general_cancel_points":"Points canceled","general_no_points_yet":"No Points yet","general_refund_points":"Points refunded","general_sms_subscribe":"Subscribe to SMS","member_header_caption":"Your points","social_facebook_share":"Share link on Facebook","social_twitter_follow":"Follow on Twitter","vip_reward_earned_via":"Earned via {{vip_tier_name}} tier","vip_you_have_achieved":"You've achieved","general_no_rewards_yet":"No rewards yet","general_place_an_order":"Place an order","general_upload_receipt":"Submit a Receipt","general_ways_to_redeem":"Ways to redeem","referrals_claim_reward":"Claim your gift","referrals_code_invalid":"This referral code is invalid","referrals_email_invite":"Refer friends by email","referrals_visitor_desc":"Refer a friend who makes a purchase and both of you will claim rewards.","review_complete_points":"{{points_amount}} Points for every review posted","visitor_header_caption":"Join now and unlock awesome rewards","general_birthday_reward":"Celebrate with a reward","general_discount_amount":"points for ${{discount_amount}} off","general_email_subscribe":"Subscribe to Emails","general_expiration_date":"Expiration Date","general_no_activity_yet":"No activity yet","general_placed_an_order":"Placed an order","general_points_activity":"Points History","general_share_via_email":"Share via Email","general_upcoming_reward":"Upcoming reward","general_you_have_points":"You have {{points}} points","membership_order_placed":"Credits earned from placing an order","referrals_email_message":"Message","referrals_invalid_email":"Please enter a valid email address","referrals_referral_code":"Your referral link to share","social_instagram_follow":"Follow on Instagram","tos_apply_to_collection":"Only for products in specific collections.","tos_max_shipping_amount":"Maximum shipping amount of {{max_shipping_amount}}.","vip_tier_no_vip_history":"No VIP membership history yet","general_enter_valid_date":"Please enter a valid date","general_points_for_every":"Points for every","general_uploaded_receipt":"Submitted a Receipt","referral_complete_points":"{{points_amount}} Points for every referral completed","referrals_call_to_action":"Refer friends and earn","referrals_claimed_reward":"Here's your","referrals_create_account":"Create an Account","referrals_status_blocked":"blocked","referrals_status_pending":"pending","referrals_your_referrals":"Your referrals","general_click_to_see_more":"View My Rewards Account","general_redeemed_a_reward":"Redeemed a Reward","general_use_discount_code":"Use this discount code on your next order!","referrals_already_visited":"Already visited this page","referrals_general_invalid":"Sorry, looks like this referral is invalid","referrals_referred_reward":"They will get","referrals_referrer_reward":"You will get","general_celebrate_birthday":"Celebrate a birthday","general_how_to_earn_points":"How do I earn Points?","loyalty_page_rewards_title":"Rewards","referrals_no_referrals_yet":"No referrals yet","referrals_progran_disabled":"This referral program is disabled","referrals_status_completed":"completed","review_complete_past_tense":"Posted a product review","general_add_product_to_cart":"Add product to cart","general_balance_text_plural":"Credits","general_fallback_first_name":"there","general_not_enough_earnings":"Not enough earnings to redeem","general_were_awarded_points":"were awarded points","general_manual_points_adjust":"manual points adjustment","referral_complete_past_tense":"Completed a Referral","referrals_similar_ip_invalid":"We are unable to process referrals within the same IP address","vip_tier_orders_placed_count":"Place {{amount}} Orders","general_activate_store_credit":"Activate Store Credit","general_celebrate_anniversary":"Celebrate Loyalty Anniversary","general_redeemed_store_credit":"Redeemed Store Credit","loyalty_page_rewards_subtitle":"You have the following rewards ready to use","checkout_ui_redeem_points_desc":"You have {{points}} points! Redeem for discounts on this order.","general_discount_amount_coupon":"${{discount_amount}} off coupon","general_have_not_earned_points":"You haven't earned any Points yet.","referrals_email_to_placeholder":"Add a comma-separated list of emails","referrals_name_must_be_present":"Please enter your first name","checkout_ui_redeem_points_login":"Log in","checkout_ui_redeem_points_title":"Redeem your points","general_add_points_default_note":"Points granted by points import","general_celebrate_your_birthday":"Let's celebrate your birthday! ð Please give us 30 days notice - otherwise, you'll have to wait another year.","general_please_choose_an_option":"Please choose an option from the","general_redeem_error_max_points":"Exceeded maximum points to spend","general_redeem_error_min_points":"Did not meet minimum points to redeem","loyalty_page_banner_earn_button":"Earn points","loyalty_page_rewards_no_rewards":"No rewards yet","loyalty_page_ways_to_earn_title":"Ways to Earn","referrals_email_already_claimed":"This email has already been claimed","referrals_general_invalid_title":"We're Sorry","social_facebook_like_past_tense":"Liked a page on Facebook","social_tiktok_follow_past_tense":"Followed on TikTok","
472social_twitter_share_past_tense":"Shared a link on Twitter","loyalty_page_banner_login_button":"Sign In","loyalty_page_upload_receipt_help":"Upload a receipt within the last 30 days to earn points. Please lay the receipt on a flat surface and take a photo from a close distance.","social_facebook_share_past_tense":"Shared a link on Facebook","social_twitter_follow_past_tense":"Followed on Twitter","account_slideout_home_login_title":"Sign in to manage your account","general_points_for_judgeme_review":"JudgeMe review","loyalty_page_banner_redeem_button":"Redeem Rewards","loyalty_page_subscribe_email_help":"Subscribe to our email list and earn points","loyalty_page_ways_to_redeem_title":"Ways to Redeem","referrals_account_already_claimed":"You already have an account. You can invite your friends to win rewards!","checkout_ui_redeemed_rewards_title":"Your rewards","general_reset_removal_default_note":"Existing points removed for points reset from import","loyalty_page_customer_birthday_day":"Day","loyalty_page_upload_receipt_attach":"Attach File","loyalty_page_upload_receipt_button":"Submit Receipt","loyalty_page_ways_to_earn_subtitle":"Earn points by completing these actions","referrals_your_referrals_show_here":"Your referrals will show here.","social_instagram_follow_past_tense":"Followed on Instagram","account_slideout_orders_login_title":"Sign in to view your orders","checkout_ui_points_estimation_title":"Complete this purchase to earn up to {{points}} points","checkout_ui_refer_friends_login_url":"account\/login?return_url=\/account\u0026email={{customer_email}}","general_loyalty_program_and_rewards":"Loyalty Program \u0026 Rewards","general_your_rewards_will_show_here":"Your rewards will show here.","loyalty_page_banner_logged_in_title":"Welcome to the program","loyalty_page_banner_register_button":"Join Now","loyalty_page_explainer_step_1_title":"Signup","loyalty_page_explainer_step_2_title":"Earn","loyalty_page_explainer_step_3_title":"Redeem","loyalty_page_subscribe_email_button":"Subscribe","loyalty_page_upload_receipt_no_file":"Please select a file to upload","loyalty_page_upload_receipt_success":"Thanks! Your receipt will be reviewed shortly","membership_tier_unlocked_past_tense":"Membership Signup","referrals_email_message_placeholder":"Customize your referral message. The referral link will be automatically added.","account_slideout_profile_login_title":"Sign in to manage your profile","checkout_ui_redeem_points_login_desc":"to view your points balance and discover rewards available for redemption.","loyalty_page_banner_logged_out_title":"Join our Loyalty Program","loyalty_page_customer_birthday_month":"Month","loyalty_page_customer_birthday_title":"Celebrate your birthday","loyalty_page_ways_to_redeem_subtitle":"Redeem points for these rewards","checkout_ui_points_estimation_subtext":"Loyalty points can be redeemed for rewards on future purchases. Actual points awarded may differ if other discounts are applied.","checkout_ui_refer_friends_login_title":"Claim your points from this purchase !","general_celebrate_birthday_past_tense":"Celebrated a birthday","account_dashboard_activity_block_title":"Your Activity","account_dashboard_member_card_cta_text":"View Rewards","account_dashboard_referral_block_title":"Refer a friend","general_reset_new_balance_default_note":"Points reset to new balance by points import","loyalty_page_explainer_logged_in_title":"Hi \u003cspan rivo-x-data rivo-x-text=\"$store.customer.first_name\"\u003e\u003c\/span\u003e, you have \u003cstrong\u003e\u003cspan rivo-x-data rivo-x-text=\"$store.customer.points_tally\"\u003e\u003c\/span\u003e\u003c\/strong\u003e Points","loyalty_page_explainer_step_1_subtitle":"Create an account on our store","loyalty_page_explainer_step_2_subtitle":"Earn points for shopping","loyalty_page_explainer_step_3_subtitle":"Redeem points for discounts","loyalty_page_vip_tiers_logged_in_title":"VIP Tiers","membership_recurring_signup_past_tense":"Recurring Credit","loyalty_page_activity_table_header_date":"Date","loyalty_page_activity_table_no_activity":"No activity yet","loyalty_page_explainer_logged_out_title":"How it Works","loyalty_page_vip_tiers_logged_out_title":"VIP Tiers","account_dashboard_member_card_body_title":"You have \u003cstrong\u003e\u003cspan rivo-x-data rivo-x-text=\"$store.customer.pretty_points_tally\"\u003e\u003c\/span\u003e\u003c\/strong\u003e Points","checkout_ui_redeem_points_alternate_name":"points","checkout_ui_redeemed_rewards_description":"Your rewards available to use","checkout_ui_redeemed_rewards_login_title":"Log in","checkout_ui_refer_friends_referral_title":"Refer a Friend","general_celebrate_anniversary_past_tense":"Celebrated Loyalty Anniversary","loyalty_page_activity_expiration_warning":"Expiration Date: \u003cspan rivo-x-data rivo-x-text=\"$store.customer.points_expiry\"\u003e\u003c\/span\u003e","loyalty_page_customer_birthday_save_date":"Save Date","referrals_create_account_to_claim_coupon":"Create an Account to claim your coupon","account_dashboard_referral_block_subtitle":"Give your friends a reward and claim your own when they make a purchase","checkout_ui_redeemed_rewards_select_label":"Select a Reward","loyalty_page_activity_table_header_action":"Activity","loyalty_page_banner_logged_in_description":"As a member, you will earn points for shopping","loyalty_page_explainer_logged_in_subtitle":"Here's an overview of your current points balance and recent activity","loyalty_page_vip_tiers_logged_in_subtitle":"You are on the \u003cspan rivo-x-data rivo-x-text=\"$store.customer?.current_vip_tier_info?.tier?.name\"\u003e\u003c\/span\u003e tier","account_dashboard_member_card_header_title":"Welcome \u003cspan rivo-x-data rivo-x-text=\"$store.customer?.first_name\"\u003e\u003c\/span\u003e","account_dashboard_vip_tiers_progress_t
472itle":"VIP Tier Status","general_converted_to_credits_external_note":"Converted your points balance to store credit","general_converted_to_credits_internal_note":"Converted from points to store credit","loyalty_page_banner_logged_out_description":"Join for free and begin earning points \u0026 rewards every time you shop.","loyalty_page_vip_tiers_logged_out_subtitle":"Join our VIP loyalty program to unlock exclusive rewards available only to members.","account_dashboard_member_card_body_subtitle":"You're on the \u003cspan rivo-x-data rivo-x-text=\"$store.customer?.current_vip_tier_info?.tier?.name\"\u003e\u003c\/span\u003e tier","account_dashboard_referral_block_share_html":"\u003ca href=\"\/pages\/refer-a-friend\"\u003eEmail your link to friends\u003c\/a\u003e or \u003ca href=\"\/pages\/refer-a-friend?popup_panel=email_stats\"\u003eget your stats\u003c\/a\u003e","checkout_ui_refer_friends_login_description":"Log in or register to activate your loyalty account, redeem your points and access your special offers.","loyalty_page_activity_table_header_earnings":"Points","membership_recurring_anniversary_past_tense":"Membership Anniversary Credits","account_dashboard_unused_rewards_block_title":"Use your rewards","checkout_ui_redeem_incremental_earnings_desc":"How much of your ${{balance}} in balance would you like to redeem?","checkout_ui_refer_friends_login_button_title":"Activate my account","general_order_placed_store_credit_multiplier":"Earn cash back for every $1 spent","loyalty_page_vip_tiers_progress_column_title":"Tier Status","referrals_email_your_friend_has_referred_you":"Your friend has referred you to {{shop_name}}","account_dashboard_vip_tiers_progress_subtitle":"Earn \u003cspan rivo-x-data rivo-x-text=\"$store.customer?.current_vip_tier_info?.next_tier?.formatted_to_spend_or_earn\"\u003e\u003c\/span\u003e points to reach the \u003cspan rivo-x-data rivo-x-text=\"$store.customer?.current_vip_tier_info?.next_tier?.name\"\u003e\u003c\/span\u003e tier.","checkout_ui_redeem_incremental_earnings_login":"Log in","checkout_ui_redeem_incremental_earnings_title":"Redeem store balance","referrals_email_checkout_out_and_claim_reward":"Check out the referral link and claim a free reward.","account_dashboard_rewards_progress_block_title":"Earn more rewards","checkout_ui_redeem_points_select_discount_desc":"Please select a discount","checkout_ui_redeemed_rewards_login_description":"to view your rewards available to use.","checkout_ui_refer_friends_referral_description":"Share your referral link with friends and earn rewards each time a new friend makes a purchase.","account_dashboard_unused_rewards_block_subtitle":"Use your previously redeemed rewards:","checkout_ui_redeem_points_select_discount_label":"Select Discount","checkout_ui_redeemed_rewards_select_description":"Please select a reward","checkout_ui_refer_friends_referral_button_title":"Refer a Friend","loyalty_page_vip_tiers_progress_column_subtitle":"Earn \u003cspan rivo-x-data rivo-x-text=\"$store.customer?.current_vip_tier_info?.next_tier?.formatted_to_spend_or_earn\"\u003e\u003c\/span\u003e points to reach the \u003cspan rivo-x-data rivo-x-text=\"$store.customer?.current_vip_tier_info?.next_tier?.name\"\u003e\u003c\/span\u003e tier.","account_dashboard_unused_rewards_block_date_text":"Redeemed on: {{date}}","account_dashboard_referral_block_copy_button_text":"Copy","account_dashboard_rewards_progress_block_subtitle":"Earn another \u003cspan rivo-x-data rivo-x-text=\"$store.customer.pretty_points_amount_to_next_reward\"\u003e\u003c\/span\u003e points to unlock a \u003cspan rivo-x-data rivo-x-text=\"$store.customer.next_reward?.name\"\u003e\u003c\/span\u003e reward\u003c\/p\u003e","account_dashboard_unused_rewards_block_no_rewards":"No rewards yet","checkout_ui_redeem_incremental_earnings_login_desc":"to view your balance.","checkout_ui_refer_friends_referral_text_field_label":"Your referral link","account_dashboard_vip_tiers_progress_completed_subtitle":"Congrats! You've reached the highest tier.","checkout_ui_redeem_incremental_earnings_form_input_label":"Earnings amount","checkout_ui_redeem_incremental_discount_code_change_error":"{{code}} couldn't be used with your existing discounts.","checkout_ui_redeem_incremental_earnings_form_submit_button":"Redeem","account_dashboard_rewards_progress_block_completed_subtitle":"Keep earning points to unlock more rewards"},"widget_css":"#baLoySectionWrapper .ba-loy-bg-color {\n background: linear-gradient(125deg, hsla(237,97%,5
4727%,1), hsla(237,100%,41%,1));\n}\n\n#baLoySectionWrapper .section-panel-wrapper {\n box-shadow:rgba(0, 0, 0, 0.1) 0px 4px 15px 0px, rgba(0, 0, 0, 0.1) 0px 1px 2px 0px, #2932fc 0px 2px 0px 0px inset;\n}\n\n\n\n\n.header-main, .header-secondary, .points-expiry-desc {\n\tcolor: #fff !important;\n}\n.main-default a.sign-in{\n color: #2932fc !important;\n}\n\n.section-table-piece-detail-items .li-img path {\n fill: #3a3a3a;\n}\n\n.buttons-icons-detail-image .li-img {\n fill: #3a3a3a;\n}\n\n#baLoySectionWrapper .loy-button-main{\n background: #2932fc;\n color: #fff;\n}\n\n #baLoySectionWrapper .loy-button-main{\n color: #fff;\n }\n\n #baLoySectionWrapper .main-default, #baLoySectionWrapper div.panel-section .head-title,#baLoySectionWrapper body {\n color: #212b36;\n }\n\n #baLoySectionWrapper .section-panel-wrapper .panel-desc, #baLoySectionWrapper .main-default.sign-in-text{\n color: #737376;\n }\n\n #launcher-wrapper{\n background: #286ef8;\n }\n\n\n.ba-loy-namespace .ba-loy-messenger-frame, #launcher-wrapper{\n right: 20px;\n left: auto;\n}\n.ba-loy-namespace .ba-loy-messenger-frame {\n bottom: 90px;\n}\n#launcher-wrapper{\n bottom: 20px;\n}\n\n.launcher-text{\n color: #ffffff !important;\n}\n\n#launcher-wrapper .launcher-desktop { display: block; }\n#launcher-wrapper .launcher-mobile { display: none; }\n\n@media (max-device-width: 851px) and (orientation: landscape), (max-width: 500px) {\n .ba-loy-namespace .ba-loy-messenger-frame{\n height: 100%;\n min-height: 100%;\n bottom: 0;\n right: 0;\n left: 0;\n top: 0;\n width: 100%;\n border-radius: 0 !important;\n }\n #launcher-wrapper.up{\n display: none;\n }\n #launcher-wrapper{\n right: 20px;\n left: auto;\n bottom: 20px;\n }\n #launcher-wrapper .launcher-desktop { display: none; }\n #launcher-wrapper .launcher-mobile { display: block; }\n}\n\n\n\n.ba-loy-circle{border-radius: 30px !important;}\n.ba-loy-rounded{border-radius: 10px !important;}\n.ba-loy-square{border-radius: 0px !important;}\n","custom_css":null,"ways_to_earn":[],"points_rewards":[{"id":178201,"name":"⬠5 off coupon","enabled":true,"points_amount":500,"points_type":"fixed","reward_type":"fixed_amount","source":"points","pretty_display_rewards":"⬠5 off coupon (500 points required)","icon_url":null,"pretty_points_amount":"500","terms_of_service":{"reward_type":"fixed_amount","applies_to":"entire","show_tos":false},"pretty_terms_of_service":""},{"id":178202,"name":"⬠10 off coupon","enabled":true,"points_amount":1000,"points_type":"fixed","reward_type":"fixed_amount","source":"points","pretty_display_rewards":"⬠10 off coupon (1,000 points required)","icon_url":null,"pretty_points_amount":"1,000","terms_of_service":{"reward_type":"fixed_amount","applies_to":"entire","show_tos":false},"pretty_terms_of_service":""},{"id":178203,"name":"⬠20 off coupon","enabled":true,"points_amount":2000,"points_type":"fixed","reward_type":"fixed_amount","source":"points","pretty_display_rewards":"⬠20 off coupon (2,000 points required)","icon_url":null,"pretty_points_amount":"2,000","terms_of_service":{"reward_type":"fixed_amount","applies_to":"entire","show_tos":false},"pretty_terms_of_service":""}],"rewards":[{"id":178201,"name":"⬠5 off coupon","enabled":true,"points_amount":500,"points_type":"fixed","reward_type":"fixed_amount","source":"points","pretty_display_rewards":"⬠5 off coupon (500 points required)","icon_url":null,"pretty_points_amount":"500","terms_of_service":{"reward_type":"fixed_amount","applies_to":"entire","show_tos":false},"pretty_terms_of_service":""},{"id":178202,"name":"⬠10 off coupon","enabled":true,"points_amount":1000,"points_type":"fixed","reward_type":"fixed_amount","source":"points","pretty_display_rewards":"⬠10 off coupon (1,000 points required)","icon_url":null,"pretty_points_amount":"1,000","terms_of_service":{"reward_type":"fixed_amount","applies_to":"entire","show_tos":false},"pretty_terms_of_service":""},{"id":178203,"name":"⬠20 off coupon","enabled":true,"points_amount":2000,"points_type":"fixed","reward_type":"fixed_amount","source":"points","pretty_display_rewards":"⬠20 off coupon (2,000 points required)","icon_url":null,"pretty_points_amount":"2,000","terms_of_service":{"reward_type":"fixed_amount","applies_to":"entire","show_tos":false},"pretty_terms_of_service":""}],"widget_custom_icons":{"brand_icon":null,"rewards":null,"ways_to_earn":null,"ways_to_redeem":null},"referral_rewards":{"referrer_reward":{"id":178204,"name":"⬠5 off coupon","reward_type":"fixed_amount","properties":{"applies_to":"entire"}},"referred_reward":{"id":178205,"name":"⬠5 off coupon","reward_type":"fixed_amount","properties":{"applies_to":"entire"}}},"referral_settings":{"referrals_landing_path":null},"referral_social_settings":{"sms":false,"email":false,"twitter":true,"facebook":true,"whatsapp":false,"share_order":["email","sms","twitter","facebook","whatsapp","link"],"sms_message":"","twitter_message":"","whatsapp_message":""},"referrals_customer_account_required":false,"friend_discounts_disabled":false,"vip_tiers":[],"account_embed_widget_settings":{"enabled":false,"custom_css":null,"custom_link":null,"target_page":null,"custom_placement":null,"custom_insert_method":null},"loyalty_landing_page_settings":{"enabled":false,"vip_tiers_table_data":[]},"account_dashboard_settings":{},"forms":[],"points_expiry_enabled":false,"frontend":{},"referral_campaigns":[],"paid_membership_settings":{"name":null,"page_title":"Membership","product_id":null,"segment_id":null,"variant_id":null,"landing_path":"\/","credits_enabled":false,"product_enabled":false,"selling_plan_id":null,"billing_interval":"month","cancellation_policy":"immediate","free_shipping_enabled":true,"page_guest_description":"Join our membership program to get access to exclusive discounts, offers, and more!","page_member_description":"You're getting access to exclusive discounts, offers, and more!","custom_dashboard_enabled":false,"exclusive_access_enabled":true,"priority_support_enabled":true,"landing_path_redirect_enabled":true,"landing_settings":{"faq_items":[],"faq_title_text":"FAQ","sections_order":["hero","member_details","member_activity","benefits","faq"],"tab_font_color":"inherit","hero_title_text":"Membership","benefits_title_text":"Benefits","faq_section_enabled":true,"custom_frame_enabled":false,"faq_description_text":"Here are some frequently asked questions","hero_section_enabled":true,"hero_description_text":"You're getting access to exclusive discounts, offers, and more!","main_background_color":"inherit","custom_sidebar_enabled":false,"faq_section_font_color":"inherit","benefits_section_enabled":true,"member_card_logo_enabled":false,"benefits_description_text":"Here's what you get with your membership","benefits_section_font_color":"inherit","faq_section_background_color":"inherit","member_details_section_enabled":true,"member_activity_section_enabled":true,"benefits_section_background_color":"inherit"}},"checkout_ui_settings":{"global_show_login_enabled":false,"global_show_login_header_enabled":false,"redeem_incremental_earnings_show_login_enabled":false,"redeem_incremental_earnings_balance_to_currency":false,"redeemed_rewards_hide_selections_when_no_options":false,"redeem_points_hide_selections_unless_discount_exists":false,"redeemed_rewards_hide_selections_when_discount_applied":false,"redeem_incremental_earnings_input_amount_stepper_enabled":false,"redeem_incremental_earnings_hide_redeem_when_discount_exists":false,"redeem_incremental_earnings_hide_redeem_unless_minimum_order_value_is_met":false},"membership_tiers":[],"credit_mode":false,"active_bonus_campaign":null,"js_api_config":{"emit_points_balances_on_load":false},"auto_login":{"enabled":false,"email_provider":"kl","email_identifier":"utm_klaviyo_profile_id"},"account_widget_settings":{"enabled":false,"cards_shape":"rounded","inputs_shape":"rounded","buttons_shape":"rounded","primary_color":"#20124d","home_cta_1_url":"\/pages\/loyalty-program","launcher_shape":"circle","container_shape":"rounded","home_cta_1_text":"View Rewards","home_cta_2_text":"Manage Subscriptions","show_powered_by":false,"desktop_placement":"left","email_placeholder":"Enter your email","login_button_text":"Get Sign In Code","login_issues_link":"\/account\/login","login_issues_text":"Click here to sign in with your password if you are having issues","verify_title_text":"Enter the code we just sent to [[email]]","home_cta_1_enabled":true,"home_cta_2_enabled":true,"home_cta_3_enabled":false,"latest_order_title":"Latest Order","profile_list_links":[],"reload_after_login":false,"verify_button_text":"Verify Code","mobile_side_spacing":20,"popular_today_title":"Popular Today","slideout_icon_color":"#303030","desktop_side_spacing":20,"home_logged_in_title":"Welcome \u003cspan rivo-ax-text='$store.rivo_profile_customer?.first_name'\u003e\u003c\/span\u003e","profile_log_out_text":"Log out","home_logged_out_title":"Sign in to your account","mobile_bottom_spacing":20,"order_returns_enabled":false,"popular_today_enabled":true,"recently_viewed_title":"Recently Viewed","replace_account_links":true,"slideout_border_color":"#E0E0E0","custom_sub_cta_enabled":false,"desktop_bottom_spacing":20,"order_tracking_partner":"shopify","orders_logged_in_title":"Your Orders","product_rating_enabled":false,"slideout_subdued_color":"#F7F7F7","home_logged_in_subtitle":"You have \u003cspan rivo-ax-text='$store.rivo_profile_customer?.pretty_points_tally'\u003e\u003c\/span\u003e points","order_buy_again_enabled":false,"orders_empty_state_text":"You haven't placed any orders yet","orders_logged_out_title":"Log in to view, track, and manage your orders","recently_viewed_enabled":true,"home_logged_out_subtitle":"Get access to your rewards, referrals, and more","verify_login_
472issues_link":"\/#rivo","verify_login_issues_text":"Having issues? Click here to try again.","home_cta_1_primary_button":true,"home_cta_2_primary_button":false,"home_cta_3_primary_button":false,"order_returns_button_text":"Start a Return","slideout_background_color":"#FFFFFF","order_tracking_button_text":"Track Shipment","primary_button_class_names":"button button--primary","order_buy_again_button_text":"Buy Again","profile_list_contact_us_url":"#","slideout_heading_font_color":"#303030","login_accepts_marketing_text":"Email me with updates and offers","order_track_shipment_enabled":true,"profile_list_contact_us_text":"Contact Us","secondary_button_class_names":"button button--secondary","add_to_cart_notification_text":"Added to cart","featured_home_content_enabled":false,"address_saved_notification_text":"Address saved","login_accepts_marketing_default":true,"login_accepts_marketing_enabled":true,"profile_list_contact_us_enabled":true,"profile_list_personal_info_text":"Personal Information","orders_additional_button_enabled":false,"product_compare_at_price_enabled":true,"recently_viewed_empty_state_text":"No recently viewed products","slideout_body_primary_font_color":"#303030","profile_updated_notification_text":"Profile updated","shipping_address_empty_state_text":"You haven't added any shipping addresses yet","slideout_body_secondary_font_color":"#707070","order_returns_button_primary_button":false,"order_tracking_button_primary_button":true,"profile_list_shipping_addresses_text":"Shipping Addresses","order_buy_again_button_primary_button":false,"orders_additional_button_primary_button":false,"favorites_enabled":false,"favorites_title":"Favorites","favorites_empty_state_text":"No favorited products"},"persisted_login_enabled":false}; 473 window.Rivo.loy_config.api_endpoint = "/apps/ba-loy"; 474 window.Rivo.loy_config.domain_name = "loyalty.rivo.io"; 475 476 477 478 479</script>
479 480 481
482<script type="text/javascript"> 483 484 485 //Global snippet for Rivo 486 //this is updated automatically - do not edit manually. 487 488 function loadScript(src, defer, done) { 489 var js = document.createElement('script'); 490 js.src = src; 491 js.defer = defer; 492 js.onload = function(){done();}; 493 js.onerror = function(){ 494 done(new Error('Failed to load script ' + src)); 495 }; 496 document.head.appendChild(js); 497 } 498 499 function browserSupportsAllFeatures() { 500 return window.Promise && window.fetch && window.Symbol; 501 } 502 503 if (browserSupportsAllFeatures()) { 504 main(); 505 } else { 506 loadScript('https://polyfill-fastly.net/v3/polyfill.min.js?features=Promise,fetch', true, main); 507 } 508 509 function loadAppScripts(){ 510 if (window.Rivo.global_config.aat.includes("loy")){ 511 loadScript(window.Rivo.global_config.asset_urls.loy.init_js, true, function(){}); 512 } 513 514 if (window.Rivo.global_config.aat.includes("rev")){ 515 loadScript(window.Rivo.global_config.asset_urls.rev.init_js, true, function(){}); 516 } 517 518 if (window.Rivo.global_config.aat.includes("pu")){ 519 loadScript(window.Rivo.global_config.asset_urls.pu.init_js, true, function(){}); 520 } 521 522 if (window.Rivo.global_config.aat.includes("pop") || window.Rivo.global_config.aat.includes("pu")){ 523 loadScript(window.Rivo.global_config.asset_urls.widgets.init_js, true, function(){}); 524 } 525 } 526 527 function main(err) { 528 loadScript(window.Rivo.global_config.asset_urls.global.helper_js, false, loadAppScripts); 529 } 530</script>
530 531 532<!-- BEGIN app block: shopify://apps/complianz-consent/blocks/bc-block/e49729f0-d37d-4e24-ac65-e0e2f472ac27 --> 533 534 535 536<link id='complianz-css' rel="stylesheet" href=https://cdn.shopify.com/extensions/019ff089-9ce4-7f60-9df7-212f05df0e73/complianz-gdpr-cookie-consent-88/assets/complainz.css media="print" onload="this.media='all'"> 537 <style> 538 #iubenda-iframe.iubenda-iframe-branded > div.purposes-header, 539 #iubenda-iframe.iubenda-iframe-branded > div.iub-cmp-header, 540 #purposes-container > div.purposes-header, 541 #iubenda-cs-banner .iubenda-cs-brand { 542 background-color: #ffffff !important; 543 color: #000000!important; 544 } 545 #iubenda-iframe.iubenda-iframe-branded .purposes-header .iub-btn-cp , 546 #iubenda-iframe.iubenda-iframe-branded .purposes-header .iub-btn-cp:hover, 547 #iubenda-iframe.iubenda-iframe-branded .purposes-header .iub-btn-back:hover { 548 background-color: #ffffff !important; 549 opacity: 1 !important; 550 } 551 #iubenda-cs-banner .iub-toggle .iub-toggle-label { 552 color: !important; 553 } 554 #iubenda-iframe.iubenda-iframe-branded .purposes-header .iub-btn-cp:hover, 555 #iubenda-iframe.iubenda-iframe-branded .purposes-header .iub-btn-back:hover { 556 background-color: !important; 557 color: !important; 558 } 559 #iubenda-cs-banner #iubenda-cs-title { 560 font-size: 14px !important; 561 } 562 #iubenda-cs-banner .iubenda-cs-content, 563 #iubenda-cs-title, 564 .iub-toggle-checkbox.granular-control-checkbox span { 565 background-color: #ffffff !important; 566 color: #000000 !important; 567 font-size: 14px !important; 568 } 569 #iubenda-cs-banner .iubenda-cs-close-btn { 570 font-size: 14px !important; 571 background-color: #ffffff !important; 572 } 573 #iubenda-cs-banner .iubenda-cs-opt-group { 574 color: #ffffff !important; 575 } 576 #iubenda-cs-banner .iubenda-cs-opt-group button, 577 .iubenda-alert button.iubenda-button-cancel { 578 background-color: #fbd3cc!important; 579 color: #000000!important; 580 } 581 #iubenda-cs-banner .iubenda-cs-opt-group button.iubenda-cs-accept-btn, 582 #iubenda-cs-banner .iubenda-cs-opt-group button.iubenda-cs-btn-primary, 583 .iubenda-alert button.iubenda-button-confirm { 584 background-color: #fbd3cc !important; 585 color: #000000 !important; 586 } 587 #iubenda-cs-banner .iubenda-cs-opt-group button.iubenda-cs-reject-btn { 588 background-color: #fbd3cc!important; 589 color: #000000!important; 590 } 591 592 #iubenda-cs-banner .iubenda-banner-content button { 593 cursor: pointer !important; 594 color: currentColor !important; 595 text-decoration: underline !important; 596 border: none !important; 597 background-color: transparent !important; 598 font-size: 100% !important; 599 padding: 0 !important; 600 } 601 602 #iubenda-cs-banner .iubenda-cs-opt-group button { 603 border-radius: 4px !important; 604 padding-block: 10px !important; 605 } 606 607 div#iubenda-iframe-content div.purposes-checkbox input[type="checkbox"] { 608 display: block !important; 609 } 610 611 @media (min-width: 640px) { 612 #iubenda-cs-banner.iubenda-cs-default-floating:not(.iubenda-cs-top):not(.iubenda-cs-center) .iubenda-cs-container, #iubenda-cs-banner.iubenda-cs-default-floating:not(.iubenda-cs-bottom):not(.iubenda-cs-center) .iubenda-cs-container, #iubenda-cs-banner.iubenda-cs-default-floating.iubenda-cs-center:not(.iubenda-cs-top):not(.iubenda-cs-bottom) .iubenda-cs-container { 613 width: 560px !important; 614 } 615 #iubenda-cs-banner.iubenda-cs-default-floating:not(.iubenda-cs-top):not(.iubenda-cs-center) .iubenda-cs-opt-group, #iubenda-cs-banner.iubenda-cs-default-floating:not(.iubenda-cs-bottom):not(.iubenda-cs-center) .iubenda-cs-opt-group, #iubenda-cs-banner.iubenda-cs-default-floating.iubenda-cs-center:not(.iubend
615a-cs-top):not(.iubenda-cs-bottom) .iubenda-cs-opt-group { 616 flex-direction: row !important; 617 } 618 #iubenda-cs-banner .iubenda-cs-opt-group button:not(:last-of-type), 619 #iubenda-cs-banner .iubenda-cs-opt-group button { 620 margin-right: 4px !important; 621 } 622 #iubenda-cs-banner .iubenda-cs-container .iubenda-cs-brand { 623 position: absolute !important; 624 inset-block-start: 6px; 625 } 626 } 627 #iubenda-cs-banner.iubenda-cs-default-floating:not(.iubenda-cs-top):not(.iubenda-cs-center) .iubenda-cs-opt-group > div, #iubenda-cs-banner.iubenda-cs-default-floating:not(.iubenda-cs-bottom):not(.iubenda-cs-center) .iubenda-cs-opt-group > div, #iubenda-cs-banner.iubenda-cs-default-floating.iubenda-cs-center:not(.iubenda-cs-top):not(.iubenda-cs-bottom) .iubenda-cs-opt-group > div { 628 flex-direction: row-reverse; 629 width: 100% !important; 630 } 631 632 .iubenda-cs-brand-badge-outer, .iubenda-cs-brand-badge, #iubenda-cs-banner.iubenda-cs-default-floating.iubenda-cs-bottom .iubenda-cs-brand-badge-outer, 633 #iubenda-cs-banner.iubenda-cs-default.iubenda-cs-bottom .iubenda-cs-brand-badge-outer, 634 #iubenda-cs-banner.iubenda-cs-default:not(.iubenda-cs-left) .iubenda-cs-brand-badge-outer, 635 #iubenda-cs-banner.iubenda-cs-default-floating:not(.iubenda-cs-left) .iubenda-cs-brand-badge-outer { 636 display: none !important 637 } 638 639 #iubenda-cs-banner:not(.iubenda-cs-top):not(.iubenda-cs-bottom) .iubenda-cs-container.iubenda-cs-themed { 640 flex-direction: row !important; 641 } 642 643 #iubenda-cs-banner #iubenda-cs-title, 644 #iubenda-cs-banner #iubenda-cs-custom-title { 645 justify-self: center !important; 646 font-size: 14px !important; 647 font-family: -apple-system,sans-serif !important; 648 margin-inline: auto !important; 649 width: 55% !important; 650 text-align: center; 651 font-weight: 600; 652 visibility: unset; 653 } 654 655 @media (max-width: 640px) { 656 #iubenda-cs-banner #iubenda-cs-title, 657 #iubenda-cs-banner #iubenda-cs-custom-title { 658 display: block; 659 } 660 } 661 662 #iubenda-cs-banner .iubenda-cs-brand img { 663 max-width: 110px !important; 664 min-height: 32px !important; 665 } 666 #iubenda-cs-banner .iubenda-cs-container .iubenda-cs-brand { 667 background: none !important; 668 padding: 0px !important; 669 margin-block-start:10px !important; 670 margin-inline-start:16px !important; 671 } 672 673 #iubenda-cs-banner .iubenda-cs-opt-group button { 674 padding-inline: 4px !important; 675 } 676 677 #cookie-policy-content, 678 #privacy-policy-content { 679 min-height: 2rem; 680 transition: opacity 0.8s ease-in-out; 681 } 682 683 #cookie-policy-content.complianz-policy-content--loaded, 684 #privacy-policy-content.complianz-policy-content--loaded { 685 animation: complianz-policy-fade-in 0.7s ease-in-out both; 686 } 687 688 @keyframes complianz-policy-fade-in { 689 from { 690 opacity: 0; 691 } 692 to { 693 opacity: 1; 694 } 695 } 696 697 </style> 698 699 700 701 702 703
703<script type="text/javascript"> 704 function filterGoogleConsentModeURLs(domainsArray) { 705 const googleConsentModeComplianzURls = [ 706 // 197, # Google Tag Manager: 707 {"domain":"s.www.googletagmanager.com", "path":""}, 708 {"domain":"www.tagmanager.google.com", "path":""}, 709 {"domain":"www.googletagmanager.com", "path":""}, 710 {"domain":"googletagmanager.com", "path":""}, 711 {"domain":"tagassistant.google.com", "path":""}, 712 {"domain":"tagmanager.google.com", "path":""}, 713 714 // 2110, # Google Analytics 4: 715 {"domain":"www.analytics.google.com", "path":""}, 716 {"domain":"www.google-analytics.com", "path":""}, 717 {"domain":"ssl.google-analytics.com", "path":""}, 718 {"domain":"google-analytics.com", "path":""}, 719 {"domain":"analytics.google.com", "path":""}, 720 {"domain":"region1.google-analytics.com", "path":""}, 721 {"domain":"region1.analytics.google.com", "path":""}, 722 {"domain":"*.google-analytics.com", "path":""}, 723 {"domain":"www.googletagmanager.com", "path":"/gtag/js?id=G"}, 724 {"domain":"googletagmanager.com", "path":"/gtag/js?id=UA"}, 725 {"domain":"www.googletagmanager.com", "path":"/gtag/js?id=UA"}, 726 {"domain":"googletagmanager.com", "path":"/gtag/js?id=G"}, 727 728 // 177, # Google Ads conversion tracking: 729 {"domain":"googlesyndication.com", "path":""}, 730 {"domain":"media.admob.com", "path":""}, 731 {"domain":"gmodules.com", "path":""}, 732 {"domain":"ad.ytsa.net", "path":""}, 733 {"domain":"dartmotif.net", "path":""}, 734 {"domain":"dmtry.com", "path":""}, 735 {"domain":"go.channelintelligence.com", "path":""}, 736 {"domain":"googleusercontent.com", "path":""}, 737 {"domain":"googlevideo.com", "path":""}, 738 {"domain":"gvt1.com", "path":""}, 739 {"domain":"links.channelintelligence.com", "path":""}, 740 {"domain":"obrasilinteirojoga.com.br", "path":""}, 741 {"domain":"pcdn.tcgmsrv.net", "path":""}, 742 {"domain":"rdr.tag.channelintelligence.com", "path":""}, 743 {"domain":"static.googleadsserving.cn", "path":""}, 744 {"domain":"studioapi.doubleclick.com", "path":""}, 745 {"domain":"teracent.net", "path":""}, 746 {"domain":"ttwbs.channelintelligence.com", "path":""}, 747 {"domain":"wtb.channelintelligence.com", "path":""}, 748 {"domain":"youknowbest.com", "path":""}, 749 {"domain":"doubleclick.net", "path":""}, 750 {"domain":"redirector.gvt1.com", "path":""}, 751 752 //116, # Google Ads Remarketing 753 {"domain":"googlesyndication.com", "path":""}, 754 {"domain":"media.admob.com", "path":""}, 755 {"domain":"gmodules.com", "path":""}, 756 {"domain":"ad.ytsa.net", "path":""}, 757 {"domain":"dartmotif.net", "path":""}, 758 {"domain":"dmtry.com", "path":""}, 759 {"domain":"go.channelintelligence.com", "path":""}, 760 {"domain":"googleusercontent.com", "path":""}, 761 {"domain":"googlevideo.com", "path":""}, 762 {"domain":"gvt1.com", "path":""}, 763 {"domain":"links.channelintelligence.com", "path":""}, 764 {"domain":"obrasilinteirojoga.com.br", "path":""}, 765 {"domain":"pcdn.tcgmsrv.net", "path":""}, 766 {"domain":"rdr.tag.channelintelligence.com", "path":""}, 767 {"domain":"static.googleadsserving.cn", "path":""}, 768 {"domain":"studioapi.doubleclick.com", "path":""}, 769 {"domain":"teracent.net", "path":""}, 770 {"domain":"ttwbs.channelintelligence.com", "path":""}, 771 {"domain":"wtb.channelintelligence.com", "path":""}, 772 {"domain":"youknowbest.com", "path":""}, 773 {"domain":"doubleclick.net", "path":""}, 774 {"domain":"redirector.gvt1.com", "path":""} 775 ]; 776 777 if (!Array.isArray(domainsArray)) { 778 return []; 779 } 780 781 const blockedPairs = new Map();
782 for (const rule of googleConsentModeComplianzURls) { 783 if (!blockedPairs.has(rule.domain)) { 784 blockedPairs.set(rule.domain, new Set()); 785 } 786 blockedPairs.get(rule.domain).add(rule.path); 787 } 788 789 return domainsArray.filter(item => { 790 const paths = blockedPairs.get(item.d); 791 return !(paths && paths.has(item.p)); 792 }); 793 } 794 795 function setupAutoblockingByDomain() { 796 // autoblocking by domain 797 const autoblockByDomainArray = []; 798 const prefixID = '10000' // to not get mixed with real metis ids 799 let cmpBlockerDomains = [] 800 let cmpCmplcVendorsPurposes = {} 801 let counter = 1 802 for (const object of autoblockByDomainArray) { 803 cmpBlockerDomains.push({ 804 d: object.d, 805 p: object.path, 806 v: prefixID + counter, 807 }); 808 counter++; 809 } 810 811 counter = 1 812 for (const object of autoblockByDomainArray) { 813 cmpCmplcVendorsPurposes[prefixID + counter] = object?.p ?? '1'; 814 counter++; 815 } 816 817 Object.defineProperty(window, "cmp_iub_vendors_purposes", { 818 get() { 819 return cmpCmplcVendorsPurposes; 820 }, 821 set(value) { 822 cmpCmplcVendorsPurposes = { ...cmpCmplcVendorsPurposes, ...value }; 823 } 824 }); 825 const basicGmc = true; 826 827 828 Object.defineProperty(window, "cmp_importblockerdomains", { 829 get() { 830 if (basicGmc) { 831 return filterGoogleConsentModeURLs(cmpBlockerDomains); 832 } 833 return cmpBlockerDomains; 834 }, 835 set(value) { 836 cmpBlockerDomains = [ ...cmpBlockerDomains, ...value ]; 837 } 838 }); 839 } 840 841 function splitDomains(joinedString) { 842 if (!joinedString) { 843 return []; // empty string -> empty array 844 } 845 return joinedString.split(";"); 846 } 847 848 function setupWhitelist() { 849 let cmpBlockIgnoredDomains = []; 850 Object.defineProperty(window, "cmp_block_ignoredomains", { 851 get() { 852 return cmpBlockIgnoredDomains; 853 }, 854 set(value) { 855 cmpBlockIgnoredDomains = [ ...cmpBlockIgnoredDomains, ...value ]; 856 } 857 }); 858 // Whitelist by domain: 859 const whitelistString = ""; 860 const whitelist_array = [...splitDomains(whitelistString)]; 861 window.cmp_block_ignoredomains = whitelist_array; 862 } 863 864 function enforceRejectionRecovery() { 865 const base = (window._iub = window._iub || {}); 866 const featuresHolder = {}; 867 868 function lockFlagOn(holder) { 869 const desc = Object.getOwnPropertyDescriptor(holder, 'rejection_recovery'); 870 if (!desc) { 871 Object.defineProperty(holder, 'rejection_recovery', { 872 get() { return true; }, 873 set(_) { /* ignore */ }, 874 enumerable: true, 875 configurable: false 876 }); 877 } 878 return holder; 879 } 880 881 Object.defineProperty(base, 'csFeatures', { 882 configurable: false, 883 enumerable: true, 884 get() { 885 return featuresHolder; 886 }, 887 set(obj) { 888 if (obj && typeof obj === 'object') { 889 Object.keys(obj).forEach(k => { 890 if (k !== 'rejection_recovery') { 891 featuresHolder[k] = obj[k]; 892 } 893 }); 894 } 895 // we lock it, it won't try to redefine 896 lockFlagOn(featuresHolder); 897 } 898 }); 899 900 // Ensure an object is exposed even if read early 901 if (!('csFeatures' in base)) { 902 base.csFeatures = {}; 903 } else { 904 // If someone already set it synchronously, merge and lock now. 905 base.csFeatures = base.csFeatures; 906 } 907 } 908 window._iub = window?._iub || []; 909 const _iub = window._iub; 910 enforceRejectionRecovery(); 911 setupAutoblockingByDomain(); 912 setupWhitelist(); 913 914 let currentLang = "en"; 915 if (currentLang === 'pt-PT') { 916 currentLang = 'pt'; 917 } 918 let fallbackLang = "en"; 919 if (fallbackLang === 'pt-PT') { 920 fallbackLang = 'pt'; 921 } 922 const cookiePolicyIds = {"en":85163624}; 923 _iub.csConfiguration = { 924 ..._iub.csConfiguration, 925 cookiePolicyId: cookiePolicyIds[currentLang] ?? cookiePolicyIds[fallbackLang], 926 cmpId: { tcf: 332 }, 927 }; 928 </script>
928 929 930 931
931<script src="https://cs.iubenda.com/autoblocking/4387159.js"></script>
931 932 933 934 935 936
936<script src="//cdn.iubenda.com/cs/gpp/stub.js"></script>
936 937 938 939
939<script type="text/javascript"> 940 function injectComplianceCss(cssText) { 941 const existing = document.querySelector('style[data-compliance-custom="true"]'); 942 if (existing) existing.remove(); 943 944 const style = document.createElement('style'); 945 style.setAttribute('data-compliance-custom', 'true'); 946 style.appendChild(document.createTextNode(cssText)); 947 document.body.appendChild(style); 948 } 949 950 window.addEventListener('DOMContentLoaded', () => { 951 const css = "\n\/* Note: use !important to override the default styles *\/\n\/* =========================\n FIRST LAYER (Banner)\n ========================= *\/\n\/* banner content *\/\n#iubenda-cs-banner .iubenda-cs-content {\n}\n\/* privacy policy link *\/\n#iubenda-cs-title {\n}\n\/* main paragraph *\/\n#iubenda-cs-paragraph.iubenda-cs-small-margin-top {\n}\n\/* privacy policy link *\/\n#iubenda-cs-banner .iubenda-cs-cookie-policy-lnk {\n}\n\n\/* button (accept) *\/\n#iubenda-cs-banner .iubenda-cs-opt-group button.iubenda-cs-accept-btn {\n}
951\n\n\/* button (reject) *\/\n#iubenda-cs-banner .iubenda-cs-opt-group button.iubenda-cs-reject-btn {\n}\n\n\/* button (view preference) *\/\n#iubenda-cs-banner .iubenda-cs-opt-group button {\n}\n\n\/* =========================\n SECOND LAYER (Preferences Modal)\n ========================= *\/\n\n\/* modal header *\/\n#iubenda-iframe-content #purposes-container .purposes-header {\n}\n\/* header button *\/\n#iubenda-iframe-content #purposes-container .purposes-header .purposes-header-right .iub-btn-cp {\n}\n\n\/* modal main section *\/\n#iubenda-iframe-content #purposes-content-container .purposes-content {\n}\n\/* consent buttons *\/\n#iubenda-iframe-content .purposes-content .iub-consent-buttons {\n}\n\/* consent buttons hover *\/\n#iubenda-iframe-content .purposes-content .iub-btn:hover {\n}\n\/* consent sections *\/\n#purposes-content-container div.purposes-section-body, #purposes-content-container .purposes-item div.purposes-item-header { \n}\n\n\/* modal footer*\/\n#iubenda-iframe-content .iubenda-iframe-footer {\n}
951\n\/* save and continue button *\/\n#iubenda-iframe-content #iubFooterBtnContainer button {\n}\n"; 952 injectComplianceCss(css); 953 }); 954 function loadScript(src) { 955 return new Promise((resolve, reject) => { 956 const s = document.createElement("script"); 957 s.src = src; 958 s.charset = "UTF-8"; 959 s.onload = resolve; 960 s.onerror = reject; 961 document.head.appendChild(s); 962 }); 963 } 964 965 966 let policyContentListenerRegistered = false; 967 968 window.IubEventsTrackRecord = window.IubEventsTrackRecord || { 969 iubLoaded: false, 970 domContentLoaded: false, 971 }; 972 973 function initIubenda() { 974 const currentCsConfiguration = {"siteId":4387159,"cookiePolicyIds":{"en":85163624},"banner":{"acceptButtonDisplay":true,"rejectButtonDisplay":true,"customizeButtonDisplay":true,"position":"float-center","backgroundOverlay":true,"fontSize":"14px","content":"","title":"","hideTitle":false,"acceptButtonCaption":"","rejectButtonCaption":"","customizeButtonCaption":"","cookiePolicyLinkCaption":"","privacyWidget":true,"privacyWidgetPosition":"bottom-right","customCss":"\n\/* Note: use !important to override the default styles *\/\n\/* =========================\n FIRST LAYER (Banner)\n ========================= *\/\n\/* banner content *\/\n#iubend
974a-cs-banner .iubenda-cs-content {\n}\n\/* privacy policy link *\/\n#iubenda-cs-title {\n}\n\/* main paragraph *\/\n#iubenda-cs-paragraph.iubenda-cs-small-margin-top {\n}\n\/* privacy policy link *\/\n#iubenda-cs-banner .iubenda-cs-cookie-policy-lnk {\n}\n\n\/* button (accept) *\/\n#iubenda-cs-banner .iubenda-cs-opt-group button.iubenda-cs-accept-btn {\n}\n\n\/* button (reject) *\/\n#iubenda-cs-banner .iubenda-cs-opt-group button.iubenda-cs-reject-btn {\n}\n\n\/* button (view preference) *\/\n#iubenda-cs-banner .iubenda-cs-opt-group button {\n}\n\n\/* =========================\n SECOND LAYER (Preferences Modal)\n ========================= *\/\n\n\/* modal header *\/\n#iubenda-iframe-content #purposes-container .purposes-header {\n}\n\/* header button *\/\n#iubenda-iframe-content #purposes-container .purposes-header .purposes-header-right .iub-btn-cp {\n}\n\n\/* modal main section *\/\n#iubenda-iframe-content #purposes-content-container .purposes-content {\n}\n\/* consent buttons *\/\n#iubenda-iframe-content .purposes-content .iub-consent-buttons {\n}
974\n\/* consent buttons hover *\/\n#iubenda-iframe-content .purposes-content .iub-btn:hover {\n}\n\/* consent sections *\/\n#purposes-content-container div.purposes-section-body, #purposes-content-container .purposes-item div.purposes-item-header { \n}\n\n\/* modal footer*\/\n#iubenda-iframe-content .iubenda-iframe-footer {\n}\n\/* save and continue button *\/\n#iubenda-iframe-content #iubFooterBtnContainer button {\n}\n","backgroundColor":"#ffffff","textColor":"#000000","acceptButtonColor":"#fbd3cc","acceptButtonCaptionColor":"#000000","rejectButtonColor":"#fbd3cc","rejectButtonCaptionColor":"#000000","customizeButtonColor":"#fbd3cc","customizeButtonCaptionColor":"#000000","applyStyles":"false"},"privacyWidget":true}; 975 const preview_config = {"format_and_position":{"has_background_overlay":true,"position":"float-center"},"text":{"fontsize":"14px","content":{"title":{"en":"COOKIES HORROR-VACUI.COM"},"hideTitle":false,"main":"","accept":"","reject":"","learnMore":"","cp_caption":""}},"theme":{"setting_type":2,"standard":{"subtype":"light"},"color":{"selected_color":"Mint","selected_color_style":"neutral"},"custom":{"main":{"background":"#ffffff","text":"#000000"},"acceptButton":{"background":"#fbd3cc","text":"#000000"},"rejectButton":{"background":"#fbd3cc","text":"#000000"},"learnMoreButton":{"background":"#fbd3cc","text":"#000000"}},"logo":{"type":0,"add_from_url":{"url":"","brand_header_color":"#000000","brand_text_color":"#ffffff"},"upload":{"src":"","brand_header_color":"#ffffff","brand_text_color":"#000000"}}},"privacyWidget":true,"privacyWidgetPosition":"bottom-right","cookiePolicyPageUrl":"\/pages\/cookie-policy","privacyPolicyPageUrl":"\/policies\/privacy-policy","customCss":"\n\/* Note: use !important to override the default styles *\/\n\/* =========================\n FIRST LAYER (Banner)\n ========================= *\/\n\/* banner content *\/\n#iubend
975a-cs-banner .iubenda-cs-content {\n}\n\/* privacy policy link *\/\n#iubenda-cs-title {\n}\n\/* main paragraph *\/\n#iubenda-cs-paragraph.iubenda-cs-small-margin-top {\n}\n\/* privacy policy link *\/\n#iubenda-cs-banner .iubenda-cs-cookie-policy-lnk {\n}\n\n\/* button (accept) *\/\n#iubenda-cs-banner .iubenda-cs-opt-group button.iubenda-cs-accept-btn {\n}\n\n\/* button (reject) *\/\n#iubenda-cs-banner .iubenda-cs-opt-group button.iubenda-cs-reject-btn {\n}\n\n\/* button (view preference) *\/\n#iubenda-cs-banner .iubenda-cs-opt-group button {\n}\n\n\/* =========================\n SECOND LAYER (Preferences Modal)\n ========================= *\/\n\n\/* modal header *\/\n#iubenda-iframe-content #purposes-container .purposes-header {\n}\n\/* header button *\/\n#iubenda-iframe-content #purposes-container .purposes-header .purposes-header-right .iub-btn-cp {\n}\n\n\/* modal main section *\/\n#iubenda-iframe-content #purposes-content-container .purposes-content {\n}\n\/* consent buttons *\/\n#iubenda-iframe-content .purposes-content .iub-consent-buttons {\n}
975\n\/* consent buttons hover *\/\n#iubenda-iframe-content .purposes-content .iub-btn:hover {\n}\n\/* consent sections *\/\n#purposes-content-container div.purposes-section-body, #purposes-content-container .purposes-item div.purposes-item-header { \n}\n\n\/* modal footer*\/\n#iubenda-iframe-content .iubenda-iframe-footer {\n}\n\/* save and continue button *\/\n#iubenda-iframe-content #iubFooterBtnContainer button {\n}\n","primaryDomain":"https:\/\/horror-vacui.com"}; 976 const settings = {"businessLocation":"DE","targetRegions":{"EU":true,"US":true,"CA":true,"BR":true},"legislations":{"isAutomatic":true,"customLegislations":{"gdprApplies":true,"usprApplies":true,"ccpaApplies":true,"lgpdApplies":true}},"googleConsentMode":false,"microsoftConsentMode":false,"enableTcf":false,"fallbackLanguage":"en","emailNotification":true,"disableAutoBlocking":false,"enableAdvanceGCM":true}; 977 978 const supportedLangs = [ 979 'bg','ca','cs','da','de','el','en','en-GB','es','et', 980 'fi','fr','hr','hu','it','lt','lv','nl','no','pl', 981 'pt','pt-BR','ro','ru','sk','sl','sv' 982 ]; 983 984 // Build i18n map; prefer globals (e.g., window.it / window.en) if your locale files define them, 985 // otherwise fall back to Liquid-injected JSON (cleaned_*). 986 let currentLang = "en"; 987 if (currentLang === 'pt-PT') { 988 currentLang = 'pt'; 989 } 990 const fallbackLang = "en"; 991 let iub_i18n = {}; 992 993 // fallback first 994 (function attachFallback() { 995 // If your external locale file defines a global like "window[<lang>]" 996 if (typeof window[fallbackLang] !== "undefined") { 997 iub_i18n[fallbackLang] = window[fallbackLang]; 998 return; 999 } 1000 })(); 1001 1002 // then current 1003 (function attachCurrent() { 1004 if (supportedLangs.includes(currentLang)) { 1005 if (typeof window[currentLang] !== "undefined") { 1006 iub_i18n[currentLang] = window[currentLang]; 1007 return; 1008 } 1009 } 1010 })(); 1011 1012 const localeRootUrl = "/"; 1013 const normalizedLocaleRoot = localeRootUrl.startsWith('/') ? localeRootUrl : `/${localeRootUrl}`; 1014 const isPrimaryLang = normalizedLocaleRoot === '/'; 1015 1016 const hasCookiePolicyForLocale = Boolean(currentCsConfiguration?.cookiePolicyIds?.[currentLang]); 1017 const localePath = isPrimaryLang ? '' : (hasCookiePolicyForLocale ? normalizedLocaleRoot : `/${fallbackLang}`); 1018 const primaryDomain = "https://horror-vacui.com"; 1019 const cookiePolicyPageUrl = "/pages/cookie-policy"; 1020 const privacyPolicyPageUrl = "/policies/privacy-policy"; 1021 1022 const cookiePolicyId = 1023 currentCsConfiguration?.cookiePolicyIds[currentLang] ?? 1024 currentCsConfiguration?.cookiePolicyIds[fallbackLang]; 1025 1026 // ð´ IMPORTANT: make _iub global 1027 window._iub = window?._iub || []; 1028 const _iub = window._iub; 1029 1030 _iub.csConfiguration = { 1031 ..._iub.csConfiguration, 1032 ...currentCsConfiguration, 1033 cookiePolicyId, 1034 consentOnContinuedBrowsing: false, 1035 perPurposeConsent: true, 1036 countryDetection: true, 1037 enableGdpr: settings?.legislations?.customLegislations?.gdprApplies, 1038 enableUspr: settings?.legislations?.customLegislations?.usprApplies, 1039 enableCcpa: settings?.legislations?.customLegislations?.ccpaApplies, 1040 enableLgpd: settings?.legislations?.customLegislations?.lgpdApplies, 1041 googleConsentMode: settings?.googleConsentMode, 1042 uetConsentMode: settings?.microsoftConsentMode, 1043 enableTcf: settings?.enableTcf, 1044 tcfPublisherCC: settings?.businessLocation, 1045 lang: supportedLangs.includes(currentLang) ? currentLang : fallbackLang, 1046 i18n: iub_i18n, 1047 brand: 'Complianz', 1048 cookiePolicyInOtherWindow: true, 1049 cookiePolicyUrl: `${primaryDomain}${localePath}${cookiePolicyPageUrl}`, 1050 privacyPolicyUrl: `${primaryDomain}${localePath}${privacyPolicyPageUrl}`, 1051 floatingPreferencesButtonDisplay: currentCsConfiguration?.privacyWidget ? (currentCsConfiguration?.banner?.privacyWidgetPosition ?? 'bottom-right') : false, 1052 cmpId: { tcf: 332 }, 1053 callback: {}, 1054 purposes: "1, 2, 3, 4, 5", 1055 promptToAcceptOnBlockedElements: true, 1056 googleEnableAdvertiserConsentMode: settings?.googleConsentMode && settings?.enableTcf, 1057 whitelabel: true, 1058 amazonConsentSignal: settings?.amazonConsentSignal 1059 }; 1060 window._cmplc = { 1061 csConfiguration: { 1062 cookiePolicyId 1063 } 1064 } 1065 const customeContent = preview_config?.text?.content ?? {}; 1066 const titleContent = 1067 customeContent?.title?.hasOwnProperty(currentLang) ? customeContent?.title[currentLang] : 1068 customeContent?.title?.hasOwnProperty(fallbackLang) ? customeContent?.title[fallbackLang] : ''; 1069 let mainContent = 1070 customeContent?.main?.hasOwnProperty(currentLang) ? customeContent?.main[currentLang] : 1071 customeContent?.main?.hasOwnProperty(fallbackLang) ? customeContent?.main[fallbackLang] : ''; 1072 if (titleContent !== '') {
1073 mainContent = mainContent !== '' ? `<h2 id='iubenda-cs-custom-title'>${titleContent}</h2>${mainContent}` : ''; 1074 } 1075 1076 _iub.csConfiguration.banner = { 1077 ..._iub.csConfiguration.banner, 1078 content: mainContent, 1079 acceptButtonCaption: 1080 customeContent?.accept?.hasOwnProperty(currentLang) ? customeContent?.accept[currentLang] : 1081 customeContent?.accept?.hasOwnProperty(fallbackLang) ? customeContent?.accept[fallbackLang] : '', 1082 rejectButtonCaption: 1083 customeContent?.reject?.hasOwnProperty(currentLang) ? customeContent?.reject[currentLang] : 1084 customeContent?.reject?.hasOwnProperty(fallbackLang) ? customeContent?.reject[fallbackLang] : '', 1085 customizeButtonCaption: 1086 customeContent?.learnMore?.hasOwnProperty(currentLang) ? customeContent?.learnMore[currentLang] : 1087 customeContent?.learnMore?.hasOwnProperty(fallbackLang) ? customeContent?.learnMore[fallbackLang] : '', 1088 cookiePolicyLinkCaption: 1089 customeContent?.cp_caption?.hasOwnProperty(currentLang) ? customeContent?.cp_caption[currentLang] : 1090 customeContent?.cp_caption?.hasOwnProperty(fallbackLang) ? customeContent?.cp_caption[fallbackLang] : '', 1091 }; 1092 1093 var onPreferenceExpressedOrNotNeededCallback = function(prefs) { 1094 var isPrefEmpty = !prefs || Object.keys(prefs).length === 0; 1095 var consent = isPrefEmpty ? _iub.cs.api.getPreferences() : prefs; 1096 var shopifyPurposes = { 1097 "analytics": [4, 's'], 1098 "marketing": [5, 'adv'], 1099 "preferences": [2, 3], 1100 "sale_of_data": ['s', 'sh'], 1101 } 1102 var expressedConsent = {}; 1103 Object.keys(shopifyPurposes).forEach(function(purposeItem) { 1104 var purposeExpressed = null 1105 shopifyPurposes[purposeItem].forEach(item => { 1106 if (consent.purposes && typeof consent.purposes[item] === 'boolean') { 1107 purposeExpressed = consent.purposes[item]; 1108 } 1109 if (consent.uspr && typeof consent.uspr[item] === 'boolean' && purposeExpressed !== false) { 1110 purposeExpressed = consent.uspr[item]; 1111 } 1112 }) 1113 if (typeof purposeExpressed === 'boolean') { 1114 expressedConsent[purposeItem] = purposeExpressed; 1115 } 1116 }) 1117 1118 var oldConsentOfCustomer = Shopify.customerPrivacy.currentVisitorConsent(); 1119 if (oldConsentOfCustomer["sale_of_data"] !== 'no') { 1120 expressedConsent["sale_of_data"] = true; 1121 } 1122 1123 window.Shopify.customerPrivacy.setTrackingConsent(expressedConsent, function() {}); 1124 } 1125 1126 var onCcpaOptOutCallback = function () { 1127 window.Shopify.customerPrivacy.setTrackingConsent({ "sale_of_data": false }); 1128 } 1129 1130 var onReady = function () { 1131 const currentConsent = window.Shopify.customerPrivacy.currentVisitorConsent(); 1132 delete currentConsent['sale_of_data']; 1133 if (Object.values(currentConsent).some(consent => consent !== '') || !_iub.cs.state.needsConsent) { 1134 return; 1135 } 1136 window._iub.cs.api.showBanner(); 1137 } 1138 1139 _iub.csConfiguration.callback.onPreferenceExpressedOrNotNeeded = onPreferenceExpressedOrNotNeededCallback; 1140 _iub.csConfiguration.callback.onCcpaOptOut = onCcpaOptOutCallback; 1141 _iub.csConfiguration.callback.onReady = onReady; 1142 window.COMPLIANZ_CONFIGURATION_IS_SET = true; 1143 window.dispatchEvent(new CustomEvent('iub::configurationIsSet')); 1144 window.dispatchEvent(new CustomEvent('cmplc::configurationIsSet')); 1145 } 1146 1147 function isValidPolicyId(id) { 1148 if (typeof id === 'number' && !Number.isNaN(id)) { 1149 return true; 1150 } 1151 if (typeof id === 'string' && id.trim() !== '' && !Number.isNaN(Number(id))) { 1152 return true; 1153 } 1154 return false;
1155 } 1156 1157 function normalizePolicyId(id) { 1158 return typeof id === 'number' ? id : Number(id); 1159 } 1160 1161 function getPolicyContentElements() { 1162 return { 1163 cpTag: document.getElementById('cookie-policy-content'), 1164 ppTag: document.getElementById('privacy-policy-content'), 1165 }; 1166 } 1167 1168 function setPolicyContentLoading(el) { 1169 el.classList.remove('complianz-policy-content--loaded'); 1170 el.style.opacity = '0'; 1171 } 1172 1173 function revealPolicyContent(el, content) { 1174 el.innerHTML = content; 1175 el.classList.remove('complianz-policy-content--loaded'); 1176 void el.offsetWidth; 1177 el.classList.add('complianz-policy-content--loaded'); 1178 el.style.removeProperty('opacity'); 1179 el.dataset.complianzPolicyLoaded = 'true'; 1180 } 1181 1182 function markIubLoaded() { 1183 if (window.IubEventsTrackRecord.iubLoaded) { 1184 return; 1185 } 1186 window.IubEventsTrackRecord.iubLoaded = true; 1187 } 1188 1189 function markDomContentLoaded() { 1190 if (window.IubEventsTrackRecord.domContentLoaded) { 1191 return; 1192 } 1193 window.IubEventsTrackRecord.domContentLoaded = true; 1194 } 1195 1196 async function tryPopulatePolicyContent() { 1197 if (!window.IubEventsTrackRecord.iubLoaded || !window.IubEventsTrackRecord.domContentLoaded) { 1198 return; 1199 } 1200 1201 await populatePolicyContent(); 1202 } 1203 1204 async function populatePolicyContent() { 1205 const { cpTag, ppTag } = getPolicyContentElements(); 1206 const rawId = window._iub?.csConfiguration?.cookiePolicyId; 1207 1208 if (!cpTag && !ppTag) { 1209 return; 1210 } 1211 1212 if (!isValidPolicyId(rawId)) { 1213 if (cpTag) { 1214 revealPolicyContent(cpTag, 'Failed to load content.'); 1215 } 1216 if (ppTag) { 1217 revealPolicyContent(ppTag, 'Failed to load content.'); 1218 } 1219 return; 1220 } 1221 1222 const id = normalizePolicyId(rawId); 1223 1224 if (cpTag && cpTag.dataset.complianzPolicyLoaded !== 'true') { 1225 setPolicyContentLoading(cpTag); 1226 const cpUrl = 'https://www.iubenda.com/api/privacy-policy/' + id + '/cookie-policy/no-markup'; 1227 try { 1228 const response = await fetch(cpUrl); 1229 if (!response.ok) { 1230 throw new Error('HTTP ' + response.status); 1231 } 1232 const html = await response.json(); 1233 const content = html?.content ?? 'Failed to load content.'; 1234 revealPolicyContent(cpTag, content); 1235 } catch (_err) { 1236 revealPolicyContent(cpTag, 'Failed to load content.'); 1237 } 1238 } 1239 1240 if (ppTag && ppTag.dataset.complianzPolicyLoaded !== 'true') { 1241 setPolicyContentLoading(ppTag); 1242 const ppUrl = 'https://www.iubenda.com/api/privacy-policy/' + id + '/no-markup'; 1243 try { 1244 const response = await fetch(ppUrl); 1245 if (!response.ok) { 1246 throw new Error('HTTP ' + response.status); 1247 } 1248 const html = await response.json(); 1249 const content = html?.content ?? 'Failed to load content.'; 1250 revealPolicyContent(ppTag, content); 1251 } catch (_err) { 1252 revealPolicyContent(ppTag, 'Failed to load content.'); 1253 } 1254 } 1255 } 1256 1257 function registerEventListeners() { 1258 if (policyContentListenerRegistered) { 1259 return; 1260 } 1261 policyContentListenerRegistered = true; 1262 1263 window.addEventListener('iub::configurationIsSet', () => { 1264 markIubLoaded(); 1265 tryPopulatePolicyContent(); 1266 }); 1267 1268 window.addEventListener('cmplc::configurationIsSet', () => { 1269 markIubLoaded(); 1270 tryPopulatePolicyContent(); 1271 }); 1272 1273 document.addEventListener('DOMContentLoaded', () => { 1274 markDomContentLoaded(); 1275 tryPopulatePolicyContent(); 1276 }); 1277 1278 if (document.readyState !== 'loading') { 1279 markDomContentLoaded(); 1280 tryPopulatePolicyContent(); 1281 } 1282 1283 if (window.COMPLIANZ_CONFIGURATION_IS_SET) { 1284 markIubLoaded(); 1285 tryPopulatePolicyContent(); 1286 } 1287 } 1288 1289 registerEventListeners(); 1290 1291 Promise.all([ 1292 loadScript("https://cdn.shopify.com/extensions/019ff089-9ce4-7f60-9df7-212f05df0e73/complianz-gdpr-cookie-consent-88/assets/en.js"), 1293 loadScript("https://cdn.shopify.com/extensions/019ff089-9ce4-7f60-9df7-212f05df0e73/complianz-gdpr-cookie-consent-88/assets/en.js"), 1294 ]).finally(() => { 1295 initIubenda(); 1296 loadScript("https://cdn.iubenda.com/cs/iubenda_cs.js"); 1297 }); 1298 </script>
1298 1299 1300
1300<script> 1301 window.Shopify.loadFeatures( 1302 [ 1303 { 1304 name: 'consent-tracking-api', 1305 version: '0.1', 1306 }, 1307 ], 1308 function(error) { 1309 if (error) { 1310 throw error; 1311 } 1312 } 1313 ); 1314 </script>
1314 1315 1316 1317<!-- END app block -->
1317<script src="https://cdn.shopify.com/extensions/01a0d8da-dbb6-759e-90f0-31975754fa90/forms-2597/assets/shopify-forms-loader.js" type="text/javascript" defer="defer"></script>
vendor: 1 bytes, line 1317
1317
1318<script src="https://cdn.shopify.com/extensions/01a038e6-d7af-7b85-9f54-e79f35af1943/cevoid-22/assets/galleries.js" type="text/javascript" defer="defer"></script>
1318 1319<link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
1320<script>(function(){if ("sendBeacon" in navigator && "performance" in window) {try {var session_token_from_headers = performance.getEntriesByType('navigation')[0].serverTiming.find(x => x.name == '_s').description;} catch {var session_token_from_headers = undefined;}var session_cookie_matches = document.cookie.match(/_shopify_s=([^;]*)/);var session_token_from_cookie = session_cookie_matches && session_cookie_matches.length === 2 ? session_cookie_matches[1] : "";var session_token = session_token_from_headers || session_token_from_cookie || "";function handle_abandonment_event(e) {var entries = performance.getEntries().filter(function(entry) {return /monorail-edge.shopifysvc.com/.test(entry.name);});if (!window.abandonment_tracked && entries.length === 0) {window.abandonment_tracked = true;var currentMs = Date.now();var navigation_start = performance.timing.navigationStart;var payload = {shop_id: 61810966677,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token,page_type: "blog"};window.navigator.sendBeacon("https://monorail-edge.shopifysvc.com/v1/produce", JSON.stringify({schema_id: "online_store_buyer_site_abandonment/1.1",payload: payload,metadata: {event_created_at_ms: currentMs,event_sent_at_ms: currentMs}}));}}window.addEventListener('pagehide', handle_abandonment_event);}}());</script>
vendor: 1 bytes, line 1320
1320
1321<script> 1322 window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || []; 1323</script>
vendor: 1 bytes, line 1323
1323
1324<script>(function(){var wpmLoader=function(){"use strict";var e=/Googlebot|Storebot-Google|bingbot|Baiduspider|YandexBot|DuckDuckBot|Slurp|facebookexternalhit|Twitterbot|LinkedInBot|Applebot|AdsBot-Google|Mediapartners-Google|APIs-Google|PetalBot|SemrushBot|AhrefsBot|MJ12bot|DotBot|Acunetix|PerplexityBot|Perplexity-User/i,t=/bytedance/i;function i(){try{var e=document.cookie;if(!e||"string"!=typeof e)return;for(var t=0,i=e.split(";");t<i.length;t++){var n=i[t],r=n.indexOf("=");if(-1!==r){var o=n.slice(0,r).trim();if(o){var a=void 0;try{a=decodeURIComponent(o)}catch(e){a=o}if("_shopify_s"===a){var d=n.slice(r+1).trim();try{return decodeURIComponent(d)}catch(e){return d}}}}}return}catch(e){return}}function n(e){try{"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn(e)}catch(e){}}function r(e,t){return"string"==typeof e&&e.length>0&&e.length<=t?e:void 0}function o(e){var t;switch(null==(t=null==e?void 0:e.navigation)?void 0:t.type){case 0:return"navigate";case 1:return"reload";case 2:return"back_forward";default:return}}function a(){var e,t,i;try{var n=null==(i=null==(t=null==(e=self.ShopifyAnalytics)?void 0:e.lib)?void 0:t.trekkie)?void 0:i.state;return"awaiting-consent"===n||"initialized"===n?n:void 0}catch(e){return}}return function(d,s,u,l){var c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};try{var p=c.trekkieShim;!0!==p&&"true"!==p||null!=window.__TREKKIE_SHIM_QUEUE||(window.__TREKKIE_SHIM_QUEUE=[])}catch(e){}var f,v,h,y,g=(v=(f={modern:/Edge?\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Firefox\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Chrom(ium|e)\/(9{2}|\d{3,})\.\d+(\.\d+|)|(Maci|X1{2}).+ Version\/(15\.\d+|(1[6-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(9{2}|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(15[._]\d+|(1[6-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|SamsungBrowser\/([2-9]\d|\d{3,})\.\d+/,legacy:/Edge?\/(1[6-9]|[2-9]\d|\d{3,})\.\d+(\.\d+|)|Firefox\/(5[4-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)|Chrom(ium|e)\/(5[1-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)([\d.]+$|.*Safari\/(?![\d.]+ Edge\/[\d.]+$))|(Maci|X1{2}).+ Version\/(10\.\d+|(1[1-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(3[89]|[4-9]\d|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(10[._]\d+|(1[1-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Mobile Safari.+OPR\/([89]\d|\d{3,})\.\d+\.\d+|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+(UC? ?Browser|UCWEB|U3)[ /]?(15\.([5-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})\.\d+)\.\d+|SamsungBrowser\/(5\.\d+|([6-9]|\d{2,})\.\d+)|Android.+MQ{2}Browser\/(14(\.(9|\d{2,})|)|(1[5-9]|[2-9]\d|\d{3,})(\.\d+|))(\.\d+|)|K[Aa][Ii]OS\/(3\.\d+|([4-9]|\d{2,})\.\d+)(\.\d+|)/}).modern,h=f.legacy,(y=navigator.userAgent).match(e)?"bot":y.match(v)?"modern":y.match(h)?"legacy":y.match(t)?"bot":"unknown"),m=function(e){var t,i,n=r(e,128);try{var a=window.performance,d=null==(t=null==a?void 0:a.getEntriesByType)?void 0:t.call(a,"navigation")[0];if(!d)return{requestId:n,navigationType:o(a)};var s="type"in d?r(d.type,64):void 0,u="serverTiming"in d&&Array.isArray(d.serverTiming)?d.serverTiming:[];return{requestId:null!=n?n:r(null==(i=u.find(function(e){return"requestID"===e.name}))?void 0:i.description,128),navigationType:s}}catch(e){return{requestId:n}}}(c.requestId),w=function(e){var t=e.version,r=e.browserTarget,o=e.surface,a=e.shopId,d=e.monorailEndpoint,s=window.location.href;return{emit:function(e){var u=e.status,l=e.errorMsg,c=e.failureReason,p=e.useKeepaliveFallback,f=void 0!==p&&p,v=e.navigationType,h=e.pagehidePersisted,y=e.requestId,g=e.trekkieState;if(d){var m,w;try{var b=(new Date).getTime();m=JSON.stringify({metadata:{event_sent_at_ms:b},events:[{schema_id:"web_pixels_manager_load/3.3",payload:{version:t,bundle_target:r,page_url:s,status:u,surface:o,error_msg:l,failure_reason:c,navigation_type:v,pagehide_persisted:h,request_id:y,trekkie_state:g,shop_id:a,visit_token:i()},metadata:{event_created_at_ms:b}}]})}catch(e){return}try{if("function"==typeof window.navigator.sendBeacon&&-1===(w=window.navigator.userAgent).indexOf("iPhone; CPU iPhone OS 12_")&&-1===w.indexOf("iPad; CPU OS 12_")&&-1===w.indexOf("iPod touch; CPU iPhone OS 12_")&&window.navigator.sendBeacon.bind(window.navigator)(d,m))return}catch(e){}if(f)try{"function"==typeof window.fetch&&window.fetch(d,{method:"POST",headers:{"Content-Type":"text/plain"},body:m,keepalive:!0}
1324).catch(function(){})}catch(e){}else try{var _=new XMLHttpRequest;_.open("POST",d,!0),_.setRequestHeader("Content-Type","text/plain"),_.send(m)}catch(e){n("[Web Pixels Manager] Got an unhandled error while logging to Monorail.")}}else n("[Web Pixels Manager] No Monorail endpoint provided, skipping logging.")}}}({version:u,browserTarget:g,surface:d.surface,shopId:d.shopId,monorailEndpoint:d.monorailEndpoint});if(Boolean(null==(_=null==(b=window.Shopify)?void 0:b.analytics)?void 0:_.replayQueue))w.emit({status:"setup-skipped",errorMsg:"replay queue already initialized."});else{var b,_;w.emit({status:"setup-started"}),window.Shopify=window.Shopify||{};var S=window.Shopify;S.analytics=S.analytics||{};var P=S.analytics;P.replayQueue=[],P.publish=function(e,t,i){return P.replayQueue.push([e,t,i]),!0};try{self.performance.mark("wpm:start")}catch(e){}var k,C="modern"===g?"modern":"legacy",E=(null!=l?l:{modern:"",legacy:""})[C],I=[(k={baseUrl:s,hashVersion:u,buildTarget:C}).baseUrl,"/wpm","/b",k.hashVersion,"modern"===k.buildTarget?"m":"l",".js"].join(""),O=!1,T=!1;try{c.browserTarget=g,function(){O=!0;try{window.addEventListener("pagehide",M)}catch(e){O=!1}}(),R(function(){try{R(x)}catch(e){D(e)}}),w.emit({status:"loading",requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()})}catch(e){D(e)}}function U(){var e;if(q(),!function(){var e,t;return Boolean(null==(t=null==(e=window.Shopify)?void 0:e.analytics)?void 0:t.initialized)}()){var t,i,n;try{if("function"!=typeof(null==(e=window.webPixelsManager)?void 0:e.init))return void A();if(!(null!==(n=i=t=window.webPixelsManager.init(d))&&"function"!=typeof n&&Object(n)===n&&"publish"in i&&"function"==typeof i.publish&&"publishCustomEvent"in i&&"function"==typeof i.publishCustomEvent&&"visitor"in i&&"function"==typeof i.visitor))return void A()}catch(e){return void A(e)}var r=window.Shopify.analytics;r.replayQueue.forEach(function(e){var i=e[0],n=e[1],r=e[2];t.publishCustomEvent(i,n,r)}),r.replayQueue=[],r.publish=t.publishCustomEvent,r.visitor=t.visitor,r.initialized=!0}}function A(e){B("manager_api_unavailable",void 0===e?void 0:Q(e))}function x(){B("script_load_failed","".concat(I," has failed to load"))}function B(e,t){T||(T=!0,q(),w.emit({status:"failed",errorMsg:t,failureReason:e,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function M(e){O&&(q(),w.emit({status:"pagehide-while-loading",useKeepaliveFallback:!0,pagehidePersisted:e.persisted,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function q(){O=!1;try{window.removeEventListener("pagehide",M)}catch(e){}}function R(e){var t;!function(e){var t=e.src,i=e.async,n=void 0===i||i,r=e.onload,o=e.onerror,a=e.sri,d=e.scriptDataAttributes,s=void 0===d?{}:d,u=document.createElement("script"),l=document.querySelector("head"),c=document.querySelector("body");if(u.async=n,u.src=t,a&&(u.integrity=a,u.crossOrigin="anonymous"),s)for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))try{u.dataset[p]=String(s[p])}catch(e){}if(r&&u.addEventListener("load",r),o&&u.addEventListener("error",o),l)l.appendChild(u);else{if(!c)throw new Error("Did not find a head or body element to append the script");c.appendChild(u)}}({src:I,async:!0,onload:U,onerror:e,sri:(t=E,"string"==typeof t&&/^sha384-[A-Za-z0-9+/=]+$/.test(t)?E:""),scriptDataAttributes:c})}function D(e){B("script_append_failed",Q(e))}function Q(e){return e instanceof Error?e.message:"Unknown error"}}}();wpmLoader({shopId: 61810966677,storefrontBaseUrl: "https://horror-vacui.com",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://horror-vacui.com/.well-known/shopify/monorail/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["16072cab","8450a54b","7ee89bf1"],webPixelsConfigList: [{"id":"1037500763","configuration":"{\"config\":\"{\\\"pixel_id\\\":\\\"G-XK2F6NLNZB\\\",\\\"target_country\\\":\\\"DE\\\",\\\"gtag_events\\\":[{\\\"type\\\":\\\"begin_checkout\\\",\\\"action_label\\\":\\\"G-XK2F6NLNZB\\\"},{\\\"type\\\":\\\"search\\\",\\\"action_label\\\":\\\"G-XK2F6NLNZB\\\"},{\\\"type\\\":\\\"view_item\\\",\\\"action_label\\\":[\\\"G-XK2F6NLNZB\\\",\\\"MC-TBRMB7VW1D\\\"]},{\\\"type\\\":\\\"purchase\\\",\\\"action_label\\\":[\\\"G-XK2F6NLNZB\\\",\\\"MC-TBRMB7VW1D\\\"]},{\\\"type\\\":\\\"page_view\\\",\\\"action_label\\\":[\\\"G-XK2F6NLNZB\\\",\\\"MC-TBRMB7VW1D\\\"]},{\\\"type\\\":\\\"add_payment_info\\\",\\\"action_label\\\":\\\"G-XK2F6NLNZB\\\"},{\\\"type\\\":\\\"add_to_cart\\\",\\\"action_label\\\":\\\"G-XK2F6NLNZB\\\"}],\\\"enable_monitoring_mode\\\":false}\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"a3321ca85cf5aaf6b57585fcd8d67b3a","type":"APP","apiClientId":1780363,"privacyPurposes":[],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"494469467","configuration":"{\"pixel_id\":\"227108833069223\",\"pixel_type\":\"facebook_pixel\",\"metaapp_system_user_token\":\"-\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"96420dbe9ea96c426a1b7f364f977719","type":"APP","apiClientId":2329312,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]}
1324,{"id":"152437083","configuration":"{\"tagID\":\"2613191566665\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"7ae565e198624b39e0856d352b9a6b4c","type":"APP","apiClientId":3009811,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"211648859","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"1","type":"CUSTOM","privacyPurposes":["ANALYTICS"],"name":"Google Analytics tag (migrated)"},{"id":"shopify-app-pixel","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"APP","privacyPurposes":["ANALYTICS","MARKETING"]},{"id":"shopify-custom-pixel","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING"]}],isMerchantRequest: false,initData: {"shop":{"name":"HORROR VACUI","paymentSettings":{"currencyCode":"EUR"},"myshopifyDomain":"horror-vacui-shop.myshopify.com","countryCode":"DE","storefrontUrl":"https:\/\/horror-vacui.com"},"customer":null,"cart":null,"checkout":null,"productVariants":[],"products":[],"purchasingCompany":null},},"https://horror-vacui.com/cdn","c8540278we853e1abpb62b2c4amde256306",{"modern":"","legacy":""},{"trekkieShim":true,"agentContext":true,"apiClientId":"580111","facebookCapiEnabled":"false","themeId":"174423933275","themePublished":"true","eventMetadataId":"e76575eb-5d41-41e9-a01b-7b9001b30cf0","pageType":"blog","resourceId":"84267368597","shopId":"61810966677","storefrontBaseUrl":"https:\/\/horror-vacui.com","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"16072cab\", \"8450a54b\", \"7ee89bf1\"]","isMerchantRequest":"false","hashVersion":"c8540278we853e1abpb62b2c4amde256306","publish":"custom","events":"[[\"page_viewed\",{}]]"});})();</script>
1324<script> 1325 window.ShopifyAnalytics = window.ShopifyAnalytics || {}; 1326 window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {}; 1327 window.ShopifyAnalytics.meta.currency = 'USD'; 1328 var meta = {"page":{"pageType":"blog","resourceType":"blog","resourceId":84267368597,"requestId":"c5815a7e-1255-46f1-b9e0-032dc864dcd1-1790441860"}}; 1329 for (var attr in meta) { 1330 window.ShopifyAnalytics.meta[attr] = meta[attr]; 1331 } 1332</script>
vendor: 1 bytes, line 1332
1332
1333<script class="analytics"> 1334 (function () { 1335 var customDocumentWrite = function(content) { 1336 var jquery = null; 1337 1338 if (window.jQuery) { 1339 jquery = window.jQuery; 1340 } else if (window.Checkout && window.Checkout.$) { 1341 jquery = window.Checkout.$; 1342 } 1343 1344 if (jquery) { 1345 jquery('body').append(content); 1346 } 1347 }; 1348 1349 var hasLoggedConversion = function(token) { 1350 if (token) { 1351 return document.cookie.indexOf('loggedConversion=' + token) !== -1; 1352 } 1353 return false; 1354 } 1355 1356 var setCookieIfConversion = function(token) { 1357 if (token) { 1358 var twoMonthsFromNow = new Date(Date.now()); 1359 twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2); 1360 1361 document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow; 1362 } 1363 } 1364 1365 var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || []; 1366 window.ShopifyAnalytics.lib.trekkie = window.trekkie; 1367 if (trekkie.integrations) { 1368 return; 1369 } 1370 trekkie.methods = [ 1371 'identify', 1372 'page', 1373 'ready', 1374 'track', 1375 'trackForm', 1376 'trackLink' 1377 ]; 1378 trekkie.factory = function(method) { 1379 return function() { 1380 var args = Array.prototype.slice.call(arguments); 1381 args.unshift(method); 1382 trekkie.push(args); 1383 if (method == 'track' || method == 'page') { 1384 var pageUrl; 1385 try { 1386 pageUrl = window.location.href; 1387 } catch (e) {} 1388 var pageReferrer; 1389 try { 1390 pageReferrer = document.referrer; 1391 } catch (e) {} 1392 try { 1393 if (window.__TREKKIE_SHIM_QUEUE == null) { 1394 window.__TREKKIE_SHIM_QUEUE = []; 1395 } 1396 window.__TREKKIE_SHIM_QUEUE.push({ 1397 from: 'trekkie-stub', 1398 method: method, 1399 args: args.slice(1), 1400 pageContext: { 1401 url: pageUrl, 1402 referrer: pageReferrer 1403 } 1404 }); 1405 } catch (e) { 1406 // no-op 1407 } 1408 } 1409 return trekkie; 1410 }; 1411 }; 1412 for (var i = 0; i < trekkie.methods.length; i++) { 1413 var key = trekkie.methods[i]; 1414 trekkie[key] = trekkie.factory(key); 1415 } 1416 trekkie.load = function(config) { 1417 trekkie.config = config || {}; 1418 trekkie.config.initialDocumentCookie = document.cookie; 1419 var first = document.getElementsByTagName('script')[0]; 1420var script = document.createElement('script'); 1421script.type = 'text/javascript'; 1422script.onerror = function(e) { 1423 var scriptFallback = document.createElement('script'); 1424 scriptFallback.type = 'text/javascript'; 1425 scriptFallback.onerror = function(error) { 1426 var Monorail = { 1427 produce: function produce(monorailDomain, schemaId, payload) { 1428 var currentMs = new Date().getTime(); 1429 var event = { 1430 schema_id: schemaId, 1431 payload: payload, 1432 metadata: { 1433 event_created_at_ms: currentMs, 1434 event_sent_at_ms: currentMs 1435 } 1436 }; 1437 return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event)); 1438 }, 1439 sendRequest: function sendRequest(endpointUrl, payload) { 1440 // Try the sendBeacon API 1441 if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) { 1442 var blobData = new window.Blob([payload], { 1443 type: 'text/plain' 1444 }); 1445 1446 if (window.navigator.sendBeacon(endpointUrl, blobData)) { 1447 return true; 1448 } // sendBeacon was not successful 1449 1450 } // XHR beacon 1451 1452 var xhr = new XMLHttpRequest(); 1453 1454 try { 1455 xhr.open('POST', endpointUrl); 1456 xhr.setRequestHeader('Content-Type', 'text/plain'); 1457 xhr.send(payload); 1458 } catch (e) { 1459 console.log(e); 1460 } 1461 1462 return false; 1463 }, 1464 isIos12: function isIos12() { 1465 return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1; 1466 } 1467 }; 1468 Monorail.produce('monorail-edge.shopifysvc.com', 1469 'trekkie_storefront_load_errors/1.1', 1470 {shop_id: 61810966677, 1471 theme_id: 174423933275, 1472 app_name: "storefront", 1473 context_url: window.location.href, 1474 source_url: "//horror-vacui.com/cdn/s/trekkie.storefront.f1ba865b3fecd812ad617f74ac079261075e9edb.min.js"}); 1475 1476 }; 1477 scriptFallback.async = true; 1478 scriptFallback.src = '//horror-vacui.com/cdn/s/trekkie.storefront.f1ba865b3fecd812ad617f74ac079261075e9edb.min.js'; 1479 first.parentNode.insertBefore(scriptFallback, first); 1480}; 1481script.async = true; 1482script.src = '//horror-vacui.com/cdn/s/trekkie.storefront.f1ba865b3fecd812ad617f74ac079261075e9edb.min.js'; 1483first.parentNode.insertBefore(script, first); 1484 1485 }; 1486 trekkie.load( 1487 {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":61810966677,"isMerchantRequest":null,"themeId":174423933275,"themeCityHash":"11997501915388676196","contentLanguage":"en","currency":"USD","eventMetadataId":"e76575eb-5d41-41e9-a01b-7b9001b30cf0"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["764d78cb","8450a54b","7ee89bf1"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":false,"source":"trekkie-storefront-renderer","apiClientId":580111}} 1488 ); 1489 1490 var loaded = false;
1491 trekkie.ready(function() { 1492 if (loaded) return; 1493 loaded = true; 1494 1495 window.ShopifyAnalytics.lib = window.trekkie; 1496 1497 var originalDocumentWrite = document.write; 1498 document.write = customDocumentWrite; 1499 try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {}; 1500 document.write = originalDocumentWrite; 1501 1502 var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/) 1503 var token = match? match[1]: undefined; 1504 if (!hasLoggedConversion(token)) { 1505 setCookieIfConversion(token); 1506 1507 } 1508 }); 1509 1510 window.ShopifyAnalytics.lib.page(null,{"pageType":"blog","resourceType":"blog","resourceId":84267368597,"requestId":"c5815a7e-1255-46f1-b9e0-032dc864dcd1-1790441860","shopifyEmitted":true}); 1511 1512 var eventsListenerScript = document.createElement('script'); 1513 eventsListenerScript.async = true; 1514 eventsListenerScript.src = "//horror-vacui.com/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js"; 1515 document.getElementsByTagName('head')[0].appendChild(eventsListenerScript); 1516})();</script>
1516 1517
1517<script> 1518 if (!window.ga || (window.ga && typeof window.ga !== 'function')) { 1519 window.ga = function ga() { 1520 (window.ga.q = window.ga.q || []).push(arguments); 1521 if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') { 1522 window.Shopify.analytics.publish("ga_stub_called", {}, {sendTo: "google_osp_migration"}); 1523 } 1524 console.error("Shopify's Google Analytics stub called with:", Array.from(arguments), "\nSee https://help.shopify.com/manual/promoting-marketing/pixels/pixel-migration#google for more information."); 1525 }; 1526 if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') { 1527 window.Shopify.analytics.publish("ga_stub_initialized", {}, {sendTo: "google_osp_migration"}); 1528 } 1529 } 1530</script>
vendor: 1 bytes, line 1530
1530
1531<script 1532 defer 1533 src="https://horror-vacui.com/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.9.4.min.js" 1534 data-application="storefront-renderer" 1535 data-shop-id="61810966677" 1536 data-render-region="gcp-us-west1" 1537 data-page-type="blog" 1538 data-theme-instance-id="174423933275" 1539 data-theme-name="Spark" 1540 data-theme-version="2.7.0" 1541 data-monorail-region="shop_domain" 1542 data-resource-timing-sampling-rate="10" 1543 data-shs="true" 1544 data-shs-beacon="true" 1545 data-shs-export-with-fetch="true" 1546 data-shs-logs-sample-rate="1" 1547 data-shs-beacon-endpoint="https://horror-vacui.com/api/collect" 1548></script>
1548 1549<meta name="shopify-y" content="ca565f01-7e9e-4493-9853-a86b1b74f8d5" data-expiration="1821999460000"><meta name="shopify-s" content="a3edb18d-0d45-403b-973a-6ff8dc819ec4" data-expiration="1790443660000"><meta name="new-cookie-storage-activated" content="t"> 1550</head> 1551<body 1552 class="template-blog header-sticky" 1553 1554 data-enable-cart-ajax="true" 1555 1556> 1557 <div class="page"> 1558 1559 <div class="page-transition" data-page-transition></div> 1560 1561 <div class="theme-editor-scroll-offset"></div> 1562 <div class="header__space" data-header-space></div> 1563 <div id="shopify-section-announcement-bar" class="shopify-section"><div 1564 class="announcement-bar" 1565 data-section-id="announcement-bar" 1566 data-section-type="announcement-bar" 1567 data-timing="3000" 1568 ><div 1569 class="announcement-bar__item ff-body fs-body-x-small" 1570 style=" 1571 --color-background: #ffffff; 1572 --color-gradient-overlay: rgba(255, 255, 255, 100); 1573 --color-gradient-overlay-transparent: rgba(255, 255, 255, 0); 1574 --color-text: #000000; 1575 " 1576 data-announcement 1577 data-index="0" 1578 1579 > 1580 <div class="announcement-bar__content-wrapper"> 1581 <div class="announcement-bar__content"><span> 1582 <a class="announcement-bar__link color-inherit" href="/collections/new-in"> 1583 New arrivals in July 1584 </a> 1585 </span></div> 1586 </div> 1587 1588 <div class="announcement-bar__gradient-gap"></div> 1589 </div><div 1590 class="announcement-bar__item ff-body fs-body-x-small" 1591 style=" 1592 --color-background: #ffffff; 1593 --color-gradient-overlay: rgba(255, 255, 255, 100); 1594 --color-gradient-overlay-transparent: rgba(255, 255, 255, 0); 1595 --color-text: #000000; 1596 " 1597 data-announcement 1598 data-index="1" 1599 1600 > 1601 <div class="announcement-bar__content-wrapper"> 1602 <div class="announcement-bar__content"><span> 1603 <a class="announcement-bar__link color-inherit" href="/collections/boxer-shorts"> 1604 Boxer Shorts are here 1605 </a> 1606 </span></div> 1607 </div> 1608 1609 <div class="announcement-bar__gradient-gap"></div> 1610 </div></div> 1611</div> 1612 <div id="shopify-section-header" class="shopify-section header__outer-wrapper"> 1613 1614 1615<header 1616 data-section-id="header" 1617 data-section-type="header" 1618 1619 data-enable-sticky-header="true" 1620 1621 class=" 1622 header 1623 header--icon 1624 header--center 1625 header--navigation-inline 1626 header--has-logo 1627 1628 1629 header--has-transparent-logo 1630 1631 header--has-accounts 1632 1633 1634 " 1635 style=" 1636 --width-max-logo: 250px; 1637 --color-cart-count-transparent: #000000; 1638 --color-text-transparent: #ffffff; 1639 --color-icon-transparent: #ffffff; 1640 --color-border-transparent: rgba(255, 255, 255, 0.0); 1641 " 1642> 1643
1643<script type="application/json" data-search-settings> 1644 { 1645 "limit": 4, 1646 "show_articles": true, 1647 "show_pages": false 1648 } 1649</script>
1649 1650 1651 <a href="#main" class="header__skip-top-content btn btn--primary btn--small"> 1652 Skip to content 1653 </a> 1654 1655 <div class="header__inner"> 1656 1657 <div class="header__left"><button class="header__menu-icon header__icon-touch header__icon-menu" aria-label="Open menu modal" data-js-menu-button> 1658 <span class="icon-button "> 1659 <span class="icon-button__icon"> 1660 1661<span class="icon "> 1662 <svg width="100%" viewBox="0 0 24 24"> 1663 1664 <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.1" d="M3.43 12h17.14M3.43 6.29h17.14M3.43 17.71h17.14"/> 1665 1666 1667 </svg> 1668</span> 1669 </span> 1670</span> 1671 1672 </button> 1673</div> 1674 <div class="header__center"> 1675 <h1 class="header__logo"> 1676 <a 1677 class="header__logo-link" href="/" 1678 1679 aria-label="HORROR VACUI" 1680 1681 ><div class="image js-enabled image--27319082647701 regular-logo"> 1682 <img 1683 class="image__img lazyload lazypreload " 1684 src="//horror-vacui.com/cdn/shop/files/hv_logo_horizontal_test_300x300.png?v=1659012424" 1685 data-src="//horror-vacui.com/cdn/shop/files/hv_logo_horizontal_test_{width}x.png?v=1659012424" 1686 data-widths="[180, 360, 540, 720, 900, 1080, 1296, 1512, 1728, 2048]" 1687 data-aspectratio="10.60070671378092" 1688 data-sizes="auto" 1689 alt="" 1690 > 1691</div><style> 1692 .image--27319082647701 { 1693 padding-top: 9.433333333333334%; 1694 } 1695 </style><noscript> 1696 <div class="image image--27319082647701 regular-logo"> 1697 <img class="image__img" src="//horror-vacui.com/cdn/shop/files/hv_logo_horizontal_test_2048x2048.png?v=1659012424" alt=""> 1698 </div> 1699</noscript><div class="image js-enabled image--27316918878357 transparent-logo"> 1700 <img 1701 class="image__img lazyload lazypreload " 1702 src="//horror-vacui.com/cdn/shop/files/hv_logo_horizontal_weiss_transparent_300x300.png?v=1658991418" 1703 data-src="//horror-vacui.com/cdn/shop/files/hv_logo_horizontal_weiss_transparent_{width}x.png?v=1658991418" 1704 data-widths="[180, 360, 540, 720, 900, 1080, 1296, 1512, 1728, 2048]" 1705 data-aspectratio="10.59322033898305" 1706 data-sizes="auto" 1707 alt="" 1708 > 1709</div><style> 1710 .image--27316918878357 { 1711 padding-top: 9.44%; 1712 } 1713 </style><noscript> 1714 <div class="image image--27316918878357 transparent-logo"> 1715 <img class="image__img" src="//horror-vacui.com/cdn/shop/files/hv_logo_horizontal_weiss_transparent_2048x2048.png?v=1658991418" alt=""> 1716 </div> 1717</noscript></a> 1718 </h1> 1719 </div> 1720 <div class="header__right"><a 1721 class="header__icon-touch header__icon-touch--search no-transition" 1722 href="/search" 1723 data-search 1724 aria-label="Open search modal" 1725 > 1726 <span class="icon-button "> 1727 <span class="icon-button__icon"> 1728 1729<span class="icon "> 1730 <svg width="100%" viewBox="0 0 24 24"> 1731 1732 <circle fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.25" class="cls-1" cx="10" cy="9.93" r="8.41"/> 1733 <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.25" class="cls-1" d="M16.29,16.22l6.12,6.11"/> 1734 1735 1736 </svg> 1737</span> 1738 </span> 1739</span> 1740 1741 </a> 1742<a 1743 class="header__icon-touch header__icon-touch--account" 1744 href="/account" 1745 aria-label="Go to the account page" 1746 > 1747 <span class="icon-button "> 1748 <span class="icon-button__icon"> 1749 1750<span class="icon "> 1751 <svg width="100%" viewBox="0 0 24 24"> 1752 1753 <circle fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.25" cx="12" cy="6.47" r="4.8"/> 1754 <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.25" d="M21 22.33a.33.33 0 0 0 .32-.36c-.08-.76-.27-2.57-.37-3.28a4.54 4.54 0 0 0-4.51-3.92h-9A4.54 4.54 0 0 0 3 18.69c-.1.71-.29 2.52-.37 3.28a.33.33 0 0 0 .32.36z"/> 1755 1756 1757 </svg> 1758</span> 1759 </span> 1760</span> 1761 1762 </a> 1763<a 1764 class="header__icon-touch no-transition" 1765 href="/cart" 1766 aria-label="Open cart modal" 1767 data-js-cart-icon 1768 > 1769 <span class="icon-button "> 1770 <span class="icon-button__icon"> 1771 1772<span class="icon ">
1773 <svg width="100%" viewBox="0 0 24 24"> 1774 1775 <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.25" class="cls-1" d="m19.84 7.53 1.4 12.88a1.73 1.73 0 0 1-1.53 1.91H4.48a1.73 1.73 0 0 1-1.73-1.72 1.15 1.15 0 0 1 0-.19L4.16 7.53a.27.27 0 0 1 .28-.25h15.12a.27.27 0 0 1 .28.25z"/> 1776 <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.25" class="cls-1" d="M16.23 7.28V5.75a4.23 4.23 0 0 0-8.46 0v1.53"/> 1777 1778 1779 </svg> 1780</span> 1781 </span> 1782</span> 1783 1784 <div class="header__cart-count" data-js-cart-indicator> 1785 <span data-js-cart-count>0</span> 1786 </div> 1787 </a> 1788 </div><div class="quick-search" data-quick-search> 1789 <div class="quick-search__overlay" data-overlay></div> 1790 1791 <div class="quick-search__container popover"> 1792 <button type="button" class="quick-search__close" aria-label="Close" data-close-icon> 1793 <span class="icon-button "> 1794 <span class="icon-button__icon"> 1795 1796<span class="icon "> 1797 <svg width="100%" viewBox="0 0 24 24"> 1798 1799 <path stroke-width="1" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M18 6 6 18M6 6l12 12"/> 1800 1801 1802 </svg> 1803</span> 1804 </span> 1805</span> 1806 1807 </button> 1808 1809 <div class="quick-search__heading ff-heading fs-heading-2-base fs-heading-2-large-ns">Search</div> 1810 1811 <form action="/search" class="quick-search__form" autocomplete="off"> 1812 <div class="quick-search__bar"> 1813 <label for="search" class="visually-hidden" aria-label="What are you looking for?"></label> 1814 <input 1815 class="quick-search__input" 1816 id="search" 1817 type="text" 1818 name="q" 1819 placeholder="What are you looking for?" 1820 data-input 1821 > 1822 <input type="hidden" name="options[prefix]" value="last"> 1823 <div class="quick-search__actions"> 1824 <button class="quick-search__clear" type="button" data-clear aria-label="Clear search"> 1825 1826<span class="icon "> 1827 <svg width="100%" viewBox="0 0 24 24"> 1828 1829 <path stroke-width="1" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M18 6 6 18M6 6l12 12"/> 1830 1831 1832 </svg> 1833</span> 1834 </button> 1835 <button class="quick-search__submit" type="submit" aria-label="Search"> 1836 1837<span class="icon "> 1838 <svg width="100%" viewBox="0 0 24 24"> 1839 1840 <path fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M12 5l7 7-7 7"/> 1841 1842 1843 </svg> 1844</span> 1845 </button> 1846 </div> 1847 </div> 1848 1849 <div class="quick-search__results-wrapper"> 1850 <div class="quick-search__results" data-results></div> 1851 </div> 1852 </form> 1853 1854 <div class="quick-search__blur"></div> 1855 </div> 1856</div> 1857 1858 1859 <div class="quick-cart" data-quick-cart> 1860 <div class="quick-cart__overlay" data-overlay></div> 1861 1862 <div class="quick-cart__container popover"> 1863 <button type="button" class="quick-cart__close" aria-label="Close" data-close-icon> 1864 <span class="icon-button "> 1865 <span class="icon-button__icon"> 1866 1867<span class="icon "> 1868 <svg width="100%" viewBox="0 0 24 24"> 1869 1870 <path stroke-width="1" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M18 6 6 18M6 6l12 12"/> 1871 1872 1873 </svg> 1874</span> 1875 </span> 1876</span> 1877 1878 </button> 1879 <div class="quick-cart__cart visible" data-cart data-scroll-lock-ignore> 1880 <div class="quick-cart__header ff-heading fs-heading-2-base fs-heading-2-large-ns">Cart</div> 1881 <div class="quick-cart__items" data-items></div> 1882 <div class="quick_cart__empty ff-body fs-body-base" data-empty>Your cart is currently empty.</div> 1883 <div class="quick-cart__footer ff-body fs-body-base ta-c" data-footer> 1884 <div class="quick-cart__discounts c-subdued" data-discounts></div> 1885 <div class="quick-cart__total"> 1886 <span>Subtotal</span> 1887 <span class="fs-body-bold" data-subtotal></span> 1888 </div> 1889 <a href="/cart" class="btn btn--secondary btn--medium btn--full visible button-add-to-cart light button-image">Go to cart</a> 1890 <a href="/checkout/" class="quick-cart__buy-now btn btn--primary btn--medium btn--full visible button-add-to-cart light button-image" data-buy-now-button>Checkout</a> 1891 </div> 1892 </div> 1893 </div> 1894</div> 1895 1896 </div> 1897 1898 <div class="no-js-menu no-js-menu--desktop"> 1899 <nav> 1900 <ul> 1901 1902 <li><a href="/collections/editio-rarissima">EDITIO RARISSIMA</a></li> 1903 1904 1905 <li><a href="/collections/new-in">NEW</a></li> 1906 1907 1908 <li><a href="/collections/dresses">DRESSES</a></li> 1909 1910 1911 <li><a href="/collections/blouses">TOPS</a></li> 1912 1913 1914 <li><a href="/collections/skirts">SKIRTS</a></li> 1915 1916 1917 <li><a href="/collections/trousers">PANTS</a></li> 1918 1919 1920 <li><a href="/collections/jackets">COATS AND JACKETS</a></li> 1921 1922 1923 <li><a href="/collections/pyjamas-robes-boxers">PYJAMAS, ROBES, BOXERS</a></li> 1924 1925 1926 <li><a href="/pages/our-hv-atelier">THE ATELIER</a></li> 1927 1928 <li><a href="/pages/about-anna-2">ABOUT ANNA</a></li> 1929 1930 1931 <li><a href="/pages/our-hv-atelier">OUR ARTISANS</a></li> 1932 1933 1934 <li><a href="/pages/our-hv-atelier">HORROR VACUI CRAFTSMANSHIP</a></li> 1935 1936 1937 1938 <li><a href="/blogs/news">POSTCARDS</a></li> 1939 1940 1941</ul> 1942</nav> 1943 </div> 1944 1945 1946 1947 1948<div
1949 class="drawer-menu popover" 1950 data-drawer-menu 1951> 1952
1952<script type="application/json" data-search-settings> 1953 { 1954 "limit": 4, 1955 "show_articles": true, 1956 "show_pages": false 1957 } 1958</script>
1958 1959 1960 <div class="drawer-menu__overlay" data-overlay></div> 1961 1962 <div class="drawer-menu__panel" data-scroll-lock-ignore> 1963 1964 <div class="drawer-menu__close-wrapper"> 1965 <button 1966 type="button" 1967 data-drawer-close 1968 class="drawer-menu__close-icon" 1969 aria-label="Close" 1970 > 1971 <span class="icon-button "> 1972 <span class="icon-button__icon"> 1973 1974<span class="icon "> 1975 <svg width="100%" viewBox="0 0 24 24"> 1976 1977 <path stroke-width="1" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M18 6 6 18M6 6l12 12"/> 1978 1979 1980 </svg> 1981</span> 1982 </span> 1983</span> 1984 1985 </button> 1986 </div> 1987 1988 <div class="drawer-menu__bottom"> 1989 <div class="drawer-menu__all-links" data-depth="0" data-all-links> 1990 <div class="drawer-menu__contents"> 1991 <div class="drawer-menu__main" data-main> 1992 <ul class="drawer-menu__primary-links drawer-menu-list--0" data-primary-container="true" data-depth="0"> 1993 1994 <li class="drawer-menu__item drawer-menu__item--emphasized drawer-menu__search-parent" data-list-item> 1995 <a 1996 class="drawer-menu__link fs-heading-2-base fs-heading-2-large-ns" 1997 href="#" 1998 data-item="parent" 1999 aria-haspopup="true" 2000 aria-expanded="false" 2001 > 2002 Search 2003 2004 </a> 2005 <ul class="drawer-menu__list drawer-menu__list--sub" data-search-menu aria-hidden="true"> 2006 <li class="drawer-menu__item drawer-menu__item--heading"> 2007 <button class="drawer-menu__link" data-item="back"> 2008 <span class="fs-heading-2-base fs-heading-2-large-ns"> 2009 Search 2010 </span> 2011 2012<span class="icon menu-icon"> 2013 <svg width="100%" viewBox="0 0 24 24"> 2014 2015 <path fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M12 5l7 7-7 7"/> 2016 2017 2018 </svg> 2019</span> 2020 </button> 2021 </li> 2022 <li class="drawer-menu__search"> 2023 <form action="/search" autocomplete="off"> 2024 <div class="drawer-menu__header"> 2025 <div class="drawer-menu__search-input-wrapper"> 2026 <label for="drawer-search" class="visually-hidden">Search</label> 2027 <input 2028 name="q" 2029 id="drawer-search" 2030 class="drawer-menu__search-input" 2031 placeholder="What are you looking for?" 2032 data-input 2033 /> 2034 <div class="drawer-menu__actions"> 2035 <button 2036 class="drawer-menu__clear" 2037 type="button" 2038 data-search-clear 2039 aria-label="Clear search" 2040 > 2041 2042<span class="icon "> 2043 <svg width="100%" viewBox="0 0 24 24"> 2044 2045 <path stroke-width="1" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M18 6 6 18M6 6l12 12"/> 2046 2047 2048 </svg> 2049</span> 2050 </button> 2051 <button 2052 class="drawer-menu__submit" 2053 type="submit" 2054 data-search-submit 2055 aria-label="Search" 2056 > 2057 2058<span class="icon "> 2059 <svg width="100%" viewBox="0 0 24 24"> 2060 2061 <path fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M12 5l7 7-7 7"/> 2062 2063 2064 </svg> 2065</span> 2066 </button> 2067 </div> 2068 </div> 2069 </div>
2070 <div class="drawer-menu__search-results" data-scroll-lock-ignore data-search-results></div> 2071 </form> 2072 </li> 2073 </ul> 2074 </li> 2075 2076 <!-- if primary doesn't exist but secondary does --><li 2077 class=" 2078 drawer-menu__item 2079 drawer-menu__item--emphasized 2080 " 2081 data-list-item 2082 > 2083 <a 2084 data-item="link" 2085 class="drawer-menu__link " 2086 href="/collections/editio-rarissima" 2087 2088 > 2089 <span 2090 class=" 2091 ff-heading 2092 fs-heading-2-base 2093 fs-heading-2-large-ns 2094 2095 " 2096 > 2097 EDITIO RARISSIMA 2098 </span></a> 2099 2100 2101</li><li 2102 class=" 2103 drawer-menu__item 2104 drawer-menu__item--emphasized 2105 " 2106 data-list-item 2107 > 2108 <a 2109 data-item="link" 2110 class="drawer-menu__link " 2111 href="/collections/new-in" 2112 2113 > 2114 <span 2115 class=" 2116 ff-heading 2117 fs-heading-2-base 2118 fs-heading-2-large-ns 2119 2120 " 2121 > 2122 NEW 2123 </span></a> 2124 2125 2126</li><li 2127 class=" 2128 drawer-menu__item 2129 drawer-menu__item--emphasized 2130 " 2131 data-list-item 2132 > 2133 <a 2134 data-item="link" 2135 class="drawer-menu__link " 2136 href="/collections/dresses" 2137 2138 > 2139 <span 2140 class=" 2141 ff-heading 2142 fs-heading-2-base 2143 fs-heading-2-large-ns 2144 2145 " 2146 > 2147 DRESSES 2148 </span></a> 2149 2150 2151</li><li 2152 class=" 2153 drawer-menu__item 2154 drawer-menu__item--emphasized 2155 " 2156 data-list-item 2157 > 2158 <a 2159 data-item="link" 2160 class="drawer-menu__link " 2161 href="/collections/blouses" 2162 2163 > 2164 <span 2165 class=" 2166 ff-heading 2167 fs-heading-2-base 2168 fs-heading-2-large-ns 2169 2170 " 2171 > 2172 TOPS 2173 </span></a> 2174 2175 2176</li><li 2177 class=" 2178 drawer-menu__item 2179 drawer-menu__item--emphasized 2180 " 2181 data-list-item 2182 > 2183 <a 2184 data-item="link" 2185 class="drawer-menu__link " 2186 href="/collections/skirts" 2187 2188 > 2189 <span 2190 class=" 2191 ff-heading 2192 fs-heading-2-base 2193 fs-heading-2-large-ns 2194 2195 " 2196 > 2197 SKIRTS 2198 </span></a> 2199 2200 2201</li><li 2202 class=" 2203 drawer-menu__item 2204 drawer-menu__item--emphasized 2205 " 2206 data-list-item 2207 > 2208 <a 2209 data-item="link" 2210 class="drawer-menu__link " 2211 href="/collections/trousers" 2212 2213 > 2214 <span 2215 class=" 2216 ff-heading 2217 fs-heading-2-base 2218 fs-heading-2-large-ns 2219 2220 " 2221 > 2222 PANTS 2223 </span></a> 2224 2225 2226</li><li 2227 class=" 2228 drawer-menu__item 2229 drawer-menu__item--emphasized 2230 " 2231 data-list-item 2232 > 2233 <a 2234 data-item="link" 2235 class="drawer-menu__link " 2236 href="/collections/jackets" 2237 2238 > 2239 <span 2240 class=" 2241 ff-heading 2242 fs-heading-2-base 2243 fs-heading-2-large-ns 2244 2245 " 2246 > 2247 COATS AND JACKETS 2248 </span></a> 2249 2250 2251</li><li 2252 class=" 2253 drawer-menu__item 2254 drawer-menu__item--emphasized 2255 " 2256 data-list-item 2257 > 2258 <a 2259 data-item="link" 2260 class="drawer-menu__link " 2261 href="/collections/pyjamas-robes-boxers" 2262 2263 > 2264 <span 2265 class=" 2266 ff-heading 2267 fs-heading-2-base 2268 fs-heading-2-large-ns 2269 2270 " 2271 > 2272 PYJAMAS, ROBES, BOXERS 2273 </span></a> 2274 2275 2276</li><li 2277 class=" 2278 drawer-menu__item 2279 drawer-menu__item--emphasized 2280 " 2281 data-list-item 2282 > 2283 <a 2284 data-item="parent" 2285 class="drawer-menu__link no-transition " 2286 href="/pages/our-hv-atelier" 2287 2288 data-link="primary" 2289 aria-haspopup="true" 2290 aria-expanded="false" 2291 2292 > 2293 <span 2294 class=" 2295 ff-heading 2296 fs-heading-2-base 2297 fs-heading-2-large-ns 2298 2299 " 2300 > 2301 THE ATELIER 2302 </span> 2303<span class="icon menu-icon">
2304 <svg width="100%" viewBox="0 0 24 24"> 2305 2306 <path fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M12 5l7 7-7 7"/> 2307 2308 2309 </svg> 2310</span> 2311</a> 2312 2313 2314<ul class="drawer-menu__list drawer-menu__list--sub drawer-menu-list--1" aria-hidden="true"> 2315 <li class="drawer-menu__item drawer-menu__item--heading"> 2316 <button class="drawer-menu__link" data-heading="true" data-item="back"> 2317 <span class="ff-heading fs-heading-2-base fs-heading-2-large-ns">THE ATELIER</span> 2318 2319<span class="icon menu-icon"> 2320 <svg width="100%" viewBox="0 0 24 24"> 2321 2322 <path fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M12 5l7 7-7 7"/> 2323 2324 2325 </svg> 2326</span> 2327 </button> 2328 </li> 2329 <li 2330 class=" 2331 drawer-menu__item 2332 2333 " 2334 data-list-item 2335 > 2336 <a 2337 data-item="link" 2338 class="drawer-menu__link " 2339 href="/pages/about-anna-2" 2340 2341 > 2342 <span 2343 class=" 2344 2345 fs-body-base 2346 fs-body-large-ns 2347 " 2348 > 2349 ABOUT ANNA 2350 </span></a> 2351 2352 2353</li><li 2354 class=" 2355 drawer-menu__item 2356 2357 " 2358 data-list-item 2359 > 2360 <a 2361 data-item="link" 2362 class="drawer-menu__link " 2363 href="/pages/our-hv-atelier" 2364 2365 > 2366 <span 2367 class=" 2368 2369 fs-body-base 2370 fs-body-large-ns 2371 " 2372 > 2373 OUR ARTISANS 2374 </span></a> 2375 2376 2377</li><li 2378 class=" 2379 drawer-menu__item 2380 2381 " 2382 data-list-item 2383 > 2384 <a 2385 data-item="link" 2386 class="drawer-menu__link " 2387 href="/pages/our-hv-atelier" 2388 2389 > 2390 <span 2391 class=" 2392 2393 fs-body-base 2394 fs-body-large-ns 2395 " 2396 > 2397 HORROR VACUI CRAFTSMANSHIP 2398 </span></a> 2399 2400 2401</li> 2402 </ul></li><li 2403 class=" 2404 drawer-menu__item 2405 drawer-menu__item--emphasized 2406 drawer-menu__item--emphasized-last" 2407 data-list-item 2408 > 2409 <a 2410 data-item="link" 2411 class="drawer-menu__link active" 2412 href="/blogs/news" 2413 2414 > 2415 <span 2416 class=" 2417 ff-heading 2418 fs-heading-2-base 2419 fs-heading-2-large-ns 2420 2421 " 2422 > 2423 POSTCARDS 2424 </span></a> 2425 2426 2427</li> 2428<li class="drawer-menu__item" data-list-item> 2429 <a class="drawer-menu__link fs-body-base fs-body-large-ns" href="/account"> 2430 Register / Login 2431</a> 2432 </li></ul> 2433 </div> 2434 </div> 2435 </div> 2436 </div> 2437 </div> 2438</div> 2439 2440</header> 2441
2442<script> 2443 // Set heading height at component level 2444 const header = document.querySelector('#shopify-section-header'); 2445 document.documentElement.style.setProperty('--height-header', header.offsetHeight + 'px'); 2446</script>
2446 2447 2448<style> 2449 2450 .template-index #main { 2451 margin-top: calc(var(--height-header) * -1); 2452 } 2453 2454 .template-index #main .offset-section:first-child .slideshow__content-inner, 2455 .template-index #main .offset-section:first-child .video-hero__content-inner { 2456 padding-top: calc(var(--height-header) - var(--space-outer)); 2457 } 2458 2459</style> 2460 2461</div> 2462 <main id="main" class="main"> 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483
2484<script type="application/json" id="hidden-collections-data"> 2485 { 2486 "productId": null 2487 , "collectionId": null 2488 , "secureToken": null 2489 } 2490 </script>
2490 2491
2491<script> 2492 if (!window.__hidden_banner_ran) { 2493 window.__hidden_banner_ran = true; 2494 var hiddenCollectionsDataElement = document.getElementById('hidden-collections-data'); 2495 if (hiddenCollectionsDataElement) { 2496 var hiddenCollectionsData = JSON.parse(hiddenCollectionsDataElement.innerHTML); 2497 var hiddenCollectionsMessage = "You are viewing a private collection"; 2498 if (hiddenCollectionsData && hiddenCollectionsData.collectionId) { 2499 var banner = document.createElement('div'); 2500 banner.innerHTML = '<div style="bottom: 20px; left: 20px; padding: 10px 20px; position: fixed; background-color: #f7f7f7; border-radius: 10px;">'+ 2501 '<h6 style="padding: 0; margin: 0">Private ' + (hiddenCollectionsData.productId ? 'product' : 'collection') + '</h6>' + 2502 '</div>'; 2503 document.body.appendChild(banner); 2504 } 2505 } 2506 } 2507 </script>
2507 2508 <section id="shopify-section-template--23943398130011__1682071672acc7c375" class="shopify-section"><div><div id="shopify-block-AZ3lmUHU4VDRHajZYY__568441fb-dd46-4b19-8a2f-d8b4a0c33d26" class="shopify-block shopify-app-block cevoid-section-gallery"><div class="cevoid-section-block"> 2509 2510 <div 2511 class="cevoid-title-wrapper" 2512 style="margin-bottom: 30px; text-align: center;" 2513 > 2514 2515 <div 2516 class="cevoid-title" 2517 style="color: #ffffff; font-size: 43px; line-height: 43px;" 2518 > 2519 Send us your postcard. 2520 </div> 2521 2522 2523 <p 2524 class="cevoid-paragraph" 2525 style="color: #000000; font-size: 26px; line-height: 26px;" 2526 > 2527 POSTCARDS 2528 </p> 2529 2530 </div> 2531 2532 2533 <div 2534 id="cevoid-container" 2535 data-gallery="g-yZKGcJA6WgsIKmjXKeHMF" 2536 2537 2538 ></div> 2539</div> 2540 2541 2542 2543<style> 2544 .cevoid-section-gallery { 2545 width: 100%; 2546 } 2547</style> 2548 2549 2550</div> 2551</div> 2552 2553 2554</section> 2555 2556 2557 </main> 2558 <footer id="shopify-section-footer" class="shopify-section footer__parent"><div 2559 class="footer" 2560 data-section-id="footer" 2561 data-section-type="footer" 2562 style=" 2563 --color-background-input: rgba(29, 29, 29, 0.2); 2564 --color-background-input-hover: rgba(29, 29, 29, 0.25); 2565 --color-background-input-hover-dull: rgba(29, 29, 29, 0.1); 2566 --color-background-input-highlight: rgba(29, 29, 29, 0.35); 2567 --color-text-input: rgba(29, 29, 29, 0.95); 2568 " 2569> 2570 <div class="footer__inner"> 2571 <div class="footer__groups"> 2572 2573 <div class="footer__group footer__group--menu footer__group--1"> 2574 <button type="button" class="footer__header" data-header> 2575 <span class="footer__heading ff-heading fs-heading-4-base">Orders</span> 2576 <span class="footer__arrow"> 2577<span class="icon "> 2578 <svg width="100%" viewBox="0 0 24 24"> 2579 2580 <path fill="currentColor" d="m0 6 12 12L24 6z" /> 2581 2582 2583 </svg> 2584</span></span> 2585 </button> 2586 <div class="footer__group-content"><div class="footer__links fs-body-base"> 2587 2588 <ul> 2589 2590 <li><a href="/pages/contact">Contact us</a></li> 2591 2592 <li><a href="/policies/shipping-policy">Shipping & Returns</a></li> 2593 2594 <li><a href="/policies/terms-of-service">Terms & Conditions</a></li> 2595 2596 <li><a href="/policies/privacy-policy">Privacy</a></li> 2597 2598 <li><a href="/?id=GDPR_769769dd5c4da8efb4d18bf16ca2c677">Cookies</a></li> 2599 2600 <li><a href="/policies/legal-notice">Legal Issues</a></li> 2601 2602 </ul> 2603 2604 </div></div> 2605 </div> 2606 2607 <div class="footer__group footer__group--menu footer__group--2"> 2608 <button type="button" class="footer__header" data-header> 2609 <span class="footer__heading ff-heading fs-heading-4-base">The Atelier</span> 2610 <span class="footer__arrow"> 2611<span class="icon "> 2612 <svg width="100%" viewBox="0 0 24 24"> 2613 2614 <path fill="currentColor" d="m0 6 12 12L24 6z" /> 2615 2616 2617 </svg> 2618</span></span> 2619 </button> 2620 <div class="footer__group-content"><div class="footer__links fs-body-base"> 2621 2622 <ul> 2623 2624 <li><a href="/pages/about-anna-2">About Anna</a></li> 2625 2626 <li><a href="/pages/our-hv-atelier">Our Artisans</a></li> 2627 2628 <li><a href="/pages/our-hv-atelier">Craftsmanship</a></li> 2629 2630 </ul> 2631 2632 </div></div> 2633 </div> 2634 2635 <div class="footer__group footer__group--newsletter footer__group--3"> 2636 <button type="button" class="footer__header" data-header> 2637 <span class="footer__heading ff-heading fs-heading-4-base">Newsletter</span>
2638 <span class="footer__arrow"> 2639<span class="icon "> 2640 <svg width="100%" viewBox="0 0 24 24"> 2641 2642 <path fill="currentColor" d="m0 6 12 12L24 6z" /> 2643 2644 2645 </svg> 2646</span></span> 2647 </button> 2648 <div class="footer__group-content"><div class="footer__newsletter"> 2649 <div class="fs-body-base footer__text"><p>Receive the latest news from the Atelier and discover our stories, collections, and surprises.</p></div> 2650 2651 <form method="post" action="/contact#footer-subscribe" id="footer-subscribe" accept-charset="UTF-8" class="footer__newsletter-form"><input type="hidden" name="form_type" value="customer" /><input type="hidden" name="utf8" value="â" /> 2652 2653�<div class="footer__newsletter-inner"> 2654 <input type="hidden" name="contact[tags]" value="newsletter"> 2655 <label for="footer-subscribe-email" class="visually-hidden">Email address</label> 2656 <input type="email" 2657 class="input" 2658 name="contact[email]" 2659 id="footer-subscribe-email" 2660 value="" 2661 placeholder="Email address" 2662 autocorrect="off" 2663 autocapitalize="off" 2664 > 2665 <button type="submit" name="commit" id="Subscribe-footer" class="footer__newsletter-button" aria-label="Subscribe"> 2666<span class="icon "> 2667 <svg width="100%" viewBox="0 0 24 24"> 2668 2669 <circle fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" cx="12" cy="12" r="10"/> 2670 <path fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" d="m12 16 4-4-4-4M8 12h8"/> 2671 2672 2673 </svg> 2674</span></button> 2675 </div></form> 2676 </div></div> 2677 </div> 2678 �</div><hr class="footer__rule" /><div class="footer__bottom"><div class="footer__bottom-left"> 2679 �<ul class="social-icons"><li> 2680 <a href="https://www.facebook.com/horrorvacuimunich/" title="HORROR VACUI on Facebook" target="_blank"> 2681 2682<span class="icon "> 2683 <svg width="100%" viewBox="0 0 24 24"> 2684 2685 <path d="M12,2C6.477,2,2,6.477,2,12c0,5.013,3.693,9.153,8.505,9.876V14.65H8.031v-2.629h2.474v-1.749 c0-2.896,1.411-4.167,3.818-4.167c1.153,0,1.762,0.085,2.051,0.124v2.294h-1.642c-1.022,0-1.379,0.969-1.379,2.061v1.437h2.995 l-0.406,2.629h-2.588v7.247C18.235,21.236,22,17.062,22,12C22,6.477,17.523,2,12,2z" fill="currentColor" /> 2686 2687 2688 </svg> 2689</span> 2690 </a> 2691 </li><li> 2692 <a href="https://de.pinterest.com/horrorvacuipjs/?etslf=6592&eq=HORROR" title="HORROR VACUI on Pinterest" target="_blank"> 2693 2694<span class="icon "> 2695 <svg width="100%" viewBox="0 0 24 24"> 2696 2697 <path d="M12,2C6.477,2,2,6.477,2,12c0,4.237,2.636,7.855,6.356,9.312c-0.087-0.791-0.167-2.005,0.035-2.868 c0.182-0.78,1.172-4.971,1.172-4.971s-0.299-0.599-0.299-1.484c0-1.391,0.806-2.428,1.809-2.428c0.853,0,1.265,0.641,1.265,1.408 c0,0.858-0.546,2.141-0.828,3.329c-0.236,0.996,0.499,1.807,1.481,1.807c1.777,0,3.143-1.874,3.143-4.579 c0-2.394-1.72-4.068-4.177-4.068c-2.845,0-4.515,2.134-4.515,4.34c0,0.859,0.331,1.781,0.744,2.282 c0.082,0.099,0.093,0.186,0.069,0.287c-0.076,0.316-0.244,0.995-0.277,1.134c-0.043,0.183-0.145,0.222-0.334,0.133 c-1.249-0.582-2.03-2.408-2.03-3.874c0-3.154,2.292-6.052,6.608-6.052c3.469,0,6.165,2.472,6.165,5.776 c0,3.447-2.173,6.22-5.189,6.22c-1.013,0-1.966-0.527-2.292-1.148c0,0-0.502,1.909-0.623,2.378 c-0.226,0.868-0.835,1.958-1.243,2.622C9.975,21.843,10.969,22,12,22c5.522,0,10-4.478,10-10S17.523,2,12,2z" fill="currentColor" /> 2698 2699 2700 </svg> 2701</span> 2702 </a> 2703 </li><li> 2704 <a href="https://www.instagram.com/horrorvacuimunich/" title="HORROR VACUI on Instagram" target="_blank"> 2705 2706<span class="icon "> 2707 <svg width="100%" viewBox="0 0 24 24"> 2708 2709 <path d="M7.8,2H16.2C19.4,2 22,4.6 22,7.8V16.2A5.8,5.8 0 0,1 16.2,22H7.8C4.6,22 2,19.4 2,16.2V7.8A5.8,5.8 0 0,1 7.8,2M7.6,4A3.6,3.6 0 0,0 4,7.6V16.4C4,18.39 5.61,20 7.6,20H16.4A3.6,3.6 0 0,0 20,16.4V7.6C20,5.61 18.39,4 16.4,4H7.6M17.25,5.5A1.25,1.25 0 0,1 18.5,6.75A1.25,1.25 0 0,1 17.25,8A1.25,1.25 0 0,1 16,6.75A1.25,1.25 0 0,1 17.25,5.5M12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9Z" fill="currentColor" /> 2710 2711 2712 </svg> 2713</span> 2714 </a> 2715 </li></ul> 2716�</div><div class="footer__bottom-right"></div> 2717 </div><div class="footer__mobile-social-icons"> 2718 <ul class="social-icons"><li> 2719 <a href="https://www.facebook.com/horrorvacuimunich/" title="HORROR VACUI on Facebook" target="_blank"> 2720 2721<span class="icon ">
2722 <svg width="100%" viewBox="0 0 24 24"> 2723 2724 <path d="M12,2C6.477,2,2,6.477,2,12c0,5.013,3.693,9.153,8.505,9.876V14.65H8.031v-2.629h2.474v-1.749 c0-2.896,1.411-4.167,3.818-4.167c1.153,0,1.762,0.085,2.051,0.124v2.294h-1.642c-1.022,0-1.379,0.969-1.379,2.061v1.437h2.995 l-0.406,2.629h-2.588v7.247C18.235,21.236,22,17.062,22,12C22,6.477,17.523,2,12,2z" fill="currentColor" /> 2725 2726 2727 </svg> 2728</span> 2729 </a> 2730 </li><li> 2731 <a href="https://de.pinterest.com/horrorvacuipjs/?etslf=6592&eq=HORROR" title="HORROR VACUI on Pinterest" target="_blank"> 2732 2733<span class="icon "> 2734 <svg width="100%" viewBox="0 0 24 24"> 2735 2736 <path d="M12,2C6.477,2,2,6.477,2,12c0,4.237,2.636,7.855,6.356,9.312c-0.087-0.791-0.167-2.005,0.035-2.868 c0.182-0.78,1.172-4.971,1.172-4.971s-0.299-0.599-0.299-1.484c0-1.391,0.806-2.428,1.809-2.428c0.853,0,1.265,0.641,1.265,1.408 c0,0.858-0.546,2.141-0.828,3.329c-0.236,0.996,0.499,1.807,1.481,1.807c1.777,0,3.143-1.874,3.143-4.579 c0-2.394-1.72-4.068-4.177-4.068c-2.845,0-4.515,2.134-4.515,4.34c0,0.859,0.331,1.781,0.744,2.282 c0.082,0.099,0.093,0.186,0.069,0.287c-0.076,0.316-0.244,0.995-0.277,1.134c-0.043,0.183-0.145,0.222-0.334,0.133 c-1.249-0.582-2.03-2.408-2.03-3.874c0-3.154,2.292-6.052,6.608-6.052c3.469,0,6.165,2.472,6.165,5.776 c0,3.447-2.173,6.22-5.189,6.22c-1.013,0-1.966-0.527-2.292-1.148c0,0-0.502,1.909-0.623,2.378 c-0.226,0.868-0.835,1.958-1.243,2.622C9.975,21.843,10.969,22,12,22c5.522,0,10-4.478,10-10S17.523,2,12,2z" fill="currentColor" /> 2737 2738 2739 </svg> 2740</span> 2741 </a> 2742 </li><li> 2743 <a href="https://www.instagram.com/horrorvacuimunich/" title="HORROR VACUI on Instagram" target="_blank"> 2744 2745<span class="icon "> 2746 <svg width="100%" viewBox="0 0 24 24"> 2747 2748 <path d="M7.8,2H16.2C19.4,2 22,4.6 22,7.8V16.2A5.8,5.8 0 0,1 16.2,22H7.8C4.6,22 2,19.4 2,16.2V7.8A5.8,5.8 0 0,1 7.8,2M7.6,4A3.6,3.6 0 0,0 4,7.6V16.4C4,18.39 5.61,20 7.6,20H16.4A3.6,3.6 0 0,0 20,16.4V7.6C20,5.61 18.39,4 16.4,4H7.6M17.25,5.5A1.25,1.25 0 0,1 18.5,6.75A1.25,1.25 0 0,1 17.25,8A1.25,1.25 0 0,1 16,6.75A1.25,1.25 0 0,1 17.25,5.5M12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9Z" fill="currentColor" /> 2749 2750 2751 </svg> 2752</span> 2753 </a> 2754 </li></ul> 2755 2756 </div><div class="footer__credits fs-body-x-small"> 2757 <p>Copyright © 2026, <a href="/" title="">HORROR VACUI</a>.</p> 2758 <p><a target="_blank" rel="nofollow" href="https://www.shopify.com?utm_campaign=poweredby&utm_medium=shopify&utm_source=onlinestore">Powered by Shopify</a></p> 2759 </div> 2760 </div> 2761</div> 2762 2763 2764 2765</footer> 2766 <div id="shopify-section-popup" class="shopify-section"> 2767</div> 2768 <div class="modal popover" data-modal> 2769 <div class="modal__wash"></div> 2770 <div class="modal__inner" data-scroll-lock-ignore> 2771 <div class="modal__header"> 2772 <button 2773 type="button" 2774 data-modal-close 2775 class="modal__close-icon" 2776 aria-label="Close" 2777 > 2778 <span class="icon-button "> 2779 <span class="icon-button__icon"> 2780 2781<span class="icon "> 2782 <svg width="100%" viewBox="0 0 24 24"> 2783 2784 <path stroke-width="1" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M18 6 6 18M6 6l12 12"/> 2785 2786 2787 </svg> 2788</span> 2789 </span> 2790</span> 2791 2792 </button> 2793 </div> 2794 <div class="modal__content rte rte--page"></div> 2795 </div> 2796</div> 2797 2798 <div 2799 class="store-availability-drawer popover" 2800 data-store-availability-drawer 2801 aria-describedby="drawer-title" 2802 aria-hidden="true" 2803 role="dialog" 2804> 2805 <div class="store-availability-drawer__wash" data-store-availability-drawer-wash></div> 2806 <div class="store-availability-drawer__inner"> 2807 <div class="store-availability-drawer__header"> 2808 <div class="store-availability-drawer__product-info"> 2809 <h4 id="drawer-title" class="store-availability-drawer__store-list-product-title ff-heading fs-heading-2-large"> 2810 Availability 2811 </h4> 2812 </div> 2813 <button 2814 type="button" 2815 class="store-availability-drawer__close" 2816 data-store-availability-close aria-label="Close" 2817 >
2818 <span class="icon-button "> 2819 <span class="icon-button__icon"> 2820 2821<span class="icon "> 2822 <svg width="100%" viewBox="0 0 24 24"> 2823 2824 <path stroke-width="1" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M18 6 6 18M6 6l12 12"/> 2825 2826 2827 </svg> 2828</span> 2829 </span> 2830</span> 2831 2832 </button> 2833 </div> 2834 <div class="store-availbility-drawer__product" data-store-availability-product></div> 2835 2836 <div class="store-availbility-drawer__content" data-store-list-container></div> 2837 </div> 2838</div> 2839 2840 2841 2842 </div> 2843
2843<script src="//www.youtube.com/iframe_api" type="text/javascript"></script>
2843 2844 <link href="//horror-vacui.com/cdn/shopifycloud/shopify-plyr/v1.0/shopify-plyr.css" rel="stylesheet" type="text/css" media="all" /> 2845 2846 2847 2848 2849
2849<script type="module" src="//horror-vacui.com/cdn/shop/t/26/assets/theme.js?v=54341719082674082291728237194" ></script>
2849 2850
2850<script type="module" src="//horror-vacui.com/cdn/shop/t/26/assets/custom.js?v=183251399032734045921728237194" ></script>
2850 2851 2852
2852<script nomodule src="//horror-vacui.com/cdn/shop/t/26/assets/s.min.js?v=176831107740605177141728237194"></script>
2852 2853
2853<script nomodule> 2854 System.import('//horror-vacui.com/cdn/shop/t/26/assets/theme.nomodule.js?v=170450442978053367801728237194'); 2855 </script>
2855 2856 2857 2858 2859
2860<script src="//cdn.shopify.com/s/files/1/0194/1736/6592/t/1/assets/booster-page-speed-optimizer.js?23" type="text/javascript"></script>
2860 2861 2862 <div class="index-section--flush powr-popup" id="00753def_1678284576"></div> 2863 2864 <div class="index-section--flush powr-popup" id="2ac8f652_1680269198"></div> 2865 <!-- langify-v2-scripts-begin --> 2866 2867
2868<script> 2869 var langify = langify || {}; 2870 2871 2872 /** 2873 * 2874 * 2875 * @class LyHelper 2876 */ 2877 class LyHelper { 2878 constructor() { 2879 return { 2880 ajax: function(params) { return LyHelper.ajax(params); }, 2881 isIE: function() { return LyHelper.isIE(); }, 2882 extractImageObject: function(val) { return LyHelper.extractImageObject(val); }, 2883 getCurrentLanguage: function() { return LyHelper.getCurrentLanguage(); }, 2884 getCookie: function(name) { return LyHelper.getCookie(name); }, 2885 setCookie: function(name, value, days) { return LyHelper.setCookie(name, value, days); }, 2886 getVersion: function() { return LyHelper.getVersion(); }, 2887 isOutOfViewport: function(elem) { return LyHelper.isOutOfViewport(elem); }, 2888 isDomainFeatureEnabled: function() { return LyHelper.isDomainFeatureEnabled(); }, 2889 getVal: function(str) { return LyHelper.getVal(str); }, 2890 inIframe: function() { return LyHelper.inIframe(); }, 2891 shopifyAPI: function() { return LyHelper.shopifyAPI(); }, 2892 loadScript: function(url, callback) { return LyHelper.loadScript(url, callback); }, 2893 localizationRedirect: function(type, code, additionalFields, additionalParams, domain) { return LyHelper.localizationRedirect(type, code, additionalFields, additionalParams, domain); }, 2894 changeCurrency: function(code) { return LyHelper.changeCurrency(code); }, 2895 log: function(title, data, type) { return LyHelper.log(title, data, type); }, 2896 } 2897 } 2898 static ajax(params) { 2899 var data = params.data; 2900 fetch(params.url, { 2901 method: params.method, 2902 headers: { 2903 'Content-Type': 'application/json', 2904 }, 2905 body: (data && params.method === 'POST') ? JSON.stringify(data) : null, 2906 }) 2907 .then(response => response.json()) 2908 .then(data => { 2909 params.success(data); 2910 }) 2911 .catch((error) => { 2912 console.error('Error:', error); 2913 }); 2914 } 2915 static isIE() { 2916 var ua = navigator.userAgent; 2917 var is_ie = ua.indexOf("MSIE ") > -1 || ua.indexOf("Trident/") > -1; 2918 return is_ie; 2919 } 2920 static extractImageObject(val) { 2921 if(!val || val == '') return false; 2922 var val = val; 2923 2924 // Handle src-sets 2925 if(val.search(/([0-9]+w?h?x?,)/gi) > -1) { 2926 val = val.split(/([0-9]+w?h?x?,)/gi)[0]; 2927 } 2928 2929 var hostBegin = val.indexOf('//') ? val.indexOf('//') : 0; 2930 var hostEnd = val.lastIndexOf('/') + 1; 2931 var host = val.substring(hostBegin, hostEnd); 2932 var afterHost = val.substring(hostEnd, val.length); 2933 2934 var url = val; 2935 var file = ''; 2936 var name = ''; 2937 var type = ''; 2938 afterHost = afterHost.substring(0, (afterHost.indexOf("#") == -1) ? afterHost.length : afterHost.indexOf("#")); 2939 afterHost = afterHost.substring(0, (afterHost.indexOf("?") == -1) ? afterHost.length : afterHost.indexOf("?")); 2940 name = afterHost.replace(/(_[0-9]+x[0-9]*|_{width}x|_{size})?(_crop_(top|center|bottom|left|right))?(@[0-9]*x)?(\.progressive)?\.(png\.jpg|jpe?g|png|gif|webp)/gi, ""); 2941 2942 if(afterHost.search(/(\.png\.jpg|\.jpg\.jpg)/gi) > -1) { 2943 type = afterHost.substring(afterHost.search(/(\.png\.jpg|\.jpg\.jpg)/gi)+1, afterHost.length); 2944 } else { 2945 type = afterHost.substring(afterHost.lastIndexOf('.')+1, afterHost.length); 2946 } 2947 2948 file = afterHost.replace(/(_[0-9]+x[0-9]*|_{width}x|_{size})?(_crop_(top|center|bottom|left|right))?(@[0-9]*x)?(\.progressive)?\.(png\.jpg|jpe?g|png|gif|webp)/gi, '.'+type); 2949 2950 return { 2951 host: host, 2952 name: name, 2953 type: type, 2954 file: file 2955 } 2956 } 2957 static getCurrentLanguage() { 2958 return window.langify.locale.iso_code; 2959 } 2960 static setLanguage(code) { 2961 2962 } 2963 static getCookie(name) { 2964 var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); 2965 if(v) return v[2]; 2966 else return null; 2967 } 2968 static setCookie(name, value, days) { 2969 var d = new Date; 2970 d.setTime(d.getTime() + 24*60*60*1000*days); 2971 document.cookie = name + "=" + value + ";path=/;expires=" + d.toGMTString(); 2972 } 2973 static getVersion() { 2974 return 2; 2975 } 2976 static isOutOfViewport (elem) { 2977 var bounding = elem.getBoundingClientRect(); 2978 var out = {}; 2979 out.top = bounding.top < 0; 2980 out.left = bounding.left < 0;
2981 out.bottom = Math.ceil(bounding.bottom) >= (window.innerHeight || document.documentElement.clientHeight); 2982 out.right = bounding.right > (window.innerWidth || document.documentElement.clientWidth); 2983 out.any = out.top || out.left || out.bottom || out.right; 2984 out.inViewport = bounding.x > 0 && bounding.y > 0; 2985 return out; 2986 } 2987 static isDomainFeatureEnabled() { 2988 return window.langify.locale.domain_feature_enabled; 2989 } 2990 static getVal(str) { 2991 var v = window.location.search.match(new RegExp('(?:[?&]'+str+'=)([^&]+)')); 2992 return v ? v[1] : null; 2993 } 2994 static inIframe() { 2995 try { 2996 return window.self !== window.top; 2997 } catch (e) { 2998 return true; 2999 } 3000 } 3001 static shopifyAPI() { 3002 var root_url = window.langify.locale.root_url != '/' ? window.langify.locale.root_url : ''; 3003 3004 return { 3005 attributeToString: function(attribute) { 3006 if((typeof attribute) !== 'string') { 3007 attribute += ''; 3008 if(attribute === 'undefined') {attribute = '';} 3009 } 3010 return attribute.trim(); 3011 }, 3012 getCart: function(callback) { 3013 LyHelper.ajax({ 3014 method: 'GET', 3015 url: root_url+'/cart.js', 3016 success: function (cart, textStatus) { 3017 if((typeof callback) === 'function') { 3018 callback(cart); 3019 } 3020 } 3021 }); 3022 }, 3023 updateCartNote: function(note, callback) { 3024 var params = { 3025 method: 'POST', 3026 url: root_url+'/cart/update.js', 3027 data: 'note=' + this.attributeToString(note), 3028 dataType: 'json', 3029 success: function(cart) {if((typeof callback) === 'function') {callback(cart);}}, 3030 error: this.onError 3031 }; 3032 LyHelper.ajax(params); 3033 }, 3034 updateCartAttributes: function(attributes, callback) { 3035 var params = { 3036 method: 'POST', 3037 url: root_url+'/cart/update.js', 3038 data: {"attributes": attributes}, 3039 dataType: 'json', 3040 success: function(cart) { 3041 if((typeof callback) === 'function') { 3042 callback(cart); 3043 } 3044 }, 3045 error: this.onError 3046 }; 3047 LyHelper.ajax(params); 3048 }, 3049 onError: function(XMLHttpRequest, textStatus) { 3050 3051 } 3052 } 3053 } 3054 static loadScript(url, callback) { 3055 var script = document.createElement('script'); 3056 script.type = 'text/javascript'; 3057 if(script.readyState) { 3058 script.onreadystatechange = function () { 3059 if(script.readyState == 'loaded' || script.readyState == 'complete') { 3060 script.onreadystatechange = null; 3061 callback(); 3062 } 3063 }; 3064 } else { 3065 script.onload = function () { 3066 callback(); 3067 }; 3068 } 3069 script.src = url; 3070 document.getElementsByTagName('head')[0].appendChild(script); 3071 } 3072 static localizationRedirect(type, code, additionalFields, additionalParams, domain) { 3073 if(type !== 'country_code' && type !== 'language_code') { 3074 return false; 3075 } 3076 if(!additionalParams) { 3077 var additionalParams = ''; 3078 } 3079 if(domain) { 3080 window.location.href = domain; 3081 return true; 3082 } 3083 var params = [ 3084 { 3085 name: type, 3086 value: code 3087 }, 3088 { 3089 name: 'return_to', 3090 value: window.location.pathname + window.location.search + additionalParams + window.location.hash 3091 }, 3092 { 3093 name: 'form_type', 3094 value: 'localization' 3095 }, 3096 { 3097 name: '_method', 3098 value: 'put' 3099 } 3100 ]; 3101 if(additionalFields) { 3102 for(var i=0; i<additionalFields.length; i++) { 3103 params.push(additionalFields[i]); 3104 } 3105 } 3106 const form = document.createElement('form'); 3107 form.method = 'POST'; 3108 form.action = '/localization'; 3109 params.forEach(function(param) { 3110 const field = document.createElement('input'); 3111 field.type = 'hidden'; 3112 field.name = param['name']; 3113 field.value = param['value']; 3114 form.appendChild(field); 3115 }); 3116 document.body.appendChild(form); 3117 form.submit(); 3118 } 3119 static changeCurrency(code) { 3120 const params = [ 3121 { 3122 name: 'currency_code', 3123 value: code 3124 }, 3125 { 3126 name: 'return_to', 3127 value: window.location.pathname + window.location.search + window.location.hash 3128 }, 3129 { 3130 name: 'form_type', 3131 value: 'localization' 3132 }, 3133 { 3134 name: '_method', 3135 value: 'put' 3136 } 3137 ]; 3138 const form = document.createElement('form'); 3139 form.method = 'POST'; 3140 form.action = '/localization';
3141 params.forEach(function(param) { 3142 const field = document.createElement('input'); 3143 field.type = 'hidden'; 3144 field.name = param['name']; 3145 field.value = param['value']; 3146 form.appendChild(field); 3147 }); 3148 document.body.appendChild(form); 3149 form.submit(); 3150 } 3151 static log(title, data, type) { 3152 if(langify.settings.debug) { 3153 if(!data) { 3154 var data = ''; 3155 } 3156 3157 var css = 'color: green; font-weight: bold;'; 3158 if(type === 'error') { 3159 css = 'color: red; font-weight: bold;'; 3160 } 3161 3162 console.log(`%c ${title}: \n`, css, data); 3163 } 3164 } 3165 }; 3166 3167 3168 /** 3169 * 3170 * 3171 * @class TranslationObserver 3172 */ 3173 class TranslationObserver { 3174 constructor() { 3175 LyHelper.log('TranslationObserver instantiation') 3176 } 3177 3178 init() { 3179 if(langify.settings.observe && !LyHelper.isIE()) { 3180 var langifyObserver = this.langifyObserverCore(); 3181 langifyObserver.init(); 3182 3183 // HOTFIX: translation observer sometimes refuses to trigger on page load_ 3184 langifyObserver.triggerCustomContents(); 3185 3186 langify.api = { 3187 observer: { 3188 start: langifyObserver.init, 3189 stop: langifyObserver.stopObserver, 3190 trigger: langifyObserver.triggerCustomContents, 3191 translateLink: langifyObserver.translateLink, 3192 translateTextNode: langifyObserver.translateTextNode, 3193 translateNodeAttrs: langifyObserver.translateNodeAttrs, 3194 translateImage: langifyObserver.translateImage, 3195 translateCssImage: langifyObserver.translateCssImage 3196 } 3197 }; 3198 } 3199 3200 return this; 3201 } 3202 3203 langifyObserverCore() { 3204 var observedNodes = []; 3205 var intersectionObs = null; 3206 var mutationCount = 0; 3207 var mutationObs = null; 3208 var mutationObsConfig = { 3209 characterData: true, 3210 characterDataOldValue: true, 3211 attributes: true, 3212 attributeOldValue: true, 3213 childList: true, 3214 subtree: true, 3215 }; 3216 var customContents_html = {}; 3217 var customContents_text = {}; 3218 var customContents_attr = {}; 3219 3220 function init() { 3221 if(langify.settings.observe) { 3222 spreadCustomContents(); 3223 if (window.MutationObserver) { 3224 if (langify.settings.lazyload && window.IntersectionObserver) { 3225 startIntersectionObserver(); 3226 } else { 3227 startMutationObserver(null); 3228 } 3229 } else { 3230 startMutationEvents(); 3231 } 3232 } 3233 } 3234 3235 3236 // Intersection Observer 3237 function startIntersectionObserver() { 3238 intersectionObs = new IntersectionObserver(callbackIntersectionChange); 3239 var elementNodes = document.getElementsByClassName('shopify-section'); 3240 Array.prototype.slice.call(elementNodes).forEach(function(node) { 3241 intersectionObs.observe(node); 3242 }); 3243 } 3244 3245 function callbackIntersectionChange(intersections) { 3246 intersections.forEach(function(intersection) { 3247 var target = intersection.target; 3248 var targetIsIntersecting = Boolean(target.getAttribute('ly-is-intersecting') === "true" ? true : false); 3249 3250 if(typeof targetIsIntersecting == 'undefined' || targetIsIntersecting == null) { 3251 target.setAttribute('ly-is-intersecting', intersection.isIntersecting); 3252 targetIsIntersecting = intersection.isIntersecting; 3253 } 3254 3255 // On Screen 3256 if(targetIsIntersecting == false && intersection.isIntersecting == true) { 3257 if(!target.getAttribute('ly-is-observing')) { 3258 startMutationObserver(target); 3259 intersectionObs.unobserve(target); 3260 3261 // As the mutation observer didn't see the "add" of the elememts, trigger the initial translation manually 3262 var elementNodes = getNodesUnder(target, 'SHOW_ELEMENT'); 3263 var textNodes = getNodesUnder(target, 'SHOW_TEXT'); 3264 var nodes = elementNodes.concat(textNodes);
3265 nodes.forEach(function(node) { 3266 translate(node, 'mutation -> childList'); 3267 }); 3268 } 3269 } 3270 // Off Screen 3271 //else if(targetIsIntersecting == true && intersection.isIntersecting == false) { 3272 // stopMutationObserver(target); 3273 //} 3274 target.setAttribute('ly-is-intersecting', intersection.isIntersecting); 3275 }); 3276 } 3277 3278 3279 // Mutation Observer 3280 function startMutationObserver(observerTarget) { 3281 if (!observerTarget) { 3282 var target = document.documentElement || document.body; // main window 3283 } else { 3284 if (observerTarget.nodeName === 'IFRAME') { 3285 try { var target = observerTarget.contentDocument || observerTarget.contentWindow.document; } 3286 catch { return false; } 3287 } else { 3288 var target = observerTarget; 3289 } 3290 } 3291 mutationObs = new MutationObserver(callbackDomChange); 3292 mutationObs.observe(target, mutationObsConfig); 3293 observedNodes.push(target); 3294 try { target.setAttribute('ly-is-observing', 'true'); } catch(e) {} 3295 } 3296 3297 function stopMutationObserver(target) { 3298 if(observedNodes.indexOf(target) > -1) { 3299 observedNodes.splice(observedNodes.indexOf(target), 1); 3300 } 3301 var mutations = mutationObs.takeRecords(); 3302 mutationObs.disconnect(); 3303 observedNodes.forEach(node => { 3304 mutationObs.observe(node, mutationObsConfig); 3305 }); 3306 try { target.removeAttribute('ly-is-observing'); } catch(e) {} 3307 } 3308 3309 3310 function callbackDomChange(mutations, mutationObs) { 3311 for (var i = 0, length = mutations.length; i < length; i++) { 3312 var mutation = mutations[i]; 3313 var target = mutation.target; 3314 3315 // Links-Hook 3316 if (mutation.type === 'attributes' && (mutation.attributeName === 'href' || mutation.attributeName === 'action')) { 3317 var target = mutation.target; 3318 translateLink(target.getAttribute(mutation.attributeName), target); 3319 } 3320 // Images-Hook 3321 else if (mutation.type === 'attributes' && (mutation.attributeName === 'src' || mutation.attributeName === 'data-src' || mutation.attributeName === 'srcset' || mutation.attributeName === 'data-srcset')) { 3322 translateImage(target, mutation.attributeName); 3323 } 3324 else if (mutation.type === 'attributes' && mutation.attributeName === 'style') { 3325 translateCssImage(target); 3326 } 3327 // Subtree Events 3328 else if (mutation.type === 'childList') { 3329 // Added Nodes 3330 if(mutation.addedNodes.length > 0) { 3331 var elementNodes = getNodesUnder(mutation.target, 'SHOW_ELEMENT'); 3332 var textNodes = getNodesUnder(mutation.target, 'SHOW_TEXT'); 3333 var nodes = elementNodes.concat(textNodes); 3334 nodes.forEach(function(node) { 3335 translate(node, 'mutation -> childList'); 3336 }); 3337 } 3338 } 3339 // CharacterData Events 3340 else if (mutation.type === 'characterData') { 3341 var target = mutation.target; 3342 translate(target, 'mutation -> characterData'); 3343 } 3344 } 3345 } 3346 3347 3348 function translate(node, info) { 3349 if((node.nodeType === 1 && node.hasAttribute('data-ly-locked')) || (node.nodeType === 3 && node.parentNode && node.parentNode.hasAttribute('data-ly-locked'))) { 3350 return; 3351 } 3352 // CC-Hook 3353 if (node.nodeName !== 'SCRIPT' && node.nodeName !== 'STYLE') { 3354 if (node.nodeType === 3) { 3355 translateTextNode(node, info); 3356 } 3357 translateNodeAttrs(node); 3358 } 3359 // Links-Hook 3360 if (node.nodeName === 'A' || node.nodeName === 'FORM') { 3361 if(node.hasAttribute('href')) var attrName = 'href'; 3362 else var attrName = 'action'; 3363 var url = node.getAttribute(attrName); 3364 translateLink(url, node); 3365 } 3366 // Images-Hook 3367 if (node.nodeName === 'IMG' || node.nodeName === 'SOURCE') { 3368 translateImage(node, ['src', 'data-src', 'srcset', 'data-srcset']); 3369 } 3370 if (node.attributes && node.getAttribute('style')) { 3371 translateCssImage(node); 3372 } 3373 // Iframe Observation 3374 if (node.nodeName === 'IFRAME') { 3375 // Todo: handle srcdoc iframe content observing 3376 if (node.getAttribute('ly-is-observing') == null && node.getAttribute('src') == null && !node.hasAttribute('srcdoc')) { 3377 node.setAttribute('ly-is-observing', 'true'); 3378 startMutationObserver(node); 3379 } 3380 } 3381 } 3382 3383 function translateNodeAttrs(node) { 3384 if (node.attributes && node.getAttribute('placeholder')) { 3385 var src = node.getAttribute('placeholder').trim().replace(/(\r\n|\n|\r)/gim,"").replace(/\s+/g," ").toLowerCase(); 3386 if(customContents_text[src] && node.getAttribute('placeholder') !== customContents_text[src]) { 3387 node.setAttribute('placeholder', customContents_text[src]); 3388 } 3389 } 3390 } 3391 3392 3393 function translateTextNode(node, info) { 3394 if(langify.settings.observeCustomContents === false || !node.textContent || node.textContent.trim().length === 0) { 3395 return; 3396 } 3397 var oldSrc = node.textContent.trim().replace(/(\r\n|\n|\r)/gim,"").replace(/\s+/g," ").toLowerCase(); 3398 var src = node.textContent.trim().replace(/(\r\n|\n|\r)/gim," ").replace(/\s+/g," ").toLowerCase(); 3399 if(customContents_text[oldSrc]) { 3400 src = oldSrc; 3401 } 3402 if(customContents_text[src] && node.textContent !== customContents_text[src]) { 3403 var newContent = node.textContent.replace(node.textContent.trim(), customContents_text[src]); 3404 if (newContent != node.textContent) { 3405 if(!node.parentNode.hasAttribute('data-ly-mutation-count') || parseInt(node.parentNode.getAttribute('data-ly-mutation-count')) < langify.settings.maxMutations) { 3406 var count = node.parentNode.hasAttribute('data-ly-mutation-count') ? parseInt(node.parentNode.getAttribute('data-ly-mutation-count')) : 0; 3407 node.parentNode.setAttribute('data-ly-mutation-count', count+1); 3408 node.textContent = newContent; 3409 3410 mutationCount = mutationCount + 1; 3411 LyHelper.log('REPLACED (TEXT)', { 3412 oldValue: src, 3413 newValue: customContents_text[src], 3414 mutationCount, 3415 }, 'success' 3416 ); 3417 3418 var event = new CustomEvent('langify.observer.aftertranslatetext', { 3419 bubbles: true, 3420 detail: { 3421 target: node, 3422 original: src, 3423 translation: customContents_text[src] 3424 } 3425 }); 3426 node.dispatchEvent(event); 3427 } 3428 } 3429 } 3430 } 3431 3432 function translateLink(url, node, force) { 3433 if(langify.settings.observeLinks === false || isLocalizationForm(node) || node.hasAttribute('data-ly-locked') || !url || (url.indexOf('mailto:') !== -1 || url.indexOf('javascript:') !== -1 || url.indexOf('tel:') !== -1 || url.indexOf('file:') !== -1 || url.indexOf('ftp:') !== -1 || url.indexOf('sms:') !== -1 || url.indexOf('market:') !== -1 || url.indexOf('fax:') !== -1 || url.indexOf('callto:') !== -1 || url.indexOf('ts3server:') !== -1)) { 3434 return; 3435 } 3436 var isLocalized = (
3437 url.indexOf('/'+ langify.locale.iso_code +'/') === 0 || url === '/'+ langify.locale.iso_code || 3438 url.indexOf('/'+ langify.locale.iso_code.toLowerCase() +'/') === 0 || url === '/'+ langify.locale.iso_code.toLowerCase() || 3439 url.indexOf('/'+ langify.locale.iso_code.toLowerCase().substring(0,2) +'/') === 0 || url === '/'+ langify.locale.iso_code.toLowerCase().substring(0,2) || 3440 url.indexOf(langify.locale.root_url + '/') === 0 || url === langify.locale.root_url || 3441 url.indexOf(langify.locale.shop_url + langify.locale.root_url) === 0 || url === langify.locale.shop_url + langify.locale.root_url 3442 ); 3443 var cleanUrl = url.replace(langify.locale.shop_url, ''); 3444 var re = new RegExp(`\/\\b${langify.locale.iso_code.replace('-', '\-')}\\b\/`, 'gi'); 3445 var link = cleanUrl.replace(re, '/'); 3446 var isUrlAbsolute = (link.indexOf('://') > 0 || link.indexOf('//') === 0); 3447 var blacklist = ['#', '/'+ langify.locale.iso_code +'#'].concat(langify.settings.linksBlacklist); 3448 var isUrlBlacklisted = blacklist.find(x => url.indexOf(x) === 0); 3449 if(!isLocalized && !isUrlAbsolute && !isUrlBlacklisted && langify.locale.root_url != '/' || force) { 3450 if(node.hasAttribute('href')) var attrName = 'href'; else var attrName = 'action'; 3451 if(link === '/' || link == langify.locale.root_url) link = ''; 3452 var newLink = langify.locale.root_url + link; 3453 var timeStamp = Math.floor(Date.now()); 3454 if(!node.hasAttribute('data-ly-processed') || timeStamp > parseInt(node.getAttribute('data-ly-processed')) + langify.settings.timeout) { 3455 node.setAttribute('data-ly-processed', timeStamp); 3456 node.setAttribute(attrName, newLink); 3457 if(node.hasAttribute('data-'+attrName)) node.setAttribute('data-'+attrName, newLink); 3458 3459 mutationCount = mutationCount + 1; 3460 LyHelper.log('REPLACED (LINK)', { 3461 attrName, 3462 oldValue: url, 3463 newValue: newLink, 3464 mutationCount, 3465 }, 'success' 3466 ); 3467 3468 var event = new CustomEvent('langify.observer.aftertranslatelink', { 3469 bubbles: true, 3470 detail: { 3471 target: node, 3472 attribute: attrName, 3473 original: url, 3474 translation: newLink 3475 } 3476 }); 3477 node.dispatchEvent(event); 3478 } 3479 } 3480 } 3481 3482 function translateImage(node, attr) { 3483 if(langify.settings.observeImages === false || node.hasAttribute('data-ly-locked') || Object.keys(customContents_image).length === 0) { 3484 return 3485 } 3486 var attrs = []; 3487 if(typeof attr === 'string') attrs.push(attr); 3488 else if(typeof attr === 'object') attrs = attr; 3489 var timeStamp = Math.floor(Date.now()); 3490 if(!node.hasAttribute('data-ly-processed') || timeStamp > parseInt(node.getAttribute('data-ly-processed')) + langify.settings.timeout) { 3491 node.setAttribute('data-ly-processed', timeStamp); 3492 attrs.forEach(function(attr) { 3493 if(node.hasAttribute(attr)) { 3494 var imgObject = LyHelper.extractImageObject(node.getAttribute(attr)); 3495 var imgKey = imgObject ? imgObject.file.toLowerCase() : ''; 3496 3497 if(customContents_image[imgKey]) { 3498 3499 // Replace 3500 var oldValue = node.getAttribute(attr); 3501 var translation = node.getAttribute(attr); 3502 translation = translation.replace(new RegExp(imgObject.host, 'g'), customContents_image[imgKey].host); 3503 translation = translation.replace(new RegExp(imgObject.name, 'g'), customContents_image[imgKey].name); 3504 translation = translation.replace(new RegExp(imgObject.type, 'g'), customContents_image[imgKey].type); 3505 3506 // China Hook 3507 if(node.getAttribute(attr).indexOf('cdn.shopifycdn.net') >= 0) { 3508 translation = translation.replace(new RegExp('cdn.shopify.com', 'g'), 'cdn.shopifycdn.net'); 3509 } 3510 3511 if(node.getAttribute(attr) != translation) { 3512 node.setAttribute(attr, translation); 3513 3514 mutationCount = mutationCount + 1; 3515 LyHelper.log('REPLACED (IMAGE)', { 3516 attrName: attr, 3517 oldValue: oldValue, 3518 newValue: translation, 3519 mutationCount, 3520 }, 'success'); 3521 3522 var event = new CustomEvent('langify.observer.aftertranslateimage', { 3523 bubbles: true, 3524 detail: { 3525 target: node, 3526 attribute: attr, 3527 original: oldValue, 3528 translation: translation 3529 } 3530 }); 3531 node.dispatchEvent(event); 3532 } 3533 } 3534 } 3535 }); 3536 } 3537 } 3538 3539 function translateCssImage(node) { 3540 if(langify.settings.observeImages === false || node.hasAttribute('data-ly-locked') || Object.keys(customContents_image).length === 0 || !node.getAttribute('style')) { 3541 return 3542 } 3543 3544 var imgMatches = node.getAttribute('style').match(/url\(("|')?(.*)("|')?\)/gi); 3545 if(imgMatches !== null) { 3546 var imgSource = imgMatches[0].replace(/url\(("|')?|("|')?\)/, ''); 3547 var imgObject = LyHelper.extractImageObject(imgSource); 3548 var imgKey = imgObject ? imgObject.file.toLowerCase() : ''; 3549 var attr = 'style'; 3550 3551 if(customContents_image[imgKey]) { 3552 3553 // Replace 3554 var translation = node.getAttribute(attr); 3555 translation = translation.replace(new RegExp(imgObject.host, 'g'), customContents_image[imgKey].host); 3556 translation = translation.replace(new RegExp(imgObject.name, 'g'), customContents_image[imgKey].name); 3557 translation = translation.replace(new RegExp(imgObject.type, 'g'), customContents_image[imgKey].type); 3558 3559 // China Hook 3560 if(node.getAttribute(attr).indexOf('cdn.shopifycdn.net') >= 0) { 3561 translation = translation.replace(new RegExp('cdn.shopify.com', 'g'), 'cdn.shopifycdn.net'); 3562 } 3563 3564 if(node.getAttribute(attr) != translation) { 3565 var timeStamp = Math.floor(Date.now()); 3566 if(!node.hasAttribute('data-ly-processed') || timeStamp > parseInt(node.getAttribute('data-ly-processed')) + langify.settings.timeout) { 3567 node.setAttribute('data-ly-processed', timeStamp); 3568 node.setAttribute(attr, translation); 3569 mutationCount = mutationCount + 1; 3570 } 3571 } 3572 } 3573 } 3574 } 3575 3576 function findAndLocalizeLinks(target, parent) { 3577 if(target.parentNode && parent) var allLinks = target.parentElement.querySelectorAll('[href],[action]'); 3578 else var allLinks = target.querySelectorAll('[href],[action]'); 3579 allLinks.forEach(link => { 3580 if(link.hasAttribute('href')) var attrName = 'href'; else var attrName = 'action'; 3581 var url = link.getAttribute(attrName); 3582 translateLink(url, link); 3583 }); 3584 } 3585 3586 function isLocalizationForm(node) { 3587 if(node.querySelector('input[name="form_type"][value="localization"]')){ 3588 return true; 3589 } 3590 return false;
3591 } 3592 3593 function getNodesUnder(el, show){ 3594 var n, a=[], walk=document.createTreeWalker(el, NodeFilter[show] , null, false); 3595 while(n=walk.nextNode()) a.push(n); 3596 return a; 3597 } 3598 3599 function spreadCustomContents() { 3600 var getFileName = function(url) { 3601 if(!url || url == '') return; 3602 url = url.substring(0, (url.indexOf("#") == -1) ? url.length : url.indexOf("#")); 3603 url = url.substring(0, (url.indexOf("?") == -1) ? url.length : url.indexOf("?")); 3604 url = url.substring(url.lastIndexOf("/") + 1, url.length); 3605 url = url.replace(/(_[0-9]+x[0-9]*|_{width}x)?(_crop_(top|center|bottom|left|right))?(@[0-9]*x)?(\.progressive)?\.(jpe?g|png|gif|webp)/gi, ""); 3606 return '/' + url; 3607 } 3608 Object.entries(customContents).forEach(function(entry) { 3609 //if(/<\/?[a-z][\s\S]*>/i.test(entry[0])) customContents_html[entry[0]] = entry[1]; 3610 //else if(/(http(s?):)?([/|.|\w|\s|-])*\.(?:jpe?g|gif|png)/.test(entry[0])) customContents_image[getFileName(entry[0])] = getFileName(entry[1]); 3611 if(/(http(s?):)?([/|.|\w|\s|-])*\.(?:jpe?g|gif|png|webp)/.test(entry[0])) customContents_image[LyHelper.extractImageObject(entry[0]).file] = LyHelper.extractImageObject(entry[1]); 3612 else customContents_text[entry[0]] = entry[1]; 3613 }); 3614 LyHelper.log('CUSTOM CONTENTS:', {customContents, customContents_text, customContents_image}, 'info') 3615 } 3616 3617 // Polyfill for old browsers 3618 function startMutationEvents() { 3619 var target = document.querySelector('body'); 3620 target.addEventListener("DOMAttrModified", function (event) { 3621 if(event.attrName === 'href' || event.attrName === 'action') { 3622 if(event.prevValue != event.newValue) { 3623 translateLink(event.newValue, event.target); 3624 } 3625 } 3626 }, false); 3627 target.addEventListener("DOMSubtreeModified", function (event) { 3628 //findAndLocalizeLinks(event.target, false); 3629 //matchCustomContent(event.target); 3630 }, false); 3631 } 3632 3633 function triggerCustomContents() { 3634 var rootnode = document.getElementsByTagName('body')[0] 3635 var walker = document.createTreeWalker(rootnode, NodeFilter.SHOW_ALL, null, false) 3636 3637 while (walker.nextNode()) { 3638 //LyHelper.log(walker.currentNode.tagName) 3639 translate(walker.currentNode, null); 3640 } 3641 } 3642 3643 function stopObserver() { 3644 mutationObs.takeRecords(); 3645 mutationObs.disconnect(); 3646 } 3647 3648 //init(); 3649 return { 3650 init: init, 3651 triggerCustomContents: triggerCustomContents, 3652 stopObserver: stopObserver, 3653 translateLink: translateLink, 3654 translateTextNode: translateTextNode, 3655 translateNodeAttrs: translateNodeAttrs, 3656 translateImage: translateImage, 3657 translateCssImage: translateCssImage 3658 } 3659 }; 3660 } 3661 3662 3663 /** 3664 * 3665 * 3666 * @class Switcher 3667 */ 3668 class Switcher { 3669 constructor(switcherSettings) { 3670 LyHelper.log('Switcher instantiation'); 3671 3672 this.lyForceOff = location.search.split('ly-force-off=')[1]; 3673 this.switcherElements = Array.prototype.slice.call(document.getElementsByClassName('ly-switcher-wrapper')); 3674 } 3675 3676 init() { 3677 3678 // Initial cart.attributes update 3679 LyHelper.shopifyAPI().getCart(function (cart) { 3680 var currentLanguage = langify.locale.iso_code; 3681 if(!cart.attributes.language || cart.attributes.language != currentLanguage) { 3682 LyHelper.shopifyAPI().updateCartAttributes({"language": currentLanguage}, function(data){}); 3683 } 3684 }); 3685 3686 if(langify.locale.languages.length === 1) { 3687 console.info(`%c LANGIFY INFO:\n`, 'font-weight: bold;', 'The language switcher is hidden! This can have one of the following reasons: \n * All additional languages are disabled in the "Langify -> Dashboard -> Languages" section. \n * If you are using different domains for your additional languages, ensure that "Cross Domain Links" are enabled inside the "Langify -> Dashboard -> Switcher Configurator -> Domains" section.'); 3688 return false;
3689 } 3690 3691 this.setCustomPosition(); 3692 this.initCustomDropdown(); 3693 this.bindCountrySwitchers(); 3694 this.bindCurrencySwitchers(); 3695 this.bindLanguageSwitchers(); 3696 3697 var event = new CustomEvent('langify.switcher.initialized', { 3698 bubbles: true, 3699 detail: {} 3700 }); 3701 } 3702 3703 initCustomDropdown() { 3704 // Custom Dropdown 3705 var root = this; 3706 var switcher = document.getElementsByClassName('ly-custom-dropdown-switcher'); 3707 for(var a = 0; a < switcher.length; a++) { 3708 switcher[a].classList.toggle('ly-is-open'); 3709 var isOut = LyHelper.isOutOfViewport(switcher[a]); 3710 if(isOut.bottom && isOut.inViewport) { 3711 switcher[a].classList.add('ly-is-dropup'); 3712 var arrows = switcher[a].querySelectorAll('.ly-arrow'); 3713 for(var b = 0; b < arrows.length; b++) { 3714 arrows[b].classList.add('ly-arrow-up'); 3715 } 3716 } 3717 switcher[a].classList.toggle('ly-is-open'); 3718 switcher[a].onclick = function(event) { 3719 root.toggleSwitcherOpen(this); 3720 } 3721 } 3722 3723 document.addEventListener('click', function(event) { 3724 if(!event.target.closest('.ly-custom-dropdown-switcher')) { 3725 var openSwitchers = document.querySelectorAll('.ly-custom-dropdown-switcher.ly-is-open') 3726 for(var i = 0; i < openSwitchers.length; i++) { 3727 openSwitchers[i].classList.remove('ly-is-open'); 3728 } 3729 } 3730 }); 3731 } 3732 3733 bindLanguageSwitchers() { 3734 var root = this; 3735 var links = document.getElementsByClassName('ly-languages-switcher-link'); 3736 for(var l = 0; l < links.length; l++) { 3737 3738 links[l].addEventListener('click', function(event) { 3739 event.preventDefault(); 3740 if(LyHelper.isDomainFeatureEnabled() && this.getAttribute('href') !== '#' && !this.getAttribute('data-country-code')) { 3741 var domain = this.getAttribute('href'); 3742 } 3743 LyHelper.setCookie('ly-lang-selected', this.getAttribute('data-language-code'), 365); 3744 LyHelper.localizationRedirect('language_code', this.getAttribute('data-language-code'), root._dataAttrToAdditionalFields(this), null, domain); 3745 }); 3746 } 3747 3748 // Native select event handling 3749 var nativeLangifySelects = document.querySelectorAll('select.ly-languages-switcher'); 3750 for(var i = 0; i < nativeLangifySelects.length; i++) { 3751 nativeLangifySelects[i].onchange = function() { 3752 event.preventDefault(); 3753 if(LyHelper.isDomainFeatureEnabled() && this[this.selectedIndex].getAttribute('data-domain') !== '#' && this[this.selectedIndex].getAttribute('data-country-code')) { 3754 var domain = this[this.selectedIndex].getAttribute('data-domain'); 3755 } 3756 LyHelper.setCookie('ly-lang-selected', this[this.selectedIndex].getAttribute('data-language-code'), 365); 3757 LyHelper.localizationRedirect('language_code', this[this.selectedIndex].getAttribute('data-language-code'), root._dataAttrToAdditionalFields(this), null, domain); 3758 }; 3759 } 3760 } 3761 3762 bindCountrySwitchers() { 3763 var countrySelectSwitcher = document.querySelectorAll('select.ly-country-switcher'); 3764 var countryCustomSwitcher = document.querySelectorAll('div.ly-country-switcher a'); 3765 for(var i=0; i<countryCustomSwitcher.length; i++) { 3766 countryCustomSwitcher[i].addEventListener('click', function(e) { 3767 LyHelper.localizationRedirect('country_code', this.getAttribute('data-country-code')); 3768 }); 3769 } 3770 for(var a=0; a<countrySelectSwitcher.length; a++) { 3771 countrySelectSwitcher[a].addEventListener('change', function(){ 3772 LyHelper.localizationRedirect('country_code', this[this.selectedIndex].getAttribute('data-country-code')); 3773 }); 3774 } 3775 } 3776 3777 bindCurrencySwitchers() { 3778 var currencySelectSwitcher = document.querySelectorAll('select.ly-currency-switcher'); 3779 var currencyCustomSwitcher = document.querySelectorAll('div.ly-currency-switcher a'); 3780 for(var i=0; i<currencyCustomSwitcher.length; i++) { 3781 currencyCustomSwitcher[i].addEventListener('click', function(e) { 3782 LyHelper.changeCurrency(this.getAttribute('data-currency-code')); 3783 }); 3784 } 3785 for(var a=0; a<currencySelectSwitcher.length; a++) { 3786 currencySelectSwitcher[a].addEventListener('change', function(){ 3787 LyHelper.changeCurrency(this[this.selectedIndex].getAttribute('data-currency-code')); 3788 }); 3789 } 3790 } 3791 3792 setCustomPosition() { 3793 for(var i = 0; i < this.switcherElements.length; i++) { 3794 if(this.lyForceOff !== 'true') { 3795 if(langify.locale.languages.length <= 1) { 3796 this.switcherElements[i].querySelector('.ly-languages-switcher').classList.add('ly-hide'); 3797 } 3798 this.switcherElements[i].classList.remove('ly-hide'); 3799 } 3800 if(this.switcherElements[i].classList.contains('ly-custom') && (document.getElementById('ly-custom-'+this.switcherElements[i].getAttribute('data-breakpoint')) || document.getElementsByClassName('ly-custom-'+this.switcherElements[i].getAttribute('data-breakpoint')).length )) { 3801 var targets = Array.from(document.getElementsByClassName('ly-custom-'+this.switcherElements[i].getAttribute('data-breakpoint'))); 3802 var target = document.getElementById('ly-custom-'+this.switcherElements[i].getAttribute('data-breakpoint')); 3803 if(target) targets.push(target); 3804 for(var c = 0; c < targets.length; c++) { 3805 var clone = this.switcherElements[i].cloneNode(true); 3806 this.switcherElements[i].remove(); 3807 targets[c].innerHTML = clone.outerHTML; 3808 } 3809 this.switcherElements[i].classList.add('ly-hide'); 3810 } 3811 } 3812 } 3813 3814 toggleSwitcherOpen(e) { 3815 var target = e; 3816 if(!target.classList.contains('ly-is-open')) { 3817 var openSwitchers = document.querySelectorAll('.ly-custom-dropdown-switcher.ly-is-open') 3818 for(var i = 0; i < openSwitchers.length; i++) { 3819 openSwitchers[i].classList.remove('ly-is-open'); 3820 } 3821 3822 target.getElementsByClassName('ly-custom-dropdown-current')[0].setAttribute('aria-expanded', 'true'); 3823 } else { 3824 target.getElementsByClassName('ly-custom-dropdown-current')[0].setAttribute('aria-expanded', 'false'); 3825 } 3826 target.classList.toggle('ly-is-open'); 3827 var isOut = LyHelper.isOutOfViewport(target); 3828 if(isOut.bottom) { 3829 target.classList.add('ly-is-dropup'); 3830 } 3831 } 3832 3833 togglePopupOpen(e) { 3834 e.closest('.ly-popup-switcher').classList.toggle('ly-is-open'); 3835 } 3836 3837 _getCountryCodeFromHreflang(language_code) { 3838 var hreflangTags = document.querySelectorAll('link[hreflang]'); 3839 var languageDomains = {}; 3840 var countryCode = false;
3841 for(var i = 0; i < hreflangTags.length; i++) { 3842 if(hreflangTags[i].getAttribute('hreflang').indexOf(language_code) === 0) { 3843 if(!languageDomains[hreflangTags[i].getAttribute('href')]) { 3844 languageDomains[hreflangTags[i].getAttribute('href')] = hreflangTags[i]; 3845 } 3846 } 3847 } 3848 if(Object.keys(languageDomains).length > 0) { 3849 countryCode = Object.values(languageDomains)[0].getAttribute('hreflang'); 3850 countryCode = countryCode.split('-'); 3851 if(countryCode[1]) { 3852 countryCode = countryCode[1] 3853 } else { 3854 3855 } 3856 } 3857 return countryCode; 3858 } 3859 3860 _dataAttrToAdditionalFields(elem) { 3861 var additionalFields = []; 3862 if(elem.hasAttribute('data-country-code')) { 3863 additionalFields.push({ 3864 name: 'country_code', 3865 value: elem.getAttribute('data-country-code') 3866 }); 3867 } 3868 if(elem.hasAttribute('data-currency-code')) { 3869 additionalFields.push({ 3870 name: 'currency_code', 3871 value: elem.getAttribute('data-currency-code') 3872 }); 3873 } 3874 return additionalFields; 3875 } 3876 } 3877 3878 3879 /** 3880 * 3881 * 3882 * @class LanguageDetection 3883 */ 3884 class LanguageDetection { 3885 3886 constructor() { 3887 this.hreflangList = null; 3888 LyHelper.log('LanguageDetection instantiation'); 3889 } 3890 3891 init() { 3892 if(LyHelper.inIframe() 3893 || window.location.pathname.indexOf('preview_key=') > 0) { 3894 return null; 3895 } 3896 3897 var currentLang = langify.locale.iso_code.toLowerCase(); 3898 //var localizationData = this.getLocalizationData(); 3899 this.hreflangList = this.getHreflangList(); 3900 3901 var userLang = navigator.language || navigator.userLanguage; 3902 userLang = userLang.toLowerCase(); 3903 var bot = /bot|google|baidu|bing|msn|duckduckbot|teoma|slurp|yandex|Chrome-Lighthouse/i.test(navigator.userAgent); 3904 var blockedRoutes = window.lyBlockedRoutesList || []; 3905 var blockedRoute = blockedRoutes.find(x => window.location.pathname.indexOf(x) === 0); 3906 var is404 = document.getElementsByClassName('template-404').length; 3907 3908 if(LyHelper.getVal('redirected') === 'true') { 3909 LyHelper.setCookie('ly-lang-selected', currentLang, 365); 3910 var _href = window.location.href; 3911 history.replaceState(null, '', _href.replace(/(\?|&)(redirected=true)/i, '')); 3912 return null; 3913 } 3914 3915 if(!is404 && !bot && !blockedRoute && LyHelper.getVal('ly-lang-detect') !== 'off') { 3916 if(userLang && !LyHelper.getCookie('ly-lang-selected')) { 3917 var hasMatch = this.matchHreflangList(userLang); 3918 if(currentLang !== this._hreflangToLanguageCode(hasMatch)) { 3919 if(hasMatch) { 3920 this.redirectMatched(userLang); 3921 } else if (!hasMatch && langify.settings.switcher.languageDetectionDefault) { 3922 // Redirect to default language 3923 this.redirectMatched(langify.settings.switcher.languageDetectionDefault); 3924 } 3925 } 3926 } else { 3927 if(LyHelper.getCookie('ly-lang-selected') && LyHelper.getCookie('ly-lang-selected') !== currentLang) { 3928 // Only save cookie when the domain feature is active 3929 if(LyHelper.isDomainFeatureEnabled()) { 3930 LyHelper.setCookie('ly-lang-selected', currentLang, 365); 3931 } 3932 this.redirectMatched(LyHelper.getCookie('ly-lang-selected')); 3933 } 3934 } 3935 } 3936 3937 this._geolocationAppSupport(); 3938 } 3939 redirectMatched(userLang) { 3940 var match = this.matchHreflangList(userLang); 3941 if(match) { 3942 this.redirectHref(match.href, match.lang); 3943 } 3944 return match; 3945 } 3946 matchHreflangList(userLang) { 3947 var matchedHreflang = false; 3948 var browserLang = userLang; 3949 3950 // Find candidates 3951 var candidates = this.hreflangList.filter(item => item.lang === browserLang); 3952 if(candidates.length === 0) { 3953 browserLang = userLang.toLowerCase(); 3954 candidates = this.hreflangList.filter(item => item.lang.toLowerCase().indexOf(browserLang) === 0); 3955 } 3956 if(candidates.length === 0) { 3957 browserLang = userLang.toLowerCase().substring(0, 2); 3958 candidates = this.hreflangList.filter(item => item.lang.toLowerCase().indexOf(browserLang) === 0); 3959 } 3960 3961 // Handle candidates 3962 if(candidates.length === 1) { 3963 return({href: candidates[0].href, lang: browserLang}); 3964 } 3965 else if(candidates.length > 1) { 3966 var preferedCandidate = candidates.find(item => item.href.indexOf(window.location.host) >= 0) 3967 if(preferedCandidate) { 3968 return({href: preferedCandidate.href, lang: browserLang}); 3969 } else { 3970 return({href: candidates[0].href, lang: browserLang}); 3971 } 3972 } 3973 3974 return false;
3975 } 3976 redirectHref(href, userLang) { 3977 var queryString = window.location.search; 3978 var url = href.split('?')[0]; 3979 if(queryString === '') { 3980 queryString = '?redirected=true'; 3981 } else { 3982 queryString += '&redirected=true'; 3983 } 3984 window.location.replace(url + queryString); 3985 } 3986 getHreflangList() { 3987 var hreflangTags = document.querySelectorAll('link[hreflang]'); 3988 var hreflangList = []; 3989 var countryCode = false; 3990 // Cross Domain Links option 3991 if(LyHelper.isDomainFeatureEnabled()) { 3992 for(var i = 0; i < langify.locale.languages.length; i++) { 3993 let newHref = 'https://' + langify.locale.languages[i].domain + window.location.pathname + window.location.search + window.location.hash; 3994 // When cross-domain link is pointing to the same domain with subfolders, window.location.pathname would have to be unlocalized before it can be merged into the url 3995 if(new String(langify.locale.languages[i].domain).indexOf(window.location.hostname) === 0) { 3996 let unlocalizedPathname = langify.locale.root_url !== '/' ? window.location.pathname.replace(langify.locale.root_url, '') : window.location.pathname; 3997 newHref = 'https://' + langify.locale.languages[i].domain + unlocalizedPathname + window.location.search + window.location.hash 3998 } 3999 hreflangList.push({ 4000 href: newHref, 4001 lang: langify.locale.languages[i].iso_code, 4002 }); 4003 } 4004 } 4005 for(var i = 0; i < hreflangTags.length; i++) { 4006 var hreflang = hreflangTags[i].getAttribute('hreflang').toLowerCase(); 4007 hreflang = hreflang.replace('zh-hans', 'zh-cn').replace('zh-hant', 'zh-tw'); // Chinese special cases 4008 hreflangList.push({ 4009 href: hreflangTags[i].getAttribute('href'), 4010 lang: hreflang 4011 }); 4012 } 4013 return hreflangList; 4014 } 4015 _langToHreflang(userLang) { 4016 var hreflang = ''; 4017 this.hreflangList.map(function(item) { 4018 if(item.lang === userLang) { 4019 hreflang = userLang; 4020 } 4021 }); 4022 if(hreflang === '') { 4023 this.hreflangList.map(function(item) { 4024 var browserLang = userLang.toLowerCase(); 4025 if(item.lang.toLowerCase().indexOf(browserLang) === 0) { 4026 hreflang = browserLang; 4027 } 4028 else if(item.lang.toLowerCase().indexOf(browserLang.substring(0, 2)) === 0) { 4029 hreflang = browserLang.substring(0, 2); 4030 } 4031 }); 4032 } 4033 return hreflang || userLang; 4034 } 4035 _hreflangToLanguageCode(hreflangTag) { 4036 if(!hreflangTag || !hreflangTag.lang) return false; 4037 var languageCode = false;
4038 langify.locale.languages.forEach(function(item) { 4039 if(item.iso_code.toLowerCase() === hreflangTag.lang.toLowerCase()) { 4040 languageCode = item.iso_code; 4041 } 4042 }); 4043 if(!languageCode) { 4044 langify.locale.languages.forEach(function(item) { 4045 if(item.iso_code.toLowerCase() === hreflangTag.lang.substring(0, 2).toLowerCase()) { 4046 languageCode = item.iso_code; 4047 } 4048 }); 4049 } 4050 return languageCode; 4051 } 4052 _geolocationAppSupport() { 4053 var target = document.querySelector('body'); 4054 var config = { childList: true, subtree: true }; 4055 var geolocationObserver = new MutationObserver(function(mutations) { 4056 mutations.forEach(function(mutation) { 4057 if (mutation.type === 'childList' && mutation.addedNodes.length > 0) { 4058 var target = mutation.target.getElementsByClassName('locale-bar__form'); 4059 if(target[0]) { 4060 target[0].onsubmit = function() { 4061 var locale_code = target[0].elements['locale_code'].value; 4062 var selector = target[0].getElementsByClassName('locale-bar__selector'); 4063 if(selector.length >= 1) { 4064 locale_code = selector[0].options[selector[0].selectedIndex].value; 4065 } 4066 LyHelper.setCookie('ly-lang-selected', locale_code, 365); 4067 }; 4068 } 4069 var selectors = mutation.target.getElementsByClassName('locale-selectors__selector'); 4070 if(selectors.length > 0) { 4071 for(var selector of selectors) { 4072 if(selector.getAttribute('name') === 'locale_code') { 4073 selector.onchange = function() { 4074 var locale_code = selector.options[selector.selectedIndex].value; 4075 LyHelper.setCookie('ly-lang-selected', locale_code, 365); 4076 }; 4077 } 4078 } 4079 } 4080 } 4081 }); 4082 }); 4083 geolocationObserver.observe(target, config); 4084 setTimeout(function() { 4085 geolocationObserver.disconnect(); 4086 }, 10000); 4087 } 4088 } 4089 4090 4091 /** 4092 * 4093 * 4094 * @class Recommendation 4095 */ 4096 class Recommendation extends LanguageDetection { 4097 4098 constructor() { 4099 super(); 4100 LyHelper.log('Recommendation instantiation'); 4101 } 4102 4103 init() { 4104 this.hreflangList = this.getHreflangList(); 4105 4106 var userLang = navigator.language || navigator.userLanguage; 4107 userLang = userLang.toLowerCase(); 4108 4109 var recommendation = this.matchHreflangList(userLang); 4110 var recommendationLanguageCode = this._hreflangToLanguageCode(recommendation); 4111 if(recommendationLanguageCode && recommendationLanguageCode !== langify.locale.iso_code && !LyHelper.getCookie('ly-lang-selected')) { 4112 this.recommended_language_code = recommendationLanguageCode; 4113 this.recommended_country_code = null; 4114 this.recommended_currency_code = null; 4115 this._translateStrings(recommendationLanguageCode); 4116 this._bindings(); 4117 } else { 4118 return false; 4119 } 4120 } 4121 4122 _translateStrings(languageCode) { 4123 var recommendationElement = document.querySelectorAll('.ly-recommendation')[0]; 4124 var strings = langify.settings.switcher.recommendation_strings[languageCode]; 4125 var recommendationStr = 'Looks like your browser is set to [[language]]. Change the language?'; 4126 var buttonStr = 'Change'; 4127 var matchedLanguageCode = this._langToHreflang(languageCode).toLowerCase(); 4128 var languageStr = langify.settings.switcher.languages.find(x => x.iso_code.toLowerCase() === matchedLanguageCode) ? langify.settings.switcher.languages.find(x => x.iso_code.toLowerCase() === matchedLanguageCode).name : languageCode.toUpperCase(); 4129 if(strings) { 4130 recommendationStr = strings.recommendation ? strings.recommendation : recommendationStr; 4131 buttonStr = strings.button ? strings.button : buttonStr; 4132 languageStr = strings.language ? strings.language : languageStr; 4133 } 4134 var newCode = recommendationElement.innerHTML;
4135 newCode = newCode.replaceAll('[[recommendation]]', recommendationStr).replaceAll('[[button]]', buttonStr).replaceAll('[[language]]', languageStr); 4136 recommendationElement.innerHTML = newCode; 4137 } 4138 4139 _bindings() { 4140 var _this = this; 4141 var lyForceOff = location.search.split('ly-force-off=')[1]; 4142 var recommendationElement = document.querySelectorAll('.ly-recommendation')[0]; 4143 var form = recommendationElement.querySelectorAll('.ly-recommendation-form')[0]; 4144 var links = recommendationElement.getElementsByClassName('ly-custom-dropdown-list-element'); 4145 var customDropdown = recommendationElement.querySelectorAll('.ly-custom-dropdown-switcher'); 4146 var nativeSelects = recommendationElement.getElementsByClassName('ly-native-select'); 4147 4148 form.addEventListener('submit', function(e) { 4149 e.preventDefault(); 4150 4151 if(_this.recommended_country_code || _this.recommended_currency_code) { 4152 // When a country or currency is involved, use old redirection 4153 var additionalFields = []; 4154 if(_this.recommended_country_code) { 4155 additionalFields.push({ 4156 name: 'country_code', 4157 value: _this.recommended_country_code 4158 }); 4159 } 4160 if(_this.recommended_currency_code) { 4161 additionalFields.push({ 4162 name: 'currency_code', 4163 value: _this.recommended_currency_code 4164 }); 4165 } 4166 LyHelper.setCookie('ly-lang-selected', _this.recommended_language_code, 365); 4167 LyHelper.localizationRedirect('language_code', _this.recommended_language_code, additionalFields); 4168 } else { 4169 //...or use new hreflang redirection 4170 _this.redirectMatched(_this.recommended_language_code); 4171 } 4172 }); 4173 4174 // Overwrite switchers 4175 for(var l = 0; l < links.length; l++) { 4176 links[l].addEventListener('click', function(event) { 4177 event.preventDefault(); 4178 4179 // When clicked from within a custom dropdown 4180 var parentCustomDropdown = event.currentTarget.closest('.ly-custom-dropdown-switcher'); 4181 if(parentCustomDropdown) { 4182 _this._selectCustomDropdownEntry(parentCustomDropdown, this); 4183 } else { 4184 _this.recommended_language_code = this.getAttribute('data-language-code'); 4185 } 4186 }); 4187 } 4188 4189 for(var i = 0; i < nativeSelects.length; i++) { 4190 nativeSelects[i].onchange = _this._selectNativeDropdownEntry.bind(this); 4191 4192 if(nativeSelects[i].classList.contains('ly-languages-switcher')) { 4193 nativeSelects[i].value = _this.recommended_language_code; 4194 } 4195 } 4196 4197 for(var i = 0; i < customDropdown.length; i++) { 4198 if(recommendationElement.className.indexOf('bottom') > -1) { 4199 customDropdown[i].classList.add('ly-is-dropup'); 4200 } 4201 4202 if(customDropdown[i].classList.contains('ly-languages-switcher')) { 4203 _this._selectCustomDropdownEntry(customDropdown[i], customDropdown[i].querySelector('.ly-custom-dropdown-list a[data-language-code="'+ _this.recommended_language_code +'"]')); 4204 } 4205 } 4206 if(!lyForceOff) { 4207 recommendationElement.classList.add('ly-is-open'); 4208 } 4209 } 4210 4211 _selectNativeDropdownEntry(event) { 4212 event.preventDefault(); 4213 var element = event.currentTarget; 4214 var _this = this; 4215 4216 if(element[element.selectedIndex].hasAttribute('data-language-code')) { 4217 _this.recommended_language_code = element[element.selectedIndex].getAttribute('data-language-code'); 4218 } 4219 if(element[element.selectedIndex].hasAttribute('data-country-code')) { 4220 _this.recommended_country_code = element[element.selectedIndex].getAttribute('data-country-code'); 4221 } 4222 if(element[element.selectedIndex].hasAttribute('data-currency-code')) { 4223 _this.recommended_currency_code = element[element.selectedIndex].getAttribute('data-currency-code'); 4224 } 4225 } 4226 4227 _selectCustomDropdownEntry(element, entry) { 4228 if(!entry) return; 4229 var _this = this; 4230 var currentElem = element.querySelector('.ly-custom-dropdown-current'); 4231 var currentIcon = currentElem.querySelector('.ly-icon'); 4232 var currentLabel = currentElem.querySelector('span'); 4233 var valueToSelect = ''; 4234 4235 if(entry.hasAttribute('data-language-code')) { 4236 _this.recommended_language_code = entry.getAttribute('data-language-code'); 4237 valueToSelect = _this.recommended_language_code; 4238 } 4239 if(entry.hasAttribute('data-country-code')) { 4240 _this.recommended_country_code = entry.getAttribute('data-country-code'); 4241 valueToSelect = _this.recommended_country_code; 4242 } 4243 if(entry.hasAttribute('data-currency-code')) { 4244 _this.recommended_currency_code = entry.getAttribute('data-currency-code'); 4245 valueToSelect = _this.recommended_currency_code; 4246 } 4247 if(entry.hasAttribute('data-country-code') && entry.hasAttribute('data-currency-code')) { 4248 valueToSelect = _this.recommended_country_code + '-' + _this.recommended_currency_code; 4249 } 4250 4251 if(element.querySelector('.ly-custom-dropdown-list li.current')) { 4252 element.querySelector('.ly-custom-dropdown-list li.current').classList.remove('current'); 4253 element.querySelector('.ly-custom-dropdown-list li[key="'+ valueToSelect +'"]').classList.add('current'); 4254 } 4255 if(element.querySelector('.ly-custom-dropdown-list li.current span')) currentLabel.innerHTML = element.querySelector('.ly-custom-dropdown-list li.current span').innerHTML; 4256 if(element.querySelector('.ly-custom-dropdown-list li.current .ly-icon')) currentIcon.classList = element.querySelector('.ly-custom-dropdown-list li.current .ly-icon').classList; 4257 } 4258 4259 toggleOpen(e) { 4260 e.closest('.ly-recommendation').classList.toggle('ly-is-open'); 4261 if(!e.closest('.ly-recommendation').classList.contains('ly-is-open')) { 4262 LyHelper.setCookie('ly-lang-selected', this.recommended_language_code, 365); 4263 } 4264 } 4265 } 4266 4267 4268 /** 4269 * 4270 * 4271 * @class Langify 4272 */ 4273 class Langify { 4274 constructor(settings, locale) { 4275 LyHelper.log('Langify instantiation') 4276 4277 var translationObserver = new TranslationObserver().init(); 4278 4279 langify.helper = new LyHelper(); 4280 LyHelper.log(langify.helper); 4281 4282 4283 var lyForceOff = location.search.split('ly-force-off=')[1]; 4284 if(lyForceOff === 'true') { 4285 document.getElementById('preview-bar-iframe').classList.add('ly-hide'); 4286 return false;
4287 } 4288 4289 if(settings.theme && ((settings.theme.loadJquery && settings.theme.loadJquery === true) || typeof settings.theme.loadJquery === 'undefined')) { 4290 if(typeof jQuery === 'undefined') { 4291 LyHelper.loadScript('//cdn.jsdelivr.net/jquery/1.9.1/jquery.min.js', function() {}); 4292 } 4293 } 4294 4295 //document.addEventListener("DOMContentLoaded", function() { 4296 langify.switcher = new Switcher(); 4297 langify.switcher.init(); 4298 4299 if(settings.switcher) { 4300 if(settings.switcher.recommendation && settings.switcher.recommendation_enabled) { 4301 langify.recommendation = new Recommendation(); 4302 langify.recommendation.init(); 4303 } else { 4304 if(settings.switcher.languageDetection) { 4305 langify.languageDetection = new LanguageDetection(); 4306 langify.languageDetection.init(); 4307 } 4308 } 4309 } 4310 //}); 4311 } 4312 } 4313 4314 // Polyfills 4315 (function(){var t;null==window.MutationObserver&&(t=function(){function t(t){this.callBack=t}return t.prototype.observe=function(t,n){return this.element=t,this.interval=setInterval((e=this,function(){var t;if((t=e.element.innerHTML)!==e.oldHtml)return e.oldHtml=t,e.callBack.apply(null)}),200);var e},t.prototype.disconnect=function(){return window.clearInterval(this.interval)},t}(),window.MutationObserver=t)}).call(this); 4316 !function(){"use strict";if("object"==typeof window)if("IntersectionObserver"in window&&"IntersectionObserverEntry"in window&&"intersectionRatio"in window.IntersectionObserverEntry.prototype)"isIntersecting"in window.IntersectionObserverEntry.prototype||Object.defineProperty(window.IntersectionObserverEntry.prototype,"isIntersecting",{get:function(){return this.intersectionRatio>0}});else{var t=function(t){for(var e=window.document,o=i(e);o;)o=i(e=o.ownerDocument);return e}(),e=[],o=null,n=null;s.prototype.THROTTLE_TIMEOUT=100,s.prototype.POLL_INTERVAL=null,s.prototype.USE_MUTATION_OBSERVER=!0,s._setupCrossOriginUpdater=function(){return o||(o=function(t,o){n=t&&o?l(t,o):{top:0,bottom:0,left:0,right:0,width:0,height:0},e.forEach(function(t){t._checkForIntersections()})}),o},s._resetCrossOriginUpdater=function(){o=null,n=null},s.prototype.observe=function(t){if(!this._observationTargets.some(function(e){return e.element==t})){if(!t||1!=t.nodeType)throw new Error("target must be an Element");this._registerInstance(),this._observationTargets.push({element:t,entry:null}),this._monitorIntersections(t.ownerDocument),this._checkForIntersections()}},s.prototype.unobserve=function(t){this._observationTargets=this._observationTargets.filter(function(e){return e.element!=t}),this._unmonitorIntersections(t.ownerDocument),0==this._observationTargets.length&&this._unregisterInstance()},s.prototype.disconnect=function(){this._observationTargets=[],this._unmonitorAllIntersections(),this._unregisterInstance()},s.prototype.takeRecords=function(){var t=this._queuedEntries.slice();return this._queuedEntries=[],t},s.prototype._initThresholds=function(t){var e=t||[0];return Array.isArray(e)||(e=[e]),e.sort().filter(function(t,e,o){if("number"!=typeof t||isNaN(t)||t<0||t>1)throw new Error("threshold must be a number between 0 and 1 inclusively");return t!==o[e-1]})},s.prototype._parseRootMargin=function(t){var e=(t||"0px").split(/\s+/).map(function(t){var e=/^(-?\d*\.?\d+)(px|%)$/.exec(t);if(!e)throw new Error("rootMargin must be specified in pixels or percent");return{value:parseFloat(e[1]),unit:e[2]}});return e[1]=e[1]||e[0],e[2]=e[2]||e[0],e[3]=e[3]||e[1],e},s.prototype._monitorIntersections=function(e){var o=e.defaultView;if(o&&-1==this._monitoringDocuments.indexOf(e)){var n=this._checkForIntersections,r=null,s=null;this.POLL_INTERVAL?r=o.setInterval(n,this.POLL_INTERVAL):(h(o,"resize",n,!0),h(e,"scroll",n,!0),this.USE_MUTATION_OBSERVER&&"MutationObserver"in o&&(s=new o.MutationObserver(n)).observe(e,{attributes:!0,childList:!0,characterData:!0,subtree:!0})),this._monitoringDocuments.push(e),this._monitoringUnsubscribes.push(function(){var t=e.defaultView;t&&(r&&t.clearInterval(r),c(t,"resize",n,!0)),c(e,"scroll",n,!0),s&&s.disconnect()});var u=this.root&&(this.root.ownerDocument||this.root)||t;if(e!=u){var a=i(e);a&&this._monitorIntersections(a.ownerDocument)}}},s.prototype._unmonitorIntersections=function(e){var o=this._monitoringDocuments.indexOf(e);if(-1!=o){var n=this.root&&(this.root.ownerDocument||this.root)||t;if(!this._observationTargets.some(function(t){var o=t.element.ownerDocument;if(o==e)return!0;for(;o&&o!=n;){var r=i(o);if((o=r&&r.ownerDocument)==e)return!0}return!1})){var r=this._monitoringUnsubscribes[o];if(this._monitoringDocuments.splice(o,1),this._monitoringUnsubscribes.splice(o,1),r(),e!=n){var s=i(e);s&&this._unmonitorIntersections(s.ownerDocument)}}}},s.prototype._unmonitorAllIntersections=function(){var t=this._monitoringUnsubscribes.slice(0);this._monitoringDocuments.length=0,this._monitoringUnsubscribes.length=0;for(var e=0;e<t.length;e++)t[e]()},s.prototype._checkForIntersections=function(){if(this.root||!o||n){var t=this._rootIsInDom(),e=t?this._getRootRect():{top:0,bottom:0,left:0,right:0,width:0,height:0};
4316this._observationTargets.forEach(function(n){var i=n.element,s=u(i),h=this._rootContainsTarget(i),c=n.entry,a=t&&h&&this._computeTargetAndRootIntersection(i,s,e),l=null;this._rootContainsTarget(i)?o&&!this.root||(l=e):l={top:0,bottom:0,left:0,right:0,width:0,height:0};var f=n.entry=new r({time:window.performance&&performance.now&&performance.now(),target:i,boundingClientRect:s,rootBounds:l,intersectionRect:a});c?t&&h?this._hasCrossedThreshold(c,f)&&this._queuedEntries.push(f):c&&c.isIntersecting&&this._queuedEntries.push(f):this._queuedEntries.push(f)},this),this._queuedEntries.length&&this._callback(this.takeRecords(),this)}},s.prototype._computeTargetAndRootIntersection=function(e,i,r){if("none"!=window.getComputedStyle(e).display){for(var s,h,c,a,f,d,g,m,v=i,_=p(e),b=!1;!b&&_;){var w=null,y=1==_.nodeType?window.getComputedStyle(_):{};if("none"==y.display)return null;if(_==this.root||9==_.nodeType)if(b=!0,_==this.root||_==t)o&&!this.root?!n||0==n.width&&0==n.height?(_=null,w=null,v=null):w=n:w=r;else{var I=p(_),E=I&&u(I),T=I&&this._computeTargetAndRootIntersection(I,E,r);E&&T?(_=I,w=l(E,T)):(_=null,v=null)}else{var R=_.ownerDocument;_!=R.body&&_!=R.documentElement&&"visible"!=y.overflow&&(w=u(_))}if(w&&(s=w,h=v,c=void 0,a=void 0,f=void 0,d=void 0,g=void 0,m=void 0,c=Math.max(s.top,h.top),a=Math.min(s.bottom,h.bottom),f=Math.max(s.left,h.left),d=Math.min(s.right,h.right),m=a-c,v=(g=d-f)>=0&&m>=0&&{top:c,bottom:a,left:f,right:d,width:g,height:m}||null),!v)break;_=_&&p(_)}return v}},s.prototype._getRootRect=function(){var e;if(this.root&&!d(this.root))e=u(this.root);else{var o=d(this.root)?this.root:t,n=o.documentElement,i=o.body;e={top:0,left:0,right:n.clientWidth||i.clientWidth,width:n.clientWidth||i.clientWidth,bottom:n.clientHeight||i.clientHeight,height:n.clientHeight||i.clientHeight}}return this._expandRectByRootMargin(e)},s.prototype._expandRectByRootMargin=function(t){var e=this._rootMarginValues.map(function(e,o){return"px"==e.unit?e.value:e.value*(o%2?t.width:t.height)/100}),o={top:t.top-e[0],right:t.right+e[1],bottom:t.bottom+e[2],left:t.left-e[3]};return o.width=o.right-o.left,o.height=o.bottom-o.top,o},s.prototype._hasCrossedThreshold=function(t,e){var o=t&&t.isIntersecting?t.intersectionRatio||0:-1,n=e.isIntersecting?e.intersectionRatio||0:-1;if(o!==n)for(var i=0;i<this.thresholds.length;i++){var r=this.thresholds[i];if(r==o||r==n||r<o!=r<n)return!0}},s.prototype._rootIsInDom=function(){return!this.root||f(t,this.root)},s.prototype._rootContainsTarget=function(e){var o=this.root&&(this.root.ownerDocument||this.root)||t;return f(o,e)&&(!this.root||o==e.ownerDocument)},s.prototype._registerInstance=function(){e.indexOf(this)<0&&e.push(this)},s.prototype._unregisterInstance=function(){var t=e.indexOf(this);-1!=t&&e.splice(t,1)},window.IntersectionObserver=s,window.IntersectionObserverEntry=r}function i(t){try{return t.defaultView&&t.defaultView.frameElement||null}catch(t){return null}}function r(t){this.time=t.time,this.target=t.target,this.rootBounds=a(t.rootBounds),this.boundingClientRect=a(t.boundingClientRect),this.intersectionRect=a(t.intersectionRect||{top:0,bottom:0,left:0,right:0,width:0,height:0}),this.isIntersecting=!!t.intersectionRect;var e=this.boundingClientRect,o=e.width*e.height,n=this.intersectionRect,i=n.width*n.height;this.intersectionRatio=o?Number((i/o).toFixed(4)):this.isIntersecting?1:0}function s(t,e){var o,n,i,r=e||{};if("function"!=typeof t)throw new Error("callback must be a function");if(r.root&&1!=r.root.nodeType&&9!=r.root.nodeType)throw new Error("root must be a Document or Element");this._checkForIntersections=(o=this._checkForIntersections.bind(this),n=this.THROTTLE_TIMEOUT,i=null,function(){i||(i=setTimeout(function(){o(),i=null},n))}),this._callback=t,this._observationTargets=[],this._queuedEntries=[],this._rootMarginValues=this._parseRootMargin(r.rootMargin),this.thresholds=this._initThresholds(r.threshold),this.root=r.root||null,this.rootMargin=this._rootMarginValues.map(function(t){return t.value+t.unit}).join(" "),this._monitoringDocuments=[],this._monitoringUnsubscribes=[]}function h(t,e,o,n){"function"==typeof t.addEventListener?t.addEventListener(e,o,n||!1):"function"==typeof t.attachEvent&&t.attachEvent("on"+e,o)}function c(t,e,o,n){"function"==typeof t.removeEventListener?t.removeEventListener(e,o,n||!1):"function"==typeof t.detatchEvent&&t.detatchEvent("on"+e,o)}function u(t){var e;try{e=t.getBoundingClientRect()}catch(t){}return e?(e.width&&e.height||(e={top:e.top,right:e.right,bottom:e.bottom,left:e.left,width:e.right-e.left,height:e.bottom-e.top}),e):{top:0,bottom:0,left:0,right:0,width:0,height:0}}function a(t){return!t||"x"in t?t:{top:t.top,y:t.top,bottom:t.bottom,left:t.left,x:t.left,right:t.right,width:t.width,height:t.height}}function l(t,e){var o=e.top-t.top,n=e.left-t.left;return{top:o,left:n,height:e.height,width:e.width,bottom:o+e.height,right:n+e.width}}function f(t,e){for(var o=e;o;){if(o==t)return!0;o=p(o)}return!1}function p(e){var o=e.parentNode;return 9==e.nodeType&&e!=t?i(e):(o&&o.assignedSlot&&(o=o.assignedSlot.parentNode),o&&11==o.nodeType&&o.host?o.host:o)}function d(t){return t&&9===t.nodeType}}(); 4317 !function(){if("function"==typeof window.CustomEvent)return!1;window.CustomEvent=function(n,t){t=t||{bubbles:!1,cancelable:!1,detail:null};var e=document.createEvent("CustomEvent");return e.initCustomEvent(n,t.bubbles,t.cancelable,t.detail),e}}(); 4318 4319 var langify = window.langify || {}; 4320 var customContents = {}; 4321 var customContents_image = {}; 4322 var langifySettingsOverwrites = {}; 4323 var defaultSettings = { 4324 debug: false, // BOOL : Enable/disable console logs 4325 observe: true, // BOOL : Enable/disable the entire mutation observer (off switch) 4326 observeLinks: false, 4327 observeImages: true, 4328 observeCustomContents: true, 4329 maxMutations: 5, 4330 timeout: 100, // INT : Milliseconds to wait after a mutation, before the next mutation event will be allowed for the element 4331 linksBlacklist: [], 4332 }; 4333 4334 if(langify.settings) { 4335 langifySettingsOverwrites = Object.assign({}, langify.settings); 4336 langify.settings = Object.assign(defaultSettings, langify.settings); 4337 } else { 4338 langify.settings = defaultSettings; 4339 } 4340 4341 langify.settings.theme = null; 4342 langify.settings.switcher = null; 4343 4344 langify.locale = langify.locale || { 4345 primary: true, 4346 iso_code: "en", 4347 root_url: "\/", 4348 language_id: "ly176949", 4349 shop_url: "https:\/\/horror-vacui.com", 4350 domain_feature_enabled: null, 4351 languages: [{ 4352 iso_code: "en", 4353 root_url: "\/", 4354 domain: null, 4355 },],}; 4356 4357 // Disable link correction ALWAYS on languages with mapped domains 4358 4359 if(langify.locale.root_url == '/') { 4360 langify.settings.observeLinks = false;
4361 } 4362 4363 window.addEventListener('DOMContentLoaded', function() { 4364 langify.helper = new LyHelper(); 4365 4366 // Custom Contents Section 4367 4368 // Images Section 4369 4370 4371 4372 var langifyInstance = new Langify(langify.settings, langify.locale); 4373 }); 4374</script>
4374 4375<div data-breakpoint="" class="ly-switcher-wrapper ly-breakpoint-1 fixed bottom_right ly-hide" style="font-size: 14px; margin: 0px 0px; "><div data-dropup="false" onclick="langify.switcher.toggleSwitcherOpen(this)" class="ly-languages-switcher ly-custom-dropdown-switcher ly-bright-theme" style=" margin: 0px 0px;"> 4376 <span role="button" tabindex="0" aria-label="Selected language: English" aria-expanded="false" aria-controls="languagesSwitcherList-1" class="ly-custom-dropdown-current" style="background: #ffffff; color: #000000; "><i class="ly-icon ly-flag-icon ly-flag-icon-en "></i><span class="ly-custom-dropdown-current-inner ly-custom-dropdown-current-inner-text">English</span> 4377<div aria-hidden="true" class="ly-arrow ly-arrow-black stroke" style="vertical-align: middle; width: 14.0px; height: 14.0px;"> 4378 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14.0 14.0" height="14.0px" width="14.0px" style="position: absolute;"> 4379 <path d="M1 4.5 L7.0 10.5 L13.0 4.5" fill="transparent" stroke="#000000" stroke-width="1px"/> 4380 </svg> 4381 </div> 4382 </span> 4383 <ul id="languagesSwitcherList-1" role="list" class="ly-custom-dropdown-list ly-is-open ly-bright-theme" style="background: #ffffff; color: #000000; "><li key="en" class="current" style="color: #000000; margin: 0px 0px;" tabindex="-1"> 4384 <a class="ly-custom-dropdown-list-element ly-languages-switcher-link ly-bright-theme current_lang" 4385 href="#" 4386 data-language-code="en" 4387 4388 data-ly-locked="true"><i class="ly-icon ly-flag-icon ly-flag-icon-en"></i><span class="ly-custom-dropdown-list-element-right">English</span></a> 4389 </li></ul> 4390 </div></div> 4391<style> 4392 4393 4394 .ly-flag-icon-en { background-image: url('//horror-vacui.com/cdn/shop/t/26/assets/ly-icon-e
4394n.svg?v=168749326791323067301728237194'); } 4395 4396 .ly-switcher-wrapper { 4397 4398 } 4399 .ly-switcher-wrapper.fixed { 4400 position: fixed; 4401 z-index: 1000; 4402 } 4403 .ly-switcher-wrapper.absolute { 4404 position: absolute; 4405 z-index: 1000; 4406 } 4407 .ly-switcher-wrapper.fixed.top_left, 4408 .ly-switcher-wrapper.absolute.top_left { 4409 top: 0; 4410 left: 0; 4411 } 4412 .ly-switcher-wrapper.fixed.top_right, 4413 .ly-switcher-wrapper.absolute.top_right { 4414 top: 0; 4415 right: 0; 4416 } 4417 .ly-switcher-wrapper.fixed.bottom_left, 4418 .ly-switcher-wrapper.absolute.bottom_left { 4419 bottom: 0; 4420 left: 0; 4421 } 4422 .ly-switcher-wrapper.fixed.bottom_right, 4423 .ly-switcher-wrapper.absolute.bottom_right { 4424 bottom: 0; 4425 right: 0; 4426 } 4427 .ly-switcher-wrapper .shopify-currency-form { 4428 display: inline-block; 4429 } 4430 4431 4432 .ly-currency-switcher { 4433 font-size: 1em; 4434 } 4435 4436 .ly-inner-text { 4437 margin: 0 0.2em; 4438 white-space: nowrap; 4439 } 4440 4441 .ly-flag-icon { 4442 background-size: contain; 4443 background-position: 50%; 4444 background-repeat: no-repeat; 4445 position: relative; 4446 display: inline-block; 4447 width: 1.33333333em; 4448 line-height: 1em; 4449 } 4450 .ly-flag-icon:before { 4451 content: ''; 4452 display: inline-block; 4453 } 4454 .ly-flag-icon.ly-flag-squared { 4455 width: 1em; 4456 } 4457 .ly-flag-icon.ly-flag-rounded { 4458 width: 1em; 4459 border-radius: 50%; 4460 } 4461 .ly-languages-switcher { 4462 white-space: nowrap; 4463 list-style-type: none; 4464 display: flex; 4465 font-size: 1em; 4466 } 4467 .ly-languages-switcher-link { 4468 margin: 0 0.2em; 4469 cursor: pointer; 4470 white-space: nowrap; 4471 text-decoration: none; 4472 display: inline-block; 4473 } 4474 .ly-languages-switcher.ly-list { 4475 margin: 0; 4476 padding: 0; 4477 display: block; 4478 } 4479 .ly-languages-switcher.ly-native-select { 4480 4481 } 4482 .ly-icon { 4483 margin: 0 0.2em; 4484 } 4485 4486 .ly-arrow { 4487 display: inline-block; 4488 position: relative; 4489 vertical-align: middle; 4490 direction: ltr !important; 4491 -webkit-transition: transform 0.25s; 4492 -moz-transition: transform 0.25s; 4493 transition: transform 0.25s; 4494 margin: 0 0.2em; 4495 } 4496 .ly-custom-dropdown-switcher.ly-is-open .ly-arrow { 4497 transform: rotate(180deg); 4498 } 4499 .ly-custom-dropdown-switcher.ly-arrow.ly-arrow-up { 4500 transform: rotate(180deg); 4501 } 4502 .ly-custom-dropdown-switcher.ly-is-open .ly-arrow.ly-arrow-up { 4503 transform: rotate(0deg); 4504 } 4505 4506 .ly-custom-dropdown-switcher { 4507 text-align: left; 4508 display: inline-block; 4509 position: relative; 4510 user-select: none; 4511 cursor: pointer; 4512 } 4513 .ly-custom-dropdown-current { 4514 display: block; 4515 vertical-align: middle; 4516 } 4517 .ly-custom-dropdown-current-inner { 4518 display: inline-block; 4519 vertical-align: middle; 4520 } 4521 .ly-custom-dropdown-current-inner-image { 4522 margin-right: 0.25em; 4523 } 4524 .ly-custom-dropdown-current-inner-text { 4525 margin: 0 0.2em; 4526 } 4527 .ly-custom-dropdown-list { 4528 display: none !important; 4529 list-style: none; 4530 position: absolute; 4531 left: 0; 4532 padding: inherit !important; 4533 padding: 0 !important; 4534 margin: 0; 4535 z-index: 99999; 4536 text-align: left; 4537 width: 100%; 4538 font-size: 1em; 4539 } 4540 .ly-custom-dropdown-list-element { 4541 color: inherit !important; 4542 display: block; 4543 } 4544 .ly-custom-dropdown-list > li { 4545 margin: 0 !important; 4546 display: block; 4547 } 4548 .ly-custom-dropdown-list-element-left { 4549 margin-right: 0.5em; 4550 } 4551 .ly-custom-dropdown-list-element-right { 4552 text-align: left; 4553 } 4554 .ly-custom-dropdown-list-element-left, 4555 .ly-custom-dropdown-list-element-right { 4556 vertical-align: middle; 4557 } 4558 .ly-custom-dropdown-switcher .ly-languages-switcher-link { 4559 margin: 0; 4560 } 4561 .ly-languages-switcher-dropdown { 4562 display: inline-block; 4563 } 4564 .ly-languages-links-switcher { 4565 display: inline-block; 4566 } 4567 .ly-languages-links-switcher > .ly-languages-link { 4568 /*margin-right: 0.5em;*/ 4569 padding: inherit !important; 4570 color: inherit !important; 4571 } 4572 .ly-custom-dropdown-list-element { 4573 /*padding: inherit !important;*/ 4574 text-decoration: none; 4575 } 4576 .ly-is-uppercase { 4577 text-transform: uppercase; 4578 } 4579 .ly-is-transparent.ly-links, 4580 .ly-is-transparent.ly-list, 4581 .ly-is-transparent.ly-currency-switcher, 4582 .ly-is-transparent.ly-custom-dropdown-switcher, 4583 .ly-is-transparent.ly-custom-dropdown-switcher .ly-custom-dropdown-list { 4584 background: transparent !important; 4585 } 4586 .ly-arrow-up { 4587 transform: rotateZ(180deg); 4588 } 4589 4590 .ly-custom-dropdown-switcher .ly-custom-dropdown-list li.current{ 4591 display: none; 4592 } 4593 .ly-custom-dropdown-switcher.ly-is-open .ly-custom-dropdown-list { 4594 display: flex !important; 4595 min-width: 100%; 4596 width: 100%; 4597 flex-direction: column-reverse; 4598 right: 0; 4599 left: auto; 4600 overflow: auto; 4601 max-height: 350px; 4602 max-height: 50vh; 4603 } 4604 4605 .ly-is-dropup .ly-custom-dropdown-list { 4606 bottom: 100%; 4607 } 4608 .ly-hide { 4609 display: none !important; 4610 } 4611 body.ly-force-off #preview-bar-iframe, 4612 body.ly-force-off .ly-languages-switcher { 4613 display: none !important; 4614 } 4615 4616 .ly-close { 4617 position: absolute; 4618 opacity: 0.3; 4619 right: 0; 4620 top: 0; 4621 width: 3em; 4622 height: 3em; 4623 display: inline-block !important; 4624 background: rbga(0,0,0,0); 4625 padding: 1em; 4626 } 4627 .ly-close:hover { 4628 opacity: 1; 4629 } 4630 .ly-close .inner { 4631 transform: translateX(-50%); 4632 position: relative; 4633 width: 100%; 4634 height: 100%; 4635 display: inline-block; 4636 } 4637 .ly-close .inner:before, .ly-close .inner:after { 4638 position: absolute; 4639 left: 1em; 4640 content: ' '; 4641 height: 1em; 4642 width: 2px; 4643 background-color: #333; 4644 } 4645 .ly-close .inner:before { 4646 transform: rotate(45deg); 4647 } 4648 .ly-close .inner:after { 4649 transform: rotate(-45deg); 4650 } 4651 4652 4653 4654 .ly-popup-switcher {} 4655 .ly-popup-switcher .ly-popup-current { 4656 cursor: pointer; 4657 background: transparent; 4658 } 4659 .ly-popup-switcher .ly-popup-modal { 4660 position: fixed; 4661 z-index: 1000; 4662 top: 0; 4663 left: 0; 4664 width: 100%; 4665 height: 100%; 4666 display: none; 4667 justify-content: center;
4668 align-items: center; 4669 } 4670 .ly-popup-switcher.ly-is-open .ly-popup-modal { 4671 display: flex; 4672 } 4673 .ly-popup-switcher .ly-popup-modal-backdrop { 4674 position: fixed; 4675 width: 100%; 4676 height: 100%; 4677 z-index: 0; 4678 top: 0; 4679 left: 0; 4680 background:rgba(0, 0, 0, 0.38); 4681 cursor: pointer; 4682 } 4683 .ly-popup-switcher .ly-popup-modal .ly-popup-modal-content { 4684 padding: 1em; 4685 position: absolute; 4686 z-index: 1000; 4687 } 4688 .ly-popup-switcher .ly-popup-modal .ly-popup-modal-content ul { 4689 padding: 0; 4690 margin: 12px 0 0 0; 4691 list-style: none; 4692 display: flex; 4693 flex-direction: column; 4694 } 4695 .ly-popup-switcher .ly-popup-modal .ly-popup-modal-content ul .ly-languages-switcher-link { 4696 margin: 0; 4697 border: solid 1px; 4698 padding: 1em; 4699 display: block; 4700 min-width: 225px; 4701 margin-top: 1em; 4702 } 4703 .ly-popup-switcher .ly-popup-modal .ly-popup-modal-content ul .ly-languages-switcher-link.current_lang { 4704 display: none; 4705 } 4706 4707 4708 4709 /* Recommendation */ 4710 .ly-recommendation { 4711 display: none; 4712 } 4713 .ly-recommendation.ly-is-open { 4714 display: inline-block; 4715 } 4716 .ly-recommendation form { 4717 display: inline-block; 4718 } 4719 .ly-recommendation .ly-arrow, 4720 .ly-arrow.recommendation { 4721 display: none; 4722 } 4723 .ly-recommendation .ly-arrow.recommendation { 4724 display: inline-block; 4725 } 4726 .ly-recommendation .ly-switcher-wrapper { 4727 font-size: 1em !important; 4728 } 4729 .ly-recommendation .ly-popup-modal .ly-popup-switcher .ly-popup-modal .ly-popup-modal-backdrop { 4730 display: none; 4731 } 4732 .ly-recommendation-form button[type="submit"] { 4733 cursor: pointer; 4734 } 4735 4736 /* Recommendation Banner */ 4737 .ly-recommendation .ly-banner { 4738 position: fixed; 4739 z-index: 100000; 4740 width: 100%; 4741 } 4742 .ly-recommendation .ly-banner .ly-banner-content { 4743 width: 100%; 4744 padding: 1em 30px 1em 1em; 4745 box-shadow: 0 0 20px rgba(0,0,0,.25); 4746 } 4747 .ly-recommendation .ly-banner.top { 4748 top: 0; 4749 } 4750 .ly-recommendation .ly-banner.bottom { 4751 bottom: 0; 4752 } 4753 .ly-recommendation .ly-banner .ly-banner-content .ly-switcher-wrapper { 4754 position: relative !important; 4755 margin: 0 !important; 4756 display: inline-block !important; 4757 } 4758 .ly-recommendation .ly-banner .ly-recommendation-form button[type="submit"] { 4759 margin-left: 10px; 4760 } 4761 4762 4763 /* Recommendation Popup */ 4764 .ly-recommendation .ly-popup-modal { 4765 position: fixed; 4766 z-index: 10000; 4767 } 4768 .ly-recommendation .ly-popup-modal .ly-switcher-wrapper { 4769 position: relative !important; 4770 margin: 0 !important; 4771 display: inline-block !important; 4772 } 4773 .ly-recommendation .ly-popup-modal-backdrop { 4774 position: fixed; 4775 width: 100%; 4776 height: 100%; 4777 z-index: 1000; 4778 top: 0; 4779 left: 0; 4780 background:rgba(0, 0, 0, 0.38); 4781 } 4782 .ly-recommendation .ly-popup-modal .ly-popup-modal-content { 4783 padding: 1em 30px 1em 1em; 4784 } 4785 .ly-recommendation .ly-popup-modal .ly-popup-modal-content .ly-languages-switcher { 4786 position: relative !important; 4787 margin: 0 !important; 4788 } 4789 .ly-recommendation .ly-popup-modal .ly-popup-modal-content h3 { 4790 margin: 0 2em 1em 0; 4791 font-size: inherit; 4792 position: relative; 4793 } 4794 .ly-recommendation .ly-popup-modal.top_left { top: 0; left: 0; margin-right: 0 !important; margin-bottom: 0 !important; padding-right: 0 !important; padding-bottom: 0 !important;} 4795 .ly-recommendation .ly-popup-modal.top_center { top: 0; left: 50%; transform: translateX(-50%); margin-right: 0 !important; margin-bottom: 0 !important; margin-left: 0 !important; padding-right: 0 !important; padding-bottom: 0 !important; padding-left: 0 !important;} 4796 .ly-recommendation .ly-popup-modal.top_right { top: 0; right: 0; margin-left: 0 !important; margin-bottom: 0 !important; padding-left: 0 !important; padding-bottom: 0 !important; } 4797 .ly-recommendation .ly-popup-modal.center_center { top: 50%; left: 50%; transform: translateX(-50%) translateY(-50%); margin: 0 !important; padding: 0 !important; } 4798 .ly-recommendation .ly-popup-modal.bottom_left { bottom: 0; left: 0; margin-right: 0 !important; margin-top: 0 !important; padding-right: 0 !important; padding-top: 0 !important; } 4799 .ly-recommendation .ly-popup-modal.bottom_center { bottom: 0; left: 50%; transform: translateX(-50%); margin-right: 0 !important; margin-left: 0 !important; margin-top: 0 !important; padding-right: 0 !important; padding-left: 0 !important; padding-top: 0 !important; } 4800 .ly-recommendation .ly-popup-modal.bottom_right { bottom: 0; right: 0; margin-left: 0 !important; margin-top: 0 !important; padding-left: 0 !important; padding-top: 0 !important; } 4801 4802 4803 4804 4805 4806 4807</style><!-- langify-v2-scripts-end --><!-- "snippets/preorder-now.liquid" was not rendered, the associated app was uninstalled --> 4808 4809 4810 4811 4812<div id="shopify-block-AZFd6aGFnS21FS1hVa__13768625480086291342" class="shopify-block shopify-app-block">
4812<script> 4813 window['ShopifyForms'] = { 4814 ...window['ShopifyForms'], 4815 currentPageType: "blog" 4816 }; 4817</script>
4817 4818 4819 4820</div>
4820<script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
4820 4821</body> 4822</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.