PageSourceSearch

https://www.mooncatcrystals.com/search

html mooncatcrystals.com collected 2026-10-04 12:28:38 UTC 326,523 bytes, 4,129 lines download raw bytes

1<!doctype html>
2
3<html lang="en" dir="ltr">
4  <head>
5    <meta charset="utf-8">
6    <meta name="viewport" content="width=device-width, initial-scale=1.0, height=device-height, minimum-scale=1.0, maximum-scale=5.0">
7
8    <title>
9      Search
10    </title><meta name="description" content="Shop hand-selected, one-of-a-kind crystals, rare specimens, and everyday favorites from Mooncat Crystals. Free U.S. shipping over $55."><link rel="canonical" href="https://www.mooncatcrystals.com/search"><link rel="shortcut icon" href="//www.mooncatcrystals.com/cdn/shop/files/Untitled_design_4.avif?v=1771447662&width=96">
11      <link rel="apple-touch-icon" href="//www.mooncatcrystals.com/cdn/shop/files/Untitled_design_4.avif?v=1771447662&width=180"><link rel="preconnect" href="https://fonts.shopifycdn.com" crossorigin><link rel="preload" href="//www.mooncatcrystals.com/cdn/fonts/merriweather/merriweather_n4.349a72bc63b970a8b7f00dc33f5bda2ec52f79cc.woff2" as="font" type="font/woff2" crossorigin><meta property="og:type" content="website">
12  <meta property="og:title" content="Search"><meta property="og:image" content="http://www.mooncatcrystals.com/cdn/shop/files/0_3_-_2024-04-16T162550.059.jpg?v=1765735599&width=2048">
13  <meta property="og:image:secure_url" content="https://www.mooncatcrystals.com/cdn/shop/files/0_3_-_2024-04-16T162550.059.jpg?v=1765735599&width=2048">
14  <meta property="og:image:width" content="1456">
15  <meta property="og:image:height" content="816"><meta property="og:description" content="Shop hand-selected, one-of-a-kind crystals, rare specimens, and everyday favorites from Mooncat Crystals. Free U.S. shipping over $55."><meta property="og:url" content="https://www.mooncatcrystals.com/search">
16<meta property="og:site_name" content="Mooncat Crystals"><meta name="twitter:card" content="summary"><meta name="twitter:title" content="Search">
17  <meta name="twitter:description" content="Shop hand-selected, one-of-a-kind crystals, rare specimens, and everyday favorites from Mooncat Crystals. Free U.S. shipping over $55."><meta name="twitter:image" content="https://www.mooncatcrystals.com/cdn/shop/files/0_3_-_2024-04-16T162550.059.jpg?crop=center&height=1200&v=1765735599&width=1200">
18  <meta name="twitter:image:alt" content="0_3_-_2024-04-16T162550.059 - Mooncat Crystals">
18<script type="application/ld+json">
19  {
20    "@context": "https://schema.org",
21    "@type": "BreadcrumbList",
22    "itemListElement": [{
23        "@type": "ListItem",
24        "position": 1,
25        "name": "Home",
26        "item": "https://www.mooncatcrystals.com"
27      }]
28  }
29</script>
29<style>/* Typography (heading) */
30  @font-face {
31  font-family: Merriweather;
32  font-weight: 400;
33  font-style: normal;
34  font-display: fallback;
35  src: url("//www.mooncatcrystals.com/cdn/fonts/merriweather/merriweather_n4.349a72bc63b970a8b7f00dc33f5bda2ec52f79cc.woff2") format("woff2"),
36       url("//www.mooncatcrystals.com/cdn/fonts/merriweather/merriweather_n4.5a396c75a89c25b516c9d3cb026490795288d821.woff") format("woff");
37}
38
39@font-face {
40  font-family: Merriweather;
41  font-weight: 400;
42  font-style: italic;
43  font-display: fallback;
44  src: url("//www.mooncatcrystals.com/cdn/fonts/merriweather/merriweather_i4.f5b9cf70acd5cd4d838a0ca60bf8178b62cb1301.woff2") format("woff2"),
45       url("//www.mooncatcrystals.com/cdn/fonts/merriweather/merriweather_i4.946cfa27ccfc2ba1850f3e8d4115a49e1be34578.woff") format("woff");
46}
47
48/* Typography (body) */
49  
50
51
52
53:root {
54    /* Container */
55    --container-max-width: 100%;
56    --container-xxs-max-width: 27.5rem; /* 440px */
57    --container-xs-max-width: 42.5rem; /* 680px */
58    --container-sm-max-width: 61.25rem; /* 980px */
59    --container-md-max-width: 71.875rem; /* 1150px */
60    --container-lg-max-width: 78.75rem; /* 1260px */
61    --container-xl-max-width: 85rem; /* 1360px */
62    --container-gutter: 1.25rem;
63
64    --section-vertical-spacing: 2.5rem;
65    --section-vertical-spacing-tight:2.5rem;
66
67    --section-stack-gap:2.25rem;
68    --section-stack-gap-tight:2.25rem;
69
70    /* Form settings */
71    --form-gap: 1.25rem; /* Gap between fieldset and submit button */
72    --fieldset-gap: 1rem; /* Gap between each form input within a fieldset */
73    --form-control-gap: 0.625rem; /* Gap between input and label (ignored for floating label) */
74    --checkbox-control-gap: 0.75rem; /* Horizontal gap between checkbox and its associated label */
75    --input-padding-block: 0.65rem; /* Vertical padding for input, textarea and native select */
76    --input-padding-inline: 0.8rem; /* Horizontal padding for input, textarea and native select */
77    --checkbox-size: 0.875rem; /* Size (width and height) for checkbox */
78
79    /* Other sizes */
80    --sticky-area-height: calc(var(--announcement-bar-is-sticky, 0) * var(--announcement-bar-height, 0px) + var(--header-is-sticky, 0) * var(--header-is-visible, 1) * var(--header-height, 0px));
81
82    /* RTL support */
83    --transform-logical-flip: 1;
84    --transform-origin-start: left;
85    --transform-origin-end: right;
86
87    /**
88     * ---------------------------------------------------------------------
89     * TYPOGRAPHY
90     * ---------------------------------------------------------------------
91     */
92
93    /* Font properties */
94    --heading-font-family: Merriweather, serif;
95    --heading-font-weight: 400;
96    --heading-font-style: normal;
97    --heading-text-transform: normal;
98    --heading-letter-spacing: 0.0em;
99    --text-font-family: "system_ui", -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', 'Noto Sans', 'Liberation Sans', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
100    --text-font-weight: 400;
101    --text-font-style: normal;
102    --text-letter-spacing: 0.0em;
103    --button-font: var(--text-font-style) var(--text-font-weight) var(--text-sm) / 1.65 var(--text-font-family);
104    --button-text-transform: uppercase;
105    --button-letter-spacing: 0.0em;
106
107    /* Font sizes */--text-heading-size-factor: 1.3;
108    --text-h1: max(0.75rem, clamp(1.375rem, 1.146341463414634rem + 0.975609756097561vw, 2rem) * var(--text-heading-size-factor));
109    --text-h2: max(0.75rem, clamp(1.25rem, 1.0670731707317074rem + 0.7804878048780488vw, 1.75rem) * var(--text-heading-size-factor));
110    --text-h3: max(0.75rem, clamp(1.125rem, 1.0335365853658536rem + 0.3902439024390244vw, 1.375rem) * var(--text-heading-size-factor));
111    --text-h4: max(0.75rem, clamp(1rem, 0.9542682926829268rem + 0.1951219512195122vw, 1.125rem) * var(--text-heading-size-factor));
112    --text-h5: max(0.70rem, calc(0.875rem * var(--text-heading-size-factor)));
113    --text-h6: max(0.70rem, calc(0.75rem * var(--text-heading-size-factor)));
114
115    --text-xs: 0.8125rem;
116    --text-sm: 0.875rem;
117    --text-base: 0.9375rem;
118    --text-lg: 1.0625rem;
119    --text-xl: 1.1875rem;
120
121    /* Rounded variables (used for border radius) */
122    --rounded-full: 9999px;
123    --button-border-radius: 0.375rem;
124    --input-border-radius: 0.0rem;
125
126    /* Box shadow */
127    --shadow-sm: 0 2px 8px rgb(0 0 0 / 0.05);
128    --shadow: 0 5px 15px rgb(0 0 0 / 0.05);
129    --shadow-md: 0 5px 30px rgb(0 0 0 / 0.05);
130    --shadow-block: px px px rgb(var(--text-primary) / 0.0);
131
132    /* Product card */--product-card-text-transform: normal;/**
133     * ---------------------------------------------------------------------
134     * OTHER
135     * ---------------------------------------------------------------------
136     */
137
138    --checkmark-svg-url: url(//www.mooncatcrystals.com/cdn/shop/t/75/assets/checkmark.svg?v=175315494453250978671791042495);
139    --cursor-zoom-in-svg-url: url(//www.mooncatcrystals.com/cdn/shop/t/75/assets/cursor-zoom-in.svg?v=85763434084857931701791042495);
140  }
141
142  [dir="rtl"]:root {
143    /* RTL support */
144    --transform-logical-flip: -1;
145    --transform-origin-start: right;
146    --transform-origin-end: left;
147  }
148
149  @media screen and (min-width: 700px) {
150    :root {
151      /* Typography (font size) */
152      --text-xs: 0.8125rem;
153      --text-sm: 0.875rem;
154      --text-base: 0.9375rem;
155      --text-lg: 1.0625rem;
156      --text-xl: 1.3125rem;
157
158      /* Spacing settings */
159      --container-gutter: 2rem;
160    }
161  }
162
163  @media screen and (min-width: 1000px) {
164    :root {
165      /* Spacing settings */
166      --container-gutter: 3rem;
167
168      --section-vertical-spacing: 4rem;
169      --section-vertical-spacing-tight: 4rem;
170
171      --section-stack-gap:3rem;
172      --section-stack-gap-tight:3rem;
173    }
174  }:root {/* Overlay used for modal */
175    --page-overlay: 0 0 0 / 0.4;
176
177    /* We use the first scheme background as default */
178    --page-background: ;
179
180    /* Product colors */
181    --on-sale-text: 179 159 206;
182    --on-sale-badge-background: 179 159 206;
183    --on-sale-badge-text: 0 0 0 / 0.65;
184    --sold-out-badge-background: 226 32 214;
185    --sold-out-badge-text: 255 255 255;
186    --custom-badge-background: 28 28 28;
187    --custom-badge-text: 255 255 255;
188    --star-color: 179 159 206;
189
190    /* Status colors */
191    --success-background: 239 235 245;
192    --success-text: 179 159 206;
193    --warning-background: 253 241 224;
194    --warning-text: 237 138 0;
195    --error-background: 248 201 245;
196    --error-text: 226 32 214;
197
198    /* Modal scheme */
199    --modal-scheme-background: 0 0 0;
200    --modal-scheme-background-gradient: ;
201    --modal-scheme-text-color: 229 203 179;
202  }.color-scheme--scheme-1 {
203      /* Color settings */--accent: 229 203 179;
204      --text-color: 229 203 179;
205      --background: 0 0 0 / 1.0;
206      --background-without-opacity: 0 0 0;
207      --background-gradient: ;--border-color: 34 30 27;/* Button colors */
208      --button-background: 229 203 179;
209      --button-text-color: 0 0 0;
210
211      /* Circled buttons */
212      --circle-button-background: 229 203 179;
213      --circle-button-text-color: 0 0 0;
214    }.shopify-section:has(.section-spacing.color-scheme--bg-77e774e6cc4d94d6a32f6256f02d9552) + .shopify-section:has(.section-spacing.color-scheme--bg-77e774e6cc4d94d6a32f6256f02d9552:not(.bordered-section)) .section-spacing {
215      padding-block-start: 0;
216    }.color-scheme--scheme-2 {
217      /* Color settings */--accent: 28 28 28;
218      --text-color: 28 28 28;
219      --background: 236 226 218 / 1.0;
220      --background-without-opacity: 236 226 218;
221      --background-gradient: ;--border-color: 205 196 189;/* Button colors */
222      --button-background: 28 28 28;
223      --button-text-color: 230 204 184;
224
225      /* Circled buttons */
226      --circle-button-background: 28 27 27;
227      --circle-button-text-color: 229 203 179;
228    }.shopify-section:has(.section-spacing.color-scheme--bg-477aa13b0d09f93ddc7f8e0ea1bd0108) + .shopify-section:has(.section-spacing.color-scheme--bg-477aa13b0d09f93ddc7f8e0ea1bd0108:not(.bordered-section)) .section-spacing {
229      padding-block-start: 0;
230    }.color-scheme--scheme-3 {
231      /* Color settings */--accent: 229 203 179;
232      --text-color: 28 28 28;
233      --background: 230 204 184 / 1.0;
234      --background-without-opacity: 230 204 184;
235      --background-gradient: ;--border-color: 200 178 161;/* Button colors */
236      --button-background: 229 203 179;
237      --button-text-color: 28 28 28;
238
239      /* Circled buttons */
240      --circle-button-background: 229 203 179;
241      --circle-button-text-color: 28 28 28;
242    }.shopify-section:has(.section-spacing.color-scheme--bg-d9b4cb9619d2399ae305cd072bd6b063) + .shopify-section:has(.section-spacing.color-scheme--bg-d9b4cb9619d2399ae305cd072bd6b063:not(.bordered-section)) .section-spacing {
243      padding-block-start: 0;
244    }.color-scheme--scheme-4 {
245      /* Color settings */--accent: 229 203 179;
246      --text-color: 236 226 218;
247      --background: 0 0 0 / 0.0;
248      --background-without-opacity: 0 0 0;
249      --background-gradient: ;--border-color: 236 226 218;/* Button colors */
250      --button-background: 229 203 179;
251      --button-text-color: 28 28 28;
252
253      /* Circled buttons */
254      --circle-button-background: 229 203 179;
255      --circle-button-text-color: 28 28 28;
256    }.shopify-section:has(.section-spacing.color-scheme--bg-3671eee015764974ee0aef1536023e0f) + .shopify-section:has(.section-spacing.color-scheme--bg-3671eee015764974ee0aef1536023e0f:not(.bordered-section)) .section-spacing {
257      padding-block-start: 0;
258    }.color-scheme--scheme-f4c9257b-9dc8-45ba-9c87-b66f08007c2d {
259      /* Color settings */--accent: 229 203 179;
260      --text-color: 229 203 179;
261      --background: 0 0 0 / 1.0;
262      --background-without-opacity: 0 0 0;
263      --background-gradient: ;--border-color: 34 30 27;/* Button colors */
264      --button-background: 229 203 179;
265      --button-text-color: 28 28 28;
266
267      /* Circled buttons */
268      --circle-button-background: 229 203 179;
269      --circle-button-text-color: 28 28 28;
270    }.shopify-section:has(.section-spacing.color-scheme--bg-77e774e6cc4d94d6a32f6256f02d9552) + .shopify-section:has(.section-spacing.color-scheme--bg-77e774e6cc4d94d6a32f6256f02d9552:not(.bordered-section)) .section-spacing {
271      padding-block-start: 0;
272    }.color-scheme--scheme-54ae2632-a486-4d27-8640-db1245421a5f {
273      /* Color settings */--accent: 60 11 85;
274      --text-color: 0 0 0;
275      --background: 0 0 0 / 1.0;
276      --background-without-opacity: 0 0 0;
277      --background-gradient: radial-gradient(rgba(238, 241, 250, 1), rgba(217, 205, 223, 1) 100%, rgba(233, 237, 242, 1) 100%);--border-color: 0 0 0 / 0.15;/* Button colors */
278      --button-background: 60 11 85;
279      --button-text-color: 255 255 255;
280
281      /* Circled buttons */
282      --circle-button-background: 229 203 179;
283      --circle-button-text-color: 0 0 0;
284    }.shopify-section:has(.section-spacing.color-scheme--bg-45cbb080c51d07a98860d91501ffbb32) + .shopify-section:has(.section-spacing.color-scheme--bg-45cbb080c51d07a98860d91501ffbb32:not(.bordered-section)) .section-spacing {
285      padding-block-start: 0;
286    }.color-scheme--scheme-23c610f6-9768-444e-9f7a-5918a9c20fc6 {
287      /* Color settings */--accent: 236 226 218;
288      --text-color: 0 0 0;
289      --background: 0 0 0 / 1.0;
290      --background-without-opacity: 0 0 0;
291      --background-gradient: linear-gradient(320deg, rgba(187, 176, 166, 1) 15%, rgba(203, 197, 196, 1) 52%, rgba(203, 194, 184, 1) 87%);--border-color: 0 0 0 / 0.15;/* Button colors */
292      --button-background: 236 226 218;
293      --button-text-color: 0 0 0;
294
295      /* Circled buttons */
296      --circle-button-background: 236 226 218;
297      --circle-button-text-color: 0 0 0;
298    }.shopify-section:has(.section-spacing.color-scheme--bg-7d61cc4913d13ed8cc8f238b2187b6f2) + .shopify-section:has(.section-spacing.color-scheme--bg-7d61cc4913d13ed8cc8f238b2187b6f2:not(.bordered-section)) .section-spacing {
299      padding-block-start: 0;
300    }
300.color-scheme--scheme-a886a427-bbaf-42e8-98ef-f134bb63352d {
301      /* Color settings */--accent: 255 255 255;
302      --text-color: 0 0 0;
303      --background: 0 0 0 / 1.0;
304      --background-without-opacity: 0 0 0;
305      --background-gradient: linear-gradient(331deg, rgba(186, 180, 192, 1) 8%, rgba(204, 198, 209, 1) 47%, rgba(203, 196, 203, 1) 81%);--border-color: 0 0 0 / 0.15;/* Button colors */
306      --button-background: 255 255 255;
307      --button-text-color: 0 0 0;
308
309      /* Circled buttons */
310      --circle-button-background: 167 152 171;
311      --circle-button-text-color: 0 0 0;
312    }.shopify-section:has(.section-spacing.color-scheme--bg-9b5a98489319383d1629ac836da4b1d5) + .shopify-section:has(.section-spacing.color-scheme--bg-9b5a98489319383d1629ac836da4b1d5:not(.bordered-section)) .section-spacing {
313      padding-block-start: 0;
314    }.color-scheme--scheme-ceca7f28-b4ec-4dd0-948a-1eee49d1a659 {
315      /* Color settings */--accent: 229 203 179;
316      --text-color: 229 203 179;
317      --background: 0 0 0 / 1.0;
318      --background-without-opacity: 0 0 0;
319      --background-gradient: linear-gradient(143deg, rgba(31, 40, 42, 1) 2%, rgba(43, 25, 52, 1) 45%, rgba(8, 1, 12, 1) 100%);--border-color: 229 203 179 / 0.15;/* Button colors */
320      --button-background: 229 203 179;
321      --button-text-color: 0 0 0;
322
323      /* Circled buttons */
324      --circle-button-background: 229 203 179;
325      --circle-button-text-color: 0 0 0;
326    }.shopify-section:has(.section-spacing.color-scheme--bg-93a69da05e0bc2b7626de00bf91c5a5a) + .shopify-section:has(.section-spacing.color-scheme--bg-93a69da05e0bc2b7626de00bf91c5a5a:not(.bordered-section)) .section-spacing {
327      padding-block-start: 0;
328    }.color-scheme--scheme-9e0c9a52-fb38-4b5a-a739-89c941636568 {
329      /* Color settings */--accent: 255 255 255;
330      --text-color: 255 255 255;
331      --background: 230 204 184 / 1.0;
332      --background-without-opacity: 230 204 184;
333      --background-gradient: ;--border-color: 234 212 195;/* Button colors */
334      --button-background: 255 255 255;
335      --button-text-color: 129 107 143;
336
337      /* Circled buttons */
338      --circle-button-background: 129 107 143;
339      --circle-button-text-color: 129 107 143;
340    }.shopify-section:has(.section-spacing.color-scheme--bg-d9b4cb9619d2399ae305cd072bd6b063) + .shopify-section:has(.section-spacing.color-scheme--bg-d9b4cb9619d2399ae305cd072bd6b063:not(.bordered-section)) .section-spacing {
341      padding-block-start: 0;
342    }.color-scheme--scheme-0b2f80a3-0389-4150-8d0c-46c6e2bb17ec {
343      /* Color settings */--accent: 229 203 179;
344      --text-color: 0 0 0;
345      --background: 236 226 218 / 1.0;
346      --background-without-opacity: 236 226 218;
347      --background-gradient: ;--border-color: 201 192 185;/* Button colors */
348      --button-background: 229 203 179;
349      --button-text-color: 0 0 0;
350
351      /* Circled buttons */
352      --circle-button-background: 229 203 179;
353      --circle-button-text-color: 0 0 0;
354    }.shopify-section:has(.section-spacing.color-scheme--bg-477aa13b0d09f93ddc7f8e0ea1bd0108) + .shopify-section:has(.section-spacing.color-scheme--bg-477aa13b0d09f93ddc7f8e0ea1bd0108:not(.bordered-section)) .section-spacing {
355      padding-block-start: 0;
356    }.color-scheme--scheme-eaf01382-a522-49a7-b3e7-f940a8fd8440 {
357      /* Color settings */--accent: 229 203 179;
358      --text-color: 229 203 179;
359      --background: 0 0 0 / 1.0;
360      --background-without-opacity: 0 0 0;
361      --background-gradient: ;--border-color: 34 30 27;/* Button colors */
362      --button-background: 229 203 179;
363      --button-text-color: 0 0 0;
364
365      /* Circled buttons */
366      --circle-button-background: 229 203 179;
367      --circle-button-text-color: 0 0 0;
368    }.shopify-section:has(.section-spacing.color-scheme--bg-77e774e6cc4d94d6a32f6256f02d9552) + .shopify-section:has(.section-spacing.color-scheme--bg-77e774e6cc4d94d6a32f6256f02d9552:not(.bordered-section)) .section-spacing {
369      padding-block-start: 0;
370    }.color-scheme--scheme-c25a17d5-38fe-4ead-afd2-e76dd10b0d60 {
371      /* Color settings */--accent: 205 166 168;
372      --text-color: 28 28 28;
373      --background: 227 216 224 / 1.0;
374      --background-without-opacity: 227 216 224;
375      --background-gradient: ;--border-color: 197 188 195;/* Button colors */
376      --button-background: 205 166 168;
377      --button-text-color: 0 0 0;
378
379      /* Circled buttons */
380      --circle-button-background: 205 166 168;
381      --circle-button-text-color: 0 0 0;
382    }.shopify-section:has(.section-spacing.color-scheme--bg-98344b0c2d93e56aa0573a0488bbe1a2) + .shopify-section:has(.section-spacing.color-scheme--bg-98344b0c2d93e56aa0573a0488bbe1a2:not(.bordered-section)) .section-spacing {
383      padding-block-start: 0;
384    }.color-scheme--scheme-ab90496d-c959-4f60-85fa-a62a0a4eb55c {
385      /* Color settings */--accent: 147 119 151;
386      --text-color: 0 0 0;
387      --background: 167 128 158 / 1.0;
388      --background-without-opacity: 167 128 158;
389      --background-gradient: ;--border-color: 142 109 134;/* Button colors */
390      --button-background: 147 119 151;
391      --button-text-color: 255 255 255;
392
393      /* Circled buttons */
394      --circle-button-background: 147 119 151;
395      --circle-button-text-color: 255 255 255;
396    }.shopify-section:has(.section-spacing.color-scheme--bg-d779f20bfb3893bf9568ea20a01de02d) + .shopify-section:has(.section-spacing.color-scheme--bg-d779f20bfb3893bf9568ea20a01de02d:not(.bordered-section)) .section-spacing {
397      padding-block-start: 0;
398    }.color-scheme--scheme-a6f4c9b3-fc13-43d8-9db4-779511027723 {
399      /* Color settings */--accent: 28 28 28;
400      --text-color: 255 255 255;
401      --background: 255 0 186 / 1.0;
402      --background-without-opacity: 255 0 186;
403      --background-gradient: ;--border-color: 255 38 196;/* Button colors */
404      --button-background: 28 28 28;
405      --button-text-color: 255 255 255;
406
407      /* Circled buttons */
408      --circle-button-background: 229 203 179;
409      --circle-button-text-color: 0 0 0;
410    }.shopify-section:has(.section-spacing.color-scheme--bg-53eb61efd293054bcab5cca77556aceb) + .shopify-section:has(.section-spacing.color-scheme--bg-53eb61efd293054bcab5cca77556aceb:not(.bordered-section)) .section-spacing {
411      padding-block-start: 0;
412    }.color-scheme--scheme-72719795-1b01-4441-814e-0cb6ad4b6fb1 {
413      /* Color settings */--accent: 206 187 230;
414      --text-color: 229 203 179;
415      --background: 0 0 0 / 1.0;
416      --background-without-opacity: 0 0 0;
417      --background-gradient: ;--border-color: 34 30 27;/* Button colors */
418      --button-background: 206 187 230;
419      --button-text-color: 0 0 0;
420
421      /* Circled buttons */
422      --circle-button-background: 179 159 206;
423      --circle-button-text-color: 0 0 0;
424    }.shopify-section:has(.section-spacing.color-scheme--bg-77e774e6cc4d94d6a32f6256f02d9552) + .shopify-section:has(.section-spacing.color-scheme--bg-77e774e6cc4d94d6a32f6256f02d9552:not(.bordered-section)) .section-spacing {
425      padding-block-start: 0;
426    }.color-scheme--scheme-20ce9b4c-3ee4-478d-824b-b000662e8744 {
427      /* Color settings */--accent: 236 167 240;
428      --text-color: 229 203 179;
429      --background: 0 0 0 / 1.0;
430      --background-without-opacity: 0 0 0;
431      --background-gradient: ;--border-color: 34 30 27;/* Button colors */
432      --button-background: 236 167 240;
433      --button-text-color: 0 0 0;
434
435      /* Circled buttons */
436      --circle-button-background: 236 167 240;
437      --circle-button-text-color: 0 0 0;
438    }.shopify-section:has(.section-spacing.color-scheme--bg-77e774e6cc4d94d6a32f6256f02d9552) + .shopify-section:has(.section-spacing.color-scheme--bg-77e774e6cc4d94d6a32f6256f02d9552:not(.bordered-section)) .section-spacing {
439      padding-block-start: 0;
440    }.color-scheme--dialog {
441    /* Color settings */--accent: 229 203 179;
442    --text-color: 229 203 179;
443    --background: 0 0 0 / 1.0;
444    --background-without-opacity: 0 0 0;
445    --background-gradient: ;--border-color: 34 30 27;/* Button colors */
446    --button-background: 229 203 179;
447    --button-text-color: 28 28 28;
448
449    /* Circled buttons */
450    --circle-button-background: 229 203 179;
451    --circle-button-text-color: 28 28 28;
452  }@view-transition {
453      navigation: auto;
454    }</style>
455<script>
456  // This allows to expose several variables to the global scope, to be used in scripts
457  window.themeVariables = {
458    settings: {
459      showPageTransition: true,
460      pageType: "search",
461      moneyFormat: "${{amount}}",
462      moneyWithCurrencyFormat: "${{amount}} USD",
463      currencyCodeEnabled: false,
464      cartType: "drawer",
465      staggerMenuApparition: true
466    },
467
468    strings: {
469      addedToCart: "Added to your cart!",
470      addedToCartWithTitle: "{{ product_title }} added to cart.",
471      closeGallery: "Close gallery",
472      zoomGallery: "Zoom picture",
473      errorGallery: "Image cannot be loaded",
474      shippingEstimatorNoResults: "Sorry, we do not ship to your address.",
475      shippingEstimatorOneResult: "There is one shipping rate for your address:",
476      shippingEstimatorMultipleResults: "There are several shipping rates for your address:",
477      shippingEstimatorError: "One or more error occurred while retrieving shipping rates:",
478      next: "Next",
479      previous: "Previous"
480    },
481
482    mediaQueries: {
483      'sm': 'screen and (min-width: 700px)',
484      'md': 'screen and (min-width: 1000px)',
485      'lg': 'screen and (min-width: 1150px)',
486      'xl': 'screen and (min-width: 1400px)',
487      '2xl': 'screen and (min-width: 1600px)',
488      'sm-max': 'screen and (max-width: 699px)',
489      'md-max': 'screen and (max-width: 999px)',
490      'lg-max': 'screen and (max-width: 1149px)',
491      'xl-max': 'screen and (max-width: 1399px)',
492      '2xl-max': 'screen and (max-width: 1599px)',
493      'motion-safe': '(prefers-reduced-motion: no-preference)',
494      'motion-reduce': '(prefers-reduced-motion: reduce)',
495      'supports-hover': 'screen and (pointer: fine)',
496      'supports-touch': 'screen and (hover: none)'
497    }
498  };</script>
vendor: 1 bytes, line 498
498
499<script async crossorigin fetchpriority="high" src="/cdn/shopifycloud/importmap-polyfill/es-modules-shim.2.4.0.js"></script>
vendor: 1 bytes, line 499
499
500<script type="importmap">{
501        "imports": {
502          "vendor": "//www.mooncatcrystals.com/cdn/shop/t/75/assets/vendor.min.js?v=53886175772894603331791042495",
503          "theme": "//www.mooncatcrystals.com/cdn/shop/t/75/assets/theme.js?v=13968561988284492361791042495",
504          "photoswipe": "//www.mooncatcrystals.com/cdn/shop/t/75/assets/photoswipe.min.js?v=13374349288281597431791042495"
505        }
506      }
507    </script>
507
508
509    
509<script type="module" src="//www.mooncatcrystals.com/cdn/shop/t/75/assets/vendor.min.js?v=53886175772894603331791042495"></script>
509
510    
510<script type="module" src="//www.mooncatcrystals.com/cdn/shop/t/75/assets/theme.js?v=13968561988284492361791042495"></script>
510
511
512    
512<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script>
512<meta name="google-site-verification" content="cuNu-CxAu58YdGTguV7MQoBu6bM3OpVi5HoER_2rTw8">
513<meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/21646515/digital_wallets/dialog">
514<meta id="in-context-paypal-metadata" data-shop-id="21646515" data-venmo-supported="false" data-environment="production" data-locale="en_US" data-paypal-v4="true" data-currency="USD">
515<link rel="ucp" href="/.well-known/ucp" version="2026-08-25">
515<script async="async" src="/checkouts/internal/preloads.js?locale=en-US"></script>
515
516<link rel="preconnect" href="https://shop.app" crossorigin="anonymous">
517<script async="async" src="https://shop.app/checkouts/internal/preloads.js?locale=en-US&shop_id=21646515" crossorigin="anonymous"></script>
vendor: 1 bytes, line 517
517
518<script id="apple-pay-shop-capabilities" type="application/json">{"shopId":21646515,"countryCode":"US","currencyCode":"USD","merchantCapabilities":["supports3DS"],"merchantId":"gid:\/\/shopify\/Shop\/21646515","merchantName":"Mooncat Crystals","requiredBillingContactFields":["postalAddress","email"],"requiredShippingContactFields":["postalAddress","email"],"shippingType":"shipping","supportedNetworks":["visa","masterCard","amex","discover","elo","jcb"],"total":{"type":"pending","label":"Mooncat Crystals","amount":"1.00"},"shopifyPaymentsEnabled":true,"supportsSubscriptions":true}</script>
vendor: 1 bytes, line 518
518
519<script id="shopify-features" type="application/json">{"accessToken":"3cac301c7b66f88cd676c7bd49b11c53","betas":["rich-media-storefront-analytics"],"domain":"www.mooncatcrystals.com","predictiveSearch":true,"shopId":21646515,"locale":"en"}</script>
vendor: 1 bytes, line 519
519
520<script>var Shopify = Shopify || {};
521Shopify.shop = "mooncat-crystals.myshopify.com";
522Shopify.locale = "en";
523Shopify.currency = {"active":"USD","rate":"1.0"};
524Shopify.country = "US";
525Shopify.theme = {"name":"Mooncat homepage v2 (draft)","id":188866494706,"schema_name":"Prestige","schema_version":"11.4.1","theme_store_id":855,"role":"main"};
526Shopify.theme.handle = "null";
527Shopify.theme.style = {"id":null,"handle":null};
528Shopify.cdnHost = "www.mooncatcrystals.com/cdn";
529Shopify.routes = Shopify.routes || {};
530Shopify.routes.root = "/";
531Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js";
532Shopify.SignInWithShop = Shopify.SignInWithShop || {};
533Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {};
534Shopify.SignInWithShop.User.recognized = false;</script>
vendor: 1 bytes, line 534
534
535<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
vendor: 1 bytes, line 535
535
536<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 536
536
537<script>
538  window.ShopifyPay = window.ShopifyPay || {};
539  window.ShopifyPay.apiHost = "shop.app\/pay";
540  window.ShopifyPay.redirectState = null;
541</script>
vendor: 1 bytes, line 541
541
542<script>
543  window.Shopify = window.Shopify || {};
544  window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {};
545  window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.25 };
546  window.Shopify.SignInWithShop.eligible = true;
547</script>
vendor: 1 bytes, line 547
547
548<script id="shop-js-analytics" type="application/json">{"pageType":"search"}</script>
vendor: 1 bytes, line 548
548
549<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 549
549
550<script type="module">
551  await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js");
552
553  window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true});
554
555</script>
vendor: 1 bytes, line 555
555
556<script>
557  window.Shopify = window.Shopify || {};
558  if (!window.Shopify.featureAssets) window.Shopify.featureAssets = {};
559  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"]};
560</script>
vendor: 1 bytes, line 560
560
561<script>(function() {
562  var isLoaded = false;
563  function asyncLoad() {
564    if (isLoaded) return;
565    isLoaded = true;
566    var urls = ["https:\/\/shopify-widget.route.com\/shopify.widget.js?shop=mooncat-crystals.myshopify.com","https:\/\/cdn.nfcube.com\/instafeed-cf47842f0091646deb093b8b7303d873.js?shop=mooncat-crystals.myshopify.com"];
567    for (var i = 0; i < urls.length; i++) {
568      var s = document.createElement('script');
569      s.type = 'text/javascript';
570      s.async = true;
571      s.src = urls[i];
572      var x = document.getElementsByTagName('script')[0];
573      x.parentNode.insertBefore(s, x);
574    }
575  };
576  if(window.attachEvent) {
577    window.attachEvent('onload', asyncLoad);
578  } else {
579    window.addEventListener('load', asyncLoad, false);
580  }
581})();</script>
vendor: 1 bytes, line 581
581
582<script id="__st">var __st={"a":21646515,"offset":-14400,"reqid":"cd32eab0-e18e-4d85-b961-bada8d053748-1791116918","pageurl":"www.mooncatcrystals.com\/search","u":"4efcb881c900","p":"searchresults"};</script>
vendor: 1 bytes, line 582
582
583<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
vendor: 1 bytes, line 583
583
584<script id="captcha-bootstrap">!function(){'use strict';const t='contact',e='account',n='new_comment',o=[[t,t],['blogs',n],['comments',n],[t,'customer']],c=[[e,'customer_login'],[e,'guest_login'],[e,'recover_customer_password'],[e,'create_customer']],r=t=>t.map((([t,e])=>`form[action*='/${t}']:not([data-nocaptcha='true']) input[name='form_type'][value='${e}']`)).join(','),a=t=>()=>t?[...document.querySelectorAll(t)].map((t=>t.form)):[];function s(){const t=[...o],e=r(t);return a(e)}const i='password',u='form_key',d=['recaptcha-v3-token','g-recaptcha-response','h-captcha-response',i],f=()=>{try{return window.sessionStorage}catch{return}},m='__shopify_v',_=t=>t.elements[u];function p(t,e,n=!1){try{const o=window.sessionStorage,c=JSON.parse(o.getItem(e)),{data:r}=function(t){const{data:e,action:n}=t;return t[m]||n?{data:e,action:n}:{data:t,action:n}}(c);for(const[e,n]of Object.entries(r))t.elements[e]&&(t.elements[e].value=n);n&&o.removeItem(e)}catch(o){console.error('form repopulation failed',{error:o})}}const l='form_type',E='cptcha';function T(t){t.dataset[E]=!0}const w=window,h=w.document,L='Shopify',v='ce_forms',y='captcha';let A=!1;((t,e)=>{const n=(g='f06e6c50-85a8-45c8-87d0-21a2b65856fe',I='https://cdn.shopify.com/shopifycloud/storefront-forms-hcaptcha/ce_storefront_forms_captcha_hcaptcha.v1.5.3.iife.js',D={infoText:'Protected by hCaptcha',privacyText:'Privacy',termsText:'Terms'},(t,e,n)=>{const o=w[L][v],c=o.bindForm;if(c)return c(t,g,e,D).then(n);var r;o.q.push([[t,g,e,D],n]),r=I,A||(h.body.append(Object.assign(h.createElement('script'),{id:'captcha-provider',async:!0,src:r})),A=!0)});var g,I,D;w[L]=w[L]||{},w[L][v]=w[L][v]||{},w[L][v].q=[],w[L][y]=w[L][y]||{},w[L][y].protect=function(t,e){n(t,void 0,e),T(t)},Object.freeze(w[L][y]),function(t,e,n,w,h,L){const[v,y,A,g]=function(t,e,n){const i=e?o:[],u=t?c:[],d=[...i,...u],f=r(d),m=r(i),_=r(d.filter((([t,e])=>n.includes(e))));return[a(f),a(m),a(_),s()]}(w,h,L),I=t=>{const e=t.target;return e instanceof HTMLFormElement?e:e&&e.form},D=t=>v().includes(t);t.addEventListener('submit',(t=>{const e=I(t);if(!e)return;const n=D(e)&&!e.dataset.hcaptchaBound&&!e.dataset.recaptchaBound,o=_(e),c=g().includes(e)&&(!o||!o.value);(n||c)&&t.preventDefault(),c&&!n&&(function(t){try{if(!f())return;!function(t){const e=f();if(!e)return;const n=_(t);if(!n)return;const o=n.value;o&&e.removeItem(o)}(t);const e=Array.from(Array(32),(()=>Math.random().toString(36)[2])).join('');!function(t,e){_(t)||t.append(Object.assign(document.createElement('input'),{type:'hidden',name:u})),t.elements[u].value=e}(t,e),function(t,e){const n=f();if(!n)return;const o=[...t.querySelectorAll(`input[type='${i}']`)].map((({name:t})=>t)),c=[...d,...o],r={};for(const[a,s]of new FormData(t).entries())c.includes(a)||(r[a]=s);n.setItem(e,JSON.stringify({[m]:1,action:t.action,data:r}))}(t,e)}catch(e){console.error('failed to persist form',e)}}(e),e.submit())}));const S=(t,e)=>{t&&!t.dataset[E]&&(n(t,e.some((e=>e===t))),T(t))};for(const o of['focusin','change'])t.addEventListener(o,(t=>{const e=I(t);D(e)&&S(e,y())}));const B=e.get('form_key'),M=e.get(l),P=B&&M;t.addEventListener('DOMContentLoaded',(()=>{const t=y();if(P)for(const e of t)e.elements[l].value===M&&p(e,B);[...new Set([...A(),...v().filter((t=>'true'===t.dataset.shopifyCaptcha))])].forEach((e=>S(e,t)))}))}(h,new URLSearchParams(w.location.search),n,t,e,['guest_login'])})(!0,!0)}();</script>
vendor: 1 bytes, line 584
584
585<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" defer="defer" src="//www.mooncatcrystals.com/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
vendor: 1 bytes, line 585
585
586<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 = "//www.mooncatcrystals.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>
586<script crossorigin="anonymous" defer="defer" src="//www.mooncatcrystals.com/cdn/shopifycloud/storefront/assets/shopify_pay/storefront-616277c7.js?v=20250812"></script>
vendor: 1 bytes, line 586
586
587<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 587
587
588<script>
589  window.Shopify = window.Shopify || {};
590  window.Shopify.MCP = window.Shopify.MCP || {};
591  window.Shopify.MCP.enabled = true;
592  window.Shopify.MCP.shop = "mooncat-crystals.myshopify.com";
593  window.Shopify.MCP.mcpEndpoint = "https:\/\/www.mooncatcrystals.com\/api\/mcp";
594  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"]}}];
595</script>
vendor: 1 bytes, line 595
595
596<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("\/\/www.mooncatcrystals.com\/cdn\/shopifycloud\/storefront\/assets\/storefront\/webmcp-c6b62ece.js","sha256-ke4DDuBjdvea3vxLWxHc9E9nq8zihuG4IfYEGbb77ys=");})();
597</script>
vendor: 1 bytes, line 597
597
598<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://www.mooncatcrystals.com/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}};
599</script>
vendor: 1 bytes, line 599
599
600<script data-source-attribution="shopify.dynamic_checkout.buyer_consent">
601  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);
602</script>
vendor: 1 bytes, line 602
602
603<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})}}));
604</script>
604
605<link id="shopify-accelerated-checkout-styles" rel="stylesheet" media="screen" href="https://www.mooncatcrystals.com/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css" crossorigin="anonymous">
606<style id="shopify-accelerated-checkout-cart">
607        #shopify-buyer-consent {
608  margin-top: 1em;
609  display: inline-block;
610  width: 100%;
611}
612
613#shopify-buyer-consent.hidden {
614  display: none;
615}
616
617#shopify-subscription-policy-button {
618  background: none;
619  border: none;
620  padding: 0;
621  text-decoration: underline;
622  font-size: inherit;
623  cursor: pointer;
624}
625
626#shopify-subscription-policy-button::before {
627  box-shadow: none;
628}
629
630      </style>
631
632<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
632
633<link href="//www.mooncatcrystals.com/cdn/shop/t/75/assets/theme.css?v=159064326163571637561791042495" rel="stylesheet" type="text/css" media="all" /><!-- BEGIN app block: shopify://apps/3d-seasonal-effects/blocks/app-embed/5881d1f8-9311-46cf-bb7d-8ebd2e22859c -->
634<script async src="https://app.seasoneffects.com/get_script/?shop_url=mooncat-crystals.myshopify.com"></script>
634
635
636
637<!-- END app block --><!-- BEGIN app block: shopify://apps/judge-me-reviews/blocks/judgeme_core/61ccd3b1-a9f2-4160-9fe9-4fec8413e5d8 --><!-- Start of Judge.me Core -->
638
639
640
641
642
643
644
645<link rel="dns-prefetch" href="https://cdn.judge.me">
646<link rel="dns-prefetch" href="https://cdn1.judge.me">
647<link rel="dns-prefetch" href="https://api.judge.me">
648
649<script data-cfasync='false' class='jdgm-settings-script'>window.jdgmSettings={"pagination":5,"disable_web_reviews":true,"coupon_receiving_condition":"any_review","coupon_value_type":"percentage","coupon_value_percentage":10,"coupon_value_fixed_amount":0,"coupon_discount_type":"single","coupon_tier_text_enabled":false,"coupon_tier_text_percentage":10,"coupon_tier_text_fixed_amount":0,"coupon_tier_photo_enabled":false,"coupon_tier_photo_percentage":10,"coupon_tier_photo_fixed_amount":0,"coupon_tier_video_enabled":false,"coupon_tier_video_percentage":10,"coupon_tier_video_fixed_amount":0,"enable_coupons":false,"badge_no_review_text":"No reviews","badge_n_reviews_text":"{{ n }} review/reviews","badge_star_color":"#d4b9a5","hide_badge_preview_if_no_reviews":true,"badge_hide_text":false,"enforce_center_preview_badge":false,"widget_title":"Customer Reviews","widget_open_form_text":"Write a review","widget_close_form_text":"Cancel review","widget_refresh_page_text":"Refresh page","widget_summary_text":"Based on {{ number_of_reviews }} review/reviews","widget_no_review_text":"Be the first to write a review","widget_name_field_text":"Display name","widget_verified_name_field_text":"Verified Name (public)","widget_name_placeholder_text":"Display name","widget_required_field_error_text":"This field is required.","widget_email_field_text":"Email address","widget_verified_email_field_text":"Verified Email (private, can not be edited)","widget_email_placeholder_text":"Your email address","widget_email_field_error_text":"Please enter a valid email address.","widget_rating_field_text":"Rating","widget_review_title_field_text":"Review Title","widget_review_title_placeholder_text":"Give your review a title","widget_review_body_field_text":"Review content","widget_review_body_placeholder_text":"Start writing here...","widget_pictures_field_text":"Picture/Video (optional)","widget_submit_review_text":"Submit Review","widget_submit_verified_review_text":"Submit Verified Review","widget_submit_success_msg_with_auto_publish":"Thank y
649ou! Please refresh the page in a few moments to see your review. You can remove or edit your review by logging into \u003ca href='https://judge.me/login' target='_blank' rel='nofollow noopener'\u003eJudge.me\u003c/a\u003e","widget_submit_success_msg_no_auto_publish":"Thank you! Your review will be published as soon as it is approved by the shop admin. You can remove or edit your review by logging into \u003ca href='https://judge.me/login' target='_blank' rel='nofollow noopener'\u003eJudge.me\u003c/a\u003e","widget_show_default_reviews_out_of_total_text":"Showing {{ n_reviews_shown }} out of {{ n_reviews }} reviews.","widget_show_all_link_text":"Show all","widget_show_less_link_text":"Show less","widget_author_said_text":"{{ reviewer_name }} said:","widget_days_text":"{{ n }} days ago","widget_weeks_text":"{{ n }} week/weeks ago","widget_months_text":"{{ n }} month/months ago","widget_years_text":"{{ n }} year/years ago","widget_yesterday_text":"Yesterday","widget_today_text":"Today","widget_replied_text":"\u003e\u003e {{ shop_name }} replied:","widget_read_more_text":"Read more","widget_reviewer_name_as_initial":"","widget_rating_filter_color":"#fbcd0a","widget_rating_filter_see_all_text":"See all reviews","widget_sorting_most_recent_text":"Most Recent","widget_sorting_highest_rating_text":"Highest Rating","widget_sorting_lowest_rating_text":"Lowest Rating","widget_sorting_with_pictures_text":"Only Pictures","widget_sorting_most_helpful_text":"Most Helpful","widget_open_question_form_text":"Ask a question","widget_reviews_subtab_text":"Reviews","widget_questions_subtab_text":"Questions","widget_question_label_text":"Question","widget_answer_label_text":"Answer","widget_question_placeholder_text":"Write your question here","widget_submit_question_text":"Submit Question","widget_question_submit_success_text":"Thank you for your question! We will notify you once it gets answered.","widget_star_color":"#d4b9a5","verified_badge_text":"Verified","verified_badge_bg_color":"","verified_badge_text_color":"","verified_badge_placement":"left-of-reviewer-name","widget_review_max_height":"","widget_hide_border":false,"widget_social_share":false,"widget_thumb":false,"widget_review_location_show":false,"widget_location_format":"","all_reviews_include_out_of_store_products":true,"all_reviews_out_of_store_text":"(out of store)","all_reviews_pagination":100,"all_reviews_product_name_prefix_text":"about","enable_review_pictures":true,"enable_question_anwser":false,"widget_theme":"default","review_date_format":"timestamp","default_sort_method":"most-recent","enable_ai_review_visibility":true,"widget_product_reviews_subtab_text":"Product Reviews","widget_shop_reviews_subtab_text":"Shop Reviews","widget_other_products_reviews_text":"Reviews for other products","widget_store_reviews_subtab_text":"Store reviews","widget_product_variant_reference_text":"Review for","widget_no_store_reviews_text":"This store hasn't received any reviews yet","widget_web_restriction_product_reviews_text":"This product hasn't received any reviews yet","widget_no_items_text":"No items found","widget_show_more_text":"Show more","widget_write_a_store_review_text":"Write a Store Review","widget_product_and_store_reviews_text":"Product and store reviews","widget_reviews_in_collection_text":"Reviews in this collection","widget_other_languages_heading":"Reviews in Other Languages","widget_translate_review_text":"Translate review to {{ language }}","widget_translating_review_text":"Translating...","widget_show_original_translation_text":"Show original ({{ language }})","widget_translate_review_failed_text":"Review couldn't be translated.","widget_translate_review_retry_text":"Retry","widget_translate_review_try_again_later_text":"Try again later","show_product_url_for_grouped_product":false,"widget_sorting_pictures_first_text":"Pictures First","show_pictures_on_all_rev_page_mobile":false,"show_pictures_on_all_rev_page_desktop":false,"floating_tab_hide_mobile_install_preference":false,"floating_tab_button_name":"★ Reviews","floating_tab_title":"Let customers speak for us","floating_tab_button_color":"","floating_tab_button_background_color":"","floating_tab_url":"","floating_tab_url_enabled":false,"floating_tab_tab_style":"text","all_reviews_text_badge_text":"Customers rate us {{ shop.metafields.judgeme.all_reviews_rating | round: 1 }}/5 based on {{ shop.metafields.judgeme.all_reviews_count }} reviews.","all_reviews_text_badge_text_branded_style":"{{ shop.metafields.judgeme.all_reviews_rating | round: 1 }} out of 5 stars based on {{ shop.metafields.judgeme.all_reviews_count }} reviews","is_all_reviews_text_badge_a_link":false,"show_stars_for_all_reviews_text_badge":false,"all_reviews_text_badge_url":"","all_reviews_text_style":"text","all_reviews_text_color_style":"judgeme_brand_color","all_reviews_text_color":"#108474","all_reviews_text_show_jm_brand":true,"featured_carousel_show_header":true,"featured_carousel_title":"Customer Reviews","testimonials_carousel_title":"Customers are saying","videos_carousel_title":"Real customer stories","cards_carousel_title":"Customers are saying","featured_carousel_count_text":"from {{ n }} reviews","featured_carousel_add_link_to_all_reviews_page":false,"featured_carousel_url":"","featured_carousel_show_images":false,"featured_carousel_autoslide_interval":5,"featured_carousel_arrows_on_the_sides":true,"featured_carousel_height":250,"featured_carousel_width":90,"featured_carousel_image_size":0,"featured_carousel_image_height":250,"featured_carousel_arrow_color":"#eeeeee","verified_count_badge_style":"vintage","verified_count_badge_orientation":"horizontal","verified_count_badge_color_style":"judgeme_brand_color","verified_count_badge_color":"#108474","is_verified_count_badge_a_link":false,"verified_count_badge_url":"","verified_count_badge_show_jm_brand":true,"widget_rating_preset_default":5,"widget_first_sub_tab":"product-reviews","widget_show_histogram":true,"widget_histogram_use_custom_color":false,"widget_pagination_use_custom_color":false,"widget_star_use_custom_color":true,"widget_verified_badge_use_custom_color":false,"widget_write_review_use_custom_color":false,"picture_reminder_submit_button":"Upload Pictures","enable_review_videos":true,"mute_video_by_default":false,"widget_sorting_videos_first_text":"Videos First","widget_review_pending_text":"Pending","featured_carousel_items_for_large_screen":4,"social_share_options_order":"Facebook,Twitter","remove_microdata_snippet":true,"disable_json_ld":false,"enable_json_ld_products":false,"preview_badge_show_question_text":false,"preview_badge_no_question_text":"No questions","preview_badge_n_question_text":"{{ number_of_questions }} question/questions","qa_badge_show_icon":false,"qa_badge_position":"same-row","remove_judgeme_branding":false,"widget_add_search_bar":false,"widget_search_bar_placeholder":"Search","widget_sorting_verified_only_text":"Verified only","widget_sorting_most_relevant_text":"Most Relevant","featured_carousel_theme":"compact","featured_carousel_show_rating":false,"featured_carousel_show_title":false,"featured_carousel_show_body":true,"featured_carousel_show_date":false,"featured_carousel_show_reviewer":true,"featured_carousel_show_product":false,"featured_carousel_header_background_color":"#108474","featured_carousel_header_text_color":"#ffffff","featured_carousel_name_product_separator":"reviewed","featured_carousel_full_star_background":"#D691FC","featured_carousel_empty_star_background":"#dadada","featured_carousel_vertical_theme_background":"#f9fafb","featured_carousel_verified_badge_enable":false,"featured_carousel_verified_badge_color":"#e5cbb3","featured_carousel_border_style":"round","featured_carousel_review_line_length_limit":3,"featured_carousel_more_reviews_button_text":"Read more reviews","featured_carousel_view_product_button_text":"View product","all_reviews_page_load_reviews_on":"scroll","all_reviews_page_load_more_text":"Load More Reviews","disable_fb_tab_reviews":false,"enable_ajax_cdn_cache":false,"widget_advanced_speed_features":5,"widget_public_name_text":"displayed publicly like","default_reviewer_name":"John Smith","default_reviewer_name_has_non_latin":true,"widget_reviewer_anonymous":"Anonymous","medals_widget_title":"Judge.me Review Medals","medals_widget_background_color":"#f9fafb","medals_widget_position":"footer_all_pages","medals_widget_border_color":"#f9fafb","medals_widget_verified_text_position":"left","medals_widget_use_monochromatic_version":false,"medals_widget_elements_color":"#108474","show_reviewer_avatar":true,"widget_invalid_yt_video_url_error_text":"Not a YouTube video URL","widget_max_length_field_error_text":"Please enter no more than {0} characters.","widget_show_country_flag":false,"widget_show_collected_via_shop_app":true,"widget_verified_by_shop_badge_style":"light","widget_verified_by_shop_text":"Verified by Shop","widget_show_photo_gallery":false,"widget_load_with_code_splitting":true,"widget_ugc_install_preference":false,"widget_ugc_title":"Made by us, Shared by you","widget_ugc_subt
649itle":"Tag us to see your picture featured in our page","widget_ugc_arrows_color":"#ffffff","widget_ugc_primary_button_text":"Buy Now","widget_ugc_primary_button_background_color":"#108474","widget_ugc_primary_button_text_color":"#ffffff","widget_ugc_primary_button_border_width":"0","widget_ugc_primary_button_border_style":"none","widget_ugc_primary_button_border_color":"#108474","widget_ugc_primary_button_border_radius":"25","widget_ugc_secondary_button_text":"Load More","widget_ugc_secondary_button_background_color":"#ffffff","widget_ugc_secondary_button_text_color":"#108474","widget_ugc_secondary_button_border_width":"2","widget_ugc_secondary_button_border_style":"solid","widget_ugc_secondary_button_border_color":"#108474","widget_ugc_secondary_button_border_radius":"25","widget_ugc_reviews_button_text":"View Reviews","widget_ugc_reviews_button_background_color":"#ffffff","widget_ugc_reviews_button_text_color":"#108474","widget_ugc_reviews_button_border_width":"2","widget_ugc_reviews_button_border_style":"solid","widget_ugc_reviews_button_border_color":"#108474","widget_ugc_reviews_button_border_radius":"25","widget_ugc_reviews_button_link_to":"judgeme-reviews-page","widget_ugc_show_post_date":true,"widget_ugc_max_width":"800","widget_rating_metafield_value_type":true,"widget_primary_color":"#b999c4","widget_enable_secondary_color":false,"widget_secondary_color":"#edf5f5","widget_summary_average_rating_text":"{{ average_rating }} out of 5","widget_media_grid_title":"Customer photos \u0026 videos","widget_media_grid_see_more_text":"See more","widget_round_style":false,"widget_show_product_medals":false,"widget_verified_by_judgeme_text":"Verified by Judge.me","widget_show_store_medals":true,"widget_verified_by_judgeme_text_in_store_medals":"Verified by Judge.me","widget_media_field_exceed_quantity_message":"Sorry, we can only accept {{ max_media }} for one review.","widget_media_field_exceed_limit_message":"{{ file_name }} is too large, please select a {{ media_type }} less than {{ size_limit }}MB.","widget_review_submitted_text":"Review Submitted!","widget_question_submitted_text":"Question Submitted!","widget_close_form_text_question":"Cancel","widget_write_your_answer_here_text":"Write your answer here","widget_enabled_branded_link":true,"widget_show_collected_by_judgeme":false,"widget_reviewer_name_color":"","widget_write_review_text_color":"","widget_write_review_bg_color":"","widget_collected_by_judgeme_text":"collected by Judge.me","widget_pagination_type":"standard","widget_load_more_text":"Load More","widget_load_more_color":"#108474","widget_full_review_text":"Full Review","widget_read_more_reviews_text":"Read More Reviews","widget_read_questions_text":"Read Questions","widget_questions_and_answers_text":"Questions \u0026 Answers","widget_verified_by_text":"Verified by","widget_verified_text":"Verified","widget_number_of_reviews_text":"{{ number_of_reviews }} reviews","widget_back_button_text":"Back","widget_next_button_text":"Next","widget_custom_forms_filter_button":"Filters","custom_forms_style":"horizontal","widget_show_review_information":false,"how_reviews_are_collected":"How reviews are collected?","widget_show_review_keywords":false,"widget_gdpr_statement":"How we use your data: We'll only contact you about the review you left, and only if necessary. By submitting your review, you agree to Judge.me's \u003ca href='https://judge.me/terms' target='_blank' rel='nofollow noopener'\u003eterms\u003c/a\u003e, \u003ca href='https://judge.me/privacy' target='_blank' rel='nofollow noopener'\u003eprivacy\u003c/a\u003e and \u003ca href='https://judge.me/content-policy' target='_blank' rel='nofollow noopener'\u003econtent\u003c/a\u003e policies.","widget_multilingual_sorting_enabled":false,"widget_translate_review_content_enabled":false,"widget_translate_review_content_method":"manual","popup_widget_review_selection":"automatically_with_pictures","popup_widget_round_border_style":true,"popup_widget_show_title":true,"popup_widget_show_body":true,"popup_widget_show_reviewer":false,"popup_widget_show_product":true,"popup_widget_show_pictures":true,"popup_widget_use_review_picture":true,"popup_widget_show_on_home_page":true,"popup_widget_show_on_product_page":true,"popup_widget_show_on_collection_page":true,"popup_widget_show_on_cart_page":true,"popup_widget_position":"bottom_left","popup_widget_first_review_delay":5,"popup_widget_duration":5,"popup_widget_interval":5,"popup_widget_review_count":5,"popup_widget_hide_on_mobile":true,"review_snippet_widget_round_border_style":true,"review_snippet_widget_card_color":"#FFFFFF","review_snippet_widget_text_color":"#000000","review_snippet_widget_lighter_text_color":"#7B7B7B","review_snippet_widget_slider_arrows_background_color":"#FFFFFF","review_snippet_widget_slider_arrows_color":"#000000","review_snippet_widget_star_color":"#b999c4","show_product_variant":false,"all_reviews_product_variant_label_text":"Variant: ","widget_show_verified_branding":false,"widget_ai_summary_title":"Customers say","widget_ai_summary_disclaimer":"AI-powered review summary based on recent customer reviews","widget_show_ai_summary":false,"widget_show_ai_summary_bg":false,"write_review_button_visibility":"everyone","store_summary_widget_heading":"Customers rate this store","store_summary_widget_button_text":"View customer reviews","store_summary_widget_button_theme_text":"See AI reviews summary","widget_show_review_title_input":true,"widget_autofill_review_title":true,"redirect_reviewers_invited_via_email":"review_widget","request_store_review_after_product_review":false,"request_review_other_products_in_order":false,"review_form_color_scheme":"default","review_form_corner_style":"square","review_form_star_color":"#b999c4","review_form_text_color":"#333333","review_form_background_color":"#ffffff","review_form_field_background_color":"#fafafa","review_form_button_color":"#b999c4","review_form_button_text_color":"#ffffff","review_form_modal_overlay_color":"#000000","review_form_theme":"multi_step","review_form_location":"in_store_popup","review_form_external_page_background_color":"#C5F7F0","review_content_screen_title_text":"How would you rate this product?","review_content_introduction_text":"We would love it if you would share a bit about your experience.","store_review_form_title_text":"How would you rate this store?","store_review_form_introduction_text":"We would love it if you would share a bit about your experience.","show_review_guidance_text":true,"one_star_review_guidance_text":"Poor","five_star_review_guidance_text":"Great","customer_information_screen_title_text":"About you","customer_information_introduction_text":"Please tell us more about you.","custom_questions_screen_title_text":"Your experience in more detail","custom_questions_introduction_text":"Here are a few questions to help us understand more about your experience.","review_submitted_screen_title_text":"Thanks for your review!","review_submitted_screen_thank_you_text":"We are processing it and it will appear on the store soon.","review_submitted_screen_email_verification_text":"Please confirm your email by clicking the link we just sent you. This helps us keep reviews authentic.","confirm_email_screen_title_text":"Confirm your email","confirm_email_screen_message_text":"To help keep reviews authentic, we'll send you a secure link to continue writing your review. It only takes a moment.","check_email_screen_title_text":"Check your email","check_email_screen_message_text":"We sent you an email to {{ email }}. Click the button on the email to continue.","check_email_screen_resend_message_text":"Email resent!","check_email_resend_hint_text":"Didn't get the email? Check your spam folder or [resend the email].","verification_email_rate_limit_error_text":"You've reached the limit for review attempts on this product. Please check your inbox or try again later.","review_submitted_request_store_review_text":"Would you like to share your experience of shopping with us?","review_submitted_review_other_products_text":"Would you like to review these products?","store_review_screen_title_text":"Would you like to share your experience of shopping with us?","store_review_introduction_text":"We value your feedback and use it to improve. Please share any thoughts or suggestions you have.","reviewer_media_screen_title_picture_text":"Share a picture","reviewer_media_introduction_picture_text":"Upload a photo to support your review.","reviewer_media_screen_title_video_text":"Share a video","reviewer_media_introduction_video_text":"Upload a video to support your review.","reviewer_media_screen_title_picture_or_video_text":"Share a picture or video","reviewer_media_introduction_picture_or_video_text":"Upload a photo or video to support your review.","reviewer_media_
649youtube_url_text":"Paste your Youtube URL here","advanced_settings_next_step_button_text":"Next","advanced_settings_close_review_button_text":"Close","modal_write_review_flow":false,"write_review_flow_required_text":"Required","write_review_flow_privacy_message_text":"We respect your privacy.","write_review_flow_anonymous_text":"Post review as anonymous","write_review_flow_visibility_text":"This won't be visible to other customers.","write_review_flow_multiple_selection_help_text":"Select as many as you like","write_review_flow_single_selection_help_text":"Select one option","write_review_flow_required_field_error_text":"This field is required","write_review_flow_invalid_email_error_text":"Please enter a valid email address","write_review_flow_max_length_error_text":"Max. {{ max_length }} characters.","write_review_flow_media_upload_text":"\u003cb\u003eClick to upload\u003c/b\u003e or drag and drop","write_review_flow_gdpr_statement":"We'll only contact you about your review if necessary. By submitting your review, you agree to our \u003ca href='https://judge.me/terms' target='_blank' rel='nofollow noopener'\u003eterms and conditions\u003c/a\u003e and \u003ca href='https://judge.me/privacy' target='_blank' rel='nofollow noopener'\u003eprivacy policy\u003c/a\u003e.","rating_only_reviews_enabled":false,"show_negative_reviews_help_screen":false,"new_review_flow_help_screen_rating_threshold":3,"negative_review_resolution_screen_title_text":"Tell us more","negative_review_resolution_text":"Your experience matters to us. If there were issues with your purchase, we're here to help. Feel free to reach out to us, we'd love the opportunity to make things right.","negative_review_resolution_button_text":"Contact us","negative_review_resolution_proceed_with_review_text":"Leave a review","negative_review_resolution_subject":"Issue with purchase from {{ shop_name }}.{{ order_name }}","coupon_promo_intro_any_review_text":"Write a review and get a coupon for {{ amount }} off your next purchase","coupon_promo_intro_with_photo_text":"Write a review and add a photo or video to get a coupon for {{ amount }} off your next purchase","coupon_promo_intro_with_video_text":"Write a review and add a video to get a coupon for {{ amount }} off your next purchase","coupon_promo_intro_up_to_any_review_text":"Write a review and get a coupon for up to {{ amount }} off your next purchase","coupon_promo_intro_up_to_with_photo_text":"Write a review and add a photo or video to get a coupon for up to {{ amount }} off your next purchase","coupon_promo_intro_external_text":"Write a review and get a reward for your next purchase","coupon_promo_intro_external_with_photo_text":"Write a review and add a photo or video to get a reward for your next purchase","coupon_promo_intro_external_with_video_text":"Write a review and add a video to get a reward for your next purchase","coupon_promo_media_photo_text":"Add a photo or video and get a coupon for {{ amount }} off your next purchase","coupon_promo_media_photo_only_text":"Add a photo and get a coupon for {{ amount }} off your next purchase","coupon_promo_media_video_text":"Add a video and get a coupon for {{ amount }} off your next purchase","coupon_promo_media_external_photo_text":"Add a photo or video and get a reward for your next purchase","coupon_promo_media_external_photo_only_text":"Add a photo and get a reward for your next purchase","coupon_promo_media_external_video_text":"Add a video and get a reward for your next purchase","coupon_promo_success_text":"You've got a coupon for your next purchase at {{ shop_name }}!","coupon_promo_success_subtext":"You'll receive your coupon email within the hour.","preview_badge_collection_page_install_status":false,"widget_review_custom_css":"","preview_badge_custom_css":"","preview_badge_stars_count":"5-stars","featured_carousel_custom_css":"","floating_tab_custom_css":"","all_reviews_widget_custom_css":"","medals_widget_custom_css":"","verified_badge_custom_css":"","all_reviews_text_custom_css":"","transparency_badges_collected_via_store_invite":false,"transparency_badges_from_another_provider":false,"transparency_badges_collected_from_store_visitor":false,"transparency_badges_collected_by_verified_review_provider":true,"transparency_badges_earned_reward":false,"transparency_badges_collected_via_store_invite_text":"Review collected via store invitation","transparency_badges_from_another_provider_text":"Review collected from another provider","transparency_badges_collected_from_store_visitor_text":"Review collected from a store visitor","transparency_badges_written_in_google_text":"Review written in Google","transparency_badges_written_in_etsy_text":"Review written in Etsy","transparency_badges_written_in_shop_app_text":"Review written in Shop App","transparency_badges_earned_reward_text":"Review earned a reward for future purchase","product_review_widget_per_page":10,"widget_other_languages_reviews_per_page":3,"widget_store_review_label_text":"Review about the store","widget_cart_mode_aggregate_heading_text":"Customers rate this store","checkout_comment_extension_title_on_product_page":"Customer Comments","checkout_comment_extension_num_latest_comment_show":5,"checkout_comment_extension_format":"name_and_timestamp","checkout_comment_customer_name":"last_initial","checkout_comment_comment_notification":true,"preview_badge_collection_page_install_preference":true,"preview_badge_home_page_install_preference":false,"preview_badge_product_page_install_preference":true,"review_widget_install_preference":"","review_carousel_install_preference":false,"floating_reviews_tab_install_preference":"none","verified_reviews_count_badge_install_preference":false,"all_reviews_text_install_preference":false,"review_widget_best_location":true,"judgeme_medals_install_preference":false,"review_widget_revamp_enabled":true,"review_widget_qna_enabled":false,"review_widget_header_theme":"standard","review_widget_widget_title_enabled":true,"review_widget_header_text_size":"medium","review_widget_header_text_weight":"regular","review_widget_average_rating_style":"compact","review_widget_bar_chart_enabled":true,"review_widget_bar_chart_type":"numbers","review_widget_bar_chart_style":"standard","review_widget_expanded_media_gallery_enabled":false,"review_widget_show_review_highlights":false,"review_widget_show_review_keywords_in_gray":false,"review_widget_reviews_section_theme":"standard","review_widget_image_style":"thumbnails","review_widget_review_image_ratio":"square","review_widget_stars_size":"medium","review_widget_verified_badge":"standard_text","review_widget_review_title_text_size":"medium","review_widget_review_text_size":"medium","review_widget_review_text_length":"medium","review_widget_number_of_columns_desktop":3,"review_widget_carousel_transition_speed":5,"review_widget_custom_questions_answers_display":"always","review_widget_card_section_size":"small","review_widget_button_text_color":"#FFFFFF","review_widget_text_color":"#000000","review_widget_lighter_text_color":"#7B7B7B","review_widget_corner_styling":"soft","review_widget_review_word_singular":"review","review_widget_review_word_plural"
649:"reviews","review_widget_voting_label":"Helpful?","review_widget_shop_reply_label":"Reply from {{ shop_name }}:","review_widget_filters_title":"Filters","review_widget_filter_rating_title":"Rating","review_widget_filter_keyword_title":"Keyword","review_widget_clear_filters_text":"Clear filters","review_widget_expand_more_text":"More","review_widget_review_highlights_title":"Review highlights","qna_widget_question_word_singular":"Question","qna_widget_question_word_plural":"Questions","qna_widget_answer_reply_label":"Answer from {{ answerer_name }}:","qna_content_screen_title_text":"Ask a question about this product","qna_widget_question_required_field_error_text":"Please enter your question.","qna_widget_flow_gdpr_statement":"We'll only contact you about your question if necessary. By submitting your question, you agree to our \u003ca href='https://judge.me/terms' target='_blank' rel='nofollow noopener'\u003eterms and conditions\u003c/a\u003e and \u003ca href='https://judge.me/privacy' target='_blank' rel='nofollow noopener'\u003eprivacy policy\u003c/a\u003e.","qna_widget_question_submitted_text":"Thanks for your question!","qna_widget_close_form_text_question":"Close","qna_widget_question_submit_success_text":"We’ll notify you by email when your question is answered.","all_reviews_widget_v2025_enabled":false,"all_reviews_widget_v2025_header_theme":"default","all_reviews_widget_v2025_widget_title_enabled":true,"all_reviews_widget_v2025_header_text_size":"medium","all_reviews_widget_v2025_header_text_weight":"regular","all_reviews_widget_v2025_average_rating_style":"compact","all_reviews_widget_v2025_bar_chart_enabled":true,"all_reviews_widget_v2025_bar_chart_type":"numbers","all_reviews_widget_v2025_bar_chart_style":"standard","all_reviews_widget_v2025_expanded_media_gallery_enabled":false,"all_reviews_widget_v2025_show_store_medals":true,"all_reviews_widget_v2025_show_photo_gallery":true,"all_reviews_widget_v2025_show_review_keywords":false,"all_reviews_widget_v2025_show_ai_summary":false,"all_reviews_widget_v2025_show_ai_summary_bg":false,"all_reviews_widget_v2025_show_review_highlights":false,"all_reviews_widget_v2025_show_review_keywords_in_gray":false,"all_reviews_widget_v2025_add_search_bar":false,"all_reviews_widget_v2025_default_sort_method":"most-recent","all_reviews_widget_v2025_reviews_per_page":10,"all_reviews_widget_v2025_reviews_section_theme":"default","all_reviews_widget_v2025_image_style":"thumbnails","all_reviews_widget_v2025_review_image_ratio":"square","all_reviews_widget_v2025_stars_size":"medium","all_reviews_widget_v2025_verified_badge":"standard_text","all_reviews_widget_v2025_review_title_text_size":"medium","all_reviews_widget_v2025_review_text_size":"medium","all_reviews_widget_v2025_review_text_length":"medium","all_reviews_widget_v2025_number_of_columns_desktop":3,"all_reviews_widget_v2025_carousel_transition_speed":5,"all_reviews_widget_v2025_custom_questions_answers_display":"always","all_reviews_widget_v2025_review_dates":false,"all_reviews_widget_v2025_card_section_size":"small","all_reviews_widget_v2025_show_product_variant":false,"all_reviews_widget_v2025_show_reviewer_avatar":true,"all_reviews_widget_v2025_reviewer_name_as_initial":"","all_reviews_widget_v2025_review_location_show":false,"all_reviews_widget_v2025_location_format":"","all_reviews_widget_v2025_show_country_flag":false,"all_reviews_widget_v2025_widget_thumb":false,"all_reviews_widget_v2025_verified_by_shop_badge_style":"light","all_reviews_widget_v2025_social_share":false,"all_reviews_widget_v2025_social_share_options_order":"Facebook,Twitter,LinkedIn,Pinterest","all_reviews_widget_v2025_pagination_type":"standard","all_reviews_widget_v2025_button_text_color":"#FFFFFF","all_reviews_widget_v2025_text_color":"#000000","all_reviews_widget_v2025_lighter_text_color":"#7B7B7B","all_reviews_widget_v2025_corner_styling":"soft","all_reviews_widget_v2025_title":"Customer reviews","all_reviews_widget_v2025_ai_summary_title":"Customers say about this store","all_reviews_widget_v2025_no_review_text":"Be the first to write a review","all_reviews_widget_v2025_review_highlights_title":"Review highlights","reviews_grid_widget_show_sample_reviews":false,"reviews_grid_widget_review_selection":"all","reviews_grid_widget_select_products":[],"reviews_grid_widget_show_media_only":false,"reviews_grid_widget_display_order":"media_first","reviews_grid_widget_card_grouping":"per_media","reviews_grid_widget_columns_desktop":3,"reviews_grid_widget_rows_desktop":3,"reviews_grid_widget_columns_mobile":2,"reviews_grid_widget_rows_mobile":6,"reviews_grid_widget_show_stars":true,"reviews_grid_widget_show_reviewer_name":true,"reviews_grid_widget_show_review_title_on_hover_desktop":true,"reviews_grid_widget_corner_styling":"soft","reviews_grid_widget_card_spacing":"medium","reviews_grid_widget_header_text_color":"#000000","reviews_grid_widget_star_and_reviewer_name_color":"#F9F9F9","reviews_grid_widget_overlay_and_background_color":"#000000","reviews_grid_widget_content_color":"#F9F9F9","reviews_grid_widget_header_text":"From our customers","reviews_grid_widget_show_average_rating":true,"trust_badge_enabled":false,"trust_badge_structure":"outline","trust_badge_color":"black","trust_badge_star":"black","trust_badge_rating_display_default":"show_avg_text","platform":"shopify","branding_url":"https://app.judge.me/reviews/stores/mooncatcrystals.com","branding_text":"Powered by Judge.me","locale":"en","reply_name":"Mooncat Crystals","shop_currency":"USD","widget_version":"3.0","footer":true,"autopublish":false,"review_dates":false,"enable_custom_form":false,"shop_use_review_site":true,"shop_locale":"en","enable_multi_locales_translations":true,"show_review_title_input":true,"autofill_review_title":true,"review_verification_email_status":"always","require_verification_before_submit":false,"sign_in_with_
649shop_enabled":false,"customer_account_validation_enabled":true,"most_relevant_sort_enabled":true,"coupon_promo_invited_eligible":true,"coupon_promo_web_eligible":false,"uses_coupon_integration":false,"uses_external_coupon":false,"can_be_branded":false,"rtl_stars_enabled_ar":true,"rtl_stars_enabled_he":true,"reply_name_text":"Mooncat Crystals"};</script>
649 <style class='jdgm-settings-style'>.jdgm-xx{left:0}:root{--jdgm-primary-color: #b999c4;--jdgm-secondary-color: rgba(185,153,196,0.1);--jdgm-star-color: #d4b9a5;--jdgm-write-review-text-color: white;--jdgm-write-review-bg-color: #b999c4;--jdgm-paginate-color: #b999c4;--jdgm-border-radius: 0;--jdgm-reviewer-name-color: #b999c4}.jdgm-histogram__bar-content{background-color:#b999c4}.jdgm-rev[data-verified-buyer=true] .jdgm-rev__icon.jdgm-rev__icon:after,.jdgm-rev__buyer-badge.jdgm-rev__buyer-badge{color:white;background-color:#b999c4}.jdgm-review-widget--small .jdgm-gallery.jdgm-gallery .jdgm-gallery__thumbnail-link:nth-child(8) .jdgm-gallery__thumbnail-wrapper.jdgm-gallery__thumbnail-wrapper:before{content:"See more"}@media only screen and (min-width: 768px){.jdgm-gallery.jdgm-gallery .jdgm-gallery__thumbnail-link:nth-child(8) .jdgm-gallery__thumbnail-wrapper.jdgm-gallery__thumbnail-wrapper:before{content:"See more"}}.jdgm-preview-badge .jdgm-star.jdgm-star{color:#d4b9a5}.jdgm-widget .jdgm-write-rev-link{display:none}.jdgm-widget .jdgm-rev-widg[data-number-of-reviews='0']{display:none}.jdgm-prev-badge[data-average-rating='0.00']{display:none !important}.jdgm-rev .jdgm-rev__timestamp,.jdgm-quest .jdgm-rev__timestamp,.jdgm-carousel-item__timestamp{display:none !important}.jdgm-author-all-initials{display:none !important}.jdgm-author-last-initial{display:none !important}.jdgm-rev-widg__title{visibility:hidden}.jdgm-rev-widg__summary-text{visibility:hidden}.jdgm-prev-badge__text{visibility:hidden}.jdgm-rev__prod-link-prefix:before{content:'about'}.jdgm-rev__variant-label:before{content:'Variant: '}.jdgm-rev__out-of-store-text:before{content:'(out of store)'}@media only screen and (min-width: 768px){.jdgm-rev__pics .jdgm-rev_all-rev-page-picture-separator,.jdgm-rev__pics .jdgm-rev__product-picture{display:none}}@media only screen and (max-width: 768px){.jdgm-rev__pics .jdgm-rev_all-rev-page-picture-separator,.jdgm-rev__pics .jdgm-rev__product-picture{display:none}}.jdgm-preview-badge[data-template="index"]{display:none !important}.jdgm-verified-count-badget[data-from-snippet="true"]{display:none !important}.jdgm-carousel-wrapper[data-from-snippet="true"]{display:none !important}.jdgm-all-reviews-text[data-from-snippet="true"]{display:none !important}.jdgm-medals-section[data-from-snippet="true"]{display:none !important}.jdgm-ugc-media-wrapper[data-from-snippet="true"]{display:none !important}.jdgm-rev__transparency-badge[data-badge-type="review_collected_via_store_invitation"]{display:none !important}.jdgm-rev__transparency-badge[data-badge-type="review_collected_from_another_provider"]{display:none !important}.jdgm-rev__transparency-badge[data-badge-type="review_collected_from_store_visitor"]{display:none !important}.jdgm-rev__transparency-badge[data-badge-type="review_earned_for_future_purchase"]{display:none !important}.jdgm-review-snippet-widget{--jdgm-snippet-card-color: #fff;--jdgm-snippet-text-color: #000;--jdgm-snippet-lighter-text-color: #7B7B7B;--jdgm-snippet-star-color: #b999c4;--jdgm-snippet-border-radius: 8px;--jdgm-snippet-arrows-bg-color: #fff;--jdgm-snippet-arrows-color: #000}.jdgm-review-snippet-widget .jdgm-rev-snippet-widget__cards-container .jdgm-rev-snippet-card{border-radius:8px;background:#fff}.jdgm-review-snippet-widget .jdgm-rev-snippet-widget__cards-container .jdgm-rev-snippet-card__rev-rating .jdgm-star{color:#b999c4}.jdgm-review-snippet-widget .jdgm-rev-snippet-widget__prev-btn,.jdgm-review-snippet-widget .jdgm-rev-snippet-widget__next-btn{border-radius:50%;background:#fff}.jdgm-review-snippet-widget .jdgm-rev-snippet-widget__prev-btn>svg,.jdgm-review-snippet-widget .jdgm-rev-snippet-widget__next-btn>svg{fill:#000}.jdgm-full-rev-modal.rev-snippet-widget .jm-mfp-container .jm-mfp-content,.jdgm-full-rev-modal.rev-snippet-widget .jm-mfp-container .jdgm-full-rev__icon,.jdgm-full-rev-modal.rev-snippet-widget .jm-mfp-container .jdgm-full-rev__pic-img,.jdgm-full-rev-modal.rev-snippet-widget .jm-mfp-container .jdgm-full-rev__reply{border-radius:8px}.jdgm-full-rev-modal.rev-snippet-widget .jm-mfp-container .jdgm-full-rev[data-verified-buyer="true"] .jdgm-full-rev__icon::after{border-radius:8px}.jdgm-full-rev-modal.rev-snippet-widget .jm-mfp-container .jdgm-full-rev .jdgm-rev__buyer-badge{border-radius:calc( 8px / 2 )}.jdgm-full-rev-modal.rev-snippet-widget .jm-mfp-container .jdgm-full-rev .jdgm-full-rev__replier::before{content:'Mooncat Crystals'}.jdgm-full-rev-modal.rev-snippet-widget .jm-mfp-container .jdgm-full-rev .jdgm-full-rev__product-button{border-radius:calc( 8px * 6 )}
650</style> <style class='jdgm-settings-style'></style>
651
652  
653  
654  
655  <style class='jdgm-miracle-styles'>
656  @-webkit-keyframes jdgm-spin{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);-ms-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes jdgm-spin{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);-ms-transform:rotate(359deg);transform:rotate(359deg)}}@font-face{font-family:'JudgemeStar';src:url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAScAA0AAAAABrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAEgAAAABoAAAAcbyQ+3kdERUYAAARgAAAAHgAAACAAMwAGT1MvMgAAAZgAAABGAAAAVi+vS9xjbWFwAAAB8AAAAEAAAAFKwBMjvmdhc3AAAARYAAAACAAAAAj//wADZ2x5ZgAAAkAAAAEJAAABdH33LXtoZWFkAAABMAAAAC0AAAA2BroQKWhoZWEAAAFgAAAAHAAAACQD5QHQaG10eAAAAeAAAAAPAAAAFAYAAABsb2NhAAACMAAAAA4AAAAOAO4AeG1heHAAAAF8AAAAHAAAACAASgAvbmFtZQAAA0wAAADeAAABkorWfVZwb3N0AAAELAAAACkAAABEp3ubLXgBY2BkYADhPPP4OfH8Nl8ZuJkYQODS2fRrCPr/aSYGxq1ALgcDWBoAO60LkwAAAHgBY2BkYGDc+v80gx4TAwgASaAICmABAFB+Arl4AWNgZGBgYGPQYWBiAAIwyQgWc2AAAwAHVQB6eAFjYGRiYJzAwMrAwejDmMbAwOAOpb8ySDK0MDAwMbByMsCBAAMCBKS5pjA4PGB4wMR44P8BBj3GrQymQGFGkBwAjtgK
656/gAAeAFjYoAAEA1jAwAAZAAHAHgB3crBCcAwDEPRZydkih567CDdf4ZskmLwFBV8xBfCaC4BXkOUmx4sU0h2ngNb9V0vQCxaRKIAevT7fGWuBrEAAAAAAAAAAAA0AHgAugAAeAF9z79Kw1AUx/FzTm7un6QmJtwmQ5Bg1abgEGr/BAqlU6Gju+Cgg1MkQ/sA7Vj7BOnmO/gUvo2Lo14NqIO6/IazfD8HEODtmQCfoANwNsyp2/GJt3WKQrd1NLiYYWx2PBqOsmJMEOznPOTzfSCrhAtbbLdmeFLJV9eKd63WLrZcIcuaEVdssWCKM6pLCfTVOYbz/0pNSMSZKLIZpvh78sAUH6PlMrreTCabP9r+Z/puPZ2ur/RqpQHgh+MIegCnXeM4MRAPjYN//5tj4ZtTjkFqEdmeMShlEJ7tVAly2TAkx6R68Fl4E/aVvn8JqHFQ4JS1434gXKcuL31dDhzs3YbsEOAd/IU88gAAAHgBfY4xTgMxEEVfkk0AgRCioKFxQYd2ZRtpixxgRU2RfhU5q5VWseQ4JdfgAJyBlmNwAM7ABRhZQ0ORwp7nr+eZAa54YwYg9zm3ynPOeFRe8MCrciXOh/KSS76UV5L/iDmrLiS5AeU519wrL3jmSbkS5115yR2fyivJv9kx0ZMZ2RLZw27q87iNQi8EBo5FSPIMw3HqBboi5lKTGAGDp8FKXWP+t9TU01Lj5His1Ba6uM9dTEMwvrFmbf5GC/q2drW3ruXUhhsCiQOjznFlCzYhHUZp4xp76vsvQh89CQAAeAFjYGJABowM6IANLMrEyMTIzMjCXpyRWJBqZshWXJJYBKOMAFHFBucAAAAAAAAB//8AAngBY2BkYGDgA2IJBhBgAvKZGViBJAuYxwAABJsAOgAAeAFjYGBgZACCk535hiD60tn0azAaAEqpB6wAAA==") format("woff");font-weight:normal;font-style:normal}.jdgm-star{font-family:'JudgemeStar';display:inline !important;text-decoration:none !important;padding:0 4px 0 0 !important;margin:0 !important;font-weight:bold;opacity:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.jdgm-star:hover{opacity:1}.jdgm-star:last-of-type{padding:0 !important}.jdgm-star.jdgm--on:before{content:"\e000"}.jdgm-star.jdgm--off:before{content:"\e001"}.jdgm-star.jdgm--half:before{content:"\e002"}.jdgm-widget *{margin:0;line-height:1.4;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-overflow-scrolling:touch}.jdgm-hidden{display:none !important;visibility:hidden !important}.jdgm-temp-hidden{display:none}.jdgm-spinner{width:40px;height:40px;margin:auto;border-radius:50%;border-top:2px solid #eee;border-right:2px solid #eee;border-bottom:2px solid #eee;border-left:2px solid #ccc;-webkit-animation:jdgm-spin 0.8s infinite linear;animation:jdgm-spin 0.8s infinite linear}.jdgm-prev-badge{display:block !important}
657
658</style>
659
660
661  
662  
663   
664
665
666
667
668<script data-cfasync='false' class='jdgm-script'>
669!function(e){window.jdgm=window.jdgm||{};
670/* INF-1976 */
671var _jdgmBlocked=function(){var raw=(window.jdgmSettings||{}).hostname_allowlist;var list=(raw==null?"":""+raw).split(/[\s,]+/).map(function(h){return h.trim().toLowerCase().replace(/\.$/,"");}).filter(function(h){return h;});if(!list.length)return false;var host=(e.location.hostname||"").toLowerCase().replace(/\.$/,"");if(/(^|\.)shopifypreview\.com$/.test(host))return false;var bare=host.replace(/^www\./,"");for(var i=0;i<list.length;i++){var en=list[i];if(en.indexOf("*.")===0){var b=en.slice(2);if(host===b||host.slice(-(b.length+1))==="."+b)return false;}else if(bare===en.replace(/^www\./,""))return false;}return true;}();
672if(_jdgmBlocked){jdgm._loaderExecuted=true;jdgm._blocked=true;var _jdgmS=e.createElement("style");_jdgmS.textContent='[class^="jdgm-"],[class*=" jdgm-"]{display:none !important}';(e.head||e.documentElement).appendChild(_jdgmS);return;}
673jdgm.CDN_HOST="https://cdnwidget.judge.me/",jdgm.CDN_HOST_ALT="https://cdn2.judge.me/cdn/widget_frontend/",jdgm.API_HOST="https://api.judge.me/",jdgm.CDN_BASE_URL="https://cdn.shopify.com/extensions/01a0fd03-c455-7b82-9766-74101e55572c/judgeme-771/assets/",jdgm.CDN_API_HOST="https://cdn.judge.me/",
674jdgm.docReady=function(d){(e.attachEvent?"complete"===e.readyState:"loading"!==e.readyState)?
675setTimeout(d,0):e.addEventListener("DOMContentLoaded",d)},jdgm.loadCSS=function(d,t,o,a){
676!o&&jdgm.loadCSS.requestedUrls.indexOf(d)>=0||(jdgm.loadCSS.requestedUrls.push(d),
677(a=e.createElement("link")).rel="stylesheet",a.class="jdgm-stylesheet",a.media="nope!",
678a.href=d,a.onload=function(){this.media="all",t&&setTimeout(t)},e.body.appendChild(a))},
679jdgm.loadCSS.requestedUrls=[],jdgm.loadJS=function(e,d){var t=new XMLHttpRequest;
680t.onreadystatechange=function(){4===t.readyState&&t.status>=200&&t.status<300&&(Function(t.response)(),d&&d(t.response))},
681t.open("GET",e),t.onerror=function(){if(e.indexOf(jdgm.CDN_HOST)===0&&jdgm.CDN_HOST_ALT!==jdgm.CDN_HOST){var f=e.replace(jdgm.CDN_HOST,jdgm.CDN_HOST_ALT);jdgm.loadJS(f,d)}},t.send()},jdgm.docReady((function(){(window.jdgmLoadCSS||e.querySelectorAll(
682".jdgm-widget, .jdgm-all-reviews-page").length>0)&&(jdgmSettings.widget_load_with_code_splitting?
683parseFloat(jdgmSettings.widget_version)>=3?jdgm.loadCSS(jdgm.CDN_BASE_URL+"widget_v3_base.css"):
684jdgm.loadCSS(jdgm.CDN_BASE_URL+"widget_base.css"):jdgm.loadCSS(jdgm.CDN_BASE_URL+"shopify_v2.css")
685)}))}(document);
686</script>
686
687<noscript><link rel="stylesheet" type="text/css" media="all" href="https://cdn.shopify.com/extensions/01a0fd03-c455-7b82-9766-74101e55572c/judgeme-771/assets/shopify_v2.css"></noscript>
688
689<!-- BEGIN app snippet: theme_fix_tags -->
689<script>
690  (function() {
691    var jdgmThemeFixes = null;
692    if (!jdgmThemeFixes) return;
693
694    // "All themes" fix: CSS and JS applied on every theme. CSS is injected
695    // before the per-theme fix so the theme-specific CSS wins the cascade.
696    // HTML is never applied globally (too risky).
697    var allThemesFix = jdgmThemeFixes['all'];
698    if (allThemesFix && allThemesFix.css) {
699      var allStyleTag = document.createElement('style');
700      allStyleTag.classList.add('jdgm-theme-fix-style-all');
701      allStyleTag.innerHTML = allThemesFix.css;
702      document.head.append(allStyleTag);
703    };
704
705    if (allThemesFix && allThemesFix.js) {
706      var allScriptTag = document.createElement('script');
707      allScriptTag.classList.add('jdgm-theme-fix-script-all');
708      allScriptTag.innerHTML = allThemesFix.js;
709      document.head.append(allScriptTag);
710    };
711
712    var thisThemeFix = jdgmThemeFixes[Shopify.theme.id];
713    if (!thisThemeFix) return;
714
715    if (thisThemeFix.html) {
716      document.addEventListener("DOMContentLoaded", function() {
717        var htmlDiv = document.createElement('div');
718        htmlDiv.classList.add('jdgm-theme-fix-html');
719        htmlDiv.innerHTML = thisThemeFix.html;
720        document.body.append(htmlDiv);
721      });
722    };
723
724    if (thisThemeFix.css) {
725      var styleTag = document.createElement('style');
726      styleTag.classList.add('jdgm-theme-fix-style');
727      styleTag.innerHTML = thisThemeFix.css;
728      document.head.append(styleTag);
729    };
730
731    if (thisThemeFix.js) {
732      var scriptTag = document.createElement('script');
733      scriptTag.classList.add('jdgm-theme-fix-script');
734      scriptTag.innerHTML = thisThemeFix.js;
735      document.head.append(scriptTag);
736    };
737  })();
738</script>
738
739<!-- END app snippet -->
740<!-- End of Judge.me Core -->
741
742
743
744<!-- END app block --><!-- BEGIN app block: shopify://apps/microsoft-clarity/blocks/brandAgents_js/31c3d126-8116-4b4a-8ba1-baeda7c4aeea -->
745
746
747
748
749
750<!-- END app block --><!-- BEGIN app block: shopify://apps/microsoft-clarity/blocks/clarity_js/31c3d126-8116-4b4a-8ba1-baeda7c4aeea -->
751<script type="text/javascript">
752  (function (c, l, a, r, i, t, y) {
753    c[a] = c[a] || function () { (c[a].q = c[a].q || []).push(arguments); };
754    t = l.createElement(r); t.async = 1; t.src = "https://www.clarity.ms/tag/" + i + "?ref=shopify";
755    y = l.getElementsByTagName(r)[0]; y.parentNode.insertBefore(t, y);
756
757    c.Shopify.loadFeatures([{ name: "consent-tracking-api", version: "0.1" }], error => {
758      if (error) {
759        console.error("Error loading Shopify features:", error);
760        return;
761      }
762
763      c[a]('consentv2', {
764        ad_Storage: c.Shopify.customerPrivacy.marketingAllowed() ? "granted" : "denied",
765        analytics_Storage: c.Shopify.customerPrivacy.analyticsProcessingAllowed() ? "granted" : "denied",
766        source: 101,
767      });
768    });
769
770    l.addEventListener("visitorConsentCollected", function (e) {
771      c[a]('consentv2', {
772        ad_Storage: e.detail.marketingAllowed ? "granted" : "denied",
773        analytics_Storage: e.detail.analyticsAllowed ? "granted" : "denied",
774        source: 101,
775      });
776    });
777  })(window, document, "clarity", "script", "v6i5a56yno");
778</script>
778
779
780
781
782<!-- END app block --><!-- BEGIN app block: shopify://apps/statcounter/blocks/statcounter/b742c529-4c15-43ad-85e6-17a3d10c43b0 --><!-- Start of Statcounter Code -->
783<script type="text/javascript">
784var sc_project=13200495;
785var sc_invisible=1;
786var sc_security="1778d13a";
787</script>
vendor: 2 bytes, line 787
787
788<script type="text/javascript"
789src="https://www.statcounter.com/counter/counter.js"
790async></script>
790
791<noscript><div class="statcounter"><a title="Statcounter Analytics"
792href="https://statcounter.com/" target="_blank"><img
793class="statcounter"
794src="https://c.statcounter.com/13200495/0/1778d13a/1/"
795alt="Web Analytics"
796referrerPolicy="no-referrer-when-downgrade"></a></div></noscript>
797<!-- End of Statcounter Code -->
798
799
800
801<!-- END app block -->
801<script src="https://cdn.shopify.com/extensions/01a1042b-a9d7-729a-ae5a-1e43df343284/pasilobus-confetti-26/assets/confetti.js" type="text/javascript" defer="defer"></script>
vendor: 1 bytes, line 801
801
802<script src="https://cdn.shopify.com/extensions/01a0fd03-c455-7b82-9766-74101e55572c/judgeme-771/assets/loader.js" type="text/javascript" defer="defer"></script>
802
803<link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
804<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: 21646515,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token,page_type: "search"};window.navigator.sendBeacon("https://monorail-edge.shopifysvc.com/v1/produce", JSON.stringify({schema_id: "online_store_buyer_site_abandonment/1.1",payload: payload,metadata: {event_created_at_ms: currentMs,event_sent_at_ms: currentMs}}));}}window.addEventListener('pagehide', handle_abandonment_event);}}());</script>
vendor: 1 bytes, line 804
804
805<script>
806  window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || [];
807</script>
vendor: 1 bytes, line 807
807
808<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}
808).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: 21646515,storefrontBaseUrl: "https://www.mooncatcrystals.com",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://www.mooncatcrystals.com/.well-known/shopify/monorail/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["4c64608a","16072cab","8450a54b","7ee89bf1"],webPixelsConfigList: [{"id":"1977123058","configuration":"{\"projectId\":\"v6i5a56yno\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"d8a2bb2ccbb513dc8e8b6937f4b8033e","type":"APP","apiClientId":240074326017,"privacyPurposes":[],"capabilities":["advanced_dom_events"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_personal_data"],"dataSharingControls":["share_all_events"]}
808,"dataSharingState":"unrestricted"},{"id":"1969029362","configuration":"{\"projectID\":\"13200495\",\"securityCode\":\"1778d13a\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"c88f45786e401e9c7c0cf4f72f6d8d22","type":"APP","apiClientId":66974285825,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":[],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"1736179954","configuration":"{\"shop\":\"mooncat-crystals.myshopify.com\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"933d4caa1e2cc643aeb46e3c5f7a4c7d","type":"APP","apiClientId":18394152961,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"1003749618","configuration":"{\"webPixelName\":\"Judge.me\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"8acc938b1a30dc7624e304493ca567d7","type":"APP","apiClientId":683015,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"450461938","configuration":"{\"config\":\"{\\\"google_tag_ids\\\":[\\\"G-Z2J8MLHRKR\\\",\\\"GT-MRL33SG\\\",\\\"G-VV5KPBD00C\\\"],\\\"target_country\\\":\\\"US\\\",\\\"gtag_events\\\":[{\\\"type\\\":\\\"begin_checkout\\\",\\\"action_label\\\":[\\\"G-Z2J8MLHRKR\\\",\\\"G-VV5KPBD00C\\\"]},{\\\"type\\\":\\\"search\\\",\\\"action_label\\\":[\\\"G-Z2J8MLHRKR\\\",\\\"G-VV5KPBD00C\\\"]},{\\\"type\\\":\\\"remove_from_cart\\\",\\\"action_label\\\":\\\"G-Z2J8MLHRKR\\\"},{\\\"type\\\":\\\"view_item\\\",\\\"action_label\\\":[\\\"G-Z2J8MLHRKR\\\",\\\"MC-FVV8GEWXW2\\\",\\\"G-VV5KPBD00C\\\"]},{\\\"type\\\":\\\"add_shipping_info\\\",\\\"action_label\\\":\\\"G-Z2J8MLHRKR\\\"},{\\\"type\\\":\\\"purchase\\\",\\\"action_label\\\":[\\\"G-Z2J8MLHRKR\\\",\\\"MC-FVV8GEWXW2\\\",\\\"G-VV5KPBD00C\\\"]},{\\\"type\\\":\\\"page_view\\\",\\\"action_label\\\":[\\\"G-Z2J8MLHRKR\\\",\\\"MC-FVV8GEWXW2\\\",\\\"G-VV5KPBD00C\\\"]},{\\\"type\\\":\\\"view_item_list\\\",\\\"action_label\\\":\\\"G-Z2J8MLHRKR\\\"},{\\\"type\\\":\\\"add_payment_info\\\",\\\"action_label\\\":[\\\"G-Z2J8MLHRKR\\\",\\\"G-VV5KPBD00C\\\"]},{\\\"type\\\":\\\"add_to_cart\\\",\\\"action_label\\\":[\\\"G-Z2J8MLHRKR\\\",\\\"G-VV5KPBD00C\\\"]},{\\\"type\\\":\\\"view_cart\\\",\\\"action_label\\\":\\\"G-Z2J8MLHRKR\\\"}],\\\"enable_monitoring_mode\\\":false}\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"a3321ca85cf5aaf6b57585fcd8d67b3a","type":"APP","apiClientId":1780363,"privacyPurposes":[],"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":"10682610","configuration":"{\"myshopifyDomain\":\"mooncat-crystals.myshopify.com\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"23b97d18e2aa74363140dc29c9284e87","type":"APP","apiClientId":2775569,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_phone","read_customer_personal_data"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"61473010","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"1","type":"CUSTOM","privacyPurposes":["MARKETING"],"name":"Meta pixel (migrated)"},{"id":"81887474","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":"Mooncat Crystals","paymentSettings":{"currencyCode":"USD"},"myshopifyDomain":"mooncat-crystals.myshopify.com","countryCode":"US","storefrontUrl":"https:\/\/www.mooncatcrystals.com"},"customer":null,"cart":null,"checkout":null,"productVariants":[],"products":[],"purchasingCompany":null},},"https://www.mooncatcrystals.com/cdn","5982071ew7ea472e3p69b68784m2150dfea",{"modern":"","legacy":""},{"trekkieShim":true,"agentContext":true,"apiClientId":"580111","facebookCapiEnabled":"false","themeId":"188866494706","themeStoreId":"855","themePublished":"true","eventMetadataId":"a8da001d-71be-4fa7-8b9f-b4865bb51b57","pageType":"searchresults","shopId":"21646515","storefrontBaseUrl":"https:\/\/www.mooncatcrystals.com","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"4c64608a\", \"16072cab\", \"8450a54b\", \"7ee89bf1\"]","isMerchantRequest":"false","hashVersion":"5982071ew7ea472e3p69b68784m2150dfea","publish":"custom","events":"[[\"page_viewed\",{}],[\"search_submitted\",{\"searchResult\":{\"query\":\"\",\"productVariants\":[]}}]]"});})();</script>
808<script>
809  window.ShopifyAnalytics = window.ShopifyAnalytics || {};
810  window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {};
811  window.ShopifyAnalytics.meta.currency = 'USD';
812  var meta = {"products":[],"page":{"pageType":"searchresults","requestId":"cd32eab0-e18e-4d85-b961-bada8d053748-1791116918"}};
813  for (var attr in meta) {
814    window.ShopifyAnalytics.meta[attr] = meta[attr];
815  }
816</script>
vendor: 1 bytes, line 816
816
817<script class="analytics">
818  (function () {
819    var customDocumentWrite = function(content) {
820      var jquery = null;
821
822      if (window.jQuery) {
823        jquery = window.jQuery;
824      } else if (window.Checkout && window.Checkout.$) {
825        jquery = window.Checkout.$;
826      }
827
828      if (jquery) {
829        jquery('body').append(content);
830      }
831    };
832
833    var hasLoggedConversion = function(token) {
834      if (token) {
835        return document.cookie.indexOf('loggedConversion=' + token) !== -1;
836      }
837      return false;
838    }
839
840    var setCookieIfConversion = function(token) {
841      if (token) {
842        var twoMonthsFromNow = new Date(Date.now());
843        twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2);
844
845        document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow;
846      }
847    }
848
849    var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || [];
850    window.ShopifyAnalytics.lib.trekkie = window.trekkie;
851    if (trekkie.integrations) {
852      return;
853    }
854    trekkie.methods = [
855      'identify',
856      'page',
857      'ready',
858      'track',
859      'trackForm',
860      'trackLink'
861    ];
862    trekkie.factory = function(method) {
863      return function() {
864        var args = Array.prototype.slice.call(arguments);
865        args.unshift(method);
866        trekkie.push(args);
867        if (method == 'track' || method == 'page') {
868          var pageUrl;
869          try {
870            pageUrl = window.location.href;
871          } catch (e) {}
872          var pageReferrer;
873          try {
874            pageReferrer = document.referrer;
875          } catch (e) {}
876          try {
877            if (window.__TREKKIE_SHIM_QUEUE == null) {
878              window.__TREKKIE_SHIM_QUEUE = [];
879            }
880            window.__TREKKIE_SHIM_QUEUE.push({
881              from: 'trekkie-stub',
882              method: method,
883              args: args.slice(1),
884              pageContext: {
885                url: pageUrl,
886                referrer: pageReferrer
887              }
888            });
889          } catch (e) {
890            // no-op
891          }
892        }
893        return trekkie;
894      };
895    };
896    for (var i = 0; i < trekkie.methods.length; i++) {
897      var key = trekkie.methods[i];
898      trekkie[key] = trekkie.factory(key);
899    }
900    trekkie.load = function(config) {
901      trekkie.config = config || {};
902      trekkie.config.initialDocumentCookie = document.cookie;
903      var first = document.getElementsByTagName('script')[0];
904var script = document.createElement('script');
905script.type = 'text/javascript';
906script.onerror = function(e) {
907  var scriptFallback = document.createElement('script');
908  scriptFallback.type = 'text/javascript';
909  scriptFallback.onerror = function(error) {
910          var Monorail = {
911      produce: function produce(monorailDomain, schemaId, payload) {
912        var currentMs = new Date().getTime();
913        var event = {
914          schema_id: schemaId,
915          payload: payload,
916          metadata: {
917            event_created_at_ms: currentMs,
918            event_sent_at_ms: currentMs
919          }
920        };
921        return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event));
922      },
923      sendRequest: function sendRequest(endpointUrl, payload) {
924        // Try the sendBeacon API
925        if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) {
926          var blobData = new window.Blob([payload], {
927            type: 'text/plain'
928          });
929
930          if (window.navigator.sendBeacon(endpointUrl, blobData)) {
931            return true;
932          } // sendBeacon was not successful
933
934        } // XHR beacon
935
936        var xhr = new XMLHttpRequest();
937
938        try {
939          xhr.open('POST', endpointUrl);
940          xhr.setRequestHeader('Content-Type', 'text/plain');
941          xhr.send(payload);
942        } catch (e) {
943          console.log(e);
944        }
945
946        return false;
947      },
948      isIos12: function isIos12() {
949        return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1;
950      }
951    };
952    Monorail.produce('monorail-edge.shopifysvc.com',
953      'trekkie_storefront_load_errors/1.1',
954      {shop_id: 21646515,
955      theme_id: 188866494706,
956      app_name: "storefront",
957      context_url: window.location.href,
958      source_url: "//www.mooncatcrystals.com/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js"});
959
960  };
961  scriptFallback.async = true;
962  scriptFallback.src = '//www.mooncatcrystals.com/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js';
963  first.parentNode.insertBefore(scriptFallback, first);
964};
965script.async = true;
966script.src = '//www.mooncatcrystals.com/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js';
967first.parentNode.insertBefore(script, first);
968
969    };
970    trekkie.load(
971      {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":21646515,"isMerchantRequest":null,"themeId":188866494706,"themeCityHash":"7149965378694084843","contentLanguage":"en","currency":"USD","eventMetadataId":"a8da001d-71be-4fa7-8b9f-b4865bb51b57"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["764d78cb","8450a54b","7ee89bf1","4c64608a"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":false,"source":"trekkie-storefront-renderer","apiClientId":580111}}
972    );
973
974    var loaded = false;
975    trekkie.ready(function() {
976      if (loaded) return;
977      loaded = true;
978
979      window.ShopifyAnalytics.lib = window.trekkie;
980
981      var originalDocumentWrite = document.write;
982      document.write = customDocumentWrite;
983      try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {};
984      document.write = originalDocumentWrite;
985
986      var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/)
987      var token = match? match[1]: undefined;
988      if (!hasLoggedConversion(token)) {
989        setCookieIfConversion(token);
990        window.ShopifyAnalytics.lib.track("Performed Search",{"query":null},undefined,undefined,{"shopifyEmitted":true});
991      }
992    });
993
994    window.ShopifyAnalytics.lib.page(null,{"pageType":"searchresults","requestId":"cd32eab0-e18e-4d85-b961-bada8d053748-1791116918","shopifyEmitted":true});
995
996    var eventsListenerScript = document.createElement('script');
997    eventsListenerScript.async = true;
998    eventsListenerScript.src = "//www.mooncatcrystals.com/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js";
999    document.getElementsByTagName('head')[0].appendChild(eventsListenerScript);
1000})();</script>
1000
1001  
1001<script>
1002  if (!window.ga || (window.ga && typeof window.ga !== 'function')) {
1003    window.ga = function ga() {
1004      (window.ga.q = window.ga.q || []).push(arguments);
1005      if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') {
1006        window.Shopify.analytics.publish("ga_stub_called", {}, {sendTo: "google_osp_migration"});
1007      }
1008      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.");
1009    };
1010    if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') {
1011      window.Shopify.analytics.publish("ga_stub_initialized", {}, {sendTo: "google_osp_migration"});
1012    }
1013  }
1014</script>
vendor: 1 bytes, line 1014
1014
1015<script
1016  defer
1017  src="https://www.mooncatcrystals.com/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.9.4.min.js"
1018  data-application="storefront-renderer"
1019  data-shop-id="21646515"
1020  data-render-region="gcp-us-central1"
1021  data-page-type="search"
1022  data-theme-instance-id="188866494706"
1023  data-theme-name="Prestige"
1024  data-theme-version="11.4.1"
1025  data-monorail-region="shop_domain"
1026  data-resource-timing-sampling-rate="10"
1027  data-shs="true"
1028  data-shs-beacon="true"
1029  data-shs-export-with-fetch="true"
1030  data-shs-logs-sample-rate="1"
1031  data-shs-beacon-endpoint="https://www.mooncatcrystals.com/api/collect"
1032></script>
vendor: 1 bytes, line 1032
1032
1033<script src="https://cdn.shopify.com/storefront/web-components/account.js" type="module" crossorigin fetchpriority="low" async></script>
1033<script id="shopify-customer-account-data" type="application/json">{"customer":null,"shop":{"id":"21646515","customerAccountTranslations":[{"key":"account_menu.signed_out_state.sheet_title","value":"Sign in or create account"},{"key":"account_menu.signed_out_state.section_divider","value":"More ways to sign in"},{"key":"account_menu.signed_out_state.alternate_divider","value":"OR"},{"key":"account_menu.signed_out_state.email_field_label","value":"Email"},{"key":"account_menu.signed_out_state.orders_button","value":"Orders"},{"key":"account_menu.signed_out_state.profile_button","value":"Profile"},{"key":"account_menu.signed_out_state.shop_login_button","value":"Sign in with Shop"},{"key":"account_menu.signed_out_state.continue_with_google","value":"Continue with Google"},{"key":"account_menu.signed_out_state.continue_with_facebook","value":"Continue with Facebook"},{"key":"account_menu.signed_out_state.marketing_consent_label","value":"Email me with news and offers"},{"key":"account_menu.signed_in_state.greeting_with_name","value":"Hi, {{first_name}}"},{"key":"account_menu.signed_in_state.greeting_without_name","value":"Account"},{"key":"account_menu.signed_in_state.orders_button","value":"Orders"},{"key":"account_menu.signed_in_state.profile_button","value":"Profile"},{"key":"account_menu.location_picker.sheet_title","value":"Locations"},{"key":"account_menu.location_picker.search_field_placeholder","value":"Search"},{"key":"account_menu.aria_labels.close_menu","value":"Close menu"},{"key":"account_menu.aria_labels.back_to_main_menu","value":"Back to main menu from {{title}}"},{"key":"account_menu.aria_labels.open_submenu","value":"{{title}}, opens submenu"},{"key":"account_menu.aria_labels.loading_menu","value":"Loading menu"},{"key":"account_menu.aria_labels.account","value":"Account"},{"key":"account_menu.aria_labels.sign_in_with_email","value":"Sign in with email"},{"key":"account_menu.aria_labels.sign_in","value":"Sign in"}],"socialLoginProviders":[{"handle":"Shop"}],"legacyCustomerAccounts":false,"signInLinksVisible":true,"b2bEnabled":false,"marketingConsentSigninEnabled":true,"marketingConsentPreselected":true},"visitor":{"country":"US","language":"en"}}</script>
1033
1034<meta name="shopify-y" content="0d53687c-3d7f-4b5f-957f-36fba3119b64" data-expiration="1822674518000"><meta name="shopify-s" content="587c202a-4429-43da-857b-d2f859c5d3b9" data-expiration="1791118718000"><meta name="new-cookie-storage-activated" content="t">
1035</head>
1036
1037  
1038
1039  <body class="features--button-transition features--zoom-image  color-scheme color-scheme--scheme-72719795-1b01-4441-814e-0cb6ad4b6fb1"><template id="drawer-default-template">
1040  <div part="base">
1041    <div part="overlay"></div>
1042
1043    <div part="content">
1044      <header part="header">
1045        <slot name="header"></slot>
1046
1047        <dialog-close-button style="display: contents">
1048          <button type="button" part="close-button tap-area" aria-label="Close"><svg aria-hidden="true" focusable="false" fill="none" width="14" class="icon icon-close" viewBox="0 0 16 16">
1049      <path d="m1 1 14 14M1 15 15 1" stroke="currentColor" stroke-width="2"/>
1050    </svg>
1051
1052  </button>
1053        </dialog-close-button>
1054      </header>
1055
1056      <div part="body">
1057        <slot></slot>
1058      </div>
1059
1060      <footer part="footer">
1061        <slot name="footer"></slot>
1062      </footer>
1063    </div>
1064  </div>
1065</template><template id="modal-default-template">
1066  <div part="base">
1067    <div part="overlay"></div>
1068
1069    <div part="content">
1070      <header part="header">
1071        <slot name="header"></slot>
1072
1073        <dialog-close-button style="display: contents">
1074          <button type="button" part="close-button tap-area" aria-label="Close"><svg aria-hidden="true" focusable="false" fill="none" width="14" class="icon icon-close" viewBox="0 0 16 16">
1075      <path d="m1 1 14 14M1 15 15 1" stroke="currentColor" stroke-width="2"/>
1076    </svg>
1077
1078  </button>
1079        </dialog-close-button>
1080      </header>
1081
1082      <div part="body">
1083        <slot></slot>
1084      </div>
1085    </div>
1086  </div>
1087</template><template id="popover-default-template">
1088  <div part="base">
1089    <div part="overlay"></div>
1090
1091    <div part="content">
1092      <header part="header">
1093        <slot name="header"></slot>
1094
1095        <dialog-close-button style="display: contents">
1096          <button type="button" part="close-button tap-area" aria-label="Close"><svg aria-hidden="true" focusable="false" fill="none" width="14" class="icon icon-close" viewBox="0 0 16 16">
1097      <path d="m1 1 14 14M1 15 15 1" stroke="currentColor" stroke-width="2"/>
1098    </svg>
1099
1100  </button>
1101        </dialog-close-button>
1102      </header>
1103
1104      <div part="body">
1105        <slot></slot>
1106      </div>
1107    </div>
1108  </div>
1109</template><template id="header-search-default-template">
1110  <div part="base">
1111    <div part="overlay"></div>
1112
1113    <div part="content">
1114      <slot></slot>
1115    </div>
1116  </div>
1117</template><template id="video-media-default-template">
1118  <slot></slot>
1119
1120  <svg part="play-button" fill="none" width="48" height="48" viewBox="0 0 48 48">
1121    <path fill-rule="evenodd" clip-rule="evenodd" d="M48 24c0 13.255-10.745 24-24 24S0 37.255 0 24 10.745 0 24 0s24 10.745 24 24Zm-18 0-9-6.6v13.2l9-6.6Z" fill="var(--play-button-background, #000000)"/>
1122  </svg>
1123</template>
1124<loading-bar class="loading-bar" aria-hidden="true"></loading-bar>
1125    <a href="#main" allow-hash-change class="skip-to-content sr-only">Skip to content</a><div class="sr-only" role="status" aria-live="polite" aria-atomic="true">
1126      <span id="status-announcement"></span>
1127    </div>
1128
1129    <div class="sr-only" role="alert" aria-live="assertive" aria-atomic="true">
1130      <span id="error-announcement"></span>
1131    </div>
1132
1133    <span id="header-scroll-tracker" style="position: absolute; width: 1px; height: 1px; top: var(--header-scroll-tracker-offset, 10px); left: 0;"></span><!-- BEGIN sections: header-group -->
1134<header id="shopify-section-sections--27887156429042__header" class="shopify-section shopify-section-group-header-group shopify-section--header"><style>
1135  :root {
1136    --header-is-sticky: 0;
1137  }
1138
1139  #shopify-section-sections--27887156429042__header {
1140    --header-grid: "primary-nav logo secondary-nav" / minmax(0, 1fr) auto minmax(0, 1fr);
1141    --header-padding-block: 1rem;
1142    --header-transparent-header-text-color: 255 255 255;
1143    --header-separation-border-color: 0 0 0 / 0;
1144
1145    position: relative;
1146    z-index: 4;
1147  }
1148
1149  @media screen and (min-width: 700px) {
1150    #shopify-section-sections--27887156429042__header {
1151      --header-padding-block: 1.2rem;
1152    }
1153  }
1154
1155  @media screen and (min-width: 1000px) {
1156    #shopify-section-sections--27887156429042__header {--header-grid: ". logo secondary-nav" "primary-nav primary-nav primary-nav" / minmax(0, 1fr) auto minmax(0, 1fr);}
1157  }#shopify-section-sections--27887156429042__header {
1158      --header-logo-width: 100px;
1159    }
1160
1161    @media screen and (min-width: 700px) {
1162      #shopify-section-sections--27887156429042__header {
1163        --header-logo-width: 85px;
1164      }
1165    }</style>
1166
1167<height-observer variable="header">
1168  <x-header
1169    
1170    class="header color-scheme color-scheme--scheme-1"
1171  >
1172      <a href="/" class="header__logo"><span class="sr-only">Mooncat Crystals</span><img src="//www.mooncatcrystals.com/cdn/shop/files/logo-mooncat.png?v=1729612271&amp;width=1531" alt="Hand Selected Healing Crystals and Spiritual Tools - Mooncat Crystals" srcset="//www.mooncatcrystals.com/cdn/shop/files/logo-mooncat.png?v=1729612271&amp;width=170 170w, //www.mooncatcrystals.com/cdn/shop/files/logo-mooncat.png?v=1729612271&amp;width=255 255w" width="1531" height="1531" sizes="85px" class="header__logo-image"></a>
1173    
1174<nav
1175        class="header__primary-nav header__primary-nav--center"
1176        aria-label="Primary navigation"
1177      >
1178        <button
1179          type="button"
1180          aria-controls="sidebar-menu"
1181          
1182            class="md:hidden"
1183          
1184        >
1185          <span class="sr-only">Navigation menu</span><svg aria-hidden="true" fill="none" focusable="false" width="24" class="header__nav-icon icon icon-hamburger" viewBox="0 0 24 24">
1186      <path d="M1 19h22M1 12h22M1 5h22" stroke="currentColor" stroke-width="2" stroke-linecap="square"/>
1187    </svg></button><ul class="contents unstyled-list md-max:hidden">
1188
1189              <li class="header__primary-nav-item">
1190                    <mega-menu-disclosure follow-summary-link trigger="hover" class="contents"><details class="header__menu-disclosure">
1191                      <summary data-follow-link="#" class="h6" data-title="Shop All">Shop All</summary><div class="mega-menu mega-menu--reverse" ><ul class="mega-menu__linklist unstyled-list"><li class="v-stack justify-items-start gap-5">
1192          <a href="/pages/shop-by-intention" class="h6">Shop by Intention</a></li><li class="v-stack justify-items-start gap-5">
1193          <a href="/" class="h6">Shop by Crystal Names</a></li></ul><div class="mega-menu__promo"><a href="/collections/newly-listed" class="v-stack justify-items-center gap-4 sm:gap-5 group"><div class="overflow-hidden"><img src="//www.mooncatcrystals.com/cdn/shop/files/hero2.png?v=1788724344&amp;width=1082" alt="" srcset="//www.mooncatcrystals.com/cdn/shop/files/hero2.png?v=1788724344&amp;width=315 315w, //www.mooncatcrystals.com/cdn/shop/files/hero2.png?v=1788724344&amp;width=630 630w, //www.mooncatcrystals.com/cdn/shop/files/hero2.png?v=1788724344&amp;width=945 945w" width="1082" height="612" loading="lazy" sizes="315px" class="zoom-image group-hover:zoom"></div><div class="v-stack text-center gap-2.5"><p class="h6">Browse All Crystals</p></div></a></div></div>
1194</details></mega-menu-disclosure></li>
1195
1196              <li class="header__primary-nav-item"><a
1197                    href="https://quiz.mooncatcrystals.com/"
1198                    data-title="Take Our Crystal Quiz "
1199                    class="block h6"
1200                    
1201                  >Take Our Crystal Quiz </a></li>
1202
1203              <li class="header__primary-nav-item">
1204                    <mega-menu-disclosure follow-summary-link trigger="hover" class="contents"><details class="header__menu-disclosure">
1205                      <summary data-follow-link="#" class="h6" data-title="Learn ">Learn </summary><div class="mega-menu mega-menu--reverse" ><ul class="mega-menu__linklist unstyled-list"><li class="v-stack justify-items-start gap-5">
1206          <a href="/blogs/news" class="h6">Crystal Basics</a></li><li class="v-stack justify-items-start gap-5">
1207          <a href="/blogs/news" class="h6">Using Crystals for Specific Intentions</a></li><li class="v-stack justify-items-start gap-5">
1208          <a href="https://www.youtube.com/@mooncatcrystals" class="h6">Sound Healing Frequencies on YouTube</a></li></ul><div class="mega-menu__promo"><a href="https://www.skool.com/mooncat-9307/about" class="v-stack justify-items-center gap-4 sm:gap-5 group"><div class="overflow-hidden"><img src="//www.mooncatcrystals.com/cdn/shop/files/ebook_crystal_healing_course.jpg?v=1742136738&amp;width=2000" alt="" srcset="//www.mooncatcrystals.com/cdn/shop/files/ebook_crystal_healing_course.jpg?v=1742136738&amp;width=315 315w, //www.mooncatcrystals.com/cdn/shop/files/ebook_crystal_healing_course.jpg?v=1742136738&amp;width=630 630w, //www.mooncatcrystals.com/cdn/shop/files/ebook_crystal_healing_course.jpg?v=1742136738&amp;width=945 945w" width="2000" height="1120" loading="lazy" sizes="315px" class="zoom-image group-hover:zoom"></div><div class="v-stack text-center gap-2.5"><p class="h6">Join Us in Crystal Skool</p></div></a></div></div>
1209</details></mega-menu-disclosure></li></ul></nav><nav class="header__secondary-nav" aria-label="Secondary navigation"><ul class="contents unstyled-list"><li class="header__account-link sm-max:hidden">
1210            <shopify-store store-domain="https://www.mooncatcrystals.com" country="US" language="en"></shopify-store>
1211<shopify-account menu="customer-account-main-menu">
1212              <div slot="signed-out-avatar"><svg aria-hidden="true" fill="none" focusable="false" width="24" class="header__nav-icon icon icon-account" viewBox="0 0 24 24">
1213      <path d="M16.125 8.75c-.184 2.478-2.063 4.5-4.125 4.5s-3.944-2.021-4.125-4.5c-.187-2.578 1.64-4.5 4.125-4.5 2.484 0 4.313 1.969 4.125 4.5Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1214      <path d="M3.017 20.747C3.783 16.5 7.922 14.25 12 14.25s8.217 2.25 8.984 6.497" stroke="currentColor" stroke-width="2" stroke-miterlimit="10"/>
1215    </svg></div>
1216            </shopify-account>
1217          </li><li class="header__search-link">
1218            <a href="/search" aria-controls="header-search-sections--27887156429042__header">
1219              <span class="sr-only">Search</span><svg aria-hidden="true" fill="none" focusable="false" width="24" class="header__nav-icon icon icon-search" viewBox="0 0 24 24">
1220      <path d="M10.364 3a7.364 7.364 0 1 0 0 14.727 7.364 7.364 0 0 0 0-14.727Z" stroke="currentColor" stroke-width="2" stroke-miterlimit="10"/>
1221      <path d="M15.857 15.858 21 21.001" stroke="currentColor" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round"/>
1222    </svg></a>
1223          </li><li class="relative header__cart-link">
1224          <a
1225            href="/cart"
1226            
1227              aria-controls="cart-drawer"
1228            
1229            data-no-instant
1230          >
1231            <span class="sr-only">Cart</span><svg aria-hidden="true" fill="none" focusable="false" width="24" class="header__nav-icon icon icon-cart" viewBox="0 0 24 24"><path d="M4.75 8.25A.75.75 0 0 0 4 9L3 19.125c0 1.418 1.207 2.625 2.625 2.625h12.75c1.418 0 2.625-1.149 2.625-2.566L20 9a.75.75 0 0 0-.75-.75H4.75Zm2.75 0v-1.5a4.5 4.5 0 0 1 4.5-4.5v0a4.5 4.5 0 0 1 4.5 4.5v1.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg><cart-dot class="header__cart-dot  "></cart-dot>
1232          </a>
1233        </li>
1234      </ul>
1235    </nav><header-search id="header-search-sections--27887156429042__header" class="header-search">
1236  <div class="container">
1237    <form id="predictive-search-form" action="/search" method="GET" aria-owns="header-predictive-search" class="header-search__form" role="search">
1238      <div class="header-search__form-control"><svg aria-hidden="true" fill="none" focusable="false" width="20" class="icon icon-search" viewBox="0 0 24 24">
1239      <path d="M10.364 3a7.364 7.364 0 1 0 0 14.727 7.364 7.364 0 0 0 0-14.727Z" stroke="currentColor" stroke-width="2" stroke-miterlimit="10"/>
1240      <path d="M15.857 15.858 21 21.001" stroke="currentColor" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round"/>
1241    </svg><input
1242          type="search"
1243          name="q"
1244          spellcheck="false"
1245          class="header-search__input h5 sm:h4"
1246          aria-label="Search"
1247          placeholder="Search for..."
1248        >
1249
1250        <dialog-close-button class="contents">
1251          <button type="button">
1252            <span class="sr-only">Close</span><svg aria-hidden="true" focusable="false" fill="none" width="16" class="icon icon-close" viewBox="0 0 16 16">
1253      <path d="m1 1 14 14M1 15 15 1" stroke="currentColor" stroke-width="2"/>
1254    </svg>
1255
1256  </button>
1257        </dialog-close-button>
1258      </div>
1259    </form>
1260
1261    <predictive-search id="header-predictive-search" class="predictive-search">
1262      <div class="predictive-search__content" slot="results"></div>
1263    </predictive-search>
1264  </div>
1265</header-search>
1266<template id="header-sidebar-template">
1267  <div part="base">
1268    <div part="overlay"></div>
1269
1270    <div part="content">
1271      <header part="header">
1272        <dialog-close-button class="contents">
1273          <button type="button" part="close-button tap-area" aria-label="Close"><svg aria-hidden="true" focusable="false" fill="none" width="16" class="icon icon-close" viewBox="0 0 16 16">
1274      <path d="m1 1 14 14M1 15 15 1" stroke="currentColor" stroke-width="2"/>
1275    </svg>
1276
1277  </button>
1278        </dialog-close-button>
1279      </header>
1280
1281      <div part="panel-list">
1282        <slot name="main-panel"></slot><slot name="collapsible-panel"></slot></div>
1283    </div>
1284  </div>
1285</template>
1286
1287<header-sidebar id="sidebar-menu" class="header-sidebar drawer drawer--sm color-scheme color-scheme--scheme-2" template="header-sidebar-template" open-from="left"><div class="header-sidebar__main-panel" slot="main-panel">
1288    <div class="header-sidebar__scroller">
1289      <ul class="header-sidebar__linklist divide-y unstyled-list" role="list"><li><button
1290                type="button"
1291                class="header-sidebar__linklist-button h6"
1292                aria-controls="header-panel-1"
1293                aria-expanded="false"
1294              >Shop All<svg aria-hidden="true" focusable="false" fill="none" width="12" class="icon icon-chevron-right  icon--direction-aware" viewBox="0 0 10 10">
1295      <path d="m3 9 4-4-4-4" stroke="currentColor" stroke-linecap="square"/>
1296    </svg></button></li><li><a href="https://quiz.mooncatcrystals.com/" class="header-sidebar__linklist-button h6">Take Our Crystal Quiz </a></li><li><button
1297                type="button"
1298                class="header-sidebar__linklist-button h6"
1299                aria-controls="header-panel-3"
1300                aria-expanded="false"
1301              >Learn <svg aria-hidden="true" focusable="false" fill="none" width="12" class="icon icon-chevron-right  icon--direction-aware" viewBox="0 0 10 10">
1302      <path d="m3 9 4-4-4-4" stroke="currentColor" stroke-linecap="square"/>
1303    </svg></button></li></ul>
1304    </div><div class="header-sidebar__footer"><shopify-account menu="customer-account-main-menu">
1305            <div slot="signed-out-avatar">
1306              <div class="text-with-icon smallcaps sm:hidden"><svg aria-hidden="true" fill="none" focusable="false" width="20" class="icon icon-account" viewBox="0 0 24 24">
1307      <path d="M16.125 8.75c-.184 2.478-2.063 4.5-4.125 4.5s-3.944-2.021-4.125-4.5c-.187-2.578 1.64-4.5 4.125-4.5 2.484 0 4.313 1.969 4.125 4.5Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1308      <path d="M3.017 20.747C3.783 16.5 7.922 14.25 12 14.25s8.217 2.25 8.984 6.497" stroke="currentColor" stroke-width="2" stroke-miterlimit="10"/>
1309    </svg>Login</div>
1310            </div>
1311          </shopify-account></div></div><header-sidebar-collapsible-panel class="header-sidebar__collapsible-panel" slot="collapsible-panel">
1312      <div class="header-sidebar__scroller"><div id="header-panel-1" class="header-sidebar__sub-panel" hidden>
1313              <button
1314                type="button"
1315                class="header-sidebar__back-button link-faded is-divided text-with-icon h6 md:hidden"
1316                data-action="close-panel"
1317              ><svg aria-hidden="true" focusable="false" fill="none" width="12" class="icon icon-chevron-left  icon--direction-aware" viewBox="0 0 10 10">
1318      <path d="M7 1 3 5l4 4" stroke="currentColor" stroke-linecap="square"/>
1319    </svg>Shop All</button>
1320
1321              <ul class="header-sidebar__linklist divide-y unstyled-list" role="list"><li><a href="/pages/shop-by-intention" class="header-sidebar__linklist-button h6">Shop by Intention</a></li><li><a href="/" class="header-sidebar__linklist-button h6">Shop by Crystal Names</a></li></ul><div class="header-sidebar__promo scroll-area bleed md:unbleed"><a href="/collections/newly-listed" class="v-stack justify-items-center gap-4 sm:gap-5 group"><div class="overflow-hidden"><img src="//www.mooncatcrystals.com/cdn/shop/files/hero2.png?v=1788724344&amp;width=1082" alt="" srcset="//www.mooncatcrystals.com/cdn/shop/files/hero2.png?v=1788724344&amp;width=315 315w, //www.mooncatcrystals.com/cdn/shop/files/hero2.png?v=1788724344&amp;width=630 630w, //www.mooncatcrystals.com/cdn/shop/files/hero2.png?v=1788724344&amp;width=945 945w" width="1082" height="612" loading="lazy" sizes="315px" class="zoom-image group-hover:zoom"></div><div class="v-stack text-center gap-0.5"><p class="h6">Browse All Crystals</p></div></a></div></div><div id="header-panel-3" class="header-sidebar__sub-panel" hidden>
1322              <button
1323                type="button"
1324                class="header-sidebar__back-button link-faded is-divided text-with-icon h6 md:hidden"
1325                data-action="close-panel"
1326              ><svg aria-hidden="true" focusable="false" fill="none" width="12" class="icon icon-chevron-left  icon--direction-aware" viewBox="0 0 10 10">
1327      <path d="M7 1 3 5l4 4" stroke="currentColor" stroke-linecap="square"/>
1328    </svg>Learn </button>
1329
1330              <ul class="header-sidebar__linklist divide-y unstyled-list" role="list"><li><a href="/blogs/news" class="header-sidebar__linklist-button h6">Crystal Basics</a></li><li><a href="/blogs/news" class="header-sidebar__linklist-button h6">Using Crystals for Specific Intentions</a></li><li><a href="https://www.youtube.com/@mooncatcrystals" class="header-sidebar__linklist-button h6">Sound Healing Frequencies on YouTube</a></li></ul><div class="header-sidebar__promo scroll-area bleed md:unbleed"><a href="https://www.skool.com/mooncat-9307/about" class="v-stack justify-items-center gap-4 sm:gap-5 group"><div class="overflow-hidden"><img src="//www.mooncatcrystals.com/cdn/shop/files/ebook_crystal_healing_course.jpg?v=1742136738&amp;width=2000" alt="" srcset="//www.mooncatcrystals.com/cdn/shop/files/ebook_crystal_healing_course.jpg?v=1742136738&amp;width=315 315w, //www.mooncatcrystals.com/cdn/shop/files/ebook_crystal_healing_course.jpg?v=1742136738&amp;width=630 630w, //www.mooncatcrystals.com/cdn/shop/files/ebook_crystal_healing_course.jpg?v=1742136738&amp;width=945 945w" width="2000" height="1120" loading="lazy" sizes="315px" class="zoom-image group-hover:zoom"></div><div class="v-stack text-center gap-0.5"><p class="h6">Join Us in Crystal Skool</p></div></a></div></div></div>
1331    </header-sidebar-collapsible-panel></header-sidebar>
1332</x-header>
1333</height-observer>
1334
1335<script>
1336  document.documentElement.style.setProperty('--header-height', `${document.getElementById('shopify-section-sections--27887156429042__header').clientHeight.toFixed(2)}px`);
1337</script>
1337
1338
1339
1340</header>
1341<!-- END sections: header-group --><!-- BEGIN sections: overlay-group -->
1342<section id="shopify-section-sections--27887157608690__cart-drawer" class="shopify-section shopify-section-group-overlay-group shopify-section--cart-drawer"><cart-drawer
1343  id="cart-drawer"
1344  aria-label="Cart"
1345  class="cart-drawer drawer drawer--center-body color-scheme color-scheme--scheme-2"
1346  initial-focus="false"
1347  handle-editor-events
1348>
1349  <p class="h4" slot="header">Cart</p><p class="h5 text-center">Your cart is empty</p></cart-drawer>
1350
1351
1352</section>
1353<!-- END sections: overlay-group --><main id="main" class="anchor">
1354      <section id="shopify-section-template--27887161901298__main" class="shopify-section shopify-section--main-search"><div class="color-scheme color-scheme--scheme-1">
1355    <div class="container container--xs">
1356      <div class="empty-state">
1357        <div class="v-stack gap-4">
1358          <div class="prose">
1359            <h1 class="h4">Search</h1>
1360          </div>
1361
1362          <form class="main-search-form" action="/search" method="get" role="search"><div class="relative"><div class="form-control" ><input
1363        id="input--template--27887161901298__main--q"
1364        class="input"
1365        type="text"
1366        
1367        
1368          placeholder="Search for..."
1369        
1370        
1371  name="q"
1372  
1373  
1374  
1375  
1376  
1377  autocomplete="off"
1378  
1379  
1380  
1381  
1382  autocorrect="off"
1383  
1384
1385      ><label for="input--template--27887161901298__main--q" class="floating-label text-xs">Search for...</label></div><button type="submit" class="input-suffix link-faded"><svg aria-hidden="true" fill="none" focusable="false" width="24" class="icon icon-search" viewBox="0 0 24 24">
1386      <path d="M10.364 3a7.364 7.364 0 1 0 0 14.727 7.364 7.364 0 0 0 0-14.727Z" stroke="currentColor" stroke-width="2" stroke-miterlimit="10"/>
1387      <path d="M15.857 15.858 21 21.001" stroke="currentColor" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round"/>
1388    </svg></button>
1389            </div>
1390          </form>
1391        </div>
1392      </div>
1393    </div>
1394  </div>
1395</section>
1396<!-- BEGIN sections: footer-group -->
1397<footer id="shopify-section-sections--27887156363506__footer" class="shopify-section shopify-section-group-footer-group shopify-section--footer"><style>
1398  #shopify-section-sections--27887156363506__footer {
1399    --footer-content-justify-items: space-between;
1400  }
1401</style><div class="footer color-scheme color-scheme--scheme-1 color-scheme--bg-77e774e6cc4d94d6a32f6256f02d9552 bordered-section">
1402  <div class="container">
1403    <div class="footer__inner"><div class="footer__block-list"><div class="footer__block footer__block--text" ><div class="v-stack gap-4 sm:gap-5"><div class="prose text-subdued"><p>Mooncat Crystals offers hand-selected, intentionally sourced stones to support your energy, balance, and magic. </p><p>This isn't just a shop - it's a space created for you to explore, connect, and find what resonates with your journey. </p><p>Whether you’re just beginning your crystal journey or deepening your connection, we’re here to help you find the right tools to inspire growth, balance, and clarity. </p><p>Let your intuition guide you, and know that whatever you choose, it was meant for you.</p></div><div class="follow-on-shop">
1403<script defer="defer" async type="module" src="https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.shop-follow-button.en.esm.js"></script>
vendor: 1 bytes, line 1403
1403
1404<script type="module">
1405  await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.shop-follow-button.en.esm.js");
1406
1407  
1408</script>
1408
1409
1410<shop-follow-button ux-mode="windoid" return-uri="https://www.mooncatcrystals.com/account/redirect" proxy="true"></shop-follow-button>
1411</div></div></div><div class="footer__block footer__block--links" ><div class="v-stack gap-4 sm:gap-5 "><p class="h6">Quick Links</p><ul class="v-stack gap-2.5 unstyled-list" role="list"><li>
1412                            <a href="https://mooncatcrystals.com/collections/newly-listed" class="link-faded">See What's New</a>
1413                          </li><li>
1414                            <a href="https://mooncatcrystals.com/pages/shop-by-intention" class="link-faded">Shop by Intention </a>
1415                          </li><li>
1416                            <a href="https://mooncatcrystals.com/blogs/news" class="link-faded">Learn Crystal Healing</a>
1417                          </li><li>
1418                            <a href="https://mooncatcrystals.com/pages/about-2" class="link-faded">About Us</a>
1419                          </li><li>
1420                            <a href="https://mooncatcrystals.com/apps/loyalty" class="link-faded">Rewards</a>
1421                          </li><li>
1422                            <a href="https://mooncatcrystals.com/pages/faq" class="link-faded">FAQs</a>
1423                          </li><li>
1424                            <a href="https://mooncatcrystals.com/pages/contact-1" class="link-faded">Get in Touch </a>
1425                          </li><li>
1426                            <a href="https://www.skool.com/mooncat-9307/about" class="link-faded">Community</a>
1427                          </li></ul></div></div><div class="footer__block footer__block--links" ><div class="v-stack gap-4 sm:gap-5 "><p class="h6">Policies + Info</p><ul class="v-stack gap-2.5 unstyled-list" role="list"><li>
1428                            <a href="/pages/terms-of-use" class="link-faded">Terms of Use</a>
1429                          </li><li>
1430                            <a href="/pages/privacy-policy" class="link-faded">Privacy Policy</a>
1431                          </li><li>
1432                            <a href="https://mooncatcrystals.com/pages/returns" class="link-faded">Shipping + Returns</a>
1433                          </li><li>
1434                            <a href="/policies/refund-policy" class="link-faded">Refund Policy</a>
1435                          </li><li>
1436                            <a href="https://mooncatcrystals.com/pages/course-terms" class="link-faded">Course & Ebook Policy</a>
1437                          </li></ul></div></div><div class="footer__block footer__block--newsletter" ><div class="v-stack gap-4 sm:gap-5"><p class="h6">Newsletter</p><div class="prose text-subdued"><p>Join thousands of crystal lovers and get care guides, new arrivals, and crystal education delivered to your inbox.</p></div><form method="post" action="/contact#newsletter-form-sections--27887156363506__footer" id="newsletter-form-sections--27887156363506__footer" accept-charset="UTF-8" class="form"><input type="hidden" name="form_type" value="customer" /><input type="hidden" name="utf8" value="✓" /><input type="hidden" name="contact[tags]" value="newsletter"><div class="form-control" ><input
1438        id="input--sections--27887156363506__footer--contactemail"
1439        class="input"
1440        type="email"
1441        
1442          dir="ltr"
1443        
1444        
1445          placeholder="E-mail"
1446        
1447        
1448  name="contact[email]"
1449  
1450  
1451  
1452  
1453  
1454  autocomplete="email"
1455  
1456  enterkeyhint="send"
1457  required
1458  
1459  
1460  
1461
1462      ><label for="input--sections--27887156363506__footer--contactemail" class="floating-label text-xs">E-mail</label></div><div class="align-self-start">
1463<button type="submit"  class="button" >Subscribe</button></div></form></div></div></div><ul class="social-media social-media--list unstyled-list" role="list"><li class="social-media__item branding-colors--facebook">
1464      <a href="https://www.facebook.com/mooncatcrystals" class="tap-area" target="_blank" rel="noopener" aria-label="Follow on Facebook"><svg aria-hidden="true" focusable="false" width="24" class="icon icon-facebook" viewBox="0 0 24 24">
1465      <path fill-rule="evenodd" clip-rule="evenodd" d="M10.183 21.85v-8.868H7.2V9.526h2.983V6.982a4.17 4.17 0 0 1 4.44-4.572 22.33 22.33 0 0 1 2.667.144v3.084h-1.83a1.44 1.44 0 0 0-1.713 1.68v2.208h3.423l-.447 3.456h-2.97v8.868h-3.57Z" fill="currentColor"/>
1466    </svg></a>
1467    </li><li class="social-media__item branding-colors--instagram">
1468      <a href="https://instagram.com/mooncatcrystals" class="tap-area" target="_blank" rel="noopener" aria-label="Follow on Instagram"><svg aria-hidden="true" focusable="false" width="24" class="icon icon-instagram" viewBox="0 0 24 24">
1469      <path fill-rule="evenodd" clip-rule="evenodd" d="M12 2.4c-2.607 0-2.934.011-3.958.058-1.022.046-1.72.209-2.33.446a4.705 4.705 0 0 0-1.7 1.107 4.706 4.706 0 0 0-1.108 1.7c-.237.611-.4 1.31-.446 2.331C2.41 9.066 2.4 9.392 2.4 12c0 2.607.011 2.934.058 3.958.046 1.022.209 1.72.446 2.33a4.706 4.706 0 0 0 1.107 1.7c.534.535 1.07.863 1.7 1.108.611.237 1.309.4 2.33.446 1.025.
1469047 1.352.058 3.959.058s2.934-.011 3.958-.058c1.022-.046 1.72-.209 2.33-.446a4.706 4.706 0 0 0 1.7-1.107 4.706 4.706 0 0 0 1.108-1.7c.237-.611.4-1.31.446-2.33.047-1.025.058-1.352.058-3.959s-.011-2.934-.058-3.958c-.047-1.022-.209-1.72-.446-2.33a4.706 4.706 0 0 0-1.107-1.7 4.705 4.705 0 0 0-1.7-1.108c-.611-.237-1.31-.4-2.331-.446C14.934 2.41 14.608 2.4 12 2.4Zm0 1.73c2.563 0 2.867.01 3.88.056.935.042 1.443.199 1.782.33.448.174.768.382 1.104.718.336.336.544.656.718 1.104.131.338.287.847.33 1.783.046 1.012.056 1.316.056 3.879 0 2.563-.01 2.867-.056 3.88-.043.935-.199 1.444-.33 1.782a2.974 2.974 0 0 1-.719 1.104 2.974 2.974 0 0 1-1.103.718c-.339.131-.847.288-1.783.33-1.012.046-1.316.056-3.88.056-2.563 0-2.866-.01-3.878-.056-.936-.042-1.445-.199-1.783-.33a2.974 2.974 0 0 1-1.104-.718 2.974 2.974 0 0 1-.718-1.104c-.131-.338-.288-.847-.33-1.783-.047-1.012-.056-1.316-.056-3.879 0-2.563.01-2.867.056-3.88.042-.935.199-1.443.33-1.782.174-.448.382-.768.718-1.104a2.974 2.974 0 0 1 1.104-.718c.338-.131.847-.288 1.783-.33C9.133 4.14 9.437 4.13 12 4.13Zm0 11.07a3.2 3.2 0 1 1 0-6.4 3.2 3.2 0 0 1 0 6.4Zm0-8.13a4.93 4.93 0 1 0 0 9.86 4.93 4.93 0 0 0 0-9.86Zm6.276-.194a1.152 1.152 0 1 1-2.304 0 1.152 1.152 0 0 1 2.304 0Z" fill="currentColor"/>
1470    </svg></a>
1471    </li><li class="social-media__item branding-colors--pinterest">
1472      <a href="https://www.pinterest.com/mooncatcrystals" class="tap-area" target="_blank" rel="noopener" aria-label="Follow on Pinterest"><svg aria-hidden="true" focusable="false" width="24" class="icon icon-pinterest" viewBox="0 0 24 24">
1473      <path fill-rule="evenodd" clip-rule="evenodd" d="M11.765 2.401c3.59-.054 5.837 1.4 6.895 3.95.349.842.722 2.39.442 3.675-.112.512-.144 1.048-.295 1.53-.308.983-.708 1.853-1.238 2.603-.72 1.02-1.81 1.706-3.182 2.052-1.212.305-2.328-.152-2.976-.643-.206-.156-.483-.36-.56-.643h-.029c-.046.515-.244 1.062-.383 1.531-.193.65-.23 1.321-.472 1.929a12.345 12.345 0 0 1-.942 1.868c-.184.302-.692 1.335-1.061 1.347-.04-.078-.057-.108-.06-.245-.118-.19-.035-.508-.087-.766-.082-.4-.145-1.123-.06-1.53v-.643c.096-.442.092-.894.207-1.317.25-.92.39-1.895.648-2.848.249-.915.477-1.916.678-2.847.045-.21-.21-.815-.265-1.041-.174-.713-.042-1.7.176-2.236.275-.674 1.08-1.703 2.122-1.439.838.212 1.371 1.118 1.09 2.266-.295 1.205-.677 2.284-.943 3.49-.068.311.05.641.118.827.248.672 1 1.324 2.004 1.072 1.52-.383 2.193-1.76 2.652-3.246.124-.402.109-.781.206-1.225.204-.935.118-2.331-.177-3.061-.472-1.17-1.353-1.92-2.563-2.328L12.707 4.3c-.56-.128-1.626.064-2.004.183-1.69.535-2.737 1.427-3.388 3.032-.222.546-.344 1.1-.383 1.868l-.03.276c.13.686.144 1.14.413 1.653.132.252.447.451.5.765.032.185-.104.464-.147.613-.065.224-.041.48-.147.673-.192.349-.714.087-.943-.061-1.192-.77-2.175-2.995-1.62-5.144.085-.332.09-.62.206-.919.723-1.844 1.802-2.978 3.359-3.95.583-.364 1.37-.544 2.092-.734l1.149-.154Z" fill="currentColor"/>
1474    </svg></a>
1475    </li><li class="social-media__item branding-colors--youtube">
1476      <a href="https://www.youtube.com/@mooncatcrystals" class="tap-area" target="_blank" rel="noopener" aria-label="Follow on YouTube"><svg aria-hidden="true" focusable="false" width="24" class="icon icon-youtube" viewBox="0 0 24 24">
1477      <path fill-rule="evenodd" clip-rule="evenodd" d="M20.44 5.243c.929.244 1.66.963 1.909 1.876.451 1.654.451 5.106.451 5.106s0 3.452-.451 5.106a2.681 2.681 0 0 1-1.91 1.876c-1.684.443-8.439.443-8.439.443s-6.754 0-8.439-.443a2.682 2.682 0 0 1-1.91-1.876c-.45-1.654-.45-5.106-.45-5.106s0-3.452.45-5.106a2.681 2.681 0 0 1 1.91-1.876c1.685-.443 8.44-.443 8.44-.443s6.754 0 8.438.443Zm-5.004 6.982L9.792 15.36V9.091l5.646 3.134Z" fill="currentColor"/>
1478    </svg></a>
1479    </li></ul><div class="footer__aside"><p class="heading text-subdued text-xxs">
1480          © 2026 - Mooncat Crystals
1481</p><ul class="payment-methods unstyled-list"><li><svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 38 24" width="38" height="24" fill="none" aria-labelledby="pi-american_express"><title id="pi-american_express">American Express</title><rect x=".5" y=".5" width="37" height="23" rx="2.5" stroke="#000" stroke-opacity=".07" fill="none"/><path d="M35 0H3C1.3 0 0 1.3 0 3V21C0 22.7 1.4 24 3 24H35C36.7 24 38 22.7 38 21V3C38 1.3 36.6 0 35 0Z" fill="#0071CE" style="fill:#0071CE;fill:color(display-p3 0.0000 0.4431 0.8078);fill-opacity:1;"/>
1481<path d="M3 0.5H35C36.3348 0.5 37.5 1.58692 37.5 3V21C37.5 22.4239 36.4239 23.5 35 23.5H3C1.66524 23.5 0.5 22.4131 0.5 21V3C0.5 1.57614 1.57614 0.5 3 0.5Z" stroke="black" stroke-opacity="0.07" style="stroke:black;stroke-opacity:0.07;"/><path d="M25.8662 6.33203V3H31L31.8662 5.5332L32.7334 3H37V14.2002H36.7998L34.8672 16.2656L36.7998 18.3594H37V21.2666H33.5996L31.9336 19.3994L30.2002 21.2666H19.4668V12.666H16L20.2666 3H24.4004L25.8662 6.33203ZM20.5996 20.2656H27V18.5322H22.666V17.3994H26.8662V15.666H22.666V14.5322H27V12.7988H20.5996V20.2656ZM30.5332 16.5322L27 20.2656H29.5996L31.8662 17.8662L34.0664 20.2656H36.7324L33.1992 16.4658L36.7324 12.7988H34.1328L31.8662 15.1992L29.7324 12.7988H27L30.5332 16.5322ZM17.666 11.7324H19.9326L20.5332 10.1992H23.999L24.666 11.7324H26.999L23.666 4.19922H20.999L17.666 11.7324ZM33.5996 4.19922L31.9326 8.86621L30.1992 4.19922H27V11.666H29.0664V6.39941L31 11.666H32.7998L34.7324 6.39941V11.666H36.7324V4.13281L33.5996 4.19922ZM23.2656 8.46582H21.2656L22.2656 5.99902L23.2656 8.46582Z" fill="white" style="fill:white;fill-opacity:1;"/></svg>
1482</li><li><svg version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" x="0" y="0" width="38" height="24" viewBox="0 0 165.521 105.965" xml:space="preserve" aria-labelledby="pi-apple_pay"><title id="pi-apple_pay">Apple Pay</title><path fill="#000" d="M150.698 0H14.823c-.566 0-1.133 0-1.698.003-.477.004-.953.009-1.43.022-1.039.028-2.087.09-3.113.274a10.51 10.51 0 0 0-2.958.975 9.932 9.932 0 0 0-4.35 4.35 10.463 10.463 0 0 0-.975 2.96C.113 9.611.052 10.658.024 11.696a70.22 70.22 0 0 0-.022 1.43C0 13.69 0 14.256 0 14.823v76.318c0 .567 0 1.132.002 1.699.003.476.009.953.022 1.43.028 1.036.09 2.084.275 3.11a10.46 10.46 0 0 0 .974 2.96 9.897 9.897 0 0 0 1.83 2.52 9.874 9.874 0 0 0 2.52 1.83c.947.483 1.917.79 2.96.977 1.025.183 2.073.245 3.112.273.477.011.953.017 1.43.02.565.004 1.132.004 1.698.004h135.875c.565 0 1.132 0 1.697-.004.476-.002.952-.009 1.431-.02 1.037-.028 2.085-.09 3.113-.273a10.478 10.478 0 0 0 2.958-.977 9.955 9.955 0 0 0 4.35-4.35c.483-.947.789-1.917.974-2.96.186-1.026.246-2.074.274-3.11.013-.477.02-.954.022-1.43.004-.567.004-1.132.004-1.699V14.824c0-.567 0-1.133-.004-1.699a63.067 63.067 0 0 0-.022-1.429c-.028-1.038-.088-2.085-.274-3.112a10.4 10.4 0 0 0-.974-2.96 9.94 9.94 0 0 0-4.35-4.35A10.52 10.52 0 0 0 156.939.3c-1.028-.185-2.076-.246-3.113-.274a71.417 71.417 0 0 0-1.431-.022C151.83 0 151.263 0 150.698 0z" /><path fill="#FFF" d="M150.698 3.532l1.672.003c.452.003.905.008 1.36.02.793.022 1.719.065 2.583.22.75.135 1.38.34 1.984.648a6.392 6.392 0 0 1 2.804 2.807c.306.6.51 1.226.645 1.983.154.854.197 1.783.218 2.58.013.45.019.9.02 1.36.005.557.005 1.113.005 1.671v76.318c0 .558 0 1.114-.004 1.682-.002.45-.008.9-.02 1.35-.022.796-.065 1.725-.221 2.589a6.855 6.855 0 0 1-.645 1.975 6.397 6.397 0 0 1-2.808 2.807c-.6.306-1.228.511-1.971.645-.881.157-1.847.2-2.574.22-.457.01-.912.017-1.379.019-.555.004-1.113.004-1.669.004H14.801c-.55 0-1.1 0-1.66-.004a74.993 74.993 0 0 1-1.35-.018c-.744-.02-1.71-.064-2.584-.22a6.938 6.938 0 0 1-1.986-.65 6.337 6.337 0 0 1-1.622-1.18 6.355 6.355 0 0 1-1.178-1.623 6.935 6.935 0 0 1-.646-1.985c-.156-.863-.2-1.788-.22-2.578a66.088 66.088 0 0 1-.02-1.355l-.003-1.327V14.474l.002-1.325a66.7 66.7 0 0 1 .02-1.357c.022-.792.065-1.717.222-2.587a6.924 6.924 0 0 1 .646-1.981c.304-.598.7-1.144 1.18-1.623a6.386 6.386 0 0 1 1.624-1.18 6.96 6.96 0 0 1 1.98-.646c.865-.155 1.792-.198 2.586-.22.452-.012.905-.017 1.354-.02l1.677-.003h135.875" /><g><g><path fill="#000" d="M43.508 35.77c1.404-1.755 2.356-4.112 2.105-6.52-2.054.102-4.56 1.355-6.012 3.112-1.303 1.504-2.456 3.959-2.156 6.266 2.306.2 4.61-1.152 6.063-2.858" /><path fill="#000" d="M45.587 39.079c-3.35-.2-6.196 1.9-7.795 1.9-1.6 0-4.049-1.8-6.698-1.751-3.447.05-6.645 2-8.395 5.1-3.598 6.2-.95 15.4 2.55 20.45 1.699 2.5 3.747 5.25 6.445 5.151 2.55-.1 3.549-1.65 6.647-1.65 3.097 0 3.997 1.65 6.696 1.6 2.798-.05 4.548-2.5 6.247-5 1.95-2.85 2.747-5.6 2.797-5.75-.05-.05-5.396-2.101-5.446-8.251-.05-5.15 4.198-7.6 4.398-7.751-2.399-3.548-6.147-3.948-7.447-4.048" /></g><g><path fill="#000" d="M78.973 32.11c7.278 0 12.347 5.017 12.347 12.321 0 7.33-5.173 12.373-12.529 12.373h-8.058V69.62h-5.822V32.11h14.062zm-8.24 19.807h6.68c5.07 0 7.954-2.729 7.954-7.46 0-4.73-2.885-7.434-7.928-7.434h-6.706v14.894z" />
1482<path fill="#000" d="M92.764 61.847c0-4.809 3.665-7.564 10.423-7.98l7.252-.442v-2.08c0-3.04-2.001-4.704-5.562-4.704-2.938 0-5.07 1.507-5.51 3.82h-5.252c.157-4.86 4.731-8.395 10.918-8.395 6.654 0 10.995 3.483 10.995 8.89v18.663h-5.38v-4.497h-.13c-1.534 2.937-4.914 4.782-8.579 4.782-5.406 0-9.175-3.222-9.175-8.057zm17.675-2.417v-2.106l-6.472.416c-3.64.234-5.536 1.585-5.536 3.95 0 2.288 1.975 3.77 5.068 3.77 3.95 0 6.94-2.522 6.94-6.03z" /><path fill="#000" d="M120.975 79.652v-4.496c.364.051 1.247.103 1.715.103 2.573 0 4.029-1.09 4.913-3.899l.52-1.663-9.852-27.293h6.082l6.863 22.146h.13l6.862-22.146h5.927l-10.216 28.67c-2.34 6.577-5.017 8.735-10.683 8.735-.442 0-1.872-.052-2.261-.157z" /></g></g></svg>
1483</li><li><svg viewBox="0 0 38 24" xmlns="http://www.w3.org/2000/svg" role="img" width="38" height="24" aria-labelledby="pi-diners_club"><title id="pi-diners_club">Diners Club</title><path opacity=".07" d="M35 0H3C1.3 0 0 1.3 0 3v18c0 1.7 1.4 3 3 3h32c1.7 0 3-1.3 3-3V3c0-1.7-1.4-3-3-3z"/><path fill="#fff" d="M35 1c1.1 0 2 .9 2 2v18c0 1.1-.9 2-2 2H3c-1.1 0-2-.9-2-2V3c0-1.1.9-2 2-2h32"/><path d="M12 12v3.7c0 .3-.2.3-.5.2-1.9-.8-3-3.3-2.3-5.4.4-1.1 1.2-2 2.3-2.4.4-.2.5-.1.5.2V12zm2 0V8.3c0-.3 0-.3.3-.2 2.1.8 3.2 3.3 2.4 5.4-.4 1.1-1.2 2-2.3 2.4-.4.2-.4.1-.4-.2V12zm7.2-7H13c3.8 0 6.8 3.1 6.8 7s-3 7-6.8 7h8.2c3.8 0 6.8-3.1 6.8-7s-3-7-6.8-7z" fill="#3086C8"/></svg></li><li><svg viewBox="0 0 38 24" width="38" height="24" role="img" aria-labelledby="pi-discover" fill="none" xmlns="http://www.w3.org/2000/svg"><title id="pi-discover">Discover</title><path fill="#000" opacity=".07" d="M35 0H3C1.3 0 0 1.3 0 3v18c0 1.7 1.4 3 3 3h32c1.7 0 3-1.3 3-3V3c0-1.7-1.4-3-3-3z"/><path d="M35 1c1.1 0 2 .9 2 2v18c0 1.1-.9 2-2 2H3c-1.1 0-2-.9-2-2V3c0-1.1.9-2 2-2h32z" fill="#fff"/><path d="M3.57 7.16H2v5.5h1.57c.83 0 1.43-.2 1.96-.63.63-.52 1-1.3 1-2.11-.01-1.63-1.22-2.76-2.96-2.76zm1.26 4.14c-.34.3-.77.44-1.47.44h-.29V8.1h.29c.69 0 1.11.12 1.47.44.37.33.59.84.59 1.37 0 .53-.22 1.06-.59 1.39zm2.19-4.14h1.07v5.5H7.02v-5.5zm3.69 2.11c-.64-.24-.83-.4-.83-.69 0-.35.34-.61.8-.61.32 0 .59.13.86.45l.56-.73c-.46-.4-1.01-.61-1.62-.61-.97 0-1.72.68-1.72 1.58 0 .76.35 1.15 1.35 1.51.42.15.63.25.74.31.21.14.32.34.32.57 0 .45-.35.78-.83.78-.51 0-.92-.26-1.17-.73l-.69.67c.49.73 1.09 1.05 1.9 1.05 1.11 0 1.9-.74 1.9-1.81.02-.89-.35-1.29-1.57-1.74zm1.92.65c0 1.62 1.27 2.87 2.9 2.87.46 0 .86-.09 1.34-.32v-1.26c-.43.43-.81.6-1.29.6-1.08 0-1.85-.78-1.85-1.9 0-1.06.79-1.89 1.8-1.89.51 0 .9.18 1.34.62V7.38c-.47-.24-.86-.34-1.32-.34-1.61 0-2.92 1.28-2.92 2.88zm12.76.94l-1.47-3.7h-1.17l2.33 5.64h.58l2.37-5.64h-1.16l-1.48 3.7zm3.13 1.8h3.04v-.93h-1.97v-1.48h1.9v-.93h-1.9V8.1h1.97v-.94h-3.04v5.5zm7.29-3.87c0-1.03-.71-1.62-1.95-1.62h-1.59v5.5h1.07v-2.21h.14l1.48 2.21h1.32l-1.73-2.32c.81-.17 1.26-.72 1.26-1.56zm-2.16.91h-.31V8.03h.33c.67 0 1.03.28 1.03.82 0 .55-.36.85-1.05.85z" fill="#231F20"/><path d="M20.16 12.86a2.931 2.931 0 100-5.862 2.931 2.931 0 000 5.862z" fill="url(#pi-paint0_linear)"/><path opacity=".65" d="M20.16 12.86a2.931 2.931 0 100-5.862 2.931 2.931 0 000 5.862z" fill="url(#pi-paint1_linear)"/><path d="M36.57 7.506c0-.1-.07-.15-.18-.15h-.16v.48h.12v-.19l.14.19h.14l-.16-.2c.06-.01.1-.06.1-.13zm-.2.07h-.02v-.13h.02c.06 0 .09.02.09.06 0 .05-.03.07-.09.07z" fill="#231F20"/><path d="M36.41 7.176c-.23 0-.42.19-.42.42 0 .23.19.42.42.42.23 0 .42-.19.42-.42 0-.23-.19-.42-.42-.42zm0 .77c-.18 0-.34-.15-.34-.35 0-.19.15-.35.34-.35.18 0 .33.16.33.35 0 .19-.15.35-.33.35z" fill="#231F20"/><path d="M37 12.984S27.09 19.873 8.976 23h26.023a2 2 0 002-1.984l.024-3.02L37 12.985z" fill="#F48120"/><defs><linearGradient id="pi-paint0_linear" x1="21.657" y1="12.275" x2="19.632" y2="9.104" gradientUnits="userSpaceOnUse"><stop stop-color="#F89F20"/><stop offset=".25" stop-color="#F79A20"/><stop offset=".533" stop-color="#F68D20"/><stop offset=".62" stop-color="#F58720"/><stop offset=".723" stop-color="#F48120"/><stop offset="1" stop-color="#F37521"/></linearGradient><linearGradient id="pi-paint1_linear" x1="21.338" y1="12.232" x2="18.378" y2="6.446" gradientUnits="userSpaceOnUse"><stop stop-color="#F58720"/><stop offset=".359" stop-color="#E16F27"/><stop offset=".703" stop-color="#D4602C"/><stop offset=".982" stop-color="#D05B2E"/></linearGradient></defs></svg></li><li><svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 38 24" width="38" height="24" aria-labelledby="pi-google_pay"><title id="pi-google_pay">Google Pay</title><path d="M35 0H3C1.3 0 0 1.3 0 3v18c0 1.7 1.4 3 3 3h32c1.7 0 3-1.3 3-3V3c0-1.7-1.4-3-3-3z" fill="#000" opacity=".07"/><path d="M35 1c1.1 0 2 .9 2 2v18c0 1.1-.9 2-2 2H3c-1.1 0-2-.9-2-2V3c0-1.1.9-2 2-2h32" fill="#FFF"/><path d="M18.093 11.976v3.2h-1.018v-7.9h2.691a2.447 2.447 0 0 1 1.747.692 2.28 2.28 0 0 1 .11 3.224l-.11.116c-.47.447-1.098.69-1.747.674l-1.673-.006zm0-3.732v2.788h1.698c.377.012.741-.135 1.005-.404a1.391 1.391 0 0 0-1.005-2.354l-1.698-.03zm6.484 1.348c.65-.03 1.286.188 1.778.613.445.43.682 1.03.65 1.649v3.334h-.969v-.766h-.049a1.93 1.93 0 0 1-1.673.931 2.17 2.17 0 0 1-1.496-.533 1.667 1.667 0 0 1-.613-1.324 1.606 1.606 0 0 1 .613-1.336 2.746 2.746 0 0 1 1.698-.515c.517-.02 1.03.093 1.49.331v-.208a1.134 1.134 0 0 0-.417-.901 1.416 1.416 0 0 0-.98-.368 1.545 1.545 0 0 0-1.319.717l-.895-.564a2.488 2.488 0 0 1 2.182-1.
148306zM23.29 13.52a.79.79 0 0 0 .337.662c.223.176.5.269.785.263.429-.001.84-.17 1.146-.472.305-.286.478-.685.478-1.103a2.047 2.047 0 0 0-1.324-.374 1.716 1.716 0 0 0-1.03.294.883.883 0 0 0-.392.73zm9.286-3.75l-3.39 7.79h-1.048l1.281-2.728-2.224-5.062h1.103l1.612 3.885 1.569-3.885h1.097z" fill="#5F6368"/><path d="M13.986 11.284c0-.308-.024-.616-.073-.92h-4.29v1.747h2.451a2.096 2.096 0 0 1-.9 1.373v1.134h1.464a4.433 4.433 0 0 0 1.348-3.334z" fill="#4285F4"/><path d="M9.629 15.721a4.352 4.352 0 0 0 3.01-1.097l-1.466-1.14a2.752 2.752 0 0 1-4.094-1.44H5.577v1.17a4.53 4.53 0 0 0 4.052 2.507z" fill="#34A853"/><path d="M7.079 12.05a2.709 2.709 0 0 1 0-1.735v-1.17H5.577a4.505 4.505 0 0 0 0 4.075l1.502-1.17z" fill="#FBBC04"/><path d="M9.629 8.44a2.452 2.452 0 0 1 1.74.68l1.3-1.293a4.37 4.37 0 0 0-3.065-1.183 4.53 4.53 0 0 0-4.027 2.5l1.502 1.171a2.715 2.715 0 0 1 2.55-1.875z" fill="#EA4335"/></svg>
1484</li><li><svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 38 24" width="38" height="24" fill="none" aria-labelledby="pi-master"><title id="pi-master">Mastercard</title><rect x=".5" y=".5" width="37" height="23" rx="2.5" stroke="#000" stroke-opacity=".07" fill="none"/><path d="M35 0H3C1.3 0 0 1.3 0 3V21C0 22.7 1.4 24 3 24H35C36.7 24 38 22.7 38 21V3C38 1.3 36.6 0 35 0Z" fill="#1C1C1C" style="fill:#1C1C1C;fill:color(display-p3 0.1098 0.1098 0.1098);fill-opacity:1;"/><path d="M35 1C36.1 1 37 1.9 37 3V21C37 22.1 36.1 23 35 23H3C1.9 23 1 22.1 1 21V3C1 1.9 1.9 1 3 1H35Z" fill="#232323" style="fill:#232323;fill:color(display-p3 0.1373 0.1373 0.1373);fill-opacity:1;"/><path d="M14.6364 19.2727C18.8538 19.2727 22.2727 15.8538 22.2727 11.6364C22.2727 7.41892 18.8538 4 14.6364 4C10.4189 4 7 7.41892 7 11.6364C7 15.8538 10.4189 19.2727 14.6364 19.2727Z" fill="#EB001B" style="fill:#EB001B;fill:color(display-p3 0.9216 0.0000 0.1059);fill-opacity:1;"/><path d="M23.3637 19.2727C27.5811 19.2727 31 15.8538 31 11.6364C31 7.41892 27.5811 4 23.3637 4C19.1462 4 15.7273 7.41892 15.7273 11.6364C15.7273 15.8538 19.1462 19.2727 23.3637 19.2727Z" fill="#F79E1B" style="fill:#F79E1B;fill:color(display-p3 0.9686 0.6196 0.1059);fill-opacity:1;"/><path d="M22.2727 11.6362C22.2727 9.01797 20.9637 6.72706 19 5.41797C17.0364 6.83615 15.7273 9.12706 15.7273 11.6362C15.7273 14.1452 17.0364 16.5452 19 17.8543C20.9637 16.5452 22.2727 14.2543 22.2727 11.6362Z" fill="#FF5F00" style="fill:#FF5F00;fill:color(display-p3 1.0000 0.3725 0.0000);fill-opacity:1;"/></svg>
1485</li><li><svg viewBox="0 0 38 24" xmlns="http://www.w3.org/2000/svg" width="38" height="24" role="img" aria-labelledby="pi-paypal"><title id="pi-paypal">PayPal</title><path opacity=".07" d="M35 0H3C1.3 0 0 1.3 0 3v18c0 1.7 1.4 3 3 3h32c1.7 0 3-1.3 3-3V3c0-1.7-1.4-3-3-3z"/><path fill="#fff" d="M35 1c1.1 0 2 .9 2 2v18c0 1.1-.9 2-2 2H3c-1.1 0-2-.9-2-2V3c0-1.1.9-2 2-2h32"/><path fill="#003087" d="M23.9 8.3c.2-1 0-1.7-.6-2.3-.6-.7-1.7-1-3.1-1h-4.1c-.3 0-.5.2-.6.5L14 15.6c0 .2.1.4.3.4H17l.4-3.4 1.8-2.2 4.7-2.1z"/><path fill="#3086C8" d="M23.9 8.3l-.2.2c-.5 2.8-2.2 3.8-4.6 3.8H18c-.3 0-.5.2-.6.5l-.6 3.9-.2 1c0 .2.1.4.3.4H19c.3 0 .5-.2.5-.4v-.1l.4-2.4v-.1c0-.2.3-.4.5-.4h.3c2.1 0 3.7-.8 4.1-3.2.2-1 .1-1.8-.4-2.4-.1-.5-.3-.7-.5-.8z"/><path fill="#012169" d="M23.3 8.1c-.1-.1-.2-.1-.3-.1-.1 0-.2 0-.3-.1-.3-.1-.7-.1-1.1-.1h-3c-.1 0-.2 
14850-.2.1-.2.1-.3.2-.3.4l-.7 4.4v.1c0-.3.3-.5.6-.5h1.3c2.5 0 4.1-1 4.6-3.8v-.2c-.1-.1-.3-.2-.5-.2h-.1z"/></svg></li><li><svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 38 24" width="38" height="24" aria-labelledby="pi-shopify_pay"><title id="pi-shopify_pay">Shop Pay</title><path opacity=".07" d="M35 0H3C1.3 0 0 1.3 0 3v18c0 1.7 1.4 3 3 3h32c1.7 0 3-1.3 3-3V3c0-1.7-1.4-3-3-3z" fill="#000"/><path d="M35.889 0C37.05 0 38 .982 38 2.182v19.636c0 1.2-.95 2.182-2.111 2.182H2.11C.95 24 0 23.018 0 21.818V2.182C0 .982.95 0 2.111 0H35.89z" fill="#5A31F4"/><path d="M9.35 11.368c-1.017-.223-1.47-.31-1.47-.705 0-.372.306-.558.92-.558.54 0 .934.238 1.225.704a.079.079 0 00.104.03l1.146-.584a.082.082 0 00.032-.114c-.475-.831-1.353-1.286-2.51-1.286-1.52 0-2.464.755-2.464 1.956 0 1.275 1.15 1.597 2.17 1.82 1.02.222 1.474.31 1.474.705 0 .396-.332.582-.993.582-.612 0-1.065-.282-1.34-.83a.08.08 0 00-.107-.035l-1.143.57a.083.083 0 00-.036.111c.454.92 1.384 1.437 2.627 1.437 1.583 0 2.539-.742 2.539-1.98s-1.155-1.598-2.173-1.82v-.003zM15.49 8.855c-.65 0-1.224.232-1.636.646a.04.04 0 01-.069-.03v-2.64a.08.08 0 00-.08-.081H12.27a.08.08 0 00-.08.082v8.194a.08.08 0 00.08.082h1.433a.08.08 0 00.081-.082v-3.594c0-.695.528-1.227 1.239-1.227.71 0 1.226.521 1.226 1.227v3.594a.08.08 0 00.081.082h1.433a.08.08 0 00.081-.082v-3.594c0-1.51-.981-2.577-2.355-2.577zM20.753 8.62c-.778 0-1.507.24-2.03.588a.082.082 0 00-.027.109l.632 1.088a.08.08 0 00.11.03 2.5 2.5 0 011.318-.366c1.25 0 2.17.891 2.17 2.068 0 1.003-.736 1.745-1.669 1.745-.76 0-1.288-.446-1.288-1.077 0-.361.152-.657.548-.866a.08.08 0 00.032-.113l-.596-1.018a.08.08 0 00-.098-.035c-.799.299-1.359 1.018-1.359 1.984 0 1.46 1.152 2.55 2.76 2.55 1.877 0 3.227-1.313 3.227-3.195 0-2.018-1.57-3.492-3.73-3.492zM28.675 8.843c-.724 0-1.373.27-1.845.746-.026.027-.069.007-.069-.029v-.572a.08.08 0 00-.08-.082h-1.397a.08.08 0 00-.08.082v8.182a.08.08 0 00.08.081h1.433a.08.08 0 00.081-.081v-2.683c0-.036.043-.054.069-.03a2.6 2.6 0 001.808.7c1.682 0 2.993-1.373 2.993-3.157s-1.313-3.157-2.993-3.157zm-.271 4.929c-.956 0-1.681-.768-1.681-1.783s.723-1.783 1.681-1.783c.958 0 1.68.755 1.68 1.783 0 1.027-.713 1.783-1.681 1.783h.001z" fill="#fff"/></svg>
1486</li><li><svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 38 24" width="38" height="24" fill="none" aria-labelledby="pi-visa"><title id="pi-visa">Visa</title><rect x=".5" y=".5" width="37" height="23" rx="2.5" stroke="#000" stroke-opacity=".07" fill="none"/><path d="M35 0H3C1.3 0 0 1.3 0 3V21C0 22.7 1.4 24 3 24H35C36.7 24 38 22.7 38 21V3C38 1.3 36.6 0 35 0Z" fill="#142FBD" style="fill:#142FBD;fill:color(display-p3 0.0784 0.1843 0.7412);fill-opacity:1;"/><path d="M35 1C36.1 1 37 1.9 37 3V21C37 22.1 36.1 23 35 23H3C1.9 23 1 22.1 1 21V3C1 1.9 1.9 1 3 1H35Z" fill="#1532CB" style="fill:#1532CB;fill:color(display-p3 0.0824 0.1961 0.7961);fill-opacity:1;"/><path d="M29.5944 10.2167H29.2778C28.8556 11.2722 28.5389 11.8 28.2222 13.3833H30.2278C29.9111 11.8 29.9111 11.0611 29.5944 10.2167V10.2167ZM32.6556 16.4444H30.8611C30.7556 16.4444 30.7556 16.4444 30.65 16.3389L30.4389 15.3889L30.3333 15.1778H27.8C27.6944 15.1778 27.5889 15.1778 27.5889 15.3889L27.2722 16.3389C27.2722 16.4444 27.1667 16.4444 27.1667 16.4444H24.95L25.1611 15.9167L28.2222 8.73889C28.2222 8.21111 28.5389 8 29.0667 8H30.65C30.7556 8 30.8611 8 30.8611 8.21111L32.3389 15.0722C32.4444 15.4944 32.55 15.8111 32.55 16.2333C32.6556 16.3389 32.6556 16.3389 32.6556 16.4444V16.4444ZM18.5111 16.1278L18.9333 14.2278C19.0389 14.2278 19.1444 14.3333 19.1444 14.3333C19.8833 14.65 20.6222 14.8611 21.3611 14.7556C21.5722 14.7556 21.8889 14.65 22.1 14.5444C22.6278 14.3333 22.6278 13.8056 22.2056 13.3833C21.9944 13.1722 21.6778 13.0667 21.3611 12.8556C20.9389 12.6444 20.5167 12.4333 20.2 12.1167C18.9333 11.0611 19.3556 9.58333 20.0944 8.84444C20.7278 8.42222 21.0444 8 21.8889 8C23.1556 8 24.5278 8 25.1611 8.21111H25.2667C25.1611 8.84444 25.0556 9.37222 24.8444 10.0056C24.3167 9.79444 23.7889 9.58333 23.2611 9.58333C22.9444 9.58333 22.6278 9.58333 22.3111 9.68889C22.1 9.68889 21.9944 9.79444 21.8889 9.9C21.6778 10.1111 21.6778 10.4278 21.8889 10.6389L22.4167 11.0611C22.8389 11.2722 23.2611 11.4833 23.5778 11.6944C24.1056 12.0111 24.6333 12.5389 24.7389 13.1722C24.95 14.1222 24.6333 14.9667 23.7889 15.6C23.2611 16.0222 23.05 16.2333 22.3111 16.2333C20.8333 16.2333 19.6722 16.3389 18.7222 16.0222C18.6167 16.2333 18.6167 16.2333 18.5111 16.1278V16.1278ZM14.8167 16.4444C14.9222 15.7056 14.9222 15.7056 15.0278 15.3889C15.5556 13.0667 16.0833 10.6389 16.5056 8.31667C16.6111 8.10556 16.6111 8 16.8222 8H18.7222C18.5111 9.26667 18.3 10.2167 17.9833 11.3778C17.6667 12.9611 17.35 14.5444 16.9278 16.1278C16.9278 16.3389 16.8222 16.3389 16.6111 16.3389L14.8167 16.4444ZM5 8.21111C5 8.10556 5.21111 8 5.31667 8H8.90556C9.43333 8 9.85556 8.31667 9.96111 8.84444L10.9111 13.4889C10.9111 13.5944 10.9111 13.5944 11.0167 13.7C11.0167 13.5944 11.1222 13.5944 11.1222 13.5944L13.3389 8.21111C13.2333 8.10556 13.3389 8 13.4444 8H15.6611C15.6611 8.10556 15.6611 8.10556 15.5556 8.21111L12.2833 15.9167C12.1778 16.1278 12.1778 
148616.2333 12.0722 16.3389C11.9667 16.4444 11.7556 16.3389 11.5444 16.3389H9.96111C9.85556 16.3389 9.75 16.3389 9.75 16.1278L8.06111 9.58333C7.85 9.37222 7.53333 9.05556 7.11111 8.95C6.47778 8.63333 5.31667 8.42222 5.10556 8.42222L5 8.21111Z" fill="white" style="fill:white;fill-opacity:1;"/></svg>
1487</li></ul></div>
1488    </div>
1489  </div>
1490</div>
1491
1492
1493</footer>
1494<!-- END sections: footer-group --></main>
1495  <style> a:hover {color: #faa1f5 !important;} </style>
1496<div id="shopify-block-AM3p3K05ZMWpsYUlkc__15805175800433226507" class="shopify-block shopify-app-block">
1497
1498
1499
1500</div><div id="shopify-block-AK0dLVWhIdk5hVnkyc__7194384644902525832" class="shopify-block shopify-app-block">
1501
1502
1503
1504
1505  
1505<script>
1506    (function () {
1507      var open = XMLHttpRequest.prototype.open;
1508      var send = XMLHttpRequest.prototype.send;
1509
1510      XMLHttpRequest.prototype.open = function (method, url) {
1511        this._url = url;
1512        this._method = method;
1513        return open.apply(this, arguments);
1514      };
1515
1516      XMLHttpRequest.prototype.send = function (body) {
1517        var request = this;
1518
1519        request.addEventListener('load', function () {
1520          if (window.FokkioXhrHook) {
1521            window.FokkioXhrHook(request, body);
1522          }
1523        });
1524        return send.apply(request, arguments);
1525      };
1526    })();
1527  </script>
1527
1528
1529  
1530  
1530<script src="https://cdn.shopify.com/extensions/01a0e955-01aa-71a9-be2d-521d7a4e9bb0/fokkio-gift-with-purchase-518/assets/v2-sdk.js" defer="defer" type="module"></script>
1530
1531  <link href="//cdn.shopify.com/extensions/01a0e955-01aa-71a9-be2d-521d7a4e9bb0/fokkio-gift-with-purchase-518/assets/v2-style.css" rel="stylesheet" type="text/css" media="all" />
1532
1533  
1533<script>
1534    const productsInfo = {};
1535    
1536    
1537window.FokkioShopSurprise = {
1538      promotions: [],
1539      liquidState: {
1540        customer: null,
1541        market: {
1542          id: 216170738,
1543          handle: "us",
1544          currency: "USD",
1545        },
1546      },
1547      settings: {"app_url":"https://shop-surprise.fokkio.com","better_stack_source_token":"mnVYuzXZiKAwMM2C2WhfkxxJ","cart_watcher_timer":null,"custom_code":"","features":{"block_gift_quantity_change":false,"disable_cart_snapshot_cache":false,"block_concurrent_reconcile":false,"seed_cart_attributes":true,"is_override_buy_it_now_button":false,"is_sdk_logs_enabled":false,"subscribe_to_cart_requests":true,"sdk_log_level":"debug"},"is_active_subscription":true,"selectors":{"product_form":""}},
1548      giftOnlyItems: {"products":[],"variants":[]},
1549      translations: {},
1550      jsApiState: {
1551        domain: window.Shopify.shop,
1552        currency: window.Shopify.currency,
1553        cartToken: null,
1554      },
1555      productsInfo,
1556    };
1557  </script>
1557
1558
1559
1560
1561</div><div id="shopify-block-AVHRtUnU5NnJXRERCa__9982044979145662863" class="shopify-block shopify-app-block">
1562
1563
1564
1565
1566
1567<script>
1568  window.__qs_render_core_src = "https://cdn.shopify.com/extensions/01a10102-f2d3-79b9-b5aa-cc724b615ebf/htc-questionnaire-470/assets/htc-render-core.js";
1569  window.__qs_heavy_bundle_src = "https://cdn.shopify.com/extensions/01a10102-f2d3-79b9-b5aa-cc724b615ebf/htc-questionnaire-470/assets/quiz-layout-init.js";
1570  window.__qs_style_src = "https://cdn.shopify.com/extensions/01a10102-f2d3-79b9-b5aa-cc724b615ebf/htc-questionnaire-470/assets/quiz-box-style.css";
1571  window.__qs_range_css_src = "https://cdn.shopify.com/extensions/01a10102-f2d3-79b9-b5aa-cc724b615ebf/htc-questionnaire-470/assets/quiz-range-slider.css";
1572  // Hash deep-links are quiz-as-LCP but not visible to Liquid — sync insert for early discovery.
1573  (function () {
1574    if (String(window.location.hash || "").indexOf("#QuizShop-") !== 0) return;
1575    if (window.__qs_immediate_css_links) return;
1576    window.__qs_immediate_css_links = true;
1577    var urls = [window.__qs_style_src, window.__qs_range_css_src];
1578    for (var i = 0; i < urls.length; i++) {
1579      var href = urls[i];
1580      if (!href || document.querySelector('link[rel="stylesheet"][href="' + href + '"]')) continue;
1581      var link = document.createElement("link");
1582      link.rel = "stylesheet";
1583      link.href = href;
1584      (document.head || document.documentElement).appendChild(link);
1585    }
1586  })();
1587</script>
vendor: 1 bytes, line 1587
1587
1588<script src="https://cdn.shopify.com/extensions/01a10102-f2d3-79b9-b5aa-cc724b615ebf/htc-questionnaire-470/assets/quiz-bootstrap.js" defer data-quizshop-bootstrap="1"></script>
1588
1589
1590</div><div id="shopify-block-AdTBORzdUdm95L0F1Z__1537173939754162885" class="shopify-block shopify-app-block">
1591
1592<script>
1593  window.accessProWidgetSettings = {"default_menu_language":"en","enable_features":true,"icon":"default","icon_color_fill":"#000000","icon_color_stroke":"#faa2f6","icon_position":"TL","icon_style":"thick","icon_size":"default","menu_content_color":"#111111","menu_header_background_color":"#111111","menu_header_font_color":"#f2f2f2","open_accessibility_profile":true,"selected_languages":["en","fr","es","de"],"widget_size":"large","widgetheight":"full","template":"minimal","color_template":"Indigo","lang_l":true,"enableMenuSettings":{"links":true,"reset":true,"cursor":true,"images":true,"sounds":true,"videos":true,"mission":true,"contrast":true,"dyslexic":true,"headings":true,"profiles":true,"alignment":true,"animation":true,"fontscale":true,"languages":true,"magnifier":true,"fontweight":true,"saturation":true,"adhdprofile":true,"linespacing":true,"readingmask":true,"text2speech":true,"readingguide":true,"letterspacing":true,"readerprofile":true,"describeimages":false,"seizureprofile":true,"cognitiveprofile":true},"custom_position":{"top":"0","left":"0","right":20,"bottom":20}};
1594  window.accessProComplianceSettings = {"compliance_title":"Our Mission","compliance_content":"\u003cdiv class=\"ap-compliance-main-title\"\u003e\u003cstrong\u003eAccessPro Compliance Mission Statement\u003c\/strong\u003e\u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-wrapper\"\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eWCAG 2.2 Commitment:\u003c\/strong\u003e We strictly adhere to WCAG 2.2 AA guidelines.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003ePersonalized UI:\u003c\/strong\u003e Users with disabilities can personalize the interface.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eAI-Based Compliance:\u003c\/strong\u003e We use AI to maintain accessibility during updates.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eARIA Attributes:\u003c\/strong\u003e Meaningful data for screen-readers using ARIA attributes.\u003c\/div\u003e \u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-wrapper\"\u003e\u003cdiv class=\"ap-compliance-list-title\"\u003e\u003cstrong\u003eOptimized Screen Reader and Keyboard Navigation:\u003c\/strong\u003e\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list\"\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eScreen-reader Optimization:\u003c\/strong\u003e ARIA attributes for meaningful data.\u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eImage Description:\u003c\/strong\u003e Auto image descriptions for better understanding.\u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eOCR Technology:\u003c\/strong\u003e Text extraction from images.\u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eKeyboard Navigation:\u003c\/strong\u003e Enhanced keyboard operability. \u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eContent-skip Menus:\u003c\/strong\u003e Easy navigation with shortcuts.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003ePopup Handling:\u003c\/strong\u003e Improved handling of popups.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eShortcuts:\u003c\/strong\u003e Quick access to key elements with shortcuts.\u003c\/div\u003e\u003c\/div\u003e \u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-wrapper\"\u003e\u003cdiv class=\"ap-compliance-list-title\"\u003e\u003cstrong\u003eSpecialized Profiles for Disabilities:\u003c\/strong\u003e\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list\"\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eEpilepsy Safe Profile:\u003c\/strong\u003e Safe browsing with reduced triggers.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eVision Impaired Profile:\u003c\/strong\u003e Enhanced interface for visual impairments.\u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eCognitive Disability Profile:\u003c\/strong\u003e Assistive features for cognitive disabilities.\u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eADHD-Friendly Profile:\u003c\/strong\u003e Minimized distractions for ADHD users.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eBlind Users Profile:\u003c\/strong\u003e Compatibility with popular screen-readers.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eKe
1594yboard Navigation Profile:\u003c\/strong\u003e Navigate with keyboard commands.\u003c\/div\u003e\u003c\/div\u003e \u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-wrapper\"\u003e\u003cdiv class=\"ap-compliance-list-title\"\u003e\u003cstrong\u003eCustomizable User Interface Adjustments:\u003c\/strong\u003e\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list\"\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eFont Adjustments:\u003c\/strong\u003e Customize font settings for readability.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eColour Adjustments:\u003c\/strong\u003e Choose contrast profiles and color schemes.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eAnimations:\u003c\/strong\u003e Disable animations for user safety.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eContent Highlighting:\u003c\/strong\u003e Emphasize key elements.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eAudio Muting:\u003c\/strong\u003e Instantly mute the website.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eCognitive Disorders:\u003c\/strong\u003e Linked search engine for better understanding.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eAdditional Functions:\u003c\/strong\u003e Various customizable options.\u003c\/div\u003e\u003c\/div\u003e \u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-wrapper\"\u003e\u003cdiv class=\"ap-compliance-list-title\"\u003e\u003cstrong\u003eBrowser and Assistive Technology Support:\u003c\/strong\u003e\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list\"\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eSupported Browsers:\u003c\/strong\u003e Google Chrome, Mozilla Firefox, Apple Safari, Opera, Microsoft Edge.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eSupported Screen Readers:\u003c\/strong\u003e JAWS (Windows\/MAC), NVDA (Windows\/MAC).\u003c\/div\u003e\u003c\/div\u003e \u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-wrapper\"\u003e\u003cdiv class=\"ap-compliance-list-title\"\u003e\u003cstrong\u003eContinual Accessibility Improvement:\u003c\/strong\u003e\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list\"\u003e \u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eOngoing Efforts:\u003c\/strong\u003e We continuously enhance accessibility. \u003c\/div\u003e \u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eGoal:\u003c\/strong\u003e Achieve maximum accessibility with evolving technology.\u003c\/div\u003e\u003cdiv class=\"ap-compliance-list-item\"\u003e• \u003cstrong\u003eContact Us:\u003c\/strong\u003e Reach out via the website’s contact form for queries or concerns.\u003c\/div\u003e\u003c\/div\u003e \u003c\/div\u003e","statement_action":"popup","statement_redirect_url":"","statement_redirect_page_id":""};
1595  window.accessProCurrentPage = {
1596    pageType: "search",
1597    path: "\/search"
1598  };
1599</script>
1599
1600
1601<style>
1602    
1603
1604  .asw-widget-button-top {
1605     position: absolute !important;
1606     top: 10px !important;
1607     left: 10px !important;
1608     background-color: #000 !important;
1609     color: #fff !important;
1610     text-decoration: none !important;
1611     overflow: hidden;
1612     width: 1px !important;
1613     height: 1px !important;
1614     margin: -1px !important;
1615     padding: 0 !important;
1616     border: 0 !important;
1617     clip: rect(0 0 0 0) !important;
1618     word-wrap: normal !important;
1619  }
1620    .asw-widget-button-top-focused,
1621    .asw-widget-button-top:focus {
1622      z-index: 9999 !important;
1623      overflow: auto !important;
1624      width: auto !important;
1625      height: auto !important;
1626      clip: auto !important;
1627      padding: 10px 15px !important;
1628    }
1629
1630    #acp-virtualKeyboardPopup {
1631      position: fixed;
1632      bottom: 80px;
1633      left: 50%;
1634      transform: translateX(-50%);
1635      background: #ffffff !important;
1636      border: 1px solid #ccc;
1637      padding: 8px;
1638      box-shadow: 0 8px 20px rgba(0, 0, 0, 0.2);
1639      z-index: 9999;
1640      display: none;
1641      width: 90%;
1642      max-width: 600px;
1643      border-radius: 10px;
1644    }
1645
1646    #acp-virtual-input {
1647      width: 100%;
1648      padding: 10px;
1649      font-size: 16px;
1650      margin-bottom: 10px;
1651    }
1652
1653    #acp-closeKeyboardBtn {
1654      color: #fff;
1655      border: none;
1656      padding: 1px 3px;
1657      cursor: pointer;
1658      float: right;
1659      border-radius: 4px;
1660      margin-bottom: 5px;
1661    }
1662    #acp-definition-popup {
1663      position: absolute;
1664      display: none;
1665      padding: 10px;
1666      background: white;
1667      border: 1px solid #ccc;
1668      z-index: 1000;
1669      border-radius: 14px;
1670    }
1671</style>
1672
1673<div id="acp-icon"></div>
1674<div id="acp-widget"></div>
1675
1676<!-- Virtual Keyboard Input and Keyboard -->
1677<div
1678  id="acp-definition-popup"
1679></div>
1680<div
1681  id="acp-dictionary-toast"
1682  class="asw-text-speech-bar"
1683  style="display: none;"
1684  data-ap-translate="DICTIONARY DESC"
1685>
1686  Double click on a word to see the definition.
1687</div>
1688<div id="acp-virtualKeyboardPopup" role="dialog" aria-modal="true" aria-label="Virtual keyboard popup">
1689  <button id="acp-closeKeyboardBtn" aria-label="Close virtual keyboard">
1690    <svg
1691      xmlns="http://www.w3.org/2000/svg"
1692      width="24"
1693      height="24"
1694      viewBox="0 0 24 24"
1695      fill="none"
1696    >
1697      <path
1698        d="M18 6L6 18"
1699        stroke="black"
1700        strokeWidth="2"
1701        strokeLinecap="round"
1702        strokeLinejoin="round"
1703      />
1704      <path
1705        d="M6 6L18 18"
1706        stroke="black"
1707        strokeWidth="2"
1708        strokeLinecap="round"
1709        strokeLinejoin="round"
1710      />
1711    </svg>
1712  </button>
1713  
1714  <div id="acp-virtual-keyboard" class="simple-keyboard"></div>
1715  
1715<script>
1716    function makeDraggableVirtualKeyboard(el) {
1717      let pos1 = 0,
1718        pos2 = 0,
1719        pos3 = 0,
1720        pos4 = 0;
1721
1722      el.onmousedown = dragMouseDown;
1723
1724      function dragMouseDown(e) {
1725        e.preventDefault();
1726        pos3 = e.clientX;
1727        pos4 = e.clientY;
1728        document.onmouseup = closeDragElement;
1729        document.onmousemove = elementDrag;
1730      }
1731
1732      function elementDrag(e) {
1733        e.preventDefault();
1734        pos1 = pos3 - e.clientX;
1735        pos2 = pos4 - e.clientY;
1736        pos3 = e.clientX;
1737        pos4 = e.clientY;
1738        el.style.top = el.offsetTop - pos2 + 'px';
1739        el.style.left = el.offsetLeft - pos1 + 'px';
1740        el.style.bottom = 'unset';
1741        el.style.right = 'unset';
1742      }
1743
1744      function closeDragElement() {
1745        document.onmouseup = null;
1746        document.onmousemove = null;
1747      }
1748    }
1749
1750    makeDraggableVirtualKeyboard(document.getElementById('acp-virtualKeyboardPopup'));
1751  </script>
1751
1752</div>
1753<script>
1754  // App Procxy Handle
1755  
1756  window.accessProProxyHandle = '/apps/access-pro';
1757  
1758
1759  // URLs
1760  window.accessProSettingsUrl = `${window.accessProProxyHandle}/theme/settings/`;
1761  window.accessProPageViewsCountUrl = `${window.accessProProxyHandle}/theme/views/update/count`;
1762  
1763
1764  // Translation URL
1765  var shopify_domain = `mooncat-crystals.myshopify.com`;
1766  window.accessProTranslationUrl = `https://access-pro-api.entanglecommerce.com/api/v1/language/translate/?domain=${shopify_domain}`;
1767  window.pageViewsCountURL = `${window.accessProProxyHandle}/theme/views/update/count`;
1768</script>
1768
1769
1770<script src="https://cdn.shopify.com/extensions/01a0fc5b-faca-7a27-ab85-5412b87841de/access-pro-2-246/assets/main.js" defer></script>
vendor: 1 bytes, line 1770
1770
1771<script>
1772  (function () {
1773    var params = new URLSearchParams(window.location.search);
1774    var token = params.get('acp_scan');
1775    if (!token) return;
1776
1777    function showScanOverlay(message) {
1778      var el = document.getElementById('acp-scan-overlay');
1779      if (!el) {
1780        el = document.createElement('div');
1781        el.id = 'acp-scan-overlay';
1782        el.style.cssText =
1783          '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;';
1784        el.innerHTML =
1785          '<div style="text-align:center;max-width:320px;padding:24px">' +
1786          '<p style="font-size:18px;font-weight:600;margin:0 0 8px;color:#111">Scanning for accessibility</p>' +
1787          '<p id="acp-scan-overlay-status" style="font-size:14px;color:#666;margin:0"></p>' +
1788          '</div>';
1789        document.body.appendChild(el);
1790      }
1791      var status = document.getElementById('acp-scan-overlay-status');
1792      if (status) status.textContent = message || 'Please wait…';
1793    }
1794
1795    showScanOverlay('Preparing accessibility scan…');
1796
1797    function hideOverlay() {
1798      var el = document.getElementById('acp-scan-overlay');
1799      if (el) el.style.display = 'none';
1800    }
1801
1802    function pageIsThemePreview() {
1803      try {
1804        return Boolean(new URLSearchParams(window.location.search).get('preview_theme_id'));
1805      } catch (e) {
1806        return false;
1807      }
1808    }
1809
1810    // Shopify stores the unpublished theme in a storefront cookie. Clear it
1811    // here so the scan window never has to navigate to the live theme.
1812    var previewExitPromise = null;
1813    function exitThemePreviewQuietly() {
1814      if (!pageIsThemePreview()) return Promise.resolve();
1815      if (previewExitPromise) return previewExitPromise;
1816      previewExitPromise = new Promise(function (resolve) {
1817        var settled = false;
1818        function finish() {
1819          if (settled) return;
1820          settled = true;
1821          resolve();
1822        }
1823        setTimeout(finish, 2000);
1824        try {
1825          var frame = document.createElement('iframe');
1826          frame.setAttribute('aria-hidden', 'true');
1827          frame.title = '';
1828          frame.style.cssText =
1829            'position:absolute;width:0;height:0;border:0;visibility:hidden';
1830          frame.src = window.location.origin + '/?exitPreview=1';
1831          (document.body || document.documentElement).appendChild(frame);
1832        } catch (e) {}
1833        try {
1834          fetch(window.location.origin + '/?exitPreview=1', {
1835            credentials: 'include',
1836            cache: 'no-store',
1837            redirect: 'follow',
1838          }).catch(function () {});
1839        } catch (e) {}
1840      });
1841      return previewExitPromise;
1842    }
1843
1844    window.addEventListener('message', function (event) {
1845      if (event.source !== window.opener) return;
1846      var data = event.data;
1847      if (!data || data.type !== 'accesspro-exit-preview') return;
1848      exitThemePreviewQuietly().then(function () {
1849        if (window.opener) {
1850          window.opener.postMessage({ type: 'accesspro-preview-exited' }, '*');
1851        }
1852      });
1853    });
1854
1855    function submitScanResult(payload) {
1856      var params = new URLSearchParams(window.location.search);
1857      var jobId = params.get('acp_job');
1858      if (!jobId) {
1859        return;
1860      }
1861
1862      var pageUrl = window.location.origin + window.location.pathname;
1863      fetch(window.accessProProxyHandle + '/theme/accessibility-scan/complete', {
1864        method: 'POST',
1865        headers: { 'Content-Type': 'application/json' },
1866        body: JSON.stringify({
1867          jobId: jobId,
1868          scanToken: token,
1869          url: pageUrl,
1870          axeResults: payload.results || null,
1871          error:
1872            payload.type === 'accesspro-axe-scan-error'
1873              ? payload.message || 'Accessibility scan failed'
1874              : null,
1875        }),
1876      })
1877        .then(function (response) {
1878          return response.json().catch(function () {
1879            return {};
1880          });
1881        })
1882        .then(function (data) {
1883          if (window.opener) {
1884            var isFinal = data.reportId != null;
1885            var hasError = !data.success;
1886            var isNextScanPage = false;
1887            if (data.redirectUrl) {
1888              try {
1889                isNextScanPage = new URL(data.redirectUrl).searchParams.has('acp_scan');
1890              } catch (e) {}
1891            }
1892            var continuing = isNextScanPage && data.redirectUrl && !isFinal && !hasError;
1893
1894            function deliver() {
1895              window.opener.postMessage(
1896                {
1897                  type: 'accesspro-axe-scan-progress',
1898                  jobId: jobId,
1899                  redirectUrl: data.redirectUrl || null,
1900                  reportId: data.reportId != null ? data.reportId : null,
1901                  error: data.success ? null : (data.message || 'Scan failed'),
1902                },
1903                '*',
1904              );
1905
1906              if (isFinal) {
1907                showScanOverlay('Returning to your audit report…');
1908                return;
1909              }
1910
1911              if (continuing) {
1912                showScanOverlay('Scanning next page…');
1913                window.location.href = data.redirectUrl;
1914                return;
1915              }
1916
1917              setTimeout(function () {
1918                window.close();
1919              }, 400);
1920            }
1921
1922            if (pageIsThemePreview() && !continuing) {
1923              if (isFinal) showScanOverlay('Returning to your audit report…');
1924              exitThemePreviewQuietly().then(deliver);
1925              return;
1926            }
1927
1928            deliver();
1929            return;
1930          }
1931          if (data.redirectUrl) {
1932            showScanOverlay('Returning to your audit report…');
1933            window.location.href = data.redirectUrl;
1934            return;
1935          }
1936          showScanOverlay(data.message || 'Scan failed');
1937          if (window.opener) {
1938            window.opener.postMessage(
1939              {
1940                type: 'accesspro-axe-scan-progress',
1941                jobId: jobId,
1942                error: data.message || 'Scan failed',
1943              },
1944              '*',
1945            );
1946          }
1947        })
1948        .catch(function (err) {
1949          var message =
1950            (err && err.message) || 'Scan failed';
1951          showScanOverlay(message);
1952          function deliver() {
1953            if (!window.opener) return;
1954            var jobIdErr = new URLSearchParams(window.location.search).get('acp_job');
1955            window.opener.postMessage(
1956              {
1957                type: 'accesspro-axe-scan-progress',
1958                jobId: jobIdErr,
1959                error: message,
1960              },
1961              '*',
1962            );
1963          }
1964          if (pageIsThemePreview()) {
1965            exitThemePreviewQuietly().then(deliver);
1966            return;
1967          }
1968          deliver();
1969        });
1970    }
1971
1972    function waitForFullPageLoad() {
1973      return new Promise(function (resolve) {
1974        function settle() {
1975          // Extended settle time for dynamic content, carousels, lazy sections
1976          // Wait for network idle + animations + JS state changes
1977          setTimeout(function() {
1978            // Wait for any lazy images to finish loading
1979            var images = Array.prototype.slice.call(document.querySelectorAll('img[loading="lazy"]'));
1980            var pendingImages = images.filter(function(img) {
1981              return !img.complete;
1982            });
1983            
1984            if (pendingImages.length > 0) {
1985              var loaded = 0;
1986              var timeout = setTimeout(function() {
1987                resolve(); // Don't wait forever
1988              }, 2000);
1989              
1990              pendingImages.forEach(function(img) {
1991                function handleLoad() {
1992                  loaded++;
1993                  if (loaded >= pendingImages.length) {
1994                    clearTimeout(timeout);
1995                    // Additional wait for any pending RAF or microtasks
1996                    requestAnimationFrame(function() {
1997                      setTimeout(resolve, 100);
1998                    });
1999                  }
2000                }
2001                img.addEventListener('load', handleLoad, { once: true });
2002                img.addEventListener('error', handleLoad, { once: true });
2003              });
2004            } else {
2005              // Additional wait for any pending RAF or microtasks
2006              requestAnimationFrame(function() {
2007                setTimeout(resolve, 100);
2008              });
2009            }
2010          }, 3000);
2011        }
2012        if (document.readyState === 'complete') {
2013          settle();
2014          return;
2015        }
2016        window.addEventListener('load', settle, { once: true });
2017      });
2018    }
2019
2020    // Port of accessibility-scanner Phase 3 WCAG 2.2 / APG checks (browser-side).
2021    // Findings are merged into axe violations/incomplete so the existing pipeline needs no changes.
2022    function isAccessProScanElement(el) {
2023      if (!el || !el.closest) return false;
2024      return !!(
2025        el.closest('#acp-icon') ||
2026        el.closest('#acp-widget') ||
2027        el.closest('#acp-virtualKeyboardPopup') ||
2028        el.closest('#acp-definition-popup') ||
2029        el.closest('#acp-dictionary-toast') ||
2030        el.closest('#acp-scan-overlay') ||
2031        el.closest('[id^="acp-"]') ||
2032        el.closest('.asw-widget-button-top')
2033      );
2034    }
2035    
2036    // Enhanced element visibility check including all CSS hiding techniques
2037    function isElementVisible(el) {
2038      if (!el || !el.getBoundingClientRect) return false;
2039      var style = window.getComputedStyle(el);
2040      if (style.display === 'none' || style.visibility === 'hidden') return false;
2041      if (style.opacity === '0') return false;
2042      if (style.position === 'absolute' && style.clip === 'rect(0px, 0px, 0px, 0px)') return false;
2043      if (style.width === '1px' && style.height === '1px' && style.overflow === 'hidden') return false;
2044      var rect = el.getBoundingClientRect();
2045      if (rect.width === 0 || rect.height === 0) return false;
2046      return true;
2047    }
2048
2049    function runWcag22Checks() {
2050      var violations = [];
2051      var incomplete = [];
2052
2053      try {
2054        // WCAG 2.4.11 Focus Not Obscured — sticky/fixed heuristic (manual review)
2055        var stickyElements = Array.prototype.slice
2056          .call(document.querySelectorAll('*'))
2057          .filter(function (el) {
2058            if (isAccessProScanElement(el)) return false;
2059            if (!isElementVisible(el)) return false;
2060            var style = getComputedStyle(el);
2061            return (
2062              (style.position === 'sticky' || style.position === 'fixed') &&
2063              el.getBoundingClientRect().height > 40
2064            );
2065          })
2066          .slice(0, 5)
2067          .map(function (el) {
2068            var style = getComputedStyle(el);
2069            return {
2070              tag: el.tagName.toLowerCase(),
2071              id: el.id || null,
2072              height: Math.round(el.getBoundingClientRect().height),
2073              position: style.position,
2074            };
2075          });
2076
2077        if (stickyElements.length > 0) {
2078          incomplete.push({
2079            id: 'focus-not-obscured',
2080            impact: 'serious',
2081            tags: ['wcag22aa', 'wcag2411'],
2082            description:
2083              'WCAG 2.4.11: Focused elements must not be entirely obscured. Fixed/sticky elements detected — manual keyboard testing required.',
2084            helpUrl:
2085              'https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html',
2086            nodes: stickyElements.map(function (e) {
2087              return {
2088                html:
2089                  '<' +
2090                  e.tag +
2091                  (e.id ? ' id="' + e.id + '"' : '') +
2092                  '> (' +
2093                  e.position +
2094                  ', ' +
2095                  e.height +
2096                  'px tall)',
2097                target: [e.tag + (e.id ? '#' + e.id : '')],
2098                failureSummary:
2099                  'Fixed/sticky element may obscure focused components. Verify with keyboard navigation.',
2100              };
2101            }),
2102          });
2103        }
2104        
2105        // NEW: aria-hidden-focus check - elements with aria-hidden="true" that are focusable
2106        var hiddenFocusable = [];
2107        document.querySelectorAll('[aria-hidden="true"]').forEach(function(el) {
2108          if (isAccessProScanElement(el)) return;
2109          // Check if this element or any descendant is focusable
2110          var focusableSelectors = 'a[href], button, input, select, textarea, [tabindex]:not
2110([tabindex="-1"])';
2111          var focusables = el.matches(focusableSelectors) ? [el] : Array.prototype.slice.call(el.querySelectorAll(focusableSelectors));
2112          focusables.forEach(function(focusEl) {
2113            if (isElementVisible(focusEl) && focusEl.tabIndex >= 0) {
2114              hiddenFocusable.push({
2115                html: focusEl.outerHTML.slice(0, 500),
2116                selector: buildScanSelector(focusEl),
2117                parentHiddenHtml: el.outerHTML.slice(0, 200)
2118              });
2119            }
2120          });
2121        });
2122        
2123        if (hiddenFocusable.length > 0) {
2124          violations.push({
2125            id: 'aria-hidden-focus',
2126            impact: 'serious',
2127            tags: ['wcag2aa', 'wcag412'],
2128            description: 'WCAG 4.1.2: Focusable elements must not be hidden with aria-hidden="true"',
2129            helpUrl: 'https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html',
2130            nodes: hiddenFocusable.slice(0, 10).map(function(item) {
2131              return {
2132                html: item.html,
2133                target: [item.selector],
2134                failureSummary: 'Focusable element is inside aria-hidden="true" container'
2135              };
2136            })
2137          });
2138        }
2139
2140        // WCAG 2.5.3 Label in Name - Enhanced with better visible text extraction
2141        // Visible text = text rendered on screen (excludes aria-hidden, sr-only, SVG internals).
2142        function getVisibleText(el) {
2143          var text = '';
2144          for (var i = 0; i < el.childNodes.length; i++) {
2145            var child = el.childNodes[i];
2146            if (child.nodeType === 3) { text += child.textContent; continue; }
2147            if (child.nodeType !== 1) continue;
2148            if (child.getAttribute('aria-hidden') === 'true') continue;
2149            var st = window.getComputedStyle(child);
2150            if (st.display === 'none' || st.visibility === 'hidden') continue;
2151            if (st.opacity === '0') continue;
2152            if (st.position === 'absolute') {
2153              var clip = st.clip;
2154              if (clip === 'rect(0px, 0px, 0px, 0px)' || clip === 'rect(0, 0, 0, 0)') continue;
2155            }
2156            if (st.width === '1px' && st.height === '1px' && st.overflow === 'hidden') continue;
2157            if (st.fontSize === '0px' || st.width === '0px' || st.height === '0px') continue;
2158            text += getVisibleText(child);
2159          }
2160          return text;
2161        }
2162        function buildScanSelector(el) {
2163          if (el.id) return '#' + CSS.escape(el.id);
2164          var testId = el.getAttribute('data-testid') || el.getAttribute('data-test-id');
2165          if (testId) return '[data-testid="' + testId + '"]';
2166          var tag = el.tagName.toLowerCase();
2167          var cls = (el.getAttribute('class') || '').split(/\s+/).filter(function (c) {
2168            return c && c.length < 60 && !/^(active|is-|js-|open|hidden|focus|hover)/i.test(c);
2169          }).slice(0, 3);
2170          return cls.length ? tag + '.' + cls.join('.') : tag;
2171        }
2172        
2173        // Enhanced selector to catch more interactive elements
2174        var interactiveSelector = 'button, [role="button"], a[aria-label], [role="link"][aria-label], ' +
2175          '[role="menuitem"][aria-label], [role="tab"][aria-label], [role="checkbox"][aria-label], ' +
2176          '[role="radio"][aria-label], [role="switch"][aria-label], [role="combobox"][aria-label], ' +
2177          '[role="searchbox"][aria-label], [role="textbox"][aria-label]';
2178          
2179        var mismatches = Array.prototype.slice
2180          .call(document.querySelectorAll(interactiveSelector))
2181          .filter(function (el) {
2182            return !isAccessProScanElement(el) && isElementVisible(el);
2183          })
2184          .map(function (el) {
2185            var ariaLabel = el.getAttribute('aria-label') || '';
2186            var visibleText = getVisibleText(el).replace(/\s+/g, ' ').trim();
2187            if (!ariaLabel || !visibleText) return null;
2188            if (visibleText.length <= 1) return null;
2189            
2190            // Normalize for comparison - remove punctuation and make case-insensitive
2191            var normalizedLabel = ariaLabel.toLowerCase().replace(/[^\w\s]/g, '');
2192            var normalizedVisible = visibleText.toLowerCase().replace(/[^\w\s]/g, '');
2193            
2194            // Check if visible text is substring of aria-label
2195            if (normalizedLabel.includes(normalizedVisible)) return null;
2196            
2197            // Check word-by-word containment for multi-word labels
2198            var visibleWords = normalizedVisible.split(/\s+/).filter(Boolean);
2199            if (visibleWords.length > 0) {
2200              var allWordsPresent = visibleWords.every(function(word) {
2201                return normalizedLabel.includes(word);
2202              });
2203              if (allWordsPresent) return null;
2204            }
2205            
2206            return {
2207              html: el.outerHTML.slice(0, 500),
2208              selector: buildScanSelector(el),
2209              ariaLabel: ariaLabel,
2210              visibleText: visibleText,
2211            };
2212          })
2213          .filter(Boolean)
2214          .slice(0, 10);
2215
2216        if (mismatches.length > 0) {
2217          violations.push({
2218            id: 'label-in-name',
2219            impact: 'serious',
2220            tags: ['wcag21a', 'wcag253'],
2221            description: 'WCAG 2.5.3: Accessible name must contain visible label text',
2222            helpUrl: 'https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html',
2223            nodes: mismatches.map(function (m) {
2224              return {
2225                html: m.html,
2226                target: [m.selector],
2227                failureSummary:
2228                  'aria-label="' +
2229                  m.ariaLabel +
2230                  '" does not contain visible text "' +
2231                  m.visibleText +
2232                  '"',
2233              };
2234            }),
2235          });
2236        }
2237
2238        // 2.5.7 Dragging Movements
2239        var draggableElements = Array.prototype.slice
2240          .call(
2241            document.querySelectorAll(
2242              '[draggable="true"], [data-sortable], .sortable-item',
2243            ),
2244          )
2245          .filter(function (el) {
2246            return !isAccessProScanElement(el);
2247          })
2248          .slice(0, 5)
2249          .map(function (el) {
2250            return {
2251              html: el.outerHTML.slice(0, 500),
2252              selector: buildScanSelector(el),
2253            };
2254          });
2255
2256        if (draggableElements.length > 0) {
2257          incomplete.push({
2258            id: 'dragging-movements',
2259            impact: 'serious',
2260            tags: ['wcag22aa', 'wcag257'],
2261            description:
2262              'WCAG 2.5.7: Draggable elements must have a single-pointer alternative. Manual verification required.',
2263            helpUrl: 'https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html',
2264            nodes: draggableElements.map(function (e) {
2265              return {
2266                html: e.html,
2267                target: [e.selector],
2268                failureSummary:
2269                  'Verify that a keyboard or single-pointer alternative exists for this drag operation.',
2270              };
2271            }),
2272          });
2273        }
2274
2275        // ARIA APG: Dialog Pattern
2276        var badDialogs = Array.prototype.slice
2277          .call(document.querySelectorAll('[role="dialog"], [role="alertdialog"]'))
2278          .filter(function (el) {
2279            if (isAccessProScanElement(el)) return false;
2280            return !(
2281              el.hasAttribute('aria-labelledby') || el.hasAttribute('aria-label')
2282            );
2283          })
2284          .slice(0, 5)
2285          .map(function (el) {
2286            return {
2287              html: el.outerHTML.slice(0, 500),
2288              selector: buildScanSelector(el),
2289            };
2290          });
2291
2292        if (badDialogs.length > 0) {
2293          violations.push({
2294            id: 'dialog-missing-label',
2295            impact: 'serious',
2296            tags: ['aria-apg', 'wcag2aa'],
2297            description:
2298              'ARIA APG Dialog Pattern: role="dialog" must have aria-labelledby or aria-label',
2299            helpUrl: 'https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/',
2300            nodes: badDialogs.map(function (d) {
2301              return {
2302                html: d.html,
2303                target: [d.selector],
2304                failureSummary:
2305                  'Add aria-labelledby pointing to a visible dialog title, or aria-label.',
2306              };
2307            }),
2308          });
2309        }
2310
2311        // ARIA APG: Tabs Pattern — tabs must have aria-selected (true on active, false on others
2311)
2312        var badTabs = [];
2313        Array.prototype.slice
2314          .call(document.querySelectorAll('[role="tablist"]'))
2315          .forEach(function (tabList) {
2316            if (isAccessProScanElement(tabList)) return;
2317            var tabs = Array.prototype.slice.call(tabList.querySelectorAll('[role="tab"]'));
2318            var hasAnySelected = tabs.some(function (t) { return t.getAttribute('aria-selected') === 'true'; });
2319            tabs.forEach(function (tab) {
2320                if (isAccessProScanElement(tab)) return;
2321                if (!tab.hasAttribute('aria-selected')) {
2322                  // Detect if this tab appears active (has aria-current, class "active", etc.)
2323                  var looksActive = !hasAnySelected && tab.classList.contains('active');
2324                  badTabs.push({
2325                    html: tab.outerHTML.slice(0, 500),
2326                    selector: buildScanSelector(tab),
2327                    suggestValue: looksActive ? 'true' : 'false',
2328                  });
2329                }
2330              });
2331          });
2332        badTabs = badTabs.slice(0, 5);
2333
2334        if (badTabs.length > 0) {
2335          violations.push({
2336            id: 'tabs-missing-aria-selected',
2337            impact: 'serious',
2338            tags: ['aria-apg', 'wcag2aa'],
2339            description:
2340              'ARIA APG Tabs Pattern: each [role="tab"] must have aria-selected="true" or aria-selected="false"',
2341            helpUrl: 'https://www.w3.org/WAI/ARIA/apg/patterns/tabs/',
2342            nodes: badTabs.map(function (t) {
2343              return {
2344                html: t.html,
2345                target: [t.selector],
2346                failureSummary:
2347                  'Tab missing aria-selected. Suggested value: aria-selected="' + (t.suggestValue || 'false') + '"',
2348              };
2349            }),
2350          });
2351        }
2352      } catch (err) {
2353        console.warn(
2354          '[AccessPro][AxeScan][storefront] WCAG 2.2 checks error',
2355          err && err.message ? err.message : err,
2356        );
2357      }
2358
2359      return { violations: violations, incomplete: incomplete };
2360    }
2361
2362    function runAxeScan() {
2363      if (!window.axe) {
2364        showScanOverlay('Scan failed: axe-core not loaded');
2365        notifyScanOpener({
2366          type: 'accesspro-axe-scan-error',
2367          token: token,
2368          message: 'axe-core failed to load',
2369        });
2370        return;
2371      }
2372      
2373      // CRITICAL: Hide overlay before scan to prevent interference with color-contrast/visibility checks
2374      hideOverlay();
2375      
2376      // Run axe WITHOUT overlay visible to get accurate color contrast and visibility results
2377      window.axe
2378        .run(document, {
2379          runOnly: {
2380            type: 'tag',
2381            values: ['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'],
2382          },
2383          exclude: [
2384            ['#acp-icon'],
2385            ['#acp-widget'],
2386            ['#acp-virtualKeyboardPopup'],
2387            ['#acp-definition-popup'],
2388            ['#acp-dictionary-toast'],
2389            ['#acp-scan-overlay'],
2390            ['.asw-widget-button-top'],
2391          ],
2392        })
2393        .then(function (results) {
2394          // Now safe to show overlay after scan completes
2395          showScanOverlay('Processing scan results…');
2396          var extra = runWcag22Checks();
2397          if (!results.violations) results.violations = [];
2398          if (!results.incomplete) results.incomplete = [];
2399          // Scanner stores customChecks separately; merge into axe arrays so
2400          // buildAxeScanSummary (customChecks: []) still surfaces them.
2401          results.violations = results.violations.concat(extra.violations || []);
2402          results.incomplete = results.incomplete.concat(extra.incomplete || []);
2403
2404          // List rule only: axe often stores just the opening <ul> tag.
2405          // Re-serialize with direct children so the report/AI Fixes show the real issue.
2406          enrichListViolationNodes(results);
2407
2408          notifyScanOpener({
2409            type: 'accesspro-axe-scan',
2410            token: token,
2411            url: window.location.href,
2412            results: results,
2413          });
2414        })
2415        .catch(function (err) {
2416          showScanOverlay('Scan failed');
2417          notifyScanOpener({
2418            type: 'accesspro-axe-scan-error',
2419            token: token,
2420            message: err && err.message ? err.message : 'Accessibility scan failed',
2421          });
2422        });
2423    }
2424
2425    /**
2426     * Optimize axe `list` node payloads only (no other rules).
2427     * Horizon overflow-list / ul[part=list] failures need children in HTML
2428     * so merchants see role=presentation / non-li children clearly.
2429     */
2430    function enrichListViolationNodes(results) {
2431      var violations = results && results.violations;
2432      if (!violations || !violations.length) return;
2433
2434      function queryInRoot(root, sel) {
2435        if (!root || !sel) return null;
2436        try {
2437          return root.querySelector(sel);
2438        } catch (e) {
2439          return null;
2440        }
2441      }
2442
2443      function resolveShadowPath(path) {
2444        if (!path) return null;
2445        if (typeof path === 'string') {
2446          return (
2447            queryInRoot(document, path) ||
2448            queryDeepAll(path)[0] ||
2449            null
2450          );
2451        }
2452        if (!Array.isArray(path) || !path.length) return null;
2453
2454        // Nested shadow path: ["host", "inner"] or [["host", "inner"]]
2455        var steps = path;
2456        if (steps.length === 1 && Array.isArray(steps[0])) {
2457          steps = steps[0];
2458        }
2459
2460        var ctx = document;
2461        var el = null;
2462        for (var i = 0; i < steps.length; i++) {
2463          var step = steps[i];
2464          if (Array.isArray(step)) {
2465            el = resolveShadowPath(step);
2466          } else {
2467            el = queryInRoot(ctx, String(step));
2468            if (!el && ctx === document) {
2469              el = queryDeepAll(String(step))[0] || null;
2470            }
2471          }
2472          if (!el) return null;
2473          ctx = el.shadowRoot || el;
2474        }
2475        return el;
2476      }
2477
2478      function queryDeepAll(sel) {
2479        var out = [];
2480        function walk(root) {
2481          if (!root || !root.querySelectorAll) return;
2482          try {
2483            Array.prototype.push.apply(out, root.querySelectorAll(sel));
2484          } catch (e) {
2485            /* invalid selector */
2486          }
2487          var all = root.querySelectorAll ? root.querySelectorAll('*') : [];
2488          for (var i = 0; i < all.length; i++) {
2489            if (all[i].shadowRoot) walk(all[i].shadowRoot);
2490          }
2491        }
2492        walk(document);
2493        return out;
2494      }
2495
2496      function serializeChildSnippet(child) {
2497        if (!child || !child.tagName) return '';
2498        var tag = child.tagName.toLowerCase();
2499        var role = (child.getAttribute && child.getAttribute('role')) || '';
2500        var part = (child.getAttribute && child.getAttribute('part')) || '';
2501        var cls = (child.getAttribute && child.getAttribute('class')) || '';
2502        var open =
2503          '<' +
2504          tag +
2505          (role ? ' role="' + role + '"' : '') +
2506          (part ? ' part="' + part + '"' : '') +
2507          (cls
2508            ? ' class="' +
2509              String(cls)
2510                .trim()
2511                .split(/\s+/)
2512                .slice(0, 3)
2513                .join(' ') +
2514              '"'
2515            : '') +
2516          '>';
2517        var text = (child.textContent || '').replace(/\s+/g, ' ').trim().slice(0, 40);
2518        return open + (text ? text : '…') + '</' + tag + '>';
2519      }
2520
2521      function serializeListHtml(listEl) {
2522        if (!listEl || !listEl.tagName) return '';
2523        var tag = listEl.tagName.toLowerCase();
2524        if (tag !== 'ul' && tag !== 'ol') return '';
2525        var openMatch = String(listEl.outerHTML || '').match(/^<[^>]+>/);
2526        var openTag = openMatch ? openMatch[0] : '<' + tag + '>';
2527        var children = Array.prototype.slice.call(listEl.children || []).slice(0, 10);
2528        if (!children.length) return openTag;
2529        var lines = children.map(function (child) {
2530          return '  ' + serializeChildSnippet(child);
2531        });
2532        if ((listEl.children || []).length > 10) {
2533          lines.push('  <!-- … ' + (listEl.children.length - 10) + ' more -->');
2534        }
2535        return openTag + '\n' + lines.join('\n') + '\n</' + tag + '>';
2536      }
2537
2538      function findListFallback() {
2539        var candidates = queryDeepAll('ul[part="list"], overflow-list ul, ul, ol');
2540        var withBad = candidates.filter(function (listEl) {
2541          return Array.prototype.some.call(listEl.children || [], function (child) {
2542            var role = (child.getAttribute && child.getAttribute('role')) || '';
2543            var t = (child.tagName || '').toLowerCase();
2544            return (
2545              role === 'presentation' ||
2546              role === 'none' ||
2547              (t !== 'li' && t !== 'script' && t !== 'template' && t !== 'style')
2548            );
2549          });
2550        });
2551        return withBad.length === 1 ? withBad[0] : null;
2552      }
2553
2554      violations.forEach(function (v) {
2555        if (!v || v.id !== 'list') return;
2556        (v.nodes || []).forEach(function (node) {
2557          if (!node) return;
2558          var hintHtml = String(node.html || '');
2559          var el = resolveShadowPath(node.target);
2560
2561          // Flat axe targets like ["ul"] are too generic — prefer part=list from html hint.
2562          if (
2563            el &&
2564            /part\s*=\s*["']list["']/i.test(hintHtml) &&
2565            !(el.getAttribute && el.getAttribute('part') === 'list')
2566          ) {
2567            var partLists = queryDeepAll('ul[part="list"]');
2568            if (partLists.length === 1) el = partLists[0];
2569            else if (partLists.length > 1) {
2570              var badPart = partLists.filter(function (listEl) {
2571                return Array.prototype.some.call(listEl.children || [], function (child) {
2572                  var role = (child.getAttribute && child.getAttribute('role')) || '';
2573                  return role === 'presentation' || role === 'none';
2574                });
2575              });
2576              if (badPart.length === 1) el = badPart[0];
2577            }
2578          }
2579
2580          if (el && el.tagName) {
2581            var t = el.tagName.toLowerCase();
2582            if (t !== 'ul' && t !== 'ol' && el.closest) {
2583              el = el.closest('ul, ol') || el;
2584            }
2585          }
2586          if (!el || !el.tagName || !/^(UL|OL)$/.test(el.tagName)) {
2587            el = findListFallback();
2588          }
2589          if (!el) return;
2590
2591          var better = serializeListHtml(el);
2592          if (better && better.length > hintHtml.length) {
2593            node.html = better.slice(0, 2500);
2594          }
2595
2596          // Prefer a stable, actionable selector for Horizon chrome lists.
2597          if (el.getAttribute && el.getAttribute('part') === 'list') {
2598            node.target = ['ul[part="list"]'];
2599          }
2600        });
2601      });
2602    }
2603
2604    function notifyScanOpener(payload) {
2605      if (window.opener && payload.type === 'accesspro-axe-scan-error') {
2606        var jobId = new URLSearchParams(window.location.search).get('acp_job');
2607        showScanOverlay('Scan failed');
2608        window.opener.postMessage(
2609          {
2610            type: 'accesspro-axe-scan-progress',
2611            jobId: jobId,
2612            error: payload.message || 'Accessibility scan failed',
2613          },
2614          '*',
2615        );
2616        setTimeout(function () {
2617          window.close();
2618        }, 400);
2619        return;
2620      }
2621      submitScanResult(payload);
2622    }
2623
2624    var script = document.createElement('script');
2625    // cdnjs only goes up to 4.10.3; jsDelivr serves 4.11.1 (matches accessibility-scanner).
2626    script.src = 'https://cdn.jsdelivr.net/npm/[email protected]/axe.min.js';
2627    script.onload = function () {
2628      waitForFullPageLoad().then(runAxeScan);
2629    };
2630    script.onerror = function () {
2631      notifyScanOpener({
2632        type: 'accesspro-axe-scan-error',
2633        token: token,
2634        message: 'Failed to load axe-core',
2635      });
2636    };
2637    document.head.appendChild(script);
2638  })();
2639</script>
2639
2640
2641
2642<style>
2643  .accesspro-icon {
2644    display: inline-flex;
2645    flex-direction: column;
2646    align-items: center;
2647    gap: 4px;
2648    cursor: pointer;
2649    text-decoration: none;
2650    vertical-align: middle;
2651    color: var(--acp-trigger-color, #23185c);
2652  }
2653
2654  /* Icon-only triggers should not reserve a text line box. */
2655  .accesspro-icon[icon='true']:not(.acp-trigger--has-text) {
2656    line-height: 0;
2657  }
2658
2659  .accesspro-icon .asw-menu-btn-container {
2660    flex-shrink: 0;
2661  }
2662
2663  /* The cloned icon is inert; the host element is the control. */
2664  .accesspro-icon .asw-menu-btn-container,
2665  .accesspro-icon .asw-menu-btn {
2666    pointer-events: none;
2667  }
2668</style>
2669<script>
2670  (function () {
2671    var SELECTOR = '.accesspro-icon';
2672    var BOUND = 'acpTriggerBound';
2673    var FILLED = 'acpTriggerFilled';
2674    var settings = window.accessProWidgetSettings || {};
2675    var inlineMode = !!settings.hide_floating_icon;
2676    var fallbackReady = inlineMode;
2677    document.documentElement.style.setProperty(
2678      '--acp-trigger-color',
2679      settings.icon_color_fill || '#23185c'
2680    );
2681
2682    /* ---- open the widget ------------------------------------------------ */
2683    /* main.js is deferred, so iconInstance may not exist on an early click. */
2684    function openWidget(event) {
2685      if (event) event.preventDefault();
2686      if (window.iconInstance) {
2687        window.iconInstance.toggleWidget();
2688        return;
2689      }
2690      var waited = 0;
2691      var timer = setInterval(function () {
2692        if (window.iconInstance) {
2693          clearInterval(timer);
2694          window.iconInstance.toggleWidget();
2695        } else if ((waited += 100) >= 10000) {
2696          clearInterval(timer);
2697          console.error('[AccessPro] Widget did not load — cannot open menu.');
2698        }
2699      }, 100);
2700    }
2701
2702    /* ---- clone the floating icon ---------------------------------------- */
2703    function buildIcon() {
2704      var source = document.querySelector('#Access-Pro-Icon .asw-menu-btn-container');
2705      if (!source) return null;
2706
2707      var clone = source.cloneNode(true);
2708
2709      // Strip ids: the widget mutates apMenuIconStroke / apMenuIconFill by id
2710      // when contrast modes change, and duplicates would shadow the original.
2711      clone.removeAttribute('id');
2712      clone.querySelectorAll('[id]').forEach(function (node) {
2713        node.removeAttribute('id');
2714      });
2715
2716      // The dismiss "X" and loading dots belong to the floating icon only.
2717      clone.querySelectorAll('.asw-hide-widget-icon, .acp-floating-dots').forEach(function (node) {
2718        node.remove();
2719      });
2720
2721      // A <button> nested inside the merchant's <a>
2721 is invalid HTML. Swap it
2722      // for a <span> carrying the same classes so the widget CSS still applies.
2723      var button = clone.querySelector('.asw-menu-btn');
2724      if (button) {
2725        var span = document.createElement('span');
2726        span.className = button.className;
2727        span.setAttribute('style', button.getAttribute('style') || '');
2728        span.setAttribute('aria-hidden', 'true');
2729        while (button.firstChild) span.appendChild(button.firstChild);
2730        button.parentNode.replaceChild(span, button);
2731      }
2732
2733      return clone;
2734    }
2735
2736
2737    /* ---- fallback: build the icon from settings ------------------------- */
2738    /* Used when the floating icon is not in the DOM — the widget skips
2739       render() entirely if the visitor dismissed it, if a page/country filter
2740       bails out of init(), or if trigger display is set to title-only.
2741       Geometry below mirrors render() in main.js exactly. */
2742    var GLYPHS = {
2743      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>',
2744      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>',
2745      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>',
2746      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>',
2747      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>',
2748      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">
2748<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>'
2749    };
2750
2751    var SIZES = {
2752      small: 40, '0.5x': 40,
2753      medium: 50, '1x': 50, default: 50,
2754      large: 60, '1.5x': 60,
2755      extraLarge: 75, '2x': 75
2756    };
2757
2758    function buildIconFromSettings() {
2759      var s = window.accessProWidgetSettings || {};
2760      var style = s.icon_style || 'thick';
2761      var square = s.icon_shape === 'square';
2762      // Defaults must match mergeSettings() in main.js and DEFAULT_SETTINGS in
2763      // app/constants/settings.js — both use #23185c for stroke AND fill — so a
2764      // metafield missing these keys renders identically on either path.
2765      var stroke = s.icon_color_stroke || '#23185c';
2766      var fill = s.icon_color_fill || '#23185c';
2767      var px = SIZES[s.icon_size] || 50;
2768      var solid = style === 'solid';
2769      var thin = style === 'thin';
2770      var shapes = '';
2771
2772      if (square) {
2773        var sizes = [
2774          [solid ? 100 : 98, stroke, 12],
2775          [solid ? 0 : thin ? 86 : 82, '#ffffff', 10],
2776          [solid || thin ? 80 : 70, fill, 8]
2777        ];
2778        sizes.forEach(function (d) {
2779          if (!d[0]) return;
2780          var off = (100 - d[0]) / 2;
2781          shapes += '<rect x="' + off + '" y="' + off + '" width="' + d[0] + '" height="' + d[0] +
2782            '" rx="' + d[2] + '" ry="' + d[2] + '" fill="' + d[1] + '" />';
2783        });
2784      } else {
2785        [
2786          [solid ? 50 : 49, stroke],
2787          [solid ? 0 : thin ? 43 : 41, '#ffffff'],
2788          [solid || thin ? 40 : 35, fill]
2789        ].forEach(function (d) {
2790          shapes += '<circle cx="50" cy="50" r="' + d[0] + '" fill="' + d[1] + '" />';
2791        });
2792      }
2793
2794      var name = GLYPHS[s.icon] ? s.icon : 'default';
2795      var box = document.createElement('div');
2796      box.className = 'asw-menu-btn-container';
2797      box.setAttribute('style', 'position:relative;width:' + px + 'px;height:' + px + 'px;');
2798      // The widget stylesheet may not be loaded when render() never ran, so
2799      // every layout-critical rule is inlined rather than left to the classes.
2800      box.innerHTML =
2801        '<span class="asw-menu-btn' + (square ? ' asw-menu-btn--square' : '') + '" aria-hidden="true"' +
2802        ' style="position:relative;display:flex;align-items:center;justify-content:center;' +
2803        'width:100%;height:100%;background:transparent;border:none;padding:0;margin:0;' +
2804        'border-radius:' + (square ? '12%' : '50%') + ';">' +
2805        '<svg class="asw-outer-svg" viewBox="0 0 100 100" aria-hidden="true" focusable="false"' +
2806        ' style="width:100%;height:100%;display:block;">' + shapes + '</svg>' +
2807        GLYPHS[name] + '</span>';
2808
2809      var glyph = box.querySelector('.asw-main-icon');
2810      if (glyph) {
2811        // .asw-main-icon sizes to 50% via CSS; the default glyph overrides to 45% inline.
2812        var pct = name === 'default' ? '45%' : '50%';
2813        glyph.setAttribute(
2814          'style',
2815          'position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);' +
2816          'width:' + pct + ';height:' + pct + ';fill:#ffffff;z-index:100;'
2817        );
2818      }
2819      return box;
2820    }
2821
2822    /* Name from the host only. Text inside aria-hidden (the cloned icon) does not count. */
2823    function triggerNeedsName(el) {
2824      if ((el.getAttribute('aria-label') || '').trim()) return false;
2825      if ((el.getAttribute('aria-labelledby') || '').trim()) return false;
2826      if ((el.getAttribute('title') || '').trim()) return false;
2827      var node = el.firstChild;
2828      while (node) {
2829        if (node.nodeType === 3) {
2830          if (node.textContent.trim()) return false;
2831        } else if (node.nodeType === 1 && node.getAttribute('aria-hidden') !== 'true') {
2832          if (!triggerNeedsName(node)) return false;
2833        }
2834        node = node.nextSibling;
2835      }
2836      return true;
2837    }
2838
2839    function ensureTriggerName(el) {
2840      if (triggerNeedsName(el)) {
2841        el.setAttribute('aria-label', 'Open Accessibility Menu');
2842      }
2843    }
2844
2845    /* ---- wire one element ----------------------------------------------- */
2846    function bind(el) {
2847      if (el.dataset[BOUND]) return;
2848      el.dataset[BOUND] = '1';
2849
2850      el.addEventListener('click', openWidget);
2851      el.addEventListener('keydown', function (event) {
2852        if (event.key === 'Enter' || event.key === ' ') openWidget(event);
2853      });
2854
2855      // A non-anchor host (div/span) needs explicit button semantics.
2856      var tag = el.tagName.toLowerCase();
2857      if (tag !== 'a' && tag !== 'button') {
2858        if (!el.hasAttribute('role')) el.setAttribute('role', 'button');
2859        if (!el.hasAttribute('tabindex')) el.setAttribute('tabindex', '0');
2860      }
2861
2862      if (el.textContent.trim()) el.classList.add('acp-trigger--has-text');
2863      ensureTriggerName(el);
2864    }
2865
2866    function fillIcon(el, allowFallback) {
2867      if (el.dataset[FILLED]) return true;
2868      if (el.getAttribute('icon') !== 'true') return true;
2869
2870      // Prefer cloning the live icon; fall back to rebuilding from settings.
2871      var icon = buildIcon();
2872      if (!icon && (allowFallback || inlineMode)) icon = buildIconFromSettings();
2873      if (!icon) return false;
2874
2875      // The clone's size lives only in the container's inline style. If the
2876      // widget rendered without one, size it from settings so it cannot
2877      // collapse to zero height inside the merchant's layout.
2878      if (!/\bheight\s*:/.test(icon.getAttribute('style') || '')) {
2879        var px = SIZES[(window.accessProWidgetSettings || {}).icon_size] || 50;
2880        icon.style.position = 'relative';
2881        icon.style.width = px + 'px';
2882        icon.style.height = px + 'px';
2883      }
2884
2885      el.insertBefore(icon, el.firstChild);
2886      el.dataset[FILLED] = '1';
2887      ensureTriggerName(el);
2888      return true;
2889    }
2890
2891    /* ---- scan ------------------------------------------------------------ */
2892    /* Clicks are wired immediately so the trigger works before the icon
2893       renders; icons are filled in once the floating icon exists. */
2894    var pendingIcons = false;
2895
2896    function scan(allowFallback) {
2897      pendingIcons = false;
2898      document.querySelectorAll(SELECTOR).forEach(function (el) {
2899        bind(el);
2900        if (!fillIcon(el, allowFallback)) pendingIcons = true;
2901      });
2902    }
2903
2904    function start() {
2905      scan(inlineMode);
2906
2907      // Inline mode hides the floating icon, so build from settings immediately.
2908      if (inlineMode) {
2909        // console.log('[AccessPro] Inline triggers — using widget settings for icons');
2910      }
2911
2912      // The floating icon only renders after the settings request resolves and
2913      // the widget chunk loads, so poll until it appears. If it never does,
2914      // stop waiting and build the icon from settings instead.
2915      var FALLBACK_AFTER = 2500;
2916      var waited = 0;
2917      var timer = setInterval(function () {
2918        if (!pendingIcons) {
2919          clearInterval(timer);
2920          return;
2921        }
2922        waited += 200;
2923        if (waited < FALLBACK_AFTER) {
2924          scan(false);
2925          return;
2926        }
2927        fallbackReady = true;
2928        clearInterval(timer);
2929        scan(true);
2930        if (pendingIcons) {
2931          console.warn('[AccessPro] Could not render inline icons.');
2932        }
2933      }, 200);
2934
2935      // Catch triggers added later (theme editor re-renders, dynamic sections).
2936      // Debounced: the widget itself mutates the DOM heavily as it renders.
2937      if (window.MutationObserver) {
2938        var queued = false;
2939        new window.MutationObserver(function () {
2940          if (queued) return;
2941          queued = true;
2942          requestAnimationFrame(function () {
2943            queued = false;
2944            scan(fallbackReady || inlineMode);
2945          });
2946        }).observe(document.body, { childList: true, subtree: true });
2947      }
2948    }
2949
2950    if (document.readyState === 'loading') {
2951      document.addEventListener('DOMContentLoaded', start);
2952    } else {
2953      start();
2954    }
2955  })();
2956</script>
2956
2957
2958
2959</div><div id="shopify-block-ARTg3djF4REhDLzg1M__16237003337219470499" class="shopify-block shopify-app-block">
2960
2961
2962
2963
2964
2965<script>
2966    var _ALConfig = _ALConfig || {};
2967    _ALConfig = {
2968        'shop_name': '',
2969        'public_domain': null,
2970        'proxy_path_prefix': 'apps/loyalty',
2971        'widgetJsPath': 'https://loyalty-admin.appstle.com/app/loyalty-widget.bundle.js',
2972        'widgetCssPath': 'https://loyalty-admin.appstle.com/content/loyalty-widget.css',
2973        'pointEarnRules': [],
2974        'pointRedeemRules': [],
2975        'widget_setting': null,
2976        'product': null,
2977        'productCollections': [],
2978        'shop_labels': null,
2979        'pointRoundType': 'NO_ROUND'
2980    };
2981
2982    // Shopify's market-aware account routes. Emitted from the Liquid `routes` object so links keep
2983    // the customer's current market/language prefix (e.g. /en-eu/account/login) instead of a
2984    // hard-coded /account/login, which Shopify resolves against the shop's primary market.
2985    _ALConfig.routes = {
2986        'root_url': "\/",
2987        'account_url': "\/account",
2988        'account_login_url': "https:\/\/www.mooncatcrystals.com\/customer_authentication\/redirect?locale=en\u0026region_country=US",
2989        'account_register_url': "https:\/\/account.mooncatcrystals.com?locale=en\u0026region_country=US\u0026buyer_flags=eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJtb29uY2F0LWNyeXN0YWxzLm15c2hvcGlmeS5jb20iLCJmbGFncyI6W10sImV4cCI6MTc5MTcyMTcxOCwibmJmIjoxNzkxMTE2OTE4fQ.riEVRynaYF76o42-QD8kAqcWjSBvnd7fKUk5lbhecJk",
2990        'account_logout_url': "\/account\/logout"
2991    };
2992
2993    
2994    _ALConfig.shop_name = "Mooncat Crystals";
2995    
2996
2997    
2998    _ALConfig.proxy_path_prefix = "apps\/loyalty";
2999    
3000
3001    
3002    _ALConfig.currency = "USD";
3003    
3004
3005    
3006    _ALConfig.storeCurrency = "USD";
3007    
3008
3009    
3010    _ALConfig.pointRoundType = "ROUND_UP";
3011    
3012
3013    
3014    _ALConfig.public_domain = "mooncatcrystals.com";
3015    
3016
3017    
3018    _ALConfig.widgetJsPath = "https:\/\/loyalty-admin.appstle.com\/app\/loyalty-widget.bundle.js?v=1783529028499";
3019    
3020
3021    
3022    _ALConfig.widgetCssPath = "https:\/\/loyalty-admin.appstle.com\/content\/loyalty-widget.css?v=1783529028499";
3023    
3024
3025    
3026    _ALConfig.referralEnabled = false;
3027    
3028
3029    
3030    _ALConfig.vipTierEnabled = false;
3031    
3032
3033    
3034
3035    
3036
3037    
3038    _ALConfig.pointEarnRules = [{"id":41107,"shop":"mooncat-crystals.myshopify.com","type":"PURCHASE","status":"ACTIVE","historicPurchaseDuration":"NONE","basePoints":5.0,"includeSubtotal":true,"includeTax":false,"excludeCollections":null,"name":"\\uD83D\\uDECD\\uFE0F Product Purchase","customerNotification":"{{points}} points added for {{rule_name}}","createAt":"2025-11-18T15:01:18.116635Z","updateAt":"2025-11-18T19:44:10.971592Z","rewardInterval":null,"productId":null,"collectionId":null,"variantId":null,"productData":null,"collectionData":null,"customerFacingLabel":"Get 5 points for every $1 you spend","socialUrl":null,"disableForOnSellProduct":false,"autoApprovalDays":null,"enableInterval":null,"earnLimit":null,"activityType":"REGULAR","allowedCustomerTags":null,"includeShippingPoints":false,"eligibleForFirstOrder":null,"maximumPoints":null,"restrictCustomerTags":null,"customerFacingIconUrl":null,"serial":1,"excludeOrderTags":null,"pointBasedOn":null,"excludeProducts":null,"givePointsToGuestCustomers":true,"allowedProductTags":null,"restrictProductTags":null,"rollBackPointsOnUnsubscribe":null,"addAdditionalPoints":null,"additionalPoints":null,"refundNotificationLabel":"{{points}} points removed for refund.","disablePointsForDiscountedProduct":false,"platformType":"BOTH","vipTierId":null,"earnType":"POINTS","minimumOrderValue":null,"allowedOrderTags":null,"excludeVariantIds":null,"rewardAssignType":"DYNAMIC","applyOnImportedCustomer":false,"enableBirthdayPromo":false,"promoPointsMultiplier":null,"ruleStartDate":null,"ruleEndDate":null,"translations":null,"appliesOn":null,"manuallyApprovePoints":null},{"id":41109,"shop":"mooncat-crystals.myshopify.com","type":"LEAVE_REVIEW_JUDGE_ME","status":"ACTIVE","historicPurchaseDuration":"NONE","basePoints":50.0,"includeSubtotal":false,"includeTax":false,"excludeCollections":null,"name":"\\u270D\\uFE0F Write a review using Judge Me","customerNotification":"{{points}} points added for review using {{review_type}}, {{details}}","createAt":"2025-11-18T15:46:02.235347Z","updateAt":"2025-11-18T16:45:25.634009Z","rewardInterval":"DAY","productId":null,"collectionId":null,"variantId":null,"productData":null,"collectionData":null,"customerFacingLabel":"50 points for leaving a review","socialUrl":null,"disableForOnSellProduct":false,"autoApprovalDays":0,"enableInterval":true,"earnLimit":1,"activityType":"REGULAR","allowedCustomerTags":null,"includeShippingPoints":false,"eligibleForFirstOrder":false,"maximumPoints":null,"restrictCustomerTags":null,"customerFacingIconUrl":null,"serial":2,"excludeOrderTags":null,"pointBasedOn":null,"excludeProducts":null,"givePointsToGuestCustomers":true,"allowedProductTags":null,"restrictProductTags":null,"rollBackPointsOnUnsubscribe":false,"addAdditionalPoints":false,"additionalPoints":null,"refundNotificationLabel":"{{points}} points removed for refund.","disablePointsForDiscountedProduct":false,"platformType":"BOTH","vipTierId":null,"earnType":"POINTS","minimumOrderValue":null,"allowedOrderTags":null,"excludeVariantIds":null,"rewardA
3038ssignType":"DYNAMIC","applyOnImportedCustomer":false,"enableBirthdayPromo":false,"promoPointsMultiplier":null,"ruleStartDate":null,"ruleEndDate":null,"translations":null,"appliesOn":null,"manuallyApprovePoints":null},{"id":41120,"shop":"mooncat-crystals.myshopify.com","type":"SUBSCRIBE_NEWSLETTER","status":"ACTIVE","historicPurchaseDuration":"NONE","basePoints":100.0,"includeSubtotal":false,"includeTax":false,"excludeCollections":null,"name":"\\uD83D\\uDCE7 Subscribe to Our Newsletter","customerNotification":"{{points}} points added for {{rule_name}}","createAt":"2025-11-18T16:57:58.555128Z","updateAt":"2025-11-18T19:42:34.676452Z","rewardInterval":"DAY","productId":null,"collectionId":null,"variantId":null,"productData":null,"collectionData":null,"customerFacingLabel":"Subscribe to Our Newsletter and get 100 points","socialUrl":"https:\/\/mooncatcrystals.myflodesk.com\/elevate","disableForOnSellProduct":false,"autoApprovalDays":0,"enableInterval":false,"earnLimit":1,"activityType":"REGULAR","allowedCustomerTags":null,"includeShippingPoints":false,"eligibleForFirstOrder":false,"maximumPoints":null,"restrictCustomerTags":null,"customerFacingIconUrl":null,"serial":3,"excludeOrderTags":null,"pointBasedOn":null,"excludeProducts":null,"givePointsToGuestCustomers":true,"allowedProductTags":null,"restrictProductTags":null,"rollBackPointsOnUnsubscribe":false,"addAdditionalPoints":false,"additionalPoints":null,"refundNotificationLabel":"{{points}} points removed for unsubscribing newsletter","disablePointsForDiscountedProduct":false,"platformType":"BOTH","vipTierId":null,"earnType":"POINTS","minimumOrderValue":null,"allowedOrderTags":null,"excludeVariantIds":null,"rewardAssignType":"DYNAMIC","applyOnImportedCustomer":false,"enableBirthdayPromo":false,"promoPointsMultiplier":null,"ruleStartDate":null,"ruleEndDate":null,"translations":null,"appliesOn":null,"manuallyApprovePoints":null},{"id":41118,"shop":"mooncat-crystals.myshopify.com","type":"FOLLOW_INSTAGRAM","status":"ACTIVE","historicPurchaseDuration":"NONE","basePoints":100.0,"includeSubtotal":false,"includeTax":false,"excludeCollections":null,"name":"\\uD83D\\uDCF1 Follow us on Instagram","customerNotification":"{{points}} points added for {{rule_name}}","createAt":"2025-11-18T16:49:13.161249Z","updateAt":"2025-11-18T19:43:01.760499Z","rewardInterval":"DAY","productId":null,"collectionId":null,"variantId":null,"productData":null,"collectionData":null,"customerFacingLabel":"Follow us on Instagram @mooncatcrystals and get 100 points","socialUrl":"http:\/\/instagram.com\/mooncatcrystals","disableForOnSellProduct":false,"autoApprovalDays":0,"enableInterval":false,"earnLimit":1,"activityType":"REGULAR","allowedCustomerTags":null,"includeShippingPoints":false,"eligibleForFirstOrder":false,"maximumPoints":null,"restrictCustomerTags":null,"customerFacingIconUrl":null,"serial":4,"excludeOrderTags":null,"pointBasedOn":null,"excludeProducts":null,"givePointsToGuestCustomers":true,"allowedProductTags":null,"restrictProductTags":null,"rollBackPointsOnUnsubscribe":false,"addAdditionalPoints":false,"additionalPoints":null,"refundNotificationLabel":"{{points}} points removed for refund.","disablePointsForDiscountedProduct":false,"platformType":"BOTH","vipTierId":null,"earnType":"POINTS","minimumOrderValue":null,"allowedOrderTags":null,"excludeVariantIds":null,"rewardAssignType":"DYNAMIC","applyOnImportedCustomer":false,"enableBirthdayPromo":false,"promoPointsMultiplier":null,"ruleStartDate":null,"ruleEndDate":null,"translations":null,"appliesOn":null,"manuallyApprovePoints":null},{"id":41108,"shop":"mooncat-crystals.myshopify.com","type":"BIRTHDAY","status":"ACTIVE","historicPurchaseDuration":"NONE","basePoints":375.0,"includeSubtotal":false,"includeTax":false,"excludeCollections":null,"name":"\\uD83C\\uDF82 Birthday Reward","customerNotification":"{{points}} store credits added for {{rule_name}}","createAt":"2025-11-18T15:43:38.860734Z","updateAt":"2025-11-18T19:36:44.995148Z","rewardInterval":"DAY","productId":null,"collectionId":null,"variantId":null,"productData":null,"collectionData":null,"customerFacingLabel":"Get 375 points to help you celebrate your birthday","socialUrl":null,"disableForOnSellProduct":false,"autoApprovalDays":0,"enableInterval":false,"earnLimit":1,"activityType":"REGULAR","allowedCustomerTags":null,"includeShippingPoints":false,"eligibleForFirstOrder":false,"maximumPoints":null,"restrictCustomerTags":null,"customerFacingIconUrl":null,"serial":5,"excludeOrderTags":null,"pointBasedOn":null,"excludeProducts":null,"givePointsToGuestCustomers":true,"allowedProductTags":null,"restrictProductTags":null,"rollBackPointsOnUnsubscribe":false,"addAdditionalPoints":false,"additionalPoints":null,"refundNotificationLabel":"{{points}} points removed for refund.","disablePointsForDiscountedProduct":false,"platformType":"BOTH","vipTierId":null,"earnType":"POINTS","minimumOrderValue":null,"allowedOrderTags":null,"excludeVariantIds":null,"rewardA
3038ssignType":"DYNAMIC","applyOnImportedCustomer":false,"enableBirthdayPromo":false,"promoPointsMultiplier":null,"ruleStartDate":null,"ruleEndDate":null,"translations":null,"appliesOn":null,"manuallyApprovePoints":null},{"id":41110,"shop":"mooncat-crystals.myshopify.com","type":"CREATE_ACCOUNT","status":"ACTIVE","historicPurchaseDuration":"NONE","basePoints":100.0,"includeSubtotal":false,"includeTax":false,"excludeCollections":null,"name":"\\uD83D\\uDC4B Sign Up for Rewards","customerNotification":"{{points}} points added for {{rule_name}}","createAt":"2025-11-18T16:10:56.70387Z","updateAt":"2025-11-18T19:43:38.201934Z","rewardInterval":"DAY","productId":null,"collectionId":null,"variantId":null,"productData":null,"collectionData":null,"customerFacingLabel":"Get 100 points when you sign up for our rewards program","socialUrl":null,"disableForOnSellProduct":false,"autoApprovalDays":0,"enableInterval":false,"earnLimit":1,"activityType":"REGULAR","allowedCustomerTags":null,"includeShippingPoints":false,"eligibleForFirstOrder":false,"maximumPoints":null,"restrictCustomerTags":null,"customerFacingIconUrl":null,"serial":6,"excludeOrderTags":null,"pointBasedOn":null,"excludeProducts":null,"givePointsToGuestCustomers":true,"allowedProductTags":null,"restrictProductTags":null,"rollBackPointsOnUnsubscribe":false,"addAdditionalPoints":false,"additionalPoints":null,"refundNotificationLabel":"{{points}} points removed for refund.","disablePointsForDiscountedProduct":false,"platformType":"BOTH","vipTierId":null,"earnType":"POINTS","minimumOrderValue":null,"allowedOrderTags":null,"excludeVariantIds":null,"rewardAssignType":"DYNAMIC","applyOnImportedCustomer":false,"enableBirthdayPromo":false,"promoPointsMultiplier":null,"ruleStartDate":null,"ruleEndDate":null,"translations":null,"appliesOn":null,"manuallyApprovePoints":null}];
3039    
3040
3041    
3042    _ALConfig.pointRedeemRules = [{"id":48858,"shop":"mooncat-crystals.myshopify.com","name":"\\u2728 Free Intuitively Selected Crystal","type":"PRODUCT_DISCOUNT","referralType":null,"status":"ACTIVE","redeemPoints":375.0,"discountType":"PERCENTAGE","discount":100.0,"minimumPurchaseAmount":0.0,"createAt":"2025-11-18T16:39:09.314232Z","updateAt":"2025-11-18T17:03:33.920168Z","maximumShippingRate":0.0,"productId":null,"variantId":null,"productData":"[{\"id\":8885312553202,\"type\":\"PRODUCT\",\"productId\":8885312553202,\"title\":\"Intuitively Selected Crystal + Card in Decorative Pouch\",\"productHandle\":\"intuitively-selected-crystal-card-in-decorative-pouch\",\"variant\":false,\"status\":\"ACTIVE\"}]","collectionId":null,"collectionData":null,"customerFacingLabel":"Redeem 375 points to receive a 100% discount on \u003ca href='https:\\\/\\\/mooncat-crystals.myshopify.com\\\/products\\\/intuitively-selected-crystal-card-in-decorative-pouch?variant=8885312553202' target='_blank' style='color: blue;text-decoration: none' class='loyalty-redeem-product-title'\u003eIntuitively Selected Crystal + Card in Decorative Pouch\u003c\\\/a\u003e","restrictCustomers":null,"restrictCustomersWithTags":null,"rewardInterval":"DAY","appliesOn":"ONE_TIME","combinedWithProductDiscount":true,"combinedWithShippingDiscount":false,"combinedWithOrderDiscount":true,"enableInterval":false,"redeemLimit":1,"enableNumberOfUsagesLimit":false,"numberOfUsagesLimit":null,"allowedCustomerTags":null,"earnRuleId":null,"vipTierId":null,"redeemLabel":"{{discount}} discount for {{product_title}}","customerFacingIconUrl":null,"serial":0,"discountCodeForAllCustomer":false,"allowedCountries":null,"showInPosOnly":false,"redeemAllPoints":false,"enableMinimumPointsToRedeem":false,"requiredMinimumPointsToRedeem":0.0,"enableMaximumPointsToRedeem":false,"requiredMaximumPointsToRedeem":0.0,"enablePOS":false,"minimumPointsLabel":"Add minimum {{points}} points to redeem","maximumPointsLabel":"Maximum {{points}} points can be redeemed","applyDiscountOnce":true,"enableDiscountPrefix":true,"discountPrefixText":"REWARD","discountCodeNodeId":"gid:\/\/shopify\/DiscountCodeNode\/1479254573298","translations":null,"quantity":null,"applyToEachItem":null},{"id":48852,"shop":"mooncat-crystals.myshopify.com","name":"\\uD83D\\uDCB5 $5 Off Any Purchase","type":"DISCOUNT_CODE","referralType":null,"status":"ACTIVE","redeemPoints":500.0,"discountType":"FIXED","discount":5.0,"minimumPurchaseAmount":0.0,"createAt":"2025-11-18T15:01:18.079009Z","updateAt":"2025-11-18T20:01:28.819048Z","maximumShippingRate":null,"productId":null,"variantId":null,"productData":null,"collectionId":null,"collectionData":null,"customerFacingLabel":"Redeem 500 points to receive a $5 discount","restrictCustomers":null,"restrictCustomersWithTags":null,"rewardInterval":null,"appliesOn":"ONE_TIME","combinedWithProductDiscount":null,"combinedWithShippingDiscount":null,"combinedWithOrderDiscount":null,"enableInterval":null,"redeemLimit":null,"enableNumberOfUsagesLimit":null,"numberOfUsagesLimit":null,"allowedCustomerTags":null,"earnRuleId":null,"vipTierId":null,"redeemLabel":"Get a {{discount}} discount on your entire order with a minimum spend of {{min_spend_amount}}","customerFacingIconUrl":null,"serial":1,"discountCodeForAllCustomer":null,"allowedCountries":null,"showInPosOnly":null,"redeemAllPoints":null,"enableMinimumPointsToRedeem":null,"requiredMinimumPointsToRedeem":null,"enableMaximumPointsToRedeem":null,"requiredMaximumPointsToRedeem":null,"enablePOS":null,"minimumPointsLabel":null,"maximumPointsLabel":null,"applyDiscountOnce"
3042:true,"enableDiscountPrefix":null,"discountPrefixText":null,"discountCodeNodeId":"gid:\/\/shopify\/DiscountCodeNode\/1479254638834","translations":null,"quantity":null,"applyToEachItem":null},{"id":48862,"shop":"mooncat-crystals.myshopify.com","name":"\\uD83D\\uDD2E Free Mystery Bag","type":"PRODUCT_DISCOUNT","referralType":null,"status":"ACTIVE","redeemPoints":500.0,"discountType":"PERCENTAGE","discount":100.0,"minimumPurchaseAmount":0.0,"createAt":"2025-11-18T17:06:58.796118Z","updateAt":"2025-11-18T17:06:58.796119Z","maximumShippingRate":0.0,"productId":null,"variantId":null,"productData":"[{\"id\":7841451802866,\"type\":\"PRODUCT\",\"productId\":7841451802866,\"title\":\"Mystery Crystal Bag | 3 Surprise Crystals + Info Cards\",\"imageSrc\":\"https:\/\/cdn.shopify.com\/s\/files\/1\/2164\/6515\/files\/mystery-crystal-bag-3-surprise-crystals-info-cards-mooncat-crystals-33987609624818.jpg?v=1753913932\",\"productHandle\":\"mystery-bag\",\"variant\":false,\"status\":\"ACTIVE\"}]","collectionId":null,"collectionData":null,"customerFacingLabel":"Redeem 500 points to receive a 100% discount on \u003ca href='https:\\\/\\\/mooncat-crystals.myshopify.com\\\/products\\\/mystery-bag?variant=7841451802866' target='_blank' style='color: blue;text-decoration: none' class='loyalty-redeem-product-title'\u003eMystery Crystal Bag | 3 Surprise Crystals + Info Cards\u003c\\\/a\u003e","restrictCustomers":null,"restrictCustomersWithTags":null,"rewardInterval":"DAY","appliesOn":"ONE_TIME","combinedWithProductDiscount":false,"combinedWithShippingDiscount":false,"combinedWithOrderDiscount":false,"enableInterval":false,"redeemLimit":1,"enableNumberOfUsagesLimit":false,"numberOfUsagesLimit":null,"allowedCustomerTags":null,"earnRuleId":null,"vipTierId":null,"redeemLabel":"{{discount}} discount for {{product_title}}","customerFacingIconUrl":null,"serial":2,"discountCodeForAllCustomer":false,"allowedCountries":null,"showInPosOnly":false,"redeemAllPoints":false,"enableMinimumPointsToRedeem":false,"requiredMinimumPointsToRedeem":0.0,"enableMaximumPointsToRedeem":false,"requiredMaximumPointsToRedeem":0.0,"enablePOS":false,"minimumPointsLabel":"Add minimum {{points}} points to redeem","maximumPointsLabel":"Maximum {{points}} points can be redeemed","applyDiscountOnce":true,"enableDiscountPrefix":false,"discountPrefixText":null,"discountCodeNodeId":"gid:\/\/shopify\/DiscountCodeNode\/1479257161970","translations":null,"quantity":null,"applyToEachItem":null}];
3043    
3044
3045    
3046    _ALConfig.vipRewards = [];
3047    
3048
3049    
3050    _ALConfig.vipPointRewards = [];
3051    
3052
3053    
3054    _ALConfig.widget_setting = {"id":13829,"shop":"mooncat-crystals.myshopify.com","themePrimaryColor":null,"themeSecondaryColor":null,"widgetPosition":"LEFT","showWidget":false,"widgetBackgroundColor":"#000000","widgetTextColor":"#ffffff","faq":null,"popupHeaderColor":"#000000","popupTilesColor":"#f7f7f7","popupButtonColor":"#ff43c5","popupIconColor":"#ff43c5","popupLinksColor":"#ff43c5","homeGreetings":null,"homeSignup":null,"popupButtonTextColor":"#ffffff","popupTilesTextColor":"#212121","popupDiscountCodeGenerated":null,"popupCopyDiscount":null,"popupCopiedDiscount":null,"widgetTitle":null,"customCss":null,"widgetCounterBackgroundColor":"#000000","widgetCounterTextColor":"#ffffff","logoUrl":null,"notificationToastBackgroundColor":"#ff43c5","notificationToastTextColor":"#ffffff","acquirePointsBackgroundColor":"#000000","acquirePointsTextColor":"#e4ccb2","pointsBalanceBackgroundColor":"inherit","pointsBalanceTextColor":"#000000","allowedCustomersTag":null,"widgetSettingJson":"{\"widgetDateTimeFormat\":\"MMM D, YYYY, h:mm A\",\"showVIPSection\":true,\"dedicatedPageType\":\"DEDICATED_PAGE_V2\",\"referralRedirectUrl\":\"\",\"loaderIcon\":\"\",\"showLoyaltyOptOut\":false,\"cartWidgetSelector\":\"\",\"toastPosition\":\"bottom-center\",\"primaryDedicatedPageSectionBackgroundColor\":\"#F2F8FF\",\"reachVipMileStoneType\":\"TOTAL_AMOUNT\",\"createAccountLink\":\"\",\"cartDrawerWidgetPlacement\":\"BEFORE\",\"refreshOnAddToCart\":false,\"dateLocalFormat\":\"DEFAULT\",\"loyaltyPageMetaDescription\":\"\",\"enableMetaTagForNoIndexing\":false,\"hideToastNotification\":false,\"hideAppstleLoaderIcon\":false,\"showRedeemSection\":true,\"loadScriptOnlyOnDedicatedPage\":false,\"hideRedeemRuleSectionOnEmpty\":true,\"widgetBackgroun
3054dImage\":\"\",\"vipTierBadgeBackgroundColor\":\"inherit\",\"enableEnhancedV2Styling\":true,\"showCustomerHistoryDescriptionToolTip\":false,\"checkoutAllowedCustomerTags\":\"\",\"secondaryDedicatedPageBackgroundColor\":\"#ffffff\",\"launcherDataType\":\"POINTS\",\"titleCount\":60,\"hideCheckoutBlockLoggedOutCustomers\":false,\"vipTierBadgeTextColor\":\"#000000\",\"popupButtonHoverColor\":\"#e5cbb4\",\"cartWidgetPlacement\":\"BEFORE\",\"showRewardSection\":true,\"primaryDedicatedPageBackgroundColor\":\"#141614\",\"showHowItWorksSection\":true,\"visitedIcon\":\"\",\"afterCopiedDiscountRedirectUrl\":\"\",\"showVipTierBadge\":false,\"loggedOutFlagAcquirePoints\":false,\"manageLoyaltyButtonUrl\":\"\",\"hideRulesForLoggedOutCustomer\":false,\"hideStoreCreditsBalance\":false,\"checkoutRestrictCustomerTags\":\"\",\"hideExpirationDate\":true,\"dedicatedPageV2CardGap\":\"1.25rem\",\"showReferralSection\":true,\"cartWidgetRewardIcon\":\"\",\"hideEarnRuleSectionOnEmpty\":true,\"primaryDedicatedPageTextColor\":\"#818cf8\",\"showFAQSection\":true,\"showRangeForRedeemPoints\":false,\"dedicatedPageV2BorderRadius\":\"8px\",\"secondaryDedicatedPageSectionBackgroundColor\":\"#FFFFFF\",\"loyaltyPageMetaTitle\":\"\",\"applyDiscountCodeOnRedeem\":false,\"waysToEarnIcon\":\"\",\"vipTierBadgeSelector\":\"\",\"displayMethod\":\"TEXT_ICON\",\"hideFaqSection\":false,\"disableRuleCollapsible\":false,\"showEarnSection\":true,\"showTierName\":false,\"cartDrawerRedeemWidgetSelector\":\"\",\"checkoutRedeemLoginURL\":\"\",\"widgetButtonLogoUrl\":\"https:\/\/cdn.shopify.com\/s\/files\/1\/0635\/7391\/7901\/files\/icon1.png?v=1719318035\",\"disableLoyaltyBlocks\":false,\"hidePointsBalance\":false,\"descriptionCount\":500,\"hideWidgetOnScroll\":true,\"customFontUrl\":\"\",\"hideWidgetLauncherOnMobile\":true,\"hideFreeProductDropdownProductTitle\":false,\"showCartRedeemWidget\":true,\"customSignInLink\":\"\",\"referredCustomerRewardIcon\":\"\",\"enableAcquirePointsQuantitySelector\":false,\"showPoweredBy\":true,\"hideVipTierName\":false,\"showTransactionHistory\":true,\"waysToRedeemIcon\":\"\",\"secondaryDedicatedPageTextColor\":\"#4b5563\",\"customHtmlInject\":\"[]\",\"referringCustomerRewardIcon\":\"\"}","widgetButtonLogoUrl":"https:\/\/cdn.shopify.com\/s\/files\/1\/0635\/7391\/7901\/files\/icon1.png?v=1719318035","showReferralSocialMedia":true,"referralSocialMediaInfo":"[{\"socialMediaIconURL\":\"data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB2aWV3Qm94PSItMzIgMCA1MTIgNTEyIj4KCTxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZ2MzIwYzAgMzUuMyAyOC43IDY0IDY0IDY0aDk4LjJWMzM0LjJoLTUyLjhWMjU2aDUyLjh2LTMzLjdjMC04Ny4xIDM5LjQtMTI3LjUgMTI1LTEyNy41YzE2LjIgMCA0NC4yIDMuMiA1NS43IDYuNFYxNzJjLTYtLjYtMTYuNS0xLTI5LjYtMWMtNDIgMC01OC4yIDE1LjktNTguMiA1Ny4yVjI1Nmg4My42bC0xNC40IDc4LjJIMjU1VjQ4MGgxMjljMzUuMyAwIDY0LTI4LjcgNjQtNjRWOTZjMC0zNS4zLTI4LjctNjQtNjQtNjR6IiAvPgo8L3N2Zz4=\",\"socialMediaLink\":\"https:\/\/facebook.com\/Shopify\",\"socialMedia\":\"FACEBOOK\"},{\"socialMediaIconURL\":\"data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB2aWV3Qm94PSItMzIgMCA1MTIgNTEyIj4KCTxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZ2MzIwYzAgMzUuMyAyOC43IDY0IDY0IDY0aDMyMGMzNS4zIDAgNjQtMjguNyA2NC02NFY5NmMwLTM1LjMtMjguNy02NC02NC02NHptMjk3LjEgODRMMjU3LjMgMjM0LjZMMzc5LjQgMzk2aC05NS42TDIwOSAyOTguMUwxMjMuMyAzOTZINzUuOGwxMTEtMTI2LjlMNjkuNyAxMTZoOThsNjcuNyA4OS41bDc4LjItODkuNXptLTM3LjggMjUxLjZMMTUzLjQgMTQyLjloLTI4LjNsMTcxLjggMjI0LjdoMjYuM3oiIC8+Cjwvc3ZnPg==\",\"socialMediaLink\":\"https:\/\/x.com\",\"socialMedia\":\"X\"},{\"socialMediaIconURL\":\"data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KCTxnIGZpbGw9ImN1cnJlbnRDb2xvciI+CgkJPHBhdGggZD0iTTIyIDcuNTM1VjE3YTMgMyAwIDAgMS0yLjgyNCAyLjk5NUwxOSAyMEg1YTMgMyAwIDAgMS0yLjk5NS0yLjgyNEwyIDE3VjcuNTM1bDkuNDQ1IDYuMjk3bC4xMTYuMDY2YTEgMSAwIDAgMCAuODc4IDBsLjExNi0uMDY2eiIgLz4KCQk8cGF0aCBkPSJNMTkgNGMxLjA4IDAgMi4wMjcuNTcgMi41NTUgMS40MjdMMTIgMTEuNzk3bC05LjU1NS02LjM3YTMgMyAwIDAgMSAyLjM1NC0xLjQyTDUgNHoiIC8+Cgk8L2c+Cjwvc3ZnPg==\",\"socialMediaLink\":\"https:\/\/mail.google.com\",\"socialMedia\":\"EMAIL\"}]","restrictedCustomersTag":null,"blockWidgetOnPages":null,"colorSettingsJson":"{\"popupLinksColor\":\"#ff43c5\",\"popupHeaderColor\":\"#000000\",\"popupIconColor\":\"#ff43c5\",\"acquirePointsBackgroun
3054dColor\":\"#000000\",\"pointsBalanceBackgroundColor\":\"inherit\",\"pointsBalanceTextColor\":\"#000000\",\"widgetCounterBackgroundColor\":\"#000000\",\"popupButtonColor\":\"#ff43c5\",\"popupTilesColor\":\"#f7f7f7\",\"widgetBackgroundColor\":\"#000000\",\"notificationToastTextColor\":\"#ffffff\",\"widgetCounterTextColor\":\"#ffffff\",\"notificationToastBackgroundColor\":\"#ff43c5\",\"popupTilesTextColor\":\"#212121\",\"popupButtonTextColor\":\"#ffffff\",\"widgetTextColor\":\"#ffffff\",\"acquirePointsTextColor\":\"#e4ccb2\"}","widgetType":"LAUNCHER","imageLinksJson":"{\"collectionDiscountRuleImage\":\"\",\"purchaseRuleImage\":\"\",\"buyProductFromCollectionRuleImage\":\"\",\"vipTierImage\":\"\",\"freeShippingRuleImage\":\"\",\"birthdayDiscountRuleImage\":\"\",\"referralBackgroundImage\":\"\",\"youtubeRuleImage\":\"\",\"referralReferenceImage\":\"\",\"birthdayRuleImage\":\"\",\"judgeMeReviewRuleImage\":\"\",\"pinterestRuleImage\":\"\",\"freeProductRuleImage\":\"\",\"productDiscountRuleImage\":\"\",\"faqIconImage\":\"\",\"looxIoReviewRuleImage\":\"\",\"stampedIoReviewRuleImage\":\"\",\"productReviewRuleImage\":\"\",\"discountRuleImage\":\"\",\"faqBackgroundImage\":\"\",\"tiktokRuleImage\":\"\",\"twitterRuleImage\":\"\",\"subscriptionRuleImage\":\"\",\"buyProductRuleImage\":\"\",\"createAccountRuleImage\":\"\",\"dynamicDiscountRuleImage\":\"\",\"visitShopRuleImage\":\"\",\"facebookRuleImage\":\"\",\"heroBackgroundImage\":\"https:\/\/cdn.shopify.com\/s\/files\/1\/2164\/6515\/files\/herkimer-diamond-rewards-program-crystals.jpg?v=1763575673\",\"instagramRuleImage\":\"\",\"okendoReviewRuleImage\":\"\",\"availableRewardsImage\":\"\"}","customerGreetingsIcon":null,"heroBackgroundImage":"https:\/\/cdn.shopify.com\/s\/files\/1\/2164\/6515\/files\/herkimer-diamond-rewards-program-crystals.jpg?v=1763575673","referralReferenceImage":"","referralBackgroundImage":"","purchaseRuleImage":"","subscriptionRuleImage":"","createAccountRuleImage":"","visitShopRuleImage":"","birthdayRuleImage":"","buyProductRuleImage":"","buyProductFromCollectionRuleImage":"","facebookRuleImage":"","pinterestRuleImage":"","instagramRuleImage":"","tiktokRuleImage":"","youtubeRuleImage":"","twitterRuleImage":"","stampedIoReviewRuleImage":"","looxIoReviewRuleImage":"","judgeMeReviewRuleImage":"","productReviewRuleImage":"","okendoReviewRuleImage":"","discountRuleImage":"","freeShippingRuleImage":"","freeProductRuleImage":"","productDiscountRuleImage":"","collectionDiscountRuleImage":"","dynamicDiscountRuleImage":"","birthdayDiscountRuleImage":"","availableRewardsImage":"","vipTierImage":"","faqBackgroundImage":"","showAcquirePoints":false,"acquirePointsSelector":null,"showPointsBalance":null,"pointsBalanceSelector":null,"showPoweredBy":true,"forceRedirectDedicatedPage":null,"historyDate":null,"historyActivityDetails":null,"historyPointsAdjustment":null,"historyStatus":null,"afterCopiedDiscountRedirectUrl":"","showVipTierBadge":false,"vipTierBadgeSelector":"","vipTierBadgeBackgroun
3054dColor":"inherit","vipTierBadgeTextColor":"#000000","faqIconImage":"","descriptionCount":500,"customHtmlInject":"[]","availablePoints":null,"showTransactionHistory":true,"showLoyaltyOptOut":false,"loyaltyOptoutActive":null,"loyaltyOptoutInactive":null,"createAccountLink":"","showReferralSection":true,"showRewardSection":true,"showRedeemSection":true,"showEarnSection":true,"showFAQSection":true,"showVIPSection":true,"showHowItWorksSection":true,"vipTierBenefits":null,"enrollLoyaltyProgramTitle":null,"enrollLoyaltyProgramDescription":null,"freeProductRewardAddToCart":null,"freeProductRewardAddedSuccessMessage":null,"enrolledSuccessMessage":null,"customFontUrl":"","visitedIcon":"","allowWidgetOnSpecificPages":null,"referralRedirectUrl":"","showRangeForRedeemPoints":false,"hideAppstleLoaderIcon":false,"hideFreeProductDropdownProductTitle":false,"showToLoggedInCustomerOnly":false,"enableMetaTagForNoIndexing":false,"waysToEarnIcon":"","waysToRedeemIcon":"","loaderIcon":"","toastPosition":"bottom-center","widgetDateTimeFormat":"MMM D, YYYY, h:mm A","toastErrorMsg":null,"primaryDedicatedPageBackgroundColor":"#141614","secondaryDedicatedPageBackgroundColor":"#ffffff","titleCount":60,"programUpdateMessage":null,"primaryDedicatedPageSectionBackgroundColor":"#F2F8FF","secondaryDedicatedPageSectionBackgroundColor":"#FFFFFF","primaryDedicatedPageV2SectionBackgroundColor":null,"secondaryDedicatedPageV2SectionBackgroundColor":null,"primaryDedicatedPageV2BackgroundColor":null,"secondaryDedicatedPageV2BackgroundColor":null,"primaryDedicatedPageV2TextColor":null,"secondaryDedicatedPageV2TextColor":null,"dedicatedPageV2BorderColor":null,"dedicatedPageV2BorderRadius":"8px","dedicatedPageV2CardGap":"1.25rem","dedicatedPageV2SectionPadding":null,"refreshOnAddToCart":false,"showTierName":false,"customSignInLink":"","checkoutRedeemLoginDescription":null,"checkoutRedeemLoginURL":"","checkoutTotalAcquirePoints":null,"checkoutTotalAcquirePointsDescription":null,"reachVipMileStoneType":"TOTAL_AMOUNT","showCustomerHistoryDescriptionToolTip":false,"checkoutTotalStoreCreditAcquirePoints":null,"hideRulesForLoggedOutCustomer":false,"hideCheckoutBlockLoggedOutCustomers":false,"checkoutAllowedCustomerTags":"","checkoutRe
3054strictCustomerTags":"","hideWidgetLauncherOnMobile":true,"referringCustomerRewardIcon":"","referredCustomerRewardIcon":"","referralClaimGiftIcon":null,"hideToastNotification":false,"dateLocalFormat":"DEFAULT","manageLoyaltyButtonUrl":"","rewardsDetailsExpireDate":null,"hideEarnRuleSectionOnEmpty":true,"hideRedeemRuleSectionOnEmpty":true,"hideStoreCreditsBalance":false,"hidePointsBalance":false,"popupButtonHoverColor":"#e5cbb4","hideWidgetOnScroll":true,"loyaltyPageMetaTitle":"","loyaltyPageMetaDescription":"","hideExpirationDate":true,"disableLoyaltyBlocks":false,"loadScriptOnlyOnDedicatedPage":false,"hideFaqSection":false,"enableAcquirePointsQuantitySelector":false,"showCartRedeemWidget":true,"cartWidgetSelector":"","cartDrawerRedeemWidgetSelector":"","cartWidgetPlacement":"BEFORE","cartWidgetRewardIcon":"","cartDrawerWidgetPlacement":"BEFORE","dedicatedPageType":"DEDICATED_PAGE_V2","secondaryDedicatedPageTextColor":"#4b5563","primaryDedicatedPageTextColor":"#818cf8","displayMethod":"TEXT_ICON","launcherDataType":"POINTS","widgetBackgroundImage":"","hideVipTierName":false,"enableEnhancedV2Styling":true,"applyDiscountCodeOnRedeem":false,"dedicatedPageSectionOrders":"[\n  {\n    \"i
3054d\": \"hero\",\n    \"title\": \"Hero\",\n    \"visible\": true\n  },\n  {\n    \"id\": \"howItWorks\",\n    \"title\": \"How It Works\",\n    \"visible\": true\n  },\n  {\n    \"id\": \"rewards\",\n    \"title\": \"Rewards\",\n    \"visible\": true\n  },\n  {\n    \"id\": \"waysToEarn\",\n    \"title\": \"Ways To Earn\",\n    \"visible\": true\n  },\n  {\n    \"id\": \"waysToRedeem\",\n    \"title\": \"Ways To Redeem\",\n    \"visible\": true\n  },\n  {\n    \"id\": \"vipProgram\",\n    \"title\": \"Vip Program\",\n    \"visible\": true\n  },\n  {\n    \"id\": \"referralProgram\",\n    \"title\": \"Referral Program\",\n    \"visible\": true\n  },\n  {\n    \"id\": \"transactionHistory\",\n    \"title\": \"Transaction History\",\n    \"visible\": true\n  },\n  {\n    \"id\": \"faqs\",\n    \"title\": \"Faqs\",\n    \"visible\": true\n  }\n]","disableRuleCollapsible":false,"referralCustomRedirectUrl":null,"selectApplyRewardsDefault":false,"exploreButtonCustomRedirect":null,"heroBackgroundMobileImage":null,"loggedOutFlagAcquirePoints":false};
3055    
3056
3057    
3058
3059    
3060    
3061    _ALConfig.assetRev = "168943b48077506c960191af3cad782d";
3062    
3063    _ALConfig.storeFrontApiVersion = "2026-01";
3064    _ALConfig.__appstleLoyaltyNativeFetch = window.fetch.bind(window);
3065
3066    
3067    _ALConfig.pointsExpirationSetting = null;
3068    
3069
3070    
3071
3072
3073    
3074    _ALConfig.showStoreCreditRewards = false;
3075    
3076
3077    
3078    _ALConfig.customerId = null;
3079    _ALConfig.customerName = '';
3080    _ALConfig.customerEmail = null;
3081    _ALConfig.customerStoreCreditBalance = null;
3082    _ALConfig.customerStoreCreditCurrency = null;
3083    _ALConfig.customerTags = [];
3084    _ALConfig.customerLoyalty = null;
3085    
3086
3087    
3088    _ALConfig.shop = "mooncat-crystals.myshopify.com";
3089    _ALConfig.shopMoneyFormat = "${{amount}}";
3090    _ALConfig.shopMoneyFormatWithCurrencyFormat = "${{amount}} USD";
3091    
3092
3093    
3094    
3095        _ALConfig.enableInactiveCustomer = true;
3096    
3097
3098    
3099    _ALConfig.allowCustomerOptIn = false;
3100    
3101
3102    
3103    _ALConfig.enableDiscountToApplyAutomatically = true;
3104    
3105
3106    
3107        _ALConfig.hasDedicatedPageAccess = false;
3108    
3109
3110    
3111        _ALConfig.themeEditorMode = false;
3112    
3113
3114    
3115    _ALConfig.shop_labels = {"popupRewardsDetailsHeadingText":"Your Rewards","rewardsExpirationLabel":"{{day}}d","acquirePointsLabel":"🛍️ Earn {{totalPoints}} points when you buy this item","checkoutPendingPointsLabel":"with {{pendingPoints}} pending points.","homeSignup":"Sign up to \u003cstrong\u003e{{site_name}}'s store \u003c\/strong\u003e to start earning rewards","vipSpentAmountLabel":"Spent {{amount}}","minimumPointsForRedeemText":"Minimum {{points}} points required for point redemption","checkoutAcquiredPointsLabel":"You have acquired {{acquiredPoints}} points from this order","cartWidgetLoginMessageLabel":"Log in to redeem your points for rewards.","popupDiscountCodeGenerated":"Use the below coupon to get your discount.","checkoutDiscountCodeApplyButtonLabel":"Apply","loyaltyPageHeroV2Heading":"Exclusive Rewards Just for You","availablePoints":"Available points {{ points }}","otherRulesRedirectActionLabel":"Claim","currentVipTierBadgeLabel":"You are a {{current_tier}} member","checkoutAvailableRewardsLabel":"Your Rewards","popupCopiedDiscount":"Applied","referralFriendGetText":"They","cartWidgetRewardsButtonLabel":"Rewards","popupReferralContentText":"Give your friends a reward and claim your own when they make a purchase.","storeCreditApplyGuideLabel":"Your Store Credit is ready at checkout—make sure the 'Apply store credit' checkbox is checked and verify the amount you're using.","storeCreditBalanceLabel":"Your Crystal Cash (Valid 12\/26-1\/15\/25)","faq":"[{\"title\":\"What is the rewards program? \",\"content\":\"\u003cp\u003eIt’s a simple way to earn points every time you shop or take part in certain activities on the site. When you create an account, your points start tracking automatically. You can redeem them for free gifts and more. It's totally free to join and the more points you earn over time, the more rewards you can unlock.\u003c\/p\u003e\"},{\"title\":\"How do I earn points?\",\"content\":\"\u003cp\u003eYou earn points when you shop and through certain activities on the site, like referrals or leaving verified reviews. You can see every earning option listed under the \u003cem\u003eWays to Earn\u003c\/em\u003e section in your rewards dashboard: https:\/\/mooncatcrystals.com\/apps\/loyalty\u003c\/p\u003e\"},{\"title\":\"What is Crystal Cash? \",\"content\":\"\u003cp\u003eCrystal Cash is store credit you earn during special promo times.\u003c\/p\u003e\u003cp\u003e\u003cbr\u003e\u003c\/p\u003e\u003cp\u003eHere’s how it works:\u003c\/p\u003e\u003cp\u003e\u003cbr\u003e\u003c\/p\u003e\u003cul\u003e\u003cli\u003eCrystal Cash is a limited-time coupon you can spend like cash on a future order\u003c\/li\u003e\u003cli\u003eCrystal Cash only w
3115orks during the dates listed.\u003c\/li\u003e\u003cli\u003eIf your order costs less than your Crystal Cash balance, the extra stays in your account until it expires (or until you use it ;)).\u003c\/li\u003e\u003cli\u003eYou can’t choose to use only part of your Crystal Cash once you apply it.\u003c\/li\u003e\u003cli\u003eAny unused Crystal Cash expires after the redemption period ends.\u003c\/li\u003e\u003c\/ul\u003e\u003cp\u003e\u003cbr\u003e\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eCrystal Cash is only valid during the dates stated. If you do not use it during the stated redemption period, it will be forfeited and removed from your account. \u003c\/strong\u003e\u003c\/p\u003e\"},{\"title\":\"How do I redeem my points?\",\"content\":\"\u003cp\u003eGo to the \u003cem\u003eWays to Redeem\u003c\/em\u003e section in your rewards dashboard. You’ll see all available rewards and the points needed for each one. If you have enough points, you can redeem the reward and apply it at checkout. \u003c\/p\u003e\u003cp\u003e\u003cbr\u003e\u003c\/p\u003e\u003cp\u003ehttps:\/\/mooncatcrystals.com\/apps\/loyalty\u003c\/p\u003e\"},{\"title\":\"Is there a limit to the number of points I can earn?\",\"content\":\"\u003cp\u003eNope! Go ahead and earn as many as you can...and then be sure to use them :) \u003c\/p\u003e\"},{\"title\":\"What do the 'approved', 'pending' and 'cancelled' statuses mean?\",\"content\":\"\u003cp\u003eApproved: These points can be redeemed on rewards immediately.\u003c\/p\u003e\u003cp\u003ePending: These points need to be verified before you can redeem them. This typically applies to purchases and referrals.\u003c\/p\u003e\u003cp\u003eCancelled: These points will not be added to your account. For example, this will happen if you cancel a purchase (the points will change from pending to cancelled)\u003c\/p\u003e\"}]","dynamicPointsLabel":"Enter Points","loyaltyOptOutLabel":"Loyalty Program Updated","enrollLoyaltyProgramTitle":"Enroll in Our Rewards Program","howItWorksTitleDescription":"","rewardDetailsHelpLabel":"Use the below coupon to get your discount","popupCopyDiscount":"Apply Code","howItWorksStep2Description":"Complete these activities to collect points","vipStatusLabel":"VIP Status","pendingStatusLabel":"Pending","checkoutTotalStoreCreditAcquirePoints":"Complete this purchase to earn up to {{totalStoreCreditPoints}} in Crystal Cash (redeemable 12\/26\/25 - 1\/15\/26 only)","acquirePointsLoggedOutText":"Loyalty Members earn {{totalPoints}} points when they purchase this item.","sendEmailHeadingText":"Send Referral Link","enrollLoyaltyProgramActionLabel":"Enroll Now","freeProductRewardAddedSuccessMessage":"Added to cart","cartWidgetLoginLinkLabel":"Log in","popupFAQHeadingText":"FAQ's","widgetTitle":"Rewards","claimReferralEmailFieldHintText":"Note: To redeem your reward, please create an account using the same email address.","checkoutToggleRedeemButtonLabel":"Redeem Rewards","rejectedStatusLabel":"Rejected","checkoutViewMoreDiscountCodeButtonLabel":"View More","perTransactionLimitExceedText":"Per transaction limit exceed. Cannot redeem more then {{shop_redeem_limit}} points","pointsBalanceLabel":"Your point balance: {{points}}","vipTierBenefits":"Benefits","popupRedeemRewardsHeadingText":"Redeem Rewards","vipRewardLabel":"Rewards","sendEmailButtonText":"Send Email","cartWidgetAvailableBalanceLabel":"You have: {{available_points}} points","checkoutRedeemLabel":"Redeem your Points","referredByText":"Referred by someone","loyaltyPageMetaTitle":"","birthdayActionLabel":"Submit","rewardDetailsButtonLabel":"Reward Details","popupReferralTitleText":"Referrals","popupEarnRewardsHeadingText":"Earn Rewards","popupAvailableRewardsContentText":"You have {{rewards}} rewards available","claimedStatusLabel":"Claimed","redeemActionLabel":"Redeem","checkoutRedeemLoginLabel":"Log in","createAccountLabel":"Join now","rewardDetailsTitleLabel":"Spend {{spend_amount}} and , get {{discount_amount}} {{discount_type}} discount","howItWorksTitle":"How it works","claimGiftHeaderText":"Claim Your Gift","yourReferralsHeadingLabel":"Your Referrals","noRefferralAvailableText":"No Referrals reward available","popupCardActionText":"Sign In","popupFAQAskedQuestionHeadingText":"Frequently Asked Questions","popupEarnTilesText":"Ways to earn","minimumAmountSpentForRedeemText":"Minimum {{amount_spent}} spent amount required for point redemption","birthdayUpdatedToastLabel":"Birthday Updated","historyPointsAdjustment":"Points\/Crystal Cash","referButtonLabel":"Refer Now","claimReferralGiftButtonText":"Claim Your Gift","historyActivityDetails":"Activity Details","widgetCopiedLabel":"Copied","sentDiscountCodeToEmailText":"Referral invitation accepted.","referralCustomerGetText":"You","popupRemainingPointsHeadingText":"Your Points","referralLinkSentLabel":"Referral Link Sent","birthdayTitleLabel":"Enter your birthday","checkoutSelectRedeemRuleDropdownLabel":"Select Redeem Rule","noRedeemRulesLabel":"No Redeem Rules Found","minimumOrderCountForRedeemText":"Minimum {{order_count}} orders required for point redemption","enrolledSuccessMessage":"Enrolled Successfully","customerHistoryLabel":"Transaction history","redeemLimitExceedText":"Redeem Limit Exceed. Cannot redeem more then {{redeem_limit}} times per {{reward_interval}}","widgetDateTimeFormat":"MMM D, YYYY, h:mm A","pointExpirationDateLabel":"Expiration date: {{expiration_date}}","popupRedeemTilesText":"Ways to redeem","loyaltyOptOutSettingsLabel":"Settings","alreadyHaveAnAccountLabel":"Already have an account?","checkoutTotalAcquirePointsDescription":"Use your points to redeem a discount on your next order.","checkoutEmptyRewardsLabel":"You don't have any rewards available.","popupRewardPointContentText":"Earn points for different actions and turn those points into awesome rewards!","chooseAnOptionLabel":"Choose an Option","noEarnRulesLabel":"No Earn Rules Found","emailValidationLabel":"Please provide a valid email","historyDate":"Date","popupAvailableRewardsHeadingText":"Your Rewards","customerHistoryDescriptionLabel":"See the list of your points\/credits earned and redeemed activity.","totalAcquiredStoreCreditsLabel":"You have earned {{currency}}{{totalStoreCreditPoints}} store credits on this order","claimReferralEmailFieldText":"Enter your email","subscribeRuleRedirectActionLabel":"Subscribe","loyaltyPageMetaDescription":"","claimRewardButtonLabel":"Claim Reward","checkoutRedeemLoginDescription":"to check your points balance and explore the rewards available for redemption.","howItWorksStep2Title":"Earn points","loyaltyStatusLabel":"Loyalty Status","vipEarnPointLabel":"Earn {{points}} Points","vipCurrentTierLabel":"Your Current Tier","storeOnSaleForRedeemText":"Store on sale, to redeem point please try after {{shop_on_sale_end_date}}","popupCardHeadingText":"Access your rewards","loyaltyPageHeroV2SubHeading":"Become a member and earn points, Crystal Cash \u0026amp; exclusive rewards every time you shop.","checkoutToggleAvailableRewardsButtonLabel":"Available Discounts","manageLoyaltyButtonLabel":"Manage Loyalty","howItWorksStep1Title":"Create an account","shareReferralLinkLabel":"Share Your Unique Link","popupWelcomeText":"Welcome {{customer_first_name}}","referYourFriendContentText":"When friends and family check out using the referral link below, they receive {{referred_reward}} and you receive a {{referral_reward}} reward","vipAchievableTierLabel":"{{milestone_type}} {{milestone}} to reach {{achievable_tier}}","shareSocialMediaLabel":"Share directly on your favorite platform:","homeGreetings":"Welcome, {{customer_first_name}}","loyaltyOptOutActiveLabel":"Loyalty program {{active_status}}.","dailyLimitExceedText":"Daily limit exceed. Cannot redeem more than {{redeem_limit}} points per day","popupCardContentText":"Sign in to \u003cstrong\u003e{{site_name}}'s store \u003c\/strong\u003e to start earning rewards","rewardsDetailsExpireDate":"Expires at: {{expire_date}}","enrollLoyaltyProgramDescription":"Enroll our loyalty program to get rewards and incentives.","loyaltyPageHeroV2AuthenticatedHeading":"Hi, {{customer_first_name}}! You have {{points}} points and {{store_credits}} in Crystal Cash","minimumRedeemRequiredPointsLabel":"","vipTierDetailsText":"Your all access pass to exclusive rewards. Reach higher tiers for more exclusive perks.","membershipRewardTitleLabel":"Rewards","howItWorksStep1Description":"Become a member to receive rewards","historyStatus":"Status","approvedStatusLabel":"Approved","acquireStoreCreditLabel":"🛍️ Earn ${{totalStoreCreditPoints}} in Crystal Cash when you buy this item (redeemable 12\/26\/25 - 1\/15\/26 only)","toastErrorMsg":"Something went wrong","checkThankYouAcquiredPointsHeadingLabel":"Congratulations","popupCommunityContentText":"with your purchases \u0026amp; more!","currentVipTierText":"Your Current Tier","popupRewardPointTitleText":"Earn Rewards","socialMediaActionLabel":"Claim","howItWorksStep3Description":"Exchange points for exciting discounts","noCustomerHistoryLabel":"No History Found","freeProductRewardAddToCart":"Add to cart","creditRe
3115wardDetailsHelpLabel":"Apply these credits on the order page to get a discount on your purchase!","shareReferralEmailFieldText":"Enter your friend's email","vipTierTitleLabel":"VIP","referralCompletedText":"{{total_count}} referrals completed","reviewRuleRedirectActionLabel":"Review","referYourFriendTitleText":"Refer your friends","popupEarnPointDescriptionText":"Earn more points, and turn those points into awesome rewards!","popupCommunityHeadingText":"Earn Crystal Points","recurringStatusLabel":"Recurring","claimReferralGiftDescriptionText":"Someone has sent you a gift. Enter your email to claim it now.","programUpdateMessage":"Process initiated. Please wait for the page to reload","dynamicPointsHelpText":"Spend {{points}} points to get {{discount}} discount.","totalAcquiredPointsLabel":"You have earned {{totalAcquiredPoints}} points on this order","howItWorksStep3Title":"Redeem points","checkoutTotalAcquirePoints":"Complete this purchase to earn up to {{totalAcquiredPoints}} points"};
3116    
3117
3118    var loyaltyGlobalStyles = `<style>
3119body {
3120margin: 0
3121}
3122.appstle-loyalty-hidden {
3123display: none !important;
3124visibility: hidden !important;
3125}
3126</style>`
3127    document.querySelector('body').insertAdjacentHTML('beforeend', loyaltyGlobalStyles);
3128
3129    window.addEventListener('message', appstleLoyaltyIframeListener, false);
3130    window.addEventListener('kp_user_logged_out', function() { window.location.reload(); });
3131    const removeFirstSlashFromURL = (url) => url ? url?.replace(/\\\//g, "/")?.replace(/^\/+/, "") : url;
3132
3133
3134    function applyDiscount(discountCode, shouldReload = false) {
3135        const encodedDiscountCode = encodeURIComponent(discountCode?.trim());
3136        const discountURL = `${location?.origin}/discount/${encodedDiscountCode}`;
3137        fetch(discountURL).then(res => {
3138            if (res.ok) {
3139                console.log('Discount Code Applied');
3140                const discountDetails = window?._ALConfig?.customerLoyalty?.rewards?.find((item) => item?.discountCode === discountCode) || null;
3141                if (discountCode && discountDetails) {
3142                    const discountData = {discountCode: discountCode || discountDetails?.discountCode, description: discountDetails?.description, customerId: discountDetails?.customerId}
3143                    document.dispatchEvent(new CustomEvent('AppstleLoyalty:AppliedDiscountCode', { detail: discountData }));
3144                    window.dispatchEvent(new CustomEvent('AppstleLoyalty:AppliedDiscountCode', { detail: discountData }));
3145                }
3146                if (shouldReload) {
3147                    window.location.reload();
3148                }
3149            } else {
3150                console.log('Discount Code NOT Applied');
3151            }
3152        });
3153    }
3154    const applyDiscountAutomatically = (discountCode, shouldReload = false) => {
3155        (async () => {
3156            const encodedDiscountCode = encodeURIComponent(discountCode?.trim());
3157            const discountURL = `${location.origin}/checkout?discount=${encodedDiscountCode}`;
3158            const cartURL = `${location.origin}/cart.js`;
3159            try {
3160                const discountRes = await fetch(discountURL);
3161                if(discountRes) {
3162                    const cartRes = await fetch(cartURL);
3163                    if (!cartRes.ok) return;
3164                    const cart = await cartRes.json();
3165                    const discount_codes = cart && Array.isArray(cart?.['discount_codes']) ? cart?.['discount_codes'] : [];
3166                    const hasDiscount = discount_codes.some(d => (d?.code || "").toLowerCase() === String(discountCode).toLowerCase());
3167                    if (hasDiscount && shouldReload) {
3168                        window.location.reload();
3169                    }
3170                }
3171            } catch (err) {
3172                console.error("Error applying discount:", err);
3173            }
3174        })();
3175    };
3176
3177    const unescapeWidgetString = (str) => {
3178        if (!str || typeof str !== 'string') return '';
3179        return str?.replace(/\\\//g, '/')?.replace(/\\\\/g, '\\');
3180    };
3181    // Resolves a market-aware account URL. Prefers the routes published above so the customer keeps
3182    // their market/language prefix; the shop root fallback keeps that prefix too when a single route
3183    // entry is blank. Safe to assign to location.href as-is - with new customer accounts Shopify
3184    // returns an absolute URL here, so never prefix an origin.
3185    const loyaltyAccountRoute = (key, fallbackPath) => {
3186        const route = _ALConfig?.routes?.[key];
3187        if (route) return route;
3188        const shopRoot = _ALConfig?.routes?.root_url || window?.Shopify?.routes?.root || '/';
3189        return (shopRoot?.replace(/\/+$/, '') ?? '') + fallbackPath;
3190    };
3191
3192    // Shopify's /customer_authentication/login answers 400 Bad Request unless return_to is a
3193    // store-relative path with one leading slash, so coerce `return_to=apps/loyalty`,
3194    // `return_to=collections/all` or a same-store absolute URL into that shape.
3195    const normalizeLoyaltyReturnTo = (link) => {
3196        const match = /([?&]return_to=)([^&#]*)/i.exec(link || '');
3197        // Only Shopify's own login route on this store - a third-party login app may legitimately want an absolute return_to.
3198        if (!match || !/(^|\/)customer_authentication\//i.test(link.slice(0, match.index))) return link;
3199        if (/^(https?:)?\/\//i.test(link)) {
3200            try {
3201                if (new URL(link, window.location.origin).host !== window.location.host) return link;
3202            } catch (e) {
3203                return link;
3204            }
3205        }
3206        let value = match[2];
3207        try {
3208            for (let i = 0; i < 2 && /%[0-9a-f]{2}/i.test(value); i++) value = decodeURIComponent(value);
3209        } catch (e) {
3210            return link;
3211        }
3212        value = value.trim();
3213        if (/^(https?:)?\/\//i.test(value)) {
3214            try {
3215                const parsed = new URL(value, window.location.origin);
3216                if (parsed.host !== window.location.host) return link;
3217                value = parsed.pathname + parsed.search + parsed.hash;
3218            } catch (e) {
3219                return link;
3220            }
3221        }
3222        value = '/' + value.replace(/^\/+/, '');
3223        return link.slice(0, match.index) + match[1] + encodeURIComponent(value) + link.slice(match.index + match[0].length);
3224    };
3225
3226    const formatUrlByLoyalty = (link) => {
3227        if (!link) return '';
3228        const decodedLink = decodeURIComponent(link);
3229        const loyaltyPagePath = '/' + (_ALConfig?.hasDedicatedPageAccess ? _ALConfig?.proxy_path_prefix || 'apps/loyalty' : '');
3230        let l = decodedLink?.replace("{{proxy_path_prefix}}", loyaltyPagePath)?.trim()?.replace(/\\\//g, '/')?.replace(/^\/+/, '') || '';
3231        l = normalizeLoyaltyReturnTo(l?.replace(/([^:]\/)\/+/g, '$1') ?? '');
3232        if (/^(https?:\/\/|\/\/|www\.)/i.test(l)) {
3233            return /^www\./i.test(l) ? 'https://' + l : l;
3234        }
3235        const shopRoot = window?.Shopify?.routes?.root ?? '/';
3236        return (shopRoot?.replace(/\/+$/, '') ?? '') + '/' + l;
3237    };
3238
3239    function isAppstleLoyaltyMessage(event) {
3240        if (event.origin !== window.location.origin) return false;
3241        return event.source === window || ['appstle_loyalty_iframe', 'appstle_loyalty_cart_widget_iframe'].some(id => {
3242            const frame = document.getElementById(id);
3243            return frame && event.source === frame.contentWindow;
3244        });
3245    }
3246
3247    const loyaltyLabelHtmlPolicy = {
3248        ALLOWED_TAGS: ['a', 'b', 'blockquote', 'br', 'button', 'center', 'div', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'li', 'ol', 'p', 's', 'small', 'span', 'strong', 'sub', 'sup', 'u', 'ul'],
3249        ALLOWED_ATTR: ['alt', 'class', 'height', 'href', 'loading', 'rel', 'src', 'style', 'target', 'title', 'width'],
3250        ALLOW_DATA_ATTR: false,
3251        ALLOW_ARIA_ATTR: false
3252    };
3253    const escapeLoyaltyAttribute = value => String(value ?? '').replace(/[&<>"']/g, char => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[char]));
3254    const loyaltyNavigationUrl = value => {
3255        if (typeof value !== 'string' || !value.trim()) return null;
3256        try {
3257            const url = new URL(value, window.location.href);
3258            return ['https:', 'http:'].includes(url.protocol) && !url.username && !url.password ? url : null;
3259        } catch {
3260            return null;
3261        }
3262    };
3263    // Follow the Bundles rich-label declaration filter, preserving native storefront layout
3264    // (relative offsets, negative margins and transforms) that the merchant already configures.
3265    const sanitizeLoyaltyLabelStyle = styleText => {
3266        const allowedProperty = /^(?:color|opacity|visibility|cursor|display|order|columns|aspect-ratio|box-shadow|box-sizing|line-height|letter-spacing|white-space|vertical-align|accent-color|caret-color|appearance|width|height|position|top|right|bottom|left|transform|(?:background|border(?!-image)|outline|font|text|margin|padding|flex|align|justify|place|grid|gap|row-gap|column|overflow|transition|list-style|word|min|max|object)(?:-[a-z]+)*)$/;
3267        const unsafeValue = /[{}<>\\]|\b(?:url|attr|env|image|image-set|element|src|expression)\s*\(/i;
3268        return String(styleText ?? '').split(';').filter(declaration => {
3269            const separator = declaration.indexOf(':');
3270            if (separator < 0) return false;
3271            const property = declaration.slice(0, separator).trim().toLowerCase();
3272            const value = declaration.slice(separator + 1).trim();
3273            return (allowedProperty.test(property) || /^--[a-z0-9_-]+$/i.test(property)) && value && !unsafeValue.test(value)
3274                && (property !== 'position' || /^(?:relative|static)$/i.test(value));
3275        }).join(';');
3276    };
3277    const sanitizeLoyaltyLabel = (value, purifier, allowLinks = true) => {
3278        if (!purifier) return escapeLoyaltyAttribute(value);
3279        const fragment = purifier.sanitize(String(value ?? ''), {
3280            ...loyaltyLabelHtmlPolicy,
3281            FORBID_TAGS: allowLinks ? [] : ['a', 'button'],
3282            RETURN_DOM_FRAGMENT: true
3283        });
3284        fragment.querySelectorAll('[href], [src]').forEach(element => {
3285            for (const attribute of ['href', 'src']) {
3286                if (element.hasAttribute(attribute) && !loyaltyNavigationUrl(element.getAttribute(attribute))) element.removeAttribute(attribute);
3287            }
3288        });
3289        fragment.querySelectorAll('[style]').forEach(element => {
3290            const style = sanitizeLoyaltyLabelStyle(element.getAttribute('style'));
3291            if (style) element.setAttribute('style', style);
3292            else element.removeAttribute('style');
3293        });
3294        fragment.querySelectorAll('[target]').forEach(element => {
3295            if (element.tagName !== 'A' || !['_blank', '_self'].includes(element.getAttribute('target'))) element.removeAttribute('target');
3296            else if (element.getAttribute('target') === '_blank') {
3297                const rel = new Set((element.getAttribute('rel') || '').split(/\s+/).filter(Boolean));
3298                rel.add('noopener');
3299                element.setAttribute('rel', [...rel].join(' '));
3300            }
3301        });
3302        fragment.querySelectorAll('button').forEach(button => button.setAttribute('type', 'button'));
3303        const container = document.createElement('div');
3304        container.appendChild(fragment);
3305        return container.innerHTML;
3306    };
3307    let loyaltyHtmlSanitizer;
3308    window.appstleLoyaltyLoadSanitizer = () => loyaltyHtmlSanitizer ||= new Promise(resolve => {
3309        if (window.DOMPurify) return resolve(window.DOMPurify);
3310        const script = document.createElement('script');
3311        script.src = 'https://cdn.jsdelivr.net/npm/[email protected]/dist/purify.min.js';
3312        script.integrity = 'sha384-46dPGH1XlTmj7bc50bqLjTdORXs/3EP2QpA/6EWbelYWOY9VGp+87RT61S3Mcslb';
3313        script.crossOrigin = 'anonymous';
3314        const settle = purifier => {
3315            clearTimeout(timeout);
3316            resolve(purifier);
3317        };
3318        const timeout = setTimeout(() => settle(null), 8000);
3319        script.onload = () => settle(window.DOMPurify);
3320        script.onerror = () => settle(null);
3321        document.head.appendChild(script);
3322    });
3323
3324    function appstleLoyaltyIframeListener(event) {
3325        if (!isAppstleLoyaltyMessage(event)) return;
3326        const redirect = (link, fallback) => {
3327            try {
3328                const destination = link ? formatUrlByLoyalty(link) : fallback;
3329                const url = new URL(destination, window.location.origin);
3330                if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password) return;
3331                window.location.href = destination;
3332            } catch (e) {}
3333        };
3334        if (event.data === 'appstle_loyalty_message_to_redirect_to_account') {
3335            if (!_ALConfig?.widget_setting?.customSignInLink && typeof kpHandleLogin === 'function') {
3336                kpHandleLogin(window.location.href);
3337            } else {
3338                redirect(_ALConfig?.widget_setting?.customSignInLink, loyaltyAccountRoute('account_url', '/account'));
3339            }
3340        } else if (event.data === 'appstle_message_to_redirect_to_signup') {
3341            if (typeof kpHandleLogin === 'function') {
3342                kpHandleLogin(window.location.href);
3343            } else {
3344                redirect(null, loyaltyAccountRoute('account_register_url', '/account/register'));
3345            }
3346        } else if (event?.data && event?.data?.type === 'appstle_message_to_redirect_to_after_copied_discount_redirect_url' && typeof event?.data?.value === 'string') {
3347            try {
3348                const redirectUrl = new URL(event.data.value, window.location.origin);
3349                if (redirectUrl.origin !== window.location.origin || !['http:', 'https:'].includes(redirectUrl.protocol) || redirectUrl.username || redirectUrl.password) return;
3350                window.location.href = redirectUrl.href;
3351            } catch (e) {
3352                return;
3353            }
3354        } else if (event.data === 'appstle_message_to_redirect_to_custom_url') {
3355            redirect(_ALConfig?.widget_setting?.createAccountLink, loyaltyAccountRoute('account_register_url', '/account/register'));
3356        } else if (typeof event.data === 'string') {
3357            const parts = event.data.split('|');
3358            if (parts.length !== 2 || !parts[1].trim()) return;
3359            const [command, discountCode] = parts;
3360            if (command === 'appstle_message_to_apply_discount_and_reload') applyDiscount(discountCode, true);
3361            else if (command === 'appstle_message_to_apply_discount') applyDiscount(discountCode, false);
3362            else if (command === 'appstle_message_to_automatic_apply_discount_and_refresh') applyDiscountAutomatically(discountCode, true);
3363            else if (command === 'appstle_message_to_automatic_apply_discount') applyDiscountAutomatically(discountCode, false);
3364        }
3365    }
3366
3367    
3368    
3369    
3370    
3371    
3372    
3373    
3374
3375    
3376
3377    const executeLoyaltyWidget = () => {
3378        <!-- BEGIN app snippet: loyalty-widget -->
3379    const parseHtmlStringContent = (content) => {
3380        if (typeof content !== 'string') return content;
3381        try {
3382            const htmlDecoded = content?.replace(/\\\//g, '/');
3383            return JSON.parse(`"${htmlDecoded}"`);
3384        } catch (error) {
3385            console.error('Error parsing content:', error);
3386            return content;
3387        }
3388    };
3389
3390    const formatNumberByPointRoundType = num => {
3391        if (typeof num !== 'number') return num;
3392        const roundType = _ALConfig?.pointRoundType || "NO_ROUND";
3393        const rounded = roundType === 'ROUND_UP' ? Math.ceil(num) : roundType === 'ROUND_DOWN' ? Math.floor(num) : num;
3394        return (Number.isInteger(rounded) || rounded % 1 === 0) ? rounded.toFixed(0) : rounded.toFixed(2);
3395    };
3396
3397    const formatStoreCreditAmount = value => {
3398        try {
3399            const num = Number(value);
3400            const safe = Number.isFinite(num) ? num : 0;
3401            const format = (_ALConfig?.shopMoneyFormat || '')?.replace(/&lt;/g, '<')?.replace(/&gt;/g, '>')?.replace(/<[^>]*>/g, '');
3402            const tokenMatch = String(format)?.match?.(/\{\{\s*(amount[a-z_]*)\s*\}\}/i);
3403            const token = (tokenMatch?.[1] || 'amount')?.toLowerCase?.() || 'amount';
3404            const decimals = token?.includes?.('no_decimals') ? 0 : 2;
3405            let thousands = ',', decimal = '.';
3406            if (token?.includes?.('comma_separator')) { thousands = '.'; decimal = ','; }
3407            else if (token?.includes?.('space_separator')) { thousands = ' '; }
3408            else if (token?.includes?.('apostrophe_separator')) { thousands = "'"; }
3409            const sign = safe < 0 ? '-' : '';
3410            const parts = Math.abs(safe)?.toFixed?.(decimals)?.split?.('.') || [];
3411            const intPart = (parts?.[0] || '0')?.replace?.(/\B(?=(\d{3})+(?!\d))/g, thousands) || '0';
3412            const amount = decimals === 0 ? sign + intPart : sign + intPart + decimal + (parts?.[1] || '00');
3413            return tokenMatch ? format?.replace(/\{\{\s*amount[a-z_]*\s*\}\}/gi, amount)?.trim() : amount;
3414        } catch (e) {
3415            return String(value ?? '0');
3416        }
3417    };
3418
3419
3420    const loyaltyWidgetStyles = `
3421.appstle-loyalty-widget-close-icon {
3422width: 28px;
3423height: 28px;
3424opacity: 0;
3425position: absolute;
3426top: 50%;
3427left: 50%;
3428transform: translate(-50%, -50%);
3429transition: opacity 0.2s;
3430}
3431
3432.appstle-loyalty-button {
3433bottom: 24px;
3434z-index: 999;
3435border-radius: 12px;
3436position: fixed;
3437border: none;
3438transition: max-width 1s;
3439padding: 0 19px;
3440overflow: hidden;
3441height: 56px;
3442transform-origin: left;
3443max-width: 300px;
3444background-color: ${_ALConfig?.widget_setting?.widgetBackgroundColor || 'rgb(29, 78, 216)'};
3445color: ${_ALConfig?.widget_setting?.widgetTextColor || 'white'};
3446}
3447
3448.appstle-loyalty-right {
3449right: 40px;
3450}
3451
3452.appstle-loyalty-left {
3453left: 40px;
3454}
3455
3456#appstle_loyalty_iframe {
3457width: 1px;
3458min-width: 400px;
3459border: none;
3460height: 516px;
3461position: fixed;
3462bottom: 100px;
3463z-index: 1234567;
3464box-shadow: 0 4px 6px -1px rgb(0 0 0 / 10%), 0 2px 4px -2px rgb(0 0 0 / 10%);
3465background-color: white;
3466border-radius: 12px;
3467max-height: calc(100vh - 120px);
3468transform: scale(0) !important;
3469transition: all 0.5s;
3470transform-origin: bottom  left ;
3471max-width: 80vw;
3472}
3473
3474@media screen and (max-width: 800px) {
3475#appstle_loyalty_iframe {
3476left: 0;
3477height: 100vh;
3478top: 0;
3479min-width: 100%;
3480}
3481
3482#appstle_loyalty_iframe.open + .appstle-loyalty-button {
3483left: 50%;
3484transform: translateX(-50%);
3485}
3486
3487.appstle-loyalty-button {
3488transition: all 0.5s;
3489}
3490}
3491
3492#appstle_loyalty_iframe.open {
3493transform: scale(1) !important;
3494}
3495
3496#appstle_loyalty_iframe.open.show-close-icon + button .appstle-loyalty-widget-close-icon {
3497opacity: 1;
3498}
3499
3500#appstle_loyalty_iframe.open + button .appstle_loyalty_widget_button_wrapper {
3501color: transparent;
3502}
3503
3504.appstle_loyalty_widget_button_wrapper {
3505height: 100%;
3506width: 100%;
3507display: flex;
3508flex-wrap: nowrap;
3509align-items: center;
3510gap: 10px;
3511}
3512
3513.appstle-loyalty-widget-button-text {
3514flex-shrink: 0;
3515}
3516
3517.loyalty_widget_available_points {
3518display: none;
3519height: 100%;
3520width: auto;
3521flex-shrink: 0;
3522}
3523
3524.appstle_show_points .loyalty_widget_available_points {
3525display: flex;
3526align-items: center;
3527padding: 0 8px;
3528margin-right: -14px;
3529background-color: ${_ALConfig?.widget_setting?.widgetCounterBackgroundColor || 'rgba(29, 78, 216, 0.8)'};
3530color: ${_ALConfig?.widget_setting?.widgetCounterTextColor || 'white'};
3531}
3532
3533#appstle_loyalty_iframe.open.show-close-icon + button {
3534background-color: ${_ALConfig?.widget_setting?.widgetBackgroundColor || 'rgb(29, 78, 216)'};
3535}
3536
3537#appstle_loyalty_iframe.open.show-close-icon + button .appstle-loyalty-widget-button-text-wrapper,
3538#appstle_loyalty_iframe.open.show-close-icon + button .loyalty_widget_available_points {
3539opacity: 0;
3540}
3541
3542#appstle_loyalty_iframe.open + button {
3543max-width: 56px;
3544}
3545
3546.loyalty-widget-buttonImage {
3547height: 24px;
3548width: 24px;
3549}
3550
3551.appstle-loyalty-widget-button-text-wrapper {
3552height: 100%;
3553display: flex;
3554gap: 4px;
3555align-items: center;
3556}
3557
3558.right_snackbar {
3559right: 30px;
3560}
3561
3562
3563@media screen and (max-width: 576px) {
3564#appstle_loyalty_iframe,
3565.appstle-loyalty-button {
3566display: none;
3567}
3568}
3569
3570
3571`;
3572    const launcherStyles = document.createElement('style');
3573    launcherStyles.id = 'appstle-loyalty-launcher-styles';
3574    launcherStyles.textContent = loyaltyWidgetStyles;
3575    const customStyles = document.getElementById('appstle-loyalty-custom-styles');
3576    if (customStyles) {
3577        customStyles.before(launcherStyles);
3578    } else {
3579        document.body.appendChild(launcherStyles);
3580    }
3581    const mainHTMLString = `
3582<iframe id="appstle_loyalty_iframe" class="appslte-iframe" title="Appstle Loyalty Widget"></iframe>
3583<button id="appstle-loyalty-button"
3584        class="appstle-loyalty-button appstle-loyalty-hidden ${_ALConfig?.customerId ? `logged-in-customer-loyalty-button` : `logged-out-customer-loyalty-button`}"
3585        style="${_ALConfig.widget_setting.showWidget && _ALConfig.widget_setting.widgetType === 'LAUNCHER' ? `` : `display: none !important;`}">
3586    <div class="appstle_loyalty_widget_button_wrapper">
3587        <div class="appstle-loyalty-widget-button-text-wrapper">
3588            
3589                <img
3590                    alt="" role="presentation" class="loyalty-widget-buttonImage">
3591            
3592            <span id="loyalty-widget-title" class="appstle-loyalty-widget-button-text"></span>
3593        </div>
3594        <div class="loyalty_widget_available_points"></div>
3595    </div>
3596    <svg class="appstle-loyalty-widget-close-icon" xmlns="http://www.w3.org/2000/svg" fill="none"
3597         viewBox="0 0 24 24"
3598         stroke-width="1.5" stroke="currentColor">
3599        <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"></path>
3600    </svg>
3601</button>`;
3602    document.querySelector('body').insertAdjacentHTML('beforeend', mainHTMLString);
3603    const launcherLogo = document.querySelector('.loyalty-widget-buttonImage');
3604    if (launcherLogo) launcherLogo.src = parseHtmlStringContent(_ALConfig?.widget_setting?.widgetButtonLogoUrl);
3605    window.addEventListener('message', widgetEventListener, false);
3606
3607    function widgetEventListener(event) {
3608        if (event.origin !== window.location.origin ||
3609            (event.source !== window && event.source !== document.getElementById('appstle_loyalty_iframe')?.contentWindow)) return;
3610        if (event.data === 'appstle_message_for_showWidget') {
3611        } else if (event.data === 'appstle_widget_showHide') {
3612            toggleWidget();
3613        } else if (event.data === 'refresh_appstle_loyalty_widget' && _ALConfig?.widget_setting?.widgetType === 'LAUNCHER') {
3614            loadAppstleLoyaltyWidget();
3615            console.log('REFRESH WIDGET');
3616        } else if (event.data === 'show_appstle_loyalty_widget') {
3617            loadAppstleLoyaltyWidget();
3618            enableWidget();
3619        }
3620    }
3621
3622    function removeAppstleLoyaltyWidget() {
3623        document.querySelector('#appstle-loyalty-button')?.classList?.add('appstle-loyalty-hidden');
3624        document.querySelector('#appstle_loyalty_iframe')?.classList?.add('appstle-loyalty-hidden');
3625    }
3626
3627    (function checkForWidgetRestrictions() {
3628        let isShowWidget = true;
3629
3630        if (_ALConfig?.customerLoyalty?.customerStatus === 'EXCLUDED') {
3631            isShowWidget = false;
3632        }
3633        if (!_ALConfig?.customerId) {
3634            isShowWidget = !(_ALConfig?.widget_setting?.restrictedCustomersTag || _ALConfig?.widget_setting?.allowedCustomersTag);
3635        }
3636        if (_ALConfig?.widget_setting?.allowedCustomersTag?.length && isShowWidget) {
3637            let allowedTags = _ALConfig?.widget_setting?.allowedCustomersTag.split(',');
3638            if (allowedTags?.length > 0 && !_ALConfig?.customerTags?.some((tag) => allowedTags?.some((allowedTag) => allowedTag?.trim()?.toLowerCase() === tag?.trim()?.toLowerCase()))) {
3639                isShowWidget = false;
3640            }
3641        }
3642        if (_ALConfig?.widget_setting?.restrictedCustomersTag?.length && isShowWidget) {
3643            let restrictedTags = _ALConfig?.widget_setting?.restrictedCustomersTag?.split(',');
3644            if (restrictedTags?.length > 0 && _ALConfig?.customerTags?.some((tag) => restrictedTags?.some((restrictedTag) => restrictedTag?.trim()?.toLowerCase() === tag?.trim()?.toLowerCase()))) {
3645                isShowWidget = false;
3646            }
3647        }
3648        if (_ALConfig?.widget_setting?.blockWidgetOnPages?.length && isShowWidget) {
3649            let restrictedPages = _ALConfig?.widget_setting?.blockWidgetOnPages?.split(',');
3650            const currentPage = window?.location?.pathname;
3651            if (restrictedPages?.length > 0) {
3652                if (restrictedPages?.includes('/homepage') && currentPage === '/') {
3653                    isShowWidget = false;
3654                } else if (restrictedPages?.some((page) => currentPage?.includes(page))) {
3655                    isShowWidget = false;
3656                }
3657            }
3658        }
3659        if (_ALConfig?.widget_setting?.allowWidgetOnSpecificPages?.length && isShowWidget) {
3660            let allowedPages = _ALConfig?.widget_setting?.allowWidgetOnSpecificPages?.split(',');
3661            const currentPage = window?.location?.pathname;
3662            if (allowedPages?.length > 0) {
3663                if (allowedPages?.includes('/homepage') && currentPage === '/') {
3664                    isShowWidget = true;
3665                } else if (allowedPages?.some((page) => currentPage?.includes(page))) {
3666                    isShowWidget = true;
3667                } else {
3668                    isShowWidget = false;
3669                }
3670            }
3671        }
3672        if (!_ALConfig?.customerId && _ALConfig?.widget_setting?.showToLoggedInCustomerOnly) {
3673            isShowWidget = false;
3674        }
3675        window.__APPSTLE_LOYALTY_LAUNCHER_ALLOWED = !!isShowWidget;
3676        if (isShowWidget) {
3677            showAppstleLoyaltyWidget();
3678        } else {
3679            removeAppstleLoyaltyWidget();
3680        }
3681    })();
3682
3683    function enableWidget() {
3684        document.querySelector('#appstle_loyalty_iframe')?.classList?.add('open');
3685        document.querySelector('#appstle_loyalty_iframe')?.classList?.remove('appstle-loyalty-hidden');
3686        setTimeout(function() {
3687            document.querySelector('#appstle_loyalty_iframe')?.classList?.toggle('show-close-icon');
3688        }, 900);
3689    }
3690
3691    function showAppstleLoyaltyWidget() {
3692        const launcherAllowed = window?.['__APPSTLE_LOYALTY_LAUNCHER_ALLOWED'] !== false;
3693        document.querySelector('#appstle_loyalty_iframe')?.classList?.remove('appstle-loyalty-hidden');
3694        const btn = document.querySelector('#appstle-loyalty-button');
3695        if (!btn) return;
3696        if (launcherAllowed) {
3697            btn.classList.remove('appstle-loyalty-hidden');
3698        } else {
3699            btn.classList.add('appstle-loyalty-hidden');
3700        }
3701    }
3702
3703
3704    document.querySelector('.appstle-loyalty-button').addEventListener('click', toggleWidget);
3705
3706    if (_ALConfig?.widget_setting?.widgetPosition === 'LEFT') {
3707        document.getElementById('appstle_loyalty_iframe')?.classList?.add('appstle-loyalty-left');
3708        document.querySelector('.appstle-loyalty-button')?.classList?.add('appstle-loyalty-left');
3709        document.getElementById('appstle_loyalty_iframe')?.classList?.add('appstle-loyalty-left');
3710        document.getElementById('snackbar')?.classList?.add('left_snackbar');
3711
3712    } else {
3713        document.getElementById('appstle_loyalty_iframe')?.classList?.add('appstle-loyalty-right');
3714        document.querySelector('.appstle-loyalty-button')?.classList?.add('appstle-loyalty-right');
3715        document.getElementById('snackbar')?.classList?.add('right_snackbar');
3716    }
3717
3718
3719    const alIframeSrc = `\x3chtml>
3720\x3chead>
3721    \x3cscript>
3722        window["isAppstleLoyaltyCustomerPortal"] = true;
3723        \x3c/script>
3724        <link rel="stylesheet" href="${escapeLoyaltyAttribute(_ALConfig.widgetCssPath)}">
3725            \x3cscript defer type="text/javascript" src="${escapeLoyaltyAttribute(_ALConfig.widgetJsPath)}">\x3c/script>
3726                <style>
3727                    #loyalty_spinner_container {
3728                    position: absolute;
3729                    top: 0;
3730                    right: 0;
3731                    bottom: 0;
3732                    left: 0;
3733                    display: flex;
3734                    justify-content: center;
3735                    align-items: center;
3736                    height: 100%;
3737                    width: 100%;
3738                    z-index: 9999999999999999999999999;
3739                }
3740                    #loyalty_spinner {
3741                    height: 32px;
3742                    width: 32px;
3743                    animation: spin 1s linear infinite;
3744                    border-radius: 9999px;
3745                    border-width: 1px;
3746                    border-style: solid;
3747                    border-color: rgb(107 114 128);
3748                    border-top-color: transparent;
3749                }
3750                    @keyframes spin {
3751                    100% {
3752                        transform: rotate(360deg);
3753                }
3754                }
3755                </style>
3756            \x3c/head>
3757            \x3cbody>
3758            <div style="overflow: auto;" id="appstleLoyaltyWidget">
3759                <div id="loyalty_spinner_container">
3760                    <div id="loyalty_spinner"></div>
3761                </div>
3762            </div>
3763            \x3c/body>
3764        \x3c/html>`;
3765
3766
3767    function toggleWidget() {
3768        loadAppstleLoyaltyWidget();
3769        if (_ALConfig?.widget_setting?.widgetType?.toUpperCase() === 'LAUNCHER' && _ALConfig?.widget_setting?.forceRedirectDedicatedPage === true) {
3770            window.open(`/${_ALConfig?.proxy_path_prefix}`);
3771        } else {
3772            const isWidgetOpen = document.querySelector('#appstle_loyalty_iframe')?.classList?.toggle('open');
3773            if (isWidgetOpen === false) {
3774                clearLoyaltyDeepLinkHash();
3775            }
3776            showAppstleLoyaltyWidget();
3777            setTimeout(function() {
3778                document.querySelector('#appstle_loyalty_iframe')?.classList?.toggle('show-close-icon');
3779            }, 900);
3780        }
3781    }
3782
3783    const loadAppstleLoyaltyWidget = () => {
3784        var iframe = document.querySelectorAll('#appstle_loyalty_iframe');
3785        iframe.forEach(function(item) {
3786            item.contentWindow.document.open('text/html', 'replace');
3787            item.contentWindow._ALConfig = _ALConfig;
3788            item.contentWindow.__st = window.__st;
3789            item.contentWindow.Shopify = { shop: location.host };
3790            item.contentWindow.appstle_public_domain = location.host;
3791            item.contentWindow.document.write(alIframeSrc);
3792            item.contentWindow.document.close();
3793        });
3794    };
3795
3796    const launcherDataType = _ALConfig?.widget_setting?.launcherDataType || 'POINTS';
3797
3798    const loyaltyButtonTitle = document.getElementById('loyalty-widget-title');
3799    if (_ALConfig?.shop_labels?.widgetTitle) {
3800        const title = parseHtmlStringContent(_ALConfig?.shop_labels?.widgetTitle);
3801        loyaltyButtonTitle.textContent = title;
3802        window.appstleLoyaltyLoadSanitizer().then(purifier => {
3803            if (purifier) loyaltyButtonTitle.innerHTML = sanitizeLoyaltyLabel(title, purifier, false);
3804        });
3805    }
3806
3807    (function() {
3808        const { customerLoyalty, widget_setting } = _ALConfig || {};
3809        if (!customerLoyalty && !(launcherDataType === 'STORE_CREDITS' && _ALConfig?.customerId)) return;
3810
3811        const showTier = widget_setting?.showTierName;
3812        const launcherButtonElement = document.querySelector('#appstle-loyalty-button');
3813        const pointsEl = document.querySelector('.loyalty_widget_available_points');
3814        if (!pointsEl) return;
3815
3816        const fmt = new Intl.NumberFormat();
3817        const { storeCreditBalance = 0, availablePoints = 0, currentVipTier = '' } = customerLoyalty || {};
3818
3819        let displayValue;
3820        if (launcherDataType === 'STORE_CREDITS') {
3821            displayValue = formatStoreCreditAmount(_ALConfig?.customerStoreCreditBalance || storeCreditBalance || 0);
3822        } else if ((launcherDataType === 'VIP_TIER') && currentVipTier) {
3823            displayValue = String(currentVipTier);
3824        } else {
3825            const n = Number(availablePoints) || 0;
3826            displayValue = fmt.format(formatNumberByPointRoundType(n));
3827        }
3828        pointsEl.textContent = displayValue;
3829        launcherButtonElement?.classList.add('appstle_show_points');
3830    })();
3831
3832
3833    const loyaltyDeepLinks = [
3834        '#appstle-loyalty',
3835        '#appstle-refer',
3836        '#appstle-loyalty-earn-rewards',
3837        '#appstle-loyalty-redeem-rewards',
3838        '#appstle-loyalty-referrals',
3839        '#appstle-loyalty-vip-program'
3840    ];
3841
3842    let lastLoyaltyWidgetUrl = location.href;
3843
3844    function hasLoyaltyDeepLink() {
3845        return loyaltyDeepLinks.some(hash => location?.hash?.includes(hash));
3846    }
3847
3848    function clearLoyaltyDeepLinkHash() {
3849        if (!hasLoyaltyDeepLink()) {
3850            return;
3851        }
3852        window.history.replaceState({}, document.title, window.location.pathname + window.location.search);
3853        lastLoyaltyWidgetUrl = location.href;
3854    }
3855
3856    function handleDeepLink() {
3857        if (!_ALConfig?.widget_setting?.showWidget || !hasLoyaltyDeepLink()) {
3858            return;
3859        }
3860        loadAppstleLoyaltyWidget();
3861        enableWidget();
3862        setTimeout(() => {
3863            document.querySelector('#appstle_loyalty_iframe')?.classList?.add('show-close-icon');
3864        }, 900);
3865    }
3866
3867    handleDeepLink();
3868
3869    const widgetReferralUrl = new URL(window.location.href);
3870    if (_ALConfig?.referralEnabled && widgetReferralUrl?.searchParams.get('appstle_referral') && _ALConfig?.widget_setting?.widgetType === 'LAUNCHER') {
3871        const referralUrlObj = loyaltyNavigationUrl(_ALConfig?.widget_setting?.referralRedirectUrl);
3872        if (referralUrlObj) {
3873            let referralPath = referralUrlObj.pathname.replace(/\/+$/, '');
3874            let currentPath = window.location.pathname.replace(/\/+$/, '');
3875            if (referralPath && (referralUrlObj.origin !== window.location.origin || currentPath !== referralPath)) {
3876                widgetReferralUrl.searchParams.forEach((value, key) => referralUrlObj.searchParams.set(key, value));
3877                window.open(referralUrlObj.href, '_self');
3878            }
3879        }
3880        setTimeout(() => {
3881            loadAppstleLoyaltyWidget();
3882            enableWidget();
3883        }, 200);
3884    }
3885
3886
3887    (function observeURLChanges() {
3888        const handleUrlChange = () => {
3889            if (location.href !== lastLoyaltyWidgetUrl) {
3890                lastLoyaltyWidgetUrl = location.href;
3891                handleDeepLink();
3892            }
3893        };
3894        new MutationObserver(handleUrlChange).observe(document.body, { subtree: true, childList: true });
3895        window.addEventListener('popstate', handleUrlChange);
3896        window.addEventListener('hashchange', handleUrlChange);
3897    })();
3898
3899    const alDOMObserver = new MutationObserver(function(mutations_list) {
3900        mutations_list.forEach(function(mutation) {
3901            mutation.addedNodes.forEach(function(added_node) {
3902                if (added_node.id === 'appstle_loyalty_iframe') {
3903                    var iframe = document.querySelectorAll('#appstle_loyalty_iframe');
3904                    iframe.forEach(function(item) {
3905                        item.contentWindow.document.open('text/html', 'replace');
3906                        item.contentWindow._ALConfig = _ALConfig;
3907                        item.contentWindow.__st = window.__st;
3908                        item.contentWindow.Shopify = { shop: location.host };
3909                        item.contentWindow.appstle_public_domain = location.host;
3910                        item.contentWindow.document.write(alIframeSrc);
3911                        item.contentWindow.document.close();
3912                    });
3913                    alDOMObserver.disconnect();
3914                }
3915            });
3916        });
3917    });
3918    alDOMObserver.observe(document.querySelector('body'), { subtree: true, childList: true });
3919
3920    
3921    (function hideWidgetOnScroll() {
3922        setTimeout(() => {
3923            const button = document.getElementById('appstle-loyalty-button');
3924            const iframe = document.getElementById('appstle_loyalty_iframe');
3925            if (!button || !iframe) return;
3926            if (button && !button?.classList?.contains('appstle-loyalty-hidden')) {
3927                let lastY = window.scrollY;
3928                const offset = 200;
3929                window.addEventListener('scroll', () => {
3930                    const currentY = window.scrollY;
3931                    if (Math.abs(currentY - lastY) < offset) return;
3932                    const hide = currentY > lastY;
3933                    button.classList.toggle('appstle-loyalty-hidden', hide);
3934                    iframe.classList.toggle('appstle-loyalty-hidden', hide);
3935                    lastY = currentY;
3936                });
3937            }
3938        }, 2000);
3939    })();
3940    
3941
3942    
3943<!-- END app snippet -->
3944    }
3945
3946    
3947
3948    const storeCreditMismatch = _ALConfig?.customerId && _ALConfig?.customerStoreCreditBalance >= 0 && _ALConfig?.customerLoyalty?.storeCreditBalance >= 0 && _ALConfig?.customerLoyalty?.storeCreditBalance !== _ALConfig?.customerStoreCreditBalance;
3949    if (storeCreditMismatch && _ALConfig.shop === 'olineloyalty27.myshopify.com') {
3950        const updateCustomerUrl = `/${_ALConfig?.proxy_path_prefix || 'apps/loyalty'}/cp/api/update-customer`;
3951        try {
3952            fetch(updateCustomerUrl, { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest' } })
3953                .then((response) => {
3954                    if(response.ok) {}
3955                })
3956                .catch(() => {});
3957        } catch (err) {}
3958    }
3959
3960    <!-- BEGIN app snippet: loyalty-dedicated-page -->
3961    const dedicatedPageURL = new URL(window.location.href);
3962    const decodeUrl = (content) => {
3963        if (typeof content !== 'string') return content;
3964        try {
3965            const htmlDecoded = content?.replace(/\\\//g, '/');
3966            return JSON.parse(`"${htmlDecoded}"`);
3967        } catch (error) {
3968            console.error('Error parsing content:', error);
3969            return content;
3970        }
3971    };
3972
3973    if (dedicatedPageURL?.searchParams?.get('appstle_referral') && _ALConfig?.widget_setting?.widgetType === 'DEDICATED_PAGE') {
3974        const customUrl = decodeUrl(_ALConfig?.widget_setting?.referralCustomRedirectUrl);
3975        if (customUrl) {
3976            const normalizedCustomPath = customUrl.startsWith('/') ? customUrl : `/${customUrl}`;
3977            if (window.location.pathname !== normalizedCustomPath) {
3978                const redirectUrl = new URL(window.location.href);
3979                redirectUrl.pathname = normalizedCustomPath;
3980                window.open(redirectUrl.toString(), '_self');
3981            }
3982        }
3983        else if (dedicatedPageURL?.searchParams?.get('appstle_referral') && _ALConfig?.widget_setting?.widgetType === 'DEDICATED_PAGE' && !window.location.href.includes(_ALConfig?.proxy_path_prefix)) {
3984            window.open(`${window.location.origin}/${_ALConfig?.proxy_path_prefix}${window.location.search}`, '_self');
3985        }
3986    }
3987
3988    
3989    const dedicatedPageEventListener = (event) => {
3990        if (event.origin !== window.location.origin || event.source !== window) return;
3991        if (event.data === 'refresh_appstle_loyalty_page') {
3992            initiateAppstleLoyaltyPage();
3993            console.log('REFRESH PAGE');
3994        }
3995    };
3996    window.addEventListener('message', dedicatedPageEventListener, false);
3997
3998    function initiateAppstleLoyaltyPage() {
3999        if (document.querySelector('#appstleLoyaltyPage')) {
4000            const appstleLoyaltyPageElement = document.getElementById('appstleLoyaltyPage');
4001            while (appstleLoyaltyPageElement.firstChild) {
4002                appstleLoyaltyPageElement.firstChild.remove();
4003            }
4004
4005            
4006
4007
4008            
4009            document.title = decodeUrl(_ALConfig?.shop_labels?.loyaltyPageMetaTitle) || '';
4010            
4011
4012            
4013            setTimeout(() => {
4014                let metaDescription = document.querySelector('meta[name="description"]');
4015                if (metaDescription) {
4016                    metaDescription.content = decodeUrl(_ALConfig?.shop_labels?.loyaltyPageMetaDescription) || '';
4017                } else {
4018                    metaDescription = document.createElement('meta');
4019                    metaDescription.name = 'description';
4020                    metaDescription.content = decodeUrl(_ALConfig?.shop_labels?.loyaltyPageMetaDescription) || '';
4021                    document.head.appendChild(metaDescription);
4022                }
4023            }, 500);
4024            
4025            if (appstleLoyaltyPageElement) {
4026
4027                const loadDedicatedPageAsset = (createAsset, attempt, onSettle) => {
4028                    const asset = createAsset();
4029                    let settled = false;
4030                    const settle = () => {
4031                        if (settled) return;
4032                        settled = true;
4033                        if (typeof onSettle === 'function') {
4034                            onSettle();
4035                        }
4036                    };
4037                    asset.onload = settle;
4038                    asset.onerror = () => {
4039                        asset.remove();
4040                        if (attempt < 4) {
4041                            setTimeout(() => loadDedicatedPageAsset(createAsset, attempt + 1, onSettle), 1000 * Math.pow(2, attempt - 1));
4042                        } else {
4043                            settle();
4044                        }
4045                    };
4046                }
4047
4048                const appendDedicatedPageWidgetScript = () => {
4049                    loadDedicatedPageAsset(() => {
4050                        const s = document.createElement('script');
4051                        s.setAttribute('src', _ALConfig?.widgetJsPath);
4052                        s.async = false;
4053                        document.body.appendChild(s);
4054                        return s;
4055                    }, 1);
4056                }
4057
4058                const executeDedicatedPageScript = () => {
4059                    let widgetScriptAppended = false;
4060                    const appendWidgetScriptOnce = () => {
4061                        if (widgetScriptAppended) return;
4062                        widgetScriptAppended = true;
4063                        appendDedicatedPageWidgetScript();
4064                    };
4065                    try {
4066                        const preload = document.createElement('link');
4067                        preload.rel = 'preload';
4068                        preload.as = 'script';
4069                        preload.href = _ALConfig?.widgetJsPath;
4070                        document.head.appendChild(preload);
4071                    } catch (e) {}
4072                    loadDedicatedPageAsset(() => {
4073                        const link = document.createElement('link');
4074                        link.type = 'text/css';
4075                        link.rel = 'stylesheet';
4076                        link.href = _ALConfig?.widgetCssPath;
4077                        document.head.appendChild(link);
4078                        return link;
4079                    }, 1, appendWidgetScriptOnce);
4080                    setTimeout(appendWidgetScriptOnce, 8000);
4081                }
4082
4083                try {
4084                    const versionUrl = `${location.origin}/${_ALConfig?.proxy_path_prefix || 'apps/loyalty'}/app-loyalty-version`;
4085                    fetch(versionUrl).then(res => res.json()).then(data => {
4086                            if (data) {
4087                                const widgetJsUrl = new URL(_ALConfig.widgetJsPath);
4088                                const widgetCssUrl = new URL(_ALConfig.widgetCssPath);
4089                                widgetJsUrl.searchParams.set('v', data);
4090                                widgetCssUrl.searchParams.set('v', data);
4091                                _ALConfig.widgetJsPath = widgetJsUrl.toString();
4092                                _ALConfig.widgetCssPath = widgetCssUrl.toString();
4093                            }
4094                        }).catch(() => {}).finally(() => {
4095                            executeDedicatedPageScript();
4096                        });
4097                } catch (err) {
4098                    executeDedicatedPageScript();
4099                }
4100
4101
4102            }
4103
4104        } else {
4105            setTimeout(() => {
4106                initiateAppstleLoyaltyPage();
4107            }, 2000);
4108        }
4109    }
4110
4111    const dedicatedPageReferralUrl = new URL(window.location.href)?.searchParams.get('appstle_referral');
4112
4113    if (_ALConfig?.widget_setting?.showWidget === true) {
4114        initiateAppstleLoyaltyPage();
4115    }
4116    
4117
4118<!-- END app snippet -->
4119
4120    
4121</script>
4121
4122
4123
4124
4125
4126
4127</div>
4127<script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
vendor: 1 bytes, line 4127
4127
4128<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a45430022d220008',t:'MTc5MTExNjkxOA=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
4128</body>
4129</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.