1<!doctype html> 2<!--[if IE 8]><html class="no-js lt-ie9" lang="en"> <![endif]--> 3<!--[if IE 9 ]><html class="ie9 no-js"> <![endif]--> 4<!--[if (gt IE 9)|!(IE)]><!--> <html class="no-js"> <!--<![endif]--> 5<head> 6 7 <!-- Basic page needs ================================================== --> 8 <meta charset="utf-8"> 9 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 10 11 12 13 <!-- Title and description ================================================== --> 14 <title> 15 About Us – Macaron Parlour 16 </title> 17 18 19 <meta name="description" content="Christina Ha has always been a baker, but never set out to do it for a living. Some of her earliest and best memories are from shaping cookies and talking to her mom while waiting for them to rise and caramelize in the oven. Baking has always been a hobby of hers and she had fantasies about baking all day. They were "> 20 21 22 <!-- Helpers ================================================== --> 23 <!-- /snippets/social-meta-tags.liquid --> 24 25 26 <meta property="og:type" content="website"> 27 <meta property="og:title" content="About Us"> 28 29 30<meta property="og:url" content="https://macaronparlour.com/pages/about-us"> 31<meta property="og:site_name" content="Macaron Parlour"> 32 33 34 35 36 37 38 <meta name="twitter:card" content="summary"> 39 40 41 42 <link rel="canonical" href="https://macaronparlour.com/pages/about-us"/> 43 44 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 45 46 <meta name="theme-color" content="#333333"> 47 48 <!-- CSS ================================================== --> 49 <link href="//macaronparlour.com/cdn/shop/t/3/assets/plugins.css?v=33919233897457533671780933516" rel="stylesheet" type="text/css" media="all" /> 50 <link href="//macaronparlour.com/cdn/shop/t/3/assets/timber.scss.css?v=28062119093687712181780933395" rel="stylesheet" type="text/css" media="all" /> 51 52 53 54 55 56 <!-- Header hook for plugins ================================================== --> 57
57<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script>
57<meta name="facebook-domain-verification" content="9v87eexzrhhbuc25kdiixz1do9k7nk"> 58<meta name="facebook-domain-verification" content="4olim26ske3ulrz7yyhgwnwe9188b6"> 59<meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/41049948314/digital_wallets/dialog"> 60<meta id="in-context-paypal-metadata" data-shop-id="41049948314" data-venmo-supported="false" data-environment="production" data-locale="en_US" data-paypal-v4="true" data-currency="USD"> 61<link rel="ucp" href="/.well-known/ucp" version="2026-08-25">
61<script async="async" src="/checkouts/internal/preloads.js?locale=en-US"></script>
61 62<link rel="preconnect" href="https://shop.app" crossorigin="anonymous">
63<script async="async" src="https://shop.app/checkouts/internal/preloads.js?locale=en-US&shop_id=41049948314" crossorigin="anonymous"></script>
vendor: 1 bytes, line 63
63
64<script id="apple-pay-shop-capabilities" type="application/json">{"shopId":41049948314,"countryCode":"US","currencyCode":"USD","merchantCapabilities":["supports3DS"],"merchantId":"gid:\/\/shopify\/Shop\/41049948314","merchantName":"Macaron Parlour","requiredBillingContactFields":["postalAddress","email"],"requiredShippingContactFields":["postalAddress","email"],"shippingType":"shipping","supportedNetworks":["visa","masterCard","amex","discover","elo","jcb"],"total":{"type":"pending","label":"Macaron Parlour","amount":"1.00"},"shopifyPaymentsEnabled":true,"supportsSubscriptions":true}</script>
vendor: 1 bytes, line 64
64
65<script id="shopify-features" type="application/json">{"accessToken":"1a345ab5bcd5929ae1f1b278b42384a4","betas":["rich-media-storefront-analytics"],"domain":"macaronparlour.com","predictiveSearch":true,"shopId":41049948314,"locale":"en"}</script>
vendor: 1 bytes, line 65
65
66<script>var Shopify = Shopify || {}; 67Shopify.shop = "mparlour.myshopify.com"; 68Shopify.locale = "en"; 69Shopify.currency = {"active":"USD","rate":"1.0"}; 70Shopify.country = "US"; 71Shopify.theme = {"name":"Flow","id":101784944794,"schema_name":"Flow","schema_version":"16.3.4","theme_store_id":801,"role":"main"}; 72Shopify.theme.handle = "null"; 73Shopify.theme.style = {"id":null,"handle":null}; 74Shopify.cdnHost = "macaronparlour.com/cdn"; 75Shopify.routes = Shopify.routes || {}; 76Shopify.routes.root = "/"; 77Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js"; 78Shopify.SignInWithShop = Shopify.SignInWithShop || {}; 79Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {}; 80Shopify.SignInWithShop.User.recognized = false;</script>
vendor: 1 bytes, line 80
80
81<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
vendor: 1 bytes, line 81
81
82<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 82
82
83<script> 84 window.ShopifyPay = window.ShopifyPay || {}; 85 window.ShopifyPay.apiHost = "shop.app\/pay"; 86 window.ShopifyPay.redirectState = null; 87</script>
vendor: 1 bytes, line 87
87
88<script> 89 window.Shopify = window.Shopify || {}; 90 window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {}; 91 window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.25 }; 92 window.Shopify.SignInWithShop.eligible = true; 93</script>
vendor: 1 bytes, line 93
93
94<script id="shop-js-analytics" type="application/json">{"pageType":"page"}</script>
vendor: 1 bytes, line 94
94
95<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 95
95
96<script type="module"> 97 await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"); 98 99 window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true}); 100 101</script>
vendor: 1 bytes, line 101
101
102<script> 103 window.Shopify = window.Shopify || {}; 104 if (!window.Shopify.featureAssets) window.Shopify.featureAssets = {}; 105 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"]}; 106</script>
vendor: 1 bytes, line 106
106
107<script>(function() { 108 var isLoaded = false; 109 function asyncLoad() { 110 if (isLoaded) return; 111 isLoaded = true; 112 var urls = ["https:\/\/accessibly.onthemapmarketing.com\/public\/widget\/run.js?shop=mparlour.myshopify.com","https:\/\/a.mailmunch.co\/widgets\/site-792860-13ff4e71a381df67c7bfb5ea0cc651efc9a99c81.js?shop=mparlour.myshopify.com"]; 113 for (var i = 0; i < urls.length; i++) { 114 var s = document.createElement('script'); 115 s.type = 'text/javascript'; 116 s.async = true; 117 s.src = urls[i]; 118 var x = document.getElementsByTagName('script')[0]; 119 x.parentNode.insertBefore(s, x); 120 } 121 }; 122 if(window.attachEvent) { 123 window.attachEvent('onload', asyncLoad); 124 } else { 125 window.addEventListener('load', asyncLoad, false); 126 } 127})();</script>
vendor: 1 bytes, line 127
127
128<script id="__st">var __st={"a":41049948314,"offset":-14400,"reqid":"ab7ce6b0-c175-4281-b554-f744d653cdd1-1790401135","pageurl":"macaronparlour.com\/pages\/about-us","s":"pages-60734800026","u":"91e5c2d81ca9","p":"page","rtyp":"page","rid":60734800026};</script>
vendor: 1 bytes, line 128
128
129<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
vendor: 1 bytes, line 129
129
130<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,!1)}();</script>
vendor: 1 bytes, line 130
130
131<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" defer="defer" src="//macaronparlour.com/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
vendor: 1 bytes, line 131
131
132<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 = "//macaronparlour.com/cdn/shopifycloud/storefront/assets/storefront/autosizes-84416378.js";(document.head || document.documentElement).appendChild(autosizesScript);}window.ShopifyAnalytics = window.ShopifyAnalytics || {};window.ShopifyAnalytics.performance = window.ShopifyAnalytics.performance || {};(function () {var LONG_FRAME_THRESHOLD = 50;var longAnimationFrames = [];var activeRafId = null;function collectLongFrames() {var previousTime = null;function rafMonitor(now) {if (activeRafId === null) {return;}var delta = now - previousTime;if (delta > LONG_FRAME_THRESHOLD) {longAnimationFrames.push({startTime: previousTime,endTime: now,});}previousTime = now;activeRafId = requestAnimationFrame(rafMonitor);}previousTime = performance.now();activeRafId = requestAnimationFrame(rafMonitor);}if (!window.PerformanceObserver?.supportedEntryTypes?.includes('long-animation-frame')) {collectLongFrames();var timeoutId = setTimeout(function () {cancelAnimationFrame(activeRafId);}, 10000);window.ShopifyAnalytics.performance.getLongAnimationFrames = function (stopCollection) {if (stopCollection === undefined) {stopCollection = false;}if (stopCollection) {clearTimeout(timeoutId);cancelAnimationFrame(activeRafId);}return longAnimationFrames;};}})();})();</script>
132<script crossorigin="anonymous" defer="defer" src="//macaronparlour.com/cdn/shopifycloud/storefront/assets/shopify_pay/storefront-616277c7.js?v=20250812"></script>
vendor: 1 bytes, line 132
132
133<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 133
133
134<script> 135 window.Shopify = window.Shopify || {}; 136 window.Shopify.MCP = window.Shopify.MCP || {}; 137 window.Shopify.MCP.enabled = true; 138 window.Shopify.MCP.shop = "mparlour.myshopify.com"; 139 window.Shopify.MCP.mcpEndpoint = "https:\/\/macaronparlour.com\/api\/mcp"; 140 window.Shopify.MCP.tools = [{"name":"search_shop_policies_and_faqs","description":"Used to get facts about the stores policies, products, or services.\nSome examples of questions you can ask are:\n - What is your return policy?\n - What is your shipping policy?\n - What is your phone number?\n - What are your hours of operation?\"\n","inputSchema":{"$schema":"https:\/\/json-schema.org\/draft\/2020-12\/schema","type":"object","properties":{"query":{"type":"string","description":"A natural language query."},"context":{"type":"string","description":"Additional information about the request such as user demographics, mood, location, or other relevant details that could help in tailoring the response appropriately."}},"required":["query"]}}]; 141</script>
vendor: 1 bytes, line 141
141
142<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("\/\/macaronparlour.com\/cdn\/shopifycloud\/storefront\/assets\/storefront\/webmcp-c6b62ece.js","sha256-ke4DDuBjdvea3vxLWxHc9E9nq8zihuG4IfYEGbb77ys=");})(); 143</script>
vendor: 1 bytes, line 143
143
144<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://macaronparlour.com/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}}; 145</script>
vendor: 1 bytes, line 145
145
146<script data-source-attribution="shopify.dynamic_checkout.buyer_consent"> 147 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); 148</script>
vendor: 1 bytes, line 148
148
149<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})}})); 150</script>
150 151<link id="shopify-accelerated-checkout-styles" rel="stylesheet" media="screen" href="https://macaronparlour.com/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css" crossorigin="anonymous"> 152<style id="shopify-accelerated-checkout-cart"> 153 #shopify-buyer-consent { 154 margin-top: 1em; 155 display: inline-block; 156 width: 100%; 157} 158 159#shopify-buyer-consent.hidden { 160 display: none; 161} 162 163#shopify-subscription-policy-button { 164 background: none; 165 border: none; 166 padding: 0; 167 text-decoration: underline; 168 font-size: inherit; 169 cursor: pointer; 170} 171 172#shopify-subscription-policy-button::before { 173 box-shadow: none; 174} 175 176 </style> 177
178<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
178 179
180<script>window.BOLD = window.BOLD || {}; 181 window.BOLD.common = window.BOLD.common || {}; 182 window.BOLD.common.Shopify = window.BOLD.common.Shopify || {}; 183 window.BOLD.common.Shopify.shop = { 184 domain: 'macaronparlour.com', 185 permanent_domain: 'mparlour.myshopify.com', 186 url: 'https://macaronparlour.com', 187 secure_url: 'https://macaronparlour.com', 188 money_format: "${{amount}}", 189 currency: "USD" 190 }; 191 window.BOLD.common.Shopify.customer = { 192 id: null, 193 tags: null, 194 }; 195 window.BOLD.common.Shopify.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":"USD","items_subtotal_price":0,"cart_level_discount_applications":[],"checkout_charge_amount":0}; 196 window.BOLD.common.template = 'page';window.BOLD.common.Shopify.formatMoney = function(money, format) { 197 function n(t, e) { 198 return "undefined" == typeof t ? e : t 199 } 200 function r(t, e, r, i) { 201 if (e = n(e, 2), 202 r = n(r, ","), 203 i = n(i, "."), 204 isNaN(t) || null == t) 205 return 0; 206 t = (t / 100).toFixed(e); 207 var o = t.split(".") 208 , a = o[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1" + r) 209 , s = o[1] ? i + o[1] : ""; 210 return a + s 211 } 212 "string" == typeof money && (money = money.replace(".", "")); 213 var i = "" 214 , o = /\{\{\s*(\w+)\s*\}\}/ 215 , a = format || window.BOLD.common.Shopify.shop.money_format || window.Shopify.money_format || "$ {{ amount }}"; 216 switch (a.match(o)[1]) { 217 case "amount": 218 i = r(money, 2, ",", "."); 219 break; 220 case "amount_no_decimals": 221 i = r(money, 0, ",", "."); 222 break; 223 case "amount_with_comma_separator": 224 i = r(money, 2, ".", ","); 225 break; 226 case "amount_no_decimals_with_comma_separator": 227 i = r(money, 0, ".", ","); 228 break; 229 case "amount_with_space_separator": 230 i = r(money, 2, " ", ","); 231 break; 232 case "amount_no_decimals_with_space_separator": 233 i = r(money, 0, " ", ","); 234 break; 235 case "amount_with_apostrophe_separator": 236 i = r(money, 2, "'", "."); 237 break; 238 } 239 return a.replace(o, i); 240 }; 241 window.BOLD.common.Shopify.saveProduct = function (handle, product) { 242 if (typeof handle === 'string' && typeof window.BOLD.common.Shopify.products[handle] === 'undefined') { 243 if (typeof product === 'number') { 244 window.BOLD.common.Shopify.handles[product] = handle; 245 product = { id: product }; 246 } 247 window.BOLD.common.Shopify.products[handle] = product; 248 } 249 }; 250 window.BOLD.common.Shopify.saveVariant = function (variant_id, variant) { 251 if (typeof variant_id === 'number' && typeof window.BOLD.common.Shopify.variants[variant_id] === 'undefined') { 252 window.BOLD.common.Shopify.variants[variant_id] = variant; 253 } 254 };window.BOLD.common.Shopify.products = window.BOLD.common.Shopify.products || {}; 255 window.BOLD.common.Shopify.variants = window.BOLD.common.Shopify.variants || {}; 256 window.BOLD.common.Shopify.handles = window.BOLD.common.Shopify.handles || {};window.BOLD.common.Shopify.saveProduct(null, null);window.BOLD.apps_installed = {"Product Options":2,"Recurring Orders":1} || {};window.BOLD.common.Shopify.metafields = window.BOLD.common.Shopify.metafields || {};window.BOLD.common.Shopify.metafields["bold_rp"] = {"recurring_type":2};window.BOLD.common.Shopify.metafields["bold_csp_defaults"] = {};window.BOLD.common.cacheParams = window.BOLD.common.cacheParams || {}; 257 window.BOLD.common.cacheParams.recurring_orders = 1592268933; 258 window.BOLD.common.cacheParams.options = 1592268933; 259</script>
259<link href="//macaronparlour.com/cdn/shop/t/3/assets/bold-options.css?v=500" rel="stylesheet" type="text/css" media="all" />
260<script src="https://option.boldapps.net/js/options.js" type="text/javascript"></script>
vendor: 1 bytes, line 260
260
261<script src="https://ro.boldapps.net/v2_ui/js/ro.js" type="text/javascript"></script>
261<script> 262 var BOLD = BOLD || {}; 263 BOLD.recurring_orders = BOLD.recurring_orders || {}; 264 if(typeof BOLD.recurring_orders.setSettings !== 'undefined') { 265 BOLD.recurring_orders.setSettings({ 266 loadingEnabled: true, 267 loadAdditionalCheckoutSelector: '.additional-checkout-buttons', 268 loadAdditionalBuyButtonSelector: '.shopify-payment-button' 269 },true); 270 } else { 271 BOLD.recurring_orders.settings = { 272 loadingEnabled: true, 273 loadAdditionalCheckoutSelector: '.additional-checkout-buttons', 274 loadAdditionalBuyButtonSelector: '.shopify-payment-button' 275 }; 276 } 277 BOLD.recurring_orders.modes = { 278 current_mode:2, 279 recurring_cart:0, 280 single_product:1, 281 mixed_cart:2 282 }; 283 284 BOLD.customer = BOLD.customer || {}; 285 BOLD.customer.id = null || ''; 286 BOLD.customer.email = null || ''; 287 BOLD.customer.address1 = null || ''; 288 BOLD.customer.address2 = null || ''; 289 BOLD.customer.city = null || ''; 290 BOLD.customer.company = null || ''; 291 BOLD.customer.country = null || ''; 292 BOLD.customer.first_name = null || ''; 293 BOLD.customer.last_name = null || ''; 294 BOLD.customer.phone = null || ''; 295 BOLD.customer.province = null || ''; 296 BOLD.customer.zip = null || ''; 297 BOLD.customer.tags = null || ''; 298 299 300 301 302 window.mixed_cart = null; 303</script>
303 304<!-- /snippets/oldIE-js.liquid --> 305 306 307<!--[if lt IE 9]>
308<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js" type="text/javascript"></script>
vendor: 1 bytes, line 308
308
309<script src="//macaronparlour.com/cdn/shop/t/3/assets/respond.min.js?v=52248677837542619231592110060" type="text/javascript"></script>
309 310<link href="//macaronparlour.com/cdn/shop/t/3/assets/respond-proxy.html" id="respond-proxy" rel="respond-proxy" /> 311<link href="//macaronparlour.com/search?q=f8925e8a7a8064acc052b94b42d72af7" id="respond-redirect" rel="respond-redirect" />
312<script src="//macaronparlour.com/search?q=f8925e8a7a8064acc052b94b42d72af7" type="text/javascript"></script>
312 313<![endif]--> 314 315 316 317
317<script> 318 window.wetheme = { 319 name: 'Flow', 320 }; 321 </script>
321 322
322<script src="//macaronparlour.com/cdn/shop/t/3/assets/jquery-3.3.1.min.js?v=74255524871372887611592110057" type="text/javascript"></script>
322 323
323<script src="//macaronparlour.com/cdn/shop/t/3/assets/modernizr.min.js?v=137617515274177302221592110062" type="text/javascript"></script>
323 324 325 326 327 328<meta property="og:image" content="https://cdn.shopify.com/s/files/1/0410/4994/8314/files/IMG_20200630_181649_0cd29385-d3fc-4825-81bc-cc371e1deca2.jpg?v=1617478748" /> 329<meta property="og:image:secure_url" content="https://cdn.shopify.com/s/files/1/0410/4994/8314/files/IMG_20200630_181649_0cd29385-d3fc-4825-81bc-cc371e1deca2.jpg?v=1617478748" /> 330<meta property="og:image:width" content="3024" /> 331<meta property="og:image:height" content="4032" /> 332<link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
333<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: 41049948314,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 333
333
334<script> 335 window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || []; 336</script>
vendor: 1 bytes, line 336
336
337<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}
337).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: 41049948314,storefrontBaseUrl: "https://macaronparlour.com",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://macaronparlour.com/.well-known/shopify/monorail/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["16072cab","8450a54b","7ee89bf1"],webPixelsConfigList: [{"id":"188350618","configuration":"{\"pixel_id\":\"831467404434132\",\"pixel_type\":\"facebook_pixel\",\"metaapp_system_user_token\":\"-\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"96420dbe9ea96c426a1b7f364f977719","type":"APP","apiClientId":2329312,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"65306778","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"1","type":"CUSTOM","privacyPurposes":["MARKETING"],"name":"Meta pixel (migrated)"},{"id":"85098650","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"1","type":"CUSTOM","privacyPurposes":["ANALYTICS"],"name":"Google Analytics tag (migrated)"},{"id":"shopify-app-pixel","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"APP","privacyPurposes":["ANALYTICS","MARKETING"]},{"id":"shopify-custom-pixel","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING"]}],isMerchantRequest: false,initData: {"shop":{"name":"Macaron Parlour","paymentSettings":{"currencyCode":"USD"},"myshopifyDomain":"mparlour.myshopify.com","countryCode":"US","storefrontUrl":"https:\/\/macaronparlour.com"},"customer":null,"cart":null,"checkout":null,"productVariants":[],"products":[],"purchasingCompany":null},},"https://macaronparlour.com/cdn","c8540278we853e1abpb62b2c4amde256306",{"modern":"","legacy":""},{"trekkieShim":true,"agentContext":true,"apiClientId":"580111","facebookCapiEnabled":"true","themeId":"101784944794","themeStoreId":"801","themePublished":"true","eventMetadataId":"b9416c68-2a8a-4c12-a5b5-02081b31dae6","pageType":"page","resourceId":"60734800026","shopId":"41049948314","storefrontBaseUrl":"https:\/\/macaronparlour.com","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"16072cab\", \"8450a54b\", \"7ee89bf1\"]","isMerchantRequest":"false","hashVersion":"c8540278we853e1abpb62b2c4amde256306","publish":"custom","events":"[[\"page_viewed\",{}]]"});})();</script>
337<script> 338 window.ShopifyAnalytics = window.ShopifyAnalytics || {}; 339 window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {}; 340 window.ShopifyAnalytics.meta.currency = 'USD'; 341 var meta = {"page":{"pageType":"page","resourceType":"page","resourceId":60734800026,"requestId":"ab7ce6b0-c175-4281-b554-f744d653cdd1-1790401135"}}; 342 for (var attr in meta) { 343 window.ShopifyAnalytics.meta[attr] = meta[attr]; 344 } 345</script>
vendor: 1 bytes, line 345
345
346<script class="analytics"> 347 (function () { 348 var customDocumentWrite = function(content) { 349 var jquery = null; 350 351 if (window.jQuery) { 352 jquery = window.jQuery; 353 } else if (window.Checkout && window.Checkout.$) { 354 jquery = window.Checkout.$; 355 } 356 357 if (jquery) { 358 jquery('body').append(content); 359 } 360 }; 361 362 var hasLoggedConversion = function(token) { 363 if (token) { 364 return document.cookie.indexOf('loggedConversion=' + token) !== -1; 365 } 366 return false; 367 } 368 369 var setCookieIfConversion = function(token) { 370 if (token) { 371 var twoMonthsFromNow = new Date(Date.now()); 372 twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2); 373 374 document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow; 375 } 376 } 377 378 var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || []; 379 window.ShopifyAnalytics.lib.trekkie = window.trekkie; 380 if (trekkie.integrations) { 381 return; 382 } 383 trekkie.methods = [ 384 'identify', 385 'page', 386 'ready', 387 'track', 388 'trackForm', 389 'trackLink' 390 ]; 391 trekkie.factory = function(method) { 392 return function() { 393 var args = Array.prototype.slice.call(arguments); 394 args.unshift(method); 395 trekkie.push(args); 396 if (method == 'track' || method == 'page') { 397 var pageUrl; 398 try { 399 pageUrl = window.location.href; 400 } catch (e) {} 401 var pageReferrer; 402 try { 403 pageReferrer = document.referrer; 404 } catch (e) {} 405 try { 406 if (window.__TREKKIE_SHIM_QUEUE == null) { 407 window.__TREKKIE_SHIM_QUEUE = []; 408 } 409 window.__TREKKIE_SHIM_QUEUE.push({ 410 from: 'trekkie-stub', 411 method: method, 412 args: args.slice(1), 413 pageContext: { 414 url: pageUrl, 415 referrer: pageReferrer 416 } 417 }); 418 } catch (e) { 419 // no-op 420 } 421 } 422 return trekkie; 423 }; 424 }; 425 for (var i = 0; i < trekkie.methods.length; i++) { 426 var key = trekkie.methods[i]; 427 trekkie[key] = trekkie.factory(key); 428 } 429 trekkie.load = function(config) { 430 trekkie.config = config || {}; 431 trekkie.config.initialDocumentCookie = document.cookie; 432 var first = document.getElementsByTagName('script')[0]; 433var script = document.createElement('script'); 434script.type = 'text/javascript'; 435script.onerror = function(e) { 436 var scriptFallback = document.createElement('script'); 437 scriptFallback.type = 'text/javascript'; 438 scriptFallback.onerror = function(error) { 439 var Monorail = { 440 produce: function produce(monorailDomain, schemaId, payload) { 441 var currentMs = new Date().getTime(); 442 var event = { 443 schema_id: schemaId, 444 payload: payload, 445 metadata: { 446 event_created_at_ms: currentMs, 447 event_sent_at_ms: currentMs 448 } 449 }; 450 return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event)); 451 }, 452 sendRequest: function sendRequest(endpointUrl, payload) { 453 // Try the sendBeacon API 454 if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) { 455 var blobData = new window.Blob([payload], { 456 type: 'text/plain' 457 }); 458 459 if (window.navigator.sendBeacon(endpointUrl, blobData)) { 460 return true; 461 } // sendBeacon was not successful 462 463 } // XHR beacon 464 465 var xhr = new XMLHttpRequest(); 466 467 try { 468 xhr.open('POST', endpointUrl); 469 xhr.setRequestHeader('Content-Type', 'text/plain'); 470 xhr.send(payload); 471 } catch (e) { 472 console.log(e); 473 } 474 475 return false; 476 }, 477 isIos12: function isIos12() { 478 return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1; 479 } 480 }; 481 Monorail.produce('monorail-edge.shopifysvc.com', 482 'trekkie_storefront_load_errors/1.1', 483 {shop_id: 41049948314, 484 theme_id: 101784944794, 485 app_name: "storefront", 486 context_url: window.location.href, 487 source_url: "//macaronparlour.com/cdn/s/trekkie.storefront.f1ba865b3fecd812ad617f74ac079261075e9edb.min.js"}); 488 489 }; 490 scriptFallback.async = true; 491 scriptFallback.src = '//macaronparlour.com/cdn/s/trekkie.storefront.f1ba865b3fecd812ad617f74ac079261075e9edb.min.js'; 492 first.parentNode.insertBefore(scriptFallback, first); 493}; 494script.async = true; 495script.src = '//macaronparlour.com/cdn/s/trekkie.storefront.f1ba865b3fecd812ad617f74ac079261075e9edb.min.js'; 496first.parentNode.insertBefore(script, first); 497 498 }; 499 trekkie.load( 500 {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":41049948314,"isMerchantRequest":null,"themeId":101784944794,"themeCityHash":"7635150441145971741","contentLanguage":"en","currency":"USD","eventMetadataId":"b9416c68-2a8a-4c12-a5b5-02081b31dae6"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["764d78cb","8450a54b","7ee89bf1"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":true,"source":"trekkie-storefront-renderer","apiClientId":580111}} 501 ); 502 503 var loaded = false;
504 trekkie.ready(function() { 505 if (loaded) return; 506 loaded = true; 507 508 window.ShopifyAnalytics.lib = window.trekkie; 509 510 var originalDocumentWrite = document.write; 511 document.write = customDocumentWrite; 512 try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {}; 513 document.write = originalDocumentWrite; 514 515 var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/) 516 var token = match? match[1]: undefined; 517 if (!hasLoggedConversion(token)) { 518 setCookieIfConversion(token); 519 520 } 521 }); 522 523 window.ShopifyAnalytics.lib.page(null,{"pageType":"page","resourceType":"page","resourceId":60734800026,"requestId":"ab7ce6b0-c175-4281-b554-f744d653cdd1-1790401135","shopifyEmitted":true}); 524 525 var eventsListenerScript = document.createElement('script'); 526 eventsListenerScript.async = true; 527 eventsListenerScript.src = "//macaronparlour.com/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js"; 528 document.getElementsByTagName('head')[0].appendChild(eventsListenerScript); 529})();</script>
529 530
530<script> 531 if (!window.ga || (window.ga && typeof window.ga !== 'function')) { 532 window.ga = function ga() { 533 (window.ga.q = window.ga.q || []).push(arguments); 534 if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') { 535 window.Shopify.analytics.publish("ga_stub_called", {}, {sendTo: "google_osp_migration"}); 536 } 537 console.error("Shopify's Google Analytics stub called with:", Array.from(arguments), "\nSee https://help.shopify.com/manual/promoting-marketing/pixels/pixel-migration#google for more information."); 538 }; 539 if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') { 540 window.Shopify.analytics.publish("ga_stub_initialized", {}, {sendTo: "google_osp_migration"}); 541 } 542 } 543</script>
vendor: 1 bytes, line 543
543
544<script 545 defer 546 src="https://macaronparlour.com/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.9.4.min.js" 547 data-application="storefront-renderer" 548 data-shop-id="41049948314" 549 data-render-region="gcp-us-central1" 550 data-page-type="page" 551 data-theme-instance-id="101784944794" 552 data-theme-name="Flow" 553 data-theme-version="16.3.4" 554 data-monorail-region="shop_domain" 555 data-resource-timing-sampling-rate="10" 556 data-shs="true" 557 data-shs-beacon="true" 558 data-shs-export-with-fetch="true" 559 data-shs-logs-sample-rate="1" 560 data-shs-beacon-endpoint="https://macaronparlour.com/api/collect" 561></script>
561 562<meta name="shopify-y" content="44d612e1-17ca-4ba1-9429-a3f1e360cac7" data-expiration="1821958735000"><meta name="shopify-s" content="9327005c-6e28-432a-8d9b-3adb55bdee29" data-expiration="1790402935000"><meta name="new-cookie-storage-activated" content="t"> 563</head> 564 565 566<body id="about-us" class="template-page page-fade" > 567 568 569 <div id="CartDrawer" class="drawer drawer--right drawer--cart"> 570 <div class="drawer__header sitewide--title-wrapper"> 571 <div class="drawer__close js-drawer-close"> 572 <button type="button" class="icon-fallback-text"> 573 <span class="fallback-text">"Close Cart"</span> 574 </button> 575 </div> 576 <div class="drawer__title h2 page--title " id="CartTitle">Shopping Cart</div> 577 <div class="drawer__title h2 page--title hide" id="ShopNowTitle">Quick view</div> 578 <div class="drawer__title h2 page--title hide" id="LogInTitle">Login</div> 579 <div class="drawer__title h2 page--title hide" id="SearchTitle">Search for products on our site</div> 580 </div> 581 <div id="CartContainer"></div> 582 <div id="ShopNowContainer" class="hide"></div> 583 <div id="SearchContainer" class="hide"> 584 <div class="wrapper search-drawer"> 585 <div class="input-group"> 586 <input type="search" name="q" id="search-input" placeholder="Search our store" class="input-group-field" aria-label="Search our store" autocomplete="off" /> 587 <span class="input-group-btn"> 588 <button type="submit" class="btn icon-fallback-text"> 589 <i class="fa fa-search"></i> 590 <span class="fallback-text">Search</span> 591 </button> 592 </span> 593 </div> 594
594<script id="LiveSearchResultTemplate" type="text/template"> 595 596 <div class="indiv-search-listing-grid"> 597 <div class="grid"> 598 {{#if image}} 599 <div class="grid__item large--one-quarter live-search--image"> 600 <a href="{{url}}" title="{{title}}"> 601 <img 602 class="lazyload" 603 src="{{image}}" 604 alt="{{title}}" 605 {{#if imageResponsive}} 606 data-src="{{imageResponsive}}" 607 data-sizes="auto" 608 {{/if}} 609 > 610 </a> 611 </div> 612 {{/if}} 613 <div class="grid__item large--three-quarters line-search-content"> 614 <h3> 615 <a href="{{url}}" title="">{{title}}</a> 616 </h3> 617 <div> 618 {{{price_html}}} 619 </div> 620 <p>{{content}}</p> 621 </div> 622 </div> 623 </div> 624 625</script>
625 626 627
627<script type="text/javascript"> 628 var SearchTranslations = { 629 no_results_html: "Your search for \"{{ terms }}\" did not yield any results.", 630 results_for_html: "Your search for \"{{ terms }}\" revealed the following:", 631 products: "Products", 632 pages: "Pages", 633 articles: "Articles" 634 }; 635 </script>
635 636 <div id="search-results" class="grid-uniform"> 637 <!-- here will be the search results --> 638 </div> 639 <a id="search-show-more" href="#" class="btn hide">See more</a> 640 </div> 641 </div> 642 <div id="LogInContainer" class="hide"></div> 643 </div> 644 <div id="DrawerOverlay"></div> 645 646<div id="PageContainer"> 647 648 <div id="shopify-section-announcement-bar" class="shopify-section"> 649 650 <style> 651 652 .notification-bar{ 653 background-color: #242424; 654 color: #ffffff; 655 } 656 657 .notification-bar a, 658 .notification-bar 659 .social-sharing.is-clean a{ 660 color: #ffffff; 661 } 662 663 .notification-bar li a svg { 664 fill: #ffffff; 665 } 666 667 </style> 668 669 <div class="notification-bar no-icons"> 670 671 672 673 674 <div class="notification-bar__message"> 675 676 <p><strong>FREE 2 DAY UPS SHIPPING </strong>for orders <strong>$60</strong> and over.</p><p>Orders placed after 2 pm on Tuesdays will not ship until the following week.</p> 677 678 </div> 679 680 681 </div> 682 683 684 685</div> 686 687 <div id="shopify-section-header" class="shopify-section"> 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708<div data-section-id="header" data-section-type="header-section" class="header-section--wrapper"> 709 <div id="NavDrawer" class="drawer drawer--left"> 710 711 712 713 714 715 716 717 718 719 720 721<div 722> 723 724<noscript> 725 <img 726 class="" 727 src="//macaronparlour.com/cdn/shop/files/updated_Macaron_Parlour_logo_34339f59-4dce-4663-8d79-984d60d5f4fd_1000x1000.png?v=1614312654" 728 data-sizes="auto" 729 730 alt="" 731 732 733 style="width: 150px" 734 itemprop="logo" 735 736 /> 737</noscript> 738 739<img 740 class="lazyload " 741 src="//macaronparlour.com/cdn/shop/files/updated_Macaron_Parlour_logo_34339f59-4dce-4663-8d79-984d60d5f4fd_150x.png?v=1614312654" 742 data-src="//macaronparlour.com/cdn/shop/files/updated_Macaron_Parlour_logo_34339f59-4dce-4663-8d79-984d60d5f4fd_{width}.png?v=1614312654" 743 data-sizes="auto" 744 745 data-aspectratio="3.937007874015748" 746 747 748 style="width: 150px" 749 itemprop="logo" 750 751 752 style="max-width: 1000px; max-height: 254px" 753 754 755 alt="" 756 757/> 758 759</div> 760 761 762 763 764 <!-- begin mobile-nav --> 765 <ul class="mobile-nav with-logo"> 766 <li class="mobile-nav__item mobile-nav__search"> 767 <form action="/search" method="get" class="input-group search-bar" role="search"> 768 769 <input type="search" name="q" value="" placeholder="Search our store" class="input-group-field" aria-label="Search our store"> 770 <span class="input-group-btn hidden"> 771 <button type="submit" class="btn icon-fallback-text"> 772 <i class="fa fa-search"></i> 773 <span class="fallback-text">Search</span> 774 </button> 775 </span> 776</form> 777 778 </li> 779 780 781 782 783 784 785 <li class="mobile-nav__item"> 786 <a href="/" class="mobile-nav__link">Home</a> 787 </li> 788 789 790 791 792 793 794 795 <li class="mobile-nav__item"> 796 <a href="/collections" class="mobile-nav__link">Catalog</a> 797 </li> 798 799 800 801 802 803 804 805 <li class="mobile-nav__item"> 806 <a href="/pages/contact-us" class="mobile-nav__link">Contact Us</a> 807 </li> 808 809 810 811 812 813 814 </ul> 815 816 817 818 819 <span class="mobile-nav-header">Account</span> 820 821 <ul class="mobile-nav"> 822 823 824 <li class="mobile-nav__item"> 825 <a href="https://macaronparlour.com/customer_authentication/redirect?locale=en&region_country=US" id="customer_login_link">Log in</a> 826 </li> 827 <li class="mobile-nav__item"> 828 <a href="https://shopify.com/41049948314/account?locale=en&buyer_flags=eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJtcGFybG91ci5teXNob3BpZnkuY29tIiwiZmxhZ3MiOltdLCJleHAiOjE3OTEwMDU5MzUsIm5iZiI6MTc5MDQwMTEzNX0.wKTtFztSOU659FgPoYnfcmloKNemGWsVuWizyNOQTDQ" id="customer_register_link">Create account</a> 829 </li> 830 831 832 </ul> 833 834 835 <!-- //mobile-nav --> 836 </div> 837 838 839 840 <header class="site-header medium--hide small--hide sticky-header sticky-header-transformed ui sticky overlay-logo"> 841 842 <div class="site-header__wrapper site-header__wrapper--logo-left site-header__wrapper--with-menu"> 843 844 <div class="site-header__wrapper__left"> 845 846 847 <div class="site-header__logowrapper"> 848 849 <div class="site-header__logo h1" id="site-title" itemscope itemtype="http://schema.org/Organization"> 850 851 852 853 <a href="/" itemprop="url" class="site-header__logo-image"> 854 855 856 857 858 859 860 861 862 863 864<div 865> 866 867<noscript> 868 <img 869 class="" 870 src="//macaronparlour.com/cdn/shop/files/updated_Macaron_Parlour_logo_34339f59-4dce-4663-8d79-984d60d5f4fd_1000x1000.png?v=1614312654" 871 data-sizes="auto" 872 873 alt="Macaron Parlour" 874 875 876 style="width: 420px" 877 itemprop="logo" 878 879 /> 880</noscript> 881 882<img 883 class="lazyload " 884 src="//macaronparlour.com/cdn/shop/files/updated_Macaron_Parlour_logo_34339f59-4dce-4663-8d79-984d60d5f4fd_150x.png?v=1614312654" 885 data-src="//macaronparlour.com/cdn/shop/files/updated_Macaron_Parlour_logo_34339f59-4dce-4663-8d79-984d60d5f4fd_{width}.png?v=1614312654" 886 data-sizes="auto" 887 888 data-aspectratio="3.937007874015748" 889 890 891 style="width: 420px" 892 itemprop="logo" 893 894 895 style="max-width: 1000px; max-height: 254px" 896 897 898 alt="Macaron Parlour" 899 900/> 901 902</div> 903 904 </a> 905 906 907 908 909 910 911 </div> 912 913 </div> 914 915 916 </div> 917 918 <div class="site-header__wrapper__center"> 919 920 </div> 921 922 <div class="site-header__wrapper__right top-links"> 923 924 925 <div class="site-header__nav top-links" id="top_links_wrapper"> 926 <ul class="site-nav mega-menu-wrapper" id="AccessibleNav" role="navigation"> 927 928 929 930 931 932 933 <li> 934 <a href="/" class="site-nav__link">Home</a> 935 </li> 936 937 938 939 940 941 942 943 <li> 944 <a href="/collections" class="site-nav__link">Catalog</a> 945 </li> 946 947 948 949 950 951 952 953 <li> 954 <a href="/pages/contact-us" class="site-nav__link">Contact Us</a> 955 </li> 956 957 958 959 960 961 </ul> 962 </div> 963 964 965 <form method="post" action="/localization" id="localization_form" accept-charset="UTF-8" class="localization-selector-form" enctype="multipart/form-data"><input type="hidden" name="form_type" value="localization" /><input type="hidden" name="utf8" value="â" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="return_to" value="/pages/about-us" /></form> 966 967 968 969 970 <ul class="site-header__links top-links--icon-links"> 971 972 <li> 973 <a href="/search" class="search-button"> 974 <i class="fa fa-search fa-lg"></i>
975 <span class="header--supporting-text">Search</span> 976 </a> 977 </li> 978 979 980 981 982 <li> 983 <a href="https://macaronparlour.com/customer_authentication/redirect?locale=en®ion_country=US" title="Log in" class="log-in-button"> 984 <i class="fa fa-user fa-lg"></i> 985 <span class="header--supporting-text">Account</span> 986 </a> 987 </li> 988 989 990 991 <li> 992 <a href="/cart" class="site-header__cart-toggle js-drawer-open-right-link" aria-controls="CartDrawer" aria-expanded="false"> 993 <i class="fa fa-shopping-cart fa-lg"></i> 994 995 <span class="header--supporting-text">Cart 996 997 - <span class="cart-item-count-header cart-item-count-header--quantity">0</span> 998 999 </span> 1000 1001 </a> 1002 </li> 1003 </ul> 1004 1005 </div> 1006 </div> 1007 1008 1009 1010 1011 1012 1013 </header> 1014 1015<nav class="nav-bar mobile-nav-bar-wrapper large--hide medium-down--show sticky-header sticky-header-transformed ui sticky"> 1016 <div class="wrapper"> 1017 <div class="large--hide medium-down--show"> 1018 <div class="mobile-grid--table"> 1019 <div class="grid__item one-sixth"> 1020 <div class="site-nav--mobile"> 1021 <button type="button" class="icon-fallback-text site-nav__link js-drawer-open-left-link" aria-controls="NavDrawer" aria-expanded="false"> 1022 <i class="fa fa-bars fa-2x"></i> 1023 <span class="fallback-text">Menu</span> 1024 </button> 1025 </div> 1026 </div> 1027 1028 <div class="grid__item four-sixths"> 1029 1030 <div class="site-header__logowrapper"> 1031 1032 <div class="site-header__logo h1" id="site-title" itemscope itemtype="http://schema.org/Organization"> 1033 1034 1035 1036 <a href="/" itemprop="url" class="site-header__logo-image"> 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047<div 1048> 1049 1050<noscript> 1051 <img 1052 class="" 1053 src="//macaronparlour.com/cdn/shop/files/updated_Macaron_Parlour_logo_34339f59-4dce-4663-8d79-984d60d5f4fd_1000x1000.png?v=1614312654" 1054 data-sizes="auto" 1055 1056 alt="Macaron Parlour" 1057 1058 1059 style="width: 420px" 1060 itemprop="logo" 1061 1062 /> 1063</noscript> 1064 1065<img 1066 class="lazyload " 1067 src="//macaronparlour.com/cdn/shop/files/updated_Macaron_Parlour_logo_34339f59-4dce-4663-8d79-984d60d5f4fd_150x.png?v=1614312654" 1068 data-src="//macaronparlour.com/cdn/shop/files/updated_Macaron_Parlour_logo_34339f59-4dce-4663-8d79-984d60d5f4fd_{width}.png?v=1614312654" 1069 data-sizes="auto" 1070 1071 data-aspectratio="3.937007874015748" 1072 1073 1074 style="width: 420px" 1075 itemprop="logo" 1076 1077 1078 style="max-width: 1000px; max-height: 254px" 1079 1080 1081 alt="Macaron Parlour" 1082 1083/> 1084 1085</div> 1086 1087 </a> 1088 1089 1090 1091 1092 1093 1094 </div> 1095 1096 </div> 1097 1098 </div> 1099 1100 <div class="grid__item one-sixth text-right"> 1101 <div class="site-nav--mobile"> 1102 <a href="/cart" class="js-drawer-open-right-link site-nav__link" aria-controls="CartDrawer" aria-expanded="false"> 1103 <span class="icon-fallback-text"> 1104 <i class="fa fa-shopping-cart fa-2x"></i> 1105 1106 1107 <span class="cart-item-count-header--quantity site-header__cart-indicator hide">0</span> 1108 1109 1110 <span class="fallback-text">Cart</span> 1111 </span> 1112 </a> 1113 </div> 1114 </div> 1115 </div> 1116 </div> 1117 </div> 1118</nav> 1119 1120</div> 1121 1122 1123 1124 <!-- /snippets/breadcrumb.liquid --> 1125 1126 1127<div class="wrapper"> 1128 1129 <nav class="breadcrumb" role="navigation" aria-label="breadcrumbs"> 1130 <a href="/" title="Back to the frontpage">Home</a> 1131 1132 1133 1134 <span aria-hidden="true">›</span> 1135 <span>About Us</span> 1136 1137 1138 </nav> 1139 1140</div> 1141 1142 1143 1144 1145<style> 1146 #site-title{ 1147 padding: 25px 0; 1148 } 1149 1150 1151 .site-header .site-header__wrapper .site-header__wrapper__left { 1152 flex-basis: 420px; 1153 } 1154 1155 .site-nav__dropdown li, .inner .h4, .inner .h5 { 1156 text-align: left; 1157 } 1158 1159 .template-index .overlay-header.ui.sticky:not(.top), 1160 .template-index .overlay-header:not(.sticky) 1161 , 1162 .template-list-collections .overlay-header.ui.sticky:not(.top), 1163 .template-list-collections .overlay-header:not(.sticky), 1164 .contact-page .overlay-header.ui.sticky:not(.top), 1165 .contact-page .overlay-header:not(.sticky) 1166 { 1167 background-color: rgba(0, 0, 0, 0.0); 1168 } 1169 1170 .overlay-header .grid--full, 1171 .overlay-header .mobile-grid--table { 1172 padding-left: 30px; 1173 padding-right: 30px; 1174 } 1175 1176 @media only screen and (min-width: 768px) and (max-width: 1200px) { 1177 .overlay-header .grid--full, 1178 .overlay-header .mobile-grid--table { 1179 padding-left: 15px; 1180 padding-right: 15px; 1181 } 1182 } 1183 1184 .template-index .overlay-header-wrapper, 1185 1186 .template-list-collections .overlay-header-wrapper, 1187 .contact-page .overlay-header-wrapper 1188 { 1189 max-height: 0px !important; 1190 min-height: 0px !important; 1191 } 1192 1193 .template-index .overlay-header.force-hover, 1194 1195 .template-list-collections .overlay-header.force-hover 1196 .contact-page .overlay-header.force-hover 1197 { 1198 background-color: #ffffff; 1199 } 1200 1201 1202</style> 1203 1204 1205</div> 1206 1207 1208 1209 <div class="wrapper main-content"> 1210 1211 1212 1213 <!-- /templates/page.liquid --> 1214 1215 1216<div id="shopify-section-page-template" class="shopify-section"><!-- /sections/page-template.liquid --> 1217 1218 1219<div class="grid clearfix">
1220 <div class="grid__item large--two-thirds push--large--one-sixth"> 1221 1222 <div class="sitewide--title-wrapper"> 1223 1224 <h1 class="page--title">About Us</h1> 1225 </div> 1226 1227 <div class="grid"> 1228 <div class="rte grid__item"> 1229 <p>Christina Ha has always been a baker, but never set out to do it for a living. Some of her earliest and best memories are from shaping cookies and talking to her mom while waiting for them to rise and caramelize in the oven. Baking has always been a hobby of hers and she had fantasies about baking all day. They were never any realistic fantasies; she fantasized about sitting in her beautiful white kitchen surrounded by pretty things and her reality was that she was crammed into a tiny NYC apartment where she could smell when the rice was done cooking on the stove while showering in the bathtub in her kitchen. She imagined that she would be a sweet, graceful host who could just âwhip upâ a quick 3-tier cake. The truth is, she was on a career path in fashion PR and just happened to bake on the side. At some point, she realized that her hobby was making her happier than her career and something had to go.</p> 1230<p> </p> 1231<p>It went the same year she met Simon Tung.</p> 1232<p> </p> 1233<p>Simon Tung was probably born with a smile on his face. Even his parents talk about what a great baby he was â always giggling and a bit of a rascal. He grew up a happy go-lucky child who knew very much about the work hard, play hard model. Heâs been working since he was 12, starting as a factory worker who sewed belt loops and had on more than one occasion, snuck out of the house to attend parties and concerts. Simon had settled into a career as a legal recruiter and he loved his job so much, he dreamed of one day buying out his firm. When the economy took a turn for the worse, it knocked the work right out from under him and he picked up a side gig as a party promoter. It was at a fateful party on Halloween 2009 that he bumped into Christina Ha.</p> 1234<p> </p> 1235<p>The two were totally incompatible as far as couples go. Christina was gearing up to attend the weekend pastry program at the Institute of Culinary Education. She took herself too seriously and wanted to really embrace this future career, even if it meant being socially isolated for the 8 months it would take to complete the program as she juggled a full time job and school. Simon was in bachelor mode and going out every weekend, and roaming around the city on weekdays while hunting for his next great job. He was so good at planning that he arranged his 10 year high school reunion and was going to weddings every other weekend. He was at his social prime. Their roommates knew each other and commented that they were not looking for the same things.</p> 1236<p> </p> 1237<p>But baking brought them together. Simon had long wanted to go to culinary school and had wanted to open a food truck one day. Christina wanted to learn how to parallel park a big truck and bake for a living. When an opportunity to open a business at the Hester Street Fair came up in early 2010, they jumped at the chance. They werenât immediately sure of what their business would be, just that it would involve baked goods. Their menu fell into Christinaâs hands.</p> 1238<p> </p> 1239<p>In 2009, Christina enrolled in a professional macaron baking program at La Haute Pâtisserie Pierre Hermé in Paris. The problem was, she wasnât a professional and she couldnât speak French, but she managed to make it through without being the worst in the class. That little bit of encouragement made her obsessed with macarons, even though in New York, not that many people had caught wind of the special treat. The two determined that they would use Christinaâs obsession to open Macaron Parlour.</p> 1240<p> </p> 1241<p>The direction of the company was initially unclear as they scrambled to form a business within six weeks. But when they came up with the candied bacon with maple cream cheese macaron and the red velvet macaron, they both understood that they were making a new kind of macaron â an American kind with no limitations. According to Google, no one in the world had ever made brown sugar macarons before. Because Christina was still early in her pastry program, she had no idea what the limits of tradition were so she broke all the rules and the brown sugar macaron became the âpancakeâ to the candied bacon and maple of their breakfast-inspired macaron. Together, Simon & Christina came up with a menu containing classic flavors to draw in the traditionalists and s
1241ome crazy, fun flavors to cross the bridge between the traditional and the more familiar. They wanted to appeal to the little child in everyone with flavors like Cheetos, sâmores, and giggity (which is based off of a Snickers bar) and their fans will say that they have achieved their goal.</p> 1242<p> </p> 1243<p>Within 2 years, Simon charmed his way into various markets and stores and gained his own special following. His infectious laugh turned repeat customers into friends and fellow vendors into our closest advisors. Christina went to work at Locanda Verde and Smith Canteen to learn more about the pastry world and improve her skills. The two developed the business in their own special ways.</p> 1244<p><img class="size-medium wp-image-3031 aligncenter" src="https://macaronparlour.com/wp-content/uploads/2014/06/292262_228069617295306_100002768090588_330661_2119902852_n-300x300.jpg" alt="" srcset="https://macaronparlour.com/wp-content/uploads/2014/06/292262_228069617295306_100002768090588_330661_2119902852_n-300x300.jpg 300w, https://macaronparlour.com/wp-content/uploads/2014/06/292262_228069617295306_100002768090588_330661_2119902852_n-200x200.jpg 200w, https://macaronparlour.com/wp-content/uploads/2014/06/292262_228069617295306_100002768090588_330661_2119902852_n-100x100.jpg 100w, https://macaronparlour.com/wp-content/uploads/2014/06/292262_228069617295306_100002768090588_330661_2119902852_n-400x400.jpg 400w, https://macaronparlour.com/wp-content/uploads/2014/06/292262_228069617295306_100002768090588_330661_2119902852_n-150x150.jpg 150w, https://macaronparlour.com/wp-content/uploads/2014/06/292262_228069617295306_100002768090588_330661_2119902852_n.jpg 720w" sizes="(max-width: 300px) 100vw, 300px" width="300" height="300"></p> 1245<p>In March 2011, Simon proposed. That year, Christina had gone back to school to learn how to run a food business and realized upon completing her business plan that they should think about opening a store. In February 2012, the two signed a lease for a store in the East Village. Two months later, they had a wedding at the Brooklyn Botanic Gardens where they said their vows under the cherry blossoms. Then on October 2012, their store opened and Christina rejoiced when she was finally able to expand her menu. The menu at the Macaron Parlour shop boasts cookies like the kitchen sink and chocolate chip fleur de sel, and a croissant that the French come to taste. A little over a year later, the second Macaron Parlour opened February 2014 at 560 Columbus Avenue. Almost five years after opening doors at their East Village shop, they relocated the bakery and the kitchen to a larger space at 44 Hester Street. The new location opened the first week of April 2017, right after Christina went back to school for the Goldman Sachs 10,000 Small Business Program. Once again, Simon was the face of the company while Christina juggled school and kitchen production.</p> 1246<p> </p> 1247<p>But things were remarkably different with their new location when compared to their first store opening. Their first store was delayed by 4 months, stressed them out like crazy, and magically moved 10 lbs from Simonâs body to Christinaâs. This time around, the build out was a breeze, the staff was already trained, and they had enough time to foster 2 bottle baby kittens. What changed? In 2013, 9 months after opening their first store, an emaciated kitten walked into their lives and changed the stakes of the game. He changed the way they managed their work life balance because suddenly, their life was about more than work. After finding Mr. Socks, their feline family expanded to also include Pickle and Tia (<a href="http://instagram.com/iamthemightypeanut">@iamthemightypeanut</a>). In 2014, Christina went on to co-found NYCâs first cat cafe, <a href="http://meowparlour.com">Meow Parlour, </a>with a member of the Macaron Parlour team. After fostering over 200 cats, the couple decided to organize NYCâs first feline symposium â <a href="http://catcampnyc.com">Cat Camp</a>. When Christina and Simon decide to commit to something, they truly believe in going all in. You can thank Mr. Socks if youâre a huge cat fan. Heâs also still cool with receiving fan mail even if youâre not.</p> 1248<p><img class="size-medium wp-image-3033 aligncenter" src="https://macaronparlour.com/wp-content/uploads/2014/06/tia6-300x251.jpg" alt="" srcset="https://macaronparlour.com/wp-content/uploads/2014/06/tia6-300x251.jpg 300w, https://macaronparlour.com/wp-content/uploads/2014/06/tia6-400x334.jpg 400w, https://macaronparlour.com/wp-content/uploads/2014/06/tia6-768x642.jpg 768w, https://macaronparlour.com/wp-content/uploads/2014/06/tia6-1024x856.jpg 1024w" sizes="(max-width: 300px) 100v
1248w, 300px" width="300" height="251"></p> 1249<p>This is only the beginning of a much longer story. The business is about the unlikeliest of love stories â between Little Miss Serious and Mr. Fun Times and of combining the tradition of the French macaron with the memories of growing up and eating the food of America. We strive to combine our talent with our crazy ideas to break all sorts of boundaries to make the most delicious sweets around. Macaron Parlour is the place where fun goes to eat.</p> 1250 </div> 1251 1252 1253 </div> 1254 1255 </div> 1256</div> 1257 1258 1259</div> 1260 1261 1262 </div> 1263 1264 <div id="shopify-section-footer-newsletter" class="shopify-section footer-section--newsletter-wrapper"> 1265 1266 1267</div> 1268 1269 <div id="shopify-section-footer" class="shopify-section"> 1270<div class='mailmunch-forms-widget-916230'></div> 1271<footer class="site-footer footer-alignment--left"> 1272 <div class="wrapper"> 1273 <div class="grid"> 1274 1275 1276 1277 1278 1279 <div class="grid__item large--one-third medium--one-half small--one-whole content-footer"> 1280 <div class="h3 footer-header">Contact</div> 1281 <div class="rte footer-article"></div> 1282 </div> 1283 1284 1285 1286 1287 1288 1289 1290 1291 <div class="grid__item large--one-third medium--one-half small--one-whole links-footer"> 1292 <div class="h3 footer-header">Links</div> 1293 <ul class="footer-content"> 1294 1295 1296 <li> 1297 <a href="/search">Search</a> 1298 </li> 1299 1300 1301 1302 <li> 1303 <a href="/pages/policies">Policies</a> 1304 </li> 1305 1306 1307 </ul> 1308 </div> 1309 1310 1311 1312 1313 1314 1315 1316 <div class="grid__item large--one-third medium--one-half small--one-whole newsletter-footer"> 1317 <div class="h3 footer-header">Newsletter</div> 1318 1319 <form method="post" action="/contact#contact_form" id="contact_form" accept-charset="UTF-8" class="contact-form"><input type="hidden" name="form_type" value="customer" /><input type="hidden" name="utf8" value="â" /> 1320 1321 1322 <div class="input-group"> 1323 <input type="email" value="" placeholder="[email protected]" name="contact[email]" id="Email" class="input-group-field footer-email-input" aria-label="[email protected]"> 1324 <input type="hidden" name="contact[tags]" value="newsletter"> 1325 <span> 1326 <input type="submit" class="btn footer-email-submit" name="subscribe" id="subscribe" value="Subscribe"> 1327 </span> 1328 </div> 1329 1330 </form> 1331 </div> 1332 1333 1334 1335 1336 1337</div> 1338 <div class="bottom--footer"> 1339 1340 1341 <div class="footer-description footer-description--left"> 1342 1343 </div> 1344 1345 1346 <div class="bottom--footer-row bottom--footer-no--no-payments"> 1347 <form method="post" action="/localization" id="localization_form" accept-charset="UTF-8" class="localization-selector-form" enctype="multipart/form-data"><input type="hidden" name="form_type" value="localization" /><input type="hidden" name="utf8" value="â" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="return_to" value="/pages/about-us" /></form> 1348 1349 1350 1351 <ul class="bottom--footer---links"> 1352 <li><a href="/">© 2026, Macaron Parlour</a></li> 1353 <li><a target="_blank" rel="nofollow" href="https://www.shopify.com?utm_campaign=poweredby&utm_medium=shopify&utm_source=onlinestore">Powered by Shopify</a></li> 1354 </ul> 1355 1356 </div> 1357 </div> 1358 </div> 1359</footer> 1360 1361 1362</div> 1363 1364 1365</div> 1366
1367<script type="text/javascript"> 1368window.lazySizesConfig = window.lazySizesConfig || {}; 1369window.lazySizesConfig.rias = window.lazySizesConfig.rias || {}; 1370 1371// configure available widths to replace with the {width} placeholder 1372window.lazySizesConfig.rias.widths = [150, 300, 600, 900, 1200, 1500, 1800, 2100]; 1373 1374document.addEventListener('lazyriasmodifyoptions', function (e) { 1375 // convert width to width specification for shopify 1376 var widthmap = {} 1377 var aspect = parseFloat(e.target.dataset.aspectratio); // classList.contains('lazyload-square'); 1378 var forceHeight = parseInt(e.target.dataset.forceHeight, 10); 1379 window.lazySizesConfig.rias.widths.forEach(function (width) { 1380 if (forceHeight) { 1381 var heightForWidth = width / aspect; 1382 var newWidth, newHeight; 1383 if (heightForWidth < forceHeight) { 1384 newWidth = forceHeight / heightForWidth * width; 1385 } else { 1386 newWidth = width; 1387 } 1388 newHeight = newWidth / aspect; 1389 widthmap[width] = newWidth.toFixed(0) + 'x' + newHeight.toFixed(0) 1390 } else { 1391 widthmap[width] = width.toString() + 'x'; 1392 } 1393 }); 1394 e.detail.widthmap = widthmap; 1395}); 1396</script>
1396 1397 1398
1398<script src="//macaronparlour.com/cdn/shop/t/3/assets/fastclick.min.js?v=29723458539410922371592110068" type="text/javascript"></script>
1398 1399
1399<script src="//macaronparlour.com/cdn/shop/t/3/assets/plugins.js?v=56838906785386436941592110063" type="text/javascript"></script>
1399 1400
1400<script src="//macaronparlour.com/cdn/shop/t/3/assets/timber.js?v=169798996853667473941592110084" type="text/javascript"></script>
1400 1401 1402
1402<script> 1403 window.default_currency_format = "${{amount}}"; 1404 1405 </script>
1405 1406 1407
1407<script src="//macaronparlour.com/cdn/shop/t/3/assets/custom.js?v=39112123117476323921592110085" type="text/javascript"></script>
1407 1408 1409 1410 1411 1412 1413
1413<script> 1414 1415 </script>
1415 1416 1417 1418
1418<script src="//macaronparlour.com/cdn/shop/t/3/assets/handlebars.min.js?v=79044469952368397291592110063" type="text/javascript"></script>
1418 1419 <!-- /snippets/ajax-cart-template.liquid --> 1420
1421<script id="CartTemplate" type="text/template"> 1422 <form action="/cart" method="post" novalidate class="cart ajaxcart"> 1423 1424 <div class="ajaxcart__inner"> 1425 {{#items}} 1426 <div class="ajaxcart__product"> 1427 <div class="ajaxcart__row" data-line="{{line}}"> 1428 <div class="grid display-table"> 1429 <div class="grid__item small--one-whole medium--one-quarter large--one-quarter medium--display-table-cell"> 1430 <a href="{{url}}" class="ajaxcart__product-image"> 1431 <img 1432 class="lazyload" 1433 src="{{img}}" 1434 alt="" 1435 {{#if imgResponsive}} 1436 data-src="{{imgResponsive}}" 1437 data-sizes="auto" 1438 {{/if}} 1439 /> 1440 </a> 1441 </div> 1442 <div class="grid__item small--one-whole medium--two-quarters large--two-quarters medium--display-table-cell"> 1443 <p> 1444 <a href="{{url}}" class="ajaxcart__product-name">{{name}}</a> 1445 {{#if variation}} 1446 <span class="ajaxcart__product-meta">{{variation}}</span> 1447 {{/if}} 1448 {{#properties}} 1449 {{#each this}} 1450 {{#if this}} 1451 <span class="ajaxcart__product-meta">{{@key}}: {{this}}</span> 1452 {{/if}} 1453 {{/each}} 1454 {{/properties}} 1455 1456 </p> 1457 1458 <div class="text-center"> 1459 {{#if discountsApplied}} 1460 <span class="ajaxcart-item__price-strikethrough"><s><span class="money">{{{originalPrice}}}</span></s></span> 1461 {{/if}} 1462 <span class="ajaxcart-item__price"><span class="money">{{{linePrice}}}</span></span> 1463 1464 1465 1466 <ul class="ajaxcart-item__discounts" aria-label="Discount"> 1467 {{# discountAllocations}} 1468 <li class="ajaxcart-item__discount"> 1469 <span class="ajaxcart-item__discount_title">{{ discount_application.title }}</span> 1470 <span class="ajaxcart-item__discount_money">- <span class="money">{{{ money }}}</span></span> 1471 </li> 1472 {{/ discountAllocations}} 1473 </ul> 1474 1475 <div class="grid--full text-center ajaxcart__quantity-wrapper"> 1476 <div class="grid__item"> 1477 <div class="ajaxcart__qty"> 1478 <button type="button" class="ajaxcart__qty-adjust ajaxcart__qty--minus icon-fallback-text" data-id="{{id}}" data-qty="{{itemMinus}}" data-line="{{line}}"> 1479 <i class="fa fa-minus" aria-hidden="true"></i> 1480 <span class="fallback-text">−</span> 1481 </button> 1482 <input type="text" name="updates[]" class="ajaxcart__qty-num" value="{{itemQty}}" min="0" data-id="{{id}}" data-line="{{line}}" aria-label="quantity" pattern="[0-9]*"> 1483 <button type="button" class="ajaxcart__qty-adjust ajaxcart__qty--plus icon-fallback-text" data-id="{{id}}" data-line="{{line}}" data-qty="{{itemAdd}}"> 1484 <i class="fa fa-plus" aria-hidden="true"></i> 1485 <span class="fallback-text">+</span> 1486 </button> 1487 </div> 1488 </div> 1489 1490 <button type="button" class="ajaxcart__qty-remove icon-fallback-text" data-id="{{id}}" data-line="{{line}}"> 1491 <span class="fallback-text">X</span> 1492 </button> 1493 1494 </div> 1495 </div> 1496 </div> 1497 </div> 1498 {{/items}} 1499 </div> 1500 1501 <div class="ajaxcart__footer-wrapper"> 1502 1503 <div class="ajax-cart--notes"> 1504 <label class="ajaxcart__special_instructions" for="CartSpecialInstructions">Special instructions for seller</label> 1505 <textarea name="note" class="input-full" id="CartSpecialInstructions">{{ note }}</textarea> 1506 </div> 1507 1508 </div> 1509 <div class="ajaxcart__footer"> 1510 <div class="grid--full"> 1511 <ul class="grid__item ajaxcart__discounts" style="margin: 0"> 1512 {{# discountApplications}} 1513 <li class="ajaxcart__discount">
1514 <span class="ajaxcart__discount_money"><span class="money">{{{ money }}}</span></span> 1515 <span class="ajaxcart__discount_title">{{ title }} </span> 1516 </li> 1517 {{/ discountApplications}} 1518 </ul> 1519 1520 </ul> 1521 1522 <div class="grid__item ajaxcart__subtotal_header"> 1523 <p>Subtotal</p> 1524 </div> 1525 {{#if totalCartOriginal}} 1526 <p class="grid__item ajaxcart__price-strikeout text-center"><s><span class="money">{{{totalCartOriginal}}}</span></s></p> 1527 {{/if}} 1528 <div class="grid__item ajaxcart__subtotal"> 1529 <p><span class="money">{{{totalPrice}}}</span></p> 1530 </div> 1531 </div> 1532 1533 <div class="cart__shipping rte"> 1534 <p class="text-center"> 1535 Taxes and shipping calculated at checkout 1536 1537 </p> 1538 </div> 1539 1540 <button type="submit" class="cart__checkout" name="checkout"> 1541 Check Out 1542 </button> 1543 1544 <div class="additional-checkout-buttons additional-checkout-buttons--vertical"> 1545 <div class="dynamic-checkout__content" id="dynamic-checkout-cart" data-shopify="dynamic-checkout-cart"> <shopify-accelerated-checkout-cart wallet-configs="[{"supports_subs":true,"supports_def_opts":false,"name":"shop_pay","wallet_params":{"shopId":41049948314,"merchantName":"Macaron Parlour","personalized":true}},{"supports_subs":true,"supports_def_opts":false,"name":"paypal","wallet_params":{"shopId":41049948314,"countryCode":"US","merchantName":"Macaron Parlour","phoneRequired":false,"companyRequired":false,"shippingType":"shipping","shopifyPaymentsEnabled":true,"hasManagedSellingPlanState":false,"requiresBillingAgreement":false,"gatewayType":"MANAGED","merchantId":"5K45647C5PW9S","sdkUrl":"https://www.paypal.com/sdk/js?components=buttons\u0026commit=false\u0026currency=USD\u0026locale=en_US\u0026client-id=AbasDhzlU0HbpiStJiN1KRJ_cNJJ7xYBip7JJoMO0GQpLi8ePNgdbLXkC7_KMeyTg8tnAKW4WKrh9qmf\u0026merchant-id=5K45647C5PW9S\u0026intent=authorize","serviceableCountryCodes":["AC","AD","AE","AF","AG","AI","AL","AM","AO","AR","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GW","GY","HK","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MK","ML","MM","MN","MO","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PS","PT","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SZ","TA","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VN","VU","WF","WS","XK","YE","YT","ZA","ZM","ZW"]}}]" access-token="1a345ab5bcd5929ae1f1b278b42384a4" buyer-country="US" buyer-locale="en" buyer-currency="USD" shop-id="41049948314" cart-id="8e1a7cdea4b0d50ccd716ddf4c28d841" enabled-flags="["1172c16a","a1d1f9a1","f5afabb3","370070f3"]" > <div class="wallet-button-wrapper"> <ul class='wallet-cart-grid wallet-cart-grid--skeleton' role="list" data-shopify-buttoncontainer="true"> <li data-testid='grid-cell' class='wallet-cart-button-container'><div class='wallet-cart-button wallet-cart-button__skeleton' role='button' disabled aria-hidden='true'> </div></li><li data-testid='grid-cell' class='wallet-cart-button-container'><div class='wallet-cart-button wallet-cart-button__skeleton' role='button' disabled aria-hidden='true'> </div></li> </ul> </div> </shopify-accelerated-checkout-cart> </div> 1546 </div> 1547 1548 </div> 1549 </div> 1550 1551 </form> 1552 </script>
1552 1553
1553<script id="AjaxQty" type="text/template"> 1554 1555 <div class="ajaxcart__qty"> 1556 <button type="button" class="ajaxcart__qty-adjust ajaxcart__qty--minus icon-fallback-text" data-id="{{id}}" data-qty="{{itemMinus}}"> 1557 <i class="fa fa-minus" aria-hidden="true"></i> 1558 <span class="fallback-text">−</span> 1559 </button> 1560 <input type="text" class="ajaxcart__qty-num" value="{{itemQty}}" min="0" data-id="{{id}}" aria-label="quantity" pattern="[0-9]*"> 1561 <button type="button" class="ajaxcart__qty-adjust ajaxcart__qty--plus icon-fallback-text" data-id="{{id}}" data-qty="{{itemAdd}}"> 1562 <i class="fa fa-plus" aria-hidden="true"></i> 1563 <span class="fallback-text">+</span> 1564 </button> 1565 </div> 1566 1567 </script>
1567 1568
1568<script id="JsQty" type="text/template"> 1569 1570 <div class="js-qty-wrapper"> 1571 <div class="js-qty"> 1572 <button type="button" class="js-qty__adjust js-qty__adjust--minus icon-fallback-text" data-id="{{id}}" data-qty="{{itemMinus}}"> 1573 <i class="fa fa-minus" aria-hidden="true"></i> 1574 <span class="fallback-text">−</span> 1575 </button> 1576 <input type="text" class="js-qty__num" value="{{itemQty}}" min="1" data-id="{{id}}" aria-label="quantity" pattern="[0-9]*" name="{{inputName}}" id="{{inputId}}"> 1577 <button type="button" class="js-qty__adjust js-qty__adjust--plus icon-fallback-text" data-id="{{id}}" data-qty="{{itemAdd}}"> 1578 <i class="fa fa-plus" aria-hidden="true"></i> 1579 <span class="fallback-text">+</span> 1580 </button> 1581 </div> 1582 </div> 1583 1584 </script>
1584 1585 1586
1586<script src="//macaronparlour.com/cdn/shop/t/3/assets/ajax-cart.js?v=84059913681193162641592110085" type="text/javascript"></script>
1586 1587
1587<script> 1588 function init() { 1589 ajaxCart.init({ 1590 formSelector: '#AddToCartForm', 1591 cartContainer: '#CartContainer', 1592 addToCartSelector: '#AddToCart', 1593 cartCountSelector: '#CartCount', 1594 moneyFormat: "${{amount}}", 1595 }); 1596 } 1597 window.wetheme.$(init); 1598 document.addEventListener('shopify:section:load', init); 1599 1600 1601 window.wetheme.$(document.body).on('afterCartLoad.ajaxCart', function(evt, cart) { 1602 // Bind to 'afterCartLoad.ajaxCart' to run any javascript after the cart has loaded in the DOM 1603 timber.RightDrawer.open(); 1604 }); 1605 1606 </script>
1606 1607 1608 1609<div id="shopify-block-AdTBORzdUdm95L0F1Z__1537173939754162885" class="shopify-block shopify-app-block"> 1610
1611<script> 1612 window.accessProWidgetSettings = {"default_menu_language":"en","enable_features":true,"icon":"default","trigger_display":"icon","trigger_title":"Accessibility","icon_color_fill":"#23185c","icon_color_stroke":"#23185c","icon_position":"BR","icon_style":"thick","icon_shape":"circle","icon_size":"default","menu_content_color":"#333333","menu_header_background_color":"#23185c","menu_header_font_color":"#ffffff","open_accessibility_profile":true,"selected_languages":["en","fr","es","de"],"widget_size":"large","widget_title":"Accessibility Settings","widgetheight":"full","template":"minimal","color_template":"Indigo","show_icon_on_all_pages":true,"show_icon_on_particular_page":"","lang_l":true,"enableMenuSettings":{"alignment":true,"animation":true,"contrast":true,"cursor":true,"dyslexic":true,"fontscale":true,"fontweight":true,"headings":true,"images":true,"languages":true,"letterspacing":true,"linespacing":true,"links":true,"magnifier":true,"mission":true,"profiles":true,"readingguide":true,"readingmask":true,"reset":true,"saturation":true,"colorfilters":true,"sounds":true,"text2speech":true,"describeimages":false,"videos":true,"pagestructure":true,"textsummary":true,"virtualkeyboard":true,"dictionary":true,"invertcolors":true,"colorblind":false,"translatepage":true,"readerprofile":true,"seizureprofile":true,"adhdprofile":true,"cognitiveprofile":true,"visuallyimpairedprofile":true,"motorimpairedprofile":false,"elderlyprofile":false,"colorblindprofile":false,"linknavigation":false,"voicenavigation":true,"keyboardnavigation":false,"talkandtype":true,"customcolors":false}}; 1613 window.accessProComplianceSettings = {}; 1614 window.accessProCurrentPage = { 1615 pageType: "page", 1616 path: "\/pages\/about-us" 1617 }; 1618</script>
1618 1619 1620<style> 1621 1622 1623 .asw-widget-button-top { 1624 position: absolute !important; 1625 top: 10px !important; 1626 left: 10px !important; 1627 background-color: #000 !important; 1628 color: #fff !important; 1629 text-decoration: none !important; 1630 overflow: hidden; 1631 width: 1px !important; 1632 height: 1px !important; 1633 margin: -1px !important; 1634 padding: 0 !important; 1635 border: 0 !important; 1636 clip: rect(0 0 0 0) !important; 1637 word-wrap: normal !important; 1638 } 1639 .asw-widget-button-top-focused, 1640 .asw-widget-button-top:focus { 1641 z-index: 9999 !important; 1642 overflow: auto !important; 1643 width: auto !important; 1644 height: auto !important; 1645 clip: auto !important; 1646 padding: 10px 15px !important; 1647 } 1648 1649 #acp-virtualKeyboardPopup { 1650 position: fixed; 1651 bottom: 80px; 1652 left: 50%; 1653 transform: translateX(-50%); 1654 background: #ffffff !important; 1655 border: 1px solid #ccc; 1656 padding: 8px; 1657 box-shadow: 0 8px 20px rgba(0, 0, 0, 0.2); 1658 z-index: 9999; 1659 display: none; 1660 width: 90%; 1661 max-width: 600px; 1662 border-radius: 10px; 1663 } 1664 1665 #acp-virtual-input { 1666 width: 100%; 1667 padding: 10px; 1668 font-size: 16px; 1669 margin-bottom: 10px; 1670 } 1671 1672 #acp-closeKeyboardBtn { 1673 color: #fff; 1674 border: none; 1675 padding: 1px 3px; 1676 cursor: pointer; 1677 float: right; 1678 border-radius: 4px; 1679 margin-bottom: 5px; 1680 } 1681 #acp-definition-popup { 1682 position: absolute; 1683 display: none; 1684 padding: 10px; 1685 background: white; 1686 border: 1px solid #ccc; 1687 z-index: 1000; 1688 border-radius: 14px; 1689 } 1690</style> 1691 1692<div id="acp-icon"></div> 1693<div id="acp-widget"></div> 1694 1695<!-- Virtual Keyboard Input and Keyboard --> 1696<div 1697 id="acp-definition-popup" 1698></div> 1699<div 1700 id="acp-dictionary-toast" 1701 class="asw-text-speech-bar" 1702 style="display: none;" 1703 data-ap-translate="DICTIONARY DESC" 1704> 1705 Double click on a word to see the definition. 1706</div> 1707<div id="acp-virtualKeyboardPopup" role="dialog" aria-modal="true" aria-label="Virtual keyboard popup"> 1708 <button id="acp-closeKeyboardBtn" aria-label="Close virtual keyboard"> 1709 <svg 1710 xmlns="http://www.w3.org/2000/svg" 1711 width="24" 1712 height="24" 1713 viewBox="0 0 24 24" 1714 fill="none" 1715 > 1716 <path 1717 d="M18 6L6 18" 1718 stroke="black" 1719 strokeWidth="2" 1720 strokeLinecap="round" 1721 strokeLinejoin="round" 1722 /> 1723 <path 1724 d="M6 6L18 18" 1725 stroke="black" 1726 strokeWidth="2" 1727 strokeLinecap="round" 1728 strokeLinejoin="round" 1729 /> 1730 </svg> 1731 </button> 1732 1733 <div id="acp-virtual-keyboard" class="simple-keyboard"></div> 1734
1734<script> 1735 function makeDraggableVirtualKeyboard(el) { 1736 let pos1 = 0, 1737 pos2 = 0, 1738 pos3 = 0, 1739 pos4 = 0; 1740 1741 el.onmousedown = dragMouseDown; 1742 1743 function dragMouseDown(e) { 1744 e.preventDefault(); 1745 pos3 = e.clientX; 1746 pos4 = e.clientY; 1747 document.onmouseup = closeDragElement; 1748 document.onmousemove = elementDrag; 1749 } 1750 1751 function elementDrag(e) { 1752 e.preventDefault(); 1753 pos1 = pos3 - e.clientX; 1754 pos2 = pos4 - e.clientY; 1755 pos3 = e.clientX; 1756 pos4 = e.clientY; 1757 el.style.top = el.offsetTop - pos2 + 'px'; 1758 el.style.left = el.offsetLeft - pos1 + 'px'; 1759 el.style.bottom = 'unset'; 1760 el.style.right = 'unset'; 1761 } 1762 1763 function closeDragElement() { 1764 document.onmouseup = null; 1765 document.onmousemove = null; 1766 } 1767 } 1768 1769 makeDraggableVirtualKeyboard(document.getElementById('acp-virtualKeyboardPopup')); 1770 </script>
1770 1771</div>
1772<script> 1773 // App Procxy Handle 1774 1775 window.accessProProxyHandle = '/apps/access-pro'; 1776 1777 1778 // URLs 1779 window.accessProSettingsUrl = `${window.accessProProxyHandle}/theme/settings/`; 1780 window.accessProPageViewsCountUrl = `${window.accessProProxyHandle}/theme/views/update/count`; 1781 1782 1783 // Translation URL 1784 var shopify_domain = `mparlour.myshopify.com`; 1785 window.accessProTranslationUrl = `https://access-pro-api.entanglecommerce.com/api/v1/language/translate/?domain=${shopify_domain}`; 1786 window.pageViewsCountURL = `${window.accessProProxyHandle}/theme/views/update/count`; 1787</script>
1787 1788
1789<script src="https://cdn.shopify.com/extensions/01a0a4a2-9ae1-7bbf-bb1e-1aa291044673/access-pro-2-243/assets/main.js" defer></script>
vendor: 1 bytes, line 1789
1789
1790<script> 1791 (function () { 1792 var params = new URLSearchParams(window.location.search); 1793 var token = params.get('acp_scan'); 1794 if (!token) return; 1795 1796 function showScanOverlay(message) { 1797 var el = document.getElementById('acp-scan-overlay'); 1798 if (!el) { 1799 el = document.createElement('div'); 1800 el.id = 'acp-scan-overlay'; 1801 el.style.cssText = 1802 '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;'; 1803 el.innerHTML = 1804 '<div style="text-align:center;max-width:320px;padding:24px">' + 1805 '<p style="font-size:18px;font-weight:600;margin:0 0 8px;color:#111">Scanning for accessibility</p>' + 1806 '<p id="acp-scan-overlay-status" style="font-size:14px;color:#666;margin:0"></p>' + 1807 '</div>'; 1808 document.body.appendChild(el); 1809 } 1810 var status = document.getElementById('acp-scan-overlay-status'); 1811 if (status) status.textContent = message || 'Please waitâ¦'; 1812 } 1813 1814 showScanOverlay('Preparing accessibility scanâ¦'); 1815 1816 function hideOverlay() { 1817 var el = document.getElementById('acp-scan-overlay'); 1818 if (el) el.style.display = 'none'; 1819 } 1820 1821 function submitScanResult(payload) { 1822 var params = new URLSearchParams(window.location.search); 1823 var jobId = params.get('acp_job'); 1824 if (!jobId) { 1825 return; 1826 } 1827 1828 var pageUrl = window.location.origin + window.location.pathname; 1829 fetch(window.accessProProxyHandle + '/theme/accessibility-scan/complete', { 1830 method: 'POST', 1831 headers: { 'Content-Type': 'application/json' }, 1832 body: JSON.stringify({ 1833 jobId: jobId, 1834 scanToken: token, 1835 url: pageUrl, 1836 axeResults: payload.results || null, 1837 error: 1838 payload.type === 'accesspro-axe-scan-error' 1839 ? payload.message || 'Accessibility scan failed' 1840 : null, 1841 }), 1842 }) 1843 .then(function (response) { 1844 return response.json().catch(function () { 1845 return {}; 1846 }); 1847 }) 1848 .then(function (data) { 1849 if (window.opener) { 1850 var isFinal = data.reportId != null; 1851 var isNextScanPage = false; 1852 if (data.redirectUrl) { 1853 try { 1854 isNextScanPage = new URL(data.redirectUrl).searchParams.has('acp_scan'); 1855 } catch (e) {} 1856 } 1857 1858 window.opener.postMessage( 1859 { 1860 type: 'accesspro-axe-scan-progress', 1861 jobId: jobId, 1862 redirectUrl: data.redirectUrl || null, 1863 reportId: data.reportId != null ? data.reportId : null, 1864 error: data.success ? null : (data.message || 'Scan failed'), 1865 }, 1866 '*', 1867 ); 1868 1869 if (isFinal) { 1870 showScanOverlay('Returning to your audit reportâ¦'); 1871 return; 1872 } 1873 1874 if (isNextScanPage && data.redirectUrl) { 1875 showScanOverlay('Scanning next pageâ¦'); 1876 window.location.href = data.redirectUrl; 1877 return; 1878 } 1879 1880 setTimeout(function () { 1881 window.close(); 1882 }, 400); 1883 return; 1884 } 1885 if (data.redirectUrl) { 1886 showScanOverlay('Returning to your audit reportâ¦'); 1887 window.location.href = data.redirectUrl; 1888 return; 1889 } 1890 showScanOverlay(data.message || 'Scan failed'); 1891 if (window.opener) { 1892 window.opener.postMessage( 1893 { 1894 type: 'accesspro-axe-scan-progress', 1895 jobId: jobId, 1896 error: data.message || 'Scan failed', 1897 }, 1898 '*', 1899 ); 1900 } 1901 }) 1902 .catch(function (err) { 1903 var message = 1904 (err && err.message) || 'Scan failed'; 1905 showScanOverlay(message); 1906 if (window.opener) { 1907 var jobIdErr = new URLSearchParams(window.location.search).get('acp_job'); 1908 window.opener.postMessage( 1909 { 1910 type: 'accesspro-axe-scan-progress', 1911 jobId: jobIdErr, 1912 error: message, 1913 }, 1914 '*', 1915 ); 1916 } 1917 }); 1918 } 1919 1920 function waitForFullPageLoad() { 1921 return new Promise(function (resolve) { 1922 function settle() { 1923 // Extended settle time for dynamic content, carousels, lazy sections 1924 // Wait for network idle + animations + JS state changes 1925 setTimeout(function() { 1926 // Wait for any lazy images to finish loading 1927 var images = Array.prototype.slice.call(document.querySelectorAll('img[loading="lazy"]')); 1928 var pendingImages = images.filter(function(img) { 1929 return !img.complete; 1930 }); 1931 1932 if (pendingImages.length > 0) { 1933 var loaded = 0; 1934 var timeout = setTimeout(function() { 1935 resolve(); // Don't wait forever 1936 }, 2000); 1937
1938 pendingImages.forEach(function(img) { 1939 function handleLoad() { 1940 loaded++; 1941 if (loaded >= pendingImages.length) { 1942 clearTimeout(timeout); 1943 // Additional wait for any pending RAF or microtasks 1944 requestAnimationFrame(function() { 1945 setTimeout(resolve, 100); 1946 }); 1947 } 1948 } 1949 img.addEventListener('load', handleLoad, { once: true }); 1950 img.addEventListener('error', handleLoad, { once: true }); 1951 }); 1952 } else { 1953 // Additional wait for any pending RAF or microtasks 1954 requestAnimationFrame(function() { 1955 setTimeout(resolve, 100); 1956 }); 1957 } 1958 }, 3000); 1959 } 1960 if (document.readyState === 'complete') { 1961 settle(); 1962 return; 1963 } 1964 window.addEventListener('load', settle, { once: true }); 1965 }); 1966 } 1967 1968 // Port of accessibility-scanner Phase 3 WCAG 2.2 / APG checks (browser-side). 1969 // Findings are merged into axe violations/incomplete so the existing pipeline needs no changes. 1970 function isAccessProScanElement(el) { 1971 if (!el || !el.closest) return false; 1972 return !!( 1973 el.closest('#acp-icon') || 1974 el.closest('#acp-widget') || 1975 el.closest('#acp-virtualKeyboardPopup') || 1976 el.closest('#acp-definition-popup') || 1977 el.closest('#acp-dictionary-toast') || 1978 el.closest('#acp-scan-overlay') || 1979 el.closest('[id^="acp-"]') || 1980 el.closest('.asw-widget-button-top') 1981 ); 1982 } 1983 1984 // Enhanced element visibility check including all CSS hiding techniques 1985 function isElementVisible(el) { 1986 if (!el || !el.getBoundingClientRect) return false; 1987 var style = window.getComputedStyle(el); 1988 if (style.display === 'none' || style.visibility === 'hidden') return false; 1989 if (style.opacity === '0') return false; 1990 if (style.position === 'absolute' && style.clip === 'rect(0px, 0px, 0px, 0px)') return false; 1991 if (style.width === '1px' && style.height === '1px' && style.overflow === 'hidden') return false; 1992 var rect = el.getBoundingClientRect(); 1993 if (rect.width === 0 || rect.height === 0) return false; 1994 return true; 1995 } 1996 1997 function runWcag22Checks() { 1998 var violations = []; 1999 var incomplete = []; 2000 2001 try { 2002 // WCAG 2.4.11 Focus Not Obscured â sticky/fixed heuristic (manual review) 2003 var stickyElements = Array.prototype.slice 2004 .call(document.querySelectorAll('*')) 2005 .filter(function (el) { 2006 if (isAccessProScanElement(el)) return false; 2007 if (!isElementVisible(el)) return false; 2008 var style = getComputedStyle(el); 2009 return ( 2010 (style.position === 'sticky' || style.position === 'fixed') && 2011 el.getBoundingClientRect().height > 40 2012 ); 2013 }) 2014 .slice(0, 5) 2015 .map(function (el) { 2016 var style = getComputedStyle(el); 2017 return { 2018 tag: el.tagName.toLowerCase(), 2019 id: el.id || null, 2020 height: Math.round(el.getBoundingClientRect().height), 2021 position: style.position, 2022 }; 2023 }); 2024 2025 if (stickyElements.length > 0) { 2026 incomplete.push({ 2027 id: 'focus-not-obscured', 2028 impact: 'serious', 2029 tags: ['wcag22aa', 'wcag2411'], 2030 description: 2031 'WCAG 2.4.11: Focused elements must not be entirely obscured. Fixed/sticky elements detected â manual keyboard testing required.', 2032 helpUrl: 2033 'https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html', 2034 nodes: stickyElements.map(function (e) { 2035 return { 2036 html: 2037 '<' + 2038 e.tag + 2039 (e.id ? ' id="' + e.id + '"' : '') + 2040 '> (' + 2041 e.position + 2042 ', ' + 2043 e.height + 2044 'px tall)', 2045 target: [e.tag + (e.id ? '#' + e.id : '')], 2046 failureSummary: 2047 'Fixed/sticky element may obscure focused components. Verify with keyboard navigation.', 2048 }; 2049 }), 2050 }); 2051 } 2052 2053 // NEW: aria-hidden-focus check - elements with aria-hidden="true" that are focusable 2054 var hiddenFocusable = []; 2055 document.querySelectorAll('[aria-hidden="true"]').forEach(function(el) { 2056 if (isAccessProScanElement(el)) return; 2057 // Check if this element or any descendant is focusable 2058 var focusableSelectors = 'a[href], button, input, select, textarea, [tabindex]:not
2058([tabindex="-1"])'; 2059 var focusables = el.matches(focusableSelectors) ? [el] : Array.prototype.slice.call(el.querySelectorAll(focusableSelectors)); 2060 focusables.forEach(function(focusEl) { 2061 if (isElementVisible(focusEl) && focusEl.tabIndex >= 0) { 2062 hiddenFocusable.push({ 2063 html: focusEl.outerHTML.slice(0, 500), 2064 selector: buildScanSelector(focusEl), 2065 parentHiddenHtml: el.outerHTML.slice(0, 200) 2066 }); 2067 } 2068 }); 2069 }); 2070 2071 if (hiddenFocusable.length > 0) { 2072 violations.push({ 2073 id: 'aria-hidden-focus', 2074 impact: 'serious', 2075 tags: ['wcag2aa', 'wcag412'], 2076 description: 'WCAG 4.1.2: Focusable elements must not be hidden with aria-hidden="true"', 2077 helpUrl: 'https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html', 2078 nodes: hiddenFocusable.slice(0, 10).map(function(item) { 2079 return { 2080 html: item.html, 2081 target: [item.selector], 2082 failureSummary: 'Focusable element is inside aria-hidden="true" container' 2083 }; 2084 }) 2085 }); 2086 } 2087 2088 // WCAG 2.5.3 Label in Name - Enhanced with better visible text extraction 2089 // Visible text = text rendered on screen (excludes aria-hidden, sr-only, SVG internals). 2090 function getVisibleText(el) { 2091 var text = ''; 2092 for (var i = 0; i < el.childNodes.length; i++) { 2093 var child = el.childNodes[i]; 2094 if (child.nodeType === 3) { text += child.textContent; continue; } 2095 if (child.nodeType !== 1) continue; 2096 if (child.getAttribute('aria-hidden') === 'true') continue; 2097 var st = window.getComputedStyle(child); 2098 if (st.display === 'none' || st.visibility === 'hidden') continue; 2099 if (st.opacity === '0') continue; 2100 if (st.position === 'absolute') { 2101 var clip = st.clip; 2102 if (clip === 'rect(0px, 0px, 0px, 0px)' || clip === 'rect(0, 0, 0, 0)') continue; 2103 } 2104 if (st.width === '1px' && st.height === '1px' && st.overflow === 'hidden') continue; 2105 if (st.fontSize === '0px' || st.width === '0px' || st.height === '0px') continue; 2106 text += getVisibleText(child); 2107 } 2108 return text; 2109 } 2110 function buildScanSelector(el) { 2111 if (el.id) return '#' + CSS.escape(el.id); 2112 var testId = el.getAttribute('data-testid') || el.getAttribute('data-test-id'); 2113 if (testId) return '[data-testid="' + testId + '"]'; 2114 var tag = el.tagName.toLowerCase(); 2115 var cls = (el.getAttribute('class') || '').split(/\s+/).filter(function (c) { 2116 return c && c.length < 60 && !/^(active|is-|js-|open|hidden|focus|hover)/i.test(c); 2117 }).slice(0, 3); 2118 return cls.length ? tag + '.' + cls.join('.') : tag; 2119 } 2120 2121 // Enhanced selector to catch more interactive elements 2122 var interactiveSelector = 'button, [role="button"], a[aria-label], [role="link"][aria-label], ' + 2123 '[role="menuitem"][aria-label], [role="tab"][aria-label], [role="checkbox"][aria-label], ' + 2124 '[role="radio"][aria-label], [role="switch"][aria-label], [role="combobox"][aria-label], ' + 2125 '[role="searchbox"][aria-label], [role="textbox"][aria-label]'; 2126 2127 var mismatches = Array.prototype.slice 2128 .call(document.querySelectorAll(interactiveSelector)) 2129 .filter(function (el) { 2130 return !isAccessProScanElement(el) && isElementVisible(el); 2131 }) 2132 .map(function (el) { 2133 var ariaLabel = el.getAttribute('aria-label') || ''; 2134 var visibleText = getVisibleText(el).replace(/\s+/g, ' ').trim(); 2135 if (!ariaLabel || !visibleText) return null; 2136 if (visibleText.length <= 1) return null; 2137 2138 // Normalize for comparison - remove punctuation and make case-insensitive 2139 var normalizedLabel = ariaLabel.toLowerCase().replace(/[^\w\s]/g, ''); 2140 var normalizedVisible = visibleText.toLowerCase().replace(/[^\w\s]/g, ''); 2141 2142 // Check if visible text is substring of aria-label
2143 if (normalizedLabel.includes(normalizedVisible)) return null; 2144 2145 // Check word-by-word containment for multi-word labels 2146 var visibleWords = normalizedVisible.split(/\s+/).filter(Boolean); 2147 if (visibleWords.length > 0) { 2148 var allWordsPresent = visibleWords.every(function(word) { 2149 return normalizedLabel.includes(word); 2150 }); 2151 if (allWordsPresent) return null; 2152 } 2153 2154 return { 2155 html: el.outerHTML.slice(0, 500), 2156 selector: buildScanSelector(el), 2157 ariaLabel: ariaLabel, 2158 visibleText: visibleText, 2159 }; 2160 }) 2161 .filter(Boolean) 2162 .slice(0, 10); 2163 2164 if (mismatches.length > 0) { 2165 violations.push({ 2166 id: 'label-in-name', 2167 impact: 'serious', 2168 tags: ['wcag21a', 'wcag253'], 2169 description: 'WCAG 2.5.3: Accessible name must contain visible label text', 2170 helpUrl: 'https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html', 2171 nodes: mismatches.map(function (m) { 2172 return { 2173 html: m.html, 2174 target: [m.selector], 2175 failureSummary: 2176 'aria-label="' + 2177 m.ariaLabel + 2178 '" does not contain visible text "' + 2179 m.visibleText + 2180 '"', 2181 }; 2182 }), 2183 }); 2184 } 2185 2186 // 2.5.7 Dragging Movements 2187 var draggableElements = Array.prototype.slice 2188 .call( 2189 document.querySelectorAll( 2190 '[draggable="true"], [data-sortable], .sortable-item', 2191 ), 2192 ) 2193 .filter(function (el) { 2194 return !isAccessProScanElement(el); 2195 }) 2196 .slice(0, 5) 2197 .map(function (el) { 2198 return { 2199 html: el.outerHTML.slice(0, 500), 2200 selector: buildScanSelector(el), 2201 }; 2202 }); 2203 2204 if (draggableElements.length > 0) { 2205 incomplete.push({ 2206 id: 'dragging-movements', 2207 impact: 'serious', 2208 tags: ['wcag22aa', 'wcag257'], 2209 description: 2210 'WCAG 2.5.7: Draggable elements must have a single-pointer alternative. Manual verification required.', 2211 helpUrl: 'https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html', 2212 nodes: draggableElements.map(function (e) { 2213 return { 2214 html: e.html, 2215 target: [e.selector], 2216 failureSummary: 2217 'Verify that a keyboard or single-pointer alternative exists for this drag operation.', 2218 }; 2219 }), 2220 }); 2221 } 2222 2223 // ARIA APG: Dialog Pattern 2224 var badDialogs = Array.prototype.slice 2225 .call(document.querySelectorAll('[role="dialog"], [role="alertdialog"]')) 2226 .filter(function (el) { 2227 if (isAccessProScanElement(el)) return false; 2228 return !( 2229 el.hasAttribute('aria-labelledby') || el.hasAttribute('aria-label') 2230 ); 2231 }) 2232 .slice(0, 5) 2233 .map(function (el) { 2234 return { 2235 html: el.outerHTML.slice(0, 500), 2236 selector: buildScanSelector(el), 2237 }; 2238 }); 2239 2240 if (badDialogs.length > 0) { 2241 violations.push({ 2242 id: 'dialog-missing-label', 2243 impact: 'serious', 2244 tags: ['aria-apg', 'wcag2aa'], 2245 description: 2246 'ARIA APG Dialog Pattern: role="dialog" must have aria-labelledby or aria-label', 2247 helpUrl: 'https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/', 2248 nodes: badDialogs.map(function (d) { 2249 return { 2250 html: d.html, 2251 target: [d.selector], 2252 failureSummary: 2253 'Add aria-labelledby pointing to a visible dialog title, or aria-label.', 2254 }; 2255 }), 2256 }); 2257 } 2258 2259 // ARIA APG: Tabs Pattern â tabs must have aria-selected (true on active, false on others
2259) 2260 var badTabs = []; 2261 Array.prototype.slice 2262 .call(document.querySelectorAll('[role="tablist"]')) 2263 .forEach(function (tabList) { 2264 if (isAccessProScanElement(tabList)) return; 2265 var tabs = Array.prototype.slice.call(tabList.querySelectorAll('[role="tab"]')); 2266 var hasAnySelected = tabs.some(function (t) { return t.getAttribute('aria-selected') === 'true'; }); 2267 tabs.forEach(function (tab) { 2268 if (isAccessProScanElement(tab)) return; 2269 if (!tab.hasAttribute('aria-selected')) { 2270 // Detect if this tab appears active (has aria-current, class "active", etc.) 2271 var looksActive = !hasAnySelected && tab.classList.contains('active'); 2272 badTabs.push({ 2273 html: tab.outerHTML.slice(0, 500), 2274 selector: buildScanSelector(tab), 2275 suggestValue: looksActive ? 'true' : 'false', 2276 }); 2277 } 2278 }); 2279 }); 2280 badTabs = badTabs.slice(0, 5); 2281 2282 if (badTabs.length > 0) { 2283 violations.push({ 2284 id: 'tabs-missing-aria-selected', 2285 impact: 'serious', 2286 tags: ['aria-apg', 'wcag2aa'], 2287 description: 2288 'ARIA APG Tabs Pattern: each [role="tab"] must have aria-selected="true" or aria-selected="false"', 2289 helpUrl: 'https://www.w3.org/WAI/ARIA/apg/patterns/tabs/', 2290 nodes: badTabs.map(function (t) { 2291 return { 2292 html: t.html, 2293 target: [t.selector], 2294 failureSummary: 2295 'Tab missing aria-selected. Suggested value: aria-selected="' + (t.suggestValue || 'false') + '"', 2296 }; 2297 }), 2298 }); 2299 } 2300 } catch (err) { 2301 console.warn( 2302 '[AccessPro][AxeScan][storefront] WCAG 2.2 checks error', 2303 err && err.message ? err.message : err, 2304 ); 2305 } 2306 2307 return { violations: violations, incomplete: incomplete }; 2308 } 2309 2310 function runAxeScan() { 2311 if (!window.axe) { 2312 showScanOverlay('Scan failed: axe-core not loaded'); 2313 notifyScanOpener({ 2314 type: 'accesspro-axe-scan-error', 2315 token: token, 2316 message: 'axe-core failed to load', 2317 }); 2318 return; 2319 } 2320 2321 // CRITICAL: Hide overlay before scan to prevent interference with color-contrast/visibility checks 2322 hideOverlay(); 2323 2324 // Run axe WITHOUT overlay visible to get accurate color contrast and visibility results 2325 window.axe 2326 .run(document, { 2327 runOnly: { 2328 type: 'tag', 2329 values: ['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'], 2330 }, 2331 exclude: [ 2332 ['#acp-icon'], 2333 ['#acp-widget'], 2334 ['#acp-virtualKeyboardPopup'], 2335 ['#acp-definition-popup'], 2336 ['#acp-dictionary-toast'], 2337 ['#acp-scan-overlay'], 2338 ['.asw-widget-button-top'], 2339 ], 2340 }) 2341 .then(function (results) { 2342 // Now safe to show overlay after scan completes 2343 showScanOverlay('Processing scan resultsâ¦'); 2344 var extra = runWcag22Checks(); 2345 if (!results.violations) results.violations = []; 2346 if (!results.incomplete) results.incomplete = []; 2347 // Scanner stores customChecks separately; merge into axe arrays so 2348 // buildAxeScanSummary (customChecks: []) still surfaces them. 2349 results.violations = results.violations.concat(extra.violations || []); 2350 results.incomplete = results.incomplete.concat(extra.incomplete || []); 2351 2352 // List rule only: axe often stores just the opening <ul> tag. 2353 // Re-serialize with direct children so the report/AI Fixes show the real issue. 2354 enrichListViolationNodes(results); 2355 2356 notifyScanOpener({ 2357 type: 'accesspro-axe-scan', 2358 token: token, 2359 url: window.location.href, 2360 results: results, 2361 }); 2362 }) 2363 .catch(function (err) { 2364 showScanOverlay('Scan failed'); 2365 notifyScanOpener({ 2366 type: 'accesspro-axe-scan-error', 2367 token: token, 2368 message: err && err.message ? err.message : 'Accessibility scan failed', 2369 }); 2370 }); 2371 } 2372 2373 /** 2374 * Optimize axe `list` node payloads only (no other rules). 2375 * Horizon overflow-list / ul[part=list] failures need children in HTML 2376 * so merchants see role=presentation / non-li children clearly. 2377 */ 2378 function enrichListViolationNodes(results) { 2379 var violations = results && results.violations; 2380 if (!violations || !violations.length) return; 2381 2382 function queryInRoot(root, sel) { 2383 if (!root || !sel) return null; 2384 try { 2385 return root.querySelector(sel); 2386 } catch (e) { 2387 return null; 2388 } 2389 } 2390 2391 function resolveShadowPath(path) { 2392 if (!path) return null; 2393 if (typeof path === 'string') { 2394 return ( 2395 queryInRoot(document, path) || 2396 queryDeepAll(path)[0] || 2397 null 2398 ); 2399 } 2400 if (!Array.isArray(path) || !path.length) return null; 2401 2402 // Nested shadow path: ["host", "inner"] or [["host", "inner"]] 2403 var steps = path; 2404 if (steps.length === 1 && Array.isArray(steps[0])) { 2405 steps = steps[0]; 2406 } 2407 2408 var ctx = document; 2409 var el = null; 2410 for (var i = 0; i < steps.length; i++) { 2411 var step = steps[i]; 2412 if (Array.isArray(step)) { 2413 el = resolveShadowPath(step); 2414 } else { 2415 el = queryInRoot(ctx, String(step)); 2416 if (!el && ctx === document) { 2417 el = queryDeepAll(String(step))[0] || null; 2418 } 2419 } 2420 if (!el) return null; 2421 ctx = el.shadowRoot || el; 2422 } 2423 return el; 2424 } 2425 2426 function queryDeepAll(sel) { 2427 var out = []; 2428 function walk(root) { 2429 if (!root || !root.querySelectorAll) return; 2430 try { 2431 Array.prototype.push.apply(out, root.querySelectorAll(sel)); 2432 } catch (e) { 2433 /* invalid selector */ 2434 } 2435 var all = root.querySelectorAll ? root.querySelectorAll('*') : []; 2436 for (var i = 0; i < all.length; i++) { 2437 if (all[i].shadowRoot) walk(all[i].shadowRoot); 2438 } 2439 } 2440 walk(document); 2441 return out; 2442 } 2443 2444 function serializeChildSnippet(child) { 2445 if (!child || !child.tagName) return ''; 2446 var tag = child.tagName.toLowerCase(); 2447 var role = (child.getAttribute && child.getAttribute('role')) || ''; 2448 var part = (child.getAttribute && child.getAttribute('part')) || ''; 2449 var cls = (child.getAttribute && child.getAttribute('class')) || ''; 2450 var open = 2451 '<' + 2452 tag + 2453 (role ? ' role="' + role + '"' : '') + 2454 (part ? ' part="' + part + '"' : '') + 2455 (cls 2456 ? ' class="' + 2457 String(cls) 2458 .trim() 2459 .split(/\s+/) 2460 .slice(0, 3) 2461 .join(' ') + 2462 '"' 2463 : '') + 2464 '>'; 2465 var text = (child.textContent || '').replace(/\s+/g, ' ').trim().slice(0, 40); 2466 return open + (text ? text : 'â¦') + '</' + tag + '>'; 2467 } 2468 2469 function serializeListHtml(listEl) { 2470 if (!listEl || !listEl.tagName) return ''; 2471 var tag = listEl.tagName.toLowerCase(); 2472 if (tag !== 'ul' && tag !== 'ol') return ''; 2473 var openMatch = String(listEl.outerHTML || '').match(/^<[^>]+>/); 2474 var openTag = openMatch ? openMatch[0] : '<' + tag + '>'; 2475 var children = Array.prototype.slice.call(listEl.children || []).slice(0, 10); 2476 if (!children.length) return openTag; 2477 var lines = children.map(function (child) { 2478 return ' ' + serializeChildSnippet(child); 2479 }); 2480 if ((listEl.children || []).length > 10) { 2481 lines.push(' <!-- ⦠' + (listEl.children.length - 10) + ' more -->'); 2482 } 2483 return openTag + '\n' + lines.join('\n') + '\n</' + tag + '>'; 2484 } 2485 2486 function findListFallback() { 2487 var candidates = queryDeepAll('ul[part="list"], overflow-list ul, ul, ol'); 2488 var withBad = candidates.filter(function (listEl) { 2489 return Array.prototype.some.call(listEl.children || [], function (child) { 2490 var role = (child.getAttribute && child.getAttribute('role')) || ''; 2491 var t = (child.tagName || '').toLowerCase(); 2492 return ( 2493 role === 'presentation' || 2494 role === 'none' || 2495 (t !== 'li' && t !== 'script' && t !== 'template' && t !== 'style') 2496 ); 2497 }); 2498 }); 2499 return withBad.length === 1 ? withBad[0] : null; 2500 } 2501 2502 violations.forEach(function (v) { 2503 if (!v || v.id !== 'list') return;
2504 (v.nodes || []).forEach(function (node) { 2505 if (!node) return; 2506 var hintHtml = String(node.html || ''); 2507 var el = resolveShadowPath(node.target); 2508 2509 // Flat axe targets like ["ul"] are too generic â prefer part=list from html hint. 2510 if ( 2511 el && 2512 /part\s*=\s*["']list["']/i.test(hintHtml) && 2513 !(el.getAttribute && el.getAttribute('part') === 'list') 2514 ) { 2515 var partLists = queryDeepAll('ul[part="list"]'); 2516 if (partLists.length === 1) el = partLists[0]; 2517 else if (partLists.length > 1) { 2518 var badPart = partLists.filter(function (listEl) { 2519 return Array.prototype.some.call(listEl.children || [], function (child) { 2520 var role = (child.getAttribute && child.getAttribute('role')) || ''; 2521 return role === 'presentation' || role === 'none'; 2522 }); 2523 }); 2524 if (badPart.length === 1) el = badPart[0]; 2525 } 2526 } 2527 2528 if (el && el.tagName) { 2529 var t = el.tagName.toLowerCase(); 2530 if (t !== 'ul' && t !== 'ol' && el.closest) { 2531 el = el.closest('ul, ol') || el; 2532 } 2533 } 2534 if (!el || !el.tagName || !/^(UL|OL)$/.test(el.tagName)) { 2535 el = findListFallback(); 2536 } 2537 if (!el) return; 2538 2539 var better = serializeListHtml(el); 2540 if (better && better.length > hintHtml.length) { 2541 node.html = better.slice(0, 2500); 2542 } 2543 2544 // Prefer a stable, actionable selector for Horizon chrome lists. 2545 if (el.getAttribute && el.getAttribute('part') === 'list') { 2546 node.target = ['ul[part="list"]']; 2547 } 2548 }); 2549 }); 2550 } 2551 2552 function notifyScanOpener(payload) { 2553 if (window.opener && payload.type === 'accesspro-axe-scan-error') { 2554 var jobId = new URLSearchParams(window.location.search).get('acp_job'); 2555 showScanOverlay('Scan failed'); 2556 window.opener.postMessage( 2557 { 2558 type: 'accesspro-axe-scan-progress', 2559 jobId: jobId, 2560 error: payload.message || 'Accessibility scan failed', 2561 }, 2562 '*', 2563 ); 2564 setTimeout(function () { 2565 window.close(); 2566 }, 400); 2567 return; 2568 } 2569 submitScanResult(payload); 2570 } 2571 2572 var script = document.createElement('script'); 2573 // cdnjs only goes up to 4.10.3; jsDelivr serves 4.11.1 (matches accessibility-scanner). 2574 script.src = 'https://cdn.jsdelivr.net/npm/[email protected]/axe.min.js'; 2575 script.onload = function () { 2576 waitForFullPageLoad().then(runAxeScan); 2577 }; 2578 script.onerror = function () { 2579 notifyScanOpener({ 2580 type: 'accesspro-axe-scan-error', 2581 token: token, 2582 message: 'Failed to load axe-core', 2583 }); 2584 }; 2585 document.head.appendChild(script); 2586 })(); 2587</script>
2587 2588 2589 2590<style> 2591 .accesspro-icon { 2592 display: inline-flex; 2593 flex-direction: column; 2594 align-items: center; 2595 gap: 4px; 2596 cursor: pointer; 2597 text-decoration: none; 2598 vertical-align: middle; 2599 color: var(--acp-trigger-color, #23185c); 2600 } 2601 2602 /* Icon-only triggers should not reserve a text line box. */ 2603 .accesspro-icon[icon='true']:not(.acp-trigger--has-text) { 2604 line-height: 0; 2605 } 2606 2607 .accesspro-icon .asw-menu-btn-container { 2608 flex-shrink: 0; 2609 } 2610 2611 /* The cloned icon is inert; the host element is the control. */ 2612 .accesspro-icon .asw-menu-btn-container, 2613 .accesspro-icon .asw-menu-btn { 2614 pointer-events: none; 2615 } 2616</style>
2617<script> 2618 (function () { 2619 var SELECTOR = '.accesspro-icon'; 2620 var BOUND = 'acpTriggerBound'; 2621 var FILLED = 'acpTriggerFilled'; 2622 var settings = window.accessProWidgetSettings || {}; 2623 var inlineMode = !!settings.hide_floating_icon; 2624 var fallbackReady = inlineMode; 2625 document.documentElement.style.setProperty( 2626 '--acp-trigger-color', 2627 settings.icon_color_fill || '#23185c' 2628 ); 2629 2630 /* ---- open the widget ------------------------------------------------ */ 2631 /* main.js is deferred, so iconInstance may not exist on an early click. */ 2632 function openWidget(event) { 2633 if (event) event.preventDefault(); 2634 if (window.iconInstance) { 2635 window.iconInstance.toggleWidget(); 2636 return; 2637 } 2638 var waited = 0; 2639 var timer = setInterval(function () { 2640 if (window.iconInstance) { 2641 clearInterval(timer); 2642 window.iconInstance.toggleWidget(); 2643 } else if ((waited += 100) >= 10000) { 2644 clearInterval(timer); 2645 console.error('[AccessPro] Widget did not load â cannot open menu.'); 2646 } 2647 }, 100); 2648 } 2649 2650 /* ---- clone the floating icon ---------------------------------------- */ 2651 function buildIcon() { 2652 var source = document.querySelector('#Access-Pro-Icon .asw-menu-btn-container'); 2653 if (!source) return null; 2654 2655 var clone = source.cloneNode(true); 2656 2657 // Strip ids: the widget mutates apMenuIconStroke / apMenuIconFill by id 2658 // when contrast modes change, and duplicates would shadow the original. 2659 clone.removeAttribute('id'); 2660 clone.querySelectorAll('[id]').forEach(function (node) { 2661 node.removeAttribute('id'); 2662 }); 2663 2664 // The dismiss "X" and loading dots belong to the floating icon only. 2665 clone.querySelectorAll('.asw-hide-widget-icon, .acp-floating-dots').forEach(function (node) { 2666 node.remove(); 2667 }); 2668 2669 // A <button> nested inside the merchant's <a>
2669 is invalid HTML. Swap it 2670 // for a <span> carrying the same classes so the widget CSS still applies. 2671 var button = clone.querySelector('.asw-menu-btn'); 2672 if (button) { 2673 var span = document.createElement('span'); 2674 span.className = button.className; 2675 span.setAttribute('style', button.getAttribute('style') || ''); 2676 span.setAttribute('aria-hidden', 'true'); 2677 while (button.firstChild) span.appendChild(button.firstChild); 2678 button.parentNode.replaceChild(span, button); 2679 } 2680 2681 return clone; 2682 } 2683 2684 2685 /* ---- fallback: build the icon from settings ------------------------- */ 2686 /* Used when the floating icon is not in the DOM â the widget skips 2687 render() entirely if the visitor dismissed it, if a page/country filter 2688 bails out of init(), or if trigger display is set to title-only. 2689 Geometry below mirrors render() in main.js exactly. */ 2690 var GLYPHS = { 2691 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>', 2692 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>', 2693 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>', 2694 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>', 2695 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>', 2696 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">
2696<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>' 2697 }; 2698 2699 var SIZES = { 2700 small: 40, '0.5x': 40, 2701 medium: 50, '1x': 50, default: 50, 2702 large: 60, '1.5x': 60, 2703 extraLarge: 75, '2x': 75 2704 }; 2705 2706 function buildIconFromSettings() { 2707 var s = window.accessProWidgetSettings || {}; 2708 var style = s.icon_style || 'thick'; 2709 var square = s.icon_shape === 'square'; 2710 // Defaults must match mergeSettings() in main.js and DEFAULT_SETTINGS in 2711 // app/constants/settings.js â both use #23185c for stroke AND fill â so a 2712 // metafield missing these keys renders identically on either path. 2713 var stroke = s.icon_color_stroke || '#23185c'; 2714 var fill = s.icon_color_fill || '#23185c'; 2715 var px = SIZES[s.icon_size] || 50; 2716 var solid = style === 'solid'; 2717 var thin = style === 'thin'; 2718 var shapes = ''; 2719 2720 if (square) { 2721 var sizes = [ 2722 [solid ? 100 : 98, stroke, 12], 2723 [solid ? 0 : thin ? 86 : 82, '#ffffff', 10], 2724 [solid || thin ? 80 : 70, fill, 8] 2725 ];
2726 sizes.forEach(function (d) { 2727 if (!d[0]) return; 2728 var off = (100 - d[0]) / 2; 2729 shapes += '<rect x="' + off + '" y="' + off + '" width="' + d[0] + '" height="' + d[0] + 2730 '" rx="' + d[2] + '" ry="' + d[2] + '" fill="' + d[1] + '" />'; 2731 }); 2732 } else { 2733 [ 2734 [solid ? 50 : 49, stroke], 2735 [solid ? 0 : thin ? 43 : 41, '#ffffff'], 2736 [solid || thin ? 40 : 35, fill] 2737 ].forEach(function (d) { 2738 shapes += '<circle cx="50" cy="50" r="' + d[0] + '" fill="' + d[1] + '" />'; 2739 }); 2740 } 2741 2742 var name = GLYPHS[s.icon] ? s.icon : 'default'; 2743 var box = document.createElement('div'); 2744 box.className = 'asw-menu-btn-container'; 2745 box.setAttribute('style', 'position:relative;width:' + px + 'px;height:' + px + 'px;'); 2746 // The widget stylesheet may not be loaded when render() never ran, so 2747 // every layout-critical rule is inlined rather than left to the classes. 2748 box.innerHTML = 2749 '<span class="asw-menu-btn' + (square ? ' asw-menu-btn--square' : '') + '" aria-hidden="true"' + 2750 ' style="position:relative;display:flex;align-items:center;justify-content:center;' + 2751 'width:100%;height:100%;background:transparent;border:none;padding:0;margin:0;' + 2752 'border-radius:' + (square ? '12%' : '50%') + ';">' + 2753 '<svg class="asw-outer-svg" viewBox="0 0 100 100" aria-hidden="true" focusable="false"' + 2754 ' style="width:100%;height:100%;display:block;">' + shapes + '</svg>' + 2755 GLYPHS[name] + '</span>'; 2756 2757 var glyph = box.querySelector('.asw-main-icon'); 2758 if (glyph) { 2759 // .asw-main-icon sizes to 50% via CSS; the default glyph overrides to 45% inline. 2760 var pct = name === 'default' ? '45%' : '50%'; 2761 glyph.setAttribute( 2762 'style', 2763 'position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);' + 2764 'width:' + pct + ';height:' + pct + ';fill:#ffffff;z-index:100;' 2765 ); 2766 } 2767 return box; 2768 } 2769 2770 /* ---- wire one element ----------------------------------------------- */ 2771 function bind(el) { 2772 if (el.dataset[BOUND]) return; 2773 el.dataset[BOUND] = '1'; 2774 2775 el.addEventListener('click', openWidget); 2776 el.addEventListener('keydown', function (event) { 2777 if (event.key === 'Enter' || event.key === ' ') openWidget(event); 2778 }); 2779 2780 // A non-anchor host (div/span) needs explicit button semantics. 2781 var tag = el.tagName.toLowerCase(); 2782 if (tag !== 'a' && tag !== 'button') { 2783 if (!el.hasAttribute('role')) el.setAttribute('role', 'button'); 2784 if (!el.hasAttribute('tabindex')) el.setAttribute('tabindex', '0'); 2785 } 2786 2787 if (el.textContent.trim()) el.classList.add('acp-trigger--has-text'); 2788 } 2789 2790 function fillIcon(el, allowFallback) { 2791 if (el.dataset[FILLED]) return true; 2792 if (el.getAttribute('icon') !== 'true') return true; 2793 2794 // Prefer cloning the live icon; fall back to rebuilding from settings. 2795 var icon = buildIcon(); 2796 if (!icon && (allowFallback || inlineMode)) icon = buildIconFromSettings(); 2797 if (!icon) return false; 2798 2799 // The clone's size lives only in the container's inline style. If the 2800 // widget rendered without one, size it from settings so it cannot 2801 // collapse to zero height inside the merchant's layout. 2802 if (!/\bheight\s*:/.test(icon.getAttribute('style') || '')) { 2803 var px = SIZES[(window.accessProWidgetSettings || {}).icon_size] || 50; 2804 icon.style.position = 'relative'; 2805 icon.style.width = px + 'px'; 2806 icon.style.height = px + 'px'; 2807 } 2808 2809 el.insertBefore(icon, el.firstChild); 2810 el.dataset[FILLED] = '1'; 2811 2812 // Icon with no visible text needs an accessible name. 2813 if (!el.textContent.trim() && !el.hasAttribute('aria-label')) { 2814 el.setAttribute('aria-label', 'Open Accessibility Menu'); 2815 } 2816 return true; 2817 } 2818 2819 /* ---- scan ------------------------------------------------------------ */ 2820 /* Clicks are wired immediately so the trigger works before the icon 2821 renders;
2821 icons are filled in once the floating icon exists. */ 2822 var pendingIcons = false; 2823 2824 function scan(allowFallback) { 2825 pendingIcons = false; 2826 document.querySelectorAll(SELECTOR).forEach(function (el) { 2827 bind(el); 2828 if (!fillIcon(el, allowFallback)) pendingIcons = true; 2829 }); 2830 } 2831 2832 function start() { 2833 scan(inlineMode); 2834 2835 // Inline mode hides the floating icon, so build from settings immediately. 2836 if (inlineMode) { 2837 // console.log('[AccessPro] Inline triggers â using widget settings for icons'); 2838 } 2839 2840 // The floating icon only renders after the settings request resolves and 2841 // the widget chunk loads, so poll until it appears. If it never does, 2842 // stop waiting and build the icon from settings instead. 2843 var FALLBACK_AFTER = 2500; 2844 var waited = 0; 2845 var timer = setInterval(function () { 2846 if (!pendingIcons) { 2847 clearInterval(timer); 2848 return; 2849 } 2850 waited += 200; 2851 if (waited < FALLBACK_AFTER) { 2852 scan(false); 2853 return; 2854 } 2855 fallbackReady = true; 2856 clearInterval(timer); 2857 scan(true); 2858 if (pendingIcons) { 2859 console.warn('[AccessPro] Could not render inline icons.'); 2860 } 2861 }, 200); 2862 2863 // Catch triggers added later (theme editor re-renders, dynamic sections). 2864 // Debounced: the widget itself mutates the DOM heavily as it renders. 2865 if (window.MutationObserver) { 2866 var queued = false; 2867 new window.MutationObserver(function () { 2868 if (queued) return; 2869 queued = true; 2870 requestAnimationFrame(function () { 2871 queued = false; 2872 scan(fallbackReady || inlineMode); 2873 }); 2874 }).observe(document.body, { childList: true, subtree: true }); 2875 } 2876 } 2877 2878 if (document.readyState === 'loading') { 2879 document.addEventListener('DOMContentLoaded', start); 2880 } else { 2881 start(); 2882 } 2883 })(); 2884</script>
2884 2885 2886 2887</div>
2887<script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
2887 2888</body> 2889</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.