PageSourceSearch

https://macaronparlour.com/pages/about-us

html macaronparlour.com collected 2026-09-26 05:38:55 UTC 143,971 bytes, 2,889 lines download raw bytes

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 &ndash; 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&amp;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&region_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">&rsaquo;</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 &amp; 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="/">&copy; 2026, Macaron Parlour</a></li>
1353          <li><a target="_blank" rel="nofollow" href="https://www.shopify.com?utm_campaign=poweredby&amp;utm_medium=shopify&amp;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">&minus;</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="[{&quot;supports_subs&quot;:true,&quot;supports_def_opts&quot;:false,&quot;name&quot;:&quot;shop_pay&quot;,&quot;wallet_params&quot;:{&quot;shopId&quot;:41049948314,&quot;merchantName&quot;:&quot;Macaron Parlour&quot;,&quot;personalized&quot;:true}},{&quot;supports_subs&quot;:true,&quot;supports_def_opts&quot;:false,&quot;name&quot;:&quot;paypal&quot;,&quot;wallet_params&quot;:{&quot;shopId&quot;:41049948314,&quot;countryCode&quot;:&quot;US&quot;,&quot;merchantName&quot;:&quot;Macaron Parlour&quot;,&quot;phoneRequired&quot;:false,&quot;companyRequired&quot;:false,&quot;shippingType&quot;:&quot;shipping&quot;,&quot;shopifyPaymentsEnabled&quot;:true,&quot;hasManagedSellingPlanState&quot;:false,&quot;requiresBillingAgreement&quot;:false,&quot;gatewayType&quot;:&quot;MANAGED&quot;,&quot;merchantId&quot;:&quot;5K45647C5PW9S&quot;,&quot;sdkUrl&quot;:&quot;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&quot;,&quot;serviceableCountryCodes&quot;:[&quot;AC&quot;,&quot;AD&quot;,&quot;AE&quot;,&quot;AF&quot;,&quot;AG&quot;,&quot;AI&quot;,&quot;AL&quot;,&quot;AM&quot;,&quot;AO&quot;,&quot;AR&quot;,&quot;AT&quot;,&quot;AU&quot;,&quot;AW&quot;,&quot;AX&quot;,&quot;AZ&quot;,&quot;BA&quot;,&quot;BB&quot;,&quot;BD&quot;,&quot;BE&quot;,&quot;BF&quot;,&quot;BG&quot;,&quot;BH&quot;,&quot;BI&quot;,&quot;BJ&quot;,&quot;BL&quot;,&quot;BM&quot;,&quot;BN&quot;,&quot;BO&quot;,&quot;BQ&quot;,&quot;BR&quot;,&quot;BS&quot;,&quot;BT&quot;,&quot;BW&quot;,&quot;BY&quot;,&quot;BZ&quot;,&quot;CA&quot;,&quot;CC&quot;,&quot;CD&quot;,&quot;CF&quot;,&quot;CG&quot;,&quot;CH&quot;,&quot;CI&quot;,&quot;CK&quot;,&quot;CL&quot;,&quot;CM&quot;,&quot;CN&quot;,&quot;CO&quot;,&quot;CR&quot;,&quot;CV&quot;,&quot;CW&quot;,&quot;CX&quot;,&quot;CY&quot;,&quot;CZ&quot;,&quot;DE&quot;,&quot;DJ&quot;,&quot;DK&quot;,&quot;DM&quot;,&quot;DO&quot;,&quot;DZ&quot;,&quot;EC&quot;,&quot;EE&quot;,&quot;EG&quot;,&quot;EH&quot;,&quot;ER&quot;,&quot;ES&quot;,&quot;ET&quot;,&quot;FI&quot;,&quot;FJ&quot;,&quot;FK&quot;,&quot;FO&quot;,&quot;FR&quot;,&quot;GA&quot;,&quot;GB&quot;,&quot;GD&quot;,&quot;GE&quot;,&quot;GF&quot;,&quot;GG&quot;,&quot;GH&quot;,&quot;GI&quot;,&quot;GL&quot;,&quot;GM&quot;,&quot;GN&quot;,&quot;GP&quot;,&quot;GQ&quot;,&quot;GR&quot;,&quot;GS&quot;,&quot;GT&quot;,&quot;GW&quot;,&quot;GY&quot;,&quot;HK&quot;,&quot;HN&quot;,&quot;HR&quot;,&quot;HT&quot;,&quot;HU&quot;,&quot;ID&quot;,&quot;IE&quot;,&quot;IL&quot;,&quot;IM&quot;,&quot;IN&quot;,&quot;IO&quot;,&quot;IQ&quot;,&quot;IS&quot;,&quot;IT&quot;,&quot;JE&quot;,&quot;JM&quot;,&quot;JO&quot;,&quot;JP&quot;,&quot;KE&quot;,&quot;KG&quot;,&quot;KH&quot;,&quot;KI&quot;,&quot;KM&quot;,&quot;KN&quot;,&quot;KR&quot;,&quot;KW&quot;,&quot;KY&quot;,&quot;KZ&quot;,&quot;LA&quot;,&quot;LB&quot;,&quot;LC&quot;,&quot;LI&quot;,&quot;LK&quot;,&quot;LR&quot;,&quot;LS&quot;,&quot;LT&quot;,&quot;LU&quot;,&quot;LV&quot;,&quot;LY&quot;,&quot;MA&quot;,&quot;MC&quot;,&quot;MD&quot;,&quot;ME&quot;,&quot;MF&quot;,&quot;MG&quot;,&quot;MK&quot;,&quot;ML&quot;,&quot;MM&quot;,&quot;MN&quot;,&quot;MO&quot;,&quot;MQ&quot;,&quot;MR&quot;,&quot;MS&quot;,&quot;MT&quot;,&quot;MU&quot;,&quot;MV&quot;,&quot;MW&quot;,&quot;MX&quot;,&quot;MY&quot;,&quot;MZ&quot;,&quot;NA&quot;,&quot;NC&quot;,&quot;NE&quot;,&quot;NF&quot;,&quot;NG&quot;,&quot;NI&quot;,&quot;NL&quot;,&quot;NO&quot;,&quot;NP&quot;,&quot;NR&quot;,&quot;NU&quot;,&quot;NZ&quot;,&quot;OM&quot;,&quot;PA&quot;,&quot;PE&quot;,&quot;PF&quot;,&quot;PG&quot;,&quot;PH&quot;,&quot;PK&quot;,&quot;PL&quot;,&quot;PM&quot;,&quot;PN&quot;,&quot;PS&quot;,&quot;PT&quot;,&quot;PY&quot;,&quot;QA&quot;,&quot;RE&quot;,&quot;RO&quot;,&quot;RS&quot;,&quot;RU&quot;,&quot;RW&quot;,&quot;SA&quot;,&quot;SB&quot;,&quot;SC&quot;,&quot;SD&quot;,&quot;SE&quot;,&quot;SG&quot;,&quot;SH&quot;,&quot;SI&quot;,&quot;SJ&quot;,&quot;SK&quot;,&quot;SL&quot;,&quot;SM&quot;,&quot;SN&quot;,&quot;SO&quot;,&quot;SR&quot;,&quot;SS&quot;,&quot;ST&quot;,&quot;SV&quot;,&quot;SX&quot;,&quot;SZ&quot;,&quot;TA&quot;,&quot;TC&quot;,&quot;TD&quot;,&quot;TF&quot;,&quot;TG&quot;,&quot;TH&quot;,&quot;TJ&quot;,&quot;TK&quot;,&quot;TL&quot;,&quot;TM&quot;,&quot;TN&quot;,&quot;TO&quot;,&quot;TR&quot;,&quot;TT&quot;,&quot;TV&quot;,&quot;TW&quot;,&quot;TZ&quot;,&quot;UA&quot;,&quot;UG&quot;,&quot;UM&quot;,&quot;US&quot;,&quot;UY&quot;,&quot;UZ&quot;,&quot;VA&quot;,&quot;VC&quot;,&quot;VE&quot;,&quot;VG&quot;,&quot;VN&quot;,&quot;VU&quot;,&quot;WF&quot;,&quot;WS&quot;,&quot;XK&quot;,&quot;YE&quot;,&quot;YT&quot;,&quot;ZA&quot;,&quot;ZM&quot;,&quot;ZW&quot;]}}]" access-token="1a345ab5bcd5929ae1f1b278b42384a4" buyer-country="US" buyer-locale="en" buyer-currency="USD" shop-id="41049948314" cart-id="8e1a7cdea4b0d50ccd716ddf4c28d841" enabled-flags="[&quot;1172c16a&quot;,&quot;a1d1f9a1&quot;,&quot;f5afabb3&quot;,&quot;370070f3&quot;]" > <div class="wallet-button-wrapper"> <ul class='wallet-cart-grid wallet-cart-grid--skeleton' role="list" data-shopify-buttoncontainer="true"> <li data-testid='grid-cell' class='wallet-cart-button-container'><div class='wallet-cart-button wallet-cart-button__skeleton' role='button' disabled aria-hidden='true'>&nbsp</div></li><li data-testid='grid-cell' class='wallet-cart-button-container'><div class='wallet-cart-button wallet-cart-button__skeleton' role='button' disabled aria-hidden='true'>&nbsp</div></li> </ul> </div> </shopify-accelerated-checkout-cart> </div>
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">&minus;</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">&minus;</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.