PageSourceSearch

https://hollandandbarrett.gi/pages/stores

html hollandandbarrett.gi collected 2026-10-06 21:06:53 UTC 156,070 bytes, 2,227 lines download raw bytes

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 &amp; Barrett Gibraltar</title>
53      
54       
55
56
57<meta name="description" content="Discover the Holland &amp;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 &amp; Barrett Gibraltar,Holland &amp; Barrett Gibraltar,hollandandbarrett.gi"/> --><meta name="author" content="The4"><meta property="og:site_name" content="Holland &amp; Barrett Gibraltar">
59<meta property="og:url" content="https://hollandandbarrett.gi/pages/stores">
60<meta property="og:title" content="Find Our Stores - Holland &amp; Barrett Gibraltar">
61<meta property="og:type" content="website">
62<meta property="og:description" content="Discover the Holland &amp; 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 &amp; Barrett Gibraltar">
64<meta name="twitter:description" content="Discover the Holland &amp; 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&amp;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 &amp; 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 &amp; 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 &amp; 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&region_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 &amp; 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="[{&quot;supports_subs&quot;:false,&quot;supports_def_opts&quot;:false,&quot;name&quot;:&quot;paypal&quot;,&quot;wallet_params&quot;:{&quot;shopId&quot;:83272630548,&quot;countryCode&quot;:&quot;GI&quot;,&quot;merchantName&quot;:&quot;Holland \u0026 Barrett Gibraltar&quot;,&quot;phoneRequired&quot;:false,&quot;companyRequired&quot;:false,&quot;shippingType&quot;:&quot;shipping&quot;,&quot;shopifyPaymentsEnabled&quot;:false,&quot;hasManagedSellingPlanState&quot;:null,&quot;requiresBillingAgreement&quot;:false,&quot;gatewayType&quot;:&quot;CONNECTED&quot;,&quot;merchantId&quot;:null,&quot;sdkUrl&quot;:&quot;https://www.paypal.com/sdk/js?components=buttons\u0026commit=false\u0026currency=GBP\u0026locale=en_US\u0026client-id=AexZEtAxk09Ncgj6FSWFFyGKbxxAZ_LTyJ2DPdJWl1YUlecinmc5AfIaRF2qYjWlusWahlzz6SVkY5Ci\u0026intent=capture&quot;,&quot;serviceableCountryCodes&quot;:[&quot;AE&quot;,&quot;AT&quot;,&quot;AU&quot;,&quot;BE&quot;,&quot;CA&quot;,&quot;CH&quot;,&quot;CZ&quot;,&quot;DE&quot;,&quot;DK&quot;,&quot;ES&quot;,&quot;FI&quot;,&quot;FR&quot;,&quot;GB&quot;,&quot;GI&quot;,&quot;HK&quot;,&quot;IE&quot;,&quot;IL&quot;,&quot;IT&quot;,&quot;JP&quot;,&quot;KR&quot;,&quot;MY&quot;,&quot;NL&quot;,&quot;NO&quot;,&quot;NZ&quot;,&quot;PL&quot;,&quot;PT&quot;,&quot;SE&quot;,&quot;SG&quot;,&quot;US&quot;]}}]" access-token="775c28f1ddb02396c18ca9a1d4305408" buyer-country="GI" buyer-locale="en" buyer-currency="GBP" shop-id="83272630548" cart-id="2ef1f1d5501265f668259c5846e7b50d" enabled-flags="[&quot;1172c16a&quot;,&quot;a1d1f9a1&quot;,&quot;f5afabb3&quot;,&quot;370070f3&quot;]" > <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'>&nbsp</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 &amp; 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.