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/251247/f/14831591.png" /> 15 16 17 <!-- Title and description ================================================== --> 18 <title> 19 Login – nori.com.my 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.nori.com.my/account/login"> 30 31 <meta property="og:image" content="https://cdn.store-assets.com/s/251247/f/14831580.jpg"> 32 <meta property="og:image:secure_url" content="https://cdn.store-assets.com/s/251247/f/14831580.jpg"> 33 34 35 36<meta property="og:description" content="Nori is the place where you can find the best Celebrity Branded Health and Beauty products. We have products that enhances your beauty and help you stay healthy."> 37<meta property="og:site_name" content="nori.com.my"> 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.nori.com.my/account/login"> 53 <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1"> 54 <meta name="theme-color" content="#000000"> 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.1669860959','/assets/traffic.js?v=1','https://apps.easystore.co/sales-pop/script.js?shop=nori.easy.co','https://apps.easystore.co/google-analytics/script.js?shop=nori.easy.co','https://apps.easystore.co/google-analytics-4/script.js?shop=nori.easy.co','https://apps.easystore.co/hotjar/script.js?shop=nori.easy.co&t=1752054084','https://chimpstatic.com/mcjs-connected/js/users/6db777a9ed8a20cdf3b457723/fc072f0ebecff5b09d0928c84.js','https://smartarget.online/loader.js?type=int&u=f6cf4c864794ea6e890a35db28f2cc23cf485568&source=easystore_whatsapp'];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/251247/themes/282847/assets/global.js?t=1790328533" 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: 'Chivo'; 91 font-style: normal; 92 font-weight: regular; 93 src: local('Chivo regular'), local('Chivo-regular'), url(https://fonts.gstatic.com/s/chivo/v12/va9I4kzIxd1KFoBvS-J3kbDP.ttf) format('truetype'); 94 } 95 96 @font-face { 97 font-family: 'Amethysta'; 98 font-style: normal; 99 font-weight: regular; 100 src: local('Amethysta regular'), local('Amethysta-regular'), url(https://fonts.gstatic.com/s/amethysta/v9/rP2Fp2K15kgb_F3ibfWIGDWCBl0O8Q.ttf) format('truetype'); 101 } 102 103 :root { 104 --font-body-family: 'Chivo', sans-serif; 105 --font-body-style: normal; 106 --font-body-weight: 500; 107 108 --font-heading-family: 'Amethysta', serif; 109 --font-heading-style: normal; 110 --font-heading-weight: 400; 111 112 --color-heading-text: 0,0,0; 113 --color-base-text: 0,0,0; 114 --color-base-background-1: 241,238,231; 115 --color-base-background-2: 241,238,231; 116 117 --color-base-solid-button-labels: 255,255,255; 118 --color-base-outline-button-labels: 57,67,104; 119 120 --color-base-accent-1: 0,0,0; 121 --color-base-accent-2: 0,0,0; 122 --payment-terms-background-color: 241,238,231; 123 124 --gradient-base-background-1: 241,238,231; 125 --gradient-base-background-2: 241,238,231; 126 --gradient-base-accent-1: 0,0,0; 127 --gradient-base-accent-2: 0,0,0; 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 background-image: url('https://cdn.store-assets.com/s/251247/f/14694395.jpg'); 158 background-position: top center; 159 160 161 } 162 163 @media screen and (min-width: 750px) { 164 body { 165 font-size: 1.6rem; 166 } 167 } 168 </style> 169 170 <link href="https://store-themes.easystore.co/251247/themes/282847/assets/base.css?t=1790328533" rel="stylesheet" type="text/css" media="screen" /> 171 172 173 174<!-- Snippet:global/head: InvolveAsia -->
175<script type="text/javascript" src="https://apps.easystore.co/involve-asia/nori.easy.co/script.js" ></script>
175 176<!-- /Snippet --> 177 178<!-- Snippet:global/head: Intercom --> 179<meta name="intercom" content="intercom" /> 180<!-- /Snippet --> 181 182<!-- Snippet:global/head: OnVoard Product Recommender -->
183<script> 184 (function() { 185 window.OnVoard = window.OnVoard || function() { 186 (window.OnVoard.q = window.OnVoard.q || []).push(arguments); 187 }; 188 var script = document.createElement("script"); 189 var parent = document.getElementsByTagName("script")[0].parentNode; 190 script.async = 1; 191 192 193 script.src = "https://scripts.onvoard.com/apps/loader.js"; 194 195 parent.appendChild(script); 196 })(); 197</script>
197 198 199
200<script> 201 202var ovData = {}; 203ovData["ecommerce_platform"] = "easystore"; 204ovData["account_id"] = "acct_19939zey3htaynr"; 205 206 207 ovData["template"] = "customers"; 208 ovData["cart"] = {"item_count":0,"total_price":0,"announcements":[]}; 209 ovData["product"] = ""; 210 ovData["shop"] = {}; 211 ovData["customer"] = {}; 212 213 214 ovData["shop"] = { 215 "currency": "MYR", 216 "domain": "www.nori.com.my", 217 "url": "https://www.nori.com.my", 218 "money_format": "<span class=money data-ori-price='{{amount}}'>RM {{amount}} </span>", 219 }; 220 221 222 223 224 window.OnVoardData = ovData; 225</script>
225 226 227<!-- /Snippet --> 228 229<!-- Snippet:global/head: Insert Code --> 230 231<!--TikTok -->
vendor: 998 bytes, lines 232-239
232<script> 233!function (w, d, t) { 234 w.TiktokAnalyticsObject=t;var ttq=w[t]=w[t]||[];ttq.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie"],ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);ttq.instance=function(t){for(var e=ttq._i[t]||[],n=0;n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e},ttq.load=function(e,n){var i="https://analytics.tiktok.com/i18n/pixel/events.js";ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=i,ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},ttq._o[e]=n||{};var o=document.createElement("script");o.type="text/javascript",o.async=!0,o.src=i+"?sdkid="+e+"&lib="+t;var a=document.getElementsByTagName("script")[0];a.parentNode.insertBefore(o,a)}; 235 236 ttq.load('CD03UM3C77U53J7CIR9G'); 237 ttq.page(); 238}(window, document, 'ttq'); 239</script>
239 240<!--Nori Jolie's Facebook Pixel --> 241<!-- Meta Pixel Code -->
242<script>
vendor: 426 bytes, lines 242-251
242 243 !function(f,b,e,v,n,t,s) 244 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 245 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 246 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 247 n.queue=[];t=b.createElement(e);t.async=!0; 248 t.src=v;s=b.getElementsByTagName(e)[0]; 249 s.parentNode.insertBefore(t,s)}(window, document,'script', 250 'https://connect.facebook.net/en_US/fbevents.js'); 251 fbq('init', '
2511171022940276880
vendor: 34 bytes, lines 251-252
251'); 252 fbq('track', 'PageView');
253</script>
253 254<noscript><img height="1" width="1" style="display:none" 255 src="https://www.facebook.com/tr?id=1171022940276880&ev=PageView&noscript=1" 256/></noscript> 257<!-- End Meta Pixel Code --> 258<!--Microsoft Clarity -->
259<script type="text/javascript"> 260 (function(c,l,a,r,i,t,y){ 261 c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; 262 t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; 263 y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); 264 })(window, document, "clarity", "script", "snyzvmbc69"); 265</script>
265 266<!-- /Snippet --> 267 268 269
269<script>document.documentElement.className = document.documentElement.className.replace('no-js', 'js');</script>
269 270</head> 271 272<body id="login" class="template-customers" > 273 274 275<!-- Snippet:global/body_start: Announcement Bar --> 276<link rel="stylesheet" href="https://apps.easystore.co/assets/css/annoucement-bar/slider.css?v1.01"> 277 278<input type="hidden" id="total_announcement_left" name="total_announcement_left" value="3"> 279<input type="hidden" id="locale" name="locale" value="en_US"> 280 281<slider-announcement-bar-app id="announcement-bar" name="announcement-bar" style=" 282 border: unset; 283 padding: 4px 0px; 284 margin: 0px; 285 z-index:2999; 286 background:rgb(74, 51, 11); 287 color:rgb(248, 248, 248); 288 position: -webkit-sticky; position: sticky; top: 0; 289"> 290 291 <div style=" 292 display: flex; 293 justify-content: space-between; 294 align-items: center; 295 padding: 0px 0px; 296 border-top: 0px; 297 border-bottom: 0px; 298 border-color: transparent; 299 "> 300 <div style="height: 24px;"> 301 <a id="previous-announcement-bar-button" class="announcement-bar-direction-button" type="button" name="previous" style="height: 24px;"> 302 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-left" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="white" fill="none" stroke-linecap="round" stroke-linejoin="round"> 303 <path stroke="none" d="M0 0h24v24H0z" fill="none" /> 304 <polyline points="15 6 9 12 15 18" /> 305 </svg> 306 </a> 307 </div> 308 309 <ul style="flex-grow: 2; margin: 0px;"> 310 <li id="announcement_bar_0" style=" 311 display: flex; 312 justify-content: center; 313 align-items: center; 314 flex-wrap: wrap; 315 margin: 0px; 316 width: 100%; 317 word-wrap: break-word; 318 "> 319 ENJOY FREE SHIPPING WITH MINIMUM PURCHASE OF RM80 320 <input type="hidden" id="expired_at_0" name="expired_at_0" value="2023-03-21 12:00"> 321 </li> 322 <li id="announcement_bar_1" style=" 323 display: flex; 324 justify-content: center; 325 align-items: center; 326 flex-wrap: wrap; 327 margin: 0px; 328 width: 100%; 329 word-wrap: break-word; 330 "> 331 10% OFF ANY ITEM 332 <input type="hidden" id="expired_at_1" name="expired_at_1" value="2026-03-25 00:00"> 333 </li> 334 <li id="announcement_bar_2" style=" 335 display: flex; 336 justify-content: center; 337 align-items: center; 338 flex-wrap: wrap; 339 margin: 0px; 340 width: 100%; 341 word-wrap: break-word; 342 "> 343 4 DAYS ONLY: BUY 3x EDP get 33% OFF 344 <input type="hidden" id="expired_at_2" name="expired_at_2" value="2026-03-25 00:00"> 345 </li> 346 </ul> 347 348 <div style="display: flex;"> 349 <a id="next-announcement-bar-button" class="announcement-bar-direction-button" type="button" name="next" style="height: 24px;"> 350 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-right" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="white" fill="none" stroke-linecap="round" stroke-linejoin="round"> 351 <path stroke="none" d="M0 0h24v24H0z" fill="none" /> 352 <polyline points="9 6 15 12 9 18" /> 353 </svg> 354 </a> 355 </div> 356 </div> 357 358 359</slider-announcement-bar-app> 360
361<script> 362 $(function() { 363 var is_top_enabled = 1; 364 365 const loadScript = function(url, callback) { 366 const script = document.createElement("script"); 367 script.type = "text/javascript"; 368 // If the browser is Internet Explorer. 369 if (script.readyState) { 370 script.onreadystatechange = function() { 371 if (script.readyState == "loaded" || script.readyState == "complete") { 372 script.onreadystatechange = null; 373 callback(); 374 } 375 }; 376 // For any other browser. 377 } else { 378 script.onload = function() { 379 callback(); 380 }; 381 } 382 script.src = url; 383 document.getElementsByTagName("head")[0].appendChild(script); 384 }; 385 386 const announcementBarAppJS = function($) { 387 388 $('#announcement-close-button').on('click', function() { 389 $('#announcement-bar, #announcement-bar-top').hide(); 390 $('#easystore-section-header, .sticky-topbar').css('top', ''); 391 }); 392 } 393 394 if (typeof jQuery === 'undefined') { 395 loadScript('//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js', function() { 396 jQuery = jQuery.noConflict(true); 397 announcementBarAppJS(jQuery); 398 }); 399 } else { 400 announcementBarAppJS(jQuery); 401 } 402 403 404 405 if(is_top_enabled){ 406 // Prevent announcement bar block header 407 setTimeout(()=>{ 408 $('#easystore-section-header, .sticky-topbar').css('top', $('#announcement-bar').height()+'px'); 409 }, 2000); 410 } 411 }); 412 413 setInterval(function() { 414 const total_announcement = "3" 415 var total_announcement_left = $("#total_announcement_left").val(); 416 417 for (let i = 0; i <= total_announcement; i++) { 418 const startDate = new Date(); 419 const endDateStr = $("#expired_at_" + i).val(); 420 const endDate = endDateStr == undefined ? new Date() : new Date(endDateStr.replace(/-/g, "/")); 421 const seconds = (endDate.getTime() - startDate.getTime()) / 1000; 422 423 const days = parseInt(seconds / 86400); 424 const hours = parseInt((seconds % 86400) / 3600); 425 const mins = parseInt((seconds % 86400 % 3600) / 60); 426 const secs = parseInt((seconds % 86400 % 3600) % 60); 427 428 // use to translate countdown unit 429 // (translate based on the preferred language when save announcement bar setting) 430 String.prototype.translate = function() { 431 try { 432 if ($("#locale").val() == "zh_TW") { 433 if (this.toString() === 'day') { 434 return "天"; 435 } 436 if (this.toString() === 'hour') { 437 return "å°æ"; 438 } 439 if (this.toString() === 'min') { 440 return "åé"; 441 } 442 if (this.toString() === 'sec') { 443 return "ç§"; 444 } 445 } else { 446 if (this.toString() === 'day') { 447 if (days > 0) { 448 return "Days"; 449 } else { 450 return "Day"; 451 } 452 } else if (this.toString() === 'hour') { 453 if (hours > 0) { 454 return "Hours"; 455 } else { 456 return "Hour"; 457 } 458 } else if (this.toString() === 'min') { 459 if (mins > 0) { 460 return "Mins"; 461 } else { 462 return "Min"; 463 } 464 } else if (this.toString() === 'sec') { 465 if (secs > 0) { 466 return "Secs"; 467 } else { 468 return "Sec"; 469 } 470 } 471 } 472 } catch (error) { 473 console.log("Some errors heres", error); 474 } 475 }; 476 477 const announcementBar_countdown = document.getElementById("announcementBar_countdown_" + i); 478 if (announcementBar_countdown && seconds > 0) { 479 480 $(announcementBar_countdown).show() 481 announcementBar_countdown.innerHTML = ` 482 <div> 483 ${days} <small>${'day'.translate()}</small> 484 </div> 485 <div> 486 ${hours} <small>${'hour'.translate()}</small> 487 </div> 488 <div> 489 ${mins} <small>${'min'.translate()}</small> 490 </div> 491 <div> 492 ${secs} <small>${'sec'.translate()}</small> 493 </div> 494 `; 495 496 497 } else if (announcementBar_countdown && seconds <= 0) { 498 $("#announcement_bar_" + i).remove(); 499 total_announcement_left = total_announcement_left - 1; 500 $("#total_announcement_left").val(total_announcement_left); 501 } 502 } 503 504 showOrHide(total_announcement_left); 505 }, 1000); 506 507 508 function showOrHide(total_announcement_left) { 509 if (total_announcement_left <= 1) { 510 $("#previous-announcement-bar-button,#next-announcement-bar-button").hide(); 511 } else { 512 $("#previous-announcement-bar-button,#next-announcement-bar-button").show(); 513 } 514 515 if (total_announcement_left == 0) { 516 $("#announcement-close-button").hide(); 517 $("#announcement-bar").hide(); 518 $('#announcement-bar-top').hide(); 519 $('#easystore-section-header, .sticky-topbar').css('top', ''); 520 } 521 }; 522 523 let annoucementBarAutoMoveInterval = ''; 524 class AnnouncementBarAppSlider extends HTMLElement { 525 constructor() { 526 super(); 527 this.slider = this.querySelector('ul'); 528 this.sliderItems = this.querySelectorAll('li'); 529 this.prevButton = this.querySelector('a[name="previous"]'); 530 this.nextButton = this.querySelector('a[name="next"]'); 531 532 if (!this.slider || !this.nextButton) return; 533 534 const resizeObserver = new ResizeObserver(entries => this.initPages()); 535 resizeObserver.observe(this.slider); 536 537 this.slider.addEventListener('scroll', this.update.bind(this)); 538 this.prevButton.addEventListener('click', this.onButtonClick.bind(this)); 539 this.nextButton.addEventListener('click', this.onButtonClick.bind(this)); 540 541 542 } 543 544 initPages() { 545 const sliderItemsToShow = Array.from(this.sliderItems).filter(element => element.clientWidth > 0); 546 this.sliderLastItem = sliderItemsToShow[sliderItemsToShow.length - 1]; 547 if (sliderItemsToShow.length === 0) return; 548 this.slidesPerPage = Math.floor(this.slider.clientWidth / sliderItemsToShow[0].clientWidth); 549 this.totalPages = sliderItemsToShow.length - this.slidesPerPage + 1; 550 this.update(); 551 let self = this 552 var total_announcement_left = $("#total_announcement_left").val(); 553 annoucementBarAutoMoveInterval = setInterval(function() { 554 if (total_announcement_left > 1) { 555 self.moveSlide('next') 556 } 557 }, 5000) 558 } 559 560 update() { 561 this.currentPage = Math.round(this.slider.scrollLeft / this.sliderLastItem.clientWidth) + 1; 562 } 563 564 onButtonClick(event) { 565 event.preventDefault(); 566 let self = this; 567 self.moveSlide(event.currentTarget.name); 568 } 569 570 571 moveSlide(move_to) { 572 573 clearInterval(annoucementBarAutoMoveInterval); 574 let self = this; 575 annoucementBarAutoMoveInterval = setInterval(function() { 576 self.moveSlide('next'); 577 }, 5000) 578 579 if (move_to === 'previous' && this.currentPage === 1) { 580 this.slider.scrollTo({ 581 left: this.sliderLastItem.clientWidth * (this.totalPages - 1) 582 }); 583 } else if (move_to === 'next' && this.currentPage === this.totalPages) { 584 this.slider.scrollTo({ 585 left: 0 586 }); 587 } else { 588 const slideScrollPosition = move_to === 'next' ? this.slider.scrollLeft + this.sliderLastItem 589 .clientWidth : this.slider.scrollLeft - this.sliderLastItem.clientWidth; 590 this.slider.scrollTo({ 591 left: slideScrollPosition 592 }); 593 } 594 } 595 596 } 597 598 customElements.define('slider-announcement-bar-app', AnnouncementBarAppSlider); 599</script>
599 600 601<!-- /Snippet --> 602 603<!-- Snippet:global/body_start: Easy Pop Up --> 604<style> 605 .easy_popup-app-style { 606 background-position: center; 607 vertical-align: middle; 608 justify-content: center; 609 text-align: center; 610 position: absolute; 611 top: 50%; 612 left: 50%; 613 margin-right: -55%; 614 transform: translate(-50%, -50%); 615 padding: 3em; 616 } 617 618 @media only screen and (max-width: 480px) { 619 .easy_popup-app-style { 620 background-position: center; 621 vertical-align: middle; 622 justify-content: center; 623 text-align: center; 624 padding: 1em; 625 position: absolute; 626 top: 50%; 627 left: 50%; 628 margin-right: -50%; 629 transform: translate(-50%, -50%) 630 } 631 } 632 633 .easy_popup-app-modal-window { 634 border: 0px solid #E8E8E8; 635 border-radius: 5px; 636 position: fixed; 637 top: 0; 638 right: 0; 639 bottom: 0; 640 left: 0; 641 width: 100vw; 642 height: 100vh; 643 display: flex; 644 align-items: center; 645 justify-content: center; 646 z-index: 100000; 647 background-color: rgba(0, 0, 0, 0.45); 648 } 649 650 .easy_popup-app-container { 651 border: 0px solid #E0E0E0; 652 border-radius: 5px; 653 height: 350px; 654 width: 90%; 655 max-width: 520px; 656 position: relative; 657 display: block; 658 background-repeat: no-repeat; 659 background-position: center; 660 } 661 662 .easy_popup-app-discount-container{ 663 height: 300px; 664 max-width: 600px; 665 position: relative; 666 display: block; 667 background-repeat: no-repeat; 668 background-position: center; 669 } 670 671 .new_easy_popup-app-container { 672 height: 450px; 673 width: 90%; 674 max-width: 520px; 675 margin: auto; 676 box-sizing: border-box; 677 position: relative; 678 display: block; 679 overflow: visible; 680 background-repeat: no-repeat; 681 background-position: center; 682 justify-content: center; 683 transform-origin: top left; 684 border: 0px solid #E8E8E8; 685 border-radius: 5px; 686 background: white; 687 background-size: contain; 688 } 689 690 .new_upper_easy_popup-app-container { 691 height: 200px; 692 max-width: 520px; 693 width: 100%; 694 border-radius: 5px 5px 0 0; 695 } 696 697 .new_lower_easy_popup-app-container { 698 width: 100%; 699 max-width: 520px; 700 position: relative; 701 background: white; 702 text-align: center; 703 display: flex; 704 justify-content: center; 705 align-items: center; 706 border-radius: 0 0 5px 5px; 707 } 708 709 @media only screen and (max-width: 480px) { 710 .easy_popup-app-container { 711 height: 238px; 712 } 713 } 714 715 .easy_popup-app-title { 716 font-size: 32px; 717 } 718 719 @media only screen and (max-width: 480px) { 720 .easy_popup-app-title { 721 font-size: 28px !important; 722 } 723 } 724 725 .easy_popup-app-content { 726 font-size: 24px; 727 margin-bottom: 10px; 728 } 729 730 @media only screen and (max-width: 480px) { 731 .easy_popup-app-content { 732 font-size: 20px !important; 733 margin-bottom: 10px; 734 } 735 } 736 737 .easy_popup-app-close { 738 position: absolute; 739 right: -18px; 740 top: -18px; 741 width: 31px; 742 height: 31px; 743 padding: 5px 5px 5px 5px; 744 border: 3px solid #E8E8E8; 745 border-radius: 50px; 746 background-color: #FFFFFF; 747 display: block !important; 748 box-sizing: border-box; 749 } 750 751 .easy_popup-app-close:hover { 752 opacity: 1; 753 } 754 755 .easy_popup-app-close:before, 756 .easy_popup-app-close:after { 757 position: absolute; 758 left: 11.7px; 759 top: 5.5px; 760 content: ' '; 761 height: 15px; 762 width: 2px; 763 background-color: #CBCBCB; 764 } 765 766 .easy_popup-app-close:before { 767 transform: rotate(45deg); 768 } 769 770 .easy_popup-app-close:after { 771 transform: rotate(-45deg); 772 } 773 774 .easy_popup-app-noscroll { 775 position: fixed; 776 overflow: hidden; 777 height: 100%; 778 width: 100%; 779 } 780 781 .easy_popup-Short { 782 width: 200px; 783 padding: 5px; 784 height: 45px; 785 border-radius: 5px; 786 border: 0px; 787 display: inline-block; 788 text-decoration: none; 789 padding: 10px 50px; 790 margin: 14px; 791 box-shadow: 0px 2px 5px rgb(0 0 0 / 15%); 792 transition: .4s; 793 } 794 795 .easy_popup-Short:hover, 796 .easy_popup-Short:focus { 797 box-shadow: 0px 2px 5px rgb(0 0 0 / 25%); 798 transform: scale(.99); 799 opacity: 0.9; 800 } 801 802 .easy_popup-Long { 803 width: 100%; 804 max-width: 300px; 805 border: 0; 806 border-radius: 5px; 807 display: inline-block; 808 text-decoration: none; 809 margin-top: 14px; 810 box-shadow: 0px 2px 5px rgb(0 0 0 / 15%); 811 transition: .4s; 812 padding: 15px 25px; 813 font-weight: bold; 814 line-height: 1.1; 815 } 816 817 .easy_popup-Long:hover, 818 .easy_popup-Long:focus { 819 box-shadow: 0px 2px 5px rgb(0 0 0 / 25%); 820 transform: scale(.99); 821 opacity: 0.9; 822 } 823 824 .easy_popup-Border { 825 display: inline-block; 826 text-decoration: none; 827 padding: 10px 52px; 828 margin-top: 14px; 829 box-shadow: 0px 2px 5px rgb(0 0 0 / 15%); 830 border: 2px solid; 831 background: none; 832 border-radius: 3px; 833 transition: .4s; 834 } 835 836 .easy_popup-Border:hover, 837 .easy_popup-Border:focus { 838 box-shadow: 0px 2px 5px rgb(0 0 0 / 25%); 839 transform: scale(.99); 840 opacity: 0.9; 841 } 842 843 .easy_popup-noimage { 844 background-color: #FFBC00; 845 } 846 847 @media only screen and (max-width: 360px) { 848 .easy_popup-withimage { 849 background-image: url("https://s3.dualstack.ap-southeast-1.amazonaws.com/app-assets.easystore.co/apps/405/Classic.jpg"); 850 background-size: contain; 851 vertical-align: middle; 852 } 853 } 854 855 @media only screen and (min-width: 361px) { 856 .easy_popup-withimage { 857 background-image: url("https://s3.dualstack.ap-southeast-1.amazonaws.com/app-assets.easystore.co/apps/405/Classic.jpg"); 858 background-size: cover; 859 vertical-align: middle; 860 } 861 } 862 863 @media only screen and (max-width: 360px) { 864 .easy_popup-withcustomimage { 865 background-image: url(https://s3.ap-southeast-1.amazonaws.com/apps.easystore.co/easy-pop-up/nori.easy.co/images/background.jpg?v=5836); 866 background-size: contain; 867 vertical-align: middle; 868 } 869 } 870 871 @media only screen and (min-width: 361px) { 872 .easy_popup-withcustomimage { 873 background-image: url(https://s3.ap-southeast-1.amazonaws.com/apps.easystore.co/easy-pop-up/nori.easy.co/images/background.jpg?v=5836); 874 background-size: cover; 875 vertical-align: middle; 876 } 877 } 878 879 #copyIcon:hover { 880 fill: #D9D9D9; 881 } 882 883</style> 884 885<body> 886 887 <div id="modalcontainer" style='display:none' class="easy_popup-app-modal-window"> 888 <div class="new_easy_popup-app-container" style="height: auto"> 889 <div id="popup" class="new_upper_easy_popup-app-container" style="height: auto"> 890 <img src="https://s3.ap-southeast-1.amazonaws.com/apps.easystore.co/easy-pop-up/nori.easy.co/images/background.jpg?v=5836.jpg" width="100%"> 891 </div> 892 <div class="new_lower_easy_popup-app-container" style="padding: 20px;"> 893 <section id="enter_section" style="width: 100%; max-width: 300px;"> 894 <div> 895 <div id="modaltitle" class="easy_popup-app-title" style="margin-bottom: 5px;text-align: center; display: flex; justify-content: center; align-items: center; color: #FCD200; line-height: 1;"> 896 . 897 </div>
898 <div id="modalcontent" class="easy_popup-app-content" style=" text-align: center; display: flex; justify-content: center; align-items: center; color: #FCD200; margin: 5px; padding: 0; line-height: 1.5;"> 899 , 900 </div> 901 </div> 902 <div style="text-align: center; display: flex; justify-content: center; align-items: center;"> 903 <form id="emailForm" action="https://apps.easystore.co/easy-pop-up/proxy/insert-customer" method="post" style="width: 100%;"> 904 <div style="margin: 20px 0; margin-bottom: 6px;width:100%; max-width: 300px; height: 45px; border: 1px solid #D9D9D9; border-radius: 5px; color: black; font-size: 18px; text-align: left; display: flex; justify-content: left; align-items: center;"> 905 <svg width="25px" height="25px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin: 10px;"><path d="M4 7.00005L10.2 11.65C11.2667 12.45 12.7333 12.45 13.8 11.65L20 7" stroke="#C5C5C5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 906 <rect x="3" y="5" width="18" height="14" rx="2" stroke="#C5C5C5" stroke-width="2" stroke-linecap="round"/> 907 </svg> 908 <input id="emailInput" name="emailInput" type="email" placeholder="[email protected]" style="margin:0;box-shadow: none;outline: none;width: 100%;max-width: 300px; height: 43px; border: 0px; border-radius: 5px; " required> 909 </div> 910 <button id="submitButton" class="easy_popup-Long" style="width: 100%;max-width: 300px; margin-top: 0px; color: #FFFFFF; font-size: 17px; background: #495BD5;" > 911 Subscribe 912 </button> 913 </form> 914 </section> 915 916 <section id ="discount_code_section" style="width: 100%; max-width: 300px; display:none;"> 917 <div style="text-align: center; display: flex; justify-content: center; align-items: center;" > 918 <input id="emailInput2" name="emailInput2" type="email" readonly style="font-size:0px; color: white;border:0px;" hidden> 919 <input id="domain" name="domain" readonly style="font-size:0px; color: white;border:0px;" hidden > 920 </div> 921 <div> 922 <b style="font-size:28px;margin: 0; padding: 0; line-height: 1;">Enjoy your discount!</b> 923 <div style="font-size:16px;margin: 0; padding: 10px; line-height: 1;">You can apply the discount code during checkout</div> 924 </div> 925 <div style="margin-top:5px;"> 926 <div style="text-align: center; justify-content: center; align-items: center; display: block;"> 927 <div style="margin: 5px; max-width: 300px; height: 45px; border: 1px solid #D9D9D9; border-radius: 5px; color: black; font-size: 18px; text-align: center; display: flex; justify-content: center; align-items: center;"> 928 <div style="margin:0px;max-width: 300px; height: 45px; border: 0px solid #D9D9D9; border-radius: 0px; color: #ccc; font-size: 18px;text-align: center; display: flex; justify-content: center; align-items: center; "> 929 <div>WLCOME123</div> 930 </div> 931 <svg id="copyIcon" width="25px" height="25px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="cursor: pointer; margin: 10px; text-align: right; display: flex; justify-content: right; align-items: center; " onclick="copyToClipboard()"> 932 <path d="M6 11C6 8.17157 6 6.75736 6.87868 5.87868C7.75736 5 9.17157 5 12 5H15C17.8284 5 19.2426 5 20.1213 5.87868C21 6.75736 21 8.17157 21 11V16C21 18.8284 21 20.2426 20.1213 21.1213C19.2426 22 17.8284 22 15 22H12C9.17157 22 7.75736 22 6.87868 21.1213C6 20.2426 6 18.8284 6 16V11Z" stroke="#D9D9D9" stroke-width="1.5"></path> <path d="M6 19C4.34315 19 3 17.6569 3 16V10C3 6.22876 3 4.34315 4.17157 3.17157C5.34315 2 7.22876 2 11 2H15C16.6569 2 18 3.34315 18 5" stroke="#D9D9D9" stroke-width="1.5"></path> 933 </svg> 934 </div> 935 <a href="/collections/all" class="easy_popup-Long" style="cursor: pointer;margin-top: 0px; color: #FFFFFF; font-size: 17px; background: #495BD5;display: flex;justify-content: center;align-items: center;"> 936 Shop Now 937 </a> 938 </div> 939 </section> 940 </div> 941 <a href="javascript:void(0);" class="easy_popup-app-close" onclick="PopUp('hide')"></a> 942 </div> 943 </div> 944 945 <div id="modalcontainer2" style='display:none' class="easy_popup-app-modal-window" onclick="PopUp('hide')"> 946 <div class="new_easy_popup-app-container"> 947 <div id="popup" class="new_upper_easy_popup-app-container easy_popup-withcustomimage"> 948 </div> 949 <div class="new_lower_easy_popup-app-container"> 950 <section > 951 <div style=""> 952 <div style="margin: 0 0 30px 0;"> 953 <div id="modaltitle" class="easy_popup-app-title" style="text-align: center; display: flex; justify-content: center; align-items: center; color: #FCD200; margin: 15px; padding: 0; line-height: 1;"> 954 . 955 </div>
956 <div id="modalcontent" class="easy_popup-app-content" style="margin: 0; text-align: center; display: flex; justify-content: center; align-items: center; color: #FCD200; margin: 0; padding: 0; line-height: 1.5;"> 957 , 958 </div> 959 </div> 960 <span><a href="https://www.nori.com.my/account/register" class="easy_popup-Long" style="color: #FFC300; font-size: 20px; background: #000000; line-height: 1.1; margin:3px;">SIGN UP NOW!</a></span> 961 </section> 962 </div> 963 <a href="javascript:void(0);" class="easy_popup-app-close" onclick="PopUp('hide')"></a> 964 </div> 965 </div> 966 967 <div id="modalcontainer3" style='display:none' class="easy_popup-app-modal-window" onclick="PopUp('hide')"> 968 <div id="popup" class="easy_popup-app-container easy_popup-withcustomimage"> 969 <section class="easy_popup-app-style" style="font-family: arial"> 970 <div id="modaltitle" class="easy_popup-app-title" style=" color: #FCD200;"> 971 . 972 </div> 973 <div id="modalcontent" class="easy_popup-app-content" style=" color: #FCD200;"> 974 , 975 </div> 976 <span><a href="https://www.nori.com.my/account/register" class="easy_popup-Long" style="color: #FFC300; font-size: 20px; background: #000000; line-height: 1.1; margin:3px;">SIGN UP NOW!</a></span> 977 </section> 978 979 <a href="javascript:void(0);" class="easy_popup-app-close" onclick="PopUp('hide')"></a> 980 </div> 981 </div> 982 983
983<script> 984 function redirect(){ 985 window.location.replace("/collections/all"); 986 } 987 988 document.getElementById('emailForm').addEventListener('submit', async (e) => { 989 e.preventDefault(); 990 991 try { 992 const response = await fetch('/apps/easypopup/insert-customer', { 993 method: 'POST', 994 headers: { 995 'Accept': 'application/json', 996 'Content-Type': 'application/json', 997 }, 998 body: JSON.stringify({ 999 'email': document.getElementById('emailInput').value, 1000 'shop': window.location.hostname, 1001 }), 1002 }); 1003 console.log(response); 1004 if (!response.ok) { 1005 console.error('Failed to insert customer'); 1006 } 1007 const responseData = await response.json(); 1008 console.log('Customer inserted successfully:', responseData); 1009 1010 } catch (error) { 1011 console.error('Error:', error); 1012 } 1013 }); 1014 1015 function copyToClipboard() { 1016 var textToCopy = "WLCOME123"; 1017 var tempInput = document.createElement("input"); 1018 1019 tempInput.value = textToCopy; 1020 document.body.appendChild(tempInput); 1021 tempInput.select(); 1022 document.execCommand("copy"); 1023 document.body.removeChild(tempInput); 1024 1025 var copyIcon = document.getElementById("copyIcon"); 1026 copyIcon.style.pointerEvents = "none"; 1027 copyIcon.setAttribute("fill", "#888888"); 1028 1029 } 1030 1031 function showDiscountCode(emailInputValue) { 1032 document.getElementById("discount_code_section").style.display = "block"; 1033 document.getElementById("enter_section").style.display = "none"; 1034 document.getElementById('emailInput2').value = emailInputValue; 1035 var domain = window.location.hostname; 1036 document.getElementById('domain').value=domain; 1037 } 1038 1039 document.getElementById('emailForm').addEventListener('submit', function (e) { 1040 e.preventDefault(); 1041 var emailInputValue = document.getElementById('emailInput').value; 1042 showDiscountCode(emailInputValue); 1043 }); 1044 1045 var newFeature_enable = "false"; 1046 var layout_option = "full_dialog"; 1047 1048 function PopUp(hideOrshow) { 1049 if (hideOrshow == 'hide' || window.location.href.indexOf("checkout") > -1) { 1050 document.getElementById('modalcontainer').style.display = "none"; 1051 document.getElementById('modalcontainer2').style.display = "none"; 1052 document.getElementById('modalcontainer3').style.display = "none"; 1053 document.getElementsByTagName("body")[0].classList.remove("easy_popup-app-noscroll"); 1054 } else if (sessionStorage.getItem("popupWasShown") == null) { 1055 sessionStorage.setItem("popupWasShown", 1); 1056 if(newFeature_enable=='true' ){ 1057 document.getElementById('modalcontainer').removeAttribute('style'); 1058 }else if(newFeature_enable=='false' && layout_option=='top_bottom') 1059 { 1060 document.getElementById('modalcontainer2').removeAttribute('style'); 1061 }else{ 1062 document.getElementById('modalcontainer3').removeAttribute('style'); 1063 } 1064 document.getElementsByTagName("body")[0].classList.add("easy_popup-app-noscroll"); 1065 } 1066 } 1067 1068 window.onload = function() { 1069 document.getElementById("modaltitle").innerHTML = document.getElementById("modaltitle").innerText; 1070 document.getElementById("modalcontent").innerHTML = document.getElementById("modalcontent").innerText; 1071 setTimeout(function() { 1072 PopUp('show'); 1073 }, 0); 1074 } 1075 1076 </script>
1076 1077</body> 1078 1079<!-- /Snippet --> 1080 1081<!-- Snippet:global/body_start: Console Extension --> 1082<div id='es_console' style='display: none;'>251247</div> 1083<!-- /Snippet --> 1084<link href="/assets/css/wishlist.css?v1.02" rel="stylesheet" type="text/css" media="screen" /> 1085<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css"> 1086
1087<script src="/assets/js/wishlist/wishlist.js" type="text/javascript"></script>
1087 1088 1089 <style> 1090 header { 1091 --logo-width: 120px; 1092 } 1093 .header-wrapper, 1094 .header-wrapper .list-menu--disclosure, 1095 .header-wrapper .search-modal{ 1096 background-color: #FCF6E1; 1097 } 1098 .header-wrapper .search-modal .field__input{ 1099 background-color: rgb(var(--color-background)); 1100 } 1101 .header-wrapper summary .icon-caret, 1102 .header-wrapper .header__menu-item a, 1103 .header-wrapper .list-menu__item, 1104 .header-wrapper .link--text{ 1105 color: #000000; 1106 } 1107 1108 .search-modal__form{ 1109 position: relative; 1110 } 1111 1112 .dropdown { 1113 display: none; 1114 position: absolute; 1115 top: 100%; 1116 left: 0; 1117 width: 100%; 1118 padding: 5px 0; 1119 background-color: #fff; 1120 color:#000; 1121 z-index: 1000; 1122 border-bottom-left-radius: 15px; 1123 border-bottom-right-radius: 15px; 1124 border: 1px solid rgba(var(--color-foreground), 1); 1125 border-top: none; 1126 overflow-x: hidden; 1127 overflow-y: auto; 1128 max-height: 350px; 1129 } 1130 1131 .dropdown-item { 1132 padding: 0.4rem 2rem; 1133 cursor: pointer; 1134 line-height: 1.4; 1135 overflow: hidden; 1136 text-overflow: ellipsis; 1137 white-space: nowrap; 1138 } 1139 1140 .dropdown-item:hover{ 1141 background-color: #f3f3f3; 1142 } 1143 1144 .search__input.is-focus{ 1145 border-radius: 15px; 1146 border-bottom-left-radius: 0; 1147 border-bottom-right-radius: 0; 1148 border: 1px solid rgba(var(--color-foreground), 1); 1149 border-bottom: none; 1150 box-shadow: none; 1151 } 1152 1153 .clear-all { 1154 text-align: right; 1155 padding: 0 2rem 0.2rem; 1156 line-height: 1; 1157 font-size: 70%; 1158 margin-bottom: -2px; 1159 } 1160 1161 .clear-all:hover{ 1162 background-color: #fff; 1163 } 1164 1165 .search-input-focus .easystore-section-header-hidden{ 1166 transform: none; 1167 } 1168 .referral-notification { 1169 position: absolute; 1170 top: 100%; 1171 right: 0; 1172 background: white; 1173 border: 1px solid #e0e0e0; 1174 border-radius: 8px; 1175 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); 1176 width: 280px; 1177 z-index: 1000; 1178 padding: 16px; 1179 margin-top: 8px; 1180 font-size: 14px; 1181 line-height: 1.4; 1182 } 1183 1184 .referral-notification::before { 1185 content: ''; 1186 position: absolute; 1187 top: -8px; 1188 right: 20px; 1189 width: 0; 1190 height: 0; 1191 border-left: 8px solid transparent; 1192 border-right: 8px solid transparent; 1193 border-bottom: 8px solid white; 1194 } 1195 1196 .referral-notification::after { 1197 content: ''; 1198 position: absolute; 1199 top: -9px; 1200 right: 20px; 1201 width: 0; 1202 height: 0; 1203 border-left: 8px solid transparent; 1204 border-right: 8px solid transparent; 1205 border-bottom: 8px solid #e0e0e0; 1206 } 1207 1208 .referral-notification h4 { 1209 margin: 0 0 8px 0; 1210 color: #2196F3; 1211 font-size: 16px; 1212 font-weight: 600; 1213 } 1214 1215 .referral-notification p { 1216 margin: 0 0 12px 0; 1217 color: #666; 1218 } 1219 1220 .referral-notification .referral-code { 1221 background: #f5f5f5; 1222 padding: 8px; 1223 border-radius: 4px; 1224 font-family: monospace; 1225 font-size: 13px; 1226 text-align: center; 1227 margin: 8px 0; 1228 border: 1px solid #ddd; 1229 } 1230 1231 .referral-notification .close-btn { 1232 position: absolute; 1233 top: 8px; 1234 right: 8px; 1235 background: none; 1236 border: none; 1237 font-size: 18px; 1238 color: #999; 1239 cursor: pointer; 1240 padding: 0; 1241 width: 20px; 1242 height: 20px; 1243 line-height: 1; 1244 } 1245 1246 .referral-notification .close-btn:hover { 1247 color: #333; 1248 } 1249 1250 .referral-notification .action-btn { 1251 background: #2196F3; 1252 color: white; 1253 border: none; 1254 padding: 8px 16px; 1255 border-radius: 4px; 1256 cursor: pointer; 1257 font-size: 12px; 1258 margin-right: 8px; 1259 margin-top: 8px; 1260 } 1261 1262 .referral-notification .action-btn:hover { 1263 background: #1976D2; 1264 } 1265 1266 .referral-notification .dismiss-btn { 1267 background: transparent; 1268 color: #666; 1269 border: 1px solid #ddd; 1270 padding: 8px 16px; 1271 border-radius: 4px; 1272 cursor: pointer; 1273 font-size: 12px; 1274 margin-top: 8px; 1275 } 1276 1277 .referral-notification .dismiss-btn:hover { 1278 background: #f5f5f5; 1279 } 1280 .referral-modal__dialog { 1281 transform: translate(-50%, 0); 1282 transition: transform var(--duration-default) ease, visibility 0s; 1283 z-index: 10000; 1284 position: fixed; 1285 top: 20vh; 1286 left: 50%; 1287 width: 100%; 1288 max-width: 350px; 1289 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); 1290 border-radius: 12px; 1291 background-color: #fff; 1292 color: #000; 1293 padding: 20px; 1294 text-align: center; 1295 } 1296 1297 .modal-overlay.referral-modal-overlay { 1298 position: fixed; 1299 top: 0; 1300 left: 0; 1301 width: 100%; 1302 height: 100%; 1303 background-color: rgba(0, 0, 0, 0.7); 1304 z-index: 2001; 1305 display: block; 1306 opacity: 1; 1307 transition: opacity var(--duration-default) ease, visibility 0s; 1308 } 1309</style> 1310 1311<link rel="preload" href="https://store-themes.easystore.co/251247/themes/282847/assets/section-header.css?t=1790328533" as="style" onload="this.onload=null;this.rel='stylesheet'"> 1312<link rel="preload" href="https://store-themes.easystore.co/251247/themes/282847/assets/component-list-menu.css?t=1790328533" as="style" onload="this.onload=null;this.rel='stylesheet'"> 1313<link rel="preload" href="https://store-themes.easystore.co/251247/themes/282847/assets/component-menu-drawer.css?t=1790328533" as="style" onload="this.onload=null;this.rel='stylesheet'"> 1314<link rel="preload" href="https://store-themes.easystore.co/251247/themes/282847/assets/component-cart-notification.css?v1.1?t=1790328533" as="style" onload="this.onload=null;this.rel='stylesheet'"> 1315
1316<script src="https://store-themes.easystore.co/251247/themes/282847/assets/cart-notification.js?t=1790328533" defer="defer"></script>
vendor: 1 bytes, line 1316
1316
1317<script src="https://store-themes.easystore.co/251247/themes/282847/assets/details-modal.js?t=1790328533" defer="defer"></script>
1317 1318 1319<svg xmlns="http://www.w3.org/2000/svg" class="hidden"> 1320 <symbol id="icon-search" viewbox="0 0 18 19" fill="none"> 1321 <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"/> 1322 </symbol> 1323 1324 <symbol id="icon-close" class="icon icon-close" fill="none" viewBox="0 0 18 17"> 1325 <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"> 1326 </symbol> 1327</svg> 1328 1329 1330<div id="easystore-section-header"> 1331 <sticky-header class="header-wrapper header-wrapper--border-bottom"> 1332 <header class="header header--top-center page-width header--has-menu" itemscope itemtype="http://schema.org/Organization"> 1333 <header-drawer data-breakpoint="tablet"> 1334 <details class="menu-drawer-container menu-opening"> 1335 <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"> 1336 <span> 1337 1338 1339 1340 <svg class="icon icon-hamburger " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M32.5,65h535a25,25,0,0,0,0-50H32.5a25,25,0,0,0,0,50Z" fill="currentColor"/><path d="M567.5,275H32.5a25,25,0,0,0,0,50h535a25,25,0,0,0,0-50Z" fill="currentColor"/><path d="M567.5,535H32.5a25,25,0,0,0,0,50h535a25,25,0,0,0,0-50Z" fill="currentColor"/></svg> 1341 1342 1343 1344 1345 1346 1347 <svg class="icon icon-close " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M335.36,300,581.87,53.48a25,25,0,0,0-35.35-35.35L300,264.64,53.48,18.13A25,25,0,0,0,18.13,53.48L264.64,300,18.13,546.52a25,25,0,0,0,35.35,35.35L300,335.36,546.52,581.87a25,25,0,0,0,35.35-35.35Z" fill="currentColor"/></svg> 1348 1349 1350 1351 </span> 1352 </summary> 1353 <div id="menu-drawer" class="menu-drawer motion-reduce" tabindex="-1"> 1354 <div class="menu-drawer__inner-container"> 1355 <div class="menu-drawer__navigation-container"> 1356 <nav class="menu-drawer__navigation"> 1357 <ul class="menu-drawer__menu list-menu" role="list"> 1358 1359 1360 1361 <li> 1362 <a href="/" class="menu-drawer__menu-item list-menu__item link link--text focus-inset"> 1363 Home 1364 </a> 1365 </li> 1366 1367 1368 1369 1370 1371 <li> 1372 <details> 1373 <summary class="menu-drawer__menu-item list-menu__item link link--text focus-inset" role="button" aria-expanded="false" aria-controls="link-Bags"> 1374 <a href="/collections/others" class="link--text list-menu__item menu-drawer__menu-item"> 1375 Skincare 1376 </a> 1377 1378 1379 1380 <svg class="icon icon-arrow " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 339.56"><path d="M31.06,196.67H504l-88.56,88.56a26.89,26.89,0,1,0,38,38L588,188.79a26.89,26.89,0,0,0,0-38L453.49,16.29a26.89,26.89,0,0,0-38,38L504,142.88H31.06a26.9,26.9,0,0,0,0,53.79Z" fill="currentColor"/></svg> 1381 1382 1383 1384 1385 1386 1387 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 1388 <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> 1389 </svg> 1390 1391 1392 1393 </summary> 1394 <div class="menu-drawer__submenu motion-reduce" tabindex="-1"> 1395 <div class="menu-drawer__inner-submenu"> 1396 <button class="menu-drawer__close-button link link--text focus-inset" aria-expanded="true"> 1397 1398 1399 1400 <svg class="icon icon-arrow " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 339.56"><path d="M31.06,196.67H504l-88.56,88.56a26.89,26.89,0,1,0,38,38L588,188.79a26.89,26.89,0,0,0,0-38L453.49,16.29a26.89,26.89,0,0,0-38,38L504,142.88H31.06a26.9,26.9,0,0,0,0,53.79Z" fill="currentColor"/></svg> 1401 1402 1403 1404 Skincare 1405 </button> 1406 <ul class="menu-drawer__menu list-menu" role="list" tabindex="-1"> 1407 1408 1409 1410 <li> 1411 <a href="/collections/nori-skincare-2" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1412 All Products 1413 </a> 1414 </li> 1415 1416 1417 1418 1419 <li> 1420 <a href="/collections/cleanser" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1421 Cleanser 1422 </a> 1423 </li> 1424 1425 1426 1427 1428 <li> 1429 <a href="/collections/toner" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1430 Toner 1431 </a> 1432 </li> 1433 1434 1435 1436 1437 <li> 1438 <a href="/collections/serum" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1439 Serum 1440 </a> 1441 </li> 1442 1443 1444 1445 1446 <li> 1447 <a href="/collections/moisteriser" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1448 Moisturizer 1449 </a> 1450 </li> 1451 1452 1453 1454 1455 <li> 1456 <a href="/collections/sun-screen" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1457 Sun Screen 1458 </a> 1459 </li> 1460 1461 1462 1463 </ul> 1464 </div> 1465 </div> 1466 </details> 1467 </li> 1468 1469 1470 1471 1472 1473 <li> 1474 <details> 1475 <summary class="menu-drawer__menu-item list-menu__item link link--text focus-inset" role="button" aria-expanded="false" aria-controls="link-Bags"> 1476 <a href="/collections/haircare" class="link--text list-menu__item menu-drawer__menu-item"> 1477 Haircare 1478 </a> 1479 1480 1481 1482 <svg class="icon icon-arrow " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 339.56"><path d="M31.06,196.67H504l-88.56,88.56a26.89,26.89,0,1,0,38,38L588,188.79a26.89,26.89,0,0,0,0-38L453.49,16.29a26.89,26.89,0,0,0-38,38L504,142.88H31.06a26.9,26.9,0,0,0,0,53.79Z" fill="currentColor"/></svg> 1483 1484 1485 1486 1487 1488 1489 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 1490 <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> 1491 </svg> 1492 1493 1494 1495 </summary> 1496 <div class="menu-drawer__submenu motion-reduce" tabindex="-1"> 1497 <div class="menu-drawer__inner-submenu"> 1498 <button class="menu-drawer__close-button link link--text focus-inset" aria-expanded="true"> 1499 1500 1501 1502 <svg class="icon icon-arrow " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 339.56"><path d="M31.06,196.67H504l-88.56,88.56a26.89,26.89,0,1,0,38,38L588,188.79a26.89,26.89,0,0,0,0-38L453.49,16.29a26.89,26.89,0,0,0-38,38L504,142.88H31.06a26.9,26.9,0,0,0,0,53.79Z" fill="currentColor"/></svg> 1503 1504 1505 1506 Haircare 1507 </button> 1508 <ul class="menu-drawer__menu list-menu" role="list" tabindex="-1"> 1509 1510 1511 1512 <li> 1513 <a href="/collections/all-product-1" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1514 All Suri Haircare Products 1515 </a> 1516 </li> 1517 1518 1519 1520 1521 <li> 1522 <a href="/collections/suri-hairfall" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1523 Suri Hairfall 1524 </a> 1525 </li> 1526 1527 1528 1529 1530 <li> 1531 <a href="/collections/suri-dandruff" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1532 Suri Dandruff 1533 </a> 1534 </li> 1535 1536 1537 1538 </ul> 1539 </div> 1540 </div> 1541 </details> 1542 </li> 1543 1544 1545 1546 1547 1548 <li> 1549 <details> 1550 <summary class="menu-drawer__menu-item list-menu__item link link--text focus-inset" role="button" aria-expanded="false" aria-controls="link-Bags"> 1551 <a href="/collections/celebrities" class="link--text list-menu__item menu-drawer__menu-item"> 1552 Fragrance 1553 </a> 1554 1555 1556 1557 <svg class="icon icon-arrow " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 339.56"><path d="M31.06,196.67H504l-88.56,88.56a26.89,26.89,0,1,0,38,38L588,188.79a26.89,26.89,0,0,0,0-38L453.49,16.29a26.89,26.89,0,0,0-38,38L504,142.88H31.06a26.9,26.9,0,0,0,0,53.79Z" fill="currentColor"/></svg> 1558 1559 1560 1561 1562 1563 1564 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 1565 <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> 1566 </svg> 1567 1568 1569 1570 </summary> 1571 <div class="menu-drawer__submenu motion-reduce" tabindex="-1"> 1572 <div class="menu-drawer__inner-submenu"> 1573 <button class="menu-drawer__close-button link link--text focus-inset" aria-expanded="true"> 1574 1575 1576 1577 <svg class="icon icon-arrow " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 339.56"><path d="M31.06,196.67H504l-88.56,88.56a26.89,26.89,0,1,0,38,38L588,188.79a26.89,26.89,0,0,0,0-38L453.49,16.29a26.89,26.89,0,0,0-38,38L504,142.88H31.06a26.9,26.9,0,0,0,0,53.79Z" fill="currentColor"/></svg> 1578 1579 1580 1581 Fragrance 1582 </button> 1583 <ul class="menu-drawer__menu list-menu" role="list" tabindex="-1"> 1584 1585 1586 1587 <li> 1588 <a href="/collections/all-product" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1589 All Perfume Products 1590 </a> 1591 </li> 1592 1593 1594 1595 1596 <li> 1597 <a href="/collections/lisa-surihani" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1598 Suri Collection 1599 </a> 1600 </li> 1601 1602 1603 1604 1605 <li> 1606 <a href="/collections/aaron-aziz" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1607 The Oud Collection 1608 </a> 1609 </li> 1610 1611 1612 1613 1614 <li> 1615 <a href="/collections/sherry-al-hadad" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1616
1616 Ma Cherie Collection 1617 </a> 1618 </li> 1619 1620 1621 1622 1623 <li> 1624 <a href="/collections/eve-collection" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1625 EVE Collection 1626 </a> 1627 </li> 1628 1629 1630 1631 1632 <li> 1633 <a href="/collections/eyra-hazali" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1634 Nori Collection 1635 </a> 1636 </li> 1637 1638 1639 1640 </ul> 1641 </div> 1642 </div> 1643 </details> 1644 </li> 1645 1646 1647 1648 1649 <li> 1650 <a href="/pages/about-us-1" class="menu-drawer__menu-item list-menu__item link link--text focus-inset"> 1651 About Us 1652 </a> 1653 </li> 1654 1655 1656 </ul> 1657 </nav> 1658 1659 <div class="menu-drawer__utility-links"> 1660 1661 1662 1663 1664 1665 1666 1667 1668 <a href="/account/login" class="menu-drawer__account link link--text focus-inset h5"> 1669 1670 1671 1672 <svg class="icon icon-account " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M300,296.19c-70.7,0-137.11,28.74-187,80.93-49.59,51.87-76.9,120.77-76.9,194v25H563.89v-25c0-73.22-27.31-142.12-76.9-194C437.11,324.93,370.7,296.19,300,296.19ZM87.42,546.11C99.29,433.81,190.1,346.19,300,346.19s200.71,87.62,212.58,199.92Z" fill="currentColor"/><path d="M300,285.34c77.6,0,140.73-63.13,140.73-140.73S377.6,3.89,300,3.89,159.27,67,159.27,144.61,222.4,285.34,300,285.34Zm0-231.45a90.73,90.73,0,1,1-90.73,90.72A90.82,90.82,0,0,1,300,53.89Z" fill="currentColor"/></svg> 1673 1674 1675 1676 1677 Log in 1678 </a> 1679 1680 <a href="/account/register" class="menu-drawer__account link link--text focus-inset h5"> 1681 1682 1683 1684 1685 <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"> 1686 <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> 1687 </svg> 1688 1689 1690 1691 Create account 1692 </a> 1693 1694 1695 1696 </div> 1697 </div> 1698 </div> 1699 </div> 1700 </details> 1701 </header-drawer> 1702 1703 1704 <a href="/" class="header__heading-link link link--text focus-inset" itemprop="url"> 1705 <img src="https://cdn.store-assets.com/s/251247/f/14073118.png" class="header__heading-logo" alt="nori.com.my" loading="lazy" itemprop="logo"> 1706 </a> 1707 1708 1709 1710 <div class="header__search-input" tabindex="-1"> 1711 <form action="/search" method="get" role="search" class="search search-modal__form"> 1712 <div class="field"> 1713 <input class="search__input field__input" 1714 id="Search-In-Modal" 1715 type="search" 1716 name="q" 1717 value="" 1718 placeholder="Search" 1719 autocomplete="off" 1720 > 1721 <label class="field__label" for="Search-In-Modal">Search</label> 1722 <div class="dropdown" id="searchDropdown"></div> 1723 <input type="hidden" name="search_history" class="hidden_search_history"> 1724 <input type="hidden" name="options[prefix]" value="last"> 1725 <button class="search__button field__button" aria-label="Search"> 1726 <svg class="icon icon-search" aria-hidden="true" focusable="false" role="presentation"> 1727 <use href="#icon-search"> 1728 </svg> 1729 </button> 1730 </div> 1731 </form> 1732 </div> 1733 1734 1735 <nav class="header__inline-menu"> 1736 <ul class="list-menu list-menu--inline" role="list"> 1737 1738 1739 1740 <li> 1741 <a href="/" class="header__menu-item header__menu-item list-menu__item link link--text focus-inset"> 1742 Home 1743 </a> 1744 </li> 1745 1746 1747 1748 1749 1750 <li> 1751 <details-disclosure> 1752 <details> 1753 <summary class="header__menu-item list-menu__item link focus-inset"> 1754 <a href="/collections/others" >Skincare</a> 1755 1756 1757 1758 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 1759 <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> 1760 </svg> 1761 1762 1763 1764 </summary> 1765 <ul class="header__submenu list-menu list-menu--disclosure caption-large motion-reduce" role="list" tabindex="-1"> 1766 1767 1768 1769 1770 1771 <li> 1772 <a href="/collections/nori-skincare-2" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1773 All Products 1774 </a> 1775 </li> 1776 1777 1778 1779 1780 1781 <li> 1782 <a href="/collections/cleanser" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1783 Cleanser 1784 </a> 1785 </li> 1786 1787 1788 1789 1790 1791 <li> 1792 <a href="/collections/toner" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1793 Toner 1794 </a> 1795 </li> 1796 1797 1798 1799 1800 1801 <li> 1802 <a href="/collections/serum" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1803 Serum 1804 </a> 1805 </li> 1806 1807 1808 1809 1810 1811 <li> 1812 <a href="/collections/moisteriser" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1813 Moisturizer 1814 </a> 1815 </li> 1816 1817 1818 1819 1820 1821 <li> 1822 <a href="/collections/sun-screen" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1823 Sun Screen 1824 </a> 1825 </li> 1826 1827 1828 </ul> 1829 </details> 1830 </details-disclosure> 1831 </li> 1832 1833 1834 1835 1836 1837 <li> 1838 <details-disclosure> 1839 <details> 1840 <summary class="header__menu-item list-menu__item link focus-inset"> 1841 <a href="/collections/haircare" >Haircare</a> 1842 1843 1844 1845 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 1846 <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> 1847 </svg> 1848 1849 1850 1851 </summary> 1852 <ul class="header__submenu list-menu list-menu--disclosure caption-large motion-reduce" role="list" tabindex="-1"> 1853 1854 1855 1856 1857 1858 <li> 1859 <a href="/collections/all-product-1" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1860 All Suri Haircare Products 1861 </a> 1862 </li> 1863 1864 1865 1866 1867 1868 <li> 1869 <a href="/collections/suri-hairfall" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1870 Suri Hairfall 1871 </a> 1872 </li> 1873 1874 1875 1876 1877 1878 <li> 1879 <a href="/collections/suri-dandruff" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1880 Suri Dandruff 1881 </a> 1882 </li> 1883 1884 1885 </ul> 1886 </details> 1887 </details-disclosure> 1888 </li> 1889 1890 1891 1892 1893 1894 <li> 1895 <details-disclosure> 1896 <details> 1897 <summary class="header__menu-item list-menu__item link focus-inset"> 1898 <a href="/collections/celebrities" >Fragrance</a> 1899 1900 1901 1902 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 1903 <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> 1904 </svg> 1905 1906 1907 1908 </summary> 1909 <ul class="header__submenu list-menu list-menu--disclosure caption-large motion-reduce" role="list" tabindex="-1"> 1910 1911 1912 1913 1914 1915 <li> 1916 <a href="/collections/all-product" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1917 All Perfume Products 1918 </a> 1919 </li> 1920 1921 1922 1923 1924 1925 <li> 1926 <a href="/collections/lisa-surihani" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1927 Suri Collection 1928 </a> 1929 </li> 1930 1931 1932 1933 1934 1935 <li> 1936 <a href="/collections/aaron-aziz" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1937 The Oud Collection 1938 </a> 1939 </li> 1940 1941 1942 1943 1944 1945 <li> 1946 <a href="/collections/sherry-al-hadad" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1947 Ma Cherie Collection 1948 </a> 1949 </li> 1950 1951 1952 1953 1954 1955 <li> 1956 <a href="/collections/eve-collection" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1957 EVE Collection 1958 </a> 1959 </li> 1960 1961 1962 1963 1964 1965 <li> 1966 <a href="/collections/eyra-hazali" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1967 Nori Collection 1968 </a> 1969 </li> 1970 1971 1972 </ul> 1973 </details> 1974 </details-disclosure> 1975 </li> 1976 1977 1978 1979 1980 <li> 1981 <a href="/pages/about-us-1" class="header__menu-item header__menu-item list-menu__item link link--text focus-inset"> 1982 About Us 1983 </a> 1984 </li> 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 </ul> 1998 </nav> 1999 <div class="header__icons"> 2000 2001 2002 2003 <div class="header__icon header__icon--account link link--text focus-inset small-hide medium-hide" style="position: relative;"> 2004 <a href="/account/login" class="header__icon link link--text focus-inset p-2"> 2005 2006 2007 2008 <svg class="icon icon-account " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M300,296.19c-70.7,0-137.11,28.74-187,80.93-49.59,51.87-76.9,120.77-76.9,194v25H563.89v-25c0-73.22-27.31-142.12-76.9-194C437.11,324.93,370.7,296.19,300,296.19ZM87.42,546.11C99.29,433.81,190.1,346.19,300,346.19s200.71,87.62,212.58,199.92Z" fill="currentColor"/><path d="M300,285.34c77.6,0,140.73-63.13,140.73-140.73S377.6,3.89,300,3.89,159.27,67,159.27,144.61,222.4,285.34,300,285.34Zm0-231.45a90.73,90.73,0,1,1-90.73,90.72A90.82,90.82,0,0,1,300,53.89Z" fill="currentColor"/></svg> 2009 2010 2011
2012 <span id="my-account" class="header__link-label">Login</span> 2013 </a> 2014 2015 <!-- Referral Notification Popup for Desktop --> 2016 <div id="referralNotification" class="referral-notification" style="display: none;"> 2017 <button class="close-btn" onclick="dismissReferralNotification()">×</button> 2018 <div style="text-align: center; margin-bottom: 16px;"> 2019 <div style="width: 100px; height: 100px; margin: 0 auto;"> 2020 <img src="https://resources.easystore.co/storefront/icons/channels/vector_referral_program.svg"> 2021 </div> 2022 </div> 2023 <p id="referralSignupMessage" style="text-align: center; font-size: 14px; color: #666; margin: 0 0 20px 0;"> 2024 Your friend gifted you credit! Sign up now to redeem. 2025 </p> 2026 <div style="text-align: center;"> 2027 <button class="btn" onclick="goToSignupPage()" style="width: 100%;"> 2028 Sign Up 2029 </button> 2030 </div> 2031 </div> 2032 </div> 2033 2034 2035 2036 <a href="/cart" class="header__icon link link--text focus-inset" id="cart-icon-bubble"> 2037 <span class="header__icon--cart"> 2038 2039 2040 2041 <svg class="icon icon-cart-empty " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496.56 600"><path d="M453.52,128.63a25,25,0,0,0-24.91-22.8H364.72a117.48,117.48,0,0,0-232.89,0H67.94A25,25,0,0,0,43,128.63L8.8,515.21a72.11,72.11,0,0,0,19.05,55.6,79,79,0,0,0,58.22,25.3H410.49a79,79,0,0,0,58.22-25.3,72.11,72.11,0,0,0,19.05-55.6ZM248.28,53.89a67.58,67.58,0,0,1,65.65,51.94H182.63A67.57,67.57,0,0,1,248.28,53.89ZM431.83,537.05a28.85,28.85,0,0,1-21.34,9.06H86.07a28.85,28.85,0,0,1-21.34-9.06,22.69,22.69,0,0,1-6.13-17.43L90.82,155.83h40v51.23a25,25,0,0,0,50,0V155.83h135v51.23a25,25,0,0,0,50,0V155.83h40L438,519.62A22.68,22.68,0,0,1,431.83,537.05Z" fill="currentColor"/></svg> 2042 2043 2044 2045 <div class="cart-count-bubble hidden"> 2046 <span aria-hidden="true" class="js-content-cart-count">0</span> 2047 </div> 2048 </span> 2049 <span class="header__link-label medium-hide small-hide"> 2050 Cart 2051 </span> 2052 </a> 2053 2054 2055 2056 <!-- Referral Notification Modal for Mobile --> 2057 <details-modal class="referral-modal" id="referralMobileModal"> 2058 <details> 2059 <summary class="referral-modal__toggle" aria-haspopup="dialog" aria-label="Open referral modal" style="display: none;"> 2060 </summary> 2061 <div class="modal-overlay referral-modal-overlay"></div> 2062 <div class="referral-modal__dialog" role="dialog" aria-modal="true" aria-label="Referral notification"> 2063 <div class="referral-modal__content"> 2064 <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;"> 2065 × 2066 </button> 2067 2068 <div style="margin-bottom: 24px;"> 2069 <div style="width: 120px; height: 120px; margin: 0 auto 20px;"> 2070 <img src="https://resources.easystore.co/storefront/icons/channels/vector_referral_program.svg" style="width: 100%; height: 100%;"> 2071 </div> 2072 </div> 2073 2074 <p id="referralSignupMessageMobile" style="font-size: 16px; color: #333; margin: 0 0 30px 0; line-height: 1.5;"> 2075 Your friend gifted you credit! Sign up now to redeem. 2076 </p> 2077 2078 <button type="button" class="btn" onclick="goToSignupPageFromMobile()" style="width: 100%;"> 2079 Sign Up 2080 </button> 2081 </div> 2082 </div> 2083 </details> 2084 </details-modal> 2085 2086 2087 2088 </div> 2089 </header> 2090 </sticky-header> 2091 2092<cart-notification> 2093 <div class="cart-notification-wrapper page-width color-background-1"> 2094 <div id="cart-notification" class="cart-notification focus-inset" aria-modal="true" aria-label="Added to cart" role="dialog" tabindex="-1"> 2095 <div class="cart-notification__header"> 2096 <h2 class="cart-notification__heading caption-large"> 2097 2098 2099 <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"> 2100 <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> 2101 </svg> 2102 2103 2104 Added to cart</h2> 2105 <button type="button" class="cart-notification__close modal__close-button link link--text focus-inset" aria-label="accessibility.close"> 2106 2107 2108 2109 <svg class="icon icon-close " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M335.36,300,581.87,53.48a25,25,0,0,0-35.35-35.35L300,264.64,53.48,18.13A25,25,0,0,0,18.13,53.48L264.64,300,18.13,546.52a25,25,0,0,0,35.35,35.35L300,335.36,546.52,581.87a25,25,0,0,0,35.35-35.35Z" fill="currentColor"/></svg> 2110 2111 2112 2113 </button> 2114 </div> 2115 <div id="cart-notification-product" class="cart-notification-product"></div> 2116 <div class="cart-notification__links"> 2117 <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> 2118 <form action="/cart" method="post" id="cart-notification-form"> 2119 <input type="hidden" name="_token" value="XYmWcVVl4QLQaA5mLkFyZbn4QVnbDUIcwZ74PaUE"> 2120 <input type="hidden" name="current_currency" value=""> 2121 <button class="button button--primary button--full-width" name="checkout" value="true">Checkout</button> 2122 </form> 2123 <button type="button" class="link button-label">Continue shopping</button> 2124 </div> 2125 </div> 2126 </div> 2127</cart-notification> 2128<style> 2129 .cart-notification { 2130 display: none; 2131 } 2132</style>
2133<script> 2134document.getElementById('cart-notification-form').addEventListener('submit',(event)=>{ 2135 if(event.submitter) event.submitter.classList.add('loading'); 2136}) 2137 2138</script>
2138 2139 2140</div> 2141 2142
2143<script> 2144 2145 class StickyHeader extends HTMLElement { 2146 constructor() { 2147 super(); 2148 } 2149 2150 connectedCallback() { 2151 this.header = document.getElementById('easystore-section-header'); 2152 this.headerBounds = {}; 2153 this.currentScrollTop = 0; 2154 this.preventReveal = false; 2155 2156 this.onScrollHandler = this.onScroll.bind(this); 2157 this.hideHeaderOnScrollUp = () => this.preventReveal = true; 2158 2159 this.addEventListener('preventHeaderReveal', this.hideHeaderOnScrollUp); 2160 window.addEventListener('scroll', this.onScrollHandler, false); 2161 2162 this.createObserver(); 2163 } 2164 2165 disconnectedCallback() { 2166 this.removeEventListener('preventHeaderReveal', this.hideHeaderOnScrollUp); 2167 window.removeEventListener('scroll', this.onScrollHandler); 2168 } 2169 2170 createObserver() { 2171 let observer = new IntersectionObserver((entries, observer) => { 2172 this.headerBounds = entries[0].intersectionRect; 2173 observer.disconnect(); 2174 }); 2175 2176 observer.observe(this.header); 2177 } 2178 2179 onScroll() { 2180 const scrollTop = window.pageYOffset || document.documentElement.scrollTop; 2181 2182 if (scrollTop > this.currentScrollTop && scrollTop > this.headerBounds.bottom) { 2183 requestAnimationFrame(this.hide.bind(this)); 2184 } else if (scrollTop < this.currentScrollTop && scrollTop > this.headerBounds.bottom) { 2185 if (!this.preventReveal) { 2186 requestAnimationFrame(this.reveal.bind(this)); 2187 } else { 2188 window.clearTimeout(this.isScrolling); 2189 2190 this.isScrolling = setTimeout(() => { 2191 this.preventReveal = false; 2192 }, 66); 2193 2194 requestAnimationFrame(this.hide.bind(this)); 2195 } 2196 } else if (scrollTop <= this.headerBounds.top) { 2197 requestAnimationFrame(this.reset.bind(this)); 2198 } 2199 2200 2201 this.currentScrollTop = scrollTop; 2202 } 2203 2204 hide() { 2205 this.header.classList.add('easystore-section-header-hidden', 'easystore-section-header-sticky'); 2206 this.closeMenuDisclosure(); 2207 // this.closeSearchModal(); 2208 } 2209 2210 reveal() { 2211 this.header.classList.add('easystore-section-header-sticky', 'animate'); 2212 this.header.classList.remove('easystore-section-header-hidden'); 2213 } 2214 2215 reset() { 2216 this.header.classList.remove('easystore-section-header-hidden', 'easystore-section-header-sticky', 'animate'); 2217 } 2218 2219 closeMenuDisclosure() { 2220 this.disclosures = this.disclosures || this.header.querySelectorAll('details-disclosure'); 2221 this.disclosures.forEach(disclosure => disclosure.close()); 2222 } 2223 2224 // closeSearchModal() { 2225 // this.searchModal = this.searchModal || this.header.querySelector('details-modal'); 2226 // this.searchModal.close(false); 2227 // } 2228 } 2229 2230 customElements.define('sticky-header', StickyHeader); 2231 2232 2233 class DetailsDisclosure extends HTMLElement{ 2234 constructor() { 2235 super(); 2236 this.mainDetailsToggle = this.querySelector('details'); 2237 // this.mainDetailsToggle.addEventListener('focusout', this.onFocusOut.bind(this)); 2238 this.mainDetailsToggle.addEventListener('mouseover', this.open.bind(this)); 2239 this.mainDetailsToggle.addEventListener('mouseleave', this.close.bind(this)); 2240 } 2241 2242 onFocusOut() { 2243 setTimeout(() => { 2244 if (!this.contains(document.activeElement)) this.close(); 2245 }) 2246 } 2247 2248 open() { 2249 this.mainDetailsToggle.setAttribute('open',1) 2250 } 2251 2252 close() { 2253 this.mainDetailsToggle.removeAttribute('open') 2254 } 2255 } 2256 2257 customElements.define('details-disclosure', DetailsDisclosure); 2258 2259 function clearAll() { 2260 localStorage.removeItem('searchHistory'); 2261 2262 var customer = ""; 2263 if(customer) { 2264 // Your logic to clear all data or call an endpoint 2265 fetch('/account/search_histories', { 2266 method: 'DELETE', 2267 headers: { 2268 "Content-Type": "application/json", 2269 "X-Requested-With": "XMLHttpRequest" 2270 }, 2271 body: JSON.stringify({ 2272 _token: "XYmWcVVl4QLQaA5mLkFyZbn4QVnbDUIcwZ74PaUE" 2273 }), 2274 }) 2275 .then(response => response.json()) 2276 } 2277 } 2278 // End - delete search history from local storage 2279 2280 // search history dropdown 2281 var searchInputs = document.querySelectorAll('.search__input'); 2282 2283 if(searchInputs.length > 0) { 2284
2285 searchInputs.forEach((searchInput)=> { 2286 2287 searchInput.addEventListener('focus', function() { 2288 var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown'); 2289 searchDropdown.innerHTML = ''; // Clear existing items 2290 2291 // retrieve data from local storage 2292 var searchHistoryData = JSON.parse(localStorage.getItem('searchHistory')) || []; 2293 2294 // Convert JSON to string 2295 var search_history_json = JSON.stringify(searchHistoryData); 2296 2297 // Set the value of the hidden input 2298 searchInput.closest('form').querySelector(".hidden_search_history").value = search_history_json; 2299 2300 // create dropdown items 2301 var clearAllItem = document.createElement('div'); 2302 clearAllItem.className = 'dropdown-item clear-all'; 2303 clearAllItem.textContent = 'Clear'; 2304 clearAllItem.addEventListener('click', function() { 2305 clearAll(); 2306 searchDropdown.style.display = 'none'; 2307 searchInput.classList.remove('is-focus'); 2308 }); 2309 searchDropdown.appendChild(clearAllItem); 2310 2311 // create dropdown items 2312 searchHistoryData.forEach(function(item) { 2313 var dropdownItem = document.createElement('div'); 2314 dropdownItem.className = 'dropdown-item'; 2315 dropdownItem.textContent = item.term; 2316 dropdownItem.addEventListener('click', function() { 2317 searchInput.value = item.term; 2318 searchInput.closest('form').submit(); 2319 searchDropdown.style.display = 'none'; 2320 }); 2321 searchDropdown.appendChild(dropdownItem); 2322 }); 2323 2324 if(searchHistoryData.length > 0){ 2325 // display the dropdown 2326 searchInput.classList.add('is-focus'); 2327 document.body.classList.add('search-input-focus'); 2328 searchDropdown.style.display = 'block'; 2329 } 2330 }); 2331 2332 searchInput.addEventListener("focusout", (event) => { 2333 var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown'); 2334 searchInput.classList.remove('is-focus'); 2335 searchDropdown.classList.add('transparent'); 2336 setTimeout(()=>{ 2337 searchDropdown.style.display = 'none'; 2338 searchDropdown.classList.remove('transparent'); 2339 document.body.classList.remove('search-input-focus'); 2340 }, 400); 2341 }); 2342 }) 2343 } 2344 // End - search history dropdown 2345 2346 // referral notification popup 2347 const referralMessageTemplate = 'Your friend gifted you __CURRENCY_CODE__ __CREDIT_AMOUNT__ credit! Sign up now to redeem.'; 2348 const shopCurrency = 'RM'; 2349 2350 function getCookie(name) { 2351 const value = `; ${document.cookie}`; 2352 const parts = value.split(`; ${name}=`); 2353 if (parts.length === 2) return parts.pop().split(';').shift(); 2354 return null; 2355 } 2356 2357 function removeCookie(name) { 2358 document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`; 2359 } 2360 2361 function showReferralNotification() { 2362 const referralCode = getCookie('customer_referral_code'); 2363 2364 2365 const customerReferralCode = null; 2366 2367 2368 const activeReferralCode = referralCode || customerReferralCode; 2369 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 2370 2371 if (referralData.timestamp && referralData.expirationDays) { 2372 const expirationTime = referralData.timestamp + (referralData.expirationDays * 24 * 60 * 60 * 1000); 2373 if (Date.now() > expirationTime) { 2374 localStorage.removeItem('referral_notification_data'); 2375 return; 2376 } 2377 } 2378 2379 if (referralData.dismissed) return; 2380 2381 if (activeReferralCode) { 2382 if (referralData.creditAmount) { 2383 displayReferralNotification(referralData.creditAmount); 2384 } else { 2385 fetchReferralCampaignData(activeReferralCode); 2386 } 2387 } 2388 } 2389 2390 function fetchReferralCampaignData(referralCode) { 2391 fetch(`/customer/referral_program/campaigns/${referralCode}`) 2392 .then(response => { 2393 if (!response.ok) { 2394 throw new Error('Network response was not ok'); 2395 } 2396 return response.json(); 2397 }) 2398 .then(data => { 2399 let refereeCreditAmount = null; 2400 if (data.data.campaign && data.data.campaign.referral_rules) { 2401 const refereeRule = data.data.campaign.referral_rules.find(rule => 2402 rule.target_type === 'referee' && 2403 rule.event_name === 'customer/create' && 2404 rule.entitlement && 2405 rule.entitlement.type === 'credit' 2406 ); 2407 2408 if (refereeRule) { 2409 refereeCreditAmount = refereeRule.entitlement.amount; 2410 } 2411 } 2412 2413 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 2414 referralData.creditAmount = refereeCreditAmount; 2415 referralData.dismissed = referralData.dismissed || false; 2416 referralData.timestamp = Date.now(); 2417 referralData.expirationDays = 3; 2418 localStorage.setItem('referral_notification_data', JSON.stringify(referralData)); 2419 2420 displayReferralNotification(refereeCreditAmount); 2421 }) 2422 .catch(error => { 2423 removeCookie('customer_referral_code'); 2424 }); 2425 } 2426 2427 function displayReferralNotification(creditAmount = null) { 2428 const isMobile = innerWidth <= 749; 2429 2430 if (isMobile) { 2431 const mobileModal = document.querySelector('#referralMobileModal details'); 2432 const mobileMessageElement = document.getElementById('referralSignupMessageMobile'); 2433 2434 if (mobileModal && mobileMessageElement) { 2435 if (creditAmount) {
2436 const finalMessage = referralMessageTemplate 2437 .replace('__CREDIT_AMOUNT__', creditAmount) 2438 .replace('__CURRENCY_CODE__', shopCurrency); 2439 2440 mobileMessageElement.textContent = finalMessage; 2441 } 2442 2443 mobileModal.setAttribute('open', ''); 2444 } 2445 } else { 2446 const notification = document.getElementById('referralNotification'); 2447 2448 if (notification) { 2449 if (creditAmount) { 2450 const messageElement = document.getElementById('referralSignupMessage'); 2451 if (messageElement) { 2452 const finalMessage = referralMessageTemplate 2453 .replace('__CREDIT_AMOUNT__', creditAmount) 2454 .replace('__CURRENCY_CODE__', shopCurrency); 2455 2456 messageElement.textContent = finalMessage; 2457 } 2458 } 2459 2460 notification.style.display = 'block'; 2461 } 2462 } 2463 } 2464 2465 showReferralNotification(); 2466 2467 addEventListener('beforeunload', function() { 2468 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 2469 2470 if (referralData.creditAmount !== undefined) { 2471 referralData.creditAmount = null; 2472 localStorage.setItem('referral_notification_data', JSON.stringify(referralData)); 2473 } 2474 }); 2475 2476 function closeReferralNotification() { 2477 const notification = document.getElementById('referralNotification'); 2478 if (notification) { 2479 notification.style.display = 'none'; 2480 } 2481 } 2482 2483 function dismissReferralNotification() { 2484 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 2485 2486 referralData.dismissed = true; 2487 referralData.timestamp = referralData.timestamp || Date.now(); 2488 referralData.expirationDays = referralData.expirationDays || 3; 2489 2490 localStorage.setItem('referral_notification_data', JSON.stringify(referralData)); 2491 2492 closeReferralNotification(); 2493 } 2494 2495 function goToSignupPage() { 2496 location.href = '/account/register'; 2497 dismissReferralNotification(); 2498 } 2499 2500 function closeMobileReferralModal() { 2501 const mobileModal = document.querySelector('#referralMobileModal details'); 2502 if (mobileModal) { 2503 mobileModal.removeAttribute('open'); 2504 } 2505 2506 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 2507 referralData.dismissed = true; 2508 referralData.timestamp = referralData.timestamp || Date.now(); 2509 referralData.expirationDays = referralData.expirationDays || 3; 2510 localStorage.setItem('referral_notification_data', JSON.stringify(referralData)); 2511 } 2512 2513 function goToSignupPageFromMobile() { 2514 location.href = '/account/register'; 2515 closeMobileReferralModal(); 2516 } 2517 // End - referral notification popup 2518</script>
2518 2519 2520 2521 2522 <main id="MainContent" class="content-for-layout focus-none" role="main" tabindex="-1">
vendor: 81 bytes, lines 2522-2525
2522 2523 2524 2525<script src="https://www.recaptcha.net/recaptcha/enterprise.js?render=
25256LdMNdIqAAAAALegJp7y4weVcCIlnwmIN8TWseEF
vendor: 12 bytes, line 2525
2525"></script>
2526<link rel="preload" href="https://store-themes.easystore.co/251247/themes/282847/assets/customer.css?t=1790328533" as="style" onload="this.onload=null;this.rel='stylesheet'"> 2527<style> 2528 main.main-content .field > label{ 2529 display: none; 2530 } 2531 .h3{ 2532 font-size: 18px; 2533 } 2534 .button--full-width{ 2535 width: 100%; 2536 } 2537 .tab-wrapper{ 2538 display: inline-flex; 2539 justify-content: center; 2540 align-items: center; 2541 margin: 10px auto 20px; 2542 background-color: #eaeaea; 2543 border-radius: 200px; 2544 padding: 5px; 2545 gap: 10px; 2546 } 2547 .tab-wrapper .tab-label { 2548 display: inline-block; 2549 min-width: 130px; 2550 padding: 8px 15px; 2551 border-radius: 100px; 2552 cursor: pointer; 2553 font-size: 17px; 2554 line-height: 1.1; 2555 user-select: none; 2556 margin: 0; 2557 color: #000; 2558 } 2559 #register-tos a { 2560 display: inline; 2561 } 2562 @media screen and (max-width: 400px){ 2563 .tab-wrapper .tab-label { 2564 min-width: 110px; 2565 } 2566 } 2567 .tab-wrapper input[type='radio']:checked + .tab-label { 2568 background-color: #fff; 2569 box-shadow: 2px 2px 25px -10px #333; 2570 } 2571 2572 @media screen and (min-width: 500px){ 2573 .large--five-twelfths{ 2574 min-width: 420px; 2575 } 2576 } 2577</style> 2578 2579 2580 2581 2582<div class="customer login section-width-control small-width large--five-twelfths text-center wrapper"> 2583 <div class="card"> 2584 <h1 id="login" tabindex="-1" class="mb-0"> 2585 Welcome 2586 </h1> 2587 <p class="h3 mt-0"> 2588 2589 Sign up or log in to continue 2590 2591 </p> 2592 <div> 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 <div class="tab-wrapper"> 2611 <div> 2612 <input type="radio" name="type" id="tab-register" class="hide hidden" checked> 2613 <label for="tab-register" class="tab-label"> 2614 Sign up 2615 </label> 2616 </div> 2617 <div> 2618 <input type="radio" name="type" id="tab-login" class="hide hidden"> 2619 <label for="tab-login" class="tab-label"> 2620 Login 2621 </label> 2622 </div> 2623 </div> 2624 2625 2626 <form id="form-login" action="/account/auth" method="post" class="mt-2"> 2627 <input type="hidden" name="_token" value="XYmWcVVl4QLQaA5mLkFyZbn4QVnbDUIcwZ74PaUE"> 2628 <input type="hidden" name="location_id" value=""> 2629 <input type="hidden" name="staff_id" value=""> 2630 <input type="hidden" id="recaptchaResponse" name="g-recaptcha-response"> 2631 2632 2633 <div id="error-content"></div> 2634 2635 <div class="field"> 2636 <input 2637 type="text" 2638 name="customer[email_or_phone]" 2639 id="CustomerDetail" 2640 autocorrect="off" 2641 autocapitalize="off" 2642 placeholder="Email" 2643 required 2644 > 2645 <label for="CustomerDetail"> 2646 Email 2647 </label> 2648 </div> 2649 2650 <button 2651 type="submit" 2652 form="form-login" 2653 class="btn button--full-width g-recaptcha"> 2654 Continue 2655 </button> 2656 2657 <div class="button-snippet"> 2658 2659 </div> 2660 2661 2662 2663 <div id="register-tos"> 2664 By signing up, I agree to the nori.com.my's <a target="_blank" href="/legal/privacy-policy">Privacy Policy</a>, <a target="_blank" href="/legal/refund-policy">Refund Policy</a>, <a target="_blank" href="/pages/delivery-policy">Delivery Policy</a> and <a target="_blank" href="/legal/terms-of-service">Terms & Conditions</a>. 2665 </div> 2666 2667 </form> 2668 </div> 2669 </div> 2670 2671</div> 2672 2673 2674
2675<script> 2676 const register_tab = document.querySelector('#tab-register'); 2677 const login_tab = document.querySelector('#tab-login'); 2678 const register_tos = document.querySelector('#register-tos'); 2679 const isRegistrationEnabled = "1"; 2680 2681 if (register_tab) { 2682 register_tab.addEventListener('click', function() { 2683 if (register_tos) { 2684 register_tos.style.display = 'block'; 2685 } 2686 }); 2687 } 2688 if (login_tab) { 2689 login_tab.addEventListener('click', function() { 2690 if (register_tos) { 2691 register_tos.style.display = 'none'; 2692 } 2693 }); 2694 } 2695 2696 const methodSwitchBtn = document.getElementById('phone-login-btn'); 2697 if (methodSwitchBtn) { 2698 methodSwitchBtn.onclick = function () { 2699 var type = (register_tab && register_tab.checked) ? 'register' : 'login'; 2700 window.location.href = '/account/login?method=phone&type=' + type; 2701 }; 2702 } 2703 2704 let lastPathSegment = window.location.pathname.split('/').filter(segment => segment.length > 0).pop(); 2705 2706 // Redirect to login if trying to access register when self registration is disabled 2707 if (!isRegistrationEnabled) { 2708 if (lastPathSegment === 'register') { 2709 window.location.href = '/account/login'; 2710 } else if (lastPathSegment === 'login' || lastPathSegment === 'auth') { 2711 if (register_tos) { 2712 register_tos.style.display = 'none'; 2713 } 2714 } 2715 } else { 2716 // Only proceed with tab logic if not redirecting 2717 if(lastPathSegment === 'login') { 2718 if (login_tab) { 2719 login_tab.checked = true; 2720 } 2721 if (register_tos) { 2722 register_tos.style.display = 'none'; 2723 } 2724 } else { 2725 if (register_tos) { 2726 register_tos.style.display = 'block'; 2727 } 2728 } 2729 } 2730 2731 const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; 2732 const phonePattern = /^(?:\+?\d{1,3}[\s-]?)?(?:\d{1,14}[\s-]?){1,5}$/; 2733 2734 let form = document.querySelector('#form-login'), 2735 input = document.querySelector('#CustomerDetail'), 2736 error_content = document.querySelector('#error-content'); 2737 2738 2739 // One attempt at a time: the reCAPTCHA wait below is async, so without 2740 // this a double-click starts two continuations and posts the form twice. 2741 var submitting = false; 2742 2743 form.addEventListener('submit', async function (event) { 2744 // preventDefault FIRST: a re-entrant submit must still be cancelled, or the 2745 // browser performs a native post with no captcha token. 2746 event.preventDefault(); 2747 if (submitting) return; 2748 2749 let input_value = input.value 2750 error_content.innerHTML = ''; 2751 if (!input_value.match(emailPattern) && !input_value.match(phonePattern)) { 2752 error_content.innerHTML = `<div class="errors note">Invalid Email or Phone</div>`; 2753 return false; 2754 } 2755 2756 submitting = true; 2757 document.querySelector('#form-login .btn').classList.add('btn--loading','loading'); 2758 2759 // reCAPTCHA is unreachable from some regions (google.com is blocked in 2760 // mainland China). Fail open the same way checkout and forgot-password do: 2761 // submit without a token rather than leave the button spinning forever. 2762 try { 2763 if (window.grecaptcha && typeof window.grecaptcha.enterprise === 'object') { 2764 // The loader defines a stub {ready} synchronously and fetches the real 2765 // implementation asynchronously, so execute() may not exist yet. 2766 // ready() queues until it does; the timeout stops a bundle that never 2767 // arrives from hanging the button. 2768 await new Promise(function (resolve) { 2769 setTimeout(resolve, 3000); 2770 try { grecaptcha.enterprise.ready(resolve); } catch (e) { resolve(); } 2771 }); 2772 2773 const token = await grecaptcha.enterprise.execute('6LdMNdIqAAAAALegJp7y4weVcCIlnwmIN8TWseEF', { action: 'LOGIN' }); 2774 document.getElementById('recaptchaResponse').value = token; 2775 } 2776 } catch (e) { /* fail open */ } 2777 2778 document.getElementById('form-login').submit(); 2779 }); 2780 2781 2782</script>
2782 2783 2784 2785 </main> 2786 <style> 2787 .footer{ 2788 background-color: #F1EEE7; 2789 color: #000000; 2790 --color-foreground: 0,0,0; 2791 } 2792 .footer .link--text, 2793 .footer .list-menu__item--link, 2794 .footer .footer-block__details-content .list-menu__item--link{ 2795 color: #000000; 2796 } 2797 .footer-block__heading{ 2798 color: #000000; 2799 } 2800 .rounded{ 2801 border-radius: 10px; 2802 } 2803 .shopping-app-border{ 2804 border: 1px #ECECEC solid; 2805 margin-right: 3px; 2806 } 2807 .app-download-badge{ 2808 display: inline-block; 2809 margin-right: 3px; 2810 } 2811</style> 2812 2813<link rel="preload" href="https://store-themes.easystore.co/251247/themes/282847/assets/section-footer.css?t=1790328533" as="style" onload="this.onload=null;this.rel='stylesheet'"> 2814 2815<footer class="footer color-background-1"> 2816 <div class="footer__content-top page-width"> 2817 <div class="grid grid--1-col grid--4-col-tablet "> 2818 2819 2820 2821 <div class="grid__item"> 2822 2823 <h2 class="footer-block__heading">Follow us</h2> 2824 <ul class="footer__list-social list-unstyled list-social footer-block__details-content" role="list"> 2825 2826 2827 <li class="list-social__item"> 2828 <a href="https://www.facebook.com/NoriOfficialHQ" class="link link--text list-social__link"> 2829 2830 2831 2832 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-facebook " 2833 viewBox="0 0 18 18"> 2834 <path fill="currentColor" 2835 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"> 2836 </path> 2837 </svg> 2838 2839 2840 2841 </a> 2842 </li> 2843 2844 2845 <li class="list-social__item"> 2846 <a href="https://instagram.com/noriofficial.hq" class="link link--text list-social__link"> 2847 2848 2849 2850 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-instagram " 2851 viewBox="0 0 18 18"> 2852 <path fill="currentColor" 2853 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"> 2854 </path> 2855 <path fill="currentColor" 2856 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"> 2857 </path> 2858 </svg> 2859 2860 2861 2862 </a> 2863 </li> 2864 2865 2866 <li class="list-social__item"> 2867 <a href="https://www.tiktok.com/@nori.fragrance" class="link link--text list-social__link"> 2868 2869 2870 2871 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-tiktok " width="16" 2872 height="18" fill="none" xmlns="http://www.w3.org/2000/svg"> 2873 <path 2874 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" 2875 fill="currentColor"> 2876 </path> 2877 </svg> 2878 2879 2880 2881 </a> 2882 </li> 2883 2884 2885 <li class="list-social__item"> 2886 <a href="https://wa.link/29v29w" class="link link--text list-social__link"> 2887 2888 2889 2890 <svg class="icon icon-whatsapp " fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 750 750">
2890<path d="M703.5,195.64A371,371,0,0,0,572,56C523.89,26,471.51,8.4,415.21,2.51A370.48,370.48,0,0,0,316.5,5.42,364,364,0,0,0,215.23,37.47a369,369,0,0,0-132.68,108Q17.36,230.17,7,336.63A370.11,370.11,0,0,0,53.42,554.94a7.23,7.23,0,0,1,.61,4.9Q36.48,624.6,18.7,689.27C13.24,709.19,7.75,729.1,2.14,749.5c1.23-.26,1.93-.36,2.61-.55q95.75-25.11,191.54-50.2a8.43,8.43,0,0,1,5.19.61c12.79,5.8,25.28,12.34,38.29,17.59A370.28,370.28,0,0,0,666.09,604q69.06-86.36,80-196.47A370.36,370.36,0,0,0,743,311.86,361,361,0,0,0,703.5,195.64ZM684.64,388c-3.6,65.27-25.48,123.75-66.06,174.9-44.89,56.63-102.85,93.24-173.19,109.84a297.41,297.41,0,0,1-91.27,7A305.68,305.68,0,0,1,215.31,635a17.54,17.54,0,0,0-15.2-2.14c-35.5,9.58-71.1,18.74-106.66,28-.49.13-1,.21-2.14.45,1.72-6.37,3.29-12.22,4.89-18Q109,596.7,121.66,550.07a7.12,7.12,0,0,0-1-5.07c-12.37-19.32-23.31-39.25-31.6-60.64A309,309,0,0,1,70.4,410.63c-6.11-49.35-.93-97.44,16.1-144.15,57.86-160.1,234.55-243,394.65-185.11a308.31,308.31,0,0,1,120.2,79.18c34.9,37.19,59.32,80.31,72.81,129.53A304.75,304.75,0,0,1,684.64,388Z"/><path d="M556,454.42c-13.84-6.52-27.43-13.55-41.24-20.12-11.47-5.46-23-10.89-34.73-15.69-9.1-3.73-13.09-1.72-19.12,6.06-9.39,12.09-19.09,23.95-28.89,35.71-4.7,5.63-9.47,6.79-16.1,3.8-12.32-5.56-24.82-10.9-36.58-17.51-39.6-22.29-69.59-54.3-92.67-93.11-4.87-8.2-4.3-12.16,2.14-19.13,9.07-9.9,18.4-19.63,24.09-32.12a17.42,17.42,0,0,0,.47-14.67c-9.55-23-19-46-28.75-68.92a75.82,75.82,0,0,0-7-12.7c-2.56-3.82-6.6-5.49-11.28-5.36H255.78v-.56c-5.48.29-11,.11-16.39,1-8.66,1.37-15,6.75-20.95,12.94-25.46,26.48-34.58,57.89-28.66,93.83a145.64,145.64,0,0,0,20.75,53.75C220.48,377.5,231.32,393,242.65,408a435.09,435.09,0,0,0,70.53,73.19c31.48,26,67,44.54,105.56,57.58,16.1,5.44,32.08,11.08,49.36,11.42,11.52.22,23,.08,34.16-3.22a110.77,110.77,0,0,0,42.1-23.61c5.48-4.81,10.48-10.18,13.19-17a110.56,110.56,0,0,0,7.57-37.2C565.27,461.93,562.42,457.42,556,454.42Z"/></svg> 2891 2892 2893 2894 </a> 2895 </li> 2896 2897 2898 2899 2900 <li class="list-social__item"> 2901 <a href="https://www.youtube.com/@noriofficialyoutube" class="link link--text list-social__link"> 2902 2903 2904 2905 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-youtube " 2906 viewBox="0 0 100 70"> 2907 <path 2908 d="M98 11c2 7.7 2 24 2 24s0 16.3-2 24a12.5 12.5 0 01-9 9c-7.7 2-39 2-39 2s-31.3 0-39-2a12.5 12.5 0 01-9-9c-2-7.7-2-24-2-24s0-16.3 2-24c1.2-4.4 4.6-7.8 9-9 7.7-2 39-2 39-2s31.3 0 39 2c4.4 1.2 7.8 4.6 9 9zM40 50l26-15-26-15v30z" 2909 fill="currentColor"> 2910 </path> 2911 </svg> 2912 2913 2914 2915 </a> 2916 </li> 2917 2918 2919 </ul> 2920 2921 </div> 2922 2923 2924 2925 <div class="grid__item"> 2926 2927 <h2 class="footer-block__heading">We accept</h2> 2928 <div class="footer-block__details-content footer__payment"> 2929 <ul class="list list-payment" role="list"> 2930 2931 <li class="list-payment__item"> 2932 2933 2934 2935 <svg class="icon icon--full-color " viewBox="0 0 38 24" xmlns="http://www.w3.org/2000/svg" role="img" 2936 width="38" height="24" aria-labelledby="pi-visa"> 2937 <path opacity=".07" 2938 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> 2939 <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"> 2940 </path> 2941 <path 2942 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.
29421-.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" 2943 fill="#142688"></path> 2944 </svg> 2945 2946 2947 2948 </li> 2949 2950 2951 <li class="list-payment__item"> 2952 2953 2954 2955 <svg class="icon icon--full-color " viewBox="0 0 38 24" xmlns="http://www.w3.org/2000/svg" role="img" 2956 width="38" height="24" aria-labelledby="pi-master"> 2957 <path opacity=".07" 2958 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> 2959 <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"> 2960 </path> 2961 <circle fill="#EB001B" cx="15" cy="12" r="7"></circle> 2962 <circle fill="#F79E1B" cx="23" cy="12" r="7"></circle> 2963 <path fill="#FF5F00" 2964 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> 2965 </svg> 2966 2967 2968 2969 </li> 2970 2971 2972 2973 2974 2975 2976 2977 <li class="list-payment__item"> 2978 <img src="https://s3.dualstack.ap-southeast-1.amazonaws.com/eesb.public/images/payment/payments_ipay88.svg" alt="payment_ipay88" loading="lazy" width="85px"> 2979 </li> 2980 2981 <li class="list-payment__item"> 2982 <img src="https://s3.dualstack.ap-southeast-1.amazonaws.com/eesb.public/images/payment/payments_atome.svg" alt="payment_atome" loading="lazy" width="85px"> 2983 </li> 2984 2985 2986 </ul> 2987 </div> 2988 <br> 2989 2990 </div> 2991 2992 2993 2994 <div class="grid__item"> 2995 2996 <h2 class="footer-block__heading"> 2997 We Also Available 2998 </h2> 2999 <ul class="footer-block__details-content list-unstyled"> 3000 3001 <li> 3002 <a href="https://shopee.com.my/suri.official_my" class="link link--text list-menu__item list-menu__item--link"> 3003 Shopee 3004 </a> 3005 </li> 3006 3007 <li> 3008 <a href="https://www.lazada.com.my/shop/noriofficial?spm=a2o4k.searchList.search.2.6012375eRB7KW3" class="link link--text list-menu__item list-menu__item--link"> 3009 Lazada 3010 </a> 3011 </li> 3012 3013 <li> 3014 <a href="https://www.tiktok.com/@suri.official_my?lang=en" class="link link--text list-menu__item list-menu__item--link"> 3015 Tiktok 3016 </a> 3017 </li> 3018 3019 <li> 3020 <a href="https://www.tiktok.com/@nori.fragrance" class="link link--text list-menu__item list-menu__item--link"> 3021 Tiktok : Nori.Fragrance 3022 </a> 3023 </li> 3024 3025 <li> 3026 <a href="https://www.tiktok.com/nori.beauty" target="_blank" class="link link--text list-menu__item list-menu__item--link"> 3027 Tiktok : Nori.Beauty 3028 </a> 3029 </li> 3030 3031 3032 </ul> 3033 3034 </div> 3035 3036 3037 3038 <div class="grid__item"> 3039 3040 <h2 class="footer-block__heading">Our mission</h2> 3041 <div class="footer-block__details-content"> 3042 <p>Nori aims to revolutionize the multi-billion dollar retail industry by empowering celebrities to build iconic brands one product at a time</p> 3043 </div> 3044 3045 </div> 3046 3047 </div> 3048 </div> 3049 <div class="footer__content-bottom">
3050 <div class="footer__content-bottom-wrapper page-width"> 3051 <div class="footer__column footer__column--info"> 3052 3053 3054 3055 3056 3057 <div class="footer__copyright caption"> 3058 <div class="copyright__content">Copyright © 2024 Nori Malaysia Sdn Bhd | Nori Malaysia Sdn Bhd (201101026257 (954393-H))</div> 3059 </div> 3060 3061 <div class="footer__copyright caption"> 3062 3063 <div> 3064 3065 3066 3067 <a href="/legal/privacy-policy">Privacy Policy</a> 3068 3069 3070 3071 3072 | <a href="/legal/refund-policy">Refund Policy</a> 3073 3074 3075 3076 3077 | <a href="/pages/delivery-policy">Delivery Policy</a> 3078 3079 3080 3081 3082 | <a href="/legal/terms-of-service">Terms & Conditions</a> 3083 3084 3085 3086 </div> 3087 3088 </div> 3089 3090 </div> 3091 </div> 3092 </div> 3093</footer> 3094 3095 3096 3097 3098 3099 3100
3100<script> 3101 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) 3102</script>
3102 3103 3104 3105 3106
3106<script> 3107 let page_template = 'customers'; 3108 3109 if(document.querySelector('.currency-picker')) { 3110 EasyStore.Currencies.change(document.querySelector('.currency-picker').value) 3111 EasyStore.Currencies.convertAll() 3112 } 3113 3114 document.querySelectorAll('.currency-picker').forEach((el)=>{ 3115 el.addEventListener('change',(event)=>{ 3116 EasyStore.Currencies.change(event.target.value) 3117 3118 3119 if (page_template == 'cart') { 3120 const params = new URLSearchParams(window.location.search); 3121 params.set('delete_cache', 1); 3122 window.location.search = params; 3123 } else { 3124 window.location.reload(); 3125 } 3126 3127 return 3128 3129 3130 document.querySelectorAll('[name=currencies],[name=current_currency]').forEach((el)=>{ 3131 el.value = event.target.value 3132 }) 3133 3134 if(page_template == 'cart') location.reload(); 3135 }) 3136 }) 3137 </script>
3137 3138 3139 3140 3141 3142
3142<script> 3143 3144 window.variantStrings = { 3145 addToCart: `Add to Cart`, 3146 soldOut: `Sold Out`, 3147 unavailable: `Unavailable`, 3148 } 3149 3150 window.accessibilityStrings = { 3151 shareSuccess: `Link copied to clipboard`, 3152 } 3153 </script>
3153 3154 3155<!-- Snippet:global/body_end: Product Description Tabs --> 3156<style> 3157 .product-description-tabs{ 3158 color: #000000; 3159 } 3160 .prod-desc-tab-container { 3161 padding: 15px; 3162 margin-right: auto; 3163 margin-left: auto; 3164 background-color: #ffffff; 3165 } 3166 /* Style the list */ 3167 .prod-desc-tab { 3168 list-style-type: none; 3169 margin: 0; 3170 padding: 0; 3171 border-bottom: solid 1px #ddd; 3172 /*overflow: hidden; 3173 border: 1px solid #e6e6e6; 3174 background-color: #fefefe; 3175 border-bottom: 1px solid #ddd;*/ 3176 } 3177 3178 /* Float the list items side by side */ 3179 li.tablinks { 3180 display: inline-block; 3181 border-top: 3px solid transparent; 3182 border-left: 1px solid transparent; 3183 border-right: 1px solid transparent; 3184 margin-bottom: -1px; 3185 margin-right: 3px; 3186 border-radius: 4px 4px 0 0; 3187 background-color: rgba(212,212,212,0.3); 3188 } 3189 3190 /* Style the links inside the list items */ 3191 li.tablinks a { 3192 color: #000000; 3193 cursor: default; 3194 margin-right: 2px; 3195 line-height: 1.42857143; 3196 display: block; 3197 padding: 10px 15px; 3198 } 3199 3200 /* Change background color of links on hover */ 3201 li.tablinks:hover { 3202 background-color: #ffffff; 3203 border-bottom-color: transparent; 3204 border-top: 3px solid #ddd; 3205 border-left: 1px solid #ddd; 3206 border-right: 1px solid #ddd; 3207 } /*rgba(212,212,212,0.3)*/ 3208 3209 /* Create an active/current tablink class */ 3210 li.tablinks a:focus, li.tablinks.active{ 3211 border-top: 3px solid #ddd; 3212 border-left: 1px solid #ddd; 3213 border-right: 1px solid #ddd; 3214 background-color: #ffffff; 3215 } 3216 3217 /* Style the tab content */ 3218 .prod-desc-tab-content { 3219 display: none; 3220 padding: 15px 15px; 3221 /*border: 1px solid #ccc;*/ 3222 border-top: none; 3223 clear: both; 3224 -webkit-animation: fadeEffect 1s; 3225 animation: fadeEffect 1s; /* Fading effect takes 1 second */ 3226 } 3227 .prod-desc-tab-content > ul{ 3228 list-style-type: disc; 3229 } 3230 3231 /* if user select is_show_title is true, the title will be displayed; if not, hide the title*/ 3232 .prod-desc-tab-content > h2{ 3233 display:block; 3234 } 3235 3236 @-webkit-keyframes fadeEffect { 3237 from {opacity: 0;} 3238 to {opacity: 1;} 3239 } 3240 3241 @keyframes fadeEffect { 3242 from {opacity: 0;} 3243 to {opacity: 1;} 3244 } 3245 3246 .tab_drawer_heading { display: none; } 3247 3248@media screen and (max-width: 480px) { 3249 .prod-desc-tab { 3250 display: none; 3251 } 3252 3253 3254 .tab_drawer_heading { 3255 background-color: transparent; 3256 color: #000000; 3257 border-bottom: 1px solid #ddd; 3258 margin: 0; 3259 padding: 6px 12px; 3260 display: block; 3261 cursor: default; 3262 -webkit-touch-callout: none; 3263 -webkit-user-select: none; 3264 -khtml-user-select: none; 3265 -moz-user-select: none; 3266 -ms-user-select: none; 3267 user-select: none; 3268 } 3269 .tab_drawer_heading:after { 3270 content: ' + '; 3271 right: 40px; 3272 position: absolute; 3273 } 3274 .d_active { 3275 background-color: rgba(212,212,212,0.3); 3276 } 3277 .d_active.tab_drawer_heading:after{ 3278 content: ' - '; 3279 3280 } 3281} 3282 </style> 3283
3284<script type="text/javascript"> 3285 3286// If the page has no jquery 3287// if(typeof jQuery == 'undefined'){ 3288// console.log(456); 3289// var script = document.createElement('script'); 3290// script.type = "text/javascript"; 3291// script.src = "https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"; 3292// console.log(script); 3293// document.getElementsByTagName('head')[0].appendChild(script); 3294// } 3295 3296 3297 /* if in tab mode */ 3298 $("body").on("click", ".tablinks", function(){ 3299 var id = $(this).data("prod-desc-id"); 3300 3301 // Get all elements with class="prod-desc-tab-content" and hide them 3302 $(".prod-desc-tab-content").hide(); 3303 3304 // Get all elements with class="tablinks" and remove the class "active" 3305 $(".tablinks").removeClass("active"); 3306 3307 // Show the current tab, and add an "active" class to the link that opened the tab 3308 $("#"+id).show(); 3309 $(this).addClass("active"); 3310 3311 //make mobile view(drawer mode) also in same tab 3312 $(".tab_drawer_heading").removeClass("d_active"); 3313 $(".tab_drawer_heading[data-prod-desc-id='"+id+"']").addClass("d_active"); 3314 3315 }); 3316 /* if in drawer mode */ 3317 $("body").on("click", ".tab_drawer_heading", function() { 3318 var id = $(this).data("prod-desc-id"); 3319 3320 $(".prod-desc-tab-content").hide(); 3321 $(".tab_drawer_heading").removeClass("d_active"); 3322 $("#"+id).show(); 3323 3324 $(this).addClass("d_active"); 3325 3326 $(".tablinks").removeClass("active"); 3327 $(".tablinks[data-prod-desc-id='"+id+"']").addClass("active"); 3328 }); 3329 3330 $(function(){ 3331 var x = $(".product-description").find("h1, h2, h3, h4, h5, h6"); 3332 var title = null; 3333 var body = null; 3334 3335 if(x.length > 1){ 3336 $(".product-description").after("<link href='/assets/css/froala_style.min.css' rel='stylesheet' type='text/css'/><div class='product-description-tabs fr-view'><ul class='prod-desc-tab'></ul><div class='prod-desc-tab-container'></div></div>"); 3337 $(x).each(function(k, v){ 3338 title = $(v).text(); 3339 3340 if(k == 0){ 3341 body = $(x[0]).nextUntil(x[1]).clone(); 3342 $(".prod-desc-tab").append('<li class="tablinks active" data-prod-desc-id="'+k+'"><a>'+title+'</a></li>'); 3343 $(".prod-desc-tab-container").append('<h3 class="tab_drawer_heading d_active" data-prod-desc-id="'+k+'">'+title+'</h3><div id="'+k+'" class="prod-desc-tab-content" style="display:block"><h2>'+title+'</h2></div>'); 3344 $("#"+k+" h2").after(body); 3345 } 3346 else if(k == x.length){ 3347 body = $(x[k]).nextAll().clone(); 3348 $(".prod-desc-tab").append('<li class="tablinks" data-prod-desc-id="'+k+'"><a>'+title+'</a></li>'); 3349 $(".prod-desc-tab-container").append('<h3 class="tab_drawer_heading" data-prod-desc-id="'+k+'">'+title+'</h3><div id="'+k+'" class="prod-desc-tab-content" style="display:none"><h2>'+title+'</h2></div>'); 3350 $("#"+k+" h2").after(body); 3351 } 3352 else{ 3353 body = $(x[k]).nextUntil(x[k+1]).clone(); 3354 $(".prod-desc-tab").append('<li class="tablinks" data-prod-desc-id="'+k+'"><a>'+title+'</a></li>'); 3355 $(".prod-desc-tab-container").append('<h3 class="tab_drawer_heading" data-prod-desc-id="'+k+'">'+title+'</h3><div id="'+k+'" class="prod-desc-tab-content" style="display:none"><h2>'+title+'</h2></div>'); 3356 $("#"+k+" h2").after(body); 3357 } 3358 }); 3359 $(".product-description").hide(); 3360 } 3361 3362 }); 3363</script>
3363 3364<!-- /Snippet --> 3365 3366<!-- Snippet:global/body_end: Mailchimp E-Commerce -->
3367<script id="mcjs">!function(c,h,i,m,p){m=c.createElement(h),p=c.getElementsByTagName(h)[0],m.async=1,m.src=i,p.parentNode.insertBefore(m,p)}(document,"script","https://chimpstatic.com/mcjs-connected/js/users/6db777a9ed8a20cdf3b457723/fc072f0ebecff5b09d0928c84.js");</script>
3367 3368<!-- /Snippet -->
3369<script> 3370 3371 /* 3372 3373 ------ 3374 Events 3375 ------ 3376 3377 pages/viewed 3378 3379 customers/signup 3380 3381 customers/login 3382 3383 products/searched 3384 3385 collections/viewed 3386 3387 products/viewed 3388 3389 products/shared 3390 3391 wishlists/item_added 3392 3393 carts/items_added 3394 3395 carts/viewed 3396 3397 carts/item_removed 3398 3399 checkouts/initiated 3400 3401 checkouts/shipping_info_added 3402 3403 checkouts/payment_info_added 3404 3405 checkouts/completed 3406 3407 orders/placed 3408 3409 orders/purchased 3410 3411 payments/captured 3412 3413 payments/failed 3414 3415 */ 3416 3417 window.__latest_cart = window.__latest_cart || null; 3418 3419 const _selector = document.querySelector.bind(document), 3420 _selectorAll = document.querySelectorAll.bind(document) 3421 3422 document.addEventListener('DOMContentLoaded', (event) => { 3423 3424 const default_currency = getCookie("currency") 3425 const customer_id = window.__st.cid 3426 const template = window.__st.p 3427 3428 onPageView() 3429 3430 //-----------------------// 3431 // Configs // 3432 //-----------------------// 3433 3434 window.dataLayer = window.dataLayer || [] 3435 3436 Array.prototype.last = Array.prototype.last || function() { 3437 return this[this.length - 1] || null 3438 } 3439 3440 Array.prototype.first = Array.prototype.first || function() { 3441 return this[0] || null 3442 } 3443 3444 //----------------------// 3445 // Triggers // 3446 //----------------------// 3447 3448 const XHR = window.XMLHttpRequest 3449 3450 function xhr() { 3451 3452 const xhr = new XHR() 3453 3454 xhr.addEventListener("readystatechange", function() { 3455 3456 if(xhr.readyState != 4) return 3457 3458 try { 3459 3460 const response_url = xhr.responseURL 3461 3462 if (response_url.includes("cart/add")) { 3463 3464 window.__latest_cart = JSON.parse(xhr.response) 3465 3466 onCartItemsAdded() // ok 3467 3468 } 3469 3470 if (response_url.includes("cart/remove_item_quantity")) { 3471 3472 window.__latest_cart = JSON.parse(xhr.response) 3473 3474 onCartItemRemoved() // ok 3475 3476 } 3477 3478 if (response_url.includes("new_cart?retrieve=true")) { 3479 3480 result = JSON.parse(xhr.response) 3481 3482 if (result.cart) { 3483 window.__latest_cart = result.cart 3484 } 3485 3486 } 3487 3488 } catch(e) { 3489 3490 console.error(e) 3491 3492 } 3493 3494 }, false); 3495 3496 return xhr 3497 3498 } 3499 3500 window.XMLHttpRequest = xhr 3501 3502 switch(template) { 3503 3504 case 'cart': onCartView() // ok 3505 break 3506 case 'product': onProductView() // ok 3507 break 3508 case 'collection': onCollectionView() // ok 3509 break 3510 case 'blog': onBlogView() 3511 break 3512 case 'article': onArticleView() 3513 break 3514 case 'payment_completed': onOrderPlace() 3515 break 3516 case 'payment_fail': onPaymentFail() 3517 break 3518 3519 } 3520 3521 // _selector('form[action="/checkout/payments"]').addEventListener("submit", onPaymentInfoAdded(_selector('form[action="/checkout/payments"]'))) 3522 if (_selector('form[action="/checkout/detail"]')) _selector('form[action="/checkout/detail"]').addEventListener("submit", ()=>{onShippingInfoAdded(_selector('form[action="/checkout/detail"]'))}) // ok 3523 if (_selector('form[action="/checkout/shipping"]')) _selector('form[action="/checkout/shipping"]').addEventListener("submit", ()=>{onShippingInfoAdded(_selector('form[action="/checkout/shipping"]'))}) // ok 3524 if (_selector('form[action="/account/register"]')) _selector('form[action="/account/register"]').addEventListener("submit", onSignUp) // ok 3525 if (_selector('form[action="/account/login"]')) _selector('form[action="/account/login"]').addEventListener("submit", onLogin) // ok 3526 if (_selector('form[action="/search"]')) _selector('form[action="/search"]').addEventListener("submit", onProductSearch()) // ok 3527 if (_selector('#line-login-btn')) _selector('#line-login-btn').addEventListener('click', onLineLogin) // ok 3528 if (_selector('#PlaceOrder')) _selector('#PlaceOrder').addEventListener("click", ()=>{onCheckoutComplete(_selector('form[action="/checkout/payments"]'))}); // ok 3529 if (_selector('#add_wishlist')) _selector('#add_wishlist').addEventListener("click", onWishlistItemAdded) // ok 3530 if (_selectorAll('a[href="/account/logout"]')) _selectorAll('a[href="/account/logout"]').forEach(logoutButton => logoutButton.addEventListener("click", onLogout)) // ok 3531 if (_selector('.CartDrawerTrigger.cart-page-link')) _selector('.CartDrawerTrigger.cart-page-link').addEventListener("click", onCartView) // ok 3532 if (_selector('.CartDrawerTrigger.cart-page-link.mobile-cart-page-link')) _selector('.CartDrawerTrigger.cart-page-link.mobile-cart-page-link').addEventListener("click", onCartView) // ok 3533 if (_selectorAll('a[class^="share-"]')) _selectorAll('a[class^="share-"]').forEach(shareButton => shareButton.addEventListener("click", ()=>{onProductShare(shareButton)}) ) // ok 3534 if (_selectorAll('[name$="checkout"]')) _selectorAll('[name$="checkout"]').forEach(checkoutButton => checkoutButton.addEventListener("click", onCheckoutInitiate)) 3535 3536 // For append elements 3537 const bodyMutationObserver = new MutationObserver(() => { 3538 if (_selector('#form__spc #PlaceOrder')) _selector('#form__spc #PlaceOrder').addEventListener("click", onSinglePageCheckout) // ok 3539 if (_selectorAll('[name$="checkout"]')) _selectorAll('[name$="checkout"]').forEach(checkoutButton => checkoutButton.addEventListener("click", onCheckoutInitiate)) 3540 }); 3541 bodyMutationObserver.observe(_selector("body"), {subtree: true, childList: true}); 3542 3543 //------------------------------// 3544 // Event handlers // 3545 //------------------------------// 3546 3547 function onPageView() { 3548 3549 EasyStore.Event.dispatch('pages/viewed', { 3550 page: { 3551 type: template, 3552 title: document.title, 3553 description: _selector('meta[name=description]') ? _selector('meta[name=description]').getAttribute('content') : null, 3554 url: location.href, 3555 } 3556 }) 3557 3558 } 3559 3560 function onSignUp() { 3561 3562 const email_regex = new RegExp(/^[a-zA-Z0-9.!#$%&"*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/) 3563 const phone_regex = new RegExp(/^(\+?6?01)[0-46-9]-*[0-9]{7,8}$/) 3564 3565 const email_or_phone = _selector(`input[name="customer[email_or_phone]"]`).value.replace("+", "").replace(/\s+/, "") 3566 3567 let data = {} 3568 3569 if (email_regex.test(email_or_phone)) { 3570 data.method = 'email' 3571 data.email = email_or_phone 3572 } 3573 3574 if (phone_regex.test(email_or_phone)) { 3575 data.method = "phone" 3576 data.phone = email_or_phone 3577 } 3578 3579 if (!data.method) return 3580 3581 EasyStore.Event.dispatch('customers/signup', data) 3582 3583 } 3584 3585 function onLogin() { 3586 3587 const email_regex = new RegExp(/^[a-zA-Z0-9.!#$%&"*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/) 3588 const phone_regex = new RegExp(/^(\+?6?01)[0-46-9]-*[0-9]{7,8}$/) 3589 3590 const email_or_phone = _selector(`input[name="customer[email_or_phone]"]`).value.replace("+", "").replace(/\s+/, "") 3591 3592 let data = {} 3593 3594 if (email_regex.test(email_or_phone)) { 3595 data.method = 'email' 3596 data.email = email_or_phone 3597 } 3598 3599 if (phone_regex.test(email_or_phone)) { 3600 data.method = "phone" 3601 data.phone = email_or_phone 3602 } 3603 3604 if (!data.method) return 3605 3606 EasyStore.Event.dispatch('customers/login', data) 3607 3608 } 3609 3610 function onLineLogin() { 3611 3612 EasyStore.Event.dispatch('customers/login', { method: 'line' }) 3613 3614 } 3615 3616 function onLogout() { 3617 3618 EasyStore.Event.dispatch('customers/logout', { customer_id }) 3619 3620 } 3621 3622 function onBlogView() { 3623 3624 const blog = "" 3625 3626 EasyStore.Event.dispatch('blogs/viewed', { blog }) 3627 3628 } 3629 3630 function onArticleView() { 3631 3632 const article = "" 3633 3634 EasyStore.Event.dispatch('articles/viewed', { article }) 3635 3636 } 3637 3638 function onProductSearch() { 3639 3640 const query = _selector('input[name=q]').value 3641 3642 if (!query) return 3643 3644 EasyStore.Event.dispatch('products/searched', { query }) 3645 3646 } 3647 3648 function onCollectionView() { 3649 3650 const collection = "" 3651 3652 EasyStore.Event.dispatch('collections/viewed', { collection }) 3653 3654 } 3655 3656 function onProductView() { 3657 3658 const product = "" 3659 3660 EasyStore.Event.dispatch("products/viewed", { product }) 3661 3662 } 3663 3664 function onProductShare(el) { 3665 3666 const product = "" 3667 3668 const channel = el.getAttribute("class").split("-").last() 3669 3670 EasyStore.Event.dispatch('products/shared', { product, channel }) 3671 3672 } 3673 3674 function onWishlistItemAdded() { 3675 3676 let product = "" 3677 const quantity = _selector("#Quantity").value 3678 3679 EasyStore.Event.dispatch('wishlists/item_added', { product }) 3680 3681 } 3682 3683 async function onCartItemsAdded() { 3684 3685 const cart = await getCart() 3686 3687 if(cart && cart.items != undefined && cart.items.length > 0) { 3688 3689 EasyStore.Event.dispatch('carts/item_added', { cart }) 3690 3691 } 3692 3693 } 3694 3695 async function onCartView() { 3696 3697 const cart = await getCart() 3698 3699 EasyStore.Event.dispatch('carts/viewed', { cart }) 3700 3701 } 3702 3703 async function onCartItemRemoved() { 3704 3705 const cart = await getCart() 3706 3707 cart.items = [] 3708 3709 if(cart) { 3710 3711 EasyStore.Event.dispatch('carts/item_removed', { cart }) 3712 3713 } 3714 3715 } 3716 3717 async function onCheckoutInitiate() { 3718 3719 const cart = await getCart() 3720 3721 EasyStore.Event.dispatch('checkouts/initiated', { cart }) 3722 3723 } 3724 3725 async function onShippingInfoAdded(form) { 3726 let checkout = getCheckout() 3727 3728 let form_data = {} 3729 new FormData(form).forEach((value, key) => form_data[key] = value) 3730 3731 let shipping_tier = null 3732 3733 if (form_data.type && form_data.type.startsWith("r_pickup")) { 3734 shipping_tier = `Pickup - ${form_data.pick_location}` 3735 } 3736 3737 if (form_data.s_id) {
3738 shipping_tier = _selector(`input[id='`+form_data.s_id+`']`).getAttribute("data-shipping-name") 3739 } 3740 3741 if (!shipping_tier) return 3742 3743 EasyStore.Event.dispatch('checkouts/shipping_info_added', { checkout, shipping_tier }) 3744 3745 } 3746 3747 async function onPaymentInfoAdded(form) { 3748 3749 let checkout = getCheckout() 3750 3751 let payment_type = new FormData(form).get('payment_method') 3752 3753 EasyStore.Event.dispatch("checkouts/payment_info_added", { checkout, payment_type }) 3754 3755 } 3756 3757 async function onOrderPlace() { 3758 3759 let cart_token = getCookie("cart_js") 3760 let previous_cart_token = getCookie("previous_cart_ga4_js") 3761 3762 if (previous_cart_token && previous_cart_token == cart_token) { 3763 // Prevent duplicate purchase tracking 3764 return 3765 } 3766 3767 let order = getOrder() 3768 3769 EasyStore.Event.dispatch('orders/placed', { order }) 3770 3771 if(order.is_manual_payment) { 3772 3773 EasyStore.Event.dispatch('orders/purchased', { order }) 3774 3775 } 3776 3777 const last_transaction = order.transactions.last() 3778 3779 if (last_transaction.status) { 3780 3781 EasyStore.Event.dispatch('orders/purchased', { order }) 3782 EasyStore.Event.dispatch('payments/captured', { order }) 3783 3784 } 3785 3786 } 3787 3788 async function onPaymentFail() { 3789 3790 const order = getOrder() 3791 3792 EasyStore.Event.dispatch('payments/failed', { order }) 3793 3794 } 3795 3796 async function onCheckoutComplete(form) { 3797 3798 onPaymentInfoAdded(form) 3799 3800 const checkout = getCheckout() 3801 3802 EasyStore.Event.dispatch('checkouts/completed', { checkout }) 3803 3804 } 3805 3806 async function onSinglePageCheckout() { 3807 3808 // let checkout = $("[data-app-checkout]").data("app-checkout") 3809 3810 let checkout = getCheckout() 3811 3812 // const payment_type = _selector("#app_spc_payment_method").find(`[class*="label-content"]`).first().find("b").first().text() 3813 const payment_type = _selector("#app_spc_payment_method").getElementsByClassName('label-content')[0].getElementsByTagName('b')[0].innerHTML 3814 3815 const shipping_method = _selector("#delivery_method").value 3816 3817 let shipping_tier = null 3818 let app_spc_customer_info_label = _selector("#app_spc_customer_info").getElementsByClassName('label-content') 3819 if (shipping_method == "shipping") { 3820 shipping_tier = app_spc_customer_info_label[app_spc_customer_info_label.length - 1].getElementsByTagName('b')[0].innerHTML 3821 } 3822 3823 if (shipping_method == "pickup") { 3824 shipping_tier = app_spc_customer_info_label[0].innerHTML 3825 } 3826 3827 if (shipping_tier) { 3828 3829 EasyStore.Event.dispatch('checkouts/shipping_info_added', { 3830 checkout, 3831 shipping_tier, 3832 }) 3833 3834 } 3835 3836 if (payment_type) { 3837 3838 EasyStore.Event.dispatch('checkouts/payment_info_added', { 3839 checkout, 3840 payment_type, 3841 }) 3842 3843 } 3844 3845 EasyStore.Event.dispatch('checkouts/completed', { checkout }) 3846 3847 } 3848 3849 }) 3850 3851 3852 //-----------------------// 3853 // Functions // 3854 //-----------------------// 3855 3856 function getCookie(name) { 3857 3858 name += "=" 3859 3860 decodedCookie = decodeURIComponent(document.cookie) 3861 3862 ca = decodedCookie.split(";") 3863 3864 for(i = 0; i < ca.length; i++) { 3865 c = ca[i] 3866 while (c.charAt(0) == " ") { 3867 c = c.substring(1) 3868 } 3869 if (c.indexOf(name) == 0) { 3870 return c.substring(name.length, c.length) 3871 } 3872 } 3873 3874 return "" 3875 3876 } 3877 3878 const parsePrice = price => { 3879 if(typeof price === 'string') { 3880 return parseFloat(price.split(',').join('')) 3881 } 3882 3883 return price 3884 } 3885 3886 const requestCart = async (method, data) => { 3887 3888 let response = await fetch('/cart.json', {method: 'GET',headers: {'Content-Type': 'application/json'}}) 3889 result = await response.json() 3890 3891 return result.cart 3892 3893 } 3894 const getCart = async (latest = false) => { 3895 3896 let cart = window.__latest_cart 3897 3898 const cart_invalid = !cart || !cart.items || (cart.total_price > 0 && !cart.items.length) 3899 3900 if(latest || cart_invalid) { 3901 cart = await requestCart() 3902 } 3903 3904 cart.items = cart.items || [] 3905 3906 return mapCart(cart) 3907 3908 } 3909 3910 const getCheckout = async () => { 3911 mapCheckout(window.__latest_cart || await requestCart()) 3912 } 3913 3914 const getOrder = async () => { 3915 mapOrder(window.__latest_cart || await requestCart()) 3916 } 3917 3918 //-----------------------// 3919 // Mappers // 3920 //-----------------------// 3921 3922 const fallbackAttribute = (object, attribute) => { 3923 3924 if(!Array.isArray(attribute)) { 3925 attribute = [attribute] 3926 } 3927 3928 let final_value = null 3929 3930 do { 3931 3932 final_value = object[attribute.shift()] 3933 3934 } while(!final_value && attribute.length) 3935 3936 return final_value 3937 3938 } 3939 3940 const map = (object, mapper) => { 3941 3942 const newObject = {} 3943 3944 for(const key in mapper) { 3945 3946 // Handle different keys between new and old format
3947 newObject[key] = fallbackAttribute(object, mapper[key]) 3948 3949 // Cast price to float 3950 if(newObject[key] && ['price', 'amount', 'discount', 'discounts'].some(x => key.endsWith(x))) { 3951 newObject[key] = parsePrice(newObject[key]) 3952 } 3953 3954 if(newObject[key] === undefined) { 3955 delete newObject[key] 3956 } 3957 3958 } 3959 3960 return newObject 3961 3962 } 3963 3964 const mapCart = cart => { 3965 3966 const oldCart = cart 3967 3968 const mapper = { 3969 id: 'id', 3970 currency: 'currency', 3971 item_count: 'item_count', 3972 items: 'items', 3973 total_price: 'total_price', 3974 latest_items: 'latest_items' 3975 } 3976 3977 cart = map(cart, mapper) 3978 3979 const discounts = (oldCart.storewide_discounts || []).concat((oldCart.voucher_discounts || [])) 3980 3981 cart.discount_applications = discounts.map(discount => ({ 3982 title: discount.voucher_code || null, 3983 value: parsePrice(discount.amount), 3984 })) 3985 3986 cart.original_total_price = cart.items.length 3987 ? cart.items 3988 .map(item => item.original_price) 3989 .reduce((sum, price) => sum + price) 3990 : 0 3991 3992 cart.total_discount = cart.discount_applications.length 3993 ? cart.discount_applications 3994 .map(discount => parsePrice(discount.value)) 3995 .reduce((sum, value) => sum + value) 3996 : 0 3997 3998 cart.items = cart.items.map(item => mapLineItem(item)) 3999 4000 return cart 4001 4002 } 4003 4004 const mapCheckout = checkout => { 4005 4006 const mapper = { 4007 note: 'note', 4008 attributes: 'note_attributes', 4009 billing_address: 'billing_address', 4010 currency: 'currency', 4011 customer_id: 'customer_id', 4012 discounts_amount: 'total_discount', 4013 id: 'id', 4014 line_items: 'order_item', 4015 order_number: 'order_number', 4016 shipping_address: 'shipping_address', 4017 shipping_price: 'shipping_tax', 4018 shipping_method: 'shipping_method_name', 4019 tax_price: 'total_tax', 4020 } 4021 4022 checkout = map(checkout, mapper) 4023 4024 checkout.requires_shipping = checkout.line_items.some(item => item.shipping_required) 4025 4026 checkout.line_items = checkout.line_items.map(item => mapLineItem(item)) 4027 4028 return checkout 4029 4030 } 4031 4032 const mapOrder = order => { 4033 4034 const mapper = { 4035 attributes: 'note_attributes', 4036 billing_address: 'billing_address', 4037 cancelled: 'is_cancelled', 4038 cancelled_at: 'cancelled_at', 4039 created_at: 'created_at', 4040 customer_id: 'customer_id', 4041 // discount_applications: 'discount_applications', 4042 email: 'email', 4043 financial_status: 'financial_status', 4044 fulfillment_status: 'fulfillment_status', 4045 line_items: 'order_item', 4046 note: 'note', 4047 order_number: 'order_number', 4048 phone: 'phone', 4049 shipping_address: 'shipping_address', 4050 shipping_methods: 'shipping_methods', 4051 shipping_price: 'total_shipping', 4052 subtotal_price: 'subtotal_price', 4053 // tax_lines: 'tax_lines', 4054 tax_price: 'total_tax', 4055 total_discounts: 'total_discount', 4056 total_net_amount: 'total_amount_include_transaction', 4057 total_price: 'total_price', 4058 transactions: 'transaction_records', 4059 is_manual_payment: 'is_manual_payment', 4060 } 4061 4062 order.email = order.billing_address.email 4063 order.phone = order.billing_address.phone 4064 order.shipping_method = order.shipping_method_name 4065 4066 order = map(order, mapper) 4067 4068 order.line_items = order.line_items.map(item => mapLineItem(item)) 4069 order.transactions = order.transactions.map(transaction => mapTransaction(transaction)) 4070 4071 return order 4072 4073 } 4074 4075 const mapLineItem = line_item => { 4076 4077 const old_line_item = line_item 4078 4079 const mapper = { 4080 final_price: 'price', 4081 image: 'img_url', 4082 message: 'message', 4083 original_line_price: 'original_line_price', 4084 original_price: 'original_price', 4085 properties: 'properties', 4086 quantity: 'quantity', 4087 requires_shipping: 'shipping_required', 4088 sku: 'sku', 4089 taxable: 'taxable', 4090 title: 'product_name', 4091 product_name: 'product_name', 4092 url: 'url', 4093 product_id: 'product_id', 4094 variant_id: 'variant_id', 4095 id: ['id', 'i_id'], 4096 } 4097 4098 line_item = map(line_item, mapper) 4099 4100 line_item.product_id = line_item.product_id || (old_line_item.product && old_line_item.product.id) || null 4101 line_item.variant_id = line_item.variant_id || (old_line_item.variant && old_line_item.variant.id) || null 4102 line_item.image = line_item.image || (old_line_item.image && old_line_item.image.url) || null 4103 4104 return line_item 4105 4106 } 4107 4108 const mapTransaction = transaction => { 4109 4110 const mapper = { 4111 amount: 'amount', 4112 created_at: 'created_at', 4113 gateway: 'gateway_type', 4114 id: 'id', 4115 status: 'status', 4116 } 4117 4118 transaction = map(transaction, mapper) 4119 4120 return transaction 4121 4122 } 4123 4124 4125</script>
4125 4126 4127</body> 4128</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.