1<!doctype html> 2<!--[if lt IE 7]><html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]--> 3<!--[if IE 7]><html class="no-js lt-ie9 lt-ie8" lang="en"> <![endif]--> 4<!--[if IE 8]><html class="no-js lt-ie9" lang="en"> <![endif]--> 5<!--[if IE 9 ]><html class="ie9 no-js"> <![endif]--> 6<!--[if (gt IE 9)|!(IE)]><!--> <html class="no-js"> <!--<![endif]--> 7<head> 8 9 <!-- Basic page needs ================================================== --> 10 <meta charset="utf-8"> 11 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 12 13 14 <link rel="icon" href="https://cdn.store-assets.com/s/1074007/f/16413023.png" /> 15 16 17 <!-- Title and description ================================================== --> 18 <title> 19 Login – ALAIA 20 </title> 21 22 23 24 <!-- Social meta ================================================== --> 25 26 27 <meta property="og:type" content="website"> 28 <meta property="og:title" content="Login"> 29 <meta property="og:url" content="https://www.alaiacosmetic.com/account/login"> 30 31 <meta property="og:image" content="https://cdn.store-assets.com/s/1074007/f/16413023.png"> 32 <meta property="og:image:secure_url" content="https://cdn.store-assets.com/s/1074007/f/16413023.png"> 33 34 35 36<meta property="og:description" content="ALAIA"> 37<meta property="og:site_name" content="ALAIA"> 38 39 40 41 <meta name="twitter:card" content="summary"> 42 43 44 45 <meta name="twitter:site" content="@"> 46 47 48 49 50 51 <!-- Helpers ================================================== --> 52 <link rel="canonical" href="https://www.alaiacosmetic.com/account/login"> 53 <meta name="viewport" content="width=device-width,initial-scale=1"> 54 <meta name="theme-color" content="#121212"> 55 56
56<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js" type="text/javascript" ></script>
56 57 58 <!-- Header hook for plugins ================================================== --> 59 60<!-- ScriptTags -->
61<script>window.__st={p: "customers",cid: null,cem: null,cph: null,cfn: null,cln: null,cge: null,cdb: null,ccc: null};</script>
61<script src='/assets/events.js'></script>
61<script>(function(){function asyncLoad(){var urls=['/assets/facebook-pixel.js?v=1.2.1777345982','/assets/traffic.js?v=1','https://apps.easystore.co/marketplace/shopee-malaysia/script.js?shop=shopalaia.easy.co','https://apps.easystore.co/facebook-login/script.js?shop=shopalaia.easy.co&t=1777347323'];for(var i=0;i<urls.length;i++){var s=document.createElement('script');s.type='text/javascript';s.async=true;s.src=urls[i];var x=document.getElementsByTagName('script')[0];x.parentNode.insertBefore(s, x);}}window.attachEvent ? window.attachEvent('onload', asyncLoad) : window.addEventListener('load', asyncLoad, false);})();</script>
61 62<!-- /ScriptTags --> 63 64 65 66
66<script src="https://store-themes.easystore.co/1074007/themes/55058/assets/global.js?t=1788237975" defer="defer"></script>
66 67 68 69 70
70<script src="/assets/shop_common.js" type="text/javascript" ></script>
70 71
71<script src="/assets/customer_area.js" type="text/javascript" ></script>
71 72 73
73<script> 74 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 75 (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 76 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 77 })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); 78 79 ga('create', '', 'auto','myTracker'); 80 ga('myTracker.send', 'pageview'); 81 82 </script>
82 83 84
84<script src="/assets/storefront.js?id=1d419de2011a5572c98b" type="text/javascript" ></script>
84 85 86 87 <!-- CSS ================================================== --> 88 <style> 89 @font-face { 90 font-family: 'Arimo'; 91 font-style: normal; 92 font-weight: regular; 93 src: local('Arimo regular'), local('Arimo-regular'), url(https://fonts.gstatic.com/s/arimo/v17/P5sfzZCDf9_T_3cV7NCUECyoxNk37cxsBxDAVQI4aA.ttf) format('truetype'); 94 } 95 96 @font-face { 97 font-family: 'Arimo'; 98 font-style: normal; 99 font-weight: regular; 100 src: local('Arimo regular'), local('Arimo-regular'), url(https://fonts.gstatic.com/s/arimo/v17/P5sfzZCDf9_T_3cV7NCUECyoxNk37cxsBxDAVQI4aA.ttf) format('truetype'); 101 } 102 103 :root { 104 --font-body-family: 'Arimo', sans-serif; 105 --font-body-style: normal; 106 --font-body-weight: 300; 107 108 --font-heading-family: 'Arimo', sans-serif; 109 --font-heading-style: normal; 110 --font-heading-weight: 700; 111 112 --color-heading-text: 18,18,18; 113 --color-base-text: 18,18,18; 114 --color-base-background-1: 255,255,255; 115 --color-base-background-2: 255,255,255; 116 117 --color-base-solid-button-labels: 255,255,255; 118 --color-base-outline-button-labels: 18,18,18; 119 120 --color-base-accent-1: 18,18,18; 121 --color-base-accent-2: 18,18,18; 122 --payment-terms-background-color: 255,255,255; 123 124 --gradient-base-background-1: 255,255,255; 125 --gradient-base-background-2: 255,255,255; 126 --gradient-base-accent-1: 18,18,18; 127 --gradient-base-accent-2: 18,18,18; 128 129 --page-width: 145rem; 130 } 131 132 *, 133 *::before, 134 *::after { 135 box-sizing: inherit; 136 } 137 138 html { 139 box-sizing: border-box; 140 font-size: 62.5%; 141 height: 100%; 142 } 143 144 body { 145 display: grid; 146 grid-template-rows: auto auto 1fr auto; 147 grid-template-columns: 100%; 148 min-height: 100%; 149 margin: 0; 150 font-size: 1.5rem; 151 letter-spacing: 0.06rem; 152 line-height: 1.8; 153 font-family: var(--font-body-family); 154 font-style: var(--font-body-style); 155 font-weight: var(--font-body-weight); 156 157 } 158 159 @media screen and (min-width: 750px) { 160 body { 161 font-size: 1.6rem; 162 } 163 } 164 </style> 165 166 <link href="https://store-themes.easystore.co/1074007/themes/55058/assets/base.css?t=1788237975" rel="stylesheet" type="text/css" media="screen" /> 167 168 169 170<!-- Snippet:global/head: Shopee Malaysia --> 171<link type="text/css" rel="stylesheet" href="https://apps.easystore.co/assets/css/marketplace/main.css?v1.71"> 172<!-- /Snippet --> 173 174 175
175<script>document.documentElement.className = document.documentElement.className.replace('no-js', 'js');</script>
175 176</head> 177 178<body id="login" class="template-customers" > 179 180 181<!-- Snippet:global/body_start: Console Extension --> 182<div id='es_console' style='display: none;'>1074007</div> 183<!-- /Snippet --> 184 185 186 <style> 187 header { 188 --logo-width: 115px; 189 } 190 .header-wrapper, 191 .header-wrapper .list-menu--disclosure, 192 .header-wrapper .search-modal{ 193 background-color: #FFFFFF; 194 } 195 .header-wrapper .search-modal .field__input{ 196 background-color: rgb(var(--color-background)); 197 } 198 .header-wrapper summary .icon-caret, 199 .header-wrapper .header__menu-item a, 200 .header-wrapper .list-menu__item, 201 .header-wrapper .link--text{ 202 color: #000000; 203 } 204 205 .search-modal__form{ 206 position: relative; 207 } 208 209 .dropdown { 210 display: none; 211 position: absolute; 212 top: 100%; 213 left: 0; 214 width: 100%; 215 padding: 5px 0; 216 background-color: #fff; 217 color:#000; 218 z-index: 1000; 219 border-bottom-left-radius: 15px; 220 border-bottom-right-radius: 15px; 221 border: 1px solid rgba(var(--color-foreground), 1); 222 border-top: none; 223 overflow-x: hidden; 224 overflow-y: auto; 225 max-height: 350px; 226 } 227 228 .dropdown-item { 229 padding: 0.4rem 2rem; 230 cursor: pointer; 231 line-height: 1.4; 232 overflow: hidden; 233 text-overflow: ellipsis; 234 white-space: nowrap; 235 } 236 237 .dropdown-item:hover{ 238 background-color: #f3f3f3; 239 } 240 241 .search__input.is-focus{ 242 border-radius: 15px; 243 border-bottom-left-radius: 0; 244 border-bottom-right-radius: 0; 245 border: 1px solid rgba(var(--color-foreground), 1); 246 border-bottom: none; 247 box-shadow: none; 248 } 249 250 .clear-all { 251 text-align: right; 252 padding: 0 2rem 0.2rem; 253 line-height: 1; 254 font-size: 70%; 255 margin-bottom: -2px; 256 } 257 258 .clear-all:hover{ 259 background-color: #fff; 260 } 261 262 .search-input-focus .easystore-section-header-hidden{ 263 transform: none; 264 } 265 .referral-notification { 266 position: absolute; 267 top: 100%; 268 right: 0; 269 background: white; 270 border: 1px solid #e0e0e0; 271 border-radius: 8px; 272 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); 273 width: 280px; 274 z-index: 1000; 275 padding: 16px; 276 margin-top: 8px; 277 font-size: 14px; 278 line-height: 1.4; 279 } 280 281 .referral-notification::before { 282 content: ''; 283 position: absolute; 284 top: -8px; 285 right: 20px; 286 width: 0; 287 height: 0; 288 border-left: 8px solid transparent; 289 border-right: 8px solid transparent; 290 border-bottom: 8px solid white; 291 } 292 293 .referral-notification::after { 294 content: ''; 295 position: absolute; 296 top: -9px; 297 right: 20px; 298 width: 0; 299 height: 0; 300 border-left: 8px solid transparent; 301 border-right: 8px solid transparent; 302 border-bottom: 8px solid #e0e0e0; 303 } 304 305 .referral-notification h4 { 306 margin: 0 0 8px 0; 307 color: #2196F3; 308 font-size: 16px; 309 font-weight: 600; 310 } 311 312 .referral-notification p { 313 margin: 0 0 12px 0; 314 color: #666; 315 } 316 317 .referral-notification .referral-code { 318 background: #f5f5f5; 319 padding: 8px; 320 border-radius: 4px; 321 font-family: monospace; 322 font-size: 13px; 323 text-align: center; 324 margin: 8px 0; 325 border: 1px solid #ddd; 326 } 327 328 .referral-notification .close-btn { 329 position: absolute; 330 top: 8px; 331 right: 8px; 332 background: none; 333 border: none; 334 font-size: 18px; 335 color: #999; 336 cursor: pointer; 337 padding: 0; 338 width: 20px; 339 height: 20px; 340 line-height: 1; 341 } 342 343 .referral-notification .close-btn:hover { 344 color: #333; 345 } 346 347 .referral-notification .action-btn { 348 background: #2196F3; 349 color: white; 350 border: none; 351 padding: 8px 16px; 352 border-radius: 4px; 353 cursor: pointer; 354 font-size: 12px; 355 margin-right: 8px; 356 margin-top: 8px; 357 } 358 359 .referral-notification .action-btn:hover { 360 background: #1976D2; 361 } 362 363 .referral-notification .dismiss-btn { 364 background: transparent; 365 color: #666; 366 border: 1px solid #ddd; 367 padding: 8px 16px; 368 border-radius: 4px; 369 cursor: pointer; 370 font-size: 12px; 371 margin-top: 8px; 372 } 373 374 .referral-notification .dismiss-btn:hover { 375 background: #f5f5f5; 376 } 377 .referral-modal__dialog { 378 transform: translate(-50%, 0); 379 transition: transform var(--duration-default) ease, visibility 0s; 380 z-index: 10000; 381 position: fixed; 382 top: 20vh; 383 left: 50%; 384 width: 100%; 385 max-width: 350px; 386 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); 387 border-radius: 12px; 388 background-color: #fff; 389 color: #000; 390 padding: 20px; 391 text-align: center; 392 } 393 394 .modal-overlay.referral-modal-overlay { 395 position: fixed; 396 top: 0; 397 left: 0; 398 width: 100%; 399 height: 100%; 400 background-color: rgba(0, 0, 0, 0.7); 401 z-index: 2001; 402 display: block; 403 opacity: 1;
404 transition: opacity var(--duration-default) ease, visibility 0s; 405 } 406</style> 407 408<link rel="preload" href="https://store-themes.easystore.co/1074007/themes/55058/assets/section-header.css?t=1788237975" as="style" onload="this.onload=null;this.rel='stylesheet'"> 409<link rel="preload" href="https://store-themes.easystore.co/1074007/themes/55058/assets/component-list-menu.css?t=1788237975" as="style" onload="this.onload=null;this.rel='stylesheet'"> 410<link rel="preload" href="https://store-themes.easystore.co/1074007/themes/55058/assets/component-menu-drawer.css?t=1788237975" as="style" onload="this.onload=null;this.rel='stylesheet'"> 411<link rel="preload" href="https://store-themes.easystore.co/1074007/themes/55058/assets/component-cart-notification.css?v1.1?t=1788237975" as="style" onload="this.onload=null;this.rel='stylesheet'"> 412
413<script src="https://store-themes.easystore.co/1074007/themes/55058/assets/cart-notification.js?t=1788237975" defer="defer"></script>
vendor: 2 bytes, line 413
413
414<script src="https://store-themes.easystore.co/1074007/themes/55058/assets/details-modal.js?t=1788237975" defer="defer"></script>
414 415 416<svg xmlns="http://www.w3.org/2000/svg" class="hidden"> 417 <symbol id="icon-search" viewbox="0 0 18 19" fill="none"> 418 <path fill-rule="evenodd" clip-rule="evenodd" d="M11.03 11.68A5.784 5.784 0 112.85 3.5a5.784 5.784 0 018.18 8.18zm.26 1.12a6.78 6.78 0 11.72-.7l5.4 5.4a.5.5 0 11-.71.7l-5.41-5.4z" fill="currentColor"/> 419 </symbol> 420 421 <symbol id="icon-close" class="icon icon-close" fill="none" viewBox="0 0 18 17"> 422 <path d="M.865 15.978a.5.5 0 00.707.707l7.433-7.431 7.579 7.282a.501.501 0 00.846-.37.5.5 0 00-.153-.351L9.712 8.546l7.417-7.416a.5.5 0 10-.707-.708L8.991 7.853 1.413.573a.5.5 0 10-.693.72l7.563 7.268-7.418 7.417z" fill="currentColor"> 423 </symbol> 424</svg> 425 426 427<div id="easystore-section-header"> 428 <sticky-header class="header-wrapper header-wrapper--border-bottom"> 429 <header class="header header--middle-left page-width header--has-menu" itemscope itemtype="http://schema.org/Organization"> 430 <header-drawer data-breakpoint="tablet"> 431 <details class="menu-drawer-container menu-opening"> 432 <summary class="header__icon header__icon--menu header__icon--summary link link--text focus-inset" aria-label="Menu" role="button" aria-expanded="true" aria-controls="menu-drawer"> 433 <span> 434 435 436 437 <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" role="presentation" class="icon icon-hamburger " fill="none" viewBox="0 0 18 16"> 438 <path d="M1 .5a.5.5 0 100 1h15.71a.5.5 0 000-1H1zM.5 8a.5.5 0 01.5-.5h15.71a.5.5 0 010 1H1A.5.5 0 01.5 8zm0 7a.5.5 0 01.5-.5h15.71a.5.5 0 010 1H1a.5.5 0 01-.5-.5z" fill="currentColor"> 439 </path> 440 </svg> 441 442 443 444 445 446 447 <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" role="presentation" class="icon icon-close " fill="none" viewBox="0 0 18 17"> 448 <path d="M.865 15.978a.5.5 0 00.707.707l7.433-7.431 7.579 7.282a.501.501 0 00.846-.37.5.5 0 00-.153-.351L9.712 8.546l7.417-7.416a.5.5 0 10-.707-.708L8.991 7.853 1.413.573a.5.5 0 10-.693.72l7.563 7.268-7.418 7.417z" fill="currentColor"> 449 </path> 450 </svg> 451 452 453 454 </span> 455 </summary> 456 <div id="menu-drawer" class="menu-drawer motion-reduce" tabindex="-1"> 457 <div class="menu-drawer__inner-container"> 458 <div class="menu-drawer__navigation-container"> 459 <nav class="menu-drawer__navigation"> 460 <ul class="menu-drawer__menu list-menu" role="list"> 461 462 463 464 <li> 465 <a href="/" class="menu-drawer__menu-item list-menu__item link link--text focus-inset"> 466 Home 467 </a> 468 </li> 469 470 471 472 473 474 <li> 475 <details> 476 <summary class="menu-drawer__menu-item list-menu__item link link--text focus-inset" role="button" aria-expanded="false" aria-controls="link-Bags"> 477 <a href="/face" class="link--text list-menu__item menu-drawer__menu-item"> 478 Shop Face 479 </a> 480 481 482 483 <svg viewBox="0 0 14 10" fill="none" aria-hidden="true" focusable="false" role="presentation" class="icon icon-arrow " xmlns="http://www.w3.org/2000/svg"> 484 <path fill-rule="evenodd" clip-rule="evenodd" d="M8.537.808a.5.5 0 01.817-.162l4 4a.5.5 0 010 .708l-4 4a.5.5 0 11-.708-.708L11.793 5.5H1a.5.5 0 010-1h10.793L8.646 1.354a.5.5 0 01-.109-.546z" fill="currentColor"></path> 485 </svg> 486 487 488 489 490 491 492 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 493 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z" fill="currentColor"></path> 494 </svg> 495 496 497 498 </summary> 499 <div class="menu-drawer__submenu motion-reduce" tabindex="-1"> 500 <div class="menu-drawer__inner-submenu"> 501 <button class="menu-drawer__close-button link link--text focus-inset" aria-expanded="true"> 502 503 504 505 <svg viewBox="0 0 14 10" fill="none" aria-hidden="true" focusable="false" role="presentation" class="icon icon-arrow " xmlns="http://www.w3.org/2000/svg"> 506 <path fill-rule="evenodd" clip-rule="evenodd" d="M8.537.808a.5.5 0 01.817-.162l4 4a.5.5 0 010 .708l-4 4a.5.5 0 11-.708-.708L11.793 5.5H1a.5.5 0 010-1h10.793L8.646 1.354a.5.5 0 01-.109-.546z" fill="currentColor"></path> 507 </svg> 508 509 510 511 Shop Face 512 </button> 513 <ul class="menu-drawer__menu list-menu" role="list" tabindex="-1"> 514 515 516 517 <li> 518 <a href="https://www.alaiacosmetic.com/products/alaia-duo-pocket-blush" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 519 Duo Pocket Blush 520 </a> 521 </li> 522 523 524 525 </ul> 526 </div> 527 </div> 528 </details> 529 </li> 530 531 532 533 534 535 <li> 536 <details> 537 <summary class="menu-drawer__menu-item list-menu__item link link--text focus-inset" role="button" aria-expanded="false" aria-controls="link-Bags"> 538 <a href="/shoplashes" class="link--text list-menu__item menu-drawer__menu-item"> 539 Shop Lashes 540 </a> 541 542 543 544 <svg viewBox="0 0 14 10" fill="none" aria-hidden="true" focusable="false" role="presentation" class="icon icon-arrow " xmlns="http://www.w3.org/2000/svg"> 545 <path fill-rule="evenodd" clip-rule="evenodd" d="M8.537.808a.5.5 0 01.817-.162l4 4a.5.5 0 010 .708l-4 4a.5.5 0 11-.708-.708L11.793 5.5H1a.5.5 0 010-1h10.793L8.646 1.354a.5.5 0 01-.109-.546z" fill="currentColor"></path> 546 </svg> 547 548 549 550 551 552 553 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 554 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z" fill="currentColor"></path> 555 </svg> 556 557 558 559 </summary> 560 <div class="menu-drawer__submenu motion-reduce" tabindex="-1"> 561 <div class="menu-drawer__inner-submenu"> 562 <button class="menu-drawer__close-button link link--text focus-inset" aria-expanded="true"> 563 564 565 566 <svg viewBox="0 0 14 10" fill="none" aria-hidden="true" focusable="false" role="presentation" class="icon icon-arrow " xmlns="http://www.w3.org/2000/svg"> 567 <path fill-rule="evenodd" clip-rule="evenodd" d="M8.537.808a.5.5 0 01.817-.162l4 4a.5.5 0 010 .708l-4 4a.5.5 0 11-.708-.708L11.793 5.5H1a.5.5 0 010-1h10.793L8.646 1.354a.5.5 0 01-.109-.546z" fill="currentColor"></path> 568 </svg> 569 570 571 572 Shop Lashes 573 </button> 574 <ul class="menu-drawer__menu list-menu" role="list" tabindex="-1"> 575 576 577 578 <li> 579 <a href="/collections/soft-magnetic-lash" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 580 Soft Magnetic Lash 581 </a> 582 </li> 583 584 585 586 587 <li> 588 <a href="/collections/improved-soft-magnetic-lash" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 589 IMPROVED Soft Magnetic Lash 590 </a> 591 </li> 592 593 594 595 596 <li> 597 <a href="/collections/press-on-lashes" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 598 Press On Lash 599 </a> 600 </li> 601 602 603 604 605 <li> 606 <a href="/collections/full-collection" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 607 Magnetic Lash 608 </a> 609 </li> 610 611 612 613 </ul> 614 </div> 615 </div> 616 </details> 617 </li> 618 619 620 621 622 623 <li> 624 <details> 625 <summary class="menu-drawer__menu-item list-menu__item link link--text focus-inset" role="button" aria-expanded="false" aria-controls="link-Bags"> 626 <a href="/shopnails" class="link--text list-menu__item menu-drawer__menu-item"> 627 Shop Nails 628 </a> 629 630 631 632 <svg viewBox="0 0 14 10" fill="none" aria-hidden="true" focusable="false" role="presentation" class="icon icon-arrow " xmlns="http://www.w3.org/2000/svg"> 633 <path fill-rule="evenodd" clip-rule="evenodd" d="M8.537.808a.5.5 0 01.817-.162l4 4a.5.5 0 010 .708l-4 4a.5.5 0 11-.708-.708L11.793 5.5H1a.5.5 0 010-1h10.793L8.646 1.354a.5.5 0 01-.109-.546z" fill="currentColor"></path> 634 </svg> 635 636 637 638 639 640 641 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 642 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z" fill="currentColor"></path> 643 </svg> 644 645 646 647 </summary> 648 <div class="menu-drawer__submenu motion-reduce" tabindex="-1"> 649 <div class="menu-drawer__inner-submenu"> 650 <button class="menu-drawer__close-button link link--text focus-inset" aria-expanded="true"> 651 652 653 654 <svg viewBox="0 0 14 10" fill="none" aria-hidden="true" focusable="false" role="presentation" class="icon icon-arrow " xmlns="http://www.w3.org/2000/svg"> 655 <path fill-rule="evenodd" clip-rule="evenodd" d="M8.537.808a.5.5 0 01.817-.162l4 4a.5.5 0 010 .708l-4 4a.5.5 0 11-.708-.708L11.793 5.5H1a.5.5 0 010-1h10.793L8.646 1.354a.5.5 0 01-.109-.546z" fill="currentColor"></path> 656 </svg> 657 658 659 660 Shop Nails 661 </button> 662 <ul class="menu-drawer__menu list-menu" role="list" tabindex="-1"> 663 664 665 666 <li> 667 <a href="/collections/press-on-nails" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 668 Press On Nails 669 </a> 670 </li> 671 672 673 674 </ul> 675 </div> 676 </div> 677 </details> 678 </li> 679 680 681 682 683 <li> 684 <a href="/store-locator" class="menu-drawer__menu-item list-menu__item link link--text focus-inset"> 685 Location 686 </a> 687 </li> 688 689 690 </ul> 691 </nav> 692 693 <div class="menu-drawer__utility-links"> 694 695 696 697 698 699 700 701 <a href="/account/login" class="menu-drawer__account link link--text focus-inset h5"> 702 703 704 705 <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" role="presentation" class="icon icon-account " fill="none" viewBox="0 0 18 19"> 706 <path fill-rule="evenodd" clip-rule="evenodd" d="M6 4.5a3 3 0 116 0 3 3 0 01-6 0zm3-4a4 4 0 100 8 4 4 0 000-8zm5.58 12.15c1.12.82 1.83 2.24 1.91 4.85H1.51c.08-2.6.79-4.03 1.9-4.85C4.66 11.75 6.5 11.5 9 11.5s4.35.26 5.58 1.15zM9 10.5c-2.5 0-4.65.24-6.17 1.35C1.27 12.98.5 14.93.5 18v.5h17V18c0-3.07-.77-5.02-2.33-6.15-1.52-1.
7061-3.67-1.35-6.17-1.35z" fill="currentColor"></path> 707 </svg> 708 709 710 711 712 Log in 713 </a> 714 715 <a href="/account/register" class="menu-drawer__account link link--text focus-inset h5"> 716 717 718 719 720 <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" role="presentation" class="icon icon-plus " fill="none" viewBox="0 0 10 10"> 721 <path fill-rule="evenodd" clip-rule="evenodd" d="M1 4.51a.5.5 0 000 1h3.5l.01 3.5a.5.5 0 001-.01V5.5l3.5-.01a.5.5 0 00-.01-1H5.5L5.49.99a.5.5 0 00-1 .01v3.5l-3.5.01H1z" fill="currentColor"></path> 722 </svg> 723 724 725 726 Create account 727 </a> 728 729 730 731 </div> 732 </div> 733 </div> 734 </div> 735 </details> 736 </header-drawer> 737 738 739 <a href="/" class="header__heading-link link link--text focus-inset" itemprop="url"> 740 <img src="https://cdn.store-assets.com/s/1074007/f/16413023.png" class="header__heading-logo" alt="ALAIA" loading="lazy" itemprop="logo"> 741 </a> 742 743 <nav class="header__inline-menu"> 744 <ul class="list-menu list-menu--inline" role="list"> 745 746 747 748 <li> 749 <a href="/" class="header__menu-item header__menu-item list-menu__item link link--text focus-inset"> 750 Home 751 </a> 752 </li> 753 754 755 756 757 758 <li> 759 <details-disclosure> 760 <details> 761 <summary class="header__menu-item list-menu__item link focus-inset"> 762 <a href="/face" >Shop Face</a> 763 764 765 766 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 767 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z" fill="currentColor"></path> 768 </svg> 769 770 771 772 </summary> 773 <ul class="header__submenu list-menu list-menu--disclosure caption-large motion-reduce" role="list" tabindex="-1"> 774 775 776 777 778 779 <li> 780 <a href="https://www.alaiacosmetic.com/products/alaia-duo-pocket-blush" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 781 Duo Pocket Blush 782 </a> 783 </li> 784 785 786 </ul> 787 </details> 788 </details-disclosure> 789 </li> 790 791 792 793 794 795 <li> 796 <details-disclosure> 797 <details> 798 <summary class="header__menu-item list-menu__item link focus-inset"> 799 <a href="/shoplashes" >Shop Lashes</a> 800 801 802 803 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 804 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z" fill="currentColor"></path> 805 </svg> 806 807 808 809 </summary> 810 <ul class="header__submenu list-menu list-menu--disclosure caption-large motion-reduce" role="list" tabindex="-1"> 811 812 813 814 815 816 <li> 817 <a href="/collections/soft-magnetic-lash" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 818 Soft Magnetic Lash 819 </a> 820 </li> 821 822 823 824 825 826 <li> 827 <a href="/collections/improved-soft-magnetic-lash" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 828 IMPROVED Soft Magnetic Lash 829 </a> 830 </li> 831 832 833 834 835 836 <li> 837 <a href="/collections/press-on-lashes" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 838 Press On Lash 839 </a> 840 </li> 841 842 843 844 845 846 <li> 847 <a href="/collections/full-collection" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 848 Magnetic Lash 849 </a> 850 </li> 851 852 853 </ul> 854 </details> 855 </details-disclosure> 856 </li> 857 858 859 860 861 862 <li> 863 <details-disclosure> 864 <details> 865 <summary class="header__menu-item list-menu__item link focus-inset"> 866 <a href="/shopnails" >Shop Nails</a> 867 868 869 870 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 871 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z" fill="currentColor"></path> 872 </svg> 873 874 875 876 </summary> 877 <ul class="header__submenu list-menu list-menu--disclosure caption-large motion-reduce" role="list" tabindex="-1"> 878 879 880 881 882 883 <li> 884 <a href="/collections/press-on-nails" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 885 Press On Nails 886 </a> 887 </li> 888 889 890 </ul> 891 </details> 892 </details-disclosure> 893 </li> 894 895 896 897 898 <li> 899 <a href="/store-locator" class="header__menu-item header__menu-item list-menu__item link link--text focus-inset"> 900 Location 901 </a> 902 </li> 903 904 905 906 907 908 909 910 911 912 913 914 915 </ul> 916 </nav> 917 <div class="header__icons"> 918 <details-modal class="header__search"> 919 <details> 920 <summary class="header__icon header__icon--search header__icon--summary link link--text focus-inset modal__toggle" aria-haspopup="dialog" aria-label="Search">
921 <span> 922 <svg class="modal__toggle-open icon icon-search" aria-hidden="true" focusable="false" role="presentation"> 923 <use href="#icon-search"> 924 </svg> 925 <svg class="modal__toggle-close icon icon-close" aria-hidden="true" focusable="false" role="presentation"> 926 <use href="#icon-close"> 927 </svg> 928 </span> 929 </summary> 930 <div class="search-modal modal__content" role="dialog" aria-modal="true" aria-label="Search"> 931 <div class="modal-overlay"></div> 932 <div class="search-modal__content" tabindex="-1"> 933 <form action="/search" method="get" role="search" class="search search-modal__form"> 934 <div class="field"> 935 <input class="search__input field__input" 936 id="Search-In-Modal" 937 type="search" 938 name="q" 939 value="" 940 placeholder="Search" 941 autocomplete="off" 942 > 943 <label class="field__label" for="Search-In-Modal">Search</label> 944 <div class="dropdown" id="searchDropdown"></div> 945 <input type="hidden" name="search_history" class="hidden_search_history"> 946 <input type="hidden" name="options[prefix]" value="last"> 947 <button class="search__button field__button" aria-label="Search"> 948 <svg class="icon icon-search" aria-hidden="true" focusable="false" role="presentation"> 949 <use href="#icon-search"> 950 </svg> 951 </button> 952 </div> 953 </form> 954 <button type="button" class="search-modal__close-button modal__close-button link link--text focus-inset" aria-label="accessibility.close"> 955 <svg class="icon icon-close" aria-hidden="true" focusable="false" role="presentation"> 956 <use href="#icon-close"> 957 </svg> 958 </button> 959 </div> 960 </div> 961 </details> 962 </details-modal> 963 964 965 966 <div class="header__icon header__icon--account link link--text focus-inset small-hide medium-hide" style="position: relative;"> 967 <a href="/account/login" class="header__icon link link--text focus-inset p-2"> 968 969 970 971 <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" role="presentation" class="icon icon-account " fill="none" viewBox="0 0 18 19"> 972 <path fill-rule="evenodd" clip-rule="evenodd" d="M6 4.5a3 3 0 116 0 3 3 0 01-6 0zm3-4a4 4 0 100 8 4 4 0 000-8zm5.58 12.15c1.12.82 1.83 2.24 1.91 4.85H1.51c.08-2.6.79-4.03 1.9-4.85C4.66 11.75 6.5 11.5 9 11.5s4.35.26 5.58 1.15zM9 10.5c-2.5 0-4.65.24-6.17 1.35C1.27 12.98.5 14.93.5 18v.5h17V18c0-3.07-.77-5.02-2.33-6.15-1.52-1.1-3.67-1.35-6.17-1.35z" fill="currentColor"></path> 973 </svg> 974 975 976 977 </a> 978 979 <!-- Referral Notification Popup for Desktop --> 980 <div id="referralNotification" class="referral-notification" style="display: none;"> 981 <button class="close-btn" onclick="dismissReferralNotification()">×</button> 982 <div style="text-align: center; margin-bottom: 16px;"> 983 <div style="width: 100px; height: 100px; margin: 0 auto;"> 984 <img src="https://resources.easystore.co/storefront/icons/channels/vector_referral_program.svg"> 985 </div> 986 </div> 987 <p id="referralSignupMessage" style="text-align: center; font-size: 14px; color: #666; margin: 0 0 20px 0;"> 988 Your friend gifted you credit! Sign up now to redeem. 989 </p> 990 <div style="text-align: center;"> 991 <button class="btn" onclick="goToSignupPage()" style="width: 100%;"> 992 Sign Up 993 </button> 994 </div> 995 </div> 996 </div> 997 998 999 1000 <a href="/cart" class="header__icon header__icon--cart link link--text focus-inset" id="cart-icon-bubble"> 1001 1002 1003 1004 <svg class="icon icon-cart-empty " aria-hidden="true" focusable="false" role="presentation" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40" fill="none"> 1005 <path d="m15.75 11.8h-3.16l-.77 11.6a5 5 0 0 0 4.99 5.34h7.38a5 5 0 0 0 4.99-5.33l-.78-11.61zm0 1h-2.22l-.71 10.67a4 4 0 0 0 3.99 4.27h7.38a4 4 0 0 0 4-4.27l-.72-10.67h-2.22v.63a4.75 4.75 0 1 1 -9.5 0zm8.5 0h-7.5v.63a3.7
10055 3.75 0 1 0 7.5 0z" fill="currentColor" fill-rule="evenodd"></path> 1006 </svg> 1007 1008 1009 1010 <div class="cart-count-bubble hidden"> 1011 <span aria-hidden="true" class="js-content-cart-count">0</span> 1012 </div> 1013 </a> 1014 1015 1016 1017 <!-- Referral Notification Modal for Mobile --> 1018 <details-modal class="referral-modal" id="referralMobileModal"> 1019 <details> 1020 <summary class="referral-modal__toggle" aria-haspopup="dialog" aria-label="Open referral modal" style="display: none;"> 1021 </summary> 1022 <div class="modal-overlay referral-modal-overlay"></div> 1023 <div class="referral-modal__dialog" role="dialog" aria-modal="true" aria-label="Referral notification"> 1024 <div class="referral-modal__content"> 1025 <button type="button" class="modal__close-button" aria-label="Close" onclick="closeMobileReferralModal()" style="position: absolute; top: 16px; right: 16px; background: none; border: none; font-size: 24px; cursor: pointer;"> 1026 × 1027 </button> 1028 1029 <div style="margin-bottom: 24px;"> 1030 <div style="width: 120px; height: 120px; margin: 0 auto 20px;"> 1031 <img src="https://resources.easystore.co/storefront/icons/channels/vector_referral_program.svg" style="width: 100%; height: 100%;"> 1032 </div> 1033 </div> 1034 1035 <p id="referralSignupMessageMobile" style="font-size: 16px; color: #333; margin: 0 0 30px 0; line-height: 1.5;"> 1036 Your friend gifted you credit! Sign up now to redeem. 1037 </p> 1038 1039 <button type="button" class="btn" onclick="goToSignupPageFromMobile()" style="width: 100%;"> 1040 Sign Up 1041 </button> 1042 </div> 1043 </div> 1044 </details> 1045 </details-modal> 1046 1047 1048 </div> 1049 </header> 1050 </sticky-header> 1051 1052<cart-notification> 1053 <div class="cart-notification-wrapper page-width color-background-1"> 1054 <div id="cart-notification" class="cart-notification focus-inset" aria-modal="true" aria-label="Added to cart" role="dialog" tabindex="-1"> 1055 <div class="cart-notification__header"> 1056 <h2 class="cart-notification__heading caption-large"> 1057 1058 1059 <svg class="icon icon-checkmark color-foreground-text " aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 9" fill="none"> 1060 <path fill-rule="evenodd" clip-rule="evenodd" d="M11.35.643a.5.5 0 01.006.707l-6.77 6.886a.5.5 0 01-.719-.006L.638 4.845a.5.5 0 11.724-.69l2.872 3.011 6.41-6.517a.5.5 0 01.707-.006h-.001z" fill="currentColor"></path> 1061 </svg> 1062 1063 1064 Added to cart</h2> 1065 <button type="button" class="cart-notification__close modal__close-button link link--text focus-inset" aria-label="accessibility.close"> 1066 1067 1068 1069 <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" role="presentation" class="icon icon-close " fill="none" viewBox="0 0 18 17"> 1070 <path d="M.865 15.978a.5.5 0 00.707.707l7.433-7.431 7.579 7.282a.501.501 0 00.846-.37.5.5 0 00-.153-.351L9.712 8.546l7.417-7.416a.5.5 0 10-.707-.708L8.991 7.853 1.413.573a.5.5 0 10-.693.72l7.563 7.268-7.418 7.417z" fill="currentColor"> 1071 </path> 1072 </svg> 1073 1074 1075 1076 </button> 1077 </div> 1078 <div id="cart-notification-product" class="cart-notification-product"></div> 1079 <div class="cart-notification__links"> 1080 <a href="/cart" id="cart-notification-button" class="button button--secondary button--full-width">View cart (<span class="js-content-cart-count">0</span>)</a> 1081 <form action="/cart" method="post" id="cart-notification-form"> 1082 <input type="hidden" name="_token" value="IaqS15tBAPkZqUIUMjGHNVtI7Bpt08nzpx1iCciC"> 1083 <input type="hidden" name="current_currency" value=""> 1084 <button class="button button--primary button--full-width" name="checkout" value="true">Checkout</button> 1085 </form> 1086 <button type="button" class="link button-label">Continue shopping</button> 1087 </div> 1088 </div> 1089 </div> 1090</cart-notification> 1091<style> 1092 .cart-notification { 1093 display: none; 1094 } 1095</style>
1096<script> 1097document.getElementById('cart-notification-form').addEventListener('submit',(event)=>{ 1098 if(event.submitter) event.submitter.classList.add('loading'); 1099}) 1100 1101</script>
1101 1102 1103</div> 1104 1105
1106<script> 1107 1108 class StickyHeader extends HTMLElement { 1109 constructor() { 1110 super(); 1111 } 1112 1113 connectedCallback() { 1114 this.header = document.getElementById('easystore-section-header'); 1115 this.headerBounds = {}; 1116 this.currentScrollTop = 0; 1117 this.preventReveal = false; 1118 1119 this.onScrollHandler = this.onScroll.bind(this); 1120 this.hideHeaderOnScrollUp = () => this.preventReveal = true; 1121 1122 this.addEventListener('preventHeaderReveal', this.hideHeaderOnScrollUp); 1123 window.addEventListener('scroll', this.onScrollHandler, false); 1124 1125 this.createObserver(); 1126 } 1127 1128 disconnectedCallback() { 1129 this.removeEventListener('preventHeaderReveal', this.hideHeaderOnScrollUp); 1130 window.removeEventListener('scroll', this.onScrollHandler); 1131 } 1132 1133 createObserver() { 1134 let observer = new IntersectionObserver((entries, observer) => { 1135 this.headerBounds = entries[0].intersectionRect; 1136 observer.disconnect(); 1137 }); 1138 1139 observer.observe(this.header); 1140 } 1141 1142 onScroll() { 1143 const scrollTop = window.pageYOffset || document.documentElement.scrollTop; 1144 1145 if (scrollTop > this.currentScrollTop && scrollTop > this.headerBounds.bottom) { 1146 requestAnimationFrame(this.hide.bind(this)); 1147 } else if (scrollTop < this.currentScrollTop && scrollTop > this.headerBounds.bottom) { 1148 if (!this.preventReveal) { 1149 requestAnimationFrame(this.reveal.bind(this)); 1150 } else { 1151 window.clearTimeout(this.isScrolling); 1152 1153 this.isScrolling = setTimeout(() => { 1154 this.preventReveal = false; 1155 }, 66); 1156 1157 requestAnimationFrame(this.hide.bind(this)); 1158 } 1159 } else if (scrollTop <= this.headerBounds.top) { 1160 requestAnimationFrame(this.reset.bind(this)); 1161 } 1162 1163 1164 this.currentScrollTop = scrollTop; 1165 } 1166 1167 hide() { 1168 this.header.classList.add('easystore-section-header-hidden', 'easystore-section-header-sticky'); 1169 this.closeMenuDisclosure(); 1170 // this.closeSearchModal(); 1171 } 1172 1173 reveal() { 1174 this.header.classList.add('easystore-section-header-sticky', 'animate'); 1175 this.header.classList.remove('easystore-section-header-hidden'); 1176 } 1177 1178 reset() { 1179 this.header.classList.remove('easystore-section-header-hidden', 'easystore-section-header-sticky', 'animate'); 1180 } 1181 1182 closeMenuDisclosure() { 1183 this.disclosures = this.disclosures || this.header.querySelectorAll('details-disclosure'); 1184 this.disclosures.forEach(disclosure => disclosure.close()); 1185 } 1186 1187 // closeSearchModal() { 1188 // this.searchModal = this.searchModal || this.header.querySelector('details-modal'); 1189 // this.searchModal.close(false); 1190 // } 1191 } 1192 1193 customElements.define('sticky-header', StickyHeader); 1194 1195 1196 class DetailsDisclosure extends HTMLElement{ 1197 constructor() { 1198 super(); 1199 this.mainDetailsToggle = this.querySelector('details'); 1200 // this.mainDetailsToggle.addEventListener('focusout', this.onFocusOut.bind(this)); 1201 this.mainDetailsToggle.addEventListener('mouseover', this.open.bind(this)); 1202 this.mainDetailsToggle.addEventListener('mouseleave', this.close.bind(this)); 1203 } 1204 1205 onFocusOut() { 1206 setTimeout(() => { 1207 if (!this.contains(document.activeElement)) this.close(); 1208 }) 1209 } 1210 1211 open() { 1212 this.mainDetailsToggle.setAttribute('open',1) 1213 } 1214 1215 close() { 1216 this.mainDetailsToggle.removeAttribute('open') 1217 } 1218 } 1219 1220 customElements.define('details-disclosure', DetailsDisclosure); 1221 1222 function clearAll() { 1223 localStorage.removeItem('searchHistory'); 1224 1225 var customer = ""; 1226 if(customer) { 1227 // Your logic to clear all data or call an endpoint 1228 fetch('/account/search_histories', { 1229 method: 'DELETE', 1230 headers: { 1231 "Content-Type": "application/json", 1232 "X-Requested-With": "XMLHttpRequest" 1233 }, 1234 body: JSON.stringify({ 1235 _token: "IaqS15tBAPkZqUIUMjGHNVtI7Bpt08nzpx1iCciC" 1236 }), 1237 }) 1238 .then(response => response.json()) 1239 } 1240 } 1241 // End - delete search history from local storage 1242 1243 // search history dropdown 1244 var searchInputs = document.querySelectorAll('.search__input'); 1245 1246 if(searchInputs.length > 0) { 1247
1248 searchInputs.forEach((searchInput)=> { 1249 1250 searchInput.addEventListener('focus', function() { 1251 var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown'); 1252 searchDropdown.innerHTML = ''; // Clear existing items 1253 1254 // retrieve data from local storage 1255 var searchHistoryData = JSON.parse(localStorage.getItem('searchHistory')) || []; 1256 1257 // Convert JSON to string 1258 var search_history_json = JSON.stringify(searchHistoryData); 1259 1260 // Set the value of the hidden input 1261 searchInput.closest('form').querySelector(".hidden_search_history").value = search_history_json; 1262 1263 // create dropdown items 1264 var clearAllItem = document.createElement('div'); 1265 clearAllItem.className = 'dropdown-item clear-all'; 1266 clearAllItem.textContent = 'Clear'; 1267 clearAllItem.addEventListener('click', function() { 1268 clearAll(); 1269 searchDropdown.style.display = 'none'; 1270 searchInput.classList.remove('is-focus'); 1271 }); 1272 searchDropdown.appendChild(clearAllItem); 1273 1274 // create dropdown items 1275 searchHistoryData.forEach(function(item) { 1276 var dropdownItem = document.createElement('div'); 1277 dropdownItem.className = 'dropdown-item'; 1278 dropdownItem.textContent = item.term; 1279 dropdownItem.addEventListener('click', function() { 1280 searchInput.value = item.term; 1281 searchInput.closest('form').submit(); 1282 searchDropdown.style.display = 'none'; 1283 }); 1284 searchDropdown.appendChild(dropdownItem); 1285 }); 1286 1287 if(searchHistoryData.length > 0){ 1288 // display the dropdown 1289 searchInput.classList.add('is-focus'); 1290 document.body.classList.add('search-input-focus'); 1291 searchDropdown.style.display = 'block'; 1292 } 1293 }); 1294 1295 searchInput.addEventListener("focusout", (event) => { 1296 var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown'); 1297 searchInput.classList.remove('is-focus'); 1298 searchDropdown.classList.add('transparent'); 1299 setTimeout(()=>{ 1300 searchDropdown.style.display = 'none'; 1301 searchDropdown.classList.remove('transparent'); 1302 document.body.classList.remove('search-input-focus'); 1303 }, 400); 1304 }); 1305 }) 1306 } 1307 // End - search history dropdown 1308 1309 // referral notification popup 1310 const referralMessageTemplate = 'Your friend gifted you __CURRENCY_CODE__ __CREDIT_AMOUNT__ credit! Sign up now to redeem.'; 1311 const shopCurrency = 'RM'; 1312 1313 function getCookie(name) { 1314 const value = `; ${document.cookie}`; 1315 const parts = value.split(`; ${name}=`); 1316 if (parts.length === 2) return parts.pop().split(';').shift(); 1317 return null; 1318 } 1319 1320 function removeCookie(name) { 1321 document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`; 1322 } 1323 1324 function showReferralNotification() { 1325 const referralCode = getCookie('customer_referral_code'); 1326 1327 1328 const customerReferralCode = null; 1329 1330 1331 const activeReferralCode = referralCode || customerReferralCode; 1332 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 1333 1334 if (referralData.timestamp && referralData.expirationDays) { 1335 const expirationTime = referralData.timestamp + (referralData.expirationDays * 24 * 60 * 60 * 1000); 1336 if (Date.now() > expirationTime) { 1337 localStorage.removeItem('referral_notification_data'); 1338 return; 1339 } 1340 } 1341 1342 if (referralData.dismissed) return; 1343 1344 if (activeReferralCode) { 1345 if (referralData.creditAmount) { 1346 displayReferralNotification(referralData.creditAmount); 1347 } else { 1348 fetchReferralCampaignData(activeReferralCode); 1349 } 1350 } 1351 } 1352 1353 function fetchReferralCampaignData(referralCode) { 1354 fetch(`/customer/referral_program/campaigns/${referralCode}`) 1355 .then(response => { 1356 if (!response.ok) { 1357 throw new Error('Network response was not ok'); 1358 } 1359 return response.json(); 1360 }) 1361 .then(data => { 1362 let refereeCreditAmount = null; 1363 if (data.data.campaign && data.data.campaign.referral_rules) { 1364 const refereeRule = data.data.campaign.referral_rules.find(rule => 1365 rule.target_type === 'referee' && 1366 rule.event_name === 'customer/create' && 1367 rule.entitlement && 1368 rule.entitlement.type === 'credit' 1369 ); 1370 1371 if (refereeRule) { 1372 refereeCreditAmount = refereeRule.entitlement.amount; 1373 } 1374 } 1375 1376 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 1377 referralData.creditAmount = refereeCreditAmount; 1378 referralData.dismissed = referralData.dismissed || false; 1379 referralData.timestamp = Date.now(); 1380 referralData.expirationDays = 3; 1381 localStorage.setItem('referral_notification_data', JSON.stringify(referralData)); 1382 1383 displayReferralNotification(refereeCreditAmount); 1384 }) 1385 .catch(error => { 1386 removeCookie('customer_referral_code'); 1387 }); 1388 } 1389 1390 function displayReferralNotification(creditAmount = null) { 1391 const isMobile = innerWidth <= 749; 1392 1393 if (isMobile) { 1394 const mobileModal = document.querySelector('#referralMobileModal details'); 1395 const mobileMessageElement = document.getElementById('referralSignupMessageMobile'); 1396 1397 if (mobileModal && mobileMessageElement) { 1398 if (creditAmount) {
1399 const finalMessage = referralMessageTemplate 1400 .replace('__CREDIT_AMOUNT__', creditAmount) 1401 .replace('__CURRENCY_CODE__', shopCurrency); 1402 1403 mobileMessageElement.textContent = finalMessage; 1404 } 1405 1406 mobileModal.setAttribute('open', ''); 1407 } 1408 } else { 1409 const notification = document.getElementById('referralNotification'); 1410 1411 if (notification) { 1412 if (creditAmount) { 1413 const messageElement = document.getElementById('referralSignupMessage'); 1414 if (messageElement) { 1415 const finalMessage = referralMessageTemplate 1416 .replace('__CREDIT_AMOUNT__', creditAmount) 1417 .replace('__CURRENCY_CODE__', shopCurrency); 1418 1419 messageElement.textContent = finalMessage; 1420 } 1421 } 1422 1423 notification.style.display = 'block'; 1424 } 1425 } 1426 } 1427 1428 showReferralNotification(); 1429 1430 addEventListener('beforeunload', function() { 1431 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 1432 1433 if (referralData.creditAmount !== undefined) { 1434 referralData.creditAmount = null; 1435 localStorage.setItem('referral_notification_data', JSON.stringify(referralData)); 1436 } 1437 }); 1438 1439 function closeReferralNotification() { 1440 const notification = document.getElementById('referralNotification'); 1441 if (notification) { 1442 notification.style.display = 'none'; 1443 } 1444 } 1445 1446 function dismissReferralNotification() { 1447 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 1448 1449 referralData.dismissed = true; 1450 referralData.timestamp = referralData.timestamp || Date.now(); 1451 referralData.expirationDays = referralData.expirationDays || 3; 1452 1453 localStorage.setItem('referral_notification_data', JSON.stringify(referralData)); 1454 1455 closeReferralNotification(); 1456 } 1457 1458 function goToSignupPage() { 1459 location.href = '/account/register'; 1460 dismissReferralNotification(); 1461 } 1462 1463 function closeMobileReferralModal() { 1464 const mobileModal = document.querySelector('#referralMobileModal details'); 1465 if (mobileModal) { 1466 mobileModal.removeAttribute('open'); 1467 } 1468 1469 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 1470 referralData.dismissed = true; 1471 referralData.timestamp = referralData.timestamp || Date.now(); 1472 referralData.expirationDays = referralData.expirationDays || 3; 1473 localStorage.setItem('referral_notification_data', JSON.stringify(referralData)); 1474 } 1475 1476 function goToSignupPageFromMobile() { 1477 location.href = '/account/register'; 1478 closeMobileReferralModal(); 1479 } 1480 // End - referral notification popup 1481</script>
1481 1482 1483 1484 <main id="MainContent" class="content-for-layout focus-none" role="main" tabindex="-1">
vendor: 83 bytes, lines 1484-1487
1484 1485 1486 1487<script src="https://www.recaptcha.net/recaptcha/enterprise.js?render=
14876LdMNdIqAAAAALegJp7y4weVcCIlnwmIN8TWseEF
vendor: 12 bytes, line 1487
1487"></script>
1488<link rel="preload" href="https://store-themes.easystore.co/1074007/themes/55058/assets/customer.css?t=1788237975" as="style" onload="this.onload=null;this.rel='stylesheet'"> 1489<style> 1490 main.main-content .field > label{ 1491 display: none; 1492 } 1493 .h3{ 1494 font-size: 18px; 1495 } 1496 .button--full-width{ 1497 width: 100%; 1498 } 1499 .tab-wrapper{ 1500 display: inline-flex; 1501 justify-content: center; 1502 align-items: center; 1503 margin: 10px auto 20px; 1504 background-color: #eaeaea; 1505 border-radius: 200px; 1506 padding: 5px; 1507 gap: 10px; 1508 } 1509 .tab-wrapper .tab-label { 1510 display: inline-block; 1511 min-width: 130px; 1512 padding: 8px 15px; 1513 border-radius: 100px; 1514 cursor: pointer; 1515 font-size: 17px; 1516 line-height: 1.1; 1517 user-select: none; 1518 margin: 0; 1519 color: #000; 1520 } 1521 #register-tos a { 1522 display: inline; 1523 } 1524 @media screen and (max-width: 400px){ 1525 .tab-wrapper .tab-label { 1526 min-width: 110px; 1527 } 1528 } 1529 .tab-wrapper input[type='radio']:checked + .tab-label { 1530 background-color: #fff; 1531 box-shadow: 2px 2px 25px -10px #333; 1532 } 1533 1534 @media screen and (min-width: 500px){ 1535 .large--five-twelfths{ 1536 min-width: 420px; 1537 } 1538 } 1539</style> 1540 1541 1542 1543 1544<div class="customer login section-width-control small-width large--five-twelfths text-center wrapper"> 1545 <div class="card"> 1546 <h1 id="login" tabindex="-1" class="mb-0"> 1547 Welcome 1548 </h1> 1549 <p class="h3 mt-0"> 1550 1551 Sign up or log in to continue 1552 1553 </p> 1554 <div> 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 <div class="tab-wrapper"> 1573 <div> 1574 <input type="radio" name="type" id="tab-register" class="hide hidden" checked> 1575 <label for="tab-register" class="tab-label"> 1576 Sign up 1577 </label> 1578 </div> 1579 <div> 1580 <input type="radio" name="type" id="tab-login" class="hide hidden"> 1581 <label for="tab-login" class="tab-label"> 1582 Login 1583 </label> 1584 </div> 1585 </div> 1586 1587 1588 <form id="form-login" action="/account/auth" method="post" class="mt-2"> 1589 <input type="hidden" name="_token" value="IaqS15tBAPkZqUIUMjGHNVtI7Bpt08nzpx1iCciC"> 1590 <input type="hidden" name="location_id" value=""> 1591 <input type="hidden" name="staff_id" value=""> 1592 <input type="hidden" id="recaptchaResponse" name="g-recaptcha-response"> 1593 1594 1595 <div id="error-content"></div> 1596 1597 <div class="field"> 1598 <input 1599 type="text" 1600 name="customer[email_or_phone]" 1601 id="CustomerDetail" 1602 autocorrect="off" 1603 autocapitalize="off" 1604 placeholder="Email" 1605 required 1606 > 1607 <label for="CustomerDetail"> 1608 Email 1609 </label> 1610 </div> 1611 1612 <button 1613 type="submit" 1614 form="form-login" 1615 class="btn button--full-width g-recaptcha"> 1616 Continue 1617 </button> 1618 1619 <div class="button-snippet"> 1620 1621<!-- Snippet:login/button: Facebook Login --> 1622 <style> 1623 #fb-login-btn.btn{ 1624 background-color: #fff; 1625 color: #000; 1626 padding: 0; 1627 overflow: hidden; 1628 display: flex; 1629 justify-content: center; 1630 align-items: center; 1631 width: 100%; 1632 margin: 15px auto; 1633 font-size: 14px; 1634 border: 1px solid currentColor; 1635 box-shadow: none; 1636 } 1637 #fb-login-btn.btn:hover{ 1638 background-color: #fff; 1639 } 1640 #fb-login-btn.btn svg{ 1641 width: 45px; 1642 vertical-align: middle; 1643 padding: 5px; 1644 } 1645 #fb-login-btn.btn .fb-login-text{ 1646 padding: 13px 75px 13px 30px; 1647 display: inline-block; 1648 width: calc(100% - 52px); 1649 } 1650 1651 #fb-login-btn.btn--loading{ 1652 color: transparent !important; 1653 pointer-events: none; 1654 background: #fff !important; 1655 border-color: #000; 1656 } 1657 1658 #fb-login-btn.btn--loading:after { 1659 animation: loading 500ms infinite linear; 1660 border: 0.3em solid rgba(0, 0, 0, 0.4); 1661 border-left: 0.3em solid rgb(0, 0, 0); 1662 border-radius: 100%; 1663 box-sizing: content-box; 1664 content: ''; 1665 display: block; 1666 height: 1em; 1667 position: absolute; 1668 width: 1em; 1669 } 1670 1671 @keyframes loading { 1672 0% { 1673 transform: rotate(0deg); 1674 } 1675 100% { 1676 transform: rotate(360deg); 1677 } 1678 } 1679 @media screen and (max-width: 500px) { 1680 #fb-login-btn.btn .fb-login-text{ 1681 padding: 13px 25px 13px 8px; 1682 font-size: 13px; 1683 } 1684 } 1685 </style> 1686 <button id="fb-login-btn" type="button" class="btn" onclick="fb_login()" style="background-color: #fff; color: #000; font-weight: normal;"> 1687 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 700"><g><path d="M650,350C650,184.32,515.68,50,350,50S50,184.32,50,350c0,140.69,96.86,258.74,227.53,291.17V441.68H215.66V350h61.87V310.5c0-102.11,46.2-149.44,146.4-149.44,19,0,51.81,3.72,65.22,7.45V251.6c-7.08-.74-19.38-1.12-34.65-1.12-49.2,0-68.2,18.64-68.2,67.08V350h98.1l-16.8,91.68H386.35V647.8C534.88,629.86,650,503.38,650,350Z" fill="#0866ff"/><path d="M467.5,441.68,484.4,350h-98V317.6c0-48.44,19-67.08,68.19-67.08,15.28,0,27.6.37,34.66,1.12V168.51c-13.42-3.73-46.21-7.45-65.22-7.45-100.25,0-146.4,47.33-146.4,149.44V350H2
168715.66v91.68h61.87V641.17a301.61,301.61,0,0,0,108.82,6.63V441.68Z" fill="#fff"/></g></svg> 1688 <span class="fb-login-text">Continue with Facebook</span> 1689 </button> 1690 1691 <style> 1692 #fb-login-legal a{ 1693 display: inline; 1694 font-size: 1em; 1695 } 1696 </style> 1697 1698 <div id="fb-login-legal" style="text-align:center;margin:-5px auto 15px;font-size:12px;color:#666;">By continuing, you agree to our <a href="https://apps.easystore.co/facebook-login/privacy-policy" target="_blank" rel="noopener" style="color:#666;text-decoration:underline;">Privacy Policy</a> and <a href="https://apps.easystore.co/facebook-login/terms-of-service" target="_blank" rel="noopener" style="color:#666;text-decoration:underline;">Terms of Service</a>.</div> 1699 1700
1700<script> 1701 function fb_login(){ 1702 location.href = 'https://apps.easystore.co/facebook-login/run?domain='+window.location.protocol+'//'+window.location.hostname+'&shop=shopalaia.easy.co'; 1703 } 1704 document.querySelector('#fb-login-btn').addEventListener('click',()=>{ 1705 document.querySelector('#fb-login-btn').classList.add('btn--loading') 1706 }) 1707 </script>
1707 1708<!-- /Snippet --> 1709 1710 </div> 1711 1712 1713 1714 <div id="register-tos"> 1715 By signing up, I agree to the ALAIA's <a target="_blank" href="/legal/terms-of-service">Terms of Service</a>, <a target="_blank" href="/legal/privacy-policy">Privacy Policy</a> and <a target="_blank" href="/legal/refund-policy">Refund Policy</a>. 1716 </div> 1717 1718 </form> 1719 </div> 1720 </div> 1721 1722</div> 1723 1724 1725
1726<script> 1727 const register_tab = document.querySelector('#tab-register'); 1728 const login_tab = document.querySelector('#tab-login'); 1729 const register_tos = document.querySelector('#register-tos'); 1730 const isRegistrationEnabled = "1"; 1731 1732 if (register_tab) { 1733 register_tab.addEventListener('click', function() { 1734 if (register_tos) { 1735 register_tos.style.display = 'block'; 1736 } 1737 }); 1738 } 1739 if (login_tab) { 1740 login_tab.addEventListener('click', function() { 1741 if (register_tos) { 1742 register_tos.style.display = 'none'; 1743 } 1744 }); 1745 } 1746 1747 const methodSwitchBtn = document.getElementById('phone-login-btn'); 1748 if (methodSwitchBtn) { 1749 methodSwitchBtn.onclick = function () { 1750 var type = (register_tab && register_tab.checked) ? 'register' : 'login'; 1751 window.location.href = '/account/login?method=phone&type=' + type; 1752 }; 1753 } 1754 1755 let lastPathSegment = window.location.pathname.split('/').filter(segment => segment.length > 0).pop(); 1756 1757 // Redirect to login if trying to access register when self registration is disabled 1758 if (!isRegistrationEnabled) { 1759 if (lastPathSegment === 'register') { 1760 window.location.href = '/account/login'; 1761 } else if (lastPathSegment === 'login' || lastPathSegment === 'auth') { 1762 if (register_tos) { 1763 register_tos.style.display = 'none'; 1764 } 1765 } 1766 } else { 1767 // Only proceed with tab logic if not redirecting 1768 if(lastPathSegment === 'login') { 1769 if (login_tab) { 1770 login_tab.checked = true; 1771 } 1772 if (register_tos) { 1773 register_tos.style.display = 'none'; 1774 } 1775 } else { 1776 if (register_tos) { 1777 register_tos.style.display = 'block'; 1778 } 1779 } 1780 } 1781 1782 const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; 1783 const phonePattern = /^(?:\+?\d{1,3}[\s-]?)?(?:\d{1,14}[\s-]?){1,5}$/; 1784 1785 let form = document.querySelector('#form-login'), 1786 input = document.querySelector('#CustomerDetail'), 1787 error_content = document.querySelector('#error-content'); 1788 1789 1790 // One attempt at a time: the reCAPTCHA wait below is async, so without 1791 // this a double-click starts two continuations and posts the form twice. 1792 var submitting = false; 1793 1794 form.addEventListener('submit', async function (event) { 1795 // preventDefault FIRST: a re-entrant submit must still be cancelled, or the 1796 // browser performs a native post with no captcha token. 1797 event.preventDefault(); 1798 if (submitting) return; 1799 1800 let input_value = input.value 1801 error_content.innerHTML = ''; 1802 if (!input_value.match(emailPattern) && !input_value.match(phonePattern)) { 1803 error_content.innerHTML = `<div class="errors note">Invalid Email or Phone</div>`; 1804 return false; 1805 } 1806 1807 submitting = true; 1808 document.querySelector('#form-login .btn').classList.add('btn--loading','loading'); 1809 1810 // reCAPTCHA is unreachable from some regions (google.com is blocked in 1811 // mainland China). Fail open the same way checkout and forgot-password do: 1812 // submit without a token rather than leave the button spinning forever. 1813 try { 1814 if (window.grecaptcha && typeof window.grecaptcha.enterprise === 'object') { 1815 // The loader defines a stub {ready} synchronously and fetches the real 1816 // implementation asynchronously, so execute() may not exist yet. 1817 // ready() queues until it does; the timeout stops a bundle that never 1818 // arrives from hanging the button. 1819 await new Promise(function (resolve) { 1820 setTimeout(resolve, 3000); 1821 try { grecaptcha.enterprise.ready(resolve); } catch (e) { resolve(); } 1822 }); 1823 1824 const token = await grecaptcha.enterprise.execute('6LdMNdIqAAAAALegJp7y4weVcCIlnwmIN8TWseEF', { action: 'LOGIN' }); 1825 document.getElementById('recaptchaResponse').value = token; 1826 } 1827 } catch (e) { /* fail open */ } 1828 1829 document.getElementById('form-login').submit(); 1830 }); 1831 1832 1833</script>
1833 1834 1835 1836 </main> 1837 <style> 1838 .footer{ 1839 background-color: #FFFFFF; 1840 color: #484848; 1841 } 1842 .footer .link--text, 1843 .footer .list-menu__item--link, 1844 .footer .footer-block__details-content .list-menu__item--link{ 1845 color: #484848; 1846 } 1847 .footer-block__heading{ 1848 color: #000000; 1849 } 1850</style> 1851 1852<link href="https://store-themes.easystore.co/1074007/themes/55058/assets/section-footer.css?t=1788237975" rel="stylesheet" type="text/css" media="screen" /> 1853 1854<footer class="footer color-background-1"> 1855 <div class="footer__content-top page-width"> 1856 <div class="grid grid--1-col grid--4-col-tablet "> 1857 1858 1859 1860 <div class="grid__item"> 1861 1862 <h2 class="footer-block__heading">Our mission</h2> 1863 <div class="footer-block__details-content"> 1864 <p>Quality materials, good designs, craftsmanship and sustainability.</p> 1865 </div> 1866 <ul class="footer__list-social list-unstyled list-social" role="list"> 1867 1868 1869 <li class="list-social__item"> 1870 <a href="https://www.facebook.com/alaiacosmeticss/" class="link link--text list-social__link"> 1871 1872 1873 1874 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-facebook " 1875 viewBox="0 0 18 18"> 1876 <path fill="currentColor" 1877 d="M16.42.61c.27 0 .5.1.69.28.19.2.28.42.28.7v15.44c0 .27-.1.5-.28.69a.94.94 0 01-.7.28h-4.39v-6.7h2.25l.31-2.65h-2.56v-1.7c0-.4.1-.72.28-.93.18-.2.5-.32 1-.32h1.37V3.35c-.6-.06-1.27-.1-2.01-.1-1.01 0-1.83.3-2.45.9-.62.6-.93 1.44-.93 2.53v1.97H7.04v2.65h2.24V18H.98c-.28 0-.5-.1-.7-.28a.94.94 0 01-.28-.7V1.59c0-.27.1-.5.28-.69a.94.94 0 01.7-.28h15.44z"> 1878 </path> 1879 </svg> 1880 1881 1882 1883 </a> 1884 </li> 1885 1886 1887 <li class="list-social__item"> 1888 <a href="https://www.instagram.com/alaiacosmetic?utm_source=ig_web_button_share_sheet&igsh=ZDNlZDc0MzIxNw==" class="link link--text list-social__link"> 1889 1890 1891 1892 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-instagram " 1893 viewBox="0 0 18 18"> 1894 <path fill="currentColor" 1895 d="M8.77 1.58c2.34 0 2.62.01 3.54.05.86.04 1.32.18 1.63.3.41.17.7.35 1.01.66.3.3.5.6.65 1 .12.32.27.78.3 1.64.05.92.06 1.2.06 3.54s-.01 2.62-.05 3.54a4.79 4.79 0 01-.3 1.63c-.17.41-.35.7-.66 1.01-.3.3-.6.5-1.01.66-.31.12-.77.26-1.63.3-.92.04-1.2.05-3.54.05s-2.62 0-3.55-.05a4.79 4.79 0 01-1.62-.3c-.42-.16-.7-.35-1.01-.66-.31-.3-.5-.6-.66-1a4.87 4.87 0 01-.3-1.64c-.04-.92-.05-1.2-.05-3.54s0-2.62.05-3.54c.04-.86.18-1.32.3-1.63.16-.41.35-.7.66-1.01.3-.3.6-.5 1-.65.32-.12.78-.27 1.63-.3.93-.05 1.2-.06 3.55-.06zm0-1.58C6.39 0 6.09.01 5.15.05c-.93.04-1.57.2-2.13.4-.57.23-1.06.54-1.55 1.02C1 1.96.7 2.45.46 3.02c-.22.56-.37 1.2-.4 2.13C0 6.1 0 6.4 0 8.77s.01 2.68.05 3.61c.04.94.2 1.57.4 2.13.23.58.54 1.07 1.02 1.56.49.48.98.78 1.55 1.01.56.22 1.2.37 2.13.4.94.05 1.24.06 3.62.06 2.39 0 2.68-.01 3.62-.05.93-.04 1.57-.2 2.13-.41a4.27 4.27 0 001.55-1.01c.49-.49.79-.98 1.01-1.56.22-.55.37-1.19.41-2.13.04-.93.05-1.23.05-3.61 0-2.39 0-2.68-.05-3.62a6.47 6.47 0 00-.4-2.13 4.27 4.27 0 00-1.02-1.55A4.35 4.35 0 0014.52.46a6.43 6.43 0 00-2.13-.41A69 69 0 008.77 0z"> 1896 </path> 1897 <path fill="currentColor" 1898 d="M8.8 4a4.5 4.5 0 100 9 4.5 4.5 0 000-9zm0 7.43a2.92 2.92 0 110-5.85 2.92 2.92 0 010 5.85zM13.43 5a1.05 1.05 0 100-2.1 1.05 1.05 0 000 2.1z"> 1899 </path> 1900 </svg> 1901 1902 1903 1904 </a> 1905 </li> 1906 1907 1908 <li class="list-social__item"> 1909 <a href="https://www.tiktok.com/@alaiacosmetic?is_from_webapp=1&sender_device=pc" class="link link--text list-social__link"> 1910 1911 1912 1913 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-tiktok " width="16" 1914 height="18" fill="none" xmlns="http://www.w3.org/2000/svg"> 1915 <path 1916 d="M8.02 0H11s-.17 3.82 4.13 4.1v2.95s-2.3.14-4.13-1.26l.03 6.1a5.52 5.52 0 11-5.51-5.52h.77V9.4a2.5 2.5 0 101.76 2.4L8.02 0z" 1917 fill="currentColor"> 1918 </path> 1919 </svg> 1920 1921 1922 1923 </a> 1924 </li> 1925 1926 1927 1928 1929 1930 1931 </ul> 1932 1933 </div> 1934 1935 </div> 1936 </div>
1937 <div class="footer__content-bottom"> 1938 <div class="footer__content-bottom-wrapper page-width"> 1939 <div class="footer__column footer__column--info"> 1940 1941 1942 1943 1944 <div class="footer__payment"> 1945 <ul class="list list-payment" role="list"> 1946 1947 <li class="list-payment__item"> 1948 1949 1950 1951 <svg class="icon icon--full-color " viewBox="0 0 38 24" xmlns="http://www.w3.org/2000/svg" role="img" 1952 width="38" height="24" aria-labelledby="pi-visa"> 1953 <path opacity=".07" 1954 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> 1955 <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"> 1956 </path> 1957 <path 1958 d="M28.3 10.1H28c-.4 1-.7 1.5-1 3h1.9c-.3-1.5-.3-2.2-.6-3zm2.9 5.9h-1.7c-.1 0-.1 0-.2-.1l-.2-.9-.1-.2h-2.4c-.1 0-.2 0-.2.2l-.3.9c0 .1-.1.1-.1.1h-2.1l.2-.5L27 8.7c0-.5.3-.7.8-.7h1.5c.1 0 .2 0 .2.2l1.4 6.5c.1.4.2.7.2 1.1.1.1.1.1.1.2zm-13.4-.3l.4-1.8c.1 0 .2.1.2.1.7.3 1.4.5 2.1.4.2 0 .5-.1.7-.2.5-.2.5-.7.1-1.1-.2-.2-.5-.3-.8-.5-.4-.2-.8-.4-1.1-.7-1.2-1-.8-2.4-.1-3.1.6-.4.9-.8 1.7-.8 1.2 0 2.5 0 3.1.2h.1c-.1.6-.2 1.1-.4 1.7-.5-.2-1-.4-1.5-.4-.3 0-.6 0-.9.1-.2 0-.3.1-.4.2-.2.2-.2.5 0 .7l.5.4c.4.2.8.4 1.1.6.5.3 1 .8 1.1 1.4.2.9-.1 1.7-.9 2.3-.5.4-.7.6-1.4.6-1.4 0-2.5.1-3.4-.2-.1.2-.1.2-.2.1zm-3.5.3c.1-.7.1-.7.2-1 .5-2.2 1-4.5 1.4-6.7.1-.2.1-.3.3-.3H18c-.2 1.2-.4 2.1-.7 3.2-.3 1.5-.6 3-1 4.5 0 .2-.1.2-.3.2M5 8.2c0-.1.2-.2.3-.2h3.4c.5 0 .9.3 1 .8l.9 4.4c0 .1 0 .1.1.2 0-.1.1-.1.1-.1l2.1-5.1c-.1-.1 0-.2.1-.2h2.1c0 .1 0 .1-.1.2l-3.1 7.3c-.1.2-.1.3-.2.4-.1.1-.3 0-.5 0H9.7c-.1 0-.2 0-.2-.2L7.9 9.5c-.2-.2-.5-.5-.9-.6-.6-.3-1.7-.5-1.9-.5L5 8.2z" 1959 fill="#142688"></path> 1960 </svg> 1961 1962 1963 1964 </li> 1965 1966 1967 <li class="list-payment__item"> 1968 1969 1970 1971 <svg class="icon icon--full-color " viewBox="0 0 38 24" xmlns="http://www.w3.org/2000/svg" role="img" 1972 width="38" height="24" aria-labelledby="pi-master"> 1973 <path opacity=".07" 1974 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> 1975 <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"> 1976 </path> 1977 <circle fill="#EB001B" cx="15" cy="12" r="7"></circle> 1978 <circle fill="#F79E1B" cx="23" cy="12" r="7"></circle> 1979 <path fill="#FF5F00" 1980 d="M22 12c0-2.4-1.2-4.5-3-5.7-1.8 1.3-3 3.4-3 5.7s1.2 4.5 3 5.7c1.8-1.2 3-3.3 3-5.7z"></path> 1981 </svg> 1982 1983 1984 1985 </li> 1986 1987 1988 <li class="list-payment__item"> 1989 1990 1991 1992 <svg class="icon icon--full-color " xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 38 24" 1993 width="38" height="24" aria-labelledby="pi-american_express"> 1994 <g fill="none"> 1995 <path fill="#000" 1996 d="M35,0 L3,0 C1.3,0 0,1.3 0,3 L0,21 C0,22.7 1.4,24 3,24 L35,24 C36.7,24 38,22.7 38,21 L38,3 C38,1.3 36.6,0 35,0 Z" 1997 opacity=".07"></path> 1998 <path fill="#006FCF" 1999 d="M35,1 C36.1,1 37,1.9 37,3 L37,21 C37,22.1 36.1,23 35,23 L3,23 C1.9,23 1,22.1 1,21 L1,3 C1,1.9 1.9,1 3,1 L35,1"> 2000 </path> 2001 <path fill="#FFF" 2002 d="M8.971,10.268 L9.745,12.144 L8.203,12.144 L8.971,10.268 Z M25.046,10.346 L22.069,10.346 L22.069,11.173 L24.998,11.173 L24.998,12.412 L22.075,12.412 L22.075,13.334 L25.052,13.334 L25.052,14.073 L27.129,11.828 L25.052,9.488 L25.046,10.346 L25.046,10.346 Z M10.983,8.006 L14.978,8.006 L15.865,9.941 L16.687,8 L27.057,8 L28.135,9.19 L29.25,8 L34.013,8 L30.494,11.852 L33.977,15.68 L29.143,15.68 L28.065,14.49 L26.94,15.68 L10.03,15.68 L9.536,14.49 L8.406,14.49 L7.911,15.68 L4,15.68 L7.286,8 L10.716,8 L10.983,8.006 Z M19.646,9.084 L17.407,9.084 L15.907,12.62 L14.282,9.084 L12.06,9.084 L12.06,13.894 L10,9.084 L8.007,9.084 L5.625,14.596 L7.18,14.596 L7.674,13.406 L10.27,13.406 L10.764,14.596 L13.484,14.596 L13.484,10.661 L15.235,14.602 L16.425,14.602 L18.165,10.673 L18.165,14.603 L19.623,14.603 L19.647,9.083 L19.646,9.084 Z M28.986,11.852 L31.517,9.084 L29.695,9.084 L28.094,10.81 L26.546,9.084 L20.652,9.084 L20.652,14.602 L26.462,14.602 L28.076,12.864 L29.624,14.602 L31.499,14.602 L28.987,11.852 L28.986,11.852 Z"> 2003 </path> 2004 </g> 2005 </svg> 2006 2007 2008 2009 </li> 2010 2011 2012 <li class="list-payment__item"> 2013 2014 2015 2016 <svg class="icon icon--full-color " viewBox="0 0 38 24" xmlns="http://www.w3.org/2000/svg" width="38" 2017 height="24" role="img" aria-labelledby="pi-paypal"> 2018 <path opacity=".07" 2019 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> 2020 <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"> 2021 </path> 2022 <path fill="#003087" 2023 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"> 2024 </path> 2025 <path fill="#3086C8" 2026 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"> 2027 </path> 2028 <path fill="#012169"
2029 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 0-.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"> 2030 </path> 2031 </svg> 2032 2033 2034 2035 </li> 2036 2037 2038 <li class="list-payment__item"> 2039 2040 2041 2042 <svg class="icon icon--full-color " viewBox="0 0 38 24" xmlns="http://www.w3.org/2000/svg" role="img" 2043 width="38" height="24" aria-labelledby="pi-diners_club"> 2044 <path opacity=".07" 2045 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> 2046 <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"> 2047 </path> 2048 <path 2049 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" 2050 fill="#3086C8"></path> 2051 </svg> 2052 2053 2054 2055 </li> 2056 2057 2058 <li class="list-payment__item"> 2059 2060 2061 2062 <svg class="icon icon--full-color " viewBox="0 0 38 24" width="38" height="24" role="img" 2063 aria-labelledby="pi-discover" fill="none" xmlns="http://www.w3.org/2000/svg"> 2064 <path fill="#000" opacity=".07" 2065 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> 2066 <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"> 2067 </path> 2068 <path 2069 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" 2070 fill="#231F20"></path> 2071 <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)"> 2072 </path> 2073 <path opacity=".65" d="M20.16 12.86a2.931 2.931 0 100-5.862 2.931 2.931 0 000 5.862z" 2074 fill="url(#pi-paint1_linear)"></path> 2075 <path 2076 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" 2077 fill="#231F20"></path> 2078 <path 2079 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" 2080 fill="#231F20"></path> 2081 <path d="M37 12.984S27.09 19.873 8.976 23h26.023a2 2 0 002-1.984l.024-3.02L37 12.985z" fill="#F48120"> 2082 </path> 2083 <defs> 2084 <linearGradient id="pi-paint0_linear" x1="21.657" y1="12.275" x2="19.632" y2="9.104" 2085 gradientUnits="userSpaceOnUse"> 2086 <stop stop-color="#F89F20"></stop> 2087 <stop offset=".25" stop-color="#F79A20"></stop> 2088 <stop offset=".533" stop-color="#F68D20"></stop> 2089 <stop offset=".62" stop-color="#F58720"></stop> 2090 <stop offset=".723" stop-color="#F48120"></stop> 2091 <stop offset="1" stop-color="#F37521"></stop> 2092 </linearGradient> 2093 <linearGradient id="pi-paint1_linear" x1="21.338" y1="12.232" x2="18.378" y2="6.446" 2094 gradientUnits="userSpaceOnUse"> 2095 <stop stop-color="#F58720"></stop> 2096 <stop offset=".359" stop-color="#E16F27"></stop> 2097 <stop offset=".703" stop-color="#D4602C"></stop> 2098 <stop offset=".982" stop-color="#D05B2E"></stop> 2099 </linearGradient> 2100 </defs> 2101 </svg> 2102 2103 2104 2105 </li> 2106 2107 </ul> 2108 </div> 2109
2110 <div class="footer__copyright caption"> 2111 <div class="copyright__content">© 2026 ALAIA. Powered by <a href="http://www.easystore.co/?utm_source=storefront&utm_medium=sf_ref_footer&utm_campaign=sf_ref">EasyStore</a></div> 2112 </div> 2113 2114 <div class="footer__copyright caption"> 2115 2116 <div> 2117 2118 2119 2120 <a href="/legal/terms-of-service">Terms of Service</a> 2121 2122 2123 2124 2125 | <a href="/legal/privacy-policy">Privacy Policy</a> 2126 2127 2128 2129 2130 | <a href="/legal/refund-policy">Refund Policy</a> 2131 2132 2133 2134 </div> 2135 2136 </div> 2137 2138 </div> 2139 </div> 2140 </div> 2141</footer> 2142 2143 2144 2145 2146 2147
2147<script> 2148 EasyStore.Currencies.init([{"name":"Malaysian Ringgit","code":"MYR","rate":"1.0","format_prefix":"RM","format_suffix":null,"format_decimals":2,"thousand_separator":",","is_primary":true}], 1) 2149</script>
2149 2150 2151 2152 2153
2153<script> 2154 let page_template = 'customers'; 2155 2156 if(document.querySelector('.currency-picker')) { 2157 EasyStore.Currencies.change(document.querySelector('.currency-picker').value) 2158 EasyStore.Currencies.convertAll() 2159 } 2160 2161 document.querySelectorAll('.currency-picker').forEach((el)=>{ 2162 el.addEventListener('change',(event)=>{ 2163 EasyStore.Currencies.change(event.target.value) 2164 2165 2166 if (page_template == 'cart') { 2167 const params = new URLSearchParams(window.location.search); 2168 params.set('delete_cache', 1); 2169 window.location.search = params; 2170 } else { 2171 window.location.reload(); 2172 } 2173 2174 return 2175 2176 2177 document.querySelectorAll('[name=currencies],[name=current_currency]').forEach((el)=>{ 2178 el.value = event.target.value 2179 }) 2180 2181 if(page_template == 'cart') location.reload(); 2182 }) 2183 }) 2184 </script>
2184 2185 2186 2187 2188 2189
2189<script> 2190 2191 window.variantStrings = { 2192 addToCart: `Add to Cart`, 2193 soldOut: `Sold Out`, 2194 unavailable: `Unavailable`, 2195 } 2196 2197 window.accessibilityStrings = { 2198 shareSuccess: `Link copied to clipboard`, 2199 } 2200 </script>
2200 2201
2201<script> 2202 2203 /* 2204 2205 ------ 2206 Events 2207 ------ 2208 2209 pages/viewed 2210 2211 customers/signup 2212 2213 customers/login 2214 2215 products/searched 2216 2217 collections/viewed 2218 2219 products/viewed 2220 2221 products/shared 2222 2223 wishlists/item_added 2224 2225 carts/items_added 2226 2227 carts/viewed 2228 2229 carts/item_removed 2230 2231 checkouts/initiated 2232 2233 checkouts/shipping_info_added 2234 2235 checkouts/payment_info_added 2236 2237 checkouts/completed 2238 2239 orders/placed 2240 2241 orders/purchased 2242 2243 payments/captured 2244 2245 payments/failed 2246 2247 */ 2248 2249 window.__latest_cart = window.__latest_cart || null; 2250 2251 const _selector = document.querySelector.bind(document), 2252 _selectorAll = document.querySelectorAll.bind(document) 2253 2254 document.addEventListener('DOMContentLoaded', (event) => { 2255 2256 const default_currency = getCookie("currency") 2257 const customer_id = window.__st.cid 2258 const template = window.__st.p 2259 2260 onPageView() 2261 2262 //-----------------------// 2263 // Configs // 2264 //-----------------------// 2265 2266 window.dataLayer = window.dataLayer || [] 2267 2268 Array.prototype.last = Array.prototype.last || function() { 2269 return this[this.length - 1] || null 2270 } 2271 2272 Array.prototype.first = Array.prototype.first || function() { 2273 return this[0] || null 2274 } 2275 2276 //----------------------// 2277 // Triggers // 2278 //----------------------// 2279 2280 const XHR = window.XMLHttpRequest 2281 2282 function xhr() { 2283 2284 const xhr = new XHR() 2285 2286 xhr.addEventListener("readystatechange", function() { 2287 2288 if(xhr.readyState != 4) return 2289 2290 try { 2291 2292 const response_url = xhr.responseURL 2293 2294 if (response_url.includes("cart/add")) { 2295 2296 window.__latest_cart = JSON.parse(xhr.response) 2297 2298 onCartItemsAdded() // ok 2299 2300 } 2301 2302 if (response_url.includes("cart/remove_item_quantity")) { 2303 2304 window.__latest_cart = JSON.parse(xhr.response) 2305 2306 onCartItemRemoved() // ok 2307 2308 } 2309 2310 if (response_url.includes("new_cart?retrieve=true")) { 2311 2312 result = JSON.parse(xhr.response) 2313 2314 if (result.cart) { 2315 window.__latest_cart = result.cart 2316 } 2317 2318 } 2319 2320 } catch(e) { 2321 2322 console.error(e) 2323 2324 } 2325 2326 }, false); 2327 2328 return xhr 2329 2330 } 2331 2332 window.XMLHttpRequest = xhr 2333 2334 switch(template) { 2335 2336 case 'cart': onCartView() // ok 2337 break 2338 case 'product': onProductView() // ok 2339 break 2340 case 'collection': onCollectionView() // ok 2341 break 2342 case 'blog': onBlogView() 2343 break 2344 case 'article': onArticleView() 2345 break 2346 case 'payment_completed': onOrderPlace() 2347 break 2348 case 'payment_fail': onPaymentFail() 2349 break 2350 2351 } 2352 2353 // _selector('form[action="/checkout/payments"]').addEventListener("submit", onPaymentInfoAdded(_selector('form[action="/checkout/payments"]'))) 2354 if (_selector('form[action="/checkout/detail"]')) _selector('form[action="/checkout/detail"]').addEventListener("submit", ()=>{onShippingInfoAdded(_selector('form[action="/checkout/detail"]'))}) // ok 2355 if (_selector('form[action="/checkout/shipping"]')) _selector('form[action="/checkout/shipping"]').addEventListener("submit", ()=>{onShippingInfoAdded(_selector('form[action="/checkout/shipping"]'))}) // ok 2356 if (_selector('form[action="/account/register"]')) _selector('form[action="/account/register"]').addEventListener("submit", onSignUp) // ok 2357 if (_selector('form[action="/account/login"]')) _selector('form[action="/account/login"]').addEventListener("submit", onLogin) // ok 2358 if (_selector('form[action="/search"]')) _selector('form[action="/search"]').addEventListener("submit", onProductSearch()) // ok 2359 if (_selector('#line-login-btn')) _selector('#line-login-btn').addEventListener('click', onLineLogin) // ok 2360 if (_selector('#PlaceOrder')) _selector('#PlaceOrder').addEventListener("click", ()=>{onCheckoutComplete(_selector('form[action="/checkout/payments"]'))}); // ok 2361 if (_selector('#add_wishlist')) _selector('#add_wishlist').addEventListener("click", onWishlistItemAdded) // ok 2362 if (_selectorAll('a[href="/account/logout"]')) _selectorAll('a[href="/account/logout"]').forEach(logoutButton => logoutButton.addEventListener("click", onLogout)) // ok 2363 if (_selector('.CartDrawerTrigger.cart-page-link')) _selector('.CartDrawerTrigger.cart-page-link').addEventListener("click", onCartView) // ok 2364 if (_selector('.CartDrawerTrigger.cart-page-link.mobile-cart-page-link')) _selector('.CartDrawerTrigger.cart-page-link.mobile-cart-page-link').addEventListener("click", onCartView) // ok 2365 if (_selectorAll('a[class^="share-"]')) _selectorAll('a[class^="share-"]').forEach(shareButton => shareButton.addEventListener("click", ()=>{onProductShare(shareButton)}) ) // ok 2366 if (_selectorAll('[name$="checkout"]')) _selectorAll('[name$="checkout"]').forEach(checkoutButton => checkoutButton.addEventListener("click", onCheckoutInitiate)) 2367 2368 // For append elements 2369 const bodyMutationObserver = new MutationObserver(() => { 2370 if (_selector('#form__spc #PlaceOrder')) _selector('#form__spc #PlaceOrder').addEventListener("click", onSinglePageCheckout) // ok 2371 if (_selectorAll('[name$="checkout"]')) _selectorAll('[name$="checkout"]').forEach(checkoutButton => checkoutButton.addEventListener("click", onCheckoutInitiate)) 2372 }); 2373 bodyMutationObserver.observe(_selector("body"), {subtree: true, childList: true}); 2374 2375 //------------------------------// 2376 // Event handlers // 2377 //------------------------------// 2378 2379 function onPageView() { 2380 2381 EasyStore.Event.dispatch('pages/viewed', { 2382 page: { 2383 type: template, 2384 title: document.title, 2385 description: _selector('meta[name=description]') ? _selector('meta[name=description]').getAttribute('content') : null, 2386 url: location.href, 2387 } 2388 }) 2389 2390 } 2391 2392 function onSignUp() { 2393 2394 const email_regex = new RegExp(/^[a-zA-Z0-9.!#$%&"*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/) 2395 const phone_regex = new RegExp(/^(\+?6?01)[0-46-9]-*[0-9]{7,8}$/) 2396 2397 const email_or_phone = _selector(`input[name="customer[email_or_phone]"]`).value.replace("+", "").replace(/\s+/, "") 2398 2399 let data = {} 2400 2401 if (email_regex.test(email_or_phone)) { 2402 data.method = 'email' 2403 data.email = email_or_phone 2404 } 2405 2406 if (phone_regex.test(email_or_phone)) { 2407 data.method = "phone" 2408 data.phone = email_or_phone 2409 } 2410 2411 if (!data.method) return 2412 2413 EasyStore.Event.dispatch('customers/signup', data) 2414 2415 } 2416 2417 function onLogin() { 2418 2419 const email_regex = new RegExp(/^[a-zA-Z0-9.!#$%&"*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/) 2420 const phone_regex = new RegExp(/^(\+?6?01)[0-46-9]-*[0-9]{7,8}$/) 2421 2422 const email_or_phone = _selector(`input[name="customer[email_or_phone]"]`).value.replace("+", "").replace(/\s+/, "") 2423 2424 let data = {} 2425 2426 if (email_regex.test(email_or_phone)) { 2427 data.method = 'email' 2428 data.email = email_or_phone 2429 } 2430 2431 if (phone_regex.test(email_or_phone)) { 2432 data.method = "phone" 2433 data.phone = email_or_phone 2434 } 2435 2436 if (!data.method) return 2437 2438 EasyStore.Event.dispatch('customers/login', data) 2439 2440 } 2441 2442 function onLineLogin() { 2443 2444 EasyStore.Event.dispatch('customers/login', { method: 'line' }) 2445 2446 } 2447 2448 function onLogout() { 2449 2450 EasyStore.Event.dispatch('customers/logout', { customer_id }) 2451 2452 } 2453 2454 function onBlogView() { 2455 2456 const blog = "" 2457 2458 EasyStore.Event.dispatch('blogs/viewed', { blog }) 2459 2460 } 2461 2462 function onArticleView() { 2463 2464 const article = "" 2465 2466 EasyStore.Event.dispatch('articles/viewed', { article }) 2467 2468 } 2469 2470 function onProductSearch() { 2471 2472 const query = _selector('input[name=q]').value 2473 2474 if (!query) return 2475 2476 EasyStore.Event.dispatch('products/searched', { query }) 2477 2478 } 2479 2480 function onCollectionView() { 2481 2482 const collection = "" 2483 2484 EasyStore.Event.dispatch('collections/viewed', { collection }) 2485 2486 } 2487 2488 function onProductView() { 2489 2490 const product = "" 2491 2492 EasyStore.Event.dispatch("products/viewed", { product }) 2493 2494 } 2495 2496 function onProductShare(el) { 2497 2498 const product = "" 2499 2500 const channel = el.getAttribute("class").split("-").last() 2501 2502 EasyStore.Event.dispatch('products/shared', { product, channel }) 2503 2504 } 2505 2506 function onWishlistItemAdded() { 2507 2508 let product = "" 2509 const quantity = _selector("#Quantity").value 2510 2511 EasyStore.Event.dispatch('wishlists/item_added', { product }) 2512 2513 } 2514 2515 async function onCartItemsAdded() { 2516 2517 const cart = await getCart() 2518 2519 if(cart && cart.items != undefined && cart.items.length > 0) { 2520 2521 EasyStore.Event.dispatch('carts/item_added', { cart }) 2522 2523 } 2524 2525 } 2526 2527 async function onCartView() { 2528 2529 const cart = await getCart() 2530 2531 EasyStore.Event.dispatch('carts/viewed', { cart }) 2532 2533 } 2534 2535 async function onCartItemRemoved() { 2536 2537 const cart = await getCart() 2538 2539 cart.items = [] 2540 2541 if(cart) { 2542 2543 EasyStore.Event.dispatch('carts/item_removed', { cart }) 2544 2545 } 2546 2547 } 2548 2549 async function onCheckoutInitiate() { 2550 2551 const cart = await getCart() 2552 2553 EasyStore.Event.dispatch('checkouts/initiated', { cart }) 2554 2555 } 2556 2557 async function onShippingInfoAdded(form) { 2558 let checkout = getCheckout() 2559 2560 let form_data = {} 2561 new FormData(form).forEach((value, key) => form_data[key] = value) 2562 2563 let shipping_tier = null 2564 2565 if (form_data.type && form_data.type.startsWith("r_pickup")) { 2566 shipping_tier = `Pickup - ${form_data.pick_location}` 2567 } 2568 2569 if (form_data.s_id) {
2570 shipping_tier = _selector(`input[id='`+form_data.s_id+`']`).getAttribute("data-shipping-name") 2571 } 2572 2573 if (!shipping_tier) return 2574 2575 EasyStore.Event.dispatch('checkouts/shipping_info_added', { checkout, shipping_tier }) 2576 2577 } 2578 2579 async function onPaymentInfoAdded(form) { 2580 2581 let checkout = getCheckout() 2582 2583 let payment_type = new FormData(form).get('payment_method') 2584 2585 EasyStore.Event.dispatch("checkouts/payment_info_added", { checkout, payment_type }) 2586 2587 } 2588 2589 async function onOrderPlace() { 2590 2591 let cart_token = getCookie("cart_js") 2592 let previous_cart_token = getCookie("previous_cart_ga4_js") 2593 2594 if (previous_cart_token && previous_cart_token == cart_token) { 2595 // Prevent duplicate purchase tracking 2596 return 2597 } 2598 2599 let order = getOrder() 2600 2601 EasyStore.Event.dispatch('orders/placed', { order }) 2602 2603 if(order.is_manual_payment) { 2604 2605 EasyStore.Event.dispatch('orders/purchased', { order }) 2606 2607 } 2608 2609 const last_transaction = order.transactions.last() 2610 2611 if (last_transaction.status) { 2612 2613 EasyStore.Event.dispatch('orders/purchased', { order }) 2614 EasyStore.Event.dispatch('payments/captured', { order }) 2615 2616 } 2617 2618 } 2619 2620 async function onPaymentFail() { 2621 2622 const order = getOrder() 2623 2624 EasyStore.Event.dispatch('payments/failed', { order }) 2625 2626 } 2627 2628 async function onCheckoutComplete(form) { 2629 2630 onPaymentInfoAdded(form) 2631 2632 const checkout = getCheckout() 2633 2634 EasyStore.Event.dispatch('checkouts/completed', { checkout }) 2635 2636 } 2637 2638 async function onSinglePageCheckout() { 2639 2640 // let checkout = $("[data-app-checkout]").data("app-checkout") 2641 2642 let checkout = getCheckout() 2643 2644 // const payment_type = _selector("#app_spc_payment_method").find(`[class*="label-content"]`).first().find("b").first().text() 2645 const payment_type = _selector("#app_spc_payment_method").getElementsByClassName('label-content')[0].getElementsByTagName('b')[0].innerHTML 2646 2647 const shipping_method = _selector("#delivery_method").value 2648 2649 let shipping_tier = null 2650 let app_spc_customer_info_label = _selector("#app_spc_customer_info").getElementsByClassName('label-content') 2651 if (shipping_method == "shipping") { 2652 shipping_tier = app_spc_customer_info_label[app_spc_customer_info_label.length - 1].getElementsByTagName('b')[0].innerHTML 2653 } 2654 2655 if (shipping_method == "pickup") { 2656 shipping_tier = app_spc_customer_info_label[0].innerHTML 2657 } 2658 2659 if (shipping_tier) { 2660 2661 EasyStore.Event.dispatch('checkouts/shipping_info_added', { 2662 checkout, 2663 shipping_tier, 2664 }) 2665 2666 } 2667 2668 if (payment_type) { 2669 2670 EasyStore.Event.dispatch('checkouts/payment_info_added', { 2671 checkout, 2672 payment_type, 2673 }) 2674 2675 } 2676 2677 EasyStore.Event.dispatch('checkouts/completed', { checkout }) 2678 2679 } 2680 2681 }) 2682 2683 2684 //-----------------------// 2685 // Functions // 2686 //-----------------------// 2687 2688 function getCookie(name) { 2689 2690 name += "=" 2691 2692 decodedCookie = decodeURIComponent(document.cookie) 2693 2694 ca = decodedCookie.split(";") 2695 2696 for(i = 0; i < ca.length; i++) { 2697 c = ca[i] 2698 while (c.charAt(0) == " ") { 2699 c = c.substring(1) 2700 } 2701 if (c.indexOf(name) == 0) { 2702 return c.substring(name.length, c.length) 2703 } 2704 } 2705 2706 return "" 2707 2708 } 2709 2710 const parsePrice = price => { 2711 if(typeof price === 'string') { 2712 return parseFloat(price.split(',').join('')) 2713 } 2714 2715 return price 2716 } 2717 2718 const requestCart = async (method, data) => { 2719 2720 let response = await fetch('/cart.json', {method: 'GET',headers: {'Content-Type': 'application/json'}}) 2721 result = await response.json() 2722 2723 return result.cart 2724 2725 } 2726 const getCart = async (latest = false) => { 2727 2728 let cart = window.__latest_cart 2729 2730 const cart_invalid = !cart || !cart.items || (cart.total_price > 0 && !cart.items.length) 2731 2732 if(latest || cart_invalid) { 2733 cart = await requestCart() 2734 } 2735 2736 cart.items = cart.items || [] 2737 2738 return mapCart(cart) 2739 2740 } 2741 2742 const getCheckout = async () => { 2743 mapCheckout(window.__latest_cart || await requestCart()) 2744 } 2745 2746 const getOrder = async () => { 2747 mapOrder(window.__latest_cart || await requestCart()) 2748 } 2749 2750 //-----------------------// 2751 // Mappers // 2752 //-----------------------// 2753 2754 const fallbackAttribute = (object, attribute) => { 2755 2756 if(!Array.isArray(attribute)) { 2757 attribute = [attribute] 2758 } 2759 2760 let final_value = null 2761 2762 do { 2763 2764 final_value = object[attribute.shift()] 2765 2766 } while(!final_value && attribute.length) 2767 2768 return final_value 2769 2770 } 2771 2772 const map = (object, mapper) => { 2773 2774 const newObject = {} 2775 2776 for(const key in mapper) { 2777 2778 // Handle different keys between new and old format
2779 newObject[key] = fallbackAttribute(object, mapper[key]) 2780 2781 // Cast price to float 2782 if(newObject[key] && ['price', 'amount', 'discount', 'discounts'].some(x => key.endsWith(x))) { 2783 newObject[key] = parsePrice(newObject[key]) 2784 } 2785 2786 if(newObject[key] === undefined) { 2787 delete newObject[key] 2788 } 2789 2790 } 2791 2792 return newObject 2793 2794 } 2795 2796 const mapCart = cart => { 2797 2798 const oldCart = cart 2799 2800 const mapper = { 2801 id: 'id', 2802 currency: 'currency', 2803 item_count: 'item_count', 2804 items: 'items', 2805 total_price: 'total_price', 2806 latest_items: 'latest_items' 2807 } 2808 2809 cart = map(cart, mapper) 2810 2811 const discounts = (oldCart.storewide_discounts || []).concat((oldCart.voucher_discounts || [])) 2812 2813 cart.discount_applications = discounts.map(discount => ({ 2814 title: discount.voucher_code || null, 2815 value: parsePrice(discount.amount), 2816 })) 2817 2818 cart.original_total_price = cart.items.length 2819 ? cart.items 2820 .map(item => item.original_price) 2821 .reduce((sum, price) => sum + price) 2822 : 0 2823 2824 cart.total_discount = cart.discount_applications.length 2825 ? cart.discount_applications 2826 .map(discount => parsePrice(discount.value)) 2827 .reduce((sum, value) => sum + value) 2828 : 0 2829 2830 cart.items = cart.items.map(item => mapLineItem(item)) 2831 2832 return cart 2833 2834 } 2835 2836 const mapCheckout = checkout => { 2837 2838 const mapper = { 2839 note: 'note', 2840 attributes: 'note_attributes', 2841 billing_address: 'billing_address', 2842 currency: 'currency', 2843 customer_id: 'customer_id', 2844 discounts_amount: 'total_discount', 2845 id: 'id', 2846 line_items: 'order_item', 2847 order_number: 'order_number', 2848 shipping_address: 'shipping_address', 2849 shipping_price: 'shipping_tax', 2850 shipping_method: 'shipping_method_name', 2851 tax_price: 'total_tax', 2852 } 2853 2854 checkout = map(checkout, mapper) 2855 2856 checkout.requires_shipping = checkout.line_items.some(item => item.shipping_required) 2857 2858 checkout.line_items = checkout.line_items.map(item => mapLineItem(item)) 2859 2860 return checkout 2861 2862 } 2863 2864 const mapOrder = order => { 2865 2866 const mapper = { 2867 attributes: 'note_attributes', 2868 billing_address: 'billing_address', 2869 cancelled: 'is_cancelled', 2870 cancelled_at: 'cancelled_at', 2871 created_at: 'created_at', 2872 customer_id: 'customer_id', 2873 // discount_applications: 'discount_applications', 2874 email: 'email', 2875 financial_status: 'financial_status', 2876 fulfillment_status: 'fulfillment_status', 2877 line_items: 'order_item', 2878 note: 'note', 2879 order_number: 'order_number', 2880 phone: 'phone', 2881 shipping_address: 'shipping_address', 2882 shipping_methods: 'shipping_methods', 2883 shipping_price: 'total_shipping', 2884 subtotal_price: 'subtotal_price', 2885 // tax_lines: 'tax_lines', 2886 tax_price: 'total_tax', 2887 total_discounts: 'total_discount', 2888 total_net_amount: 'total_amount_include_transaction', 2889 total_price: 'total_price', 2890 transactions: 'transaction_records', 2891 is_manual_payment: 'is_manual_payment', 2892 } 2893 2894 order.email = order.billing_address.email 2895 order.phone = order.billing_address.phone 2896 order.shipping_method = order.shipping_method_name 2897 2898 order = map(order, mapper) 2899 2900 order.line_items = order.line_items.map(item => mapLineItem(item)) 2901 order.transactions = order.transactions.map(transaction => mapTransaction(transaction)) 2902 2903 return order 2904 2905 } 2906 2907 const mapLineItem = line_item => { 2908 2909 const old_line_item = line_item 2910 2911 const mapper = { 2912 final_price: 'price', 2913 image: 'img_url', 2914 message: 'message', 2915 original_line_price: 'original_line_price', 2916 original_price: 'original_price', 2917 properties: 'properties', 2918 quantity: 'quantity', 2919 requires_shipping: 'shipping_required', 2920 sku: 'sku', 2921 taxable: 'taxable', 2922 title: 'product_name', 2923 product_name: 'product_name', 2924 url: 'url', 2925 product_id: 'product_id', 2926 variant_id: 'variant_id', 2927 id: ['id', 'i_id'], 2928 } 2929 2930 line_item = map(line_item, mapper) 2931 2932 line_item.product_id = line_item.product_id || (old_line_item.product && old_line_item.product.id) || null 2933 line_item.variant_id = line_item.variant_id || (old_line_item.variant && old_line_item.variant.id) || null 2934 line_item.image = line_item.image || (old_line_item.image && old_line_item.image.url) || null 2935 2936 return line_item 2937 2938 } 2939 2940 const mapTransaction = transaction => { 2941 2942 const mapper = { 2943 amount: 'amount', 2944 created_at: 'created_at', 2945 gateway: 'gateway_type', 2946 id: 'id', 2947 status: 'status', 2948 } 2949 2950 transaction = map(transaction, mapper) 2951 2952 return transaction 2953 2954 } 2955 2956 2957</script>
2957 2958 2959</body> 2960</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.