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&width=1531" alt="Hand Selected Healing Crystals and Spiritual Tools - Mooncat Crystals" srcset="//www.mooncatcrystals.com/cdn/shop/files/logo-mooncat.png?v=1729612271&width=170 170w, //www.mooncatcrystals.com/cdn/shop/files/logo-mooncat.png?v=1729612271&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&width=1082" alt="" srcset="//www.mooncatcrystals.com/cdn/shop/files/hero2.png?v=1788724344&width=315 315w, //www.mooncatcrystals.com/cdn/shop/files/hero2.png?v=1788724344&width=630 630w, //www.mooncatcrystals.com/cdn/shop/files/hero2.png?v=1788724344&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&width=2000" alt="" srcset="//www.mooncatcrystals.com/cdn/shop/files/ebook_crystal_healing_course.jpg?v=1742136738&width=315 315w, //www.mooncatcrystals.com/cdn/shop/files/ebook_crystal_healing_course.jpg?v=1742136738&width=630 630w, //www.mooncatcrystals.com/cdn/shop/files/ebook_crystal_healing_course.jpg?v=1742136738&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&width=1082" alt="" srcset="//www.mooncatcrystals.com/cdn/shop/files/hero2.png?v=1788724344&width=315 315w, //www.mooncatcrystals.com/cdn/shop/files/hero2.png?v=1788724344&width=630 630w, //www.mooncatcrystals.com/cdn/shop/files/hero2.png?v=1788724344&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&width=2000" alt="" srcset="//www.mooncatcrystals.com/cdn/shop/files/ebook_crystal_healing_course.jpg?v=1742136738&width=315 315w, //www.mooncatcrystals.com/cdn/shop/files/ebook_crystal_healing_course.jpg?v=1742136738&width=630 630w, //www.mooncatcrystals.com/cdn/shop/files/ebook_crystal_healing_course.jpg?v=1742136738&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 => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[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(/</g, '<')?.replace(/>/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.