1<!doctype html><html class="no-js" lang="en" dir="ltr"> 2 <head> 3 <meta charset="utf-8"> 4 <meta name="viewport" content="width=device-width, initial-scale=1.0, height=device-height, minimum-scale=1.0, maximum-scale=5.0"> 5 <meta name="theme-color" content="#f5f5f5"> 6 7 <title>Search</title><meta name="description" content="The Alinker is a radically different walking bike that keeps you active, mobile and engaged socially. Together we move differently."><link rel="canonical" href="https://thealinker.ca/search"><link rel="shortcut icon" href="//thealinker.ca/cdn/shop/files/favicon_96x96_webp_96x96.jpg?v=1749824122" type="image/png"><link rel="preconnect" href="https://cdn.shopify.com"> 8 <link rel="dns-prefetch" href="https://productreviews.shopifycdn.com"> 9 <link rel="dns-prefetch" href="https://www.google-analytics.com"><link rel="preconnect" href="https://fonts.shopifycdn.com" crossorigin><link rel="preload" as="style" href="//thealinker.ca/cdn/shop/t/21/assets/theme.css?v=15473330818351774541721142201"> 10 <link rel="preload" as="style" href="//thealinker.ca/cdn/shop/t/21/assets/custom-styles.css?v=162123720830711778191723213455"> 11 <link rel="preload" as="style" href="//thealinker.ca/cdn/shop/t/21/assets/translation.css?v=118168554902359556521698087541"> 12 <link rel="preload" as="script" href="//thealinker.ca/cdn/shop/t/21/assets/vendor.js?v=31715688253868339281698087541"> 13 <link rel="preload" as="script" href="//thealinker.ca/cdn/shop/t/21/assets/theme.js?v=138105436246083635401698087541"><meta property="og:type" content="website"> 14 <meta property="og:title" content="Search"><meta property="og:description" content="The Alinker is a radically different walking bike that keeps you active, mobile and engaged socially. Together we move differently."><meta property="og:url" content="https://thealinker.ca/search"> 15<meta property="og:site_name" content="The Alinker Inventions Ltd."><meta name="twitter:card" content="summary"><meta name="twitter:title" content="Search"> 16 <meta name="twitter:description" content="The Alinker is a radically different walking bike that keeps you active, mobile and engaged socially. Together we move differently."> 17 18 19 20
20<script type="application/ld+json"> 21 { 22 "@context": "https://schema.org", 23 "@type": "BreadcrumbList", 24 "itemListElement": [{ 25 "@type": "ListItem", 26 "position": 1, 27 "name": "Home", 28 "item": "https://thealinker.ca" 29 }] 30 } 31 </script>
31 32 33 34 <link rel="preload" href="//thealinker.ca/cdn/fonts/poppins/poppins_n8.580200d05bca09e2e0c6f4c922047c227dfa8e8c.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="//thealinker.ca/cdn/fonts/muli/muli_n4.e949947cfff05efcc994b2e2db40359a04fa9a92.woff2" as="font" type="font/woff2" crossorigin><style> 35 /* Typography (heading) */ 36 @font-face { 37 font-family: Poppins; 38 font-weight: 800; 39 font-style: normal; 40 font-display: swap; 41 src: url("//thealinker.ca/cdn/fonts/poppins/poppins_n8.580200d05bca09e2e0c6f4c922047c227dfa8e8c.woff2") format("woff2"), 42 url("//thealinker.ca/cdn/fonts/poppins/poppins_n8.f4450f472fdcbe9e829f3583ebd559988f5a3d25.woff") format("woff"); 43} 44 45@font-face { 46 font-family: Poppins; 47 font-weight: 800; 48 font-style: italic; 49 font-display: swap; 50 src: url("//thealinker.ca/cdn/fonts/poppins/poppins_i8.55af7c89c62b8603457a34c5936ad3b39f67e29c.woff2") format("woff2"), 51 url("//thealinker.ca/cdn/fonts/poppins/poppins_i8.1143b85f67a233999703c64471299cee6bc83160.woff") format("woff"); 52} 53 54/* Typography (body) */ 55 @font-face { 56 font-family: Muli; 57 font-weight: 400; 58 font-style: normal; 59 font-display: swap; 60 src: url("//thealinker.ca/cdn/fonts/muli/muli_n4.e949947cfff05efcc994b2e2db40359a04fa9a92.woff2") format("woff2"), 61 url("//thealinker.ca/cdn/fonts/muli/muli_n4.35355e4a0c27c9bc94d9af3f9bcb586d8229277a.woff") format("woff"); 62} 63 64@font-face { 65 font-family: Muli; 66 font-weight: 400; 67 font-style: italic; 68 font-display: swap; 69 src: url("//thealinker.ca/cdn/fonts/muli/muli_i4.c0a1ea800bab5884ab82e4eb25a6bd25121bd08c.woff2") format("woff2"), 70 url("//thealinker.ca/cdn/fonts/muli/muli_i4.a6c39b1b31d876de7f99b3646461aa87120de6ed.woff") format("woff"); 71} 72 73@font-face { 74 font-family: Muli; 75 font-weight: 600; 76 font-style: normal; 77 font-display: swap; 78 src: url("//thealinker.ca/cdn/fonts/muli/muli_n6.cc1d2d4222c93c9ee9f6de4489226d2e1332d85b.woff2") format("woff2"), 79 url("//thealinker.ca/cdn/fonts/muli/muli_n6.2bb79714f197c09d3f5905925734a3f1166d5d27.woff") format("woff"); 80} 81 82@font-face { 83 font-family: Muli; 84 font-weight: 600; 85 font-style: italic; 86 font-display: swap; 87 src: url("//thealinker.ca/cdn/fonts/muli/muli_i6.8f2d01d188d44c7a6149f7e8d2688f96baea5098.woff2") format("woff2"), 88 url("//thealinker.ca/cdn/fonts/muli/muli_i6.be105ddc6534276d93778a9b02f60679ab15f9e1.woff") format("woff"); 89} 90 91:root {--heading-color: 80, 72, 91; 92 --text-color: 80, 72, 91; 93 --background: 255, 255, 255; 94 --secondary-background: 245, 245, 245; 95 --border-color: 229, 228, 230; 96 --border-color-darker: 185, 182, 189; 97 --success-color: 255, 192, 0; 98 --success-background: 255, 242, 204; 99 --error-color: 222, 42, 42; 100 --error-background: 253, 240, 240; 101 --primary-button-background: 255, 192, 0; 102 --primary-button-text-color: 80, 72, 91; 103 --secondary-button-background: 80, 72, 91; 104 --secondary-button-text-color: 255, 192, 0; 105 --product-star-rating: 255, 192, 0; 106 --product-on-sale-accent: 255, 192, 0; 107 --product-sold-out-accent: 255, 192, 0; 108 --product-custom-label-background: 255, 192, 0; 109 --product-custom-label-text-color: 0, 0, 0; 110 --product-custom-label-2-background: 255, 192, 0; 111 --product-custom-label-2-text-color: 0, 0, 0; 112 --product-low-stock-text-color: 222, 42, 42; 113 --product-in-stock-text-color: 46, 158, 123; 114 --loading-bar-background: 80, 72, 91; 115 116 /* We duplicate some "base" colors as root colors, which is useful to use on drawer elements or popover without. Those should not be overridden to avoid issues */ 117 --root-heading-color: 80, 72, 91; 118 --root-text-color: 80, 72, 91; 119 --root-background: 255, 255, 255; 120 --root-border-color: 229, 228, 230; 121 --root-primary-button-background: 255, 192, 0; 122 --root-primary-button-text-color: 80, 72, 91; 123 124 --base-font-size: 18px; 125 --heading-font-family: Poppins, sans-serif; 126 --heading-font-weight: 800; 127 --heading-font-style: normal; 128 --heading-text-transform: uppercase; 129 --text-font-family: Muli, sans-serif;
130 --text-font-weight: 400; 131 --text-font-style: normal; 132 --text-font-bold-weight: 600; 133 134 /* Typography (font size) */ 135 --heading-xxsmall-font-size: 11px; 136 --heading-xsmall-font-size: 11px; 137 --heading-small-font-size: 13px; 138 --heading-large-font-size: 40px; 139 --heading-h1-font-size: 40px; 140 --heading-h2-font-size: 32px; 141 --heading-h3-font-size: 28px; 142 --heading-h4-font-size: 26px; 143 --heading-h5-font-size: 22px; 144 --heading-h6-font-size: 18px; 145 146 /* Control the look and feel of the theme by changing radius of various elements */ 147 --button-border-radius: 10px; 148 --block-border-radius: 0px; 149 --block-border-radius-reduced: 0px; 150 --color-swatch-border-radius: 0px; 151 152 /* Button size */ 153 --button-height: 48px; 154 --button-small-height: 40px; 155 156 /* Form related */ 157 --form-input-field-height: 48px; 158 --form-input-gap: 16px; 159 --form-submit-margin: 24px; 160 161 /* Product listing related variables */ 162 --product-list-block-spacing: 32px; 163 164 /* Video related */ 165 --play-button-background: 255, 255, 255; 166 --play-button-arrow: 80, 72, 91; 167 168 /* RTL support */ 169 --transform-logical-flip: 1; 170 --transform-origin-start: left; 171 --transform-origin-end: right; 172 173 /* Other */ 174 --zoom-cursor-svg-url: url(//thealinker.ca/cdn/shop/t/21/assets/zoom-cursor.svg?v=25715627919558945481698087541); 175 --arrow-right-svg-url: url(//thealinker.ca/cdn/shop/t/21/assets/arrow-right.svg?v=45993115627850675691698087541); 176 --arrow-left-svg-url: url(//thealinker.ca/cdn/shop/t/21/assets/arrow-left.svg?v=22547255716561432031698087541); 177 178 /* Some useful variables that we can reuse in our CSS. Some explanation are needed for some of them: 179 - container-max-width-minus-gutters: represents the container max width without the edge gutters 180 - container-outer-width: considering the screen width, represent all the space outside the container 181 - container-outer-margin: same as container-outer-width but get set to 0 inside a container 182 - container-inner-width: the effective space inside the container (minus gutters) 183 - grid-column-width: represents the width of a single column of the grid 184 - vertical-breather: this is a variable that defines the global "spacing" between sections, and inside the section 185 to create some "breath" and minimum spacing 186 */ 187 --container-max-width: 1600px; 188 --container-gutter: 24px; 189 --container-max-width-minus-gutters: calc(var(--container-max-width) - (var(--container-gutter)) * 2); 190 --container-outer-width: max(calc((100vw - var(--container-max-width-minus-gutters)) / 2), var(--container-gutter)); 191 --container-outer-margin: var(--container-outer-width); 192 --container-inner-width: calc(100vw - var(--container-outer-width) * 2); 193 194 --grid-column-count: 10; 195 --grid-gap: 24px; 196 --grid-column-width: calc((100vw - var(--container-outer-width) * 2 - var(--grid-gap) * (var(--grid-column-count) - 1)) / var(--grid-column-count)); 197 198 --vertical-breather: 36px; 199 --vertical-breather-tight: 36px; 200 201 /* Shopify related variables */ 202 --payment-terms-background-color: #ffffff; 203 } 204 205 @media screen and (min-width: 741px) { 206 :root { 207 --container-gutter: 40px; 208 --grid-column-count: 20; 209 --vertical-breather: 48px; 210 --vertical-breather-tight: 48px; 211 212 /* Typography (font size) */ 213 --heading-xsmall-font-size: 13px; 214 --heading-small-font-size: 14px; 215 --heading-large-font-size: 58px; 216 --heading-h1-font-size: 58px; 217 --heading-h2-font-size: 44px; 218 --heading-h3-font-size: 36px; 219 --heading-h4-font-size: 28px; 220 --heading-h5-font-size: 22px; 221 --heading-h6-font-size: 20px; 222 223 /* Form related */ 224 --form-input-field-height: 52px; 225 --form-submit-margin: 32px; 226 227 /* Button size */ 228 --button-height: 52px; 229 --button-small-height: 44px; 230 } 231 } 232 233 @media screen and (min-width: 1200px) { 234 :root { 235 --vertical-breather: 64px; 236 --vertical-breather-tight: 48px; 237 --product-list-block-spacing: 48px; 238 239 /* Typography */ 240 --heading-large-font-size: 72px; 241 --heading-h1-font-size: 62px; 242 --heading-h2-font-size: 54px; 243 --heading-h3-font-size: 40px; 244 --heading-h4-font-size: 34px; 245 --heading-h5-font-size: 26px; 246 --heading-h6-font-size: 18px; 247 } 248 } 249 250 @media screen and (min-width: 1600px) { 251 :root { 252 --vertical-breather: 64px; 253 --vertical-breather-tight: 48px; 254 } 255 } 256</style> 257
257<script> 258 // This allows to expose several variables to the global scope, to be used in scripts 259 window.themeVariables = { 260 settings: { 261 direction: "ltr", 262 pageType: "search", 263 cartCount: 0, 264 moneyFormat: "${{amount}}", 265 moneyWithCurrencyFormat: "${{amount}} CAD", 266 showVendor: false, 267 discountMode: "saving", 268 currencyCodeEnabled: false, 269 searchMode: "product,article,collection", 270 searchUnavailableProducts: "last", 271 cartType: "page", 272 cartCurrency: "CAD", 273 mobileZoomFactor: 2.5 274 }, 275 276 routes: { 277 host: "thealinker.ca", 278 rootUrl: "\/", 279 rootUrlWithoutSlash: '', 280 cartUrl: "\/cart", 281 cartAddUrl: "\/cart\/add", 282 cartChangeUrl: "\/cart\/change", 283 searchUrl: "\/search", 284 predictiveSearchUrl: "\/search\/suggest", 285 productRecommendationsUrl: "\/recommendations\/products" 286 }, 287 288 strings: { 289 accessibilityDelete: "Delete", 290 accessibilityClose: "Close", 291 collectionSoldOut: "Sold out", 292 collectionDiscount: "Save @savings@", 293 productSalePrice: "Sale price", 294 productRegularPrice: "Regular price", 295 productFormUnavailable: "Unavailable", 296 productFormSoldOut: "Sold out", 297 productFormPreOrder: "Pre-order", 298 productFormAddToCart: "Add to cart", 299 searchNoResults: "No results could be found.", 300 searchNewSearch: "New search", 301 searchProducts: "Products", 302 searchArticles: "Journal", 303 searchPages: "Pages", 304 searchCollections: "Collections", 305 cartViewCart: "View cart", 306 cartItemAdded: "Item added to your cart!", 307 cartItemAddedShort: "Added to your cart!", 308 cartAddOrderNote: "Add order note", 309 cartEditOrderNote: "Edit order note", 310 shippingEstimatorNoResults: "Sorry, we do not ship to your address.", 311 shippingEstimatorOneResult: "There is one shipping rate for your address:", 312 shippingEstimatorMultipleResults: "There are several shipping rates for your address:", 313 shippingEstimatorError: "One or more error occurred while retrieving shipping rates:" 314 }, 315 316 libs: { 317 flickity: "\/\/thealinker.ca\/cdn\/shop\/t\/21\/assets\/flickity.js?v=176646718982628074891698087541", 318 photoswipe: "\/\/thealinker.ca\/cdn\/shop\/t\/21\/assets\/photoswipe.js?v=132268647426145925301698087541", 319 qrCode: "\/\/thealinker.ca\/cdn\/shopifycloud\/storefront\/assets\/themes_support\/vendor\/qrcode-1f6c2eb7.js" 320 }, 321 322 breakpoints: { 323 phone: 'screen and (max-width: 740px)', 324 tablet: 'screen and (min-width: 741px) and (max-width: 999px)', 325 tabletAndUp: 'screen and (min-width: 741px)', 326 pocket: 'screen and (max-width: 999px)', 327 lap: 'screen and (min-width: 1000px) and (max-width: 1199px)', 328 lapAndUp: 'screen and (min-width: 1000px)', 329 desktop: 'screen and (min-width: 1200px)', 330 wide: 'screen and (min-width: 1400px)' 331 } 332 }; 333 334 window.addEventListener('pageshow', async () => { 335 const cartContent = await (await fetch(`${window.themeVariables.routes.cartUrl}.js`, {cache: 'reload'})).json(); 336 document.documentElement.dispatchEvent(new CustomEvent('cart:refresh', {detail: {cart: cartContent}})); 337 }); 338 339 if ('noModule' in HTMLScriptElement.prototype) { 340 // Old browsers (like IE) that does not support module will be considered as if not executing JS at all 341 document.documentElement.className = document.documentElement.className.replace('no-js', 'js'); 342 343 requestAnimationFrame(() => { 344 const viewportHeight = (window.visualViewport ? window.visualViewport.height : document.documentElement.clientHeight); 345 document.documentElement.style.setProperty('--window-height',viewportHeight + 'px'); 346 }); 347 }</script>
347 348 349 <link rel="stylesheet" href="//thealinker.ca/cdn/shop/t/21/assets/theme.css?v=15473330818351774541721142201"> 350 <link rel="stylesheet" href="//thealinker.ca/cdn/shop/t/21/assets/custom-styles.css?v=162123720830711778191723213455"> 351 <link rel="stylesheet" href="//thealinker.ca/cdn/shop/t/21/assets/translation.css?v=118168554902359556521698087541"> 352 <link rel="stylesheet" href="//thealinker.ca/cdn/shop/t/21/assets/imagebox.scss?v=36896846824105379031698087541"> 353 354
354<script src="//thealinker.ca/cdn/shop/t/21/assets/vendor.js?v=31715688253868339281698087541" defer></script>
354 355
355<script src="//thealinker.ca/cdn/shop/t/21/assets/theme.js?v=138105436246083635401698087541" defer></script>
355 356
356<script src="//thealinker.ca/cdn/shop/t/21/assets/custom.js?v=165930397078196874451698087541" defer></script>
356 357 358 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/assets/owl.carousel.min.css"> 359 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/assets/owl.theme.default.css"> 360 361
361<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
361 362
362<script src="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/owl.carousel.js"></script>
362 363 364 <!-- Add Crowdfunding --> 365
365<script>(function() { var d = document, fr = d.createElement('script'); fr.type = 'text/javascript'; fr.async = true; fr.src = 'https://static.fundrazr.com/widgets/loader.js'; var s = d.getElementsByTagName('script')[0]; s.parentNode.insertBefore(fr, s);})();</script>
365 366 <!-- APP Snippets --> 367
367<script src="https://modapps.com.au/geolocationredirect/assets/geo/alinker.myshopify.com/main_geo.js" type="text/javascript"></script>
367
368<script> 369var safariBrowserCompatibility = false; 370var sessionStCall = false; 371var ajaxLinkUrl = 'https://modapps.com.au/geolocationredirect/assets/geo/alinker.myshopify.com/geolocationredirect.js'; 372 if(typeof(Storage) !== 'undefined') { 373 try { 374 localStorage.setItem('lStorageBrowserCheck', 1); 375 localStorage.removeItem('lStorageBrowserCheck'); 376 safariBrowserCompatibility = true; 377 } 378 catch (e) { 379 Storage.prototype._setItem = Storage.prototype.setItem; 380 Storage.prototype.setItem = function () { }; 381 safariBrowserCompatibility = false; 382 console.log('Sorry, your browser does not support web storage...'); 383 } 384 if (safariBrowserCompatibility) { 385 if (window.sessionStorage.geoJsCodeTxt) { 386 sessionStCall = true; 387 } else { 388 sessionStCall = false; 389 } 390 } 391 } else { 392 safariBrowserCompatibility = false; 393 sessionStCall = false; 394 console.log('Sorry, your browser does not support web storage...'); 395 } 396if(sessionStCall){ 397 var s = document.createElement('script'); 398 s.type = 'text/javascript'; 399 try{ 400 s.appendChild(document.CreateTextNode(window.sessionStorage.geoJsCodeTxt)); 401 document.getElementsByTagName('head')[0].appendChild(s); 402 403 } 404 catch (e) { 405 s.text = window.sessionStorage.geoJsCodeTxt; 406 document.getElementsByTagName('head')[0].appendChild(s); 407 408 } 409 } 410else { 411modBarjquery.ajax({ 412 type: 'GET', 413 data: { urlajaxpath : ajaxLinkUrl }, 414 dataType: 'text', 415 async: false, 416 url: 'https://modapps.com.au/geolocationredirect/getfilecs.php', 417 timeout: 7000, 418 success: function (data) { 419 var tempScriptTxt = ''; 420 if (safariBrowserCompatibility) { 421 window.sessionStorage.geoJsCodeTxt = data; 422 tempScriptTxt = window.sessionStorage.geoJsCodeTxt; 423 } 424 else { 425 tempScriptTxt = data; 426 //alert(tempScriptTxt); 427 } 428 var s = document.createElement('script'); 429 s.type = 'text/javascript'; 430 try { 431 s.appendChild(document.CreateTextNode(tempScriptTxt)); 432 document.getElementsByTagName('head')[0].appendChild(s); 433 434 } 435 catch (e) { 436 s.text = tempScriptTxt; 437 document.getElementsByTagName('head')[0].appendChild(s); 438 439 } }, 440 error: function (data) 441 { console.log('Cannot load service from server'); } 442 }); 443} 444</script>
444 445 446 <!-- Google Tag Manager --> 447
447<script>
vendor: 323 bytes, line 447
447(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','
447GTM-MGSRJ78
vendor: 3 bytes, line 447
447');
447</script>
447 448 <!-- End Google Tag Manager --> 449 <!-- Google tag (gtag.js) -->
vendor: 68 bytes, lines 449-450
449 450 <script async src="https://www.googletagmanager.com/gtag/js?id=
450AW-702397120
vendor: 16 bytes, lines 450-451
450"></script> 451
451<script> 452
vendor: 133 bytes, lines 452-455
452window.dataLayer = window.dataLayer || []; 453 function gtag(){dataLayer.push(arguments);} 454 gtag('js', new Date()); 455 gtag('config', '
455AW-702397120
vendor: 8 bytes, lines 455-456
455'); 456
456</script>
456 457 458 459
459<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script>
459<meta name="google-site-verification" content="jTL6x1F0ls5Bc4EuF0-imas-LUF96ta44_JncOoSRXc"> 460<meta name="google-site-verification" content="CKd6ZNWHtFGKzw-8z2Wr_M-xF5QypbdGG5PlL2j-r38"> 461<meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/15333935/digital_wallets/dialog"> 462<link rel="ucp" href="/.well-known/ucp" version="2026-08-25"><link rel="alternate" hreflang="x-default" href="https://thealinker.ca/search"> 463<link rel="alternate" hreflang="en" href="https://thealinker.ca/search"> 464<link rel="alternate" hreflang="fr" href="https://thealinker.ca/fr/search">
465<script async="async" src="/checkouts/internal/preloads.js?locale=en-CA"></script>
465 466<link rel="preconnect" href="https://shop.app" crossorigin="anonymous">
467<script async="async" src="https://shop.app/checkouts/internal/preloads.js?locale=en-CA&shop_id=15333935" crossorigin="anonymous"></script>
vendor: 1 bytes, line 467
467
468<script id="apple-pay-shop-capabilities" type="application/json">{"shopId":15333935,"countryCode":"CA","currencyCode":"CAD","merchantCapabilities":["supports3DS"],"merchantId":"gid:\/\/shopify\/Shop\/15333935","merchantName":"The Alinker Inventions Ltd.","requiredBillingContactFields":["postalAddress","email","phone"],"requiredShippingContactFields":["postalAddress","email","phone"],"shippingType":"shipping","supportedNetworks":["visa","masterCard","amex","discover","interac","jcb"],"total":{"type":"pending","label":"The Alinker Inventions Ltd.","amount":"1.00"},"shopifyPaymentsEnabled":true,"supportsSubscriptions":true}</script>
vendor: 1 bytes, line 468
468
469<script id="shopify-features" type="application/json">{"accessToken":"98ca2b91d91c735c445f16f8e4832142","betas":["rich-media-storefront-analytics"],"domain":"thealinker.ca","predictiveSearch":true,"shopId":15333935,"locale":"en"}</script>
vendor: 1 bytes, line 469
469
470<script>var Shopify = Shopify || {}; 471Shopify.shop = "alinker-ca.myshopify.com"; 472Shopify.locale = "en"; 473Shopify.currency = {"active":"CAD","rate":"1.0"}; 474Shopify.country = "CA"; 475Shopify.theme = {"name":"PROD | Fireside - FLEX","id":123845214285,"schema_name":"Focal","schema_version":"9.0.0","theme_store_id":null,"role":"main"}; 476Shopify.theme.handle = "null"; 477Shopify.theme.style = {"id":null,"handle":null}; 478Shopify.cdnHost = "thealinker.ca/cdn"; 479Shopify.routes = Shopify.routes || {}; 480Shopify.routes.root = "/"; 481Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js"; 482Shopify.SignInWithShop = Shopify.SignInWithShop || {}; 483Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {}; 484Shopify.SignInWithShop.User.recognized = false;</script>
vendor: 1 bytes, line 484
484
485<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
vendor: 1 bytes, line 485
485
486<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 486
486
487<script> 488 window.ShopifyPay = window.ShopifyPay || {}; 489 window.ShopifyPay.apiHost = "shop.app\/pay"; 490 window.ShopifyPay.redirectState = null; 491</script>
vendor: 1 bytes, line 491
491
492<script> 493 window.Shopify = window.Shopify || {}; 494 window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {}; 495 window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.25 }; 496 window.Shopify.SignInWithShop.eligible = true; 497</script>
vendor: 1 bytes, line 497
497
498<script id="shop-js-analytics" type="application/json">{"pageType":"search"}</script>
vendor: 1 bytes, line 498
498
499<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 499
499
500<script type="module"> 501 await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"); 502 503 window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true}); 504 505</script>
vendor: 1 bytes, line 505
505
506<script> 507 window.Shopify = window.Shopify || {}; 508 if (!window.Shopify.featureAssets) window.Shopify.featureAssets = {}; 509 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"]}; 510</script>
vendor: 1 bytes, line 510
510
511<script>(function() { 512 var isLoaded = false; 513 function asyncLoad() { 514 if (isLoaded) return; 515 isLoaded = true; 516 var urls = ["https:\/\/cdn.crazyrocket.io\/widget\/scripts\/crazyrocket.start-cdn.js?id=62b5e6f6117cee193c5f13cf\u0026shop=alinker-ca.myshopify.com","https:\/\/config.gorgias.chat\/bundle-loader\/01GYCCDPHT8BRGTAXTWQN47ASW?source=shopify1click\u0026shop=alinker-ca.myshopify.com","https:\/\/media.9gtb.com\/loader.js?g_cvt_id=e597f41b-0dc5-463a-aa49-834b7427304a\u0026shop=alinker-ca.myshopify.com"]; 517 for (var i = 0; i < urls.length; i++) { 518 var s = document.createElement('script'); 519 s.type = 'text/javascript'; 520 s.async = true; 521 s.src = urls[i]; 522 var x = document.getElementsByTagName('script')[0]; 523 x.parentNode.insertBefore(s, x); 524 } 525 }; 526 if(window.attachEvent) { 527 window.attachEvent('onload', asyncLoad); 528 } else { 529 window.addEventListener('load', asyncLoad, false); 530 } 531})();</script>
vendor: 1 bytes, line 531
531
532<script id="__st">var __st={"a":15333935,"offset":-25200,"reqid":"5d44a55d-320b-45d3-9fa2-c115a73804ac-1790674119","pageurl":"thealinker.ca\/search","u":"49bb47f1558c","p":"searchresults"};</script>
vendor: 1 bytes, line 532
532
533<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
vendor: 1 bytes, line 533
533
534<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 534
534
535<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" defer="defer" src="//thealinker.ca/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
vendor: 1 bytes, line 535
535
536<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 = "//thealinker.ca/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>
536<script crossorigin="anonymous" defer="defer" src="//thealinker.ca/cdn/shopifycloud/storefront/assets/shopify_pay/storefront-616277c7.js?v=20250812"></script>
vendor: 1 bytes, line 536
536
537<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 537
537
538<script> 539 window.Shopify = window.Shopify || {}; 540 window.Shopify.MCP = window.Shopify.MCP || {}; 541 window.Shopify.MCP.enabled = true; 542 window.Shopify.MCP.shop = "alinker-ca.myshopify.com"; 543 window.Shopify.MCP.mcpEndpoint = "https:\/\/thealinker.ca\/api\/mcp"; 544 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"]}}]; 545</script>
vendor: 1 bytes, line 545
545
546<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("\/\/thealinker.ca\/cdn\/shopifycloud\/storefront\/assets\/storefront\/webmcp-c6b62ece.js","sha256-ke4DDuBjdvea3vxLWxHc9E9nq8zihuG4IfYEGbb77ys=");})(); 547</script>
vendor: 1 bytes, line 547
547
548<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://thealinker.ca/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}}; 549</script>
vendor: 1 bytes, line 549
549
550<script data-source-attribution="shopify.dynamic_checkout.buyer_consent"> 551 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); 552</script>
vendor: 1 bytes, line 552
552
553<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})}})); 554</script>
554 555<link id="shopify-accelerated-checkout-styles" rel="stylesheet" media="screen" href="https://thealinker.ca/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css" crossorigin="anonymous"> 556<style id="shopify-accelerated-checkout-cart"> 557 #shopify-buyer-consent { 558 margin-top: 1em; 559 display: inline-block; 560 width: 100%; 561} 562 563#shopify-buyer-consent.hidden { 564 display: none; 565} 566 567#shopify-subscription-policy-button { 568 background: none; 569 border: none; 570 padding: 0; 571 text-decoration: underline; 572 font-size: inherit; 573 cursor: pointer; 574} 575 576#shopify-subscription-policy-button::before { 577 box-shadow: none; 578} 579 580 </style> 581
582<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
582 583 <meta class='geo-ip' content='eyJwYXJhbWV0ZXJzIjp7InJlZGlyZWN0X3RleHQiOiJJdCBzZWVtcyB5b3UmIzM5cmUgaW4gJUNPVU5UUlklLiBSZWRpcmVjdCB0byAlU1RPUkVOQU1FJT8iLCJ5ZXMiOiJZZXMsIHBsZWFzZSIsIm5vIjoiTm8sIHRoYW5rcyIsInBvcHVwX2RlbGF5IjoiMCIsInBlcm1hbmVudC1yZWRpcmVjdCI6IjEiLCJiYWNrZ3JvdW5kLWNvbG9yIjoiZmZlMDY2IiwidGV4dC1jb2xvciI6IjAwMDAwMCIsInllcy1iYWNrZ3JvdW5kLWNvbG9yIjoiZmZmZmZmIiwieWVzLXRleHQtY29sb3IiOiIwMDAwMDAiLCJuby1iYWNrZ3JvdW5kLWNvbG9yIjoiZmZjYzAwIiwibm8tdGV4dC1jb2xvciI6IjAwMDAwMCIsImxheW91dC1zZWxlY3RvciI6InJlZGlyZWN0In0sInJ1bGVzTGlzdCI6W3siY291bnRyaWVzIjoiQ2FuYWRhIiwiZXhjZXB0aW9ucyI6IiIsImlwIjoiIiwic3RvcmVfbmFtZSI6IkNBIHN0b3JlIiwibGluayI6Imh0dHBzOlwvXC93d3cudGhlYWxpbmtlci5jYSIsImRvbWFpbl9yZWRpcmVjdCI6IjAifV19'>
583<script async src='//thealinker.ca/apps/easylocation/easylocation-1.0.2.min.js'></script>
583<!-- BEGIN app block: shopify://apps/klaviyo-email-marketing-sms/blocks/klaviyo-onsite-embed/2632fe16-c075-4321-a88b-50b567f42507 --> 584 585 586 587 588 589 590 591 592 593 594 595 596
596<script async src="https://static.klaviyo.com/onsite/js/SLnEMq/klaviyo.js?company_id=SLnEMq"></script>
596 597
597<script>!function(){if(!window.klaviyo){window._klOnsite=window._klOnsite||[];try{window.klaviyo=new Proxy({},{get:function(n,i){return"push"===i?function(){var n;(n=window._klOnsite).push.apply(n,arguments)}:function(){for(var n=arguments.length,o=new Array(n),w=0;w<n;w++)o[w]=arguments[w];var t="function"==typeof o[o.length-1]?o.pop():void 0,e=new Promise((function(n){window._klOnsite.push([i].concat(o,[function(i){t&&t(i),n(i)}]))}));return e}}})}catch(n){window.klaviyo=window.klaviyo||[],window.klaviyo.push=function(){var n;(n=window._klOnsite).push.apply(n,arguments)}}}}();</script>
597 598 599 600 601 602 603 604
604<script> 605 window.klaviyoReviewsProductDesignMode = false 606 </script>
606 607 608 609 610 611 612 613 614 615 616<!-- END app block -->
616<script src="https://cdn.shopify.com/extensions/019d43d1-bbad-7de5-bd49-ea6de5e8ca58/accessibly-app-30/assets/acc-main.js" type="text/javascript" defer="defer"></script>
616 617<link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
618<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: 15333935,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token,page_type: "search"};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 618
618
619<script> 620 window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || []; 621</script>
vendor: 1 bytes, line 621
621
622<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}
622).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: 15333935,storefrontBaseUrl: "https://thealinker.ca",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://thealinker.ca/.well-known/shopify/monorail/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["16072cab","8450a54b","7ee89bf1"],webPixelsConfigList: [{"id":"1508900941","configuration":"{\"accountID\":\"SLnEMq\",\"webPixelConfig\":\"eyJlbmFibGVBZGRlZFRvQ2FydEV2ZW50cyI6IHRydWV9\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"c63c5b72c8d77be5f2d27d14c081da38","type":"APP","apiClientId":123074,"privacyPurposes":["ANALYTICS","MARKETING"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]}
622,{"id":"137592909","configuration":"{\"pixel_id\":\"1400672013387954\",\"pixel_type\":\"facebook_pixel\",\"metaapp_system_user_token\":\"-\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"96420dbe9ea96c426a1b7f364f977719","type":"APP","apiClientId":2329312,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"66420813","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":"The Alinker Inventions Ltd.","paymentSettings":{"currencyCode":"CAD"},"myshopifyDomain":"alinker-ca.myshopify.com","countryCode":"CA","storefrontUrl":"https:\/\/thealinker.ca"},"customer":null,"cart":null,"checkout":null,"productVariants":[],"products":[],"purchasingCompany":null},},"https://thealinker.ca/cdn","a5bf51cfwabd6c495p49b74ff1maa529d2b",{"modern":"","legacy":""},{"trekkieShim":true,"agentContext":true,"apiClientId":"580111","facebookCapiEnabled":"true","themeId":"123845214285","themePublished":"true","eventMetadataId":"3bdb9db1-80ec-4456-85c4-2780493e9b3c","pageType":"searchresults","shopId":"15333935","storefrontBaseUrl":"https:\/\/thealinker.ca","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"16072cab\", \"8450a54b\", \"7ee89bf1\"]","isMerchantRequest":"false","hashVersion":"a5bf51cfwabd6c495p49b74ff1maa529d2b","publish":"custom","events":"[[\"page_viewed\",{}],[\"search_submitted\",{\"searchResult\":{\"query\":\"\",\"productVariants\":[]}}]]"});})();</script>
622<script> 623 window.ShopifyAnalytics = window.ShopifyAnalytics || {}; 624 window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {}; 625 window.ShopifyAnalytics.meta.currency = 'CAD'; 626 var meta = {"products":[],"page":{"pageType":"searchresults","requestId":"5d44a55d-320b-45d3-9fa2-c115a73804ac-1790674119"}}; 627 for (var attr in meta) { 628 window.ShopifyAnalytics.meta[attr] = meta[attr]; 629 } 630</script>
vendor: 1 bytes, line 630
630
631<script class="analytics"> 632 (function () { 633 var customDocumentWrite = function(content) { 634 var jquery = null; 635 636 if (window.jQuery) { 637 jquery = window.jQuery; 638 } else if (window.Checkout && window.Checkout.$) { 639 jquery = window.Checkout.$; 640 } 641 642 if (jquery) { 643 jquery('body').append(content); 644 } 645 }; 646 647 var hasLoggedConversion = function(token) { 648 if (token) { 649 return document.cookie.indexOf('loggedConversion=' + token) !== -1; 650 } 651 return false; 652 } 653 654 var setCookieIfConversion = function(token) { 655 if (token) { 656 var twoMonthsFromNow = new Date(Date.now()); 657 twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2); 658 659 document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow; 660 } 661 } 662 663 var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || []; 664 window.ShopifyAnalytics.lib.trekkie = window.trekkie; 665 if (trekkie.integrations) { 666 return; 667 } 668 trekkie.methods = [ 669 'identify', 670 'page', 671 'ready', 672 'track', 673 'trackForm', 674 'trackLink' 675 ]; 676 trekkie.factory = function(method) { 677 return function() { 678 var args = Array.prototype.slice.call(arguments); 679 args.unshift(method); 680 trekkie.push(args); 681 if (method == 'track' || method == 'page') { 682 var pageUrl; 683 try { 684 pageUrl = window.location.href; 685 } catch (e) {} 686 var pageReferrer; 687 try { 688 pageReferrer = document.referrer; 689 } catch (e) {} 690 try { 691 if (window.__TREKKIE_SHIM_QUEUE == null) { 692 window.__TREKKIE_SHIM_QUEUE = []; 693 } 694 window.__TREKKIE_SHIM_QUEUE.push({ 695 from: 'trekkie-stub', 696 method: method, 697 args: args.slice(1), 698 pageContext: { 699 url: pageUrl, 700 referrer: pageReferrer 701 } 702 }); 703 } catch (e) { 704 // no-op 705 } 706 } 707 return trekkie; 708 }; 709 }; 710 for (var i = 0; i < trekkie.methods.length; i++) { 711 var key = trekkie.methods[i]; 712 trekkie[key] = trekkie.factory(key); 713 } 714 trekkie.load = function(config) { 715 trekkie.config = config || {}; 716 trekkie.config.initialDocumentCookie = document.cookie; 717 var first = document.getElementsByTagName('script')[0]; 718var script = document.createElement('script'); 719script.type = 'text/javascript'; 720script.onerror = function(e) { 721 var scriptFallback = document.createElement('script'); 722 scriptFallback.type = 'text/javascript'; 723 scriptFallback.onerror = function(error) { 724 var Monorail = { 725 produce: function produce(monorailDomain, schemaId, payload) { 726 var currentMs = new Date().getTime(); 727 var event = { 728 schema_id: schemaId, 729 payload: payload, 730 metadata: { 731 event_created_at_ms: currentMs, 732 event_sent_at_ms: currentMs 733 } 734 }; 735 return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event)); 736 }, 737 sendRequest: function sendRequest(endpointUrl, payload) { 738 // Try the sendBeacon API 739 if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) { 740 var blobData = new window.Blob([payload], { 741 type: 'text/plain' 742 }); 743 744 if (window.navigator.sendBeacon(endpointUrl, blobData)) { 745 return true; 746 } // sendBeacon was not successful 747 748 } // XHR beacon 749 750 var xhr = new XMLHttpRequest(); 751 752 try { 753 xhr.open('POST', endpointUrl); 754 xhr.setRequestHeader('Content-Type', 'text/plain'); 755 xhr.send(payload); 756 } catch (e) { 757 console.log(e); 758 } 759 760 return false; 761 }, 762 isIos12: function isIos12() { 763 return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1; 764 } 765 }; 766 Monorail.produce('monorail-edge.shopifysvc.com', 767 'trekkie_storefront_load_errors/1.1', 768 {shop_id: 15333935, 769 theme_id: 123845214285, 770 app_name: "storefront", 771 context_url: window.location.href, 772 source_url: "//thealinker.ca/cdn/s/trekkie.storefront.f1ba865b3fecd812ad617f74ac079261075e9edb.min.js"}); 773 774 }; 775 scriptFallback.async = true; 776 scriptFallback.src = '//thealinker.ca/cdn/s/trekkie.storefront.f1ba865b3fecd812ad617f74ac079261075e9edb.min.js'; 777 first.parentNode.insertBefore(scriptFallback, first); 778}; 779script.async = true; 780script.src = '//thealinker.ca/cdn/s/trekkie.storefront.f1ba865b3fecd812ad617f74ac079261075e9edb.min.js'; 781first.parentNode.insertBefore(script, first); 782 783 }; 784 trekkie.load( 785 {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":15333935,"isMerchantRequest":null,"themeId":123845214285,"themeCityHash":"8457644184449260418","contentLanguage":"en","currency":"CAD","eventMetadataId":"3bdb9db1-80ec-4456-85c4-2780493e9b3c"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["764d78cb","8450a54b","7ee89bf1"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":true,"source":"trekkie-storefront-renderer","apiClientId":580111}} 786 ); 787 788 var loaded = false;
789 trekkie.ready(function() { 790 if (loaded) return; 791 loaded = true; 792 793 window.ShopifyAnalytics.lib = window.trekkie; 794 795 var originalDocumentWrite = document.write; 796 document.write = customDocumentWrite; 797 try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {}; 798 document.write = originalDocumentWrite; 799 800 var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/) 801 var token = match? match[1]: undefined; 802 if (!hasLoggedConversion(token)) { 803 setCookieIfConversion(token); 804 window.ShopifyAnalytics.lib.track("Performed Search",{"query":null},undefined,undefined,{"shopifyEmitted":true}); 805 } 806 }); 807 808 window.ShopifyAnalytics.lib.page(null,{"pageType":"searchresults","requestId":"5d44a55d-320b-45d3-9fa2-c115a73804ac-1790674119","shopifyEmitted":true}); 809 810 var eventsListenerScript = document.createElement('script'); 811 eventsListenerScript.async = true; 812 eventsListenerScript.src = "//thealinker.ca/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js"; 813 document.getElementsByTagName('head')[0].appendChild(eventsListenerScript); 814})();</script>
814 815
815<script> 816 if (!window.ga || (window.ga && typeof window.ga !== 'function')) { 817 window.ga = function ga() { 818 (window.ga.q = window.ga.q || []).push(arguments); 819 if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') { 820 window.Shopify.analytics.publish("ga_stub_called", {}, {sendTo: "google_osp_migration"}); 821 } 822 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."); 823 }; 824 if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') { 825 window.Shopify.analytics.publish("ga_stub_initialized", {}, {sendTo: "google_osp_migration"}); 826 } 827 } 828</script>
vendor: 1 bytes, line 828
828
829<script 830 defer 831 src="https://thealinker.ca/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.9.4.min.js" 832 data-application="storefront-renderer" 833 data-shop-id="15333935" 834 data-render-region="gcp-us-central1" 835 data-page-type="search" 836 data-theme-instance-id="123845214285" 837 data-theme-name="Focal" 838 data-theme-version="9.0.0" 839 data-monorail-region="shop_domain" 840 data-resource-timing-sampling-rate="10" 841 data-shs="true" 842 data-shs-beacon="true" 843 data-shs-export-with-fetch="true" 844 data-shs-logs-sample-rate="1" 845 data-shs-beacon-endpoint="https://thealinker.ca/api/collect" 846></script>
846 847<meta name="shopify-y" content="d8cb7a95-a5c1-4dc8-b735-508aac7fafba" data-expiration="1822231720000"><meta name="shopify-s" content="463af5bf-bfbd-431c-b9f4-4399e9dd6e62" data-expiration="1790675920000"><meta name="new-cookie-storage-activated" content="t"> 848</head><body class="no-focus-outline features--image-zoom" data-instant-allow-query-string> 849 <!-- Google Tag Manager (noscript) -->
vendor: 72 bytes, lines 849-850
849 850 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
850GTM-MGSRJ78
vendor: 84 bytes, lines 850-851
850" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 851
851<!-- End Google Tag Manager (noscript) --><svg class="visually-hidden"> 852 <linearGradient id="rating-star-gradient-half"> 853 <stop offset="50%" stop-color="rgb(var(--product-star-rating))" /> 854 <stop offset="50%" stop-color="rgb(var(--product-star-rating))" stop-opacity="0.4" /> 855 </linearGradient> 856 </svg> 857 858 <a href="#main" class="visually-hidden skip-to-content">Skip to content</a> 859 <loading-bar class="loading-bar"></loading-bar><div id="shopify-section-announcement-bar" class="shopify-section shopify-section--announcement-bar"><style> 860 :root { 861 --enable-sticky-announcement-bar: 0; 862 } 863 864 #shopify-section-announcement-bar { 865 --heading-color: 40, 40, 40; 866 --text-color: 40, 40, 40; 867 --primary-button-background: 40, 40, 40; 868 --primary-button-text-color: 255, 255, 255; 869 --section-background: 255, 192, 0; 870 z-index: 5; /* Make sure it goes over header */position: relative;top: 0; 871 } 872 873 @media screen and (min-width: 741px) { 874 :root { 875 --enable-sticky-announcement-bar: 0; 876 } 877 878 #shopify-section-announcement-bar {position: relative;} 879 } 880</style></div><div id="shopify-section-popup" class="shopify-section shopify-section--popup"><style> 881 [aria-controls="newsletter-popup"] { 882 display: none; /* Allows to hide the toggle icon in the header if the section is disabled */ 883 } 884 </style></div><div id="shopify-section-header" class="shopify-section shopify-section--header"><style> 885 :root { 886 --enable-sticky-header: 1; 887 --enable-transparent-header: 0; 888 --loading-bar-background: 80, 72, 91; /* Prevent the loading bar to be invisible */ 889 } 890 891 #shopify-section-header {--header-background: 245, 245, 245; 892 --header-text-color: 80, 72, 91; 893 --header-border-color: 220, 219, 222; 894 --reduce-header-padding: 1;position: -webkit-sticky; 895 position: sticky;top: calc(var(--enable-sticky-announcement-bar) * var(--announcement-bar-height, 0px)); 896 z-index: 4; 897 }#shopify-section-header .header__logo-image { 898 max-width: 100px; 899 } 900 901 @media screen and (min-width: 741px) { 902 #shopify-section-header .header__logo-image { 903 max-width: 140px; 904 } 905 } 906 907 @media screen and (min-width: 1200px) {/* For this navigation we have to move the logo and make sure the navigation takes the whole width */ 908 .header__logo { 909 order: -1; 910 flex: 1 1 0; 911 } 912 913 .header__inline-navigation { 914 flex: 1 1 auto; 915 justify-content: center; 916 max-width: max-content; 917 margin-inline: 48px; 918 }}</style> 919 920<store-header sticky class="header " role="banner"><div class="container"> 921 <div class="header__wrapper"> 922 <!-- LEFT PART --> 923 <nav class="header__inline-navigation" role="navigation"><desktop-navigation> 924 <ul class="header__linklist list--unstyled hidden-pocket hidden-lap" role="list"><li class="header__linklist-item has-dropdown" data-item-title="Shop"> 925 <a class="header__linklist-link link--animated" href="#" aria-controls="desktop-menu-1" aria-expanded="false">Shop</a><div hidden id="desktop-menu-1" class="mega-menu" > 926 <div class="container"> 927 <div class="mega-menu__inner"><div class="mega-menu__columns-wrapper"><div class="mega-menu__column"><a href="/products/the-alinker" class="mega-menu__title heading heading--small">The Alinker</a></div><div class="mega-menu__column"><a href="/products/the-alinker-rent-to-own" class="mega-menu__title heading heading--small">Rent to Own</a></div><div class="mega-menu__column"><a href="/products/gently-used-alinker-series" class="mega-menu__title heading heading--small">Gently Used Alinker</a></div><div class="mega-menu__column"><a href="/collections/replacement-parts" class="mega-menu__title heading heading--small">Replacement Parts</a></div><div class="mega-menu__column"><a href="/products/alinker-rear-wheel" class="mega-menu__title heading heading--small">Rear Wheel</a></div></div><div class="mega-menu__images-wrapper mega-menu__images-wrapper--tight"><a href="/products/the-alinker" class="mega-menu__image-push image-zoom"><div class="mega-menu__image-wrapper"> 928 <img class="mega-menu__image" loading="lazy" sizes="240px" height="500" width="500" alt="" src="//thealinker.ca/cdn/shop/files/img_0010_anna_500x.jpg?v=1741369380" srcset="//thealinker.ca/cdn/shop/files/img_0010_anna_240x.jpg?v=1741369380 240w, //thealinker.ca/cdn/shop/files/img_0010_anna_480x.jpg?v=1741369380 480w, //thealinker.ca/cdn/shop/files/img_0010_anna_500x.jpg?v=1741369380 500w"> 929 </div><p class="mega-menu__heading heading heading--small">The Alinker</p></a><a href="/products/the-alinker-rent-to-own" class="mega-menu__image-push image-zoom"><div class="mega-menu__image-wrapper"> 930 <img class="mega-menu__image" loading="lazy" sizes="240px" height="496" width="500" alt="" src="//thealinker.ca/cdn/shop/files/img_placeholder_0003_Layer_2_500x.jpg?v=1677784281" srcset="//thealinker.ca/cdn/shop/files/img_placeholder_0003_Layer_2_240x.jpg?v=1677784281 240w, //thealinker.ca/cdn/shop/files/img_placeholder_0003_Layer_2_480x.jpg?v=1677784281 480w, //thealinker.ca/cdn/shop/files/img_placeholder_0003_Layer_2_500x.jpg?v=1677784281 500w"> 931 </div><p class="mega-menu__heading heading heading--small">Rent to own</p></a><a href="/products/gently-used-alinker" class="mega-menu__image-push image-zoom"><div class="mega-menu__image-wrapper"> 932 <img class="mega-menu__image" loading="lazy" sizes="240px" height="496" width="500" alt="" src="//thealinker.ca/cdn/shop/files/img_placeholder_0005_Backgroun
932d_500x.jpg?v=1677784318" srcset="//thealinker.ca/cdn/shop/files/img_placeholder_0005_Background_240x.jpg?v=1677784318 240w, //thealinker.ca/cdn/shop/files/img_placeholder_0005_Background_480x.jpg?v=1677784318 480w, //thealinker.ca/cdn/shop/files/img_placeholder_0005_Background_500x.jpg?v=1677784318 500w"> 933 </div><p class="mega-menu__heading heading heading--small">Gently Used</p></a></div></div> 934 </div> 935 </div></li><li class="header__linklist-item has-dropdown" data-item-title="Learn More"> 936 <a class="header__linklist-link link--animated" href="#" aria-controls="desktop-menu-2" aria-expanded="false">Learn More</a><div hidden id="desktop-menu-2" class="mega-menu" > 937 <div class="container"> 938 <div class="mega-menu__inner"><div class="mega-menu__columns-wrapper"><div class="mega-menu__column"><a href="/pages/crowdfund-alinker-family" class="mega-menu__title heading heading--small">Crowdfund</a></div><div class="mega-menu__column"><a href="/pages/faq" class="mega-menu__title heading heading--small">FAQ</a></div><div class="mega-menu__column"><a href="/pages/how-it-works" class="mega-menu__title heading heading--small">How it works</a></div><div class="mega-menu__column"><a href="/pages/warranty" class="mega-menu__title heading heading--small">Warranty + Refund</a></div></div><div class="mega-menu__images-wrapper mega-menu__images-wrapper--tight"><a href="/pages/crowdfund-alinker-family" class="mega-menu__image-push image-zoom"><div class="mega-menu__image-wrapper"> 939 <img class="mega-menu__image" loading="lazy" sizes="240px" height="496" width="500" alt="" src="//thealinker.ca/cdn/shop/files/img_placeholder_0000_Layer_5_500x.jpg?v=1677784389" srcset="//thealinker.ca/cdn/shop/files/img_placeholder_0000_Layer_5_240x.jpg?v=1677784389 240w, //thealinker.ca/cdn/shop/files/img_placeholder_0000_Layer_5_480x.jpg?v=1677784389 480w, //thealinker.ca/cdn/shop/files/img_placeholder_0000_Layer_5_500x.jpg?v=1677784389 500w"> 940 </div><p class="mega-menu__heading heading heading--small">Crowdfund</p></a><a href="/pages/faq" class="mega-menu__image-push image-zoom"><div class="mega-menu__image-wrapper"> 941 <img class="mega-menu__image" loading="lazy" sizes="240px" height="496" width="500" alt="" src="//thealinker.ca/cdn/shop/files/img_placeholder_0002_Layer_3_500x.jpg?v=1677784389" srcset="//thealinker.ca/cdn/shop/files/img_placeholder_0002_Layer_3_240x.jpg?v=1677784389 240w, //thealinker.ca/cdn/shop/files/img_placeholder_0002_Layer_3_480x.jpg?v=1677784389 480w, //thealinker.ca/cdn/shop/files/img_placeholder_0002_Layer_3_500x.jpg?v=1677784389 500w"> 942 </div><p class="mega-menu__heading heading heading--small">FAQ</p></a><a href="/pages/how-it-works" class="mega-menu__image-push image-zoom"><div class="mega-menu__image-wrapper"> 943 <img class="mega-menu__image" loading="lazy" sizes="240px" height="390" width="390" alt="" src="//thealinker.ca/cdn/shop/files/img_390px_0005_Layer_6_390x_jpg_390x.webp?v=1677784426" srcset="//thealinker.ca/cdn/shop/files/img_390px_0005_Layer_6_390x_jpg_240x.webp?v=1677784426 240w, //thealinker.ca/cdn/shop/files/img_390px_0005_Layer_6_390x_jpg_390x.webp?v=1677784426 390w"> 944 </div><p class="mega-menu__heading heading heading--small">How it Works</p></a><a href="/pages/limited-warranty" class="mega-menu__image-push image-zoom"><div class="mega-menu__image-wrapper"> 945 <img class="mega-menu__image" loading="lazy" sizes="240px" height="480" width="480" alt="" src="//thealinker.ca/cdn/shop/files/3_-_Back_in_charge_480x_jpg_480x.webp?v=1677781930" srcset="//thealinker.ca/cdn/shop/files/3_-_Back_in_charge_480x_jpg_240x.webp?v=1677781930 240w, //thealinker.ca/cdn/shop/files/3_-_Back_in_charge_480x_jpg_480x.webp?v=1677781930 480w"> 946 </div><p class="mega-menu__heading heading heading--small">Warranty + Refund</p></a></div></div> 947 </div> 948 </div></li><li class="header__linklist-item has-dropdown" data-item-title="About"> 949 <a class="header__linklist-link link--animated" href="#" aria-controls="desktop-menu-3" aria-expanded="false">About</a><div hidden id="desktop-menu-3" class="mega-menu" > 950 <div class="container"> 951 <div class="mega-menu__inner"><div class="mega-menu__columns-wrapper"><div class="mega-menu__column"><a href="/pages/about" class="mega-menu__title heading heading--small">About Us</a></div><div class="mega-menu__column"><a href="/pages/contact-us" class="mega-menu__title heading heading--small">Contact Us</a></div><div class="mega-menu__column"><a href="/pages/international-distribution-partners" class="mega-menu__title heading heading--small">International Distribution</a></div></div><div class="mega-menu__images-wrapper mega-menu__images-wrapper--tight"><a href="/pages/about" class="mega-menu__image-push image-zoom"><div class="mega-menu__image-wrapper"> 952 <img class="mega-menu__image" loading="lazy" sizes="240px" height="480" width="480" alt="" src="//thealinker.ca/cdn/shop/files/Barbara_on_Alinker_1024_480x_JPG_480x.webp?v=1677784464" srcset="//thealinker.ca/cdn/shop/files/Barbara_on_Alinker_1024_480x_JPG_240x.webp?v=1677784464 240w, //thealinker.ca/cdn/shop/files/Barbara_on_Alinker_1024_480x_JPG_480x.webp?v=1677784464 480w"> 953 </div><p class="mega-menu__heading heading heading--small">About Us</p></a><a href="/pages/contact-us" class="mega-menu__image-push image-zoom"><div class="mega-menu__image-wrapper"> 954 <img class="mega-menu__image" loading="lazy" sizes="240px" height="390" width="390" alt="" src="//thealinker.ca/cdn/shop/files/img_390px_0007_Layer_4_390x_jpg_390x.webp?v=1677784473" srcset="//thealinker.ca/cdn/shop/files/img_390px_0007_Layer_4_390x_jpg_240x.webp?v=1677784473 240w, //thealinker.ca/cdn/shop/files/img_390px_0007_Layer_4_390x_jpg_390x.webp?v=1677784473 390w"> 955 </div><p class="mega-menu__heading heading heading--small">Contact Us</p></a><a href="/pages/international-distribution-partners" class="mega-menu__image-push image-zoom"><div class="mega-menu__image-wrapper"> 956 <img class="mega-menu__image" loading="lazy" sizes="240px" height="480" width="480" alt="" src="//thealinker.ca/cdn/shop/files/2_-_Go_beyond_480x_jpg_480x.webp?v=1677781930" srcset="//thealinker.ca/cdn/shop/files/2_-_Go_beyond_480x_jpg_240x.webp?v=1677781930 240w, //thealinker.ca/cdn/shop/files/2_-_Go_beyond_480x_jpg_480x.webp?v=1677781930 480w"> 957 </div><p class="mega-menu__heading heading heading--small">International Distribution</p></a></div></div> 958 </div> 959 </div></li><li class="header__linklist-item has-dropdown" data-item-title="Community"> 960 <a class="header__linklist-link link--animated" href="#" aria-controls="desktop-menu-4" aria-expanded="false">Community</a><div hidden id="desktop-menu-4" class="mega-menu" > 961 <div class="container"> 962 <div class="mega-menu__inner"><div class="mega-menu__columns-wrapper"><div class="mega-menu__column"><a href="/blogs/all" class="mega-menu__title heading heading--small">The Blog</a></div><div class="mega-menu__column"><a href="/pages/testimonials" class="mega-menu__title heading heading--small">Testimonials</a></div><div class="mega-menu__column"><a href="/pages/newsletter-archive" class="mega-menu__title heading heading--small">Newsletter Archive</a></div></div><div class="mega-menu__images-wrapper mega-menu__images-wrapper--tight"><a href="/blogs/all" class="mega-menu__image-push image-zoom"><div class="mega-menu__image-wrapper"> 963 <img class="mega-menu__image" loading="lazy" sizes="240px" height="496" width="500" alt="" src="//thealinker.ca/cdn/shop/files/img_placeholder_0004_Layer_1_500x.jpg?v=1677784523" srcset="//thealinker.ca/cdn/shop/files/img_placeholder_0004_Layer_1_240x.jpg?v=1677784523 240w, //thealinker.ca/cdn/shop/files/img_placeholder_0004_Layer_1_480x.jpg?v=1677784523 480w, //thealinker.ca/cdn/shop/files/img_placeholder_0004_Layer_1_500x.jpg?v=1677784523 500w"> 964 </div><p class="mega-menu__heading heading heading--small">Alinker Blog</p></a><a href="/pages/testimonials" class="mega-menu__image-push image-zoom"><div class="mega-menu__image-wrapper"> 965 <img class="mega-menu__image" loading="lazy" sizes="240px" height="480" width="480" alt="" src="//thealinker.ca/cdn/shop/files/1_-_Be_active_480x_jpg_480x.webp?v=1677781930" srcset="//thealinker.ca/cdn/shop/files/1_-_Be_active_480x_jpg_240x.webp?v=1677781930 240w, //thealinker.ca/cdn/shop/files/1_-_Be_active_480x_jpg_480x.webp?v=1677781930 480w"> 966 </div><p class="mega-menu__heading heading heading--small">Testimonials</p></a><a href="/pages/newsletter-archive" class="mega-menu__image-push image-zoom"><div class="mega-menu__image-wrapper"> 967 <img class="mega-menu__image" loading="lazy" sizes="240px" height="480" width="480" alt="" src="//thealinker.ca/cdn/shop/files/6_-_Overcome_480x_jpg_480x.webp?v=1677781930" srcset="//thealinker.ca/cdn/shop/files/6_-_Overcome_480x_jpg_240x.webp?v=1677781930 240w, //thealinker.ca/cdn/shop/files/6_-_Overcome_480x_jpg_480x.webp?v=1677781930 480w"> 968 </div><p class="mega-menu__heading heading heading--small">Newsletter Archive</p></a></div></div> 969 </div> 970 </div></li><li class="header__linklist-item " data-item-title="Order Now"> 971 <a class="header__linklist-link link--animated" href="/pages/ways-to-buy" >Order Now</a></li></ul> 972</desktop-navigation><div class="header__icon-list "><button is="toggle-button" class="header__icon-wrapper tap-area hidden-desk" aria-controls="mobile-menu-drawer" aria-expanded="false">
973 <span class="visually-hidden">Navigation</span><svg focusable="false" width="18" height="14" class="icon icon--header-hamburger " viewBox="0 0 18 14"> 974 <path d="M0 1h18M0 13h18H0zm0-6h18H0z" fill="none" stroke="currentColor" stroke-width="2"></path> 975 </svg></button><a href="/search" is="toggle-link" class="header__icon-wrapper tap-area hidden-desk" aria-controls="search-drawer" aria-expanded="false" aria-label="Search"><svg focusable="false" width="18" height="18" class="icon icon--header-search " viewBox="0 0 18 18"> 976 <path d="M12.336 12.336c2.634-2.635 2.682-6.859.106-9.435-2.576-2.576-6.8-2.528-9.435.106C.373 5.642.325 9.866 2.901 12.442c2.576 2.576 6.8 2.528 9.435-.106zm0 0L17 17" fill="none" stroke="currentColor" stroke-width="2"></path> 977 </svg></a> 978 </div></nav> 979 980 <!-- LOGO PART --><span class="header__logo"><a class="header__logo-link" href="/"><span class="visually-hidden">The Alinker Inventions Ltd.</span> 981 <img class="header__logo-image" width="280" height="105" src="//thealinker.ca/cdn/shop/files/checkout_logo_5_280x_png_280x.webp?v=1677781700" alt=""></a></span><!-- SECONDARY LINKS PART --> 982 <div class="header__secondary-links"><form method="post" action="/localization" id="header-localization-form" accept-charset="UTF-8" class="header__cross-border hidden-pocket" enctype="multipart/form-data"><input type="hidden" name="form_type" value="localization" /><input type="hidden" name="utf8" value="✓" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="return_to" value="/search" /><div class="popover-container"> 983 <input type="hidden" name="locale_code" value="en"> 984 <span class="visually-hidden">Language</span> 985 986 <button type="button" is="toggle-button" class="popover-button text--small" aria-expanded="false" aria-controls="header-localization-form-locale">English<svg focusable="false" width="9" height="6" class="icon icon--chevron icon--inline " viewBox="0 0 12 8"> 987 <path fill="none" d="M1 1l5 5 5-5" stroke="currentColor" stroke-width="2"></path> 988 </svg></button> 989 990 <popover-content id="header-localization-form-locale" class="popover"> 991 <span class="popover__overlay"></span> 992 993 <header class="popover__header"> 994 <span class="popover__title heading h6">Language</span> 995 996 <button type="button" class="popover__close-button tap-area tap-area--large" data-action="close" title="Close"><svg focusable="false" width="14" height="14" class="icon icon--close " viewBox="0 0 14 14"> 997 <path d="M13 13L1 1M13 1L1 13" stroke="currentColor" stroke-width="2" fill="none"></path> 998 </svg></button> 999 </header> 1000 1001 <div class="popover__content"> 1002 <div class="popover__choice-list"><button type="submit" name="locale_code" value="en" class="popover__choice-item"> 1003 <span class="popover__choice-label" aria-current="true">English</span> 1004 </button><button type="submit" name="locale_code" value="fr" class="popover__choice-item"> 1005 <span class="popover__choice-label" >Français</span> 1006 </button></div> 1007 </div> 1008 </popover-content> 1009 </div></form><div class="header__icon-list"><button is="toggle-button" class="header__icon-wrapper tap-area hidden-phone " aria-controls="newsletter-popup" aria-expanded="false"> 1010 <span class="visually-hidden">Newsletter</span><svg focusable="false" width="20" height="16" class="icon icon--header-email " viewBox="0 0 20 16"> 1011 <path d="M19 4l-9 5-9-5" fill="none" stroke="currentColor" stroke-width="2"></path> 1012 <path stroke="currentColor" fill="none" stroke-width="2" d="M1 1h18v14H1z"></path> 1013 </svg></button><a href="/search" is="toggle-link" class="header__icon-wrapper tap-area hidden-pocket hidden-lap " aria-label="Search" aria-controls="search-drawer" aria-expanded="false"><svg focusable="false" width="18" height="18" class="icon icon--header-search " viewBox="0 0 18 18"> 1014 <path d="M12.336 12.336c2.634-2.635 2.682-6.859.106-9.435-2.576-2.576-6.8-2.528-9.435.106C.373 5.642.325 9.866 2.901 12.442c2.576 2.576 6.8 2.528 9.435-.106zm0 0L17 17" fill="none" stroke="currentColor" stroke-width="2"></path> 1015 </svg></a><a href="https://thealinker.ca/customer_authentication/redirect?locale=en®ion_country=CA" class="header__icon-wrapper tap-area hidden-phone " aria-label="Login"><svg focusable="false" width="18" height="17" class="icon icon--header-customer " viewBox="0 0 18 17"> 1016 <circle cx="9" cy="5" r="4" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round"></circle> 1017 <path d="M1 17v0a4 4 0 014-4h8a4 4 0 014 4v0" fill="none" stroke="currentColor" stroke-width="2"></path> 1018 </svg></a><a href="/cart" class="header__icon-wrapper tap-area " aria-label="Cart" data-no-instant><svg focusable="false" width="20" height="18" class="icon icon--header-cart " viewBox="0 0 20 18"> 1019 <path d="M3 1h14l1 16H2L3 1z" fill="none" stroke="currentColor" stroke-width="2"></path> 1020 <path d="M7 4v0a3 3 0 003 3v0a3 3 0 003-3v0" fill="none" stroke="currentColor" stroke-width="2"></path> 1021 </svg><cart-count class="header__cart-count header__cart-count--floating bubble-count">0</cart-count> 1022 </a> 1023 </div></div> 1024 </div></div> 1025</store-header><cart-notification global hidden class="cart-notification "></cart-notification><mobile-navigation append-body id="mobile-menu-drawer" class="drawer drawer--from-left"> 1026 <span class="drawer__overlay"></span> 1027 1028 <div class="drawer__header drawer__header--shadowed"> 1029 <button type="button" class="drawer__close-button drawer__close-button--block tap-area" data-action="close" title="Close"><svg focusable="false" width="14" height="14" class="icon icon--close " viewBox="0 0 14 14"> 1030 <path d="M13 13L1 1M13 1L1 13" stroke="currentColor" stroke-width="2" fill="none"></path> 1031 </svg></button> 1032 </div> 1033 1034 <div class="drawer__content"> 1035 <ul class="mobile-nav list--unstyled" role="list"><li class="mobile-nav__item" data-level="1"><button is="toggle-button" class="mobile-nav__link heading h6" aria-controls="mobile-menu-1" aria-expanded="false">Shop<span class="animated-plus"></span> 1036 </button> 1037 1038 <collapsible-content id="mobile-menu-1" class="collapsible"><ul class="mobile-nav list--unstyled" role="list"><li class="mobile-nav__item" data-level="2"><a href="/products/the-alinker" class="mobile-nav__link">The Alinker</a></li><li class="mobile-nav__item" data-level="2"><a href="/products/the-alinker-rent-to-own" class="mobile-nav__link">Rent to Own</a></li><li class="mobile-nav__item" data-level="2"><a href="/products/gently-used-alinker-series" class="mobile-nav__link">Gently Used Alinker</a></li><li class="mobile-nav__item" data-level="2"><a href="/collections/replacement-parts" class="mobile-nav__link">Replacement Parts</a></li><li class="mobile-nav__item" data-level="2"><a href="/products/alinker-rear-wheel" class="mobile-nav__link">Rear Wheel</a></li></ul><div class="mobile-nav__images-wrapper mobile-nav__images-wrapper--tight hide-scrollbar"> 1039 <div class="mobile-nav__images-scroller"><a href="/products/the-alinker" class="mobile-nav__image-push"><img class="mobile-nav__image" loading="lazy" sizes="270px" height="500" width="500" alt="" src="//thealinker.ca/cdn/shop/files/img_0010_anna_500x.jpg?v=1741369380" srcset="//thealinker.ca/cdn/shop/files/img_0010_anna_270x.jpg?v=1741369380 270w, //thealinker.ca/cdn/shop/files/img_0010_anna_500x.jpg?v=1741369380 500w"><p class="mobile-nav__image-heading heading heading--xsmall">The Alinker</p></a><a href="/products/the-alinker-rent-to-own" class="mobile-nav__image-push"><img class="mobile-nav__image" loading="lazy" sizes="270px" height="496" width="500" alt="" src="//thealinker.ca/cdn/shop/files/img_placeholder_0003_Layer_2_500x.jpg?v=1677784281" srcset="//thealinker.ca/cdn/shop/files/img_placeholder_0003_Layer_2_270x.jpg?v=1677784281 270w, //thealinker.ca/cdn/shop/files/img_placeholder_0003_Layer_2_500x.jpg?v=1677784281 500w"><p class="mobile-nav__image-heading heading heading--xsmall">Rent to own</p></a><a href="/products/gently-used-alinker" class="mobile-nav__image-push"><img class="mobile-nav__image" loading="lazy" sizes="270px" height="496" width="500" alt="" src="//thealinker.ca/cdn/shop/files/img_placeholder_0005_Backgroun
1039d_500x.jpg?v=1677784318" srcset="//thealinker.ca/cdn/shop/files/img_placeholder_0005_Background_270x.jpg?v=1677784318 270w, //thealinker.ca/cdn/shop/files/img_placeholder_0005_Background_500x.jpg?v=1677784318 500w"><p class="mobile-nav__image-heading heading heading--xsmall">Gently Used</p></a></div> 1040 </div></collapsible-content></li><li class="mobile-nav__item" data-level="1"><button is="toggle-button" class="mobile-nav__link heading h6" aria-controls="mobile-menu-2" aria-expanded="false">Learn More<span class="animated-plus"></span> 1041 </button> 1042 1043 <collapsible-content id="mobile-menu-2" class="collapsible"><ul class="mobile-nav list--unstyled" role="list"><li class="mobile-nav__item" data-level="2"><a href="/pages/crowdfund-alinker-family" class="mobile-nav__link">Crowdfund</a></li><li class="mobile-nav__item" data-level="2"><a href="/pages/faq" class="mobile-nav__link">FAQ</a></li><li class="mobile-nav__item" data-level="2"><a href="/pages/how-it-works" class="mobile-nav__link">How it works</a></li><li class="mobile-nav__item" data-level="2"><a href="/pages/warranty" class="mobile-nav__link">Warranty + Refund</a></li></ul><div class="mobile-nav__images-wrapper mobile-nav__images-wrapper--tight hide-scrollbar"> 1044 <div class="mobile-nav__images-scroller"><a href="/pages/crowdfund-alinker-family" class="mobile-nav__image-push"><img class="mobile-nav__image" loading="lazy" sizes="270px" height="496" width="500" alt="" src="//thealinker.ca/cdn/shop/files/img_placeholder_0000_Layer_5_500x.jpg?v=1677784389" srcset="//thealinker.ca/cdn/shop/files/img_placeholder_0000_Layer_5_270x.jpg?v=1677784389 270w, //thealinker.ca/cdn/shop/files/img_placeholder_0000_Layer_5_500x.jpg?v=1677784389 500w"><p class="mobile-nav__image-heading heading heading--xsmall">Crowdfund</p></a><a href="/pages/faq" class="mobile-nav__image-push"><img class="mobile-nav__image" loading="lazy" sizes="270px" height="496" width="500" alt="" src="//thealinker.ca/cdn/shop/files/img_placeholder_0002_Layer_3_500x.jpg?v=1677784389" srcset="//thealinker.ca/cdn/shop/files/img_placeholder_0002_Layer_3_270x.jpg?v=1677784389 270w, //thealinker.ca/cdn/shop/files/img_placeholder_0002_Layer_3_500x.jpg?v=1677784389 500w"><p class="mobile-nav__image-heading heading heading--xsmall">FAQ</p></a><a href="/pages/how-it-works" class="mobile-nav__image-push"><img class="mobile-nav__image" loading="lazy" sizes="270px" height="390" width="390" alt="" src="//thealinker.ca/cdn/shop/files/img_390px_0005_Layer_6_390x_jpg_390x.webp?v=1677784426" srcset="//thealinker.ca/cdn/shop/files/img_390px_0005_Layer_6_390x_jpg_270x.webp?v=1677784426 270w, //thealinker.ca/cdn/shop/files/img_390px_0005_Layer_6_390x_jpg_390x.webp?v=1677784426 390w"><p class="mobile-nav__image-heading heading heading--xsmall">How it Works</p></a><a href="/pages/limited-warranty" class="mobile-nav__image-push"><img class="mobile-nav__image" loading="lazy" sizes="270px" height="480" width="480" alt="" src="//thealinker.ca/cdn/shop/files/3_-_Back_in_charge_480x_jpg_480x.webp?v=1677781930" srcset="//thealinker.ca/cdn/shop/files/3_-_Back_in_charge_480x_jpg_270x.webp?v=1677781930 270w, //thealinker.ca/cdn/shop/files/3_-_Back_in_charge_480x_jpg_480x.webp?v=1677781930 480w"><p class="mobile-nav__image-heading heading heading--xsmall">Warranty + Refund</p></a></div> 1045 </div></collapsible-content></li><li class="mobile-nav__item" data-level="1"><button is="toggle-button" class="mobile-nav__link heading h6" aria-controls="mobile-menu-3" aria-expanded="false">About<span class="animated-plus"></span> 1046 </button> 1047 1048 <collapsible-content id="mobile-menu-3" class="collapsible"><ul class="mobile-nav list--unstyled" role="list"><li class="mobile-nav__item" data-level="2"><a href="/pages/about" class="mobile-nav__link">About Us</a></li><li class="mobile-nav__item" data-level="2"><a href="/pages/contact-us" class="mobile-nav__link">Contact Us</a></li><li class="mobile-nav__item" data-level="2"><a href="/pages/international-distribution-partners" class="mobile-nav__link">International Distribution</a></li></ul><div class="mobile-nav__images-wrapper mobile-nav__images-wrapper--tight hide-scrollbar"> 1049 <div class="mobile-nav__images-scroller"><a href="/pages/about" class="mobile-nav__image-push"><img class="mobile-nav__image" loading="lazy" sizes="270px" height="480" width="480" alt="" src="//thealinker.ca/cdn/shop/files/Barbara_on_Alinker_1024_480x_JPG_480x.webp?v=1677784464" srcset="//thealinker.ca/cdn/shop/files/Barbara_on_Alinker_1024_480x_JPG_270x.webp?v=1677784464 270w, //thealinker.ca/cdn/shop/files/Barbara_on_Alinker_1024_480x_JPG_480x.webp?v=1677784464 480w"><p class="mobile-nav__image-heading heading heading--xsmall">About Us</p></a><a href="/pages/contact-us" class="mobile-nav__image-push"><img class="mobile-nav__image" loading="lazy" sizes="270px" height="390" width="390" alt="" src="//thealinker.ca/cdn/shop/files/img_390px_0007_Layer_4_390x_jpg_390x.webp?v=1677784473" srcset="//thealinker.ca/cdn/shop/files/img_390px_0007_Layer_4_390x_jpg_270x.webp?v=1677784473 270w, //thealinker.ca/cdn/shop/files/img_390px_0007_Layer_4_390x_jpg_390x.webp?v=1677784473 390w"><p class="mobile-nav__image-heading heading heading--xsmall">Contact Us</p></a><a href="/pages/international-distribution-partners" class="mobile-nav__image-push"><img class="mobile-nav__image" loading="lazy" sizes="270px" height="480" width="480" alt="" src="//thealinker.ca/cdn/shop/files/2_-_Go_beyond_480x_jpg_480x.webp?v=1677781930" srcset="//thealinker.ca/cdn/shop/files/2_-_Go_beyond_480x_jpg_270x.webp?v=1677781930 270w, //thealinker.ca/cdn/shop/files/2_-_Go_beyond_480x_jpg_480x.webp?v=1677781930 480w"><p class="mobile-nav__image-heading heading heading--xsmall">International Distribution</p></a></div> 1050 </div></collapsible-content></li><li class="mobile-nav__item" data-level="1"><button is="toggle-button" class="mobile-nav__link heading h6" aria-controls="mobile-menu-4" aria-expanded="false">Community<span class="animated-plus"></span> 1051 </button> 1052 1053 <collapsible-content id="mobile-menu-4" class="collapsible"><ul class="mobile-nav list--unstyled" role="list"><li class="mobile-nav__item" data-level="2"><a href="/blogs/all" class="mobile-nav__link">The Blog</a></li><li class="mobile-nav__item" data-level="2"><a href="/pages/testimonials" class="mobile-nav__link">Testimonials</a></li><li class="mobile-nav__item" data-level="2"><a href="/pages/newsletter-archive" class="mobile-nav__link">Newsletter Archive</a></li></ul><div class="mobile-nav__images-wrapper mobile-nav__images-wrapper--tight hide-scrollbar"> 1054 <div class="mobile-nav__images-scroller"><a href="/blogs/all" class="mobile-nav__image-push"><img class="mobile-nav__image" loading="lazy" sizes="270px" height="496" width="500" alt="" src="//thealinker.ca/cdn/shop/files/img_placeholder_0004_Layer_1_500x.jpg?v=1677784523" srcset="//thealinker.ca/cdn/shop/files/img_placeholder_0004_Layer_1_270x.jpg?v=1677784523 270w, //thealinker.ca/cdn/shop/files/img_placeholder_0004_Layer_1_500x.jpg?v=1677784523 500w"><p class="mobile-nav__image-heading heading heading--xsmall">Alinker Blog</p></a><a href="/pages/testimonials" class="mobile-nav__image-push"><img class="mobile-nav__image" loading="lazy" sizes="270px" height="480" width="480" alt="" src="//thealinker.ca/cdn/shop/files/1_-_Be_active_480x_jpg_480x.webp?v=1677781930" srcset="//thealinker.ca/cdn/shop/files/1_-_Be_active_480x_jpg_270x.webp?v=1677781930 270w, //thealinker.ca/cdn/shop/files/1_-_Be_active_480x_jpg_480x.webp?v=1677781930 480w"><p class="mobile-nav__image-heading heading heading--xsmall">Testimonials</p></a><a href="/pages/newsletter-archive" class="mobile-nav__image-push"><img class="mobile-nav__image" loading="lazy" sizes="270px" height="480" width="480" alt="" src="//thealinker.ca/cdn/shop/files/6_-_Overcome_480x_jpg_480x.webp?v=1677781930" srcset="//thealinker.ca/cdn/shop/files/6_-_Overcome_480x_jpg_270x.webp?v=1677781930 270w, //thealinker.ca/cdn/shop/files/6_-_Overcome_480x_jpg_480x.webp?v=1677781930 480w"><p class="mobile-nav__image-heading heading heading--xsmall">Newsletter Archive</p></a></div> 1055 </div></collapsible-content></li><li class="mobile-nav__item" data-level="1"><a href="/pages/ways-to-buy" class="mobile-nav__link heading h6">Order Now</a></li></ul> 1056 </div><div class="drawer__footer drawer__footer--tight drawer__footer--bordered"> 1057 <div class="mobile-nav__footer"><a class="icon-text" href="https://thealinker.ca/customer_authentication/redirect?locale=en®ion_country=CA"><svg focusable="false" width="18" height="17" class="icon icon--header-customer " viewBox="0 0 18 17"> 1058 <circle cx="9" cy="5" r="4" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round"></circle> 1059 <path d="M1 17v0a4 4 0 014-4h8a4 4 0 014 4v0" fill="none" stroke="currentColor" stroke-width="2"></path> 1060 </svg>Account</a><form method="post" action="/localization" id="header-sidebar-localization-form" accept-charset="UTF-8" class="header__cross-border" enctype="multipart/form-data"><input type="hidden" name="form_type" value="localization" /><input type="hidden" name="utf8" value="✓" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="return_to" value="/search" /><div class="popover-container"> 1061 <input type="hidden" name="locale_code" value="en">
1062 <span class="visually-hidden">Language</span> 1063 1064 <button type="button" is="toggle-button" class="popover-button text--xsmall tap-area" aria-expanded="false" aria-controls="header-sidebar-localization-form-locale">English<svg focusable="false" width="9" height="6" class="icon icon--chevron icon--inline " viewBox="0 0 12 8"> 1065 <path fill="none" d="M1 1l5 5 5-5" stroke="currentColor" stroke-width="2"></path> 1066 </svg></button> 1067 1068 <popover-content id="header-sidebar-localization-form-locale" class="popover popover--top popover--small"> 1069 <span class="popover__overlay"></span> 1070 1071 <header class="popover__header"> 1072 <span class="popover__title heading h6">Language</span> 1073 1074 <button type="button" class="popover__close-button tap-area tap-area--large" data-action="close" title="Close"><svg focusable="false" width="14" height="14" class="icon icon--close " viewBox="0 0 14 14"> 1075 <path d="M13 13L1 1M13 1L1 13" stroke="currentColor" stroke-width="2" fill="none"></path> 1076 </svg></button> 1077 </header> 1078 1079 <div class="popover__content"> 1080 <div class="popover__choice-list"><button type="submit" name="locale_code" value="en" class="popover__choice-item"> 1081 <span class="popover__choice-label" aria-current="true">English</span> 1082 </button><button type="submit" name="locale_code" value="fr" class="popover__choice-item"> 1083 <span class="popover__choice-label" >Français</span> 1084 </button></div> 1085 </div> 1086 </popover-content> 1087 </div></form></div> 1088 </div></mobile-navigation><predictive-search-drawer append-body reverse-breakpoint="screen and (min-width: 1200px)" id="search-drawer" initial-focus-selector="#search-drawer [name='q']" class="predictive-search drawer drawer--large drawer--from-left"> 1089 <span class="drawer__overlay"></span> 1090 1091 <header class="drawer__header"> 1092 <form id="predictive-search-form" action="/search" method="get" class="predictive-search__form"><svg focusable="false" width="18" height="18" class="icon icon--header-search " viewBox="0 0 18 18"> 1093 <path d="M12.336 12.336c2.634-2.635 2.682-6.859.106-9.435-2.576-2.576-6.8-2.528-9.435.106C.373 5.642.325 9.866 2.901 12.442c2.576 2.576 6.8 2.528 9.435-.106zm0 0L17 17" fill="none" stroke="currentColor" stroke-width="2"></path> 1094 </svg><input type="hidden" name="type" value="product"> 1095 <input type="hidden" name="options[prefix]" value="last"> 1096 <input type="hidden" form="predictive-search-form" name="options[unavailable_products]" value="last"> 1097 <input class="predictive-search__input" type="text" name="q" autocomplete="off" autocorrect="off" aria-label="Search" placeholder="What are you looking for?"> 1098 </form> 1099 1100 <button type="button" class="drawer__close-button tap-area" data-action="close" title="Close"><svg focusable="false" width="14" height="14" class="icon icon--close " viewBox="0 0 14 14"> 1101 <path d="M13 13L1 1M13 1L1 13" stroke="currentColor" stroke-width="2" fill="none"></path> 1102 </svg></button> 1103 </header> 1104 1105 <div class="drawer__content"> 1106 <div class="predictive-search__content-wrapper"> 1107 <div hidden class="predictive-search__loading-state"> 1108 <div class="spinner"><svg focusable="false" width="50" height="50" class="icon icon--spinner " viewBox="25 25 50 50"> 1109 <circle cx="50" cy="50" r="20" fill="none" stroke="#50485b" stroke-width="4"></circle> 1110 </svg></div> 1111 </div> 1112 1113 <div hidden class="predictive-search__results" aria-live="polite"></div></div> 1114 </div> 1115 1116 <footer hidden class="drawer__footer drawer__footer--no-top-padding"> 1117 <button type="submit" form="predictive-search-form" class="button button--primary button--full">View all results</button> 1118 </footer> 1119</predictive-search-drawer>
1119<script> 1120 (() => { 1121 const headerElement = document.getElementById('shopify-section-header'), 1122 headerHeight = headerElement.clientHeight, 1123 headerHeightWithoutBottomNav = headerElement.querySelector('.header__wrapper').clientHeight; 1124 1125 document.documentElement.style.setProperty('--header-height', headerHeight + 'px'); 1126 document.documentElement.style.setProperty('--header-height-without-bottom-nav', headerHeightWithoutBottomNav + 'px'); 1127 })(); 1128</script>
1128 1129
1130<script type="application/ld+json"> 1131 { 1132 "@context": "https://schema.org", 1133 "@type": "Organization", 1134 "name": "The Alinker Inventions Ltd.", 1135 1136 1137 "logo": "https:\/\/thealinker.ca\/cdn\/shop\/files\/checkout_logo_5_280x_png_280x.webp?v=1677781700", 1138 1139 "url": "https:\/\/thealinker.ca" 1140 } 1141</script>
1141 1142 1143</div><div id="main" role="main" class="anchor"><div id="mobile-facet-toolbar" class="mobile-toolbar hidden-lap-and-up"> 1144 <button is="toggle-button" class="mobile-toolbar__item mobile-toolbar__item--filters " aria-expanded="false" aria-controls="facet-filters" style="display: none"><svg focusable="false" width="16" height="16" class="icon icon--filters " viewBox="0 0 16 16"> 1145 <path d="M0 4h16M0 12h16" fill="none" stroke="currentColor" stroke-width=""></path> 1146 <circle cx="5" cy="4" r="2" fill="rgb(var(--background))" stroke="currentColor" stroke-width="2"></circle> 1147 <circle cx="11" cy="12" r="2" fill="rgb(var(--background))" stroke="currentColor" stroke-width="2"></circle> 1148 </svg><span class="mobile-toolbar__item-label">Filters</span> 1149 </button> 1150 1151 <button is="toggle-button" class="mobile-toolbar__item mobile-toolbar__item--sort" aria-expanded="false" aria-controls="sort-by-popover" style="display: none"> 1152 <span class="mobile-toolbar__item-label">Sort by</span><svg focusable="false" width="12" height="8" class="icon icon--chevron " viewBox="0 0 12 8"> 1153 <path fill="none" d="M1 1l5 5 5-5" stroke="currentColor" stroke-width="2"></path> 1154 </svg></button> 1155 </div><div id="shopify-section-template--14816535445581__main" class="shopify-section shopify-section--main-search"><style> 1156 #shopify-section-template--14816535445581__main { 1157 --section-products-per-row: 2; 1158 } 1159 1160 @media screen and (min-width: 741px) { 1161 #shopify-section-template--14816535445581__main { 1162 --section-products-per-row: 3; 1163 } 1164 }@media screen and (min-width: 1400px) { 1165 #shopify-section-template--14816535445581__main { 1166 --section-products-per-row: 4; 1167 } 1168 }/* 1169 IMPLEMENTATION NOTE: due to design requirements, the mobile toolbar (with filters and sort by) had to be moved to the 1170 layout file. However as section settings cannot be accessed outside the section itself, we simply hide them in CSS. 1171 */@media screen and (max-width: 999px) { 1172 :root { 1173 --anchor-offset: 60px; 1174 } 1175 }</style> 1176 1177<section><div class="container"> 1178 <div class="empty-state"> 1179 <h1 class="heading h2">Search</h1> 1180 1181 <form class="main-search__form" action="/search" method="get"> 1182 <input type="hidden" name="type" value="product"> 1183 <input type="hidden" name="options[prefix]" value="last"> 1184 <input type="hidden" name="options[unavailable_products]" value="last"> 1185 1186 <button class="main-search__submit tap-area" type="submit"><svg focusable="false" width="18" height="18" class="icon icon--header-search " viewBox="0 0 18 18"> 1187 <path d="M12.336 12.336c2.634-2.635 2.682-6.859.106-9.435-2.576-2.576-6.8-2.528-9.435.106C.373 5.642.325 9.866 2.901 12.442c2.576 2.576 6.8 2.528 9.435-.106zm0 0L17 17" fill="none" stroke="currentColor" stroke-width="2"></path> 1188 </svg></button> 1189 <input class="main-search__input input__field" type="text" name="q" autocomplete="off" autocorrect="off" aria-label="Search" placeholder="What are you looking for?"> 1190 </form> 1191 </div> 1192 </div></section> 1193 1194</div> 1195<div id="shopify-section-static-text-with-icons" class="shopify-section shopify-section--text-with-icons"></div><div id="shopify-section-static-newsletter" class="shopify-section shopify-section--newsletter"><style> 1196 #shopify-section-static-newsletter {--heading-color: 80, 72, 91; 1197 --text-color: 80, 72, 91; 1198 --primary-button-background: 255, 192, 0; 1199 --primary-button-text-color: 80, 72, 91; 1200 --section-block-background: 255, 255, 255; 1201 } 1202 </style> 1203 1204 <section class="section section--flush"> 1205 <image-with-text-block reveal-on-scroll class="image-with-text-block image-with-text-block--medium image-with-text-block--cover"> 1206 <div class="image-with-text-block__image-wrapper"><img class="image-with-text-block__image" reveal loading="lazy" sizes="(max-width: 999px) 100vw, 72vw" height="1573" width="2806" alt="" src="//thealinker.ca/cdn/shop/files/img_alinker_yellow_3_2806x.jpg?v=1677784695" srcset="//thealinker.ca/cdn/shop/files/img_alinker_yellow_3_600x.jpg?v=1677784695 600w, //thealinker.ca/cdn/shop/files/img_alinker_yellow_3_700x.jpg?v=1677784695 700w, //thealinker.ca/cdn/shop/files/img_alinker_yellow_3_800x.jpg?v=1677784695 800w, //thealinker.ca/cdn/shop/files/img_alinker_yellow_3_1000x.jpg?v=1677784695 1000w, //thealinker.ca/cdn/shop/files/img_alinker_yellow_3_1200x.jpg?v=1677784695 1200w, //thealinker.ca/cdn/shop/files/img_alinker_yellow_3_1400x.jpg?v=1677784695 1400w, //thealinker.ca/cdn/shop/files/img_alinker_yellow_3_1600x.jpg?v=1677784695 1600w, //thealinker.ca/cdn/shop/files/img_alinker_yellow_3_1800x.jpg?v=1677784695 1800w, //thealinker.ca/cdn/shop/files/img_alinker_yellow_3_2000x.jpg?v=1677784695 2000w, //thealinker.ca/cdn/shop/files/img_alinker_yellow_3_2200x.jpg?v=1677784695 2200w, //thealinker.ca/cdn/shop/files/img_alinker_yellow_3_2400x.jpg?v=1677784695 2400w, //thealinker.ca/cdn/shop/files/img_alinker_yellow_3_2600x.jpg?v=1677784695 2600w, //thealinker.ca/cdn/shop/files/img_alinker_yellow_3_2800x.jpg?v=1677784695 2800w, //thealinker.ca/cdn/shop/files/img_alinker_yellow_3_2806x.jpg?v=1677784695 2806w"></div> 1207 1208 <div class="container container--flush"><div reveal class="image-with-text-block__content image-with-text-block__content--tight content-box content-box--medium content-box--text-center content-box--center text-container"><h2 class="heading heading--medium">Join the Alinker Community!</h2><p>Sign up now to receive updates, special offers, access to events, guest speakers, and more!</p><form method="post" action="/contact#newsletter-static-newsletter" id="newsletter-static-newsletter" accept-charset="UTF-8" class="form newsletter__form"><input type="hidden" name="form_type" value="customer" /><input type="hidden" name="utf8" value="✓" /><input type="hidden" name="contact[tags]" value="newsletter"> 1209 <input type="hidden" name="contact[context]" value="newsletter-static-newsletter"> 1210 1211 <div class="input-row"> 1212 <div class="input"> 1213 <input type="email" id="newsletter[static-newsletter][contact][email]" name="contact[email]" class="input__field" required> 1214 <label for="newsletter[static-newsletter][contact][email]" class="input__label">Your e-mail</label> 1215 </div> 1216 1217 <div class="input"> 1218 <button type="submit" is="loader-button" class="button button--primary">Subscribe</button> 1219 </div> 1220 </div></form><p class="text-center font-14 mt-2"><a href="/pages/newsletter-archive" target="_blank">Newsletter Archive</a></p> 1221 </div> 1222 </div> 1223 </image-with-text-block> 1224 </section></div></div><div id="shopify-section-footer" class="shopify-section shopify-section--footer"><style> 1225 #shopify-section-footer .footer {--background: 80, 72, 91; 1226 --heading-color: 255, 255, 255; 1227 --text-color: 255, 255, 255; 1228 --border-color: 106, 99, 116; 1229 } 1230</style> 1231 1232<footer class="footer "> 1233 <div class="container"> 1234 <div class="footer__inner"> 1235 <div class="footer__item-list"><div class="footer__item footer__item--image is-first" ><img style="width: 150px" loading="lazy" sizes="150px" class="footer__image" height="113" width="300" alt="" src="//thealinker.ca/cdn/shop/files/logo_alinker_rev_300x_png_300x.webp?v=1677784115" srcset="//thealinker.ca/cdn/shop/files/logo_alinker_rev_300x_png_100x.webp?v=1677784115 100w, //thealinker.ca/cdn/shop/files/logo_alinker_rev_300x_png_200x.webp?v=1677784115 200w, //thealinker.ca/cdn/shop/files/logo_alinker_rev_300x_png_300x.webp?v=1677784115 300w"></div><div class="footer__item footer__item--links " ><p class="footer__item-title heading heading--small">Footer 1</p> 1236 1237 <div class="footer__item-content"> 1238 <ul class="linklist list--unstyled" role="list"><li class="linklist__item"> 1239 <a href="/pages/about" class="link--faded">About</a> 1240 </li><li class="linklist__item"> 1241 <a href="/pages/testimonials" class="link--faded">Testimonials</a> 1242 </li><li class="linklist__item"> 1243 <a href="/pages/register-your-alinker" class="link--faded">Register Your Alinker</a> 1244 </li><li class="linklist__item"> 1245 <a href="/pages/product-tutorials" class="link--faded">How-to Videos</a> 1246 </li><li class="linklist__item"> 1247 <a href="/blogs/all" class="link--faded">Blog</a> 1248 </li><li class="linklist__item"> 1249 <a href="/pages/faq" class="link--faded">FAQ's</a> 1250 </li></ul> 1251 </div></div><div class="footer__item footer__item--links " ><p class="footer__item-title heading heading--small">Footer 2</p> 1252 1253 <div class="footer__item-content"> 1254 <ul class="linklist list--unstyled" role="list"><li class="linklist__item"> 1255 <a href="/pages/crowdfund-alinker-family" class="link--faded">Crowdfund</a> 1256 </li><li class="linklist__item"> 1257 <a href="/pages/product-tutorials" class="link--faded">User Manual</a> 1258 </li><li class="linklist__item"> 1259 <a href="/pages/warranty" class="link--faded">Warranty</a> 1260 </li><li class="linklist__item"> 1261 <a href="/pages/refund-policy" class="link--faded">Refund Policy</a> 1262 </li><li class="linklist__item"> 1263 <a href="/pages/privacy-policy" class="link--faded">Privacy Policy</a> 1264 </li></ul> 1265 </div></div><div class="footer__item footer__item--social-media " ><p class="footer__item-title heading heading--small">Follow</p><div class="footer__item-content"><ul class="social-media social-media--no-radius list--unstyled" role="list"> 1266 <li class="social-media__item social-media__item--facebook"> 1267 <a href="https://www.facebook.com/thealinkerUSA/" target="_blank" rel="noopener" class="social-media__link" aria-label="Follow us on Facebook"><svg focusable="false" width="9" height="17" class="icon icon--facebook " viewBox="0 0 9 17"> 1268 <path fill-rule="evenodd" clip-rule="evenodd" d="M2.486 16.2084L2.486 8.81845H0L0 5.93845L2.486 5.93845L2.486 3.81845C2.38483 2.79982 2.73793 1.78841 3.45107 1.05407C4.16421 0.319722 5.16485 -0.0628415 6.186 0.00844868C6.9284 0.00408689 7.67039 0.0441585 8.408 0.128449V2.69845L6.883 2.69845C6.4898 2.61523 6.08104 2.73438 5.79414 3.01585C5.50724 3.29732 5.3803 3.70373 5.456 4.09845L5.456 5.93845H8.308L7.936 8.81845H5.46L5.46 16.2084H2.486Z" fill="currentColor"></path> 1269 </svg></a> 1270 </li><li class="social-media__item social-media__item--twitter"> 1271 <a href="https://twitter.com/TheAlinker" target="_blank" rel="noopener" class="social-media__link" aria-label="Follow us on Twitter"><svg focusable="false" width="20" height="16" class="icon icon--twitter " viewBox="0 0 20 16"> 1272 <path fill-rule="evenodd" clip-rule="evenodd" d="M12.845 2.13398C14.0997 2.11363 14.7676 2.53229 15.4054 3.06445C15.9468 3.02216 16.6505 2.74528 17.065 2.55232C17.1993 2.48493 17.3337 2.41786 17.468 2.35046C17.2312 2.93602 16.9103 3.39474 16.417 3.74251C16.3074 3.81976 16.1987 3.92434 16.0613 3.97362C16.0613 3.97584 16.0613 3.97838 16.0613 3.98061C16.7643 3.97394 17.3441 3.6837 17.8947 3.52603C17.8947 3.52856 17.8947 3.5311 17.8947 3.53365C17.6055 3.95454 17.214 4.38147 16.7963 4.6876C16.6277 4.8103 16.4591 4.93301 16.2905 5.05571C16.2997 5.73696 16.2795 6.38704 16.1404 6.95989C15.3314 10.2888 13.1878 12.5491 9.7945 13.517C8.5761 13.8648 6.60702 14.0075 5.21102 13.6903C4.51872 13.5329 3.89334 13.3552 3.30644 13.1203C2.98052 12.9896 2.67854 12.8485 2.38972 12.6876C2.29496 12.6346 2.2001 12.5818 2.10522 12.5287C2.42018 12.5376 2.78846 12.6168 3.14052 12.5649C3.45896 12.5179 3.77128 12.53 4.06514 12.4712C4.79794 12.324 5.4486 12.1294 6.00916 11.829C6.2809 11.6834 6.69324 11.5124 6.88634 11.3026C6.52248 11.3083 6.19256 11.2311 5.9223 11.144C4.87436 10.8051 4.26436 10.
12721824 3.86752 9.2468C4.1851 9.27827 5.09982 9.35394 5.31368 9.18894C4.91398 9.16891 4.52956 8.95688 4.25478 8.7992C3.41184 8.31634 2.72438 7.50634 2.72954 6.26021C2.84022 6.30821 2.9509 6.35653 3.06148 6.40453C3.27324 6.48622 3.48848 6.52978 3.74112 6.57778C3.8478 6.59781 4.06114 6.65534 4.18362 6.6137C4.17836 6.6137 4.17308 6.6137 4.16782 6.6137C4.00476 6.43982 3.73902 6.32411 3.57512 6.1375C3.03438 5.52206 2.52758 4.57507 2.84812 3.44686C2.9294 3.16077 3.05842 2.90805 3.19586 2.67502C3.20114 2.67757 3.2064 2.67979 3.21168 2.68234C3.2746 2.80282 3.415 2.89152 3.50408 2.99229C3.78024 3.30573 4.1209 3.5877 4.46812 3.83629C5.65108 4.68347 6.71642 5.20386 8.42738 5.58946C8.86134 5.68706 9.36308 5.76176 9.88146 5.76238C9.73578 5.37424 9.78258 4.7461 9.89726 4.37035C10.1856 3.42557 10.8119 2.74402 11.7307 2.37907C11.9504 2.29197 12.1941 2.22838 12.4498 2.17722C12.5815 2.16291 12.7133 2.14861 12.845 2.13398Z" fill="currentColor"></path> 1273 </svg></a> 1274 </li><li class="social-media__item social-media__item--instagram"> 1275 <a href="https://www.instagram.com/the_alinker_world/" target="_blank" rel="noopener" class="social-media__link" aria-label="Follow us on Instagram"><svg focusable="false" width="16" height="16" class="icon icon--instagram " viewBox="0 0 16 16"> 1276 <path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C5.827 0 5.555.01 4.702.048 3.85.087 3.269.222 2.76.42a3.921 3.921 0 00-1.417.923c-.445.444-.719.89-.923 1.417-.198.509-.333 1.09-.372 1.942C.01 5.555 0 5.827 0 8s.01 2.445.048 3.298c.039.852.174 1.433.372 1.942.204.526.478.973.923 1.417.444.445.89.719 1.417.923.509.198 1.09.333 1.942.372C5.555 15.99 5.827 16 8 16s2.445-.01 3.298-.048c.852-.039 1.433-.174 1.942-.372a3.922 3.922 0 001.417-.923c.445-.444.719-.89.923-1.417.198-.509.333-1.09.372-1.942C15.99 10.445 16 10.173 16 8s-.01-2.445-.048-3.298c-.039-.852-.174-1.433-.372-1.942a3.922 3.922 0 00-.923-1.417A3.921 3.921 0 0013.24.42c-.509-.198-1.09-.333-1.942-.372C10.445.01 10.173 0 8 0zm0 1.441c2.136 0 2.39.009 3.233.047.78.036 1.203.166 1.485.276.374.145.64.318.92.598.28.28.453.546.598.92.11.282.24.705.276 1.485.038.844.047 1.097.047 3.233s-.009 2.39-.047 3.233c-.036.78-.166 1.203-.276 1.485-.145.374-.318.64-.598.92-.28.28-.546.453-.92.598-.282.11-.705.24-1.485.276-.844.038-1.097.047-3.233.047s-2.39-.009-3.233-.047c-.78-.036-1.203-.166-1.485-.276a2.479 2.479 0 01-.92-.598 2.478 2.478 0 01-.598-.92c-.11-.282-.24-.705-.276-1.485-.038-.844-.047-1.097-.047-3.233s.009-2.39.047-3.233c.036-.78.166-1.203.276-1.485.145-.374.318-.64.598-.92.28-.28.546-.453.92-.598.282-.11.705-.24 1.485-.276.844-.038 1.097-.047 3.233-.047zm0 9.226a2.667 2.667 0 110-5.334 2.667 2.667 0 010 5.334zm0-6.775a4.108 4.108 0 100 8.216 4.108 4.108 0 000-8.216zm5.23-.162a.96.96 0 11-1.92 0 .96.96 0 011.92 0z" fill="currentColor"></path> 1277 </svg></a> 1278 </li><li class="social-media__item social-media__item--pinterest"> 1279 <a href="https://www.pinterest.com/thealinker0198/" target="_blank" rel="noopener" class="social-media__link" aria-label="Follow us on Pinterest"><svg focusable="false" width="12" height="16" class="icon icon--pinterest " viewBox="0 0 12 16"> 1280 <path fill-rule="evenodd" clip-rule="evenodd" d="M5.8042 0.00123531C8.79537 -0.0442356 10.6685 1.16769 11.5498 3.29299C11.8407 3.99433 12.1516 5.28439 11.9181 6.35474C11.825 6.78208 11.7985 7.22812 11.6726 7.63086C11.4163 8.4496 11.0829 9.17441 10.6413 9.79945C10.0418 10.6486 9.13196 11.2212 7.98951 11.5091C6.97899 11.7637 6.04959 11.3826 5.50954 10.9732C5.33747 10.843 5.10674 10.6728 5.04304 10.4377C5.03488 10.4377 5.0267 10.4377 5.01853 10.4377C4.97972 10.8669 4.81532 11.3224 4.69924 11.7135C4.53858 12.2545 4.50733 12.8146 4.3064 13.3208C4.08349 13.8828 3.81274 14.3978 3.52072 14.8776C3.36739 15.1292 2.94427 15.9904 2.63675 16C2.60311 15.9354 2.58964 15.9105 2.58761 15.796C2.48858 15.6383 2.55757 15.3724 2.51393 15.1578C2.44604 14.8236 2.39317 14.2217 2.46491 13.8824C2.46491 13.7038 2.46491 13.5248 2.46491 13.3465C2.54397 12.9786 2.54085 12.6015 2.63675 12.2494C2.84537 11.4824 2.96145 10.6699 3.17692 9.87611C3.38398 9.11352 3.57396 8.27939 3.74172 7.50321C3.77957 7.32789 3.56652 6.82389 3.52072 6.63572C3.37628 6.04186 3.48624 5.21874 3.66805 4.77269C3.89698 4.21111 4.56717 3.3535 5.43589 3.57359C6.13407 3.75039 6.57846 4.50528 6.34437 5.46192C6.09862 6.46589 5.7798 7.3653 5.5587 8.37035C5.50173 8.62933 5.59968 8.90442 5.65687 9.05958C5.86357 9.61934 6.49037 10.163 7.32652 9.95278C8.59396 9.63365 9.15431 8.48627 9.53645 7.24791C9.63981 6.91302 9.62743 6.59647 9.70831 6.22709C9.87894 5.44763 9.8
12800648 4.28411 9.56098 3.67556C9.16753 2.70023 8.43329 2.07518 7.42471 1.73624C7.1465 1.68526 6.86819 1.63427 6.58988 1.58329C6.12397 1.47655 5.23532 1.63685 4.92023 1.73624C3.51171 2.18156 2.63952 2.92544 2.09658 4.26247C1.91177 4.71767 1.81046 5.17911 1.77741 5.81884C1.76913 5.8955 1.76094 5.97217 1.75278 6.04883C1.86153 6.62068 1.87259 6.99959 2.09658 7.42657C2.20715 7.63711 2.46971 7.8029 2.51393 8.06444C2.54001 8.2185 2.42705 8.45105 2.39125 8.57467C2.33705 8.76137 2.35676 8.97522 2.26844 9.13625C2.10873 9.42678 1.67383 9.20852 1.48275 9.08491C0.489307 8.44373 -0.329526 6.5895 0.132284 4.79837C0.20342 4.5218 0.206915 4.28118 0.304126 4.03285C0.906661 2.49554 1.80565 1.55101 3.10325 0.741098C3.58947 0.437749 4.24511 0.287354 4.84657 0.128885C5.16574 0.0863481 5.48503 0.0437917 5.8042 0.00123531Z" fill="currentColor"></path> 1281 </svg></a> 1282 </li><li class="social-media__item social-media__item--youtube"> 1283 <a href="https://www.youtube.com/channel/UC3q2xq_IW56xUXmOKCrIlSg" target="_blank" rel="noopener" class="social-media__link" aria-label="Follow us on YouTube"><svg fill="none" focusable="false" width="18" height="13" class="icon icon--youtube " viewBox="0 0 18 13"> 1284 <path fill-rule="evenodd" clip-rule="evenodd" d="M16.0325 0.369454C16.807 0.572743 17.4168 1.17173 17.6238 1.9324C18 3.31101 18 6.1875 18 6.1875C18 6.1875 18 9.06389 17.6238 10.4427C17.4168 11.2033 16.807 11.8023 16.0325 12.0056C14.6288 12.375 9 12.375 9 12.375C9 12.375 3.37122 12.375 1.96752 12.0056C1.19311 11.8023 0.583159 11.2033 0.376159 10.4427C0 9.06389 0 6.1875 0 6.1875C0 6.1875 0 3.31101 0.376159 1.9324C0.583159 1.17173 1.19311 0.572743 1.96752 0.369454C3.37122 0 9 0 9 0C9 0 14.6288 0 16.0325 0.369454ZM11.8636 6.1876L7.1591 8.79913V3.57588L11.8636 6.1876Z" fill="currentColor"></path> 1285 </svg></a> 1286 </li> 1287 </ul></div></div></div> 1288 1289 <div class="footer__aside"><span class="footer__copyright text--xsmall text--subdued">The Alinker Inventions Ltd. <span class="square-separator square-separator--block square-separator--subdued"></span><img src="https://cdn.shopify.com/s/files/1/1464/0582/files/sheEO_9aa75265-4c78-4480-abc3-0eb6b1d9b653.webp?v=1669827400" alt="Sheeo" style="height:90px; width:auto" loading="lazy"/><img src="https://cdn.shopify.com/s/files/1/1464/0582/files/b-certified_f1823065-bfa0-45cf-9eda-ea8a9d334412.webp?v=1669827399" alt="b-certified corporation" style="height:90px; width:auto" loading="lazy"/></span></div> 1290 </div> 1291 </div> 1292</footer></div> 1293 1294<!-- langify-v2-scripts-begin --> 1295 1296
1297<script> 1298 var langify = langify || {}; 1299 1300 1301 /** 1302 * 1303 * 1304 * @class LyHelper 1305 */ 1306 class LyHelper { 1307 constructor() { 1308 return { 1309 ajax: function(params) { return LyHelper.ajax(params); }, 1310 isIE: function() { return LyHelper.isIE(); }, 1311 extractImageObject: function(val) { return LyHelper.extractImageObject(val); }, 1312 getCurrentLanguage: function() { return LyHelper.getCurrentLanguage(); }, 1313 getCookie: function(name) { return LyHelper.getCookie(name); }, 1314 setCookie: function(name, value, days) { return LyHelper.setCookie(name, value, days); }, 1315 getVersion: function() { return LyHelper.getVersion(); }, 1316 isOutOfViewport: function(elem) { return LyHelper.isOutOfViewport(elem); }, 1317 isDomainFeatureEnabled: function() { return LyHelper.isDomainFeatureEnabled(); }, 1318 getVal: function(str) { return LyHelper.getVal(str); }, 1319 inIframe: function() { return LyHelper.inIframe(); }, 1320 shopifyAPI: function() { return LyHelper.shopifyAPI(); }, 1321 loadScript: function(url, callback) { return LyHelper.loadScript(url, callback); }, 1322 localizationRedirect: function(type, code, additionalFields, additionalParams, domain) { return LyHelper.localizationRedirect(type, code, additionalFields, additionalParams, domain); }, 1323 changeCurrency: function(code) { return LyHelper.changeCurrency(code); }, 1324 log: function(title, data, type) { return LyHelper.log(title, data, type); }, 1325 } 1326 } 1327 static ajax(params) { 1328 var data = params.data; 1329 fetch(params.url, { 1330 method: params.method, 1331 headers: { 1332 'Content-Type': 'application/json', 1333 }, 1334 body: (data && params.method === 'POST') ? JSON.stringify(data) : null, 1335 }) 1336 .then(response => response.json()) 1337 .then(data => { 1338 params.success(data); 1339 }) 1340 .catch((error) => { 1341 console.error('Error:', error); 1342 }); 1343 } 1344 static isIE() { 1345 var ua = navigator.userAgent; 1346 var is_ie = ua.indexOf("MSIE ") > -1 || ua.indexOf("Trident/") > -1; 1347 return is_ie; 1348 } 1349 static extractImageObject(val) { 1350 if(!val || val == '') return false; 1351 var val = val; 1352 1353 // Handle src-sets 1354 if(val.search(/([0-9]+w?h?x?,)/gi) > -1) { 1355 val = val.split(/([0-9]+w?h?x?,)/gi)[0]; 1356 } 1357 1358 var hostBegin = val.indexOf('//') ? val.indexOf('//') : 0; 1359 var hostEnd = val.lastIndexOf('/') + 1; 1360 var host = val.substring(hostBegin, hostEnd); 1361 var afterHost = val.substring(hostEnd, val.length); 1362 1363 var url = val; 1364 var file = ''; 1365 var name = ''; 1366 var type = ''; 1367 afterHost = afterHost.substring(0, (afterHost.indexOf("#") == -1) ? afterHost.length : afterHost.indexOf("#")); 1368 afterHost = afterHost.substring(0, (afterHost.indexOf("?") == -1) ? afterHost.length : afterHost.indexOf("?")); 1369 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, ""); 1370 1371 if(afterHost.search(/(\.png\.jpg|\.jpg\.jpg)/gi) > -1) { 1372 type = afterHost.substring(afterHost.search(/(\.png\.jpg|\.jpg\.jpg)/gi)+1, afterHost.length); 1373 } else { 1374 type = afterHost.substring(afterHost.lastIndexOf('.')+1, afterHost.length); 1375 } 1376 1377 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); 1378 1379 return { 1380 host: host, 1381 name: name, 1382 type: type, 1383 file: file 1384 } 1385 } 1386 static getCurrentLanguage() { 1387 return window.langify.locale.iso_code; 1388 } 1389 static setLanguage(code) { 1390 1391 } 1392 static getCookie(name) { 1393 var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); 1394 if(v) return v[2]; 1395 else return null; 1396 } 1397 static setCookie(name, value, days) { 1398 var d = new Date; 1399 d.setTime(d.getTime() + 24*60*60*1000*days); 1400 document.cookie = name + "=" + value + ";path=/;expires=" + d.toGMTString(); 1401 } 1402 static getVersion() { 1403 return 2; 1404 } 1405 static isOutOfViewport (elem) { 1406 var bounding = elem.getBoundingClientRect(); 1407 var out = {}; 1408 out.top = bounding.top < 0; 1409 out.left = bounding.left < 0;
1410 out.bottom = Math.ceil(bounding.bottom) >= (window.innerHeight || document.documentElement.clientHeight); 1411 out.right = bounding.right > (window.innerWidth || document.documentElement.clientWidth); 1412 out.any = out.top || out.left || out.bottom || out.right; 1413 out.inViewport = bounding.x > 0 && bounding.y > 0; 1414 return out; 1415 } 1416 static isDomainFeatureEnabled() { 1417 return window.langify.locale.domain_feature_enabled; 1418 } 1419 static getVal(str) { 1420 var v = window.location.search.match(new RegExp('(?:[?&]'+str+'=)([^&]+)')); 1421 return v ? v[1] : null; 1422 } 1423 static inIframe() { 1424 try { 1425 return window.self !== window.top; 1426 } catch (e) { 1427 return true; 1428 } 1429 } 1430 static shopifyAPI() { 1431 var root_url = window.langify.locale.root_url != '/' ? window.langify.locale.root_url : ''; 1432 1433 return { 1434 attributeToString: function(attribute) { 1435 if((typeof attribute) !== 'string') { 1436 attribute += ''; 1437 if(attribute === 'undefined') {attribute = '';} 1438 } 1439 return attribute.trim(); 1440 }, 1441 getCart: function(callback) { 1442 LyHelper.ajax({ 1443 method: 'GET', 1444 url: root_url+'/cart.js', 1445 success: function (cart, textStatus) { 1446 if((typeof callback) === 'function') { 1447 callback(cart); 1448 } 1449 } 1450 }); 1451 }, 1452 updateCartNote: function(note, callback) { 1453 var params = { 1454 method: 'POST', 1455 url: root_url+'/cart/update.js', 1456 data: 'note=' + this.attributeToString(note), 1457 dataType: 'json', 1458 success: function(cart) {if((typeof callback) === 'function') {callback(cart);}}, 1459 error: this.onError 1460 }; 1461 LyHelper.ajax(params); 1462 }, 1463 updateCartAttributes: function(attributes, callback) { 1464 var params = { 1465 method: 'POST', 1466 url: root_url+'/cart/update.js', 1467 data: {"attributes": attributes}, 1468 dataType: 'json', 1469 success: function(cart) { 1470 if((typeof callback) === 'function') { 1471 callback(cart); 1472 } 1473 }, 1474 error: this.onError 1475 }; 1476 LyHelper.ajax(params); 1477 }, 1478 onError: function(XMLHttpRequest, textStatus) { 1479 1480 } 1481 } 1482 } 1483 static loadScript(url, callback) { 1484 var script = document.createElement('script'); 1485 script.type = 'text/javascript'; 1486 if(script.readyState) { 1487 script.onreadystatechange = function () { 1488 if(script.readyState == 'loaded' || script.readyState == 'complete') { 1489 script.onreadystatechange = null; 1490 callback(); 1491 } 1492 }; 1493 } else { 1494 script.onload = function () { 1495 callback(); 1496 }; 1497 } 1498 script.src = url; 1499 document.getElementsByTagName('head')[0].appendChild(script); 1500 } 1501 static localizationRedirect(type, code, additionalFields, additionalParams, domain) { 1502 if(type !== 'country_code' && type !== 'language_code') { 1503 return false; 1504 } 1505 if(!additionalParams) { 1506 var additionalParams = ''; 1507 } 1508 if(domain) { 1509 window.location.href = domain; 1510 return true; 1511 } 1512 var params = [ 1513 { 1514 name: type, 1515 value: code 1516 }, 1517 { 1518 name: 'return_to', 1519 value: window.location.pathname + window.location.search + additionalParams + window.location.hash 1520 }, 1521 { 1522 name: 'form_type', 1523 value: 'localization' 1524 }, 1525 { 1526 name: '_method', 1527 value: 'put' 1528 } 1529 ]; 1530 if(additionalFields) { 1531 for(var i=0; i<additionalFields.length; i++) { 1532 params.push(additionalFields[i]); 1533 } 1534 } 1535 const form = document.createElement('form'); 1536 form.method = 'POST'; 1537 form.action = '/localization'; 1538 params.forEach(function(param) { 1539 const field = document.createElement('input'); 1540 field.type = 'hidden'; 1541 field.name = param['name']; 1542 field.value = param['value']; 1543 form.appendChild(field); 1544 }); 1545 document.body.appendChild(form); 1546 form.submit(); 1547 } 1548 static changeCurrency(code) { 1549 const params = [ 1550 { 1551 name: 'currency_code', 1552 value: code 1553 }, 1554 { 1555 name: 'return_to', 1556 value: window.location.pathname + window.location.search + window.location.hash 1557 }, 1558 { 1559 name: 'form_type', 1560 value: 'localization' 1561 }, 1562 { 1563 name: '_method', 1564 value: 'put' 1565 } 1566 ]; 1567 const form = document.createElement('form'); 1568 form.method = 'POST'; 1569 form.action = '/localization';
1570 params.forEach(function(param) { 1571 const field = document.createElement('input'); 1572 field.type = 'hidden'; 1573 field.name = param['name']; 1574 field.value = param['value']; 1575 form.appendChild(field); 1576 }); 1577 document.body.appendChild(form); 1578 form.submit(); 1579 } 1580 static log(title, data, type) { 1581 if(langify.settings.debug) { 1582 if(!data) { 1583 var data = ''; 1584 } 1585 1586 var css = 'color: green; font-weight: bold;'; 1587 if(type === 'error') { 1588 css = 'color: red; font-weight: bold;'; 1589 } 1590 1591 console.log(`%c ${title}: \n`, css, data); 1592 } 1593 } 1594 }; 1595 1596 1597 /** 1598 * 1599 * 1600 * @class TranslationObserver 1601 */ 1602 class TranslationObserver { 1603 constructor() { 1604 LyHelper.log('TranslationObserver instantiation') 1605 } 1606 1607 init() { 1608 if(langify.settings.observe && !LyHelper.isIE()) { 1609 var langifyObserver = this.langifyObserverCore(); 1610 langifyObserver.init(); 1611 1612 // HOTFIX: translation observer sometimes refuses to trigger on page load_ 1613 langifyObserver.triggerCustomContents(); 1614 1615 langify.api = { 1616 observer: { 1617 start: langifyObserver.init, 1618 stop: langifyObserver.stopObserver, 1619 trigger: langifyObserver.triggerCustomContents 1620 } 1621 }; 1622 } 1623 1624 return this; 1625 } 1626 1627 langifyObserverCore() { 1628 var observedNodes = []; 1629 var intersectionObs = null; 1630 var mutationCount = 0; 1631 var mutationObs = null; 1632 var mutationObsConfig = { 1633 characterData: true, 1634 characterDataOldValue: true, 1635 attributes: true, 1636 attributeOldValue: true, 1637 childList: true, 1638 subtree: true, 1639 }; 1640 var customContents_html = {}; 1641 var customContents_text = {}; 1642 var customContents_attr = {}; 1643 1644 function init() { 1645 if(langify.settings.observe) { 1646 spreadCustomContents(); 1647 if (window.MutationObserver) { 1648 if (langify.settings.lazyload && window.IntersectionObserver) { 1649 startIntersectionObserver(); 1650 } else { 1651 startMutationObserver(null); 1652 } 1653 } else { 1654 startMutationEvents(); 1655 } 1656 } 1657 } 1658 1659 1660 // Intersection Observer 1661 function startIntersectionObserver() { 1662 intersectionObs = new IntersectionObserver(callbackIntersectionChange); 1663 var elementNodes = document.getElementsByClassName('shopify-section'); 1664 Array.prototype.slice.call(elementNodes).forEach(function(node) { 1665 intersectionObs.observe(node); 1666 }); 1667 } 1668 1669 function callbackIntersectionChange(intersections) { 1670 intersections.forEach(function(intersection) { 1671 var target = intersection.target; 1672 var targetIsIntersecting = Boolean(target.getAttribute('ly-is-intersecting') === "true" ? true : false); 1673 1674 if(typeof targetIsIntersecting == 'undefined' || targetIsIntersecting == null) { 1675 target.setAttribute('ly-is-intersecting', intersection.isIntersecting); 1676 targetIsIntersecting = intersection.isIntersecting; 1677 } 1678 1679 // On Screen 1680 if(targetIsIntersecting == false && intersection.isIntersecting == true) { 1681 if(!target.getAttribute('ly-is-observing')) { 1682 startMutationObserver(target); 1683 intersectionObs.unobserve(target); 1684 1685 // As the mutation observer didn't see the "add" of the elememts, trigger the initial translation manually 1686 var elementNodes = getNodesUnder(target, 'SHOW_ELEMENT'); 1687 var textNodes = getNodesUnder(target, 'SHOW_TEXT'); 1688 var nodes = elementNodes.concat(textNodes); 1689 nodes.forEach(function(node) { 1690 translate(node, 'mutation -> childList'); 1691 }); 1692 } 1693 } 1694 // Off Screen 1695 //else if(targetIsIntersecting == true && intersection.isIntersecting == false) { 1696 // stopMutationObserver(target); 1697 //} 1698 target.setAttribute('ly-is-intersecting', intersection.isIntersecting); 1699 }); 1700 } 1701 1702 1703 // Mutation Observer 1704 function startMutationObserver(observerTarget) { 1705 if (!observerTarget) { 1706 var target = document.documentElement || document.body; // main window 1707 } else { 1708 if (observerTarget.nodeName === 'IFRAME') { 1709 try { var target = observerTarget.contentDocument || observerTarget.contentWindow.document; } 1710 catch { return false; } 1711 } else { 1712 var target = observerTarget; 1713 } 1714 } 1715 mutationObs = new MutationObserver(callbackDomChange); 1716 mutationObs.observe(target, mutationObsConfig); 1717 observedNodes.push(target); 1718 try { target.setAttribute('ly-is-observing', 'true'); } catch(e) {} 1719 } 1720 1721 function stopMutationObserver(target) { 1722 if(observedNodes.indexOf(target) > -1) { 1723 observedNodes.splice(observedNodes.indexOf(target), 1); 1724 } 1725 var mutations = mutationObs.takeRecords(); 1726 mutationObs.disconnect();
1727 observedNodes.forEach(node => { 1728 mutationObs.observe(node, mutationObsConfig); 1729 }); 1730 try { target.removeAttribute('ly-is-observing'); } catch(e) {} 1731 } 1732 1733 1734 function callbackDomChange(mutations, mutationObs) { 1735 for (var i = 0, length = mutations.length; i < length; i++) { 1736 var mutation = mutations[i]; 1737 var target = mutation.target; 1738 1739 // Links-Hook 1740 if (mutation.type === 'attributes' && (mutation.attributeName === 'href' || mutation.attributeName === 'action')) { 1741 var target = mutation.target; 1742 translateLink(target.getAttribute(mutation.attributeName), target); 1743 } 1744 // Images-Hook 1745 else if (mutation.type === 'attributes' && (mutation.attributeName === 'src' || mutation.attributeName === 'data-src' || mutation.attributeName === 'srcset' || mutation.attributeName === 'data-srcset')) { 1746 translateImage(target, mutation.attributeName); 1747 } 1748 else if (mutation.type === 'attributes' && mutation.attributeName === 'style') { 1749 translateCssImage(target); 1750 } 1751 // Subtree Events 1752 else if (mutation.type === 'childList') { 1753 // Added Nodes 1754 if(mutation.addedNodes.length > 0) { 1755 var elementNodes = getNodesUnder(mutation.target, 'SHOW_ELEMENT'); 1756 var textNodes = getNodesUnder(mutation.target, 'SHOW_TEXT'); 1757 var nodes = elementNodes.concat(textNodes); 1758 nodes.forEach(function(node) { 1759 translate(node, 'mutation -> childList'); 1760 }); 1761 } 1762 } 1763 // CharacterData Events 1764 else if (mutation.type === 'characterData') { 1765 var target = mutation.target; 1766 translate(target, 'mutation -> characterData'); 1767 } 1768 } 1769 } 1770 1771 1772 function translate(node, info) { 1773 if((node.nodeType === 1 && node.hasAttribute('data-ly-locked')) || (node.nodeType === 3 && node.parentNode && node.parentNode.hasAttribute('data-ly-locked'))) { 1774 return; 1775 } 1776 // CC-Hook 1777 if (node.nodeName !== 'SCRIPT' && node.nodeName !== 'STYLE') { 1778 if (node.nodeType === 3) { 1779 translateTextNode(node, info); 1780 } 1781 translateNodeAttrs(node); 1782 } 1783 // Links-Hook 1784 if (node.nodeName === 'A' || node.nodeName === 'FORM') { 1785 if(node.hasAttribute('href')) var attrName = 'href'; 1786 else var attrName = 'action'; 1787 var url = node.getAttribute(attrName); 1788 translateLink(url, node); 1789 } 1790 // Images-Hook 1791 if (node.nodeName === 'IMG' || node.nodeName === 'SOURCE') { 1792 translateImage(node, ['src', 'data-src', 'srcset', 'data-srcset']); 1793 } 1794 if (node.attributes && node.getAttribute('style')) { 1795 translateCssImage(node); 1796 } 1797 // Iframe Observation 1798 if (node.nodeName === 'IFRAME') { 1799 // Todo: handle srcdoc iframe content observing 1800 if (node.getAttribute('ly-is-observing') == null && node.getAttribute('src') == null && !node.hasAttribute('srcdoc')) { 1801 node.setAttribute('ly-is-observing', 'true'); 1802 startMutationObserver(node); 1803 } 1804 } 1805 } 1806 1807 function translateNodeAttrs(node) { 1808 if (node.attributes && node.getAttribute('placeholder')) { 1809 var src = node.getAttribute('placeholder').trim().replace(/(\r\n|\n|\r)/gim,"").replace(/\s+/g," ").toLowerCase(); 1810 if(customContents_text[src] && node.getAttribute('placeholder') !== customContents_text[src]) { 1811 node.setAttribute('placeholder', customContents_text[src]); 1812 } 1813 } 1814 } 1815 1816 1817 function translateTextNode(node, info) { 1818 if(langify.settings.observeCustomContents === false || !node.textContent || node.textContent.trim().length === 0) { 1819 return; 1820 } 1821 var oldSrc = node.textContent.trim().replace(/(\r\n|\n|\r)/gim,"").replace(/\s+/g," ").toLowerCase(); 1822 var src = node.textContent.trim().replace(/(\r\n|\n|\r)/gim," ").replace(/\s+/g," ").toLowerCase(); 1823 if(customContents_text[oldSrc]) { 1824 src = oldSrc; 1825 } 1826 if(customContents_text[src] && node.textContent !== customContents_text[src]) { 1827 var newContent = node.textContent.replace(node.textContent.trim(), customContents_text[src]); 1828 if (newContent != node.textContent) { 1829 if(!node.parentNode.hasAttribute('data-ly-mutation-count') || parseInt(node.parentNode.getAttribute('data-ly-mutation-count')) < langify.settings.maxMutations) { 1830 var count = node.parentNode.hasAttribute('data-ly-mutation-count') ? parseInt(node.parentNode.getAttribute('data-ly-mutation-count')) : 0; 1831 node.parentNode.setAttribute('data-ly-mutation-count', count+1); 1832 node.textContent = newContent; 1833 1834 mutationCount = mutationCount + 1; 1835 LyHelper.log('REPLACED (TEXT)', { 1836 oldValue: src, 1837 newValue: customContents_text[src], 1838 mutationCount, 1839 }, 'success' 1840 ); 1841 1842 var event = new CustomEvent('langify.observer.aftertranslatetext', { 1843 bubbles: true, 1844 detail: { 1845 target: node, 1846 original: src, 1847 translation: customContents_text[src] 1848 } 1849 }); 1850 node.dispatchEvent(event); 1851 } 1852 } 1853 } 1854 } 1855 1856 function translateLink(url, node) { 1857 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)) { 1858 return; 1859 } 1860 var isLocalized = (
1861 url.indexOf('/'+ langify.locale.iso_code +'/') === 0 || url === '/'+ langify.locale.iso_code || 1862 url.indexOf('/'+ langify.locale.iso_code.toLowerCase() +'/') === 0 || url === '/'+ langify.locale.iso_code.toLowerCase() || 1863 url.indexOf('/'+ langify.locale.iso_code.toLowerCase().substring(0,2) +'/') === 0 || url === '/'+ langify.locale.iso_code.toLowerCase().substring(0,2) || 1864 url.indexOf(langify.locale.root_url + '/') === 0 || url === langify.locale.root_url || 1865 url.indexOf(langify.locale.shop_url + langify.locale.root_url) === 0 || url === langify.locale.shop_url + langify.locale.root_url 1866 ); 1867 var cleanUrl = url.replace(langify.locale.shop_url, ''); 1868 var re = new RegExp(`\/\\b${langify.locale.iso_code.replace('-', '\-')}\\b\/`, 'gi'); 1869 var link = cleanUrl.replace(re, '/'); 1870 var isUrlAbsolute = (link.indexOf('://') > 0 || link.indexOf('//') === 0); 1871 var blacklist = ['#', '/'+ langify.locale.iso_code +'#'].concat(langify.settings.linksBlacklist); 1872 var isUrlBlacklisted = blacklist.find(x => url.indexOf(x) === 0); 1873 if(!isLocalized && !isUrlAbsolute && !isUrlBlacklisted && langify.locale.root_url != '/') { 1874 if(node.hasAttribute('href')) var attrName = 'href'; else var attrName = 'action'; 1875 if(link === '/' || link == langify.locale.root_url) link = ''; 1876 var newLink = langify.locale.root_url + link; 1877 var timeStamp = Math.floor(Date.now()); 1878 if(!node.hasAttribute('data-ly-processed') || timeStamp > parseInt(node.getAttribute('data-ly-processed')) + langify.settings.timeout) { 1879 node.setAttribute('data-ly-processed', timeStamp); 1880 node.setAttribute(attrName, newLink); 1881 if(node.hasAttribute('data-'+attrName)) node.setAttribute('data-'+attrName, newLink); 1882 1883 mutationCount = mutationCount + 1; 1884 LyHelper.log('REPLACED (LINK)', { 1885 attrName, 1886 oldValue: url, 1887 newValue: newLink, 1888 mutationCount, 1889 }, 'success' 1890 ); 1891 1892 var event = new CustomEvent('langify.observer.aftertranslatelink', { 1893 bubbles: true, 1894 detail: { 1895 target: node, 1896 attribute: attrName, 1897 original: url, 1898 translation: newLink 1899 } 1900 }); 1901 node.dispatchEvent(event); 1902 } 1903 } 1904 } 1905 1906 function translateImage(node, attr) { 1907 if(langify.settings.observeImages === false || node.hasAttribute('data-ly-locked') || Object.keys(customContents_image).length === 0) { 1908 return 1909 } 1910 var attrs = []; 1911 if(typeof attr === 'string') attrs.push(attr); 1912 else if(typeof attr === 'object') attrs = attr; 1913 var timeStamp = Math.floor(Date.now()); 1914 if(!node.hasAttribute('data-ly-processed') || timeStamp > parseInt(node.getAttribute('data-ly-processed')) + langify.settings.timeout) { 1915 node.setAttribute('data-ly-processed', timeStamp); 1916 attrs.forEach(function(attr) { 1917 if(node.hasAttribute(attr)) { 1918 var imgObject = LyHelper.extractImageObject(node.getAttribute(attr)); 1919 var imgKey = imgObject ? imgObject.file.toLowerCase() : ''; 1920 1921 if(customContents_image[imgKey]) { 1922 1923 // Replace 1924 var oldValue = node.getAttribute(attr); 1925 var translation = node.getAttribute(attr); 1926 translation = translation.replace(new RegExp(imgObject.host, 'g'), customContents_image[imgKey].host); 1927 translation = translation.replace(new RegExp(imgObject.name, 'g'), customContents_image[imgKey].name); 1928 translation = translation.replace(new RegExp(imgObject.type, 'g'), customContents_image[imgKey].type); 1929 1930 // China Hook 1931 if(node.getAttribute(attr).indexOf('cdn.shopifycdn.net') >= 0) { 1932 translation = translation.replace(new RegExp('cdn.shopify.com', 'g'), 'cdn.shopifycdn.net'); 1933 } 1934 1935 if(node.getAttribute(attr) != translation) { 1936 node.setAttribute(attr, translation); 1937 1938 mutationCount = mutationCount + 1; 1939 LyHelper.log('REPLACED (IMAGE)', { 1940 attrName: attr, 1941 oldValue: oldValue, 1942 newValue: translation, 1943 mutationCount, 1944 }, 'success'); 1945 1946 var event = new CustomEvent('langify.observer.aftertranslateimage', { 1947 bubbles: true, 1948 detail: { 1949 target: node, 1950 attribute: attr, 1951 original: oldValue, 1952 translation: translation 1953 } 1954 }); 1955 node.dispatchEvent(event); 1956 } 1957 } 1958 } 1959 }); 1960 } 1961 } 1962 1963 function translateCssImage(node) { 1964 if(langify.settings.observeImages === false || node.hasAttribute('data-ly-locked') || Object.keys(customContents_image).length === 0 || !node.getAttribute('style')) { 1965 return 1966 } 1967 1968 var imgMatches = node.getAttribute('style').match(/url\(("|')?(.*)("|')?\)/gi); 1969 if(imgMatches !== null) { 1970 var imgSource = imgMatches[0].replace(/url\(("|')?|("|')?\)/, ''); 1971 var imgObject = LyHelper.extractImageObject(imgSource); 1972 var imgKey = imgObject ? imgObject.file.toLowerCase() : ''; 1973 var attr = 'style'; 1974 1975 if(customContents_image[imgKey]) { 1976 1977 // Replace 1978 var translation = node.getAttribute(attr); 1979 translation = translation.replace(new RegExp(imgObject.host, 'g'), customContents_image[imgKey].host); 1980 translation = translation.replace(new RegExp(imgObject.name, 'g'), customContents_image[imgKey].name); 1981 translation = translation.replace(new RegExp(imgObject.type, 'g'), customContents_image[imgKey].type); 1982 1983 // China Hook 1984 if(node.getAttribute(attr).indexOf('cdn.shopifycdn.net') >= 0) { 1985 translation = translation.replace(new RegExp('cdn.shopify.com', 'g'), 'cdn.shopifycdn.net'); 1986 } 1987 1988 if(node.getAttribute(attr) != translation) { 1989 var timeStamp = Math.floor(Date.now()); 1990 if(!node.hasAttribute('data-ly-processed') || timeStamp > parseInt(node.getAttribute('data-ly-processed')) + langify.settings.timeout) { 1991 node.setAttribute('data-ly-processed', timeStamp); 1992 node.setAttribute(attr, translation); 1993 mutationCount = mutationCount + 1; 1994 } 1995 } 1996 } 1997 } 1998 } 1999 2000 function findAndLocalizeLinks(target, parent) { 2001 if(target.parentNode && parent) var allLinks = target.parentElement.querySelectorAll('[href],[action]'); 2002 else var allLinks = target.querySelectorAll('[href],[action]'); 2003 allLinks.forEach(link => { 2004 if(link.hasAttribute('href')) var attrName = 'href'; else var attrName = 'action'; 2005 var url = link.getAttribute(attrName); 2006 translateLink(url, link); 2007 }); 2008 } 2009 2010 function isLocalizationForm(node) { 2011 if(node.querySelector('input[name="form_type"][value="localization"]')){ 2012 return true; 2013 } 2014 return false;
2015 } 2016 2017 function getNodesUnder(el, show){ 2018 var n, a=[], walk=document.createTreeWalker(el, NodeFilter[show] , null, false); 2019 while(n=walk.nextNode()) a.push(n); 2020 return a; 2021 } 2022 2023 function spreadCustomContents() { 2024 var getFileName = function(url) { 2025 if(!url || url == '') return; 2026 url = url.substring(0, (url.indexOf("#") == -1) ? url.length : url.indexOf("#")); 2027 url = url.substring(0, (url.indexOf("?") == -1) ? url.length : url.indexOf("?")); 2028 url = url.substring(url.lastIndexOf("/") + 1, url.length); 2029 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, ""); 2030 return '/' + url; 2031 } 2032 Object.entries(customContents).forEach(function(entry) { 2033 //if(/<\/?[a-z][\s\S]*>/i.test(entry[0])) customContents_html[entry[0]] = entry[1]; 2034 //else if(/(http(s?):)?([/|.|\w|\s|-])*\.(?:jpe?g|gif|png)/.test(entry[0])) customContents_image[getFileName(entry[0])] = getFileName(entry[1]); 2035 if(/(http(s?):)?([/|.|\w|\s|-])*\.(?:jpe?g|gif|png|webp)/.test(entry[0])) customContents_image[LyHelper.extractImageObject(entry[0]).file] = LyHelper.extractImageObject(entry[1]); 2036 else customContents_text[entry[0]] = entry[1]; 2037 }); 2038 LyHelper.log('CUSTOM CONTENTS:', {customContents, customContents_text, customContents_image}, 'info') 2039 } 2040 2041 // Polyfill for old browsers 2042 function startMutationEvents() { 2043 var target = document.querySelector('body'); 2044 target.addEventListener("DOMAttrModified", function (event) { 2045 if(event.attrName === 'href' || event.attrName === 'action') { 2046 if(event.prevValue != event.newValue) { 2047 translateLink(event.newValue, event.target); 2048 } 2049 } 2050 }, false); 2051 target.addEventListener("DOMSubtreeModified", function (event) { 2052 //findAndLocalizeLinks(event.target, false); 2053 //matchCustomContent(event.target); 2054 }, false); 2055 } 2056 2057 function triggerCustomContents() { 2058 var rootnode = document.getElementsByTagName('body')[0] 2059 var walker = document.createTreeWalker(rootnode, NodeFilter.SHOW_ALL, null, false) 2060 2061 while (walker.nextNode()) { 2062 //LyHelper.log(walker.currentNode.tagName) 2063 translate(walker.currentNode, null); 2064 } 2065 } 2066 2067 function stopObserver() { 2068 mutationObs.takeRecords(); 2069 mutationObs.disconnect(); 2070 } 2071 2072 //init(); 2073 return { 2074 init: init, 2075 triggerCustomContents: triggerCustomContents, 2076 stopObserver: stopObserver, 2077 } 2078 }; 2079 } 2080 2081 2082 /** 2083 * 2084 * 2085 * @class Switcher 2086 */ 2087 class Switcher { 2088 constructor(switcherSettings) { 2089 LyHelper.log('Switcher instantiation'); 2090 2091 this.lyForceOff = location.search.split('ly-force-off=')[1]; 2092 this.switcherElements = Array.prototype.slice.call(document.getElementsByClassName('ly-switcher-wrapper')); 2093 } 2094 2095 init() { 2096 2097 // Initial cart.attributes update 2098 LyHelper.shopifyAPI().getCart(function (cart) { 2099 var currentLanguage = langify.locale.iso_code; 2100 if(!cart.attributes.language || cart.attributes.language != currentLanguage) { 2101 LyHelper.shopifyAPI().updateCartAttributes({"language": currentLanguage}, function(data){}); 2102 } 2103 }); 2104 2105 if(langify.locale.languages.length === 1) { 2106 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.'); 2107 return false; 2108 } 2109 2110 this.setCustomPosition(); 2111 this.initCustomDropdown(); 2112 this.bindCountrySwitchers(); 2113 this.bindCurrencySwitchers(); 2114 this.bindLanguageSwitchers(); 2115 2116 var event = new CustomEvent('langify.switcher.initialized', { 2117 bubbles: true, 2118 detail: {} 2119 }); 2120 } 2121
2122 initCustomDropdown() { 2123 // Custom Dropdown 2124 var root = this; 2125 var switcher = document.getElementsByClassName('ly-custom-dropdown-switcher'); 2126 for(var a = 0; a < switcher.length; a++) { 2127 switcher[a].classList.toggle('ly-is-open'); 2128 var isOut = LyHelper.isOutOfViewport(switcher[a]); 2129 if(isOut.bottom && isOut.inViewport) { 2130 switcher[a].classList.add('ly-is-dropup'); 2131 var arrows = switcher[a].querySelectorAll('.ly-arrow'); 2132 for(var b = 0; b < arrows.length; b++) { 2133 arrows[b].classList.add('ly-arrow-up'); 2134 } 2135 } 2136 switcher[a].classList.toggle('ly-is-open'); 2137 switcher[a].onclick = function(event) { 2138 root.toggleSwitcherOpen(this); 2139 } 2140 } 2141 2142 document.addEventListener('click', function(event) { 2143 if(!event.target.closest('.ly-custom-dropdown-switcher')) { 2144 var openSwitchers = document.querySelectorAll('.ly-custom-dropdown-switcher.ly-is-open') 2145 for(var i = 0; i < openSwitchers.length; i++) { 2146 openSwitchers[i].classList.remove('ly-is-open'); 2147 } 2148 } 2149 }); 2150 } 2151 2152 bindLanguageSwitchers() { 2153 var root = this; 2154 var links = document.getElementsByClassName('ly-languages-switcher-link'); 2155 for(var l = 0; l < links.length; l++) { 2156 links[l].addEventListener('click', function(event) { 2157 event.preventDefault(); 2158 if(LyHelper.isDomainFeatureEnabled() && this.getAttribute('href') !== '#') { 2159 var domain = this.getAttribute('href'); 2160 } 2161 LyHelper.setCookie('ly-lang-selected', this.getAttribute('data-language-code'), 365); 2162 LyHelper.localizationRedirect('language_code', this.getAttribute('data-language-code'), null, null, domain); 2163 }); 2164 } 2165 2166 // Native select event handling 2167 var nativeLangifySelects = document.querySelectorAll('select.ly-languages-switcher'); 2168 for(var i = 0; i < nativeLangifySelects.length; i++) { 2169 nativeLangifySelects[i].onchange = function() { 2170 event.preventDefault(); 2171 if(LyHelper.isDomainFeatureEnabled() && this[this.selectedIndex].getAttribute('data-domain') !== '#') { 2172 var domain = this[this.selectedIndex].getAttribute('data-domain'); 2173 } 2174 LyHelper.setCookie('ly-lang-selected', this[this.selectedIndex].getAttribute('data-language-code'), 365); 2175 LyHelper.localizationRedirect('language_code', this[this.selectedIndex].getAttribute('data-language-code'), null, null, domain); 2176 }; 2177 } 2178 } 2179 2180 bindCountrySwitchers() { 2181 var countrySelectSwitcher = document.querySelectorAll('select.ly-country-switcher'); 2182 var countryCustomSwitcher = document.querySelectorAll('div.ly-country-switcher a'); 2183 for(var i=0; i<countryCustomSwitcher.length; i++) { 2184 countryCustomSwitcher[i].addEventListener('click', function(e) { 2185 LyHelper.localizationRedirect('country_code', this.getAttribute('data-country-code')); 2186 }); 2187 } 2188 for(var a=0; a<countrySelectSwitcher.length; a++) { 2189 countrySelectSwitcher[a].addEventListener('change', function(){ 2190 LyHelper.localizationRedirect('country_code', this[this.selectedIndex].getAttribute('data-country-code')); 2191 }); 2192 } 2193 } 2194 2195 bindCurrencySwitchers() { 2196 var currencySelectSwitcher = document.querySelectorAll('select.ly-currency-switcher'); 2197 var currencyCustomSwitcher = document.querySelectorAll('div.ly-currency-switcher a'); 2198 for(var i=0; i<currencyCustomSwitcher.length; i++) { 2199 currencyCustomSwitcher[i].addEventListener('click', function(e) { 2200 LyHelper.changeCurrency(this.getAttribute('data-currency-code')); 2201 }); 2202 } 2203 for(var a=0; a<currencySelectSwitcher.length; a++) { 2204 currencySelectSwitcher[a].addEventListener('change', function(){ 2205 LyHelper.changeCurrency(this[this.selectedIndex].getAttribute('data-currency-code')); 2206 }); 2207 } 2208 } 2209 2210 setCustomPosition() { 2211 for(var i = 0; i < this.switcherElements.length; i++) { 2212 if(this.lyForceOff !== 'true') { 2213 if(langify.locale.languages.length <= 1) { 2214 this.switcherElements[i].querySelector('.ly-languages-switcher').classList.add('ly-hide'); 2215 } 2216 this.switcherElements[i].classList.remove('ly-hide'); 2217 } 2218 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 )) { 2219 var targets = Array.from(document.getElementsByClassName('ly-custom-'+this.switcherElements[i].getAttribute('data-breakpoint'))); 2220 var target = document.getElementById('ly-custom-'+this.switcherElements[i].getAttribute('data-breakpoint')); 2221 if(target) targets.push(target); 2222 for(var c = 0; c < targets.length; c++) { 2223 var clone = this.switcherElements[i].cloneNode(true); 2224 targets[c].innerHTML = clone.outerHTML; 2225 } 2226 this.switcherElements[i].classList.add('ly-hide'); 2227 } 2228 } 2229 } 2230 2231 toggleSwitcherOpen(e) { 2232 var target = e; 2233 if(!target.classList.contains('ly-is-open')) { 2234 var openSwitchers = document.querySelectorAll('.ly-custom-dropdown-switcher.ly-is-open') 2235 for(var i = 0; i < openSwitchers.length; i++) { 2236 openSwitchers[i].classList.remove('ly-is-open'); 2237 } 2238 2239 target.getElementsByClassName('ly-custom-dropdown-current')[0].setAttribute('aria-expanded', 'true'); 2240 } else { 2241 target.getElementsByClassName('ly-custom-dropdown-current')[0].setAttribute('aria-expanded', 'false'); 2242 } 2243 target.classList.toggle('ly-is-open'); 2244 var isOut = LyHelper.isOutOfViewport(target); 2245 if(isOut.bottom) { 2246 target.classList.add('ly-is-dropup'); 2247 } 2248 } 2249 2250 togglePopupOpen(e) { 2251 e.closest('.ly-popup-switcher').classList.toggle('ly-is-open'); 2252 } 2253 2254 _getCountryCodeFromHreflang(language_code) { 2255 var hreflangTags = document.querySelectorAll('link[hreflang]'); 2256 var languageDomains = {}; 2257 var countryCode = false;
2258 for(var i = 0; i < hreflangTags.length; i++) { 2259 if(hreflangTags[i].getAttribute('hreflang').indexOf(language_code) === 0) { 2260 if(!languageDomains[hreflangTags[i].getAttribute('href')]) { 2261 languageDomains[hreflangTags[i].getAttribute('href')] = hreflangTags[i]; 2262 } 2263 } 2264 } 2265 if(Object.keys(languageDomains).length > 0) { 2266 countryCode = Object.values(languageDomains)[0].getAttribute('hreflang'); 2267 countryCode = countryCode.split('-'); 2268 if(countryCode[1]) { 2269 countryCode = countryCode[1] 2270 } else { 2271 2272 } 2273 } 2274 return countryCode; 2275 } 2276 } 2277 2278 2279 /** 2280 * 2281 * 2282 * @class LanguageDetection 2283 */ 2284 class LanguageDetection { 2285 2286 constructor() { 2287 this.hreflangList = null; 2288 LyHelper.log('LanguageDetection instantiation'); 2289 } 2290 2291 init() { 2292 if(LyHelper.inIframe()) return null; 2293 var currentLang = langify.locale.iso_code.toLowerCase(); 2294 //var localizationData = this.getLocalizationData(); 2295 this.hreflangList = this.getHreflangList(); 2296 2297 var userLang = navigator.language || navigator.userLanguage; 2298 userLang = userLang.toLowerCase(); 2299 var bot = /bot|google|baidu|bing|msn|duckduckbot|teoma|slurp|yandex|Chrome-Lighthouse/i.test(navigator.userAgent); 2300 var blockedRoutes = window.lyBlockedRoutesList || []; 2301 var blockedRoute = blockedRoutes.find(x => window.location.pathname.indexOf(x) === 0); 2302 var is404 = document.getElementsByClassName('template-404').length; 2303 2304 if(LyHelper.getVal('redirected') === 'true') { 2305 LyHelper.setCookie('ly-lang-selected', currentLang, 365); 2306 var _href = window.location.href; 2307 history.replaceState(null, '', _href.replace(/(\?|&)(redirected=true)/i, '')); 2308 return null; 2309 } 2310 2311 if(!is404 && !bot && !blockedRoute && LyHelper.getVal('ly-lang-detect') !== 'off') { 2312 if(userLang && !LyHelper.getCookie('ly-lang-selected')) { 2313 var hasMatch = this.matchHreflangList(userLang); 2314 if(currentLang !== this._hreflangToLanguageCode(hasMatch)) { 2315 if(hasMatch) { 2316 this.redirectMatched(userLang); 2317 } else if (!hasMatch && langify.settings.switcher.languageDetectionDefault) { 2318 // Redirect to default language 2319 this.redirectMatched(langify.settings.switcher.languageDetectionDefault); 2320 } 2321 } 2322 } else { 2323 if(LyHelper.getCookie('ly-lang-selected') && LyHelper.getCookie('ly-lang-selected') !== currentLang) { 2324 // Only save cookie when the domain feature is active 2325 if(LyHelper.isDomainFeatureEnabled()) { 2326 LyHelper.setCookie('ly-lang-selected', currentLang, 365); 2327 } 2328 this.redirectMatched(LyHelper.getCookie('ly-lang-selected')); 2329 } 2330 } 2331 } 2332 2333 this._geolocationAppSupport(); 2334 } 2335 redirectMatched(userLang) { 2336 var match = this.matchHreflangList(userLang); 2337 if(match) { 2338 this.redirectHref(match.href, match.lang); 2339 } 2340 return match; 2341 } 2342 matchHreflangList(userLang) { 2343 var matchedHreflang = false; 2344 var browserLang = userLang; 2345 2346 // Find candidates 2347 var candidates = this.hreflangList.filter(item => item.lang === browserLang); 2348 if(candidates.length === 0) { 2349 browserLang = userLang.toLowerCase(); 2350 candidates = this.hreflangList.filter(item => item.lang.toLowerCase().indexOf(browserLang) === 0); 2351 } 2352 if(candidates.length === 0) { 2353 browserLang = userLang.toLowerCase().substring(0, 2); 2354 candidates = this.hreflangList.filter(item => item.lang.toLowerCase().indexOf(browserLang) === 0); 2355 } 2356 2357 // Handle candidates 2358 if(candidates.length === 1) { 2359 return({href: candidates[0].href, lang: browserLang}); 2360 } 2361 else if(candidates.length > 1) { 2362 var preferedCandidate = candidates.find(item => item.href.indexOf(window.location.host) >= 0) 2363 if(preferedCandidate) { 2364 return({href: preferedCandidate.href, lang: browserLang}); 2365 } else { 2366 return({href: candidates[0].href, lang: browserLang}); 2367 } 2368 } 2369 2370 return false;
2371 } 2372 redirectHref(href, userLang) { 2373 var queryString = window.location.search; 2374 var url = href.split('?')[0]; 2375 if(queryString === '') { 2376 queryString = '?redirected=true'; 2377 } else { 2378 queryString += '&redirected=true'; 2379 } 2380 window.location.replace(url + queryString); 2381 } 2382 getHreflangList() { 2383 var hreflangTags = document.querySelectorAll('link[hreflang]'); 2384 var hreflangList = []; 2385 var countryCode = false; 2386 // Cross Domain Links option 2387 if(LyHelper.isDomainFeatureEnabled()) { 2388 for(var i = 0; i < langify.locale.languages.length; i++) { 2389 hreflangList.push({ 2390 href: 'https://' + langify.locale.languages[i].domain + window.location.pathname + window.location.search + window.location.hash, 2391 lang: langify.locale.languages[i].iso_code, 2392 }); 2393 } 2394 } 2395 for(var i = 0; i < hreflangTags.length; i++) { 2396 var hreflang = hreflangTags[i].getAttribute('hreflang').toLowerCase(); 2397 hreflang = hreflang.replace('zh-hans', 'zh-cn').replace('zh-hant', 'zh-tw'); // Chinese special cases 2398 hreflangList.push({ 2399 href: hreflangTags[i].getAttribute('href'), 2400 lang: hreflang 2401 }); 2402 } 2403 return hreflangList; 2404 } 2405 _langToHreflang(userLang) { 2406 var hreflang = ''; 2407 this.hreflangList.map(function(item) { 2408 if(item.lang === userLang) { 2409 hreflang = userLang; 2410 } 2411 }); 2412 if(hreflang === '') { 2413 this.hreflangList.map(function(item) { 2414 var browserLang = userLang.toLowerCase(); 2415 if(item.lang.toLowerCase().indexOf(browserLang) === 0) { 2416 hreflang = browserLang; 2417 } 2418 else if(item.lang.toLowerCase().indexOf(browserLang.substring(0, 2)) === 0) { 2419 hreflang = browserLang.substring(0, 2); 2420 } 2421 }); 2422 } 2423 return hreflang || userLang; 2424 } 2425 _hreflangToLanguageCode(hreflangTag) { 2426 if(!hreflangTag || !hreflangTag.lang) return false; 2427 var languageCode = false;
2428 langify.locale.languages.forEach(function(item) { 2429 if(item.iso_code.toLowerCase() === hreflangTag.lang.toLowerCase()) { 2430 languageCode = item.iso_code; 2431 } 2432 }); 2433 if(!languageCode) { 2434 langify.locale.languages.forEach(function(item) { 2435 if(item.iso_code.toLowerCase() === hreflangTag.lang.substring(0, 2).toLowerCase()) { 2436 languageCode = item.iso_code; 2437 } 2438 }); 2439 } 2440 return languageCode; 2441 } 2442 _geolocationAppSupport() { 2443 var target = document.querySelector('body'); 2444 var config = { childList: true, subtree: true }; 2445 var geolocationObserver = new MutationObserver(function(mutations) { 2446 mutations.forEach(function(mutation) { 2447 if (mutation.type === 'childList' && mutation.addedNodes.length > 0) { 2448 var target = mutation.target.getElementsByClassName('locale-bar__form'); 2449 if(target[0]) { 2450 target[0].onsubmit = function() { 2451 var locale_code = target[0].elements['locale_code'].value; 2452 var selector = target[0].getElementsByClassName('locale-bar__selector'); 2453 if(selector.length >= 1) { 2454 locale_code = selector[0].options[selector[0].selectedIndex].value; 2455 } 2456 LyHelper.setCookie('ly-lang-selected', locale_code, 365); 2457 }; 2458 } 2459 var selectors = mutation.target.getElementsByClassName('locale-selectors__selector'); 2460 if(selectors.length > 0) { 2461 for(var selector of selectors) { 2462 if(selector.getAttribute('name') === 'locale_code') { 2463 selector.onchange = function() { 2464 var locale_code = selector.options[selector.selectedIndex].value; 2465 LyHelper.setCookie('ly-lang-selected', locale_code, 365); 2466 }; 2467 } 2468 } 2469 } 2470 } 2471 }); 2472 }); 2473 geolocationObserver.observe(target, config); 2474 setTimeout(function() { 2475 geolocationObserver.disconnect(); 2476 }, 10000); 2477 } 2478 } 2479 2480 2481 /** 2482 * 2483 * 2484 * @class Recommendation 2485 */ 2486 class Recommendation extends LanguageDetection { 2487 2488 constructor() { 2489 super(); 2490 LyHelper.log('Recommendation instantiation'); 2491 } 2492 2493 init() { 2494 this.hreflangList = this.getHreflangList(); 2495 2496 var userLang = navigator.language || navigator.userLanguage; 2497 userLang = userLang.toLowerCase(); 2498 2499 var recommendation = this.matchHreflangList(userLang); 2500 var recommendationLanguageCode = this._hreflangToLanguageCode(recommendation); 2501 if(recommendationLanguageCode && recommendationLanguageCode !== langify.locale.iso_code && !LyHelper.getCookie('ly-lang-selected')) { 2502 this.recommended_language_code = recommendationLanguageCode; 2503 this.recommended_country_code = null; 2504 this.recommended_currency_code = null; 2505 this._translateStrings(recommendationLanguageCode); 2506 this._bindings(); 2507 } else { 2508 return false; 2509 } 2510 } 2511 2512 _translateStrings(languageCode) { 2513 var recommendationElement = document.querySelectorAll('.ly-recommendation')[0]; 2514 var strings = langify.settings.switcher.recommendation_strings[languageCode]; 2515 var recommendationStr = 'Looks like your browser is set to [[language]]. Change the language?'; 2516 var buttonStr = 'Change'; 2517 var matchedLanguageCode = this._langToHreflang(languageCode).toLowerCase(); 2518 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(); 2519 if(strings) { 2520 recommendationStr = strings.recommendation ? strings.recommendation : recommendationStr; 2521 buttonStr = strings.button ? strings.button : buttonStr; 2522 languageStr = strings.language ? strings.language : languageStr; 2523 } 2524 var newCode = recommendationElement.innerHTML;
2525 newCode = newCode.replaceAll('[[recommendation]]', recommendationStr).replaceAll('[[button]]', buttonStr).replaceAll('[[language]]', languageStr); 2526 recommendationElement.innerHTML = newCode; 2527 } 2528 2529 _bindings() { 2530 var _this = this; 2531 var lyForceOff = location.search.split('ly-force-off=')[1]; 2532 var recommendationElement = document.querySelectorAll('.ly-recommendation')[0]; 2533 var form = recommendationElement.querySelectorAll('.ly-recommendation-form')[0]; 2534 var links = recommendationElement.getElementsByClassName('ly-custom-dropdown-list-element'); 2535 var customDropdown = recommendationElement.querySelectorAll('.ly-custom-dropdown-switcher'); 2536 var nativeSelects = recommendationElement.getElementsByClassName('ly-native-select'); 2537 2538 form.addEventListener('submit', function(e) { 2539 e.preventDefault(); 2540 2541 if(_this.recommended_country_code || _this.recommended_currency_code) { 2542 // When a country or currency is involved, use old redirection 2543 var additionalFields = []; 2544 if(_this.recommended_country_code) { 2545 additionalFields.push({ 2546 name: 'country_code', 2547 value: _this.recommended_country_code 2548 }); 2549 } 2550 if(_this.recommended_currency_code) { 2551 additionalFields.push({ 2552 name: 'currency_code', 2553 value: _this.recommended_currency_code 2554 }); 2555 } 2556 LyHelper.setCookie('ly-lang-selected', _this.recommended_language_code, 365); 2557 LyHelper.localizationRedirect('language_code', _this.recommended_language_code, additionalFields); 2558 } else { 2559 //...or use new hreflang redirection 2560 _this.redirectMatched(_this.recommended_language_code); 2561 } 2562 }); 2563 2564 // Overwrite switchers 2565 for(var l = 0; l < links.length; l++) { 2566 links[l].addEventListener('click', function(event) { 2567 event.preventDefault(); 2568 2569 // When clicked from within a custom dropdown 2570 var parentCustomDropdown = event.currentTarget.closest('.ly-custom-dropdown-switcher'); 2571 if(parentCustomDropdown) { 2572 _this._selectCustomDropdownEntry(parentCustomDropdown, this); 2573 } else { 2574 _this.recommended_language_code = this.getAttribute('data-language-code'); 2575 } 2576 }); 2577 } 2578 2579 for(var i = 0; i < nativeSelects.length; i++) { 2580 nativeSelects[i].onchange = _this._selectNativeDropdownEntry.bind(this); 2581 2582 if(nativeSelects[i].classList.contains('ly-languages-switcher')) { 2583 nativeSelects[i].value = _this.recommended_language_code; 2584 } 2585 } 2586 2587 for(var i = 0; i < customDropdown.length; i++) { 2588 if(recommendationElement.className.indexOf('bottom') > -1) { 2589 customDropdown[i].classList.add('ly-is-dropup'); 2590 } 2591 2592 if(customDropdown[i].classList.contains('ly-languages-switcher')) { 2593 _this._selectCustomDropdownEntry(customDropdown[i], customDropdown[i].querySelector('.ly-custom-dropdown-list a[data-language-code="'+ _this.recommended_language_code +'"]')); 2594 } 2595 } 2596 if(!lyForceOff) { 2597 recommendationElement.classList.add('ly-is-open'); 2598 } 2599 } 2600 2601 _selectNativeDropdownEntry(event) { 2602 event.preventDefault(); 2603 var element = event.currentTarget; 2604 var _this = this; 2605 2606 if(element[element.selectedIndex].hasAttribute('data-language-code')) { 2607 _this.recommended_language_code = element[element.selectedIndex].getAttribute('data-language-code'); 2608 } 2609 if(element[element.selectedIndex].hasAttribute('data-country-code')) { 2610 _this.recommended_country_code = element[element.selectedIndex].getAttribute('data-country-code'); 2611 } 2612 if(element[element.selectedIndex].hasAttribute('data-currency-code')) { 2613 _this.recommended_currency_code = element[element.selectedIndex].getAttribute('data-currency-code'); 2614 } 2615 } 2616 2617 _selectCustomDropdownEntry(element, entry) { 2618 if(!entry) return; 2619 var _this = this; 2620 var currentElem = element.querySelector('.ly-custom-dropdown-current'); 2621 var currentIcon = currentElem.querySelector('.ly-icon'); 2622 var currentLabel = currentElem.querySelector('span'); 2623 var valueToSelect = ''; 2624 2625 if(entry.hasAttribute('data-language-code')) { 2626 _this.recommended_language_code = entry.getAttribute('data-language-code'); 2627 valueToSelect = _this.recommended_language_code; 2628 } 2629 if(entry.hasAttribute('data-country-code')) { 2630 _this.recommended_country_code = entry.getAttribute('data-country-code'); 2631 valueToSelect = _this.recommended_country_code; 2632 } 2633 if(entry.hasAttribute('data-currency-code')) { 2634 _this.recommended_currency_code = entry.getAttribute('data-currency-code'); 2635 valueToSelect = _this.recommended_currency_code; 2636 } 2637 if(entry.hasAttribute('data-country-code') && entry.hasAttribute('data-currency-code')) { 2638 valueToSelect = _this.recommended_country_code + '-' + _this.recommended_currency_code; 2639 } 2640 2641 if(element.querySelector('.ly-custom-dropdown-list li.current')) { 2642 element.querySelector('.ly-custom-dropdown-list li.current').classList.remove('current'); 2643 element.querySelector('.ly-custom-dropdown-list li[key="'+ valueToSelect +'"]').classList.add('current'); 2644 } 2645 if(element.querySelector('.ly-custom-dropdown-list li.current span')) currentLabel.innerHTML = element.querySelector('.ly-custom-dropdown-list li.current span').innerHTML; 2646 if(element.querySelector('.ly-custom-dropdown-list li.current .ly-icon')) currentIcon.classList = element.querySelector('.ly-custom-dropdown-list li.current .ly-icon').classList; 2647 } 2648 2649 toggleOpen(e) { 2650 e.closest('.ly-recommendation').classList.toggle('ly-is-open'); 2651 if(!e.closest('.ly-recommendation').classList.contains('ly-is-open')) { 2652 LyHelper.setCookie('ly-lang-selected', this.recommended_language_code, 365); 2653 } 2654 } 2655 } 2656 2657 2658 /** 2659 * 2660 * 2661 * @class Langify 2662 */ 2663 class Langify { 2664 constructor(settings, locale) { 2665 LyHelper.log('Langify instantiation') 2666 2667 var translationObserver = new TranslationObserver().init(); 2668 2669 langify.helper = new LyHelper(); 2670 LyHelper.log(langify.helper); 2671 2672 2673 var lyForceOff = location.search.split('ly-force-off=')[1]; 2674 if(lyForceOff === 'true') { 2675 document.getElementById('preview-bar-iframe').classList.add('ly-hide'); 2676 return false;
2677 } 2678 2679 if(settings.theme && ((settings.theme.loadJquery && settings.theme.loadJquery === true) || typeof settings.theme.loadJquery === 'undefined')) { 2680 if(typeof jQuery === 'undefined') { 2681 LyHelper.loadScript('//cdn.jsdelivr.net/jquery/1.9.1/jquery.min.js', function() {}); 2682 } 2683 } 2684 2685 //document.addEventListener("DOMContentLoaded", function() { 2686 langify.switcher = new Switcher(); 2687 langify.switcher.init(); 2688 2689 if(settings.switcher) { 2690 if(settings.switcher.recommendation && settings.switcher.recommendation_enabled) { 2691 langify.recommendation = new Recommendation(); 2692 langify.recommendation.init(); 2693 } else { 2694 if(settings.switcher.languageDetection) { 2695 langify.languageDetection = new LanguageDetection(); 2696 langify.languageDetection.init(); 2697 } 2698 } 2699 } 2700 //}); 2701 } 2702 } 2703 2704 // Polyfills 2705 (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); 2706 !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};
2706this._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}}(); 2707 !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}}(); 2708 2709 var langify = window.langify || {}; 2710 var customContents = {}; 2711 var customContents_image = {}; 2712 var langifySettingsOverwrites = {}; 2713 var defaultSettings = { 2714 debug: false, // BOOL : Enable/disable console logs 2715 observe: true, // BOOL : Enable/disable the entire mutation observer (off switch) 2716 observeLinks: false, 2717 observeImages: true, 2718 observeCustomContents: true, 2719 maxMutations: 5, 2720 timeout: 100, // INT : Milliseconds to wait after a mutation, before the next mutation event will be allowed for the element 2721 linksBlacklist: [], 2722 }; 2723 2724 if(langify.settings) { 2725 langifySettingsOverwrites = Object.assign({}, langify.settings); 2726 langify.settings = Object.assign(defaultSettings, langify.settings); 2727 } else { 2728 langify.settings = defaultSettings; 2729 } 2730 2731 langify.settings.theme = null; 2732 langify.settings.switcher = null; 2733 2734 langify.locale = langify.locale || { 2735 primary: true, 2736 iso_code: "en", 2737 root_url: "\/", 2738 language_id: "ly120330", 2739 shop_url: "https:\/\/thealinker.ca", 2740 domain_feature_enabled: null, 2741 languages: [{ 2742 iso_code: "en", 2743 root_url: "\/", 2744 domain: null, 2745 },{ 2746 iso_code: "fr", 2747 root_url: "\/fr", 2748 domain: null, 2749 },],}; 2750 2751 // Disable link correction ALWAYS on languages with mapped domains 2752 2753 if(langify.locale.root_url == '/') { 2754 langify.settings.observeLinks = false;
2755 } 2756 2757 window.addEventListener('DOMContentLoaded', function() { 2758 langify.helper = new LyHelper(); 2759 2760 // Custom Contents Section 2761 2762 // Images Section 2763 2764 2765 2766 var langifyInstance = new Langify(langify.settings, langify.locale); 2767 }); 2768</script>
2768 2769<div data-breakpoint="" class="ly-switcher-wrapper ly-breakpoint-1 fixed bottom_right ly-hide" style="font-size: 14px; margin: 0px 0px; "><div aria-label="Selected language: English" aria-description="Language selector" data-dropup="false" onclick="langify.switcher.toggleSwitcherOpen(this)" class="ly-languages-switcher ly-custom-dropdown-switcher ly-bright-theme" style=" margin: 0px 0px;"> 2770 <span role="button" 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> 2771<div class="ly-arrow ly-arrow-black stroke" style="vertical-align: middle; width: 14.0px; height: 14.0px;"> 2772 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14.0 14.0" height="14.0px" width="14.0px" style="position: absolute;"> 2773 <path d="M1 4.5 L7.0 10.5 L13.0 4.5" fill="transparent" stroke="#000000" stroke-width="1px"/> 2774 </svg> 2775 </div> 2776 </span> 2777 <ul id="languagesSwitcherList-1" role="list" class="ly-custom-dropdown-list ly-is-open ly-bright-theme" style="background: #ffffff; color: #000000; "><li key="fr" style="color: #000000; margin: 0px 0px;" tabindex="-1"> 2778 <a class="ly-custom-dropdown-list-element ly-languages-switcher-link ly-bright-theme" href="#" data-language-code="fr" data-ly-locked="true"><i class="ly-icon ly-flag-icon ly-flag-icon-fr"></i><span class="ly-custom-dropdown-list-element-right">French</span></a> 2779 </li><li key="en" class="current" style="color: #000000; margin: 0px 0px;" tabindex="-1"> 2780 <a class="ly-custom-dropdown-list-element ly-languages-switcher-link ly-bright-theme current_lang" href="#" data-language-code="en" 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> 2781 </li></ul> 2782 </div></div> 2783<style> 2784 .ly-flag-icon-en { background-image: url('//thealinker.ca/cdn/shop/t/21/assets/ly-icon-e
2784n.svg?v=168749326791323067301698087541'); } 2785 .ly-flag-icon-fr { background-image: url('//thealinker.ca/cdn/shop/t/21/assets/ly-icon-fr.svg?v=49424167760593335881698087541'); } 2786 2787 .ly-switcher-wrapper { 2788 2789 } 2790 .ly-switcher-wrapper.fixed { 2791 position: fixed; 2792 z-index: 1000; 2793 } 2794 .ly-switcher-wrapper.absolute { 2795 position: absolute; 2796 z-index: 1000; 2797 } 2798 .ly-switcher-wrapper.fixed.top_left, 2799 .ly-switcher-wrapper.absolute.top_left { 2800 top: 0; 2801 left: 0; 2802 } 2803 .ly-switcher-wrapper.fixed.top_right, 2804 .ly-switcher-wrapper.absolute.top_right { 2805 top: 0; 2806 right: 0; 2807 } 2808 .ly-switcher-wrapper.fixed.bottom_left, 2809 .ly-switcher-wrapper.absolute.bottom_left { 2810 bottom: 0; 2811 left: 0; 2812 } 2813 .ly-switcher-wrapper.fixed.bottom_right, 2814 .ly-switcher-wrapper.absolute.bottom_right { 2815 bottom: 0; 2816 right: 0; 2817 } 2818 .ly-switcher-wrapper .shopify-currency-form { 2819 display: inline-block; 2820 } 2821 2822 2823 .ly-currency-switcher { 2824 font-size: 1em; 2825 } 2826 2827 .ly-inner-text { 2828 margin: 0 0.2em; 2829 white-space: nowrap; 2830 } 2831 2832 .ly-flag-icon { 2833 background-size: contain; 2834 background-position: 50%; 2835 background-repeat: no-repeat; 2836 position: relative; 2837 display: inline-block; 2838 width: 1.33333333em; 2839 line-height: 1em; 2840 } 2841 .ly-flag-icon:before { 2842 content: ''; 2843 display: inline-block; 2844 } 2845 .ly-flag-icon.ly-flag-squared { 2846 width: 1em; 2847 } 2848 .ly-flag-icon.ly-flag-rounded { 2849 width: 1em; 2850 border-radius: 50%; 2851 } 2852 .ly-languages-switcher { 2853 white-space: nowrap; 2854 list-style-type: none; 2855 display: flex; 2856 font-size: 1em; 2857 } 2858 .ly-languages-switcher-link { 2859 margin: 0 0.2em; 2860 cursor: pointer; 2861 white-space: nowrap; 2862 text-decoration: none; 2863 display: inline-block; 2864 } 2865 .ly-languages-switcher.ly-list { 2866 margin: 0; 2867 padding: 0; 2868 display: block; 2869 } 2870 .ly-languages-switcher.ly-native-select { 2871 2872 } 2873 .ly-icon { 2874 margin: 0 0.2em; 2875 } 2876 2877 .ly-arrow { 2878 display: inline-block; 2879 position: relative; 2880 vertical-align: middle; 2881 direction: ltr !important; 2882 -webkit-transition: transform 0.25s; 2883 -moz-transition: transform 0.25s; 2884 transition: transform 0.25s; 2885 margin: 0 0.2em; 2886 } 2887 .ly-custom-dropdown-switcher.ly-is-open .ly-arrow { 2888 transform: rotate(180deg); 2889 } 2890 .ly-custom-dropdown-switcher.ly-arrow.ly-arrow-up { 2891 transform: rotate(180deg); 2892 } 2893 .ly-custom-dropdown-switcher.ly-is-open .ly-arrow.ly-arrow-up { 2894 transform: rotate(0deg); 2895 } 2896 2897 .ly-custom-dropdown-switcher { 2898 text-align: left; 2899 display: inline-block; 2900 position: relative; 2901 user-select: none; 2902 cursor: pointer; 2903 } 2904 .ly-custom-dropdown-current { 2905 display: block; 2906 vertical-align: middle; 2907 } 2908 .ly-custom-dropdown-current-inner { 2909 display: inline-block; 2910 vertical-align: middle; 2911 } 2912 .ly-custom-dropdown-current-inner-image { 2913 margin-right: 0.25em; 2914 } 2915 .ly-custom-dropdown-current-inner-text { 2916 margin: 0 0.2em; 2917 } 2918 .ly-custom-dropdown-list { 2919 display: none !important; 2920 list-style: none; 2921 position: absolute; 2922 left: 0; 2923 padding: inherit !important; 2924 padding: 0 !important; 2925 margin: 0; 2926 z-index: 99999; 2927 text-align: left; 2928 width: 100%; 2929 font-size: 1em; 2930 } 2931 .ly-custom-dropdown-list-element { 2932 color: inherit !important; 2933 display: block; 2934 } 2935 .ly-custom-dropdown-list > li { 2936 margin: 0 !important; 2937 display: block; 2938 } 2939 .ly-custom-dropdown-list-element-left { 2940 margin-right: 0.5em; 2941 } 2942 .ly-custom-dropdown-list-element-right { 2943 text-align: left; 2944 } 2945 .ly-custom-dropdown-list-element-left, 2946 .ly-custom-dropdown-list-element-right { 2947 vertical-align: middle; 2948 } 2949 .ly-custom-dropdown-switcher .ly-languages-switcher-link { 2950 margin: 0; 2951 } 2952 .ly-languages-switcher-dropdown { 2953 display: inline-block; 2954 } 2955 .ly-languages-links-switcher { 2956 display: inline-block; 2957 } 2958 .ly-languages-links-switcher > .ly-languages-link { 2959 /*margin-right: 0.5em;*/ 2960 padding: inherit !important; 2961 color: inherit !important; 2962 } 2963 .ly-custom-dropdown-list-element { 2964 /*padding: inherit !important;*/ 2965 text-decoration: none; 2966 } 2967 .ly-is-uppercase { 2968 text-transform: uppercase; 2969 } 2970 .ly-is-transparent.ly-links, 2971 .ly-is-transparent.ly-list, 2972 .ly-is-transparent.ly-currency-switcher, 2973 .ly-is-transparent.ly-custom-dropdown-switcher, 2974 .ly-is-transparent.ly-custom-dropdown-switcher .ly-custom-dropdown-list { 2975 background: transparent !important; 2976 } 2977 .ly-arrow-up { 2978 transform: rotateZ(180deg); 2979 } 2980 2981 .ly-custom-dropdown-switcher .ly-custom-dropdown-list li.current{ 2982 display: none; 2983 } 2984 .ly-custom-dropdown-switcher.ly-is-open .ly-custom-dropdown-list { 2985 display: flex !important; 2986 min-width: 100%; 2987 width: 100%; 2988 flex-direction: column-reverse; 2989 right: 0; 2990 left: auto; 2991 overflow: auto; 2992 max-height: 350px; 2993 max-height: 50vh; 2994 } 2995 2996 .ly-is-dropup .ly-custom-dropdown-list { 2997 bottom: 100%; 2998 } 2999 .ly-hide { 3000 display: none !important; 3001 } 3002 body.ly-force-off #preview-bar-iframe, 3003 body.ly-force-off .ly-languages-switcher { 3004 display: none !important; 3005 } 3006 3007 .ly-close { 3008 position: absolute; 3009 opacity: 0.3; 3010 right: 0; 3011 top: 0; 3012 width: 3em; 3013 height: 3em; 3014 display: inline-block !important; 3015 background: rbga(0,0,0,0); 3016 padding: 1em; 3017 } 3018 .ly-close:hover { 3019 opacity: 1; 3020 } 3021 .ly-close .inner { 3022 transform: translateX(-50%); 3023 position: relative; 3024 width: 100%; 3025 height: 100%; 3026 display: inline-block; 3027 } 3028 .ly-close .inner:before, .ly-close .inner:after { 3029 position: absolute; 3030 left: 1em; 3031 content: ' '; 3032 height: 1em; 3033 width: 2px; 3034 background-color: #333; 3035 } 3036 .ly-close .inner:before { 3037 transform: rotate(45deg); 3038 } 3039 .ly-close .inner:after { 3040 transform: rotate(-45deg); 3041 } 3042 3043 3044 3045 .ly-popup-switcher {} 3046 .ly-popup-switcher .ly-popup-current { 3047 cursor: pointer; 3048 background: transparent; 3049 } 3050 .ly-popup-switcher .ly-popup-modal { 3051 position: fixed; 3052 z-index: 1000; 3053 top: 0; 3054 left: 0; 3055 width: 100%; 3056 height: 100%; 3057 display: none; 3058 justify-content: center;
3059 align-items: center; 3060 } 3061 .ly-popup-switcher.ly-is-open .ly-popup-modal { 3062 display: flex; 3063 } 3064 .ly-popup-switcher .ly-popup-modal-backdrop { 3065 position: fixed; 3066 width: 100%; 3067 height: 100%; 3068 z-index: 0; 3069 top: 0; 3070 left: 0; 3071 background:rgba(0, 0, 0, 0.38); 3072 cursor: pointer; 3073 } 3074 .ly-popup-switcher .ly-popup-modal .ly-popup-modal-content { 3075 padding: 1em; 3076 position: absolute; 3077 z-index: 1000; 3078 } 3079 .ly-popup-switcher .ly-popup-modal .ly-popup-modal-content ul { 3080 padding: 0; 3081 margin: 12px 0 0 0; 3082 list-style: none; 3083 display: flex; 3084 flex-direction: column; 3085 } 3086 .ly-popup-switcher .ly-popup-modal .ly-popup-modal-content ul .ly-languages-switcher-link { 3087 margin: 0; 3088 border: solid 1px; 3089 padding: 1em; 3090 display: block; 3091 min-width: 225px; 3092 margin-top: 1em; 3093 } 3094 .ly-popup-switcher .ly-popup-modal .ly-popup-modal-content ul .ly-languages-switcher-link.current_lang { 3095 display: none; 3096 } 3097 3098 3099 3100 /* Recommendation */ 3101 .ly-recommendation { 3102 display: none; 3103 } 3104 .ly-recommendation.ly-is-open { 3105 display: inline-block; 3106 } 3107 .ly-recommendation form { 3108 display: inline-block; 3109 } 3110 .ly-recommendation .ly-arrow, 3111 .ly-arrow.recommendation { 3112 display: none; 3113 } 3114 .ly-recommendation .ly-arrow.recommendation { 3115 display: inline-block; 3116 } 3117 .ly-recommendation .ly-switcher-wrapper { 3118 font-size: 1em !important; 3119 } 3120 .ly-recommendation .ly-popup-modal .ly-popup-switcher .ly-popup-modal .ly-popup-modal-backdrop { 3121 display: none; 3122 } 3123 .ly-recommendation-form button[type="submit"] { 3124 cursor: pointer; 3125 } 3126 3127 /* Recommendation Banner */ 3128 .ly-recommendation .ly-banner { 3129 position: fixed; 3130 z-index: 100000; 3131 width: 100%; 3132 } 3133 .ly-recommendation .ly-banner .ly-banner-content { 3134 width: 100%; 3135 padding: 1em 30px 1em 1em; 3136 box-shadow: 0 0 20px rgba(0,0,0,.25); 3137 } 3138 .ly-recommendation .ly-banner.top { 3139 top: 0; 3140 } 3141 .ly-recommendation .ly-banner.bottom { 3142 bottom: 0; 3143 } 3144 .ly-recommendation .ly-banner .ly-banner-content .ly-switcher-wrapper { 3145 position: relative !important; 3146 margin: 0 !important; 3147 display: inline-block !important; 3148 } 3149 .ly-recommendation .ly-banner .ly-recommendation-form button[type="submit"] { 3150 margin-left: 10px; 3151 } 3152 3153 3154 /* Recommendation Popup */ 3155 .ly-recommendation .ly-popup-modal { 3156 position: fixed; 3157 z-index: 10000; 3158 } 3159 .ly-recommendation .ly-popup-modal .ly-switcher-wrapper { 3160 position: relative !important; 3161 margin: 0 !important; 3162 display: inline-block !important; 3163 } 3164 .ly-recommendation .ly-popup-modal-backdrop { 3165 position: fixed; 3166 width: 100%; 3167 height: 100%; 3168 z-index: 1000; 3169 top: 0; 3170 left: 0; 3171 background:rgba(0, 0, 0, 0.38); 3172 } 3173 .ly-recommendation .ly-popup-modal .ly-popup-modal-content { 3174 padding: 1em 30px 1em 1em; 3175 } 3176 .ly-recommendation .ly-popup-modal .ly-popup-modal-content .ly-languages-switcher { 3177 position: relative !important; 3178 margin: 0 !important; 3179 } 3180 .ly-recommendation .ly-popup-modal .ly-popup-modal-content h3 { 3181 margin: 0 2em 1em 0; 3182 font-size: inherit; 3183 position: relative; 3184 } 3185 .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;} 3186 .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;} 3187 .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; } 3188 .ly-recommendation .ly-popup-modal.center_center { top: 50%; left: 50%; transform: translateX(-50%) translateY(-50%); margin: 0 !important; padding: 0 !important; } 3189 .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; } 3190 .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; } 3191 .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; } 3192 3193 3194 3195 3196 3197 3198</style><!-- langify-v2-scripts-end --> 3199<!--Gorgias Chat Widget Start-->
3200<script id="gorgias-chat-widget-install-v3" 3201 src="https://config.gorgias.chat/bundle-loader/01GYCCDPHT8BRGTAXTWQN47ASW?source=shopify1click"> 3202</script>
vendor: 1 bytes, line 3202
3202
3203<script id="gorgias-chat-shopify-install">!function(_){_.SHOPIFY_PERMANENT_DOMAIN="alinker-ca.myshopify.com",_.SHOPIFY_CUSTOMER_ID="",_.SHOPIFY_CUSTOMER_EMAIL=""}(window||{}); 3204</script>
3204 3205<!--Gorgias Chat Widget End--> 3206<div id="shopify-block-AeHhSMHRscDBnTDlvW__15885745614559378752" class="shopify-block shopify-app-block"><div id="accessibly-config" style="display:none"> 3207 {"themeColor":"#ffc000","iconColor":"#ffc000","showLogo":true,"topBottomPosition":30,"rightLeftPosition":10,"iconSize":"extra-small","iconCustomSize":64,"position":"bottom-right"} 3208</div> 3209 3210 3211</div>
3211<script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
3211 3212</body> 3213</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.