1<!doctype html> 2 <html class="no-js" lang="en"> 3 <head> 4
5<script type="text/javascript">var flspdx = new Worker("data:text/javascript;base64," + btoa('onmessage=function(e){var t=new Request("https://app.flash-speed.com/static/worker-min.js?shop=www-hollandandbarrett-es.myshopify.com",{redirect:"follow"});fetch(t).then(e=>e.text()).then(e=>{postMessage(e)})};'));flspdx.onmessage = function (t) {var e = document.createElement("script");e.type = "text/javascript", e.textContent = t.data, document.head.appendChild(e)}, flspdx.postMessage("init");</script>
5 6
6<script type="text/javascript" data-flspd="1">var flspdxHA=["hotjar","xklaviyo","recaptcha","gorgias","facebook.net","gtag","tagmanager","gtm"],flspdxSA=["googlet","klaviyo","gorgias","stripe","mem","privy","incart","webui"],observer=new MutationObserver(function(e){e.forEach(function(e){e.addedNodes.forEach(function(e){if("SCRIPT"===e.tagName&&1===e.nodeType)if(e.innerHTML.includes("asyncLoad")||"analytics"===e.className)e.type="text/flspdscript";else{for(var t=0;t<flspdxSA.length;t++)if(e.src.includes(flspdxSA[t]))return void(e.type="text/flspdscript");for(var r=0;r<flspdxHA.length;r++)if(e.innerHTML.includes(flspdxHA[r]))return void(e.type="text/flspdscript")}})})}),ua=navigator.userAgent.toLowerCase();ua.match(new RegExp("chrome|firefox"))&&-1===window.location.href.indexOf("no-optimization")&&observer.observe(document.documentElement,{childList:!0,subtree:!0});</script>
6<meta name="facebook-domain-verification" content="cv0ehsy3o898t1swq89fr3ythrvt78" /> 7<!-- Start cookieyes banner -->
7<script id="cookieyes" type="text/javascript" src="https://cdn-cookieyes.com/common/shopify.js"></script>
7
7<script id="cookieyes" type="text/javascript" src="https://cdn-cookieyes.com/client_data/a1e62c144a04b71ccbba0f44/script.js"></script>
7 <!-- End cookieyes banner --> 8 <!-- Google Tag Manager -->
9<script>
vendor: 327 bytes, lines 9-13
9(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 10new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 11j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 12'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 13})(window,document,'script','dataLayer','
13GTM-MZDPQJ9G
vendor: 3 bytes, line 13
13');
13</script>
13 14<!-- End Google Tag Manager --> 15<img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5OTk5OXB4IiBoZWlnaHQ9Ijk5OTk5cHgiIHZpZXdCb3g9IjAgMCAxIDEiPjxyZWN0IGZpbGw9Im5vbmUiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiLz48L3N2Zz4=" alt="Placeholder" style="position:absolute;top:0;left:0;width:96vw;height:96vh;max-width:99vw;max-height:99vh;pointer-events:none;"/>
15<script src="https://app.flash-speed.com/static/increase-pagespeed-min.js?shop=www-hollandandbarrett-es.myshopify.com"></script>
15<script>GSXMLHttpRequest = XMLHttpRequest;</script>
15 16 17<!-- Google tag (gtag.js) -->
vendor: 68 bytes, lines 17-18
17 18 <script async src="https://www.googletagmanager.com/gtag/js?id=
18UA-72519802-3
vendor: 16 bytes, lines 18-19
18"></script> 19
19<script> 20
vendor: 139 bytes, lines 20-23
20window.dataLayer = window.dataLayer || []; 21 function gtag(){dataLayer.push(arguments);} 22 gtag('js', new Date()); 23 gtag('config', '
23UA-72519802-3
vendor: 8 bytes, lines 23-24
23'); 24
24</script>
24 25 <!-- Google tag (gtag.js) -->
vendor: 64 bytes, line 25
25 <script async src="https://www.googletagmanager.com/gtag/js?id=
25AW-933778308
vendor: 17 bytes, lines 25-26
25"></script> 26
26<script> Â Â window.dataLayer = window.dataLayer || []; Â Â function gtag(){dataLayer.push(arguments);} Â Â gtag('js', new Date()); Â Â gtag('config', 'AW-933778308'); </script>
26 27 <meta charset="utf-8"> 28 <meta name="google-site-verification" content="google2f511d7121d8507b"> 29 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=no"> 30 <meta name="theme-color" content="#333333"> 31 <meta name="format-detection" content="telephone=no"> 32 <link rel="canonical" href="https://hollandandbarrett.gi/pages/stores"> 33 <link rel="prefetch" as="document" href="https://hollandandbarrett.gi"> 34 <link rel="dns-prefetch" href="https://cdn.shopify.com" crossorigin> 35 <link rel="preconnect" href="https://cdn.shopify.com" crossorigin> 36 <link rel="preconnect" href="https://monorail-edge.shopifysvc.com"> 37<link rel="dns-prefetch" href="https://fonts.shopifycdn.com" crossorigin> 38 <link rel="preconnect" href="https://fonts.shopify.com" crossorigin> 39 <link rel="preload" as="font" href="//hollandandbarrett.gi/cdn/fonts/figtree/figtree_n4.3c0838aba1701047e60be6a99a1b0a40ce9b8419.woff2" type="font/woff2" crossorigin> 40 <link rel="preload" as="font" href="//hollandandbarrett.gi/cdn/fonts/figtree/figtree_n4.3c0838aba1701047e60be6a99a1b0a40ce9b8419.woff2" type="font/woff2" crossorigin> 41 <link rel="preload" as="font" href="//hollandandbarrett.gi/cdn/fonts/figtree/figtree_n7.2fd9bfe01586148e644724096c9d75e8c7a90e55.woff2" type="font/woff2" crossorigin><link rel="preload" as="style" href="//hollandandbarrett.gi/cdn/shop/t/2/assets/pre_theme.min.css?v=80256525801086942991695578146"> 42 <link rel="preload" as="style" href="//hollandandbarrett.gi/cdn/shop/t/2/assets/theme.css?enable_css_minification=1&v=43232261832677497931762161314"> 43 <meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /> 44
45<script type="text/javascript">new Image().src='https://dspanalytics.purple.gi/tracking/segment?key=ktaninr'</script>
45 46 47 48 49 50 51<title> 52 Find Our Stores - Holland & Barrett Gibraltar</title> 53 54 55 56 57<meta name="description" content="Discover the Holland &amp; Barrett store locations in Gibraltar. Visit us for health and wellness products on Main Street." /> 58<link rel="shortcut icon" type="image/png" href="//hollandandbarrett.gi/cdn/shop/files/favicon-32x32_32x_ac21fad6-151e-4b25-ac4d-8f838ea22054_32x.png?v=1707396810"><link rel="apple-touch-icon-precomposed" type="image/png" sizes="152x152" href="//hollandandbarrett.gi/cdn/shop/files/favicon-32x32_32x_ac21fad6-151e-4b25-ac4d-8f838ea22054_152x.png?v=1707396810"><!-- social-meta-tags.liquid --><!-- <meta name="keywords" content="Find Our Stores - Holland & Barrett Gibraltar,Holland & Barrett Gibraltar,hollandandbarrett.gi"/> --><meta name="author" content="The4"><meta property="og:site_name" content="Holland & Barrett Gibraltar"> 59<meta property="og:url" content="https://hollandandbarrett.gi/pages/stores"> 60<meta property="og:title" content="Find Our Stores - Holland & Barrett Gibraltar"> 61<meta property="og:type" content="website"> 62<meta property="og:description" content="Discover the Holland & Barrett store locations in Gibraltar. Visit us for health and wellness products on Main Street."><meta property="og:image" content="http://hollandandbarrett.gi/cdn/shop/files/Holland_Barrett_primary_logo_reversed_rgb_1200x1200.png?v=1695721783"><meta property="og:image:secure_url" content="https://hollandandbarrett.gi/cdn/shop/files/Holland_Barrett_primary_logo_reversed_rgb_1200x1200.png?v=1695721783"><meta name="twitter:card" content="summary_large_image"> 63<meta name="twitter:title" content="Find Our Stores - Holland & Barrett Gibraltar"> 64<meta name="twitter:description" content="Discover the Holland & Barrett store locations in Gibraltar. Visit us for health and wellness products on Main Street."> 65<link href="//hollandandbarrett.gi/cdn/shop/t/2/assets/custom.css?v=67064919513307481311739276996" rel="stylesheet" type="text/css" media="all" /><link href="//hollandandbarrett.gi/cdn/shop/t/2/assets/pre_theme.min.css?v=80256525801086942991695578146" rel="stylesheet" type="text/css" media="all" /><link rel="preload" as="script" href="//hollandandbarrett.gi/cdn/shop/t/2/assets/lazysizes.min.js?v=69261028471810094311695578145"> 66<link rel="preload" as="script" href="//hollandandbarrett.gi/cdn/shop/t/2/assets/nt_vendor.min.js?v=63039283586479772611695578146">
67<script>document.documentElement.className = document.documentElement.className.replace('no-js', 'yes-js');const t_name = "page",designMode = false, t_cartCount = 0,ThemeNameT4='gecko',ThemeNameT42='ThemeIdT4Gecko',themeIDt4 = 160560808212,ck_hostname = 'gecko5-none',ThemeIdT4 = null,SopEmlT4="[email protected]",ThemePuT4 = '#purchase_codet4',t_shop_currency = "GBP", t_moneyFormat = "£{{amount}}", t_cart_url = "\/cart",t_cartadd_url = "\/cart\/add",t_cartchange_url = "\/cart\/change", pr_re_url = "\/recommendations\/products"; try {var T4AgentNT = (navigator.userAgent.indexOf('Chrome-Lighthouse') == -1)}catch(err){var T4AgentNT = true} function onloadt4relcss(_this) {_this.onload=null;if(T4AgentNT){_this.rel='stylesheet'}} (function () {window.onpageshow = function() {if (performance.navigation.type === 2) {document.dispatchEvent(new CustomEvent('cart:refresh'))} }; })(); 68var T4stt_str = { 69 "PleaseChoosePrOptions":"Please select some product options before adding this product to your cart.", 70 "will_not_ship":"Will not ship until \u003cspan class=\"jsnt\"\u003e{{date}}\u003c\/span\u003e", 71 "will_stock_after":"Will be in stock after \u003cspan class=\"jsnt\"\u003e{{date}}\u003c\/span\u003e", 72 "replace_item_atc":"Replace item", 73 "replace_item_pre":"Replace item", 74 "added_to_cart": "Product was successfully added to your cart.", 75 "view_cart": "View cart", 76 "continue_shopping": "Continue Shopping", 77 "save_js":"-[sale]%","bannerCountdown":"%D days %H:%M:%S", 78 "prItemCountdown":"%D Days %H:%M:%S", 79 "countdown_days":"days", 80 "countdown_hours":"hr", 81 "countdown_mins":"min", 82 "countdown_sec":"sc", 83 "multiple_rates": "We found [number_of_rates] shipping rates available for [address], starting at [rate].", 84 "one_rate": "We found one shipping rate available for [address].", 85 "no_rates": "Sorry, we do not ship to this destination.", 86 "rate_value": "[rate_title] at [rate]", 87 "agree_checkout": "You must agree with the terms and conditions of sales to check out.", 88 "added_text_cp":"Compare products" 89}; 90</script>
90 91<link rel="preload" href="//hollandandbarrett.gi/cdn/shop/t/2/assets/style.min.css?v=131238158327136454181695578147" as="style" onload="onloadt4relcss(this)"><link href="//hollandandbarrett.gi/cdn/shop/t/2/assets/theme.css?enable_css_minification=1&v=43232261832677497931762161314" rel="stylesheet" type="text/css" media="all" /><link id="sett_clt4" rel="preload" href="//hollandandbarrett.gi/cdn/shop/t/2/assets/sett_cl.css?enable_css_minification=1&v=5740298550388578391695578146" as="style" onload="onloadt4relcss(this)"><link rel="preload" href="//hollandandbarrett.gi/cdn/shop/t/2/assets/line-awesome.min.css?v=36930450349382045261695578145" as="style" onload="onloadt4relcss(this)">
92<script id="js_lzt4" src="//hollandandbarrett.gi/cdn/shop/t/2/assets/lazysizes.min.js?v=69261028471810094311695578145" defer="defer"></script>
vendor: 1 bytes, line 92
92
93<script src="//hollandandbarrett.gi/cdn/shop/t/2/assets/nt_vendor.min.js?v=63039283586479772611695578146" defer="defer" id="js_ntt4" 94 data-theme='//hollandandbarrett.gi/cdn/shop/t/2/assets/nt_theme.min.js?v=130170106942778988201695578146' 95 data-stt='//hollandandbarrett.gi/cdn/shop/t/2/assets/nt_settings.js?enable_js_minification=1&v=165691743385357415631695578201' 96 data-cat='//hollandandbarrett.gi/cdn/shop/t/2/assets/cat.min.js?v=140310734739805055321695578144' 97 data-sw='//hollandandbarrett.gi/cdn/shop/t/2/assets/swatch.min.js?v=94011124126883124911695578147' 98 data-prjs='//hollandandbarrett.gi/cdn/shop/t/2/assets/produc.min.js?v=66856717831304081821695578146' 99 data-mail='//hollandandbarrett.gi/cdn/shop/t/2/assets/platform_mail.min.js?v=129658531127528416401695578146' 100 data-my='//hollandandbarrett.gi/cdn/shop/t/2/assets/my.js?v=22787187126472772601695578145' data-cusp='//hollandandbarrett.gi/cdn/shop/t/2/assets/my.js?v=22787187126472772601695578145' data-cur='//hollandandbarrett.gi/cdn/shop/t/2/assets/my.js?v=22787187126472772601695578145' data-mdl='//hollandandbarrett.gi/cdn/shop/t/2/assets/module.min.js?v=72712877271928395091695578145' 101 data-map='//hollandandbarrett.gi/cdn/shop/t/2/assets/maplace.min.js?v=553' 102 data-time='//hollandandbarrett.gi/cdn/shop/t/2/assets/spacetime.min.js?v=553' 103 data-ins='//hollandandbarrett.gi/cdn/shop/t/2/assets/nt_instagram.min.js?v=67982783334426809631695578145' 104 data-user='//hollandandbarrett.gi/cdn/shop/t/2/assets/interactable.min.js?v=178425067897821673531695578145' 105 data-add='//s7.addthis.com/js/300/addthis_widget.js#pubid=ra-56efaa05a768bd19' 106 data-klaviyo='//www.klaviyo.com/media/js/public/klaviyo_subscribe.js' 107 data-font='iconKalles , fakalles , Pe-icon-7-stroke , Font Awesome 5 Free:n9' 108 data-fm='' 109 data-spcmn='//hollandandbarrett.gi/cdn/shopifycloud/storefront/assets/themes_support/shopify_common-5f594365.js' 110 data-cust='//hollandandbarrett.gi/cdn/shop/t/2/assets/customerclnt.min.js?v=156813264816487175981695578144' 111 data-cusjs='//hollandandbarrett.gi/cdn/shop/t/2/assets/custom.js?enable_js_minification=1&v=146943742970899892581739276864' 112 data-desadm='//hollandandbarrett.gi/cdn/shop/t/2/assets/des_adm.min.js?v=67809252796298253121695578144' 113 data-otherryv='//hollandandbarrett.gi/cdn/shop/t/2/assets/reviewOther.js?enable_js_minification=1&v=157077235154481297451695578146'></script>
113 114
115<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script>
115<meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/83272630548/digital_wallets/dialog"> 116<meta id="in-context-paypal-metadata" data-shop-id="83272630548" data-venmo-supported="false" data-environment="production" data-locale="en_US" data-paypal-v4="true" data-currency="GBP"> 117<link rel="ucp" href="/.well-known/ucp" version="2026-08-25">
117<script async="async" src="/checkouts/internal/preloads.js?locale=en-GI"></script>
vendor: 1 bytes, line 117
117
118<script id="shopify-features" type="application/json">{"accessToken":"775c28f1ddb02396c18ca9a1d4305408","betas":["rich-media-storefront-analytics"],"domain":"hollandandbarrett.gi","predictiveSearch":true,"shopId":83272630548,"locale":"en"}</script>
vendor: 1 bytes, line 118
118
119<script>var Shopify = Shopify || {}; 120Shopify.shop = "ea56de-4.myshopify.com"; 121Shopify.locale = "en"; 122Shopify.currency = {"active":"GBP","rate":"1.0"}; 123Shopify.country = "GI"; 124Shopify.theme = {"name":"Theme export www-hollandandbarrett-es-product-...","id":160560808212,"schema_name":"Gecko","schema_version":"5.8","theme_store_id":null,"role":"main"}; 125Shopify.theme.handle = "null"; 126Shopify.theme.style = {"id":null,"handle":null}; 127Shopify.cdnHost = "hollandandbarrett.gi/cdn"; 128Shopify.routes = Shopify.routes || {}; 129Shopify.routes.root = "/"; 130Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js"; 131Shopify.SignInWithShop = Shopify.SignInWithShop || {}; 132Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {}; 133Shopify.SignInWithShop.User.recognized = false;</script>
vendor: 1 bytes, line 133
133
134<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
vendor: 1 bytes, line 134
134
135<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 135
135
136<script> 137 window.Shopify = window.Shopify || {}; 138 window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {}; 139 window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.25 }; 140 window.Shopify.SignInWithShop.eligible = true; 141</script>
vendor: 1 bytes, line 141
141
142<script id="shop-js-analytics" type="application/json">{"pageType":"page"}</script>
vendor: 1 bytes, line 142
142
143<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 143
143
144<script type="module"> 145 await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"); 146 147 window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true}); 148 149</script>
vendor: 1 bytes, line 149
149
150<script> 151 window.Shopify = window.Shopify || {}; 152 if (!window.Shopify.featureAssets) window.Shopify.featureAssets = {}; 153 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"]}; 154</script>
vendor: 1 bytes, line 154
154
155<script>(function() { 156 var isLoaded = false; 157 function asyncLoad() { 158 if (isLoaded) return; 159 isLoaded = true; 160 var urls = ["https:\/\/assets1.adroll.com\/shopify\/latest\/j\/shopify_rolling_bootstrap_v2.js?adroll_adv_id=QACKFAA6SVDLXFG3CPXZ55\u0026adroll_pix_id=WK6XCHGHDZDRPPDJFVMI7W\u0026shop=ea56de-4.myshopify.com"]; 161 for (var i = 0; i < urls.length; i++) { 162 var s = document.createElement('script'); 163 s.type = 'text/javascript'; 164 s.async = true; 165 s.src = urls[i]; 166 var x = document.getElementsByTagName('script')[0]; 167 x.parentNode.insertBefore(s, x); 168 } 169 }; 170 if(window.attachEvent) { 171 window.attachEvent('onload', asyncLoad); 172 } else { 173 window.addEventListener('load', asyncLoad, false); 174 } 175})();</script>
vendor: 1 bytes, line 175
175
176<script id="__st">var __st={"a":83272630548,"offset":7200,"reqid":"a1cbe20b-1793-41a5-a76c-142f1ad373f9-1791320813","pageurl":"hollandandbarrett.gi\/pages\/stores","s":"pages-128288653588","u":"4e5c3686e842","p":"page","rtyp":"page","rid":128288653588};</script>
vendor: 1 bytes, line 176
176
177<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
vendor: 1 bytes, line 177
177
178<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 178
178
179<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" defer="defer" src="//hollandandbarrett.gi/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
vendor: 1 bytes, line 179
179
180<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 = "//hollandandbarrett.gi/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>
180<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 180
180
181<script> 182 window.Shopify = window.Shopify || {}; 183 window.Shopify.MCP = window.Shopify.MCP || {}; 184 window.Shopify.MCP.enabled = true; 185 window.Shopify.MCP.shop = "ea56de-4.myshopify.com"; 186 window.Shopify.MCP.mcpEndpoint = "https:\/\/hollandandbarrett.gi\/api\/mcp"; 187 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?\"\nSet policy_types to also get the store's written policies (full text and URL).\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."},"policy_types":{"type":"array","items":{"type":"string","enum":["refund","shipping","privacy","terms_of_service","terms_of_sale","subscription","legal_notice","contact"]},"description":"Policy kinds to fetch, chosen from the user's question â e.g. [\"refund\"] for returns\/exchanges\/damaged items, [\"contact\"] for phone\/hours\/address. Include every kind the question touches. Omit it to get only FAQ answers."}},"required":["query"]}}]; 188</script>
vendor: 1 bytes, line 188
188
189<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("\/\/hollandandbarrett.gi\/cdn\/shopifycloud\/storefront\/assets\/storefront\/webmcp-c6b62ece.js","sha256-ke4DDuBjdvea3vxLWxHc9E9nq8zihuG4IfYEGbb77ys=");})(); 190</script>
vendor: 1 bytes, line 190
190
191<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://hollandandbarrett.gi/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}}; 192</script>
vendor: 1 bytes, line 192
192
193<script data-source-attribution="shopify.dynamic_checkout.buyer_consent"> 194 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); 195</script>
vendor: 1 bytes, line 195
195
196<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})}})); 197</script>
197 198<link id="shopify-accelerated-checkout-styles" rel="stylesheet" media="screen" href="https://hollandandbarrett.gi/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css" crossorigin="anonymous"> 199<style id="shopify-accelerated-checkout-cart"> 200 #shopify-buyer-consent { 201 margin-top: 1em; 202 display: inline-block; 203 width: 100%; 204} 205 206#shopify-buyer-consent.hidden { 207 display: none; 208} 209 210#shopify-subscription-policy-button { 211 background: none; 212 border: none; 213 padding: 0; 214 text-decoration: underline; 215 font-size: inherit; 216 cursor: pointer; 217} 218 219#shopify-subscription-policy-button::before { 220 box-shadow: none; 221} 222 223 </style> 224
225<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
225 226<!-- "snippets/weglot_hreftags.liquid" was not rendered, the associated app was uninstalled --> 227<!-- "snippets/weglot_switcher.liquid" was not rendered, the associated app was uninstalled --> 228<link rel="stylesheet" href="https://unpkg.com/flickity@2/dist/flickity.min.css">
229<script src="https://unpkg.com/flickity@2/dist/flickity.pkgd.min.js"></script>
229 230 <!--begin-boost-pfs-filter-css--> 231 <link rel="preload stylesheet" href="//hollandandbarrett.gi/cdn/shop/t/2/assets/boost-pfs-instant-search.css?v=161579411334328555211695578200" as="style"><link href="//hollandandbarrett.gi/cdn/shop/t/2/assets/boost-pfs-custom.css?v=42460964977739456821695578200" rel="stylesheet" type="text/css" media="all" /> 232 233 234 <!--end-boost-pfs-filter-css--> 235<!-- Meta Pixel Code -->
236<script>
vendor: 399 bytes, lines 236-245
236 237!function(f,b,e,v,n,t,s) 238{if(f.fbq)return;n=f.fbq=function(){n.callMethod? 239n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 240if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 241n.queue=[];t=b.createElement(e);t.async=!0; 242t.src=v;s=b.getElementsByTagName(e)[0]; 243s.parentNode.insertBefore(t,s)}(window, document,'script', 244'https://connect.facebook.net/en_US/fbevents.js'); 245fbq('init', '
245375233339663771
vendor: 30 bytes, lines 245-246
245'); 246fbq('track', 'PageView');
247</script>
247 248<noscript><img height="1" width="1" style="display:none" 249src="https://www.facebook.com/tr?id=375233339663771&ev=PageView&noscript=1" 250/></noscript> 251<!-- End Meta Pixel Code --><link rel="alternate" hreflang="es" href="https://hollandandbarrett.gi/pages/stores">
252<script type="text/javascript" src="https://cdn.weglot.com/weglot.min.js"></script>
vendor: 1 bytes, line 252
252
253<script> 254 Weglot.initialize({ 255 api_key: 'wg_f74a863e2a595d60c6d33c3c999c5f318' 256 }); 257</script>
257 258 259
260<script type="text/javascript"> 261 adroll_adv_id = "QACKFAA6SVDLXFG3CPXZ55"; 262 adroll_pix_id = "WK6XCHGHDZDRPPDJFVMI7W"; 263 adroll_version = "2.0"; 264 265 (function(w, d, e, o, a) { 266 w.__adroll_loaded = true; 267 w.adroll = w.adroll || []; 268 w.adroll.f = [ 'setProperties', 'identify', 'track', 'identify_email' ]; 269 var roundtripUrl = "https://s.adroll.com/j/" + adroll_adv_id 270 + "/roundtrip.js"; 271 for (a = 0; a < w.adroll.f.length; a++) { 272 w.adroll[w.adroll.f[a]] = w.adroll[w.adroll.f[a]] || (function(n) { 273 return function() { 274 w.adroll.push([ n, arguments ]) 275 } 276 })(w.adroll.f[a]) 277 } 278 279 e = d.createElement('script'); 280 o = d.getElementsByTagName('script')[0]; 281 e.async = 1; 282 e.src = roundtripUrl; 283 o.parentNode.insertBefore(e, o); 284 })(window, document); 285 adroll.track("pageView"); 286</script>
286 287 <!-- BEGIN app block: shopify://apps/ecomposer-builder/blocks/app-embed/a0fc26e1-7741-4773-8b27-39389b4fb4a0 --><!-- DNS Prefetch & Preconnect --> 288<link rel="preconnect" href="https://cdn.ecomposer.app" crossorigin> 289<link rel="dns-prefetch" href="https://cdn.ecomposer.app"> 290 291<link rel="prefetch" href="https://cdn.ecomposer.app/vendors/css/[email protected]" as="style"> 292<link rel="prefetch" href="https://cdn.ecomposer.app/vendors/js/[email protected]" as="script"> 293<link rel="prefetch" href="https://cdn.ecomposer.app/vendors/js/ecom_modal.js" as="script"> 294 295<!-- Global CSS --><!--ECOM-EMBED--> 296 <style id="ecom-global-css" class="ecom-global-css">/**ECOM-INSERT-CSS**/.ecom-section > div.core__row--columns{max-width: 1200px;}.ecom-column>div.core__column--wrapper{padding: 20px;}div.core__blocks--body>div.ecom-block.elmspace:not(:first-child){margin-top: 20px;}:root{--ecom-global-colors-primary:#ffffff;--ecom-global-colors-secondary:#ffffff;--ecom-global-colors-text:#ffffff;--ecom-global-colors-accent:#ffffff;--ecom-global-typography-h1-font-weight:600;--ecom-global-typography-h1-font-size:72px;--ecom-global-typography-h1-line-height:90px;--ecom-global-typography-h1-letter-spacing:-0.02em;--ecom-global-typography-h2-font-weight:600;--ecom-global-typography-h2-font-size:60px;--ecom-global-typography-h2-line-height:72px;--ecom-global-typography-h2-letter-spacing:-0.02em;--ecom-global-typography-h3-font-weight:600;--ecom-global-typography-h3-font-size:48px;--ecom-global-typography-h3-line-height:60px;--ecom-global-typography-h3-letter-spacing:-0.02em;--ecom-global-typography-h4-font-weight:600;--ecom-global-typography-h4-font-size:36px;--ecom-global-typography-h4-line-height:44px;--ecom-global-typography-h4-letter-spacing:-0.02em;--ecom-global-typography-h5-font-weight:600;--ecom-global-typography-h5-font-size:30px;--ecom-global-typography-h5-line-height:38px;--ecom-global-typography-h6-font-weight:600;--ecom-global-typography-h6-font-size:24px;--ecom-global-typography-h6-line-height:32px;--ecom-global-typography-h7-font-weight:400;--ecom-global-typography-h7-font-size:18px;--ecom-global-typography-h7-line-height:28px;}</style> 297 <!--/ECOM-EMBED--><!-- Custom CSS & JS --><!-- Open Graph Meta Tags for Pages --><!-- AI Search Optimization (LLM Outreach) --><!-- Critical Inline Styles --> 298<style class="ecom-theme-helper">.ecom-animation{opacity:0}.ecom-animation.animate,.ecom-animation.ecom-animated{opacity:1}.ecom-cart-popup{display:grid;position:fixed;inset:0;z-index:9999999;align-content:center;padding:5px;justify-content:center;align-items:center;justify-items:center}.ecom-cart-popup::before{content:' ';position:absolute;background:#e5e5e5b3;inset:0}.ecom-ajax-loading{cursor:not-allowed;pointer-events:none;opacity:.6}#ecom-toast{visibility:hidden;max-width:50px;height:60px;margin:auto;background-color:#333;color:#fff;text-align:center;border-radius:2px;position:fixed;z-index:1;left:0;right:0;bottom:30px;font-size:17px;display:grid;grid-template-columns:50px auto;align-items:center;justify-content:start;align-content:center;justify-items:start}#ecom-toast.ecom-toast-show{visibility:visible;animation:ecomFadein .5s,ecomExpand .5s .5s,ecomStay 3s 1s,ecomShrink .5s 4s,ecomFadeout .5s 4.5s}#ecom-toast #ecom-toast-icon{width:50px;height:100%;box-sizing:border-box;background-color:#111;color:#fff;padding:5px}#ecom-toast .ecom-toast-icon-svg{width:100%;height:100%;position:relative;vertical-align:middle;margin:auto;text-align:center}#ecom-toast #ecom-toast-desc{color:#fff;padding:16px;overflow:hidden;white-space:nowrap}@media(max-width:768px){#ecom-toast #ecom-toast-desc{white-space:normal;min-width:250px}#ecom-toast{height:auto;min-height:60px}}.ecom__column-full-height{height:100%}[data-ec-sr]>.core__row--columns>.ecom-column:not(.ecom-sr-visible):not(.ecom-sr-done),[data-ec-sr].ec-flex-wp>.ecom-inner>.ecom-block:not(.ecom-sr-visible):not(.ecom-sr-done),[data-ec-sr].ec-flex-wp>.ecom-inner>.ec-flex-wp.core__block:not(.ecom-sr-visible):not(.ecom-sr-done),[data-ec-sr].ec-flex-wp>.ecom-block:not(.ecom-sr-visible):not(.ecom-sr-done),[data-ec-sr].ec-flex-wp>.ec-flex-wp.core__block:not(.ecom-sr-visible):not(.ecom-sr-done),[data-ec-sr]>.ecom-grid-layout>.ecom-grid-item:not(.ecom-sr-visible):not(.ecom-sr-done),[data-ec-sr-items] [data-ec-sr-item]:not(.ecom-sr-visible):not(.ecom-sr-done){opacity:0}
298.ecom-sr-done{opacity:1}@keyframes ecom-sr-fade-up{from{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}@keyframes ecom-sr-fade-in{from{opacity:0}to{opacity:1}}@keyframes ecom-sr-slide-left{from{opacity:0;transform:translateX(40px)}to{opacity:1;transform:translateX(0)}}@keyframes ecom-sr-zoom-in{from{opacity:0;transform:scale(.85)}to{opacity:1;transform:scale(1)}}.ecom-sr-visible{animation-fill-mode:both!important;animation-duration:.6s!important;animation-timing-function:cubic-bezier(.25,.46,.45,.94)!important}.ecom-sr-visible[data-sr-anim="fade-up"]{animation-name:ecom-sr-fade-up!important}.ecom-sr-visible[data-sr-anim="fade-in"]{animation-name:ecom-sr-fade-in!important}.ecom-sr-visible[data-sr-anim="slide-left"]{animation-name:ecom-sr-slide-left!important}.ecom-sr-visible[data-sr-anim="zoom-in"]{animation-name:ecom-sr-zoom-in!important}@keyframes ecomFadein{from{bottom:0;opacity:0}to{bottom:30px;opacity:1}}@keyframes ecomExpand{from{min-width:50px}to{min-width:var(--ecom-max-width)}}@keyframes ecomStay{from{min-width:var(--ecom-max-width)}to{min-width:var(--ecom-max-width)}}@keyframes ecomShrink{from{min-width:var(--ecom-max-width)}to{min-width:50px}}@keyframes ecomFadeout{from{bottom:30px;opacity:1}to{bottom:60px;opacity:0}}</style> 299 300 301<!-- EComposer Config Script -->
302<script id="ecom-theme-helpers" async> 303window.EComposer=window.EComposer||{};(function(){if(!this.configs)this.configs={};this.configs.ajax_cart={enable:false};this.customer=false;this.initQuickview=function(){}; 304this.proxy_path='/apps/ecomposer-visual-page-builder';this.popupScriptUrl='';this.routes={domain:'https://hollandandbarrett.gi',root_url:'/',collections_url:'/collections',all_products_collection_url:'/collections/all',cart_url:'/cart',cart_add_url:'/cart/add',cart_change_url:'/cart/change',cart_clear_url:'/cart/clear',cart_update_url:'/cart/update',product_recommendations_url:'/recommendations/products'}; 305this.queryParams={}; 306if(window.location.search.length){new URLSearchParams(window.location.search).forEach((value,key)=>{this.queryParams[key]=value})} 307this.money_format="£{{amount}}"; 308this.money_with_currency_format="£{{amount}} GBP"; 309this.currencyCodeEnabled=null;this.abTestingData = [];this.formatMoney=function(t,e){const r=this.currencyCodeEnabled?this.money_with_currency_format:this.money_format;function a(t,e){return void 0===t?e:t}function o(t,e,r,o){if(e=a(e,2),r=a(r,","),o=a(o,"."),isNaN(t)||null==t)return 0;var n=(t=(t/100).toFixed(e)).split(".");return n[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g,"$1"+r)+(n[1]?o+n[1]:"")}"string"==typeof t&&(t=t.replace(".",""));var n="",i=/\{\{\s*(\w+)\s*\}\}/,s=e||r;switch(s.match(i)[1]){case"amount":n=o(t,2);break;case"amount_no_decimals":n=o(t,0);break;case"amount_with_comma_separator":n=o(t,2,".",",");break;case"amount_with_space_separator":n=o(t,2," ",",");break;case"amount_with_period_and_space_separator":n=o(t,2," ",".");break;case"amount_no_decimals_with_comma_separator":n=o(t,0,".",",");break;case"amount_no_decimals_with_space_separator":n=o(t,0," ");break;case"amount_with_apostrophe_separator":n=o(t,2,"'",".")}return s.replace(i,n)}; 310this.resizeImage=function(t,e){try{if(!e||"original"==e||"full"==e||"master"==e)return t;if(-1!==t.indexOf("cdn.shopify.com")||-1!==t.indexOf("/cdn/shop/")){var r=t.match(/\.(jpg|jpeg|gif|png|bmp|bitmap|tiff|tif|webp)((\#[0-9a-z\-]+)?(\?v=.*)?)?$/gim);if(null==r)return null;var a=t.split(r[0]),o=r[0];return a[0]+"_"+e+o}}catch(r){return t}return t}; 311this.getProduct=function(t){if(!t)return!1;let e=("/"===this.routes.root_url?"":this.routes.root_url)+"/products/"+t+".js?shop="+Shopify.shop;return window.ECOM_LIVE&&(e="/shop/builder/ajax/ecom-proxy/products/"+t+"?shop="+Shopify.shop),window.fetch(e,{headers:{"Content-Type":"application/json"}}).then(t=>t.ok?t.json():false)}; 312const u=new URLSearchParams(window.location.search);if(u.has("ecom-redirect")){const r=u.get("ecom-redirect");if(r){let d;try{d=decodeURIComponent(r)}catch{return}d=d.trim().replace(/[\r\n\t]/g,"");if(d.length>2e3)return;const p=["javascript:","data:","vbscript:","file:","ftp:","mailto:","tel:","sms:","chrome:","chrome-extension:","moz-extension:","ms-browser-extension:"],l=d.toLowerCase();for(const o of p)if(l.includes(o))return;const x=[/
312<script/i,/<\/script/i,/javascript:/i,/vbscript:/i,/onload=/i,/onerror=/i,/onclick=/i,/onmouseover=/i,/onfocus=/i,/onblur=/i,/onsubmit=/i,/onchange=/i,/alert\s*\(/i,/confirm\s*\(/i,/prompt\s*\(/i,/document\./i,/window\./i,/eval\s*\(/i];for(const t of x)if(t.test(d))return;if(d.startsWith("/")&&!d.startsWith("//")){if(!/^[a-zA-Z0-9\-._~:/?#[\]@!$&'()*+,;=%]+$/.test(d))return;if(d.includes("../")||d.includes("./"))return;window.location.href=d;return}if(!d.includes("://")&&!d.startsWith("//")){if(!/^[a-zA-Z0-9\-._~:/?#[\]@!$&'()*+,;=%]+$/.test(d))return;if(d.includes("../")||d.includes("./"))return;window.location.href="/"+d;return}let n;try{n=new URL(d)}catch{return}if(!["http:","https:"].includes(n.protocol))return;if(n.port&&(parseInt(n.port)<1||parseInt(n.port)>65535))return;const a=[window.location.hostname];if(a.includes(n.hostname)&&(n.href===d||n.toString()===d))window.location.href=d}} 313}).bind(window.EComposer)(); 314if(window.Shopify&&window.Shopify.designMode&&window.top&&window.top.opener){window.addEventListener("load",function(){window.top.opener.postMessage({action:"ecomposer:loaded"},"*")})} 315</script>
315<!-- Toast Template -->
316<script type="text/template" id="ecom-template-html"><!-- BEGIN app snippet: ecom-toast --><div id="ecom-toast"><div id="ecom-toast-icon"><svg xmlns="http://www.w3.org/2000/svg" class="ecom-toast-icon-svg ecom-toast-icon-info" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> 317<svg class="ecom-toast-icon-svg ecom-toast-icon-success" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 48c110.5 0 200 89.5 200 200 0 110.5-89.5 200-200 200-110.5 0-200-89.5-200-200 0-110.5 89.5-200 200-200m140.2 130.3l-22.5-22.7c-4.7-4.7-12.3-4.7-17-.1L215.3 303.7l-59.8-60.3c-4.7-4.7-12.3-4.7-17-.1l-22.7 22.5c-4.7 4.7-4.7 12.3-.1 17l90.8 91.5c4.7 4.7 12.3 4.7 17 .1l172.6-171.2c4.7-4.7 4.7-12.3 .1-17z"/></svg> 318</div><div id="ecom-toast-desc"></div></div><!-- END app snippet --></script>
318<!-- END app block -->
318<script src="https://cdn.shopify.com/extensions/01a10ade-6f02-7073-a075-e9892ad05da0/ecomposer-146/assets/ecom.js" type="text/javascript" defer="defer"></script>
318 319<link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
320<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: 83272630548,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token,page_type: "page"};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 320
320
321<script> 322 window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || []; 323</script>
vendor: 1 bytes, line 323
323
324<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}
324).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: 83272630548,storefrontBaseUrl: "https://hollandandbarrett.gi",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://hollandandbarrett.gi/.well-known/shopify/monorail/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["4c64608a","16072cab","8450a54b"],webPixelsConfigList: [{"id":"231112980","configuration":"{\"advertisableEid\":\"QACKFAA6SVDLXFG3CPXZ55\",\"pixelEid\":\"WK6XCHGHDZDRPPDJFVMI7W\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"ba1ef5286d067b01e04bdc37410b8082","type":"APP","apiClientId":1005866,"privacyPurposes":[],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]}
324,"dataSharingState":"unrestricted"},{"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":"Holland \u0026 Barrett Gibraltar","paymentSettings":{"currencyCode":"GBP"},"myshopifyDomain":"ea56de-4.myshopify.com","countryCode":"GI","storefrontUrl":"https:\/\/hollandandbarrett.gi"},"customer":null,"cart":null,"checkout":null,"productVariants":[],"products":[],"purchasingCompany":null},},"https://hollandandbarrett.gi/cdn","87a86122w399bf3b8pd0403c97m2c07468c",{"modern":"","legacy":""},{"trekkieShim":true,"agentContext":true,"apiClientId":"580111","facebookCapiEnabled":"false","themeId":"160560808212","themePublished":"true","eventMetadataId":"c384ab13-e7ad-4a77-9404-698dac32ea74","pageType":"page","resourceId":"128288653588","shopId":"83272630548","storefrontBaseUrl":"https:\/\/hollandandbarrett.gi","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"4c64608a\", \"16072cab\", \"8450a54b\"]","isMerchantRequest":"false","hashVersion":"87a86122w399bf3b8pd0403c97m2c07468c","publish":"custom","events":"[[\"page_viewed\",{}]]"});})();</script>
324<script> 325 window.ShopifyAnalytics = window.ShopifyAnalytics || {}; 326 window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {}; 327 window.ShopifyAnalytics.meta.currency = 'GBP'; 328 var meta = {"page":{"pageType":"page","resourceType":"page","resourceId":128288653588,"requestId":"a1cbe20b-1793-41a5-a76c-142f1ad373f9-1791320813"}}; 329 for (var attr in meta) { 330 window.ShopifyAnalytics.meta[attr] = meta[attr]; 331 } 332</script>
vendor: 1 bytes, line 332
332
333<script class="analytics"> 334 (function () { 335 var customDocumentWrite = function(content) { 336 var jquery = null; 337 338 if (window.jQuery) { 339 jquery = window.jQuery; 340 } else if (window.Checkout && window.Checkout.$) { 341 jquery = window.Checkout.$; 342 } 343 344 if (jquery) { 345 jquery('body').append(content); 346 } 347 }; 348 349 var hasLoggedConversion = function(token) { 350 if (token) { 351 return document.cookie.indexOf('loggedConversion=' + token) !== -1; 352 } 353 return false; 354 } 355 356 var setCookieIfConversion = function(token) { 357 if (token) { 358 var twoMonthsFromNow = new Date(Date.now()); 359 twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2); 360 361 document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow; 362 } 363 } 364 365 var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || []; 366 window.ShopifyAnalytics.lib.trekkie = window.trekkie; 367 if (trekkie.integrations) { 368 return; 369 } 370 trekkie.methods = [ 371 'identify', 372 'page', 373 'ready', 374 'track', 375 'trackForm', 376 'trackLink' 377 ]; 378 trekkie.factory = function(method) { 379 return function() { 380 var args = Array.prototype.slice.call(arguments); 381 args.unshift(method); 382 trekkie.push(args); 383 if (method == 'track' || method == 'page') { 384 var pageUrl; 385 try { 386 pageUrl = window.location.href; 387 } catch (e) {} 388 var pageReferrer; 389 try { 390 pageReferrer = document.referrer; 391 } catch (e) {} 392 try { 393 if (window.__TREKKIE_SHIM_QUEUE == null) { 394 window.__TREKKIE_SHIM_QUEUE = []; 395 } 396 window.__TREKKIE_SHIM_QUEUE.push({ 397 from: 'trekkie-stub', 398 method: method, 399 args: args.slice(1), 400 pageContext: { 401 url: pageUrl, 402 referrer: pageReferrer 403 } 404 }); 405 } catch (e) { 406 // no-op 407 } 408 } 409 return trekkie; 410 }; 411 }; 412 for (var i = 0; i < trekkie.methods.length; i++) { 413 var key = trekkie.methods[i]; 414 trekkie[key] = trekkie.factory(key); 415 } 416 trekkie.load = function(config) { 417 trekkie.config = config || {}; 418 trekkie.config.initialDocumentCookie = document.cookie; 419 var first = document.getElementsByTagName('script')[0]; 420var script = document.createElement('script'); 421script.type = 'text/javascript'; 422script.onerror = function(e) { 423 var scriptFallback = document.createElement('script'); 424 scriptFallback.type = 'text/javascript'; 425 scriptFallback.onerror = function(error) { 426 var Monorail = { 427 produce: function produce(monorailDomain, schemaId, payload) { 428 var currentMs = new Date().getTime(); 429 var event = { 430 schema_id: schemaId, 431 payload: payload, 432 metadata: { 433 event_created_at_ms: currentMs, 434 event_sent_at_ms: currentMs 435 } 436 }; 437 return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event)); 438 }, 439 sendRequest: function sendRequest(endpointUrl, payload) { 440 // Try the sendBeacon API 441 if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) { 442 var blobData = new window.Blob([payload], { 443 type: 'text/plain' 444 }); 445 446 if (window.navigator.sendBeacon(endpointUrl, blobData)) { 447 return true; 448 } // sendBeacon was not successful 449 450 } // XHR beacon 451 452 var xhr = new XMLHttpRequest(); 453 454 try { 455 xhr.open('POST', endpointUrl); 456 xhr.setRequestHeader('Content-Type', 'text/plain'); 457 xhr.send(payload); 458 } catch (e) { 459 console.log(e); 460 } 461 462 return false; 463 }, 464 isIos12: function isIos12() { 465 return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1; 466 } 467 }; 468 Monorail.produce('monorail-edge.shopifysvc.com', 469 'trekkie_storefront_load_errors/1.1', 470 {shop_id: 83272630548, 471 theme_id: 160560808212, 472 app_name: "storefront", 473 context_url: window.location.href, 474 source_url: "//hollandandbarrett.gi/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js"}); 475 476 }; 477 scriptFallback.async = true; 478 scriptFallback.src = '//hollandandbarrett.gi/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js'; 479 first.parentNode.insertBefore(scriptFallback, first); 480}; 481script.async = true; 482script.src = '//hollandandbarrett.gi/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js'; 483first.parentNode.insertBefore(script, first); 484 485 }; 486 trekkie.load( 487 {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":83272630548,"isMerchantRequest":null,"themeId":160560808212,"themeCityHash":"11292236425600005189","contentLanguage":"en","currency":"GBP","eventMetadataId":"c384ab13-e7ad-4a77-9404-698dac32ea74"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["764d78cb","8450a54b","4c64608a"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":false,"source":"trekkie-storefront-renderer","apiClientId":580111}} 488 ); 489 490 var loaded = false;
491 trekkie.ready(function() { 492 if (loaded) return; 493 loaded = true; 494 495 window.ShopifyAnalytics.lib = window.trekkie; 496 497 var originalDocumentWrite = document.write; 498 document.write = customDocumentWrite; 499 try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {}; 500 document.write = originalDocumentWrite; 501 502 var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/) 503 var token = match? match[1]: undefined; 504 if (!hasLoggedConversion(token)) { 505 setCookieIfConversion(token); 506 507 } 508 }); 509 510 window.ShopifyAnalytics.lib.page(null,{"pageType":"page","resourceType":"page","resourceId":128288653588,"requestId":"a1cbe20b-1793-41a5-a76c-142f1ad373f9-1791320813","shopifyEmitted":true}); 511 512 var eventsListenerScript = document.createElement('script'); 513 eventsListenerScript.async = true; 514 eventsListenerScript.src = "//hollandandbarrett.gi/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js"; 515 document.getElementsByTagName('head')[0].appendChild(eventsListenerScript); 516})();</script>
vendor: 1 bytes, line 516
516
517<script 518 defer 519 src="https://hollandandbarrett.gi/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.9.6.min.js" 520 data-application="storefront-renderer" 521 data-shop-id="83272630548" 522 data-render-region="gcp-europe-west1" 523 data-page-type="page" 524 data-theme-instance-id="160560808212" 525 data-theme-name="Gecko" 526 data-theme-version="5.8" 527 data-monorail-region="shop_domain" 528 data-resource-timing-sampling-rate="10" 529 data-shs="true" 530 data-shs-beacon="true" 531 data-shs-export-with-fetch="true" 532 data-shs-logs-sample-rate="1" 533 data-shs-beacon-endpoint="https://hollandandbarrett.gi/api/collect" 534></script>
534 535<meta name="shopify-y" content="1ce7810e-686a-4385-9c2f-8cdebcf262e7" data-expiration="1822878413000"><meta name="shopify-s" content="ce91d190-9431-4929-bfbb-1b8e9aeaafad" data-expiration="1791322613000"><meta name="new-cookie-storage-activated" content="t"> 536</head> 537<body class="gecko-5_0_0 lazy_icons min_cqty_0 btnt4_style_1 zoom_tp_2 css_scrollbar template-page js_search_true cart_pos_side gecko_toolbar_false hover_img2 swatch_style_rounded swatch_list_size_small label_style_rectangular wrapper_full_width header_full_true header_sticky_true hide_scrolld_false des_header_2 h_transparent_false h_tr_top_false h_banner_false top_bar_false catalog_mode_false cat_sticky_false prs_bordered_grid_1 prs_sw_limit_true search_pos_canvas t4_compare_false dark_mode_false h_chan_space_false type_quickview_2 t4_cart_count_0 page_ page_id_128288653588 lazyloadt4s rtl_false"> 538 <!-- Google tag (gtag.js) -->
vendor: 64 bytes, line 538
538 <script async src="https://www.googletagmanager.com/gtag/js?id=
538G-P8CC3C7ENK
vendor: 12 bytes, line 538
538"></script>
538<script>
vendor: 133 bytes, line 538
538window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', '
538G-P8CC3C7ENK
vendor: 4 bytes, line 538
538');
538</script>
538 539 <!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 539-540
539 540<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
540GTM-MZDPQJ9G
vendor: 83 bytes, lines 540-541
540" 541height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
542<!-- End Google Tag Manager (noscript) --><a class="in-page-link visually-hidden skip-link" href="#nt_content">Skip to content</a> 543<div id="ld_cl_bar" class="op__0 pe_none"></div><div id="nt_wrapper"><header id="ntheader" class="ntheader header_2 h_icon_iccl"><div class="ntheader_wrapper pr z_200"><div id="shopify-section-header_2" class="shopify-section sp_header_mid"><div class="header__mid"> 544 <p class="header-custom-text">This is not an <span>eccomerce website</span>. Please visit our stores at 53 Main Street, or 160 Main Street, Gibraltar</p> 545 <div class="container-full"> 546 <div class="row al_center css_h_se"> 547 <div class="col-lg-2 col-md-4 col-3 d-none"><a href="/" data-id='#nt_menu_canvas' class="push_side push-menu-btn dn_lg lh__1 flex al_center"><svg xmlns="http://www.w3.org/2000/svg" width="30" height="16" viewBox="0 0 30 16"><rect width="30" height="1.5"></rect><rect y="7" width="20" height="1.5"></rect><rect y="14" width="30" height="1.5"></rect></svg></a><div class="dn db_lg cus_txt_h">Welcome to our store! 548</div> 549 </div> 550 <div class="col-lg-12 col-md-12 col-12"><nav class="nt_navigation tc hover_side_up nav_arrow_false"> 551 <ul id="nt_menu_id" class="nt_menu in_flex wrap al_center"><li id="item_header_2-0" class="menu-item type_simple" ><a class="lh__1 flex al_center pr" href="/pages/stores" target="_self">Stores</a></li> 552<li id="item_simple_dBTrxk" class="menu-item type_simple" ><a class="lh__1 flex al_center pr" href="/blogs/health-hub" target="_self">Health Hub</a></li> 553<li class="menu-item branding ts__05 lh__1"><a class="lh__1 flex al_center pr" href="/" ><img class="w__100 logo_normal dn db_lg 2" src="//hollandandbarrett.gi/cdn/shop/files/Holland_Barrett_primary_logo_reversed_rgb_220x.png?v=1695721783" srcset="//hollandandbarrett.gi/cdn/shop/files/Holland_Barrett_primary_logo_reversed_rgb_220x.png?v=1695721783 1x, //hollandandbarrett.gi/cdn/shop/files/[email protected]?v=1695721783 2x" alt="Holland & Barrett Gibraltar" width="180px" height="33px"><img class="w__100 logo_sticky dn 3" src="//hollandandbarrett.gi/cdn/shop/files/Holland_Barrett_primary_logo_reversed_rgb_220x.png?v=1695721783" srcset="//hollandandbarrett.gi/cdn/shop/files/Holland_Barrett_primary_logo_reversed_rgb_220x.png?v=1695721783 1x, //hollandandbarrett.gi/cdn/shop/files/[email protected]?v=1695721783 2x" alt="Holland & Barrett Gibraltar" width="180px" height="33px"><img class="w__100 logo_mobile dn_lg 4" src="//hollandandbarrett.gi/cdn/shop/files/Holland_Barrett_primary_logo_reversed_rgb_150x.png?v=1695721783" srcset="//hollandandbarrett.gi/cdn/shop/files/Holland_Barrett_primary_logo_reversed_rgb_150x.png?v=1695721783 1x, //hollandandbarrett.gi/cdn/shop/files/[email protected]?v=1695721783 2x" alt="Holland & Barrett Gibraltar" width="110px" height="33px"></a></li> <li id="item_simple_zeiU3h" class="menu-item type_simple" ><a class="lh__1 flex al_center pr" href="/pages/trusted-brands-for-your-lifestyle" target="_self">Brands</a></li> 554<li id="item_header_2-2" class="menu-item type_simple" ><a class="lh__1 flex al_center pr" href="/pages/contact" target="_self">Contacts</a></li> 555</ul> 556</nav> 557</div> 558 <div class="col-lg-2 col-md-4 col-3 d-none tr"><div class="nt_action in_flex al_center cart_des_1"><a class="icon_search push_side cb chp" data-id="#nt_search_canvas" href="/search"><i class="iccl iccl-search"></i></a> 559 560 <div class="my-account ts__05 pr dn db_md"> 561 <a class="cb chp db push_side" href="https://hollandandbarrett.gi/customer_authentication/redirect?locale=en®ion_country=GI" data-id="#nt_login_canvas"><i class="iccl iccl-user"></i></a></div><a class="icon_like cb chp pr dn db_md js_link_wis" href="/search/?view=wish"><i class="iccl iccl-heart pr"><span class="op__0 ts_op pa tcount jswcount bgb br__50 cw tc">0</span></i></a><div class="icon_cart pr"><a class="push_side pr cb chp db" href="/cart" data-id="#nt_cart_
561canvas"><i class="iccl iccl-cart pr"><span class="op__0 ts_op pa tcount jsccount bgb br__50 cw tc">0</span></i></a></div></div></div> 562 </div> 563 </div></div><style>.header__mid .css_h_se {min-height: 62px}.nt_menu >li>a{height:62px}</style></div></div> 564</header> 565<div id="nt_content"> 566 567 <div id="shopify-section-pages_heading" class="shopify-section page_section_heading"><div style="display: none;" class="page-head tc pr oh page_head_pages_heading"><div class="container pr z_100"><h1 class="mb__5 cw">Stores</h1></div></div><style data-shopify>.page_head_pages_heading {padding: 50px 0}@media (min-width: 768px){.page_head_pages_heading {padding: 50px 0} } 568.page_head_pages_heading:before { 569 background-color: #000;opacity: 0.54 570}.page_head_pages_heading .parallax-inner { 571 background-repeat: no-repeat; 572 background-size: cover; 573 background-attachment: scroll; 574 background-position: center center; 575}</style></div><div class="container mt__60 mb__60 rtet4"><web-component-embed id="7zknLw" app_slug="map"></web-component-embed>
575<script src="https://app.powr.io/assets/webcomponent.js"></script>
575</div> 576 577 578 579 </div> 580 <footer id="nt_footer" class="bgbl footer-1"><div id="shopify-section-footer_top" class="shopify-section footer__top type_instagram"><div class="footer_newsletter footer_newsletter-2"> 581 <div class="container"> 582 <div class="row"> 583 584 585 586 587 588</div> 589 </div> 590</div> 591 592<!-- <div class="footer_gird"> 593 <div class="container"> 594 <div class="row"> 595 596 597 598<div class="col-lg-4 col-md-4 col-12 footer_grid-item"> 599 <a class="grid-image" href="#"> 600 601 602 603 604 <img loading="lazy" src="//hollandandbarrett.gi/cdn/shopifycloud/storefront/assets/no-image-2048-a2addb12_1024x1024.gif" alt="Image Alt Text" width="" height=""> 605 606 607 </a> 608 <div class="grid-content"> 609 <h5>Habla con un asesor</h5> 610 <p>Reserve su consulta en lÃnea gratuita e individual con uno de nuestros asesores calificados.</p> 611 <a href="#">Saber más</a> 612 </div> 613 </div> 614<div class="col-lg-4 col-md-4 col-12 footer_grid-item"> 615 <a class="grid-image" href="#"> 616 617 618 619 620 <img loading="lazy" src="//hollandandbarrett.gi/cdn/shopifycloud/storefront/assets/no-image-2048-a2addb12_1024x1024.gif" alt="Image Alt Text" width="" height=""> 621 622 623 </a> 624 <div class="grid-content"> 625 <h5>Ãnase a Recompensas de por vida</h5> 626 <p>Ãnase a Rewards for Life hoy y le daremos 300 puntos por valor de £ 3</p> 627 <a href="#">Saber más</a> 628 </div> 629 </div> 630<div class="col-lg-4 col-md-4 col-12 footer_grid-item"> 631 <a class="grid-image" href="#"> 632 633 634 635 636 <img loading="lazy" src="//hollandandbarrett.gi/cdn/shopifycloud/storefront/assets/no-image-2048-a2addb12_1024x1024.gif" alt="Image Alt Text" width="" height=""> 637 638 639 </a> 640 <div class="grid-content"> 641 <h5>Suscribirse & Guardar</h5> 642 <p>Ahorre un 5 % en sus productos favoritos, además obtenga el precio más bajo de los últimos 90 dÃas y entrega gratis</p> 643 <a href="#"></a> 644 </div> 645 </div></div> 646 </div> 647</div> --> 648 649<div class="footer_payment-social"> 650 <div class="container"> 651 <div class="row"> 652 653 <div class="footer-social"> 654 <h4>Follow us on Social Media:</h4> 655 <ul style="justify-content: center;"> 656 <li><a href="https://www.instagram.com/hbgibraltar/"><img loading="lazy" height="32" width="32" src="https://cdn.shopify.com/s/files/1/0667/4150/2253/files/instagram.svg?v=1668191425"></a></li> 657 <li><a href="https://www.pinterest.co.uk/hollandandbarrett/"><img loading="lazy" height="32" width="32" src="https://cdn.shopify.com/s/files/1/0667/4150/2253/files/pinterest1.svg?v=1668191425"></a></li> 658 <li><a href="https://www.facebook.com/HollandandBarrettGibraltar"><img loading="lazy" height="32" width="32" src="https://cdn.shopify.com/s/files/1/0667/4150/2253/files/facebook.svg?v=1668191425"></a></li> 659 <li><a href="https://twitter.com/intent/user?screen_name=holland_barrett"><img loading="lazy" height="32" width="32" src="https://cdn.shopify.com/s/files/1/0667/4150/2253/files/twitter.svg?v=1668191425"></a></li> 660 </ul> 661 </div> 662 </div> 663 </div> 664</div> 665 666<div class="footer__top_wrap footer_sticky_false footer_collapse_false nt_bg_overlay pr oh pb__30 pt__80" > 667 <div class="container pr z_100"> 668 <div class="row"> 669 <div class="col-lg-3 col-md-6 col-12 mb__50 order-lg-1 order-1" ><aside id="block_1581507819652" class="widget widget_text widget_logo"><h3 class="widget-title fwsb flex al_center fl_between fs__16 mg__0 mb__30"><span class="txt_title">Get in touch</span><span class="nav_link_icon ml__5"></span></h3><div class="textwidget widget_footer"> 670 <div class="footer-contact">Holland & Barrett Gibraltar 671Everest Enterprises Ltd 672<hr> 673<p><b>WhatsApp:</b> <span> (+350) 54082855</span></p></div> 674 </div> 675 </aside></div> 676 677 678 <div class="col-lg-3 col-md-6 col-12 mb__50 order-lg-2 order-1" ><aside id="block_10140a86-7a9e-4944-a498-0fcd55e33953" class="widget widget_text"><h3 class="widget-title fwsb flex al_center fl_between fs__16 mg__0 mb__30"><span class="txt_title">Store</span><span class="nav_link_icon ml__5"></span></h3><div class="textwidget widget_footer"><p>160 Main Street, Gibraltar GX11 1AA, Gibraltar</p><p>53 Main Street, Gibraltar GX11 1AA, Gibraltar<br/><br/><strong>WhatsApp:</strong> <a href="tel:35054082855" title="tel:35054082855">(+350) 54082855</a></p></div> 679 </aside></div> 680 681 682 <div class="col-lg-3 col-md-6 col-12 mb__50 order-lg-3 order-1" ><aside id="block_00fd8151-34ad-46f7-8179-5e7459411bc4" class="widget widget_text"><h3 class="widget-title fwsb flex al_center fl_between fs__16 mg__0 mb__30"><span class="txt_title">Information</span><span class="nav_link_icon ml__5"></span></h3><div class="textwidget widget_footer"><p><a href="/pages/contact" title="Contact">Store info and opening hours</a></p><p><a href="/pages/privacy-policy" title="Privacy Policy">Privacy Policy</a></p><p><a href="/pages/h-b-gibraltar-club-card-and-gift-card-terms-and-conditions" title="H&B GIBRALTAR CLUB CARD AND GIFT CARD TERMS AND CONDITIONS">Club Card T&Cs</a></p><p>Accessibility Statement<br/></p></div> 683 </aside></div> 684 685 686 687 688</div> 689 </div> 690</div><style data-shopify>.footer__top a:hover{color: #08574a}.footer__top .signup-newsletter-form,.footer__top .signup-newsletter-form input.input-text {background-color: transparent;}.footer__top .signup-newsletter-form input.input-text {color: #888888 }.footer__top .signup-newsletter-form .submit-btn {color:#ffffff;background-color: #08574a }.footer__top .widget-title { color: #333333 }.footer__top a:not(:hover) { color: #08574a }.footer__top .signup-newsletter-form{ border-color: #08574a }.footer__top .nt_bg_overlay:after{ background-color: #000000;opacity: 0.0 }.footer__top_wrap {background-color: #ffffff;background-repeat: no-repeat;background-size: cover;background-attachment: scroll;background-position: center center;color:#08574a }</style></div><div id="shopify-section-footer_bot" class="shopify-section footer__bot"> <div class="footer__bot_wrap pt__20 pb__20"> 691 <div class="container pr tc"> 692 <div class="row">
692<div class="col-lg-12 col-md-12 col-12 col_1 f_bot_bt_copy">Copyright © 2026 Holland and Barrett Gibraltar (Everest Enterprises Ltd) under license from Holland and Barrett Retail Ltd.</div></div> 693 </div> 694</div><style data-shopify>.footer__bot_wrap a:hover,.footer__bot_wrap a.selected:not(:hover){color: #b59677}.footer__bot_wrap,.footer__bot .nt_currency ul,.footer__bot .nt_currency.cg {background-color: #222222;color:#ffffff}.footer__bot a:not(:hover) { color: #ffffff }</style></div></footer> 695 </div>
695<script type="application/ld+json">{"@context": "http://schema.org","@type": "Organization","name": "Holland \u0026amp; Barrett Gibraltar","logo": "https:\/\/hollandandbarrett.gi\/cdn\/shop\/files\/Holland_Barrett_primary_logo_reversed_rgb_2073x.png?v=1695721783","sameAs": ["","https:\/\/facebook.com\/shopify","","","https:\/\/instagram.com\/shopify","","","","",""],"url": "https:\/\/hollandandbarrett.gi\/pages\/stores","address": {"@type": "PostalAddress","streetAddress": "160 Main Street","addressLocality": "Gibraltar","addressRegion": "","postalCode": "GX11 1AA","addressCountry": "Gibraltar"},"contactPoint": [{ "@type": "ContactPoint","telephone": "+350 200 49504","contactType": "customer service"}] }</script>
695<a id="nt_backtop" class="pf br__50 z__100 des_bt1" href="/"><span class="tc br__50 db cw"><i class="pr pegk pe-7s-angle-up"></i></span></a> 696<div id="order_day" class="dn">Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday</div><div id="order_mth" class="dn">January,February,March,April,May,June,July,August,September,October,November,December</div><div id="js_we_stcl" class="dn">Not enough items available. Only [max] left.</div><a rel="nofollow" id="wis_ntjs" class="dn" data-get='/search' href="/search/?view=wish"><span class="txt_add">Add to Wishlist</span><span class="txt_view">Browse Wishlist</span><span class="txt_remve">Remove Wishlist</span></a><div class="pswp pswp_t4_js dn pswp_tp_light" tabindex="-1" role="dialog" aria-hidden="true"><div class="pswp__bg"></div><div class="pswp__scroll-wrap"><div class="pswp__container"> <div class="pswp__item"></div><div class="pswp__item"></div><div class="pswp__item"></div></div><div class="pswp__ui pswp__ui--hidden"> <div class="pswp__top-bar"> <div class="pswp__counter"></div><button class="pswp__button pswp__button--close" title="Close (Esc)"></button> <button class="pswp__button pswp__button--share" title="Share"></button> <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button> <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button> <div class="pswp__preloader"> <div class="pswp__preloader__icn"> <div class="pswp__preloader__cut"> <div class="pswp__preloader__donut"></div></div></div></div></div><div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap"> <div class="pswp__share-tooltip"></div></div><button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)"> </button> <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)"> </button> <div class="pswp__caption"> <div class="pswp__caption__center"></div></div></div></div><div class="pswp__thumbnails"></div></div> 697<div class="mask-overlay ntpf t__0 r__0 l__0 b__0 op__0 pe_none"></div><div id="shopify-section-cart_widget" class="shopify-section"><div id="nt_cart_canvas" class="nt_fk_canvas dn"> 698 <form action="/cart" method="post" novalidate class="nt_mini_cart nt_js_cart flex column h__100 btns_cart_1"> 699 <input type="hidden" data-cart-attr-rm name="attributes[cat_mb_items_per_row]" value=""><input type="hidden" data-cart-attr-rm name="attributes[cat_tb_items_per_row]" value=""><input type="hidden" data-cart-attr-rm name="attributes[cat_dk_items_per_row]" value=""> 700 <input type="hidden" data-cart-attr-rm name="attributes[auto_hide_ofsock]" value=""><input type="hidden" data-cart-attr-rm name="attributes[paginate_ntt4]" value=""><input type="hidden" data-cart-attr-rm name="attributes[limit_ntt4]" value=""><input type="hidden" data-cart-attr-rm name="attributes[use_bar_lmntt4]" value=""> 701 <div class="mini_cart_header flex fl_between al_center"><div class="h3 widget-title tu fs__16 mg__0">Shopping cart</div><i class="close_pp pegk pe-7s-close ts__03 cd"></i></div><div class="mini_cart_wrap"> 702 <div class="mini_cart_content fixcl-scroll"> 703 <div class="fixcl-scroll-content"> 704 <div class="empty tc mt__40"><i class="las la-shopping-bag pr mb__10"></i><p>Your cart is empty.</p><p class="return-to-shop mb__15"><a class="button button_primary tu js_add_ld" href="/collections/all"><span class="truncate">Return To Shop</span></a></p></div> 705 <div class="cookie-message dn">Enable cookies to use the shopping cart</div><div class="mini_cart_items js_cat_items" data-rendert4s="/cart/?view=viewjs"><div class="lds_bginfinity pr mt__10 mb__20"></div></div><div class="mini_cart_tool js_cart_tool tc dn"><div data-id="note" class="mini_cart_tool_note js_cart_tls ttip_nt tooltip_top"> 706 <span class="txt_add_note "><i class="lar la-clipboard"></i><span class="tt_txt">Add Order Note</span></span> 707 <span class="txt_edit_note dn"><i class="las la-clipboard-list"></i><span class="tt_txt">Edit Order Note</span></span></div><div data-id="ship" class="mini_cart_tool_ship js_cart_tls ttip_nt tooltip_top"><i class="las la-truck-moving"></i><span class="tt_txt">Estimate Shipping</span></div><div data-id="dis" class="mini_cart_tool_dis js_cart_tls ttip_nt tooltip_top"><i class="las la-tag"></i><span class="tt_txt">Add A Coupon</span></div></div><div data-cart-upsell-js data-baseurl="/recommendations/products" data-limit="10" data-id=""></div></div> 708 </div> 709 <div class="mini_cart_footer js_cart_footer dn"> 710 <div class="js_cat_dics"></div><div class="total row fl_between al_center"> 711 <div class="col-auto"><strong>Subtotal:</strong></div> 712 <div class="col-auto tr js_cat_ttprice"><div class="cart_tot_price">£0.00</div> 713 </div> 714 </div>
714<p class="txt_tax_ship mb__5 fs__12">Tax included. Shipping and discounts codes calculated at checkout 715</p><a href="/cart" class="button btn-cart tc mt__10 mb__10 js_add_ld"><span class="truncate">View cart</span></a><button type="submit" data-confirm="ck_lumise" name="checkout" class="button btn-checkout mt__10 mb__10 js_add_ld truncate">Check Out</button><div data-add-ckt4 class="additional_checkout_buttons additional-checkout-buttons--vertical mt__10 mb__10"><div class="dynamic-checkout__content" id="dynamic-checkout-cart" data-shopify="dynamic-checkout-cart"> <shopify-accelerated-checkout-cart wallet-configs="[{"supports_subs":false,"supports_def_opts":false,"name":"paypal","wallet_params":{"shopId":83272630548,"countryCode":"GI","merchantName":"Holland \u0026 Barrett Gibraltar","phoneRequired":false,"companyRequired":false,"shippingType":"shipping","shopifyPaymentsEnabled":false,"hasManagedSellingPlanState":null,"requiresBillingAgreement":false,"gatewayType":"CONNECTED","merchantId":null,"sdkUrl":"https://www.paypal.com/sdk/js?components=buttons\u0026commit=false\u0026currency=GBP\u0026locale=en_US\u0026client-id=AexZEtAxk09Ncgj6FSWFFyGKbxxAZ_LTyJ2DPdJWl1YUlecinmc5AfIaRF2qYjWlusWahlzz6SVkY5Ci\u0026intent=capture","serviceableCountryCodes":["AE","AT","AU","BE","CA","CH","CZ","DE","DK","ES","FI","FR","GB","GI","HK","IE","IL","IT","JP","KR","MY","NL","NO","NZ","PL","PT","SE","SG","US"]}}]" access-token="775c28f1ddb02396c18ca9a1d4305408" buyer-country="GI" buyer-locale="en" buyer-currency="GBP" shop-id="83272630548" cart-id="2ef1f1d5501265f668259c5846e7b50d" enabled-flags="["1172c16a","a1d1f9a1","f5afabb3","370070f3"]" > <div class="wallet-button-wrapper"> <ul class='wallet-cart-grid wallet-cart-grid--skeleton' role="list" data-shopify-buttoncontainer="true"> <li data-testid='grid-cell' class='wallet-cart-button-container'><div class='wallet-cart-button wallet-cart-button__skeleton' role='button' disabled aria-hidden='true'> </div></li> </ul> </div> </shopify-accelerated-checkout-cart> </div></div></div> 716 </div><div class="mini_cart_note pe_none"> 717 <label for="CartSpecialInstructions" class="mb__5 dib"><span class="txt_add_note ">Add Order Note</span><span class="txt_edit_note dn">Edit Order Note</span></label> 718 <textarea name="note" id="CartSpecialInstructions" placeholder="How can we help you?"></textarea> 719 <input type="button" class="button btn_back js_cart_tls_back mt__15 mb__10" value="Save" /> 720 <input type="button" class="button btn_back btn_back2 js_cart_tls_back" value="Cancel"> 721 </div><div class="mini_cart_ship pe_none"> 722 <div class="shipping_calculator"> 723 <h3>Estimate Shipping</h3> 724 <p class="field"> 725 <label for="address_country_ship">Country</label> 726 <select id="address_country_ship" data-rendert4s="/cart/?view=ship" data-default="United States"></select> 727 </p> 728 <p class="field" id="address_province_container_ship" style="display:none"> 729 <label for="address_province_ship" id="address_province_label">Province</label> 730 <select id="address_province_ship" data-default=""></select> 731 </p> 732 <p class="field"> 733 <label for="address_zip_ship">Postal/Zip Code</label> 734 <input type="text" id="address_zip_ship" /> 735 </p> 736 <p class="field"> 737 <input type="button" class="get_rates button" value="Calculate Shipping" /> 738 </p> 739 <p class="field"> 740 <input type="button" class="button btn_back js_cart_tls_back" value="Cancel" /> 741 </p> 742 <div id="response_calcship"></div> 743 </div> 744 </div><div class="mini_cart_dis pe_none"> 745 <div class="shipping_calculator"> 746 <h3>Add A Coupon</h3> 747 <p>Coupon code will work on checkout page</p> 748 <p class="field"> 749 <input type="text" name="discount" id="Cartdiscode" value placeholder="Coupon code"> 750 </p> 751 <p class="field"> 752 <input type="button" class="button btn_back js_cart_tls_back" value="Save" /> 753 </p> 754 <input type="button" class="button btn_back btn_back2 js_cart_tls_back" value="Cancel"> 755 </div> 756 </div></form> 757</div></div><div id="nt_menu_canvas" class="nt_fk_canvas nt_sleft dn lazyloadt4s" data-rendert4s="/search/?view=mn"></div> 758<i class="close_pp pegk pe-7s-close ts__03 cw close_mn_t4 ntpf op__0 pe_none"></i><div id="sp_notices_wrapper"></div><div id="nt_login_canvas" class="nt_fk_canvas dn lazyloadt4s" data-rendert4s="/cart/?view=login"><div class="lds_bginfinity pr"></div></div><div id="nt_search_canvas" class="nt_fk_canvas dn" data-rendert4s="/search?q=&view=pp"></div><div id="snow_ef_t4" class="dn"></div>
758<div id="gliconsymbols" class="hide dn"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><symbol id="scl_remove"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <polyline points="3 6 5 6 21 6"></polyline><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path><line x1="10" y1="11" x2="10" y2="17"></line><line x1="14" y1="11" x2="14" y2="17"></line> </svg> </symbol> <symbol id="scl_edit"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path> </svg> </symbol> <symbol id="scl_selected"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9 20l-7-7 3-3 4 4L19 4l3 3z"/></svg></symbol></svg></div><!--begin-boost-pfs-js--> 759
759<script> 760 /* Declare bcSfFilterConfig variable */ 761 var boostPFSAppConfig = { 762 api: { 763 filterUrl: 'https://services.mybcapps.com/bc-sf-filter/filter', 764 searchUrl: 'https://services.mybcapps.com/bc-sf-filter/search', 765 suggestionUrl: 'https://services.mybcapps.com/bc-sf-filter/search/suggest', 766 productsUrl: 'https://services.mybcapps.com/bc-sf-filter/search/products', 767 analyticsUrl: 'https://lambda.mybcapps.com/e' 768 }, 769 shop: { 770 name: 'Holland & Barrett Gibraltar', 771 url: 'https://hollandandbarrett.gi', 772 domain: 'ea56de-4.myshopify.com', 773 currency: 'GBP', 774 money_format: "£{{amount}}", 775 money_format_with_currency: "£{{amount}} GBP" 776 }, 777 general: { 778 file_url: "//hollandandbarrett.gi/cdn/shop/files/?v=553", 779 asset_url: "//hollandandbarrett.gi/cdn/shop/t/2/assets/boost-pfs.js?v=553", 780 collection_id: 0, 781 collection_handle: "", 782 collection_product_count: 0, 783 784 785 theme_id: 160560808212, 786 collection_tags: null, 787 current_tags: null, 788 default_sort_by: "", 789 swatch_extension: "png", 790 no_image_url: "//hollandandbarrett.gi/cdn/shop/t/2/assets/boost-pfs-no-image.gif?v=45510820439899768411695578144", 791 search_term: "", 792 template: "page",currencies: ["GBP"], 793 current_currency:"GBP",published_locales: {"en":true}, 794 current_locale:"en", 795 isInitFilter:false}, 796 797 swatch_settings: { 798 799 }, 800 801 }; 802 function mergeObject(obj1, obj2){ 803 var obj3 = {}; 804 for (var attr in obj1) { obj3[attr] = obj1[attr]; } 805 for (var attr in obj2) { obj3[attr] = obj2[attr]; } 806 return obj3; 807 } 808 if (typeof boostPFSConfig == 'undefined') { 809 boostPFSConfig = {}; 810 } 811 if (typeof boostPFSAppConfig != 'undefined') { 812 boostPFSConfig = mergeObject(boostPFSConfig, boostPFSAppConfig); 813 } 814 if (typeof boostPFSThemeConfig != 'undefined') { 815 boostPFSConfig = mergeObject(boostPFSConfig, boostPFSThemeConfig); 816 } 817</script>
817 818 819<!-- Include Resources -->
819<script defer src="//hollandandbarrett.gi/cdn/shop/t/2/assets/boost-pfs-core-instant-search.js?v=159594912226507512871695578143"></script>
819 820
820<script defer src="//hollandandbarrett.gi/cdn/shop/t/2/assets/boost-pfs-instant-search.js?v=11231006889566593421695578144"></script>
820<!-- Initialize App -->
821<script defer src="//hollandandbarrett.gi/cdn/shop/t/2/assets/boost-pfs-init.js?v=8552044266820503591695578144"></script>
821 822 823 824 825 <!-- Instant search no result JSON data --> 826
826<script type="application/json" id="boost-pfs-instant-search-products-not-found-json"> 827 { 828 "search_terms": [], 829 "products": [] 830 } 831</script>
831 832 833 <!--end-boost-pfs-js--><!-- "snippets/smile-initializer.liquid" was not rendered, the associated app was uninstalled --> 834 835 <!-- "snippets/revy-bundle-script.liquid" was not rendered, the associated app was uninstalled --> 836 837
837<script> 838 window.revyDiscountsThemeSettings = { 839 cart: {"note":null,"attributes":{},"original_total_price":0,"total_price":0,"total_discount":0,"total_weight":0.0,"item_count":0,"items":[],"requires_shipping":false,"currency":"GBP","items_subtotal_price":0,"cart_level_discount_applications":[],"checkout_charge_amount":0}, 840 locale: 'en' 841 }; 842</script>
vendor: 1 bytes, line 842
842
843<script async src="https://api.revy.io/discounts.js?shop=www-hollandandbarrett-es.myshopify.com" type="text/javascript"></script>
843 844 845 846 847<!-- "snippets/special-offers.liquid" was not rendered, the associated app was uninstalled --> 848 849 850 851
852<script src="//instant.page/5.2.0" type="module" integrity="sha384-jnZyxPjiipYXnSU0ygqeac2q7CVYMbh84q0uHVRRxEtvFPiQYbXWUorga2aqZJ0z"></script>
852 853 854 855<style> .type_image_text--hero-slider .mg__0 {display: none;} .type_image_text--hero-slider p a {padding: 18px 15px; margin: 8px 0; color: #08574a !important; border-radius: 8px; border: 1px solid #08574a; min-width: 183px; min-height: 40px; font-weight: 600; display: inline-block; text-align: center;} .type_image_text--hero-slider p a:hover {opacity: 0.8 !important;} .sub-menu .has-children > a {color: #08574a !important; font-weight: 700;} .nt_menu .sub-menu {padding-left: 0 !important;} .nt_menu .menu-item a {padding: 2px 15px !important; font-size: 14px;} #purchase_codet4:not(.hidden):not(.hide) {display: none !important;} .footer-social li:first-child {border-left: none;} .col_group_btns .icon_like {display: none !important;} .col_group_btns .icon_cart {display: none !important;} .footer-social ul li:nth-child(2) {display: none !important;} .footer-social ul li:nth-child(4) {display: none !important;} .wg-li {display: none !important;} #adroll_consent_container {display: none !important;} #image-text-slider__container_7b8bbe1c-dc6b-469b-bcb5-8df230b72700 .nt_img_txt .db {background: #08574a !important; text-align: center;} #image-text-slider__container_7b8bbe1c-dc6b-469b-bcb5-8df230b72700 img {max-width: 500px; height: 500px; border-radius: 50%; margin: 0 auto; text-align: center; object-fit: cover;} @media only screen and (max-width: 600px) {#image-text-slider__container_7b8bbe1c-dc6b-469b-bcb5-8df230b72700 img {max-width: 100%; height: 100%; }} .nt_navigation li a {color: #08574a !important;} .logo_normal {background: #08574a; padding: 5px;} .header-custom-text {background-color: #08574a; text-align: center; padding: 15px;} </style> 856<div id="shopify-block-AdTBORzdUdm95L0F1Z__1537173939754162885" class="shopify-block shopify-app-block"> 857
858<script> 859 window.accessProWidgetSettings = {"icon":"default","icon_size":"default","icon_style":"thick","widget_size":"large","icon_position":"BL","enable_features":true,"icon_color_fill":"#419d4aff","icon_color_stroke":"#419d4aff","enableMenuSettings":{"links":true,"reset":true,"cursor":true,"images":true,"sounds":true,"videos":true,"mission":true,"contrast":true,"dyslexic":true,"headings":true,"profiles":false,"alignment":true,"animation":true,"fontscale":true,"languages":true,"magnifier":true,"fontweight":true,"saturation":true,"adhdprofile":true,"linespacing":true,"readingmask":true,"text2speech":true,"textsummary":true,"readingguide":false,"letterspacing":true,"pagestructure":true,"readerprofile":true,"describeimages":true,"seizureprofile":true,"cognitiveprofile":true},"menu_content_color":"#111111ff","selected_languages":["en"],"default_menu_language":"en","menu_header_font_color":"#f2f2f2ff","open_accessibility_profile":true,"menu_header_background_color":"#111111ff"}; 860 window.accessProComplianceSettings = {"compliance_title":"Our Mission","compliance_content":"\u003cdiv class=\"ap-compliance-main-title\"\u003e\u003cstrong\u003eAccessPro Compliance Mission Statement\u003c\/strong\u003e\u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-wrapper\"\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eWCAG 2.2 Commitment:\u003c\/strong\u003e We strictly adhere to WCAG 2.2 AA guidelines.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003ePersonalized UI:\u003c\/strong\u003e Users with disabilities can personalize the interface.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eAI-Based Compliance:\u003c\/strong\u003e We use AI to maintain accessibility during updates.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eARIA Attributes:\u003c\/strong\u003e Meaningful data for screen-readers using ARIA attributes.\u003c\/div\u003e \u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-wrapper\"\u003e\u003cdiv class=\"ap-compliance-list-title\"\u003e\u003cstrong\u003eOptimized Screen Reader and Keyboard Navigation:\u003c\/strong\u003e\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list\"\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eScreen-reader Optimization:\u003c\/strong\u003e ARIA attributes for meaningful data.\u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eImage Description:\u003c\/strong\u003e Auto image descriptions for better understanding.\u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eOCR Technology:\u003c\/strong\u003e Text extraction from images.\u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eKeyboard Navigation:\u003c\/strong\u003e Enhanced keyboard operability. \u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eContent-skip Menus:\u003c\/strong\u003e Easy navigation with shortcuts.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003ePopup Handling:\u003c\/strong\u003e Improved handling of popups.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eShortcuts:\u003c\/strong\u003e Quick access to key elements with shortcuts.\u003c\/div\u003e\u003c\/div\u003e \u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-wrapper\"\u003e\u003cdiv class=\"ap-compliance-list-title\"\u003e\u003cstrong\u003eSpecialized Profiles for Disabilities:\u003c\/strong\u003e\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list\"\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eEpilepsy Safe Profile:\u003c\/strong\u003e Safe browsing with reduced triggers.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eVision Impaired Profile:\u003c\/strong\u003e Enhanced interface for visual impairments.\u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eCognitive Disability Profile:\u003c\/strong\u003e Assistive features for cognitive disabilities.\u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eADHD-Friendly Profile:\u003c\/strong\u003e Minimized distractions for ADHD users.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eBlind Users Profile:\u003c\/strong\u003e Compatibility with popular screen-readers.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eKe
860yboard Navigation Profile:\u003c\/strong\u003e Navigate with keyboard commands.\u003c\/div\u003e\u003c\/div\u003e \u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-wrapper\"\u003e\u003cdiv class=\"ap-compliance-list-title\"\u003e\u003cstrong\u003eCustomizable User Interface Adjustments:\u003c\/strong\u003e\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list\"\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eFont Adjustments:\u003c\/strong\u003e Customize font settings for readability.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eColour Adjustments:\u003c\/strong\u003e Choose contrast profiles and color schemes.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eAnimations:\u003c\/strong\u003e Disable animations for user safety.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eContent Highlighting:\u003c\/strong\u003e Emphasize key elements.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eAudio Muting:\u003c\/strong\u003e Instantly mute the website.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eCognitive Disorders:\u003c\/strong\u003e Linked search engine for better understanding.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eAdditional Functions:\u003c\/strong\u003e Various customizable options.\u003c\/div\u003e\u003c\/div\u003e \u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-wrapper\"\u003e\u003cdiv class=\"ap-compliance-list-title\"\u003e\u003cstrong\u003eBrowser and Assistive Technology Support:\u003c\/strong\u003e\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list\"\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eSupported Browsers:\u003c\/strong\u003e Google Chrome, Mozilla Firefox, Apple Safari, Opera, Microsoft Edge.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eSupported Screen Readers:\u003c\/strong\u003e JAWS (Windows\/MAC), NVDA (Windows\/MAC).\u003c\/div\u003e\u003c\/div\u003e \u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-wrapper\"\u003e\u003cdiv class=\"ap-compliance-list-title\"\u003e\u003cstrong\u003eContinual Accessibility Improvement:\u003c\/strong\u003e\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list\"\u003e \u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eOngoing Efforts:\u003c\/strong\u003e We continuously enhance accessibility. \u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eGoal:\u003c\/strong\u003e Achieve maximum accessibility with evolving technology.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e⢠\u003cstrong\u003eContact Us:\u003c\/strong\u003e Reach out via the websiteâs contact form for queries or concerns.\u003c\/div\u003e\u003c\/div\u003e \u003c\/div\u003e","statement_action":"popup","statement_redirect_url":"","statement_redirect_page_id":""}; 861 window.accessProCurrentPage = { 862 pageType: "page", 863 path: "\/pages\/stores" 864 }; 865</script>
865 866 867<style> 868 869 870 .asw-widget-button-top { 871 position: absolute !important; 872 top: 10px !important; 873 left: 10px !important; 874 background-color: #000 !important; 875 color: #fff !important; 876 text-decoration: none !important; 877 overflow: hidden; 878 width: 1px !important; 879 height: 1px !important; 880 margin: -1px !important; 881 padding: 0 !important; 882 border: 0 !important; 883 clip: rect(0 0 0 0) !important; 884 word-wrap: normal !important; 885 } 886 .asw-widget-button-top-focused, 887 .asw-widget-button-top:focus { 888 z-index: 9999 !important; 889 overflow: auto !important; 890 width: auto !important; 891 height: auto !important; 892 clip: auto !important; 893 padding: 10px 15px !important; 894 } 895 896 #acp-virtualKeyboardPopup { 897 position: fixed; 898 bottom: 80px; 899 left: 50%; 900 transform: translateX(-50%); 901 background: #ffffff !important; 902 border: 1px solid #ccc; 903 padding: 8px; 904 box-shadow: 0 8px 20px rgba(0, 0, 0, 0.2); 905 z-index: 9999; 906 display: none; 907 width: 90%; 908 max-width: 600px; 909 border-radius: 10px; 910 } 911 912 #acp-virtual-input { 913 width: 100%; 914 padding: 10px; 915 font-size: 16px; 916 margin-bottom: 10px; 917 } 918 919 #acp-closeKeyboardBtn { 920 color: #fff; 921 border: none; 922 padding: 1px 3px; 923 cursor: pointer; 924 float: right; 925 border-radius: 4px; 926 margin-bottom: 5px; 927 } 928 #acp-definition-popup { 929 position: absolute; 930 display: none; 931 padding: 10px; 932 background: white; 933 border: 1px solid #ccc; 934 z-index: 1000; 935 border-radius: 14px; 936 } 937</style> 938 939<div id="acp-icon"></div> 940<div id="acp-widget"></div> 941 942<!-- Virtual Keyboard Input and Keyboard --> 943<div 944 id="acp-definition-popup" 945></div> 946<div 947 id="acp-dictionary-toast" 948 class="asw-text-speech-bar" 949 style="display: none;" 950 data-ap-translate="DICTIONARY DESC" 951> 952 Double click on a word to see the definition. 953</div> 954<div id="acp-virtualKeyboardPopup" role="dialog" aria-modal="true" aria-label="Virtual keyboard popup"> 955 <button id="acp-closeKeyboardBtn" aria-label="Close virtual keyboard"> 956 <svg 957 xmlns="http://www.w3.org/2000/svg" 958 width="24" 959 height="24" 960 viewBox="0 0 24 24" 961 fill="none" 962 > 963 <path 964 d="M18 6L6 18" 965 stroke="black" 966 strokeWidth="2" 967 strokeLinecap="round" 968 strokeLinejoin="round" 969 /> 970 <path 971 d="M6 6L18 18" 972 stroke="black" 973 strokeWidth="2" 974 strokeLinecap="round" 975 strokeLinejoin="round" 976 /> 977 </svg> 978 </button> 979 980 <div id="acp-virtual-keyboard" class="simple-keyboard"></div> 981
981<script> 982 function makeDraggableVirtualKeyboard(el) { 983 let pos1 = 0, 984 pos2 = 0, 985 pos3 = 0, 986 pos4 = 0; 987 988 el.onmousedown = dragMouseDown; 989 990 function dragMouseDown(e) { 991 e.preventDefault(); 992 pos3 = e.clientX; 993 pos4 = e.clientY; 994 document.onmouseup = closeDragElement; 995 document.onmousemove = elementDrag; 996 } 997 998 function elementDrag(e) { 999 e.preventDefault(); 1000 pos1 = pos3 - e.clientX; 1001 pos2 = pos4 - e.clientY; 1002 pos3 = e.clientX; 1003 pos4 = e.clientY; 1004 el.style.top = el.offsetTop - pos2 + 'px'; 1005 el.style.left = el.offsetLeft - pos1 + 'px'; 1006 el.style.bottom = 'unset'; 1007 el.style.right = 'unset'; 1008 } 1009 1010 function closeDragElement() { 1011 document.onmouseup = null; 1012 document.onmousemove = null; 1013 } 1014 } 1015 1016 makeDraggableVirtualKeyboard(document.getElementById('acp-virtualKeyboardPopup')); 1017 </script>
1017 1018</div>
1019<script> 1020 // App Procxy Handle 1021 1022 window.accessProProxyHandle = '/apps/access-pro'; 1023 1024 1025 // URLs 1026 window.accessProSettingsUrl = `${window.accessProProxyHandle}/theme/settings/`; 1027 window.accessProPageViewsCountUrl = `${window.accessProProxyHandle}/theme/views/update/count`; 1028 1029 1030 // Translation URL 1031 var shopify_domain = `ea56de-4.myshopify.com`; 1032 window.accessProTranslationUrl = `https://access-pro-api.entanglecommerce.com/api/v1/language/translate/?domain=${shopify_domain}`; 1033 window.pageViewsCountURL = `${window.accessProProxyHandle}/theme/views/update/count`; 1034</script>
1034 1035
1036<script src="https://cdn.shopify.com/extensions/01a1115f-a4db-79a9-998b-83572f4594c6/access-pro-2-247/assets/main.js" defer></script>
vendor: 1 bytes, line 1036
1036
1037<script> 1038 (function () { 1039 var params = new URLSearchParams(window.location.search); 1040 var token = params.get('acp_scan'); 1041 if (!token) return; 1042 1043 function showScanOverlay(message) { 1044 var el = document.getElementById('acp-scan-overlay'); 1045 if (!el) { 1046 el = document.createElement('div'); 1047 el.id = 'acp-scan-overlay'; 1048 el.style.cssText = 1049 'position:fixed;inset:0;background:rgba(255,255,255,0.94);z-index:2147483647;display:flex;align-items:center;justify-content:center;font-family:system-ui,-apple-system,sans-serif;'; 1050 el.innerHTML = 1051 '<div style="text-align:center;max-width:320px;padding:24px">' + 1052 '<p style="font-size:18px;font-weight:600;margin:0 0 8px;color:#111">Scanning for accessibility</p>' + 1053 '<p id="acp-scan-overlay-status" style="font-size:14px;color:#666;margin:0"></p>' + 1054 '</div>'; 1055 document.body.appendChild(el); 1056 } 1057 var status = document.getElementById('acp-scan-overlay-status'); 1058 if (status) status.textContent = message || 'Please waitâ¦'; 1059 } 1060 1061 showScanOverlay('Preparing accessibility scanâ¦'); 1062 1063 function hideOverlay() { 1064 var el = document.getElementById('acp-scan-overlay'); 1065 if (el) el.style.display = 'none'; 1066 } 1067 1068 function pageIsThemePreview() { 1069 try { 1070 return Boolean(new URLSearchParams(window.location.search).get('preview_theme_id')); 1071 } catch (e) { 1072 return false; 1073 } 1074 } 1075 1076 // Shopify stores the unpublished theme in a storefront cookie. Clear it 1077 // here so the scan window never has to navigate to the live theme. 1078 var previewExitPromise = null; 1079 function exitThemePreviewQuietly() { 1080 if (!pageIsThemePreview()) return Promise.resolve(); 1081 if (previewExitPromise) return previewExitPromise; 1082 previewExitPromise = new Promise(function (resolve) { 1083 var settled = false; 1084 function finish() { 1085 if (settled) return; 1086 settled = true; 1087 resolve(); 1088 } 1089 setTimeout(finish, 2000); 1090 try { 1091 var frame = document.createElement('iframe'); 1092 frame.setAttribute('aria-hidden', 'true'); 1093 frame.title = ''; 1094 frame.style.cssText = 1095 'position:absolute;width:0;height:0;border:0;visibility:hidden'; 1096 frame.src = window.location.origin + '/?exitPreview=1'; 1097 (document.body || document.documentElement).appendChild(frame); 1098 } catch (e) {} 1099 try { 1100 fetch(window.location.origin + '/?exitPreview=1', { 1101 credentials: 'include', 1102 cache: 'no-store', 1103 redirect: 'follow', 1104 }).catch(function () {}); 1105 } catch (e) {} 1106 }); 1107 return previewExitPromise; 1108 } 1109 1110 window.addEventListener('message', function (event) { 1111 if (event.source !== window.opener) return; 1112 var data = event.data; 1113 if (!data || data.type !== 'accesspro-exit-preview') return; 1114 exitThemePreviewQuietly().then(function () { 1115 if (window.opener) { 1116 window.opener.postMessage({ type: 'accesspro-preview-exited' }, '*'); 1117 } 1118 }); 1119 }); 1120 1121 function submitScanResult(payload) { 1122 var params = new URLSearchParams(window.location.search); 1123 var jobId = params.get('acp_job'); 1124 if (!jobId) { 1125 return; 1126 } 1127 1128 var pageUrl = window.location.origin + window.location.pathname; 1129 fetch(window.accessProProxyHandle + '/theme/accessibility-scan/complete', { 1130 method: 'POST', 1131 headers: { 'Content-Type': 'application/json' }, 1132 body: JSON.stringify({ 1133 jobId: jobId, 1134 scanToken: token, 1135 url: pageUrl, 1136 axeResults: payload.results || null, 1137 error: 1138 payload.type === 'accesspro-axe-scan-error' 1139 ? payload.message || 'Accessibility scan failed' 1140 : null, 1141 }), 1142 }) 1143 .then(function (response) { 1144 return response.json().catch(function () { 1145 return {}; 1146 }); 1147 }) 1148 .then(function (data) { 1149 if (window.opener) { 1150 var isFinal = data.reportId != null; 1151 var hasError = !data.success; 1152 var isNextScanPage = false;
1153 if (data.redirectUrl) { 1154 try { 1155 isNextScanPage = new URL(data.redirectUrl).searchParams.has('acp_scan'); 1156 } catch (e) {} 1157 } 1158 var continuing = isNextScanPage && data.redirectUrl && !isFinal && !hasError; 1159 1160 function deliver() { 1161 window.opener.postMessage( 1162 { 1163 type: 'accesspro-axe-scan-progress', 1164 jobId: jobId, 1165 redirectUrl: data.redirectUrl || null, 1166 reportId: data.reportId != null ? data.reportId : null, 1167 error: data.success ? null : (data.message || 'Scan failed'), 1168 }, 1169 '*', 1170 ); 1171 1172 if (isFinal) { 1173 showScanOverlay('Returning to your audit reportâ¦'); 1174 return; 1175 } 1176 1177 if (continuing) { 1178 showScanOverlay('Scanning next pageâ¦'); 1179 window.location.href = data.redirectUrl; 1180 return; 1181 } 1182 1183 setTimeout(function () { 1184 window.close(); 1185 }, 400); 1186 } 1187 1188 if (pageIsThemePreview() && !continuing) { 1189 if (isFinal) showScanOverlay('Returning to your audit reportâ¦'); 1190 exitThemePreviewQuietly().then(deliver); 1191 return; 1192 } 1193 1194 deliver(); 1195 return; 1196 } 1197 if (data.redirectUrl) { 1198 showScanOverlay('Returning to your audit reportâ¦'); 1199 window.location.href = data.redirectUrl; 1200 return; 1201 } 1202 showScanOverlay(data.message || 'Scan failed'); 1203 if (window.opener) { 1204 window.opener.postMessage( 1205 { 1206 type: 'accesspro-axe-scan-progress', 1207 jobId: jobId, 1208 error: data.message || 'Scan failed', 1209 }, 1210 '*', 1211 ); 1212 } 1213 }) 1214 .catch(function (err) { 1215 var message = 1216 (err && err.message) || 'Scan failed'; 1217 showScanOverlay(message); 1218 function deliver() { 1219 if (!window.opener) return; 1220 var jobIdErr = new URLSearchParams(window.location.search).get('acp_job'); 1221 window.opener.postMessage( 1222 { 1223 type: 'accesspro-axe-scan-progress', 1224 jobId: jobIdErr, 1225 error: message, 1226 }, 1227 '*', 1228 ); 1229 } 1230 if (pageIsThemePreview()) { 1231 exitThemePreviewQuietly().then(deliver); 1232 return; 1233 } 1234 deliver(); 1235 }); 1236 } 1237 1238 function waitForFullPageLoad() { 1239 return new Promise(function (resolve) { 1240 function settle() { 1241 // Extended settle time for dynamic content, carousels, lazy sections 1242 // Wait for network idle + animations + JS state changes 1243 setTimeout(function() { 1244 // Wait for any lazy images to finish loading 1245 var images = Array.prototype.slice.call(document.querySelectorAll('img[loading="lazy"]')); 1246 var pendingImages = images.filter(function(img) { 1247 return !img.complete; 1248 }); 1249 1250 if (pendingImages.length > 0) { 1251 var loaded = 0; 1252 var timeout = setTimeout(function() { 1253 resolve(); // Don't wait forever 1254 }, 2000); 1255 1256 pendingImages.forEach(function(img) { 1257 function handleLoad() { 1258 loaded++; 1259 if (loaded >= pendingImages.length) { 1260 clearTimeout(timeout); 1261 // Additional wait for any pending RAF or microtasks 1262 requestAnimationFrame(function() { 1263 setTimeout(resolve, 100); 1264 }); 1265 } 1266 } 1267 img.addEventListener('load', handleLoad, { once: true }); 1268 img.addEventListener('error', handleLoad, { once: true }); 1269 }); 1270 } else {
1271 // Additional wait for any pending RAF or microtasks 1272 requestAnimationFrame(function() { 1273 setTimeout(resolve, 100); 1274 }); 1275 } 1276 }, 3000); 1277 } 1278 if (document.readyState === 'complete') { 1279 settle(); 1280 return; 1281 } 1282 window.addEventListener('load', settle, { once: true }); 1283 }); 1284 } 1285 1286 // Port of accessibility-scanner Phase 3 WCAG 2.2 / APG checks (browser-side). 1287 // Findings are merged into axe violations/incomplete so the existing pipeline needs no changes. 1288 function isAccessProScanElement(el) { 1289 if (!el || !el.closest) return false; 1290 return !!( 1291 el.closest('#acp-icon') || 1292 el.closest('#acp-widget') || 1293 el.closest('#acp-virtualKeyboardPopup') || 1294 el.closest('#acp-definition-popup') || 1295 el.closest('#acp-dictionary-toast') || 1296 el.closest('#acp-scan-overlay') || 1297 el.closest('[id^="acp-"]') || 1298 el.closest('.asw-widget-button-top') 1299 ); 1300 } 1301 1302 // Enhanced element visibility check including all CSS hiding techniques 1303 function isElementVisible(el) { 1304 if (!el || !el.getBoundingClientRect) return false; 1305 var style = window.getComputedStyle(el); 1306 if (style.display === 'none' || style.visibility === 'hidden') return false; 1307 if (style.opacity === '0') return false; 1308 if (style.position === 'absolute' && style.clip === 'rect(0px, 0px, 0px, 0px)') return false; 1309 if (style.width === '1px' && style.height === '1px' && style.overflow === 'hidden') return false; 1310 var rect = el.getBoundingClientRect(); 1311 if (rect.width === 0 || rect.height === 0) return false; 1312 return true; 1313 } 1314 1315 function runWcag22Checks() { 1316 var violations = []; 1317 var incomplete = []; 1318 1319 try { 1320 // WCAG 2.4.11 Focus Not Obscured â sticky/fixed heuristic (manual review) 1321 var stickyElements = Array.prototype.slice 1322 .call(document.querySelectorAll('*')) 1323 .filter(function (el) { 1324 if (isAccessProScanElement(el)) return false; 1325 if (!isElementVisible(el)) return false; 1326 var style = getComputedStyle(el); 1327 return ( 1328 (style.position === 'sticky' || style.position === 'fixed') && 1329 el.getBoundingClientRect().height > 40 1330 ); 1331 }) 1332 .slice(0, 5) 1333 .map(function (el) { 1334 var style = getComputedStyle(el); 1335 return { 1336 tag: el.tagName.toLowerCase(), 1337 id: el.id || null, 1338 height: Math.round(el.getBoundingClientRect().height), 1339 position: style.position, 1340 }; 1341 }); 1342 1343 if (stickyElements.length > 0) { 1344 incomplete.push({ 1345 id: 'focus-not-obscured', 1346 impact: 'serious', 1347 tags: ['wcag22aa', 'wcag2411'], 1348 description: 1349 'WCAG 2.4.11: Focused elements must not be entirely obscured. Fixed/sticky elements detected â manual keyboard testing required.', 1350 helpUrl: 1351 'https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html', 1352 nodes: stickyElements.map(function (e) { 1353 return { 1354 html: 1355 '<' + 1356 e.tag + 1357 (e.id ? ' id="' + e.id + '"' : '') + 1358 '> (' + 1359 e.position + 1360 ', ' + 1361 e.height + 1362 'px tall)', 1363 target: [e.tag + (e.id ? '#' + e.id : '')], 1364 failureSummary: 1365 'Fixed/sticky element may obscure focused components. Verify with keyboard navigation.', 1366 }; 1367 }), 1368 }); 1369 } 1370 1371 // NEW: aria-hidden-focus check - elements with aria-hidden="true" that are focusable 1372 var hiddenFocusable = []; 1373 document.querySelectorAll('[aria-hidden="true"]').forEach(function(el) { 1374 if (isAccessProScanElement(el)) return; 1375 // Check if this element or any descendant is focusable 1376 var focusableSelectors = 'a[href], button, input, select, textarea, [tabindex]:not
1376([tabindex="-1"])'; 1377 var focusables = el.matches(focusableSelectors) ? [el] : Array.prototype.slice.call(el.querySelectorAll(focusableSelectors)); 1378 focusables.forEach(function(focusEl) { 1379 if (isElementVisible(focusEl) && focusEl.tabIndex >= 0) { 1380 hiddenFocusable.push({ 1381 html: focusEl.outerHTML.slice(0, 500), 1382 selector: buildScanSelector(focusEl), 1383 parentHiddenHtml: el.outerHTML.slice(0, 200) 1384 }); 1385 } 1386 }); 1387 }); 1388 1389 if (hiddenFocusable.length > 0) { 1390 violations.push({ 1391 id: 'aria-hidden-focus', 1392 impact: 'serious', 1393 tags: ['wcag2aa', 'wcag412'], 1394 description: 'WCAG 4.1.2: Focusable elements must not be hidden with aria-hidden="true"', 1395 helpUrl: 'https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html', 1396 nodes: hiddenFocusable.slice(0, 10).map(function(item) { 1397 return { 1398 html: item.html, 1399 target: [item.selector], 1400 failureSummary: 'Focusable element is inside aria-hidden="true" container' 1401 }; 1402 }) 1403 }); 1404 } 1405 1406 // WCAG 2.5.3 Label in Name - Enhanced with better visible text extraction 1407 // Visible text = text rendered on screen (excludes aria-hidden, sr-only, SVG internals). 1408 function getVisibleText(el) { 1409 var text = ''; 1410 for (var i = 0; i < el.childNodes.length; i++) { 1411 var child = el.childNodes[i]; 1412 if (child.nodeType === 3) { text += child.textContent; continue; } 1413 if (child.nodeType !== 1) continue; 1414 if (child.getAttribute('aria-hidden') === 'true') continue; 1415 var st = window.getComputedStyle(child); 1416 if (st.display === 'none' || st.visibility === 'hidden') continue; 1417 if (st.opacity === '0') continue; 1418 if (st.position === 'absolute') { 1419 var clip = st.clip; 1420 if (clip === 'rect(0px, 0px, 0px, 0px)' || clip === 'rect(0, 0, 0, 0)') continue; 1421 } 1422 if (st.width === '1px' && st.height === '1px' && st.overflow === 'hidden') continue; 1423 if (st.fontSize === '0px' || st.width === '0px' || st.height === '0px') continue; 1424 text += getVisibleText(child); 1425 } 1426 return text; 1427 } 1428 function buildScanSelector(el) { 1429 if (el.id) return '#' + CSS.escape(el.id); 1430 var testId = el.getAttribute('data-testid') || el.getAttribute('data-test-id'); 1431 if (testId) return '[data-testid="' + testId + '"]'; 1432 var tag = el.tagName.toLowerCase(); 1433 var cls = (el.getAttribute('class') || '').split(/\s+/).filter(function (c) { 1434 return c && c.length < 60 && !/^(active|is-|js-|open|hidden|focus|hover)/i.test(c); 1435 }).slice(0, 3); 1436 return cls.length ? tag + '.' + cls.join('.') : tag; 1437 } 1438 1439 // Enhanced selector to catch more interactive elements 1440 var interactiveSelector = 'button, [role="button"], a[aria-label], [role="link"][aria-label], ' + 1441 '[role="menuitem"][aria-label], [role="tab"][aria-label], [role="checkbox"][aria-label], ' + 1442 '[role="radio"][aria-label], [role="switch"][aria-label], [role="combobox"][aria-label], ' + 1443 '[role="searchbox"][aria-label], [role="textbox"][aria-label]'; 1444 1445 var mismatches = Array.prototype.slice 1446 .call(document.querySelectorAll(interactiveSelector)) 1447 .filter(function (el) { 1448 return !isAccessProScanElement(el) && isElementVisible(el); 1449 }) 1450 .map(function (el) { 1451 var ariaLabel = el.getAttribute('aria-label') || ''; 1452 var visibleText = getVisibleText(el).replace(/\s+/g, ' ').trim(); 1453 if (!ariaLabel || !visibleText) return null; 1454 if (visibleText.length <= 1) return null; 1455 1456 // Normalize for comparison - remove punctuation and make case-insensitive 1457 var normalizedLabel = ariaLabel.toLowerCase().replace(/[^\w\s]/g, ''); 1458 var normalizedVisible = visibleText.toLowerCase().replace(/[^\w\s]/g, ''); 1459 1460 // Check if visible text is substring of aria-label
1461 if (normalizedLabel.includes(normalizedVisible)) return null; 1462 1463 // Check word-by-word containment for multi-word labels 1464 var visibleWords = normalizedVisible.split(/\s+/).filter(Boolean); 1465 if (visibleWords.length > 0) { 1466 var allWordsPresent = visibleWords.every(function(word) { 1467 return normalizedLabel.includes(word); 1468 }); 1469 if (allWordsPresent) return null; 1470 } 1471 1472 return { 1473 html: el.outerHTML.slice(0, 500), 1474 selector: buildScanSelector(el), 1475 ariaLabel: ariaLabel, 1476 visibleText: visibleText, 1477 }; 1478 }) 1479 .filter(Boolean) 1480 .slice(0, 10); 1481 1482 if (mismatches.length > 0) { 1483 violations.push({ 1484 id: 'label-in-name', 1485 impact: 'serious', 1486 tags: ['wcag21a', 'wcag253'], 1487 description: 'WCAG 2.5.3: Accessible name must contain visible label text', 1488 helpUrl: 'https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html', 1489 nodes: mismatches.map(function (m) { 1490 return { 1491 html: m.html, 1492 target: [m.selector], 1493 failureSummary: 1494 'aria-label="' + 1495 m.ariaLabel + 1496 '" does not contain visible text "' + 1497 m.visibleText + 1498 '"', 1499 }; 1500 }), 1501 }); 1502 } 1503 1504 // 2.5.7 Dragging Movements 1505 var draggableElements = Array.prototype.slice 1506 .call( 1507 document.querySelectorAll( 1508 '[draggable="true"], [data-sortable], .sortable-item', 1509 ), 1510 ) 1511 .filter(function (el) { 1512 return !isAccessProScanElement(el); 1513 }) 1514 .slice(0, 5) 1515 .map(function (el) { 1516 return { 1517 html: el.outerHTML.slice(0, 500), 1518 selector: buildScanSelector(el), 1519 }; 1520 }); 1521 1522 if (draggableElements.length > 0) { 1523 incomplete.push({ 1524 id: 'dragging-movements', 1525 impact: 'serious', 1526 tags: ['wcag22aa', 'wcag257'], 1527 description: 1528 'WCAG 2.5.7: Draggable elements must have a single-pointer alternative. Manual verification required.', 1529 helpUrl: 'https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html', 1530 nodes: draggableElements.map(function (e) { 1531 return { 1532 html: e.html, 1533 target: [e.selector], 1534 failureSummary: 1535 'Verify that a keyboard or single-pointer alternative exists for this drag operation.', 1536 }; 1537 }), 1538 }); 1539 } 1540 1541 // ARIA APG: Dialog Pattern 1542 var badDialogs = Array.prototype.slice 1543 .call(document.querySelectorAll('[role="dialog"], [role="alertdialog"]')) 1544 .filter(function (el) { 1545 if (isAccessProScanElement(el)) return false; 1546 return !( 1547 el.hasAttribute('aria-labelledby') || el.hasAttribute('aria-label') 1548 ); 1549 }) 1550 .slice(0, 5) 1551 .map(function (el) { 1552 return { 1553 html: el.outerHTML.slice(0, 500), 1554 selector: buildScanSelector(el), 1555 }; 1556 }); 1557 1558 if (badDialogs.length > 0) { 1559 violations.push({ 1560 id: 'dialog-missing-label', 1561 impact: 'serious', 1562 tags: ['aria-apg', 'wcag2aa'], 1563 description: 1564 'ARIA APG Dialog Pattern: role="dialog" must have aria-labelledby or aria-label', 1565 helpUrl: 'https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/', 1566 nodes: badDialogs.map(function (d) { 1567 return { 1568 html: d.html, 1569 target: [d.selector], 1570 failureSummary: 1571 'Add aria-labelledby pointing to a visible dialog title, or aria-label.', 1572 }; 1573 }), 1574 }); 1575 } 1576 1577 // ARIA APG: Tabs Pattern â tabs must have aria-selected (true on active, false on others
1577) 1578 var badTabs = []; 1579 Array.prototype.slice 1580 .call(document.querySelectorAll('[role="tablist"]')) 1581 .forEach(function (tabList) { 1582 if (isAccessProScanElement(tabList)) return; 1583 var tabs = Array.prototype.slice.call(tabList.querySelectorAll('[role="tab"]')); 1584 var hasAnySelected = tabs.some(function (t) { return t.getAttribute('aria-selected') === 'true'; }); 1585 tabs.forEach(function (tab) { 1586 if (isAccessProScanElement(tab)) return; 1587 if (!tab.hasAttribute('aria-selected')) { 1588 // Detect if this tab appears active (has aria-current, class "active", etc.) 1589 var looksActive = !hasAnySelected && tab.classList.contains('active'); 1590 badTabs.push({ 1591 html: tab.outerHTML.slice(0, 500), 1592 selector: buildScanSelector(tab), 1593 suggestValue: looksActive ? 'true' : 'false', 1594 }); 1595 } 1596 }); 1597 }); 1598 badTabs = badTabs.slice(0, 5); 1599 1600 if (badTabs.length > 0) { 1601 violations.push({ 1602 id: 'tabs-missing-aria-selected', 1603 impact: 'serious', 1604 tags: ['aria-apg', 'wcag2aa'], 1605 description: 1606 'ARIA APG Tabs Pattern: each [role="tab"] must have aria-selected="true" or aria-selected="false"', 1607 helpUrl: 'https://www.w3.org/WAI/ARIA/apg/patterns/tabs/', 1608 nodes: badTabs.map(function (t) { 1609 return { 1610 html: t.html, 1611 target: [t.selector], 1612 failureSummary: 1613 'Tab missing aria-selected. Suggested value: aria-selected="' + (t.suggestValue || 'false') + '"', 1614 }; 1615 }), 1616 }); 1617 } 1618 } catch (err) { 1619 console.warn( 1620 '[AccessPro][AxeScan][storefront] WCAG 2.2 checks error', 1621 err && err.message ? err.message : err, 1622 ); 1623 } 1624 1625 return { violations: violations, incomplete: incomplete }; 1626 } 1627 1628 function runAxeScan() { 1629 if (!window.axe) { 1630 showScanOverlay('Scan failed: axe-core not loaded'); 1631 notifyScanOpener({ 1632 type: 'accesspro-axe-scan-error', 1633 token: token, 1634 message: 'axe-core failed to load', 1635 }); 1636 return; 1637 } 1638 1639 // CRITICAL: Hide overlay before scan to prevent interference with color-contrast/visibility checks 1640 hideOverlay(); 1641 1642 // Run axe WITHOUT overlay visible to get accurate color contrast and visibility results 1643 window.axe 1644 .run(document, { 1645 runOnly: { 1646 type: 'tag', 1647 values: ['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'], 1648 }, 1649 exclude: [ 1650 ['#acp-icon'], 1651 ['#acp-widget'], 1652 ['#acp-virtualKeyboardPopup'], 1653 ['#acp-definition-popup'], 1654 ['#acp-dictionary-toast'], 1655 ['#acp-scan-overlay'], 1656 ['.asw-widget-button-top'], 1657 ], 1658 }) 1659 .then(function (results) { 1660 // Now safe to show overlay after scan completes 1661 showScanOverlay('Processing scan resultsâ¦'); 1662 var extra = runWcag22Checks(); 1663 if (!results.violations) results.violations = []; 1664 if (!results.incomplete) results.incomplete = []; 1665 // Scanner stores customChecks separately; merge into axe arrays so 1666 // buildAxeScanSummary (customChecks: []) still surfaces them. 1667 results.violations = results.violations.concat(extra.violations || []); 1668 results.incomplete = results.incomplete.concat(extra.incomplete || []); 1669 1670 // List rule only: axe often stores just the opening <ul> tag. 1671 // Re-serialize with direct children so the report/AI Fixes show the real issue. 1672 enrichListViolationNodes(results); 1673 1674 notifyScanOpener({ 1675 type: 'accesspro-axe-scan', 1676 token: token, 1677 url: window.location.href, 1678 results: results, 1679 }); 1680 }) 1681 .catch(function (err) { 1682 showScanOverlay('Scan failed'); 1683 notifyScanOpener({ 1684 type: 'accesspro-axe-scan-error', 1685 token: token, 1686 message: err && err.message ? err.message : 'Accessibility scan failed', 1687 }); 1688 }); 1689 } 1690 1691 /** 1692 * Optimize axe `list` node payloads only (no other rules). 1693 * Horizon overflow-list / ul[part=list] failures need children in HTML 1694 * so merchants see role=presentation / non-li children clearly. 1695 */ 1696 function enrichListViolationNodes(results) { 1697 var violations = results && results.violations; 1698 if (!violations || !violations.length) return; 1699 1700 function queryInRoot(root, sel) { 1701 if (!root || !sel) return null; 1702 try { 1703 return root.querySelector(sel); 1704 } catch (e) { 1705 return null; 1706 } 1707 } 1708 1709 function resolveShadowPath(path) { 1710 if (!path) return null; 1711 if (typeof path === 'string') { 1712 return ( 1713 queryInRoot(document, path) || 1714 queryDeepAll(path)[0] || 1715 null 1716 ); 1717 } 1718 if (!Array.isArray(path) || !path.length) return null; 1719 1720 // Nested shadow path: ["host", "inner"] or [["host", "inner"]] 1721 var steps = path; 1722 if (steps.length === 1 && Array.isArray(steps[0])) { 1723 steps = steps[0]; 1724 } 1725 1726 var ctx = document; 1727 var el = null; 1728 for (var i = 0; i < steps.length; i++) { 1729 var step = steps[i]; 1730 if (Array.isArray(step)) { 1731 el = resolveShadowPath(step); 1732 } else { 1733 el = queryInRoot(ctx, String(step)); 1734 if (!el && ctx === document) { 1735 el = queryDeepAll(String(step))[0] || null; 1736 } 1737 } 1738 if (!el) return null; 1739 ctx = el.shadowRoot || el; 1740 } 1741 return el; 1742 } 1743 1744 function queryDeepAll(sel) { 1745 var out = []; 1746 function walk(root) { 1747 if (!root || !root.querySelectorAll) return; 1748 try { 1749 Array.prototype.push.apply(out, root.querySelectorAll(sel)); 1750 } catch (e) { 1751 /* invalid selector */ 1752 } 1753 var all = root.querySelectorAll ? root.querySelectorAll('*') : []; 1754 for (var i = 0; i < all.length; i++) { 1755 if (all[i].shadowRoot) walk(all[i].shadowRoot); 1756 } 1757 } 1758 walk(document); 1759 return out; 1760 } 1761 1762 function serializeChildSnippet(child) { 1763 if (!child || !child.tagName) return ''; 1764 var tag = child.tagName.toLowerCase(); 1765 var role = (child.getAttribute && child.getAttribute('role')) || ''; 1766 var part = (child.getAttribute && child.getAttribute('part')) || ''; 1767 var cls = (child.getAttribute && child.getAttribute('class')) || ''; 1768 var open = 1769 '<' + 1770 tag + 1771 (role ? ' role="' + role + '"' : '') + 1772 (part ? ' part="' + part + '"' : '') + 1773 (cls 1774 ? ' class="' + 1775 String(cls) 1776 .trim() 1777 .split(/\s+/) 1778 .slice(0, 3) 1779 .join(' ') + 1780 '"' 1781 : '') + 1782 '>'; 1783 var text = (child.textContent || '').replace(/\s+/g, ' ').trim().slice(0, 40); 1784 return open + (text ? text : 'â¦') + '</' + tag + '>'; 1785 } 1786 1787 function serializeListHtml(listEl) { 1788 if (!listEl || !listEl.tagName) return ''; 1789 var tag = listEl.tagName.toLowerCase(); 1790 if (tag !== 'ul' && tag !== 'ol') return ''; 1791 var openMatch = String(listEl.outerHTML || '').match(/^<[^>]+>/); 1792 var openTag = openMatch ? openMatch[0] : '<' + tag + '>'; 1793 var children = Array.prototype.slice.call(listEl.children || []).slice(0, 10); 1794 if (!children.length) return openTag; 1795 var lines = children.map(function (child) { 1796 return ' ' + serializeChildSnippet(child); 1797 }); 1798 if ((listEl.children || []).length > 10) { 1799 lines.push(' <!-- ⦠' + (listEl.children.length - 10) + ' more -->'); 1800 } 1801 return openTag + '\n' + lines.join('\n') + '\n</' + tag + '>'; 1802 } 1803 1804 function findListFallback() { 1805 var candidates = queryDeepAll('ul[part="list"], overflow-list ul, ul, ol'); 1806 var withBad = candidates.filter(function (listEl) { 1807 return Array.prototype.some.call(listEl.children || [], function (child) { 1808 var role = (child.getAttribute && child.getAttribute('role')) || ''; 1809 var t = (child.tagName || '').toLowerCase(); 1810 return ( 1811 role === 'presentation' || 1812 role === 'none' || 1813 (t !== 'li' && t !== 'script' && t !== 'template' && t !== 'style') 1814 ); 1815 }); 1816 }); 1817 return withBad.length === 1 ? withBad[0] : null; 1818 } 1819 1820 violations.forEach(function (v) { 1821 if (!v || v.id !== 'list') return;
1822 (v.nodes || []).forEach(function (node) { 1823 if (!node) return; 1824 var hintHtml = String(node.html || ''); 1825 var el = resolveShadowPath(node.target); 1826 1827 // Flat axe targets like ["ul"] are too generic â prefer part=list from html hint. 1828 if ( 1829 el && 1830 /part\s*=\s*["']list["']/i.test(hintHtml) && 1831 !(el.getAttribute && el.getAttribute('part') === 'list') 1832 ) { 1833 var partLists = queryDeepAll('ul[part="list"]'); 1834 if (partLists.length === 1) el = partLists[0]; 1835 else if (partLists.length > 1) { 1836 var badPart = partLists.filter(function (listEl) { 1837 return Array.prototype.some.call(listEl.children || [], function (child) { 1838 var role = (child.getAttribute && child.getAttribute('role')) || ''; 1839 return role === 'presentation' || role === 'none'; 1840 }); 1841 }); 1842 if (badPart.length === 1) el = badPart[0]; 1843 } 1844 } 1845 1846 if (el && el.tagName) { 1847 var t = el.tagName.toLowerCase(); 1848 if (t !== 'ul' && t !== 'ol' && el.closest) { 1849 el = el.closest('ul, ol') || el; 1850 } 1851 } 1852 if (!el || !el.tagName || !/^(UL|OL)$/.test(el.tagName)) { 1853 el = findListFallback(); 1854 } 1855 if (!el) return; 1856 1857 var better = serializeListHtml(el); 1858 if (better && better.length > hintHtml.length) { 1859 node.html = better.slice(0, 2500); 1860 } 1861 1862 // Prefer a stable, actionable selector for Horizon chrome lists. 1863 if (el.getAttribute && el.getAttribute('part') === 'list') { 1864 node.target = ['ul[part="list"]']; 1865 } 1866 }); 1867 }); 1868 } 1869 1870 function notifyScanOpener(payload) { 1871 if (window.opener && payload.type === 'accesspro-axe-scan-error') { 1872 var jobId = new URLSearchParams(window.location.search).get('acp_job'); 1873 showScanOverlay('Scan failed'); 1874 window.opener.postMessage( 1875 { 1876 type: 'accesspro-axe-scan-progress', 1877 jobId: jobId, 1878 error: payload.message || 'Accessibility scan failed', 1879 }, 1880 '*', 1881 ); 1882 setTimeout(function () { 1883 window.close(); 1884 }, 400); 1885 return; 1886 } 1887 submitScanResult(payload); 1888 } 1889 1890 var script = document.createElement('script'); 1891 // cdnjs only goes up to 4.10.3; jsDelivr serves 4.11.1 (matches accessibility-scanner). 1892 script.src = 'https://cdn.jsdelivr.net/npm/[email protected]/axe.min.js'; 1893 script.onload = function () { 1894 waitForFullPageLoad().then(runAxeScan); 1895 }; 1896 script.onerror = function () { 1897 notifyScanOpener({ 1898 type: 'accesspro-axe-scan-error', 1899 token: token, 1900 message: 'Failed to load axe-core', 1901 }); 1902 }; 1903 document.head.appendChild(script); 1904 })(); 1905</script>
1905 1906 1907 1908<style> 1909 .accesspro-icon { 1910 display: inline-flex; 1911 flex-direction: column; 1912 align-items: center; 1913 gap: 4px; 1914 cursor: pointer; 1915 text-decoration: none; 1916 vertical-align: middle; 1917 color: var(--acp-trigger-color, #23185c); 1918 } 1919 1920 /* Icon-only triggers should not reserve a text line box. */ 1921 .accesspro-icon[icon='true']:not(.acp-trigger--has-text) { 1922 line-height: 0; 1923 } 1924 1925 .accesspro-icon .asw-menu-btn-container { 1926 flex-shrink: 0; 1927 } 1928 1929 /* The cloned icon is inert; the host element is the control. */ 1930 .accesspro-icon .asw-menu-btn-container, 1931 .accesspro-icon .asw-menu-btn { 1932 pointer-events: none; 1933 } 1934</style>
1935<script> 1936 (function () { 1937 var SELECTOR = '.accesspro-icon'; 1938 var BOUND = 'acpTriggerBound'; 1939 var FILLED = 'acpTriggerFilled'; 1940 var settings = window.accessProWidgetSettings || {}; 1941 var inlineMode = !!settings.hide_floating_icon; 1942 var fallbackReady = inlineMode; 1943 document.documentElement.style.setProperty( 1944 '--acp-trigger-color', 1945 settings.icon_color_fill || '#23185c' 1946 ); 1947 1948 /* ---- open the widget ------------------------------------------------ */ 1949 /* main.js is deferred, so iconInstance may not exist on an early click. */ 1950 function openWidget(event) { 1951 if (event) event.preventDefault(); 1952 if (window.iconInstance) { 1953 window.iconInstance.toggleWidget(); 1954 return; 1955 } 1956 var waited = 0; 1957 var timer = setInterval(function () { 1958 if (window.iconInstance) { 1959 clearInterval(timer); 1960 window.iconInstance.toggleWidget(); 1961 } else if ((waited += 100) >= 10000) { 1962 clearInterval(timer); 1963 console.error('[AccessPro] Widget did not load â cannot open menu.'); 1964 } 1965 }, 100); 1966 } 1967 1968 /* ---- clone the floating icon ---------------------------------------- */ 1969 function buildIcon() { 1970 var source = document.querySelector('#Access-Pro-Icon .asw-menu-btn-container'); 1971 if (!source) return null; 1972 1973 var clone = source.cloneNode(true); 1974 1975 // Strip ids: the widget mutates apMenuIconStroke / apMenuIconFill by id 1976 // when contrast modes change, and duplicates would shadow the original. 1977 clone.removeAttribute('id'); 1978 clone.querySelectorAll('[id]').forEach(function (node) { 1979 node.removeAttribute('id'); 1980 }); 1981 1982 // The dismiss "X" and loading dots belong to the floating icon only. 1983 clone.querySelectorAll('.asw-hide-widget-icon, .acp-floating-dots').forEach(function (node) { 1984 node.remove(); 1985 }); 1986 1987 // A <button> nested inside the merchant's <a>
1987 is invalid HTML. Swap it 1988 // for a <span> carrying the same classes so the widget CSS still applies. 1989 var button = clone.querySelector('.asw-menu-btn'); 1990 if (button) { 1991 var span = document.createElement('span'); 1992 span.className = button.className; 1993 span.setAttribute('style', button.getAttribute('style') || ''); 1994 span.setAttribute('aria-hidden', 'true'); 1995 while (button.firstChild) span.appendChild(button.firstChild); 1996 button.parentNode.replaceChild(span, button); 1997 } 1998 1999 return clone; 2000 } 2001 2002 2003 /* ---- fallback: build the icon from settings ------------------------- */ 2004 /* Used when the floating icon is not in the DOM â the widget skips 2005 render() entirely if the visitor dismissed it, if a page/country filter 2006 bails out of init(), or if trigger display is set to title-only. 2007 Geometry below mirrors render() in main.js exactly. */ 2008 var GLYPHS = { 2009 default: '<svg class="asw-main-icon" xmlns="http://www.w3.org/2000/svg" fill="#ffffff" style="height: 45%; width: 45%; fill: #ffffff" viewBox="0 0 512 512" aria-hidden="true" focusable="false"><path d="M256,112a56,56,0,1,1,56-56A56.06,56.06,0,0,1,256,112Z" /><path d="M432,112.8l-.45.12h0l-.42.13c-1,.28-2,.58-3,.89-18.61,5.46-108.93,30.92-172.56,30.92-59.13,0-141.28-22-167.56-29.47a73.79,73.79,0,0,0-8-2.58c-19-5-32,14.3-32,31.94,0,17.47,15.7,25.79,31.55,31.76v.28l95.22,29.74c9.73,3.73,12.33,7.54,13.6,10.84,4.13,10.59.83,31.56-.34,38.88l-5.8,45L150.05,477.44q-.15.72-.27,1.47l-.23,1.27h0c-2.32,16.15,9.54,31.82,32,31.82,19.6,0,28.25-13.53,32-31.94h0s28-157.57,42-157.57,42.84,157.57,42.84,157.57h0c3.75,18.41,12.4,31.94,32,31.94,22.52,0,34.38-15.74,32-31.94-.21-1.38-.46-2.74-.76-4.06L329,301.27l-5.79-45c-4.19-26.21-.82-34.87.32-36.9a1.09,1.09,0,0,0,.08-.15c1.08-2,6-6.48,17.48-10.79l89.28-31.21a16.9,16.9,0,0,0,1.62-.52c16-6,32-14.3,32-31.93S451,107.81,432,112.8Z" /></svg>', 2010 wheelchair: '<svg class="asw-main-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 960" fill="#ffffff" aria-hidden="true" focusable="false"> <path d="M480 240q-33 0-56.5-23.5T400 160q0-33 23.5-56.5T480 80q33 0 56.5 23.5T560 160q0 33-23.5 56.5T480 240ZM680 880V680H480q-33 0-56.5-23.5T400 600V360q0-33 23.5-56.5T480 280q24 0 41.5 10.5T559 324q55 66 99.5 90.5T760 480v80q-53 0-107-23t-93-55v138h120q33 0 56.5 23.5T760 680v220h-80ZM400 880q-83 0-141.5-58.5T200 680q0-72 45.5-127T360 484v82q-35 14-57.5 44.5T280 680q0 50 35 85t85 35q39 0 69.5-22.5T514 720h82q-14 69-69 114.5T400 880Z" /> </svg>', 2011 blind: '<svg class="asw-main-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960" fill="#ffffff" style="fill: #ffffff" aria-hidden="true" focusable="false"> <path d="m240-60-64-48 104-139v-213q0-31 5.5-68.5T300-596l-60 34v142h-80v-188l216-123q8-5 17-7t19-2q24 0 44 12t30 33l31 67q20 44 61 66t102 22v80h-39L860-78l-35 20-237-413q-40-13-72.5-37.5T460-568q-10 29-15.5 66.5T441-432l79 112v260h-80v-200l-71-102-9 142L240-60Zm220-700q-33 0-56.5-23.5T380-840q0-33 23.5-56.5T460-920q33 0 56.5 23.5T540-840q0 33-23.5 56.5T460-760Z" /> </svg>', 2012 eye: '<svg class="asw-main-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960" fill="#ffffff" style="fill: #ffffff" aria-hidden="true" focusable="false"><path d="m644-428-58-58q9-47-27-88t-93-32l-58-58q17-8 34.5-12t37.5-4q75 0 127.5 52.5T660-500q0 20-4 37.5T644-428Zm128 126-58-56q38-29 67.5-63.5T832-500q-50-101-143.5-160.5T480-720q-29 0-57 4t-55 12l-62-62q41-17 84-25.5t90-8.5q151 0 269 83.5T920-500q-23 59-60.5 109.5T772-302Zm20 246L624-222q-35 11-70.5 16.5T480-200q-151 0-269-83.5T40-500q21-53 53-98.5t73-81.5L56-792l56-56 736 736-56 56ZM222-624q-29 26-53 57t-41 67q50 101 143.5 160.5T480-280q20 0 39-2.5t39-5.5l-36-38q-11 3-21 4.5t-21 1.5q-75 0-127.5-52.5T300-500q0-11 1.5-21t4.5-21l-84-82Zm319 93Zm-151 75Z" /></svg>', 2013 accStraight: '<svg class="asw-main-icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" fill="#ffffff" style="fill: #ffffff" aria-hidden="true" focusable="false"><path d="M480-720q-33 0-56.5-23.5T400-800q0-33 23.5-56.5T480-880q33 0 56.5 23.5T560-800q0 33-23.5 56.5T480-720ZM360-80v-520H120v-80h720v80H600v520h-80v-240h-80v240h-80Z" /></svg>', 2014 settings: '<svg class="asw-main-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960" fill="#ffffff" style="fill: #ffffff" aria-hidden="true" focusable="false">
2014<path d="m370-80-16-128q-13-5-24.5-12T307-235l-119 50L78-375l103-78q-1-7-1-13.5v-27q0-6.5 1-13.5L78-585l110-190 119 50q11-8 23-15t24-12l16-128h220l16 128q13 5 24.5 12t22.5 15l119-50 110 190-103 78q1 7 1 13.5v27q0 6.5-2 13.5l103 78-110 190-118-50q-11 8-23 15t-24 12L590-80H370Zm70-80h79l14-106q31-8 57.5-23.5T639-327l99 41 39-68-86-65q5-14 7-29.5t2-31.5q0-16-2-31.5t-7-29.5l86-65-39-68-99 42q-22-23-48.5-38.5T533-694l-13-106h-79l-14 106q-31 8-57.5 23.5T321-633l-99-41-39 68 86 64q-5 15-7 30t-2 32q0 16 2 31t7 30l-86 65 39 68 99-42q22 23 48.5 38.5T427-266l13 106Zm42-180q58 0 99-41t41-99q0-58-41-99t-99-41q-59 0-99.5 41T342-480q0 58 40.5 99t99.5 41Zm-2-140Z" /></svg>' 2015 }; 2016 2017 var SIZES = { 2018 small: 40, '0.5x': 40, 2019 medium: 50, '1x': 50, default: 50, 2020 large: 60, '1.5x': 60, 2021 extraLarge: 75, '2x': 75 2022 }; 2023 2024 function buildIconFromSettings() { 2025 var s = window.accessProWidgetSettings || {}; 2026 var style = s.icon_style || 'thick'; 2027 var square = s.icon_shape === 'square'; 2028 // Defaults must match mergeSettings() in main.js and DEFAULT_SETTINGS in 2029 // app/constants/settings.js â both use #23185c for stroke AND fill â so a 2030 // metafield missing these keys renders identically on either path. 2031 var stroke = s.icon_color_stroke || '#23185c'; 2032 var fill = s.icon_color_fill || '#23185c'; 2033 var px = SIZES[s.icon_size] || 50; 2034 var solid = style === 'solid'; 2035 var thin = style === 'thin'; 2036 var shapes = ''; 2037 2038 if (square) { 2039 var sizes = [ 2040 [solid ? 100 : 98, stroke, 12], 2041 [solid ? 0 : thin ? 86 : 82, '#ffffff', 10], 2042 [solid || thin ? 80 : 70, fill, 8] 2043 ];
2044 sizes.forEach(function (d) { 2045 if (!d[0]) return; 2046 var off = (100 - d[0]) / 2; 2047 shapes += '<rect x="' + off + '" y="' + off + '" width="' + d[0] + '" height="' + d[0] + 2048 '" rx="' + d[2] + '" ry="' + d[2] + '" fill="' + d[1] + '" />'; 2049 }); 2050 } else { 2051 [ 2052 [solid ? 50 : 49, stroke], 2053 [solid ? 0 : thin ? 43 : 41, '#ffffff'], 2054 [solid || thin ? 40 : 35, fill] 2055 ].forEach(function (d) { 2056 shapes += '<circle cx="50" cy="50" r="' + d[0] + '" fill="' + d[1] + '" />'; 2057 }); 2058 } 2059 2060 var name = GLYPHS[s.icon] ? s.icon : 'default'; 2061 var box = document.createElement('div'); 2062 box.className = 'asw-menu-btn-container'; 2063 box.setAttribute('style', 'position:relative;width:' + px + 'px;height:' + px + 'px;'); 2064 // The widget stylesheet may not be loaded when render() never ran, so 2065 // every layout-critical rule is inlined rather than left to the classes. 2066 box.innerHTML = 2067 '<span class="asw-menu-btn' + (square ? ' asw-menu-btn--square' : '') + '" aria-hidden="true"' + 2068 ' style="position:relative;display:flex;align-items:center;justify-content:center;' + 2069 'width:100%;height:100%;background:transparent;border:none;padding:0;margin:0;' + 2070 'border-radius:' + (square ? '12%' : '50%') + ';">' + 2071 '<svg class="asw-outer-svg" viewBox="0 0 100 100" aria-hidden="true" focusable="false"' + 2072 ' style="width:100%;height:100%;display:block;">' + shapes + '</svg>' + 2073 GLYPHS[name] + '</span>'; 2074 2075 var glyph = box.querySelector('.asw-main-icon'); 2076 if (glyph) { 2077 // .asw-main-icon sizes to 50% via CSS; the default glyph overrides to 45% inline. 2078 var pct = name === 'default' ? '45%' : '50%'; 2079 glyph.setAttribute( 2080 'style', 2081 'position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);' + 2082 'width:' + pct + ';height:' + pct + ';fill:#ffffff;z-index:100;' 2083 ); 2084 } 2085 return box; 2086 } 2087 2088 /* Name from the host only. Text inside aria-hidden (the cloned icon) does not count. */ 2089 function triggerNeedsName(el) { 2090 if ((el.getAttribute('aria-label') || '').trim()) return false; 2091 if ((el.getAttribute('aria-labelledby') || '').trim()) return false; 2092 if ((el.getAttribute('title') || '').trim()) return false; 2093 var node = el.firstChild; 2094 while (node) { 2095 if (node.nodeType === 3) { 2096 if (node.textContent.trim()) return false; 2097 } else if (node.nodeType === 1 && node.getAttribute('aria-hidden') !== 'true') { 2098 if (!triggerNeedsName(node)) return false; 2099 } 2100 node = node.nextSibling; 2101 } 2102 return true; 2103 } 2104 2105 function ensureTriggerName(el) { 2106 if (triggerNeedsName(el)) { 2107 el.setAttribute('aria-label', 'Open Accessibility Menu'); 2108 } 2109 } 2110 2111 /* ---- wire one element ----------------------------------------------- */ 2112 function bind(el) { 2113 if (el.dataset[BOUND]) return; 2114 el.dataset[BOUND] = '1'; 2115 2116 el.addEventListener('click', openWidget); 2117 el.addEventListener('keydown', function (event) { 2118 if (event.key === 'Enter' || event.key === ' ') openWidget(event); 2119 }); 2120 2121 // A non-anchor host (div/span) needs explicit button semantics. 2122 var tag = el.tagName.toLowerCase(); 2123 if (tag !== 'a' && tag !== 'button') { 2124 if (!el.hasAttribute('role')) el.setAttribute('role', 'button'); 2125 if (!el.hasAttribute('tabindex')) el.setAttribute('tabindex', '0'); 2126 } 2127 2128 if (el.textContent.trim()) el.classList.add('acp-trigger--has-text'); 2129 ensureTriggerName(el); 2130 } 2131 2132 function fillIcon(el, allowFallback) { 2133 if (el.dataset[FILLED]) return true; 2134 if (el.getAttribute('icon') !== 'true') return true; 2135 2136 // Prefer cloning the live icon; fall back to rebuilding from settings. 2137 var icon = buildIcon(); 2138 if (!icon && (allowFallback || inlineMode)) icon = buildIconFromSettings(); 2139 if (!icon) return false; 2140 2141 // The clone's size lives only in the container's inline style. If the 2142 // widget rendered without one, size it from settings so it cannot 2143 // collapse to zero height inside the merchant's layout. 2144 if (!/\bheight\s*:/.test(icon.getAttribute('style') || '')) { 2145 var px = SIZES[(window.accessProWidgetSettings || {}).icon_size] || 50; 2146 icon.style.position = 'relative'; 2147 icon.style.width = px + 'px'; 2148 icon.style.height = px + 'px'; 2149 } 2150 2151 el.insertBefore(icon, el.firstChild); 2152 el.dataset[FILLED] = '1'; 2153 ensureTriggerName(el); 2154 return true; 2155 } 2156 2157 /* ---- scan ------------------------------------------------------------ */
2158 /* Clicks are wired immediately so the trigger works before the icon 2159 renders; icons are filled in once the floating icon exists. */ 2160 var pendingIcons = false; 2161 2162 function scan(allowFallback) { 2163 pendingIcons = false; 2164 document.querySelectorAll(SELECTOR).forEach(function (el) { 2165 bind(el); 2166 if (!fillIcon(el, allowFallback)) pendingIcons = true; 2167 }); 2168 } 2169 2170 function start() { 2171 scan(inlineMode); 2172 2173 // Inline mode hides the floating icon, so build from settings immediately. 2174 if (inlineMode) { 2175 // console.log('[AccessPro] Inline triggers â using widget settings for icons'); 2176 } 2177 2178 // The floating icon only renders after the settings request resolves and 2179 // the widget chunk loads, so poll until it appears. If it never does, 2180 // stop waiting and build the icon from settings instead. 2181 var FALLBACK_AFTER = 2500; 2182 var waited = 0; 2183 var timer = setInterval(function () { 2184 if (!pendingIcons) { 2185 clearInterval(timer); 2186 return; 2187 } 2188 waited += 200; 2189 if (waited < FALLBACK_AFTER) { 2190 scan(false); 2191 return; 2192 } 2193 fallbackReady = true; 2194 clearInterval(timer); 2195 scan(true); 2196 if (pendingIcons) { 2197 console.warn('[AccessPro] Could not render inline icons.'); 2198 } 2199 }, 200); 2200 2201 // Catch triggers added later (theme editor re-renders, dynamic sections). 2202 // Debounced: the widget itself mutates the DOM heavily as it renders. 2203 if (window.MutationObserver) { 2204 var queued = false; 2205 new window.MutationObserver(function () { 2206 if (queued) return; 2207 queued = true; 2208 requestAnimationFrame(function () { 2209 queued = false; 2210 scan(fallbackReady || inlineMode); 2211 }); 2212 }).observe(document.body, { childList: true, subtree: true }); 2213 } 2214 } 2215 2216 if (document.readyState === 'loading') { 2217 document.addEventListener('DOMContentLoaded', start); 2218 } else { 2219 start(); 2220 } 2221 })(); 2222</script>
2222 2223 2224 2225</div>
2225<script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
2225 2226</body> 2227</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.