PageSourceSearch

https://madamyongdelight.com/store-locator

html madamyongdelight.com collected 2026-09-27 12:30:41 UTC 104,747 bytes, 3,064 lines download raw bytes

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<meta name="google-site-verification" content="pfFMKhIbbm-wNV7diEok9cPU24PhZqPMYTZRkwVlbVo" />
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/360437/f/4829761.png" />
15  
16
17  <!-- Title and description ================================================== -->
18  <title>
19  Store Locator &ndash; Madam Yong Delight | Nyonya Kuih | Est. 1985
20  </title>
21
22  
23  <meta name="description" content="Store Locator">
24  
25
26  <!-- Social meta ================================================== -->
27  
28
29  <meta property="og:type" content="website">
30  <meta property="og:title" content="Store Locator">
31  <meta property="og:url" content="https://madamyongdelight.com/store-locator">
32  
33  <meta property="og:image" content="https://cdn.store-assets.com/s/360437/f/4829734.png?width=350&format=webp">
34  <meta property="og:image:secure_url" content="https://cdn.store-assets.com/s/360437/f/4829734.png?width=350&format=webp">
35  
36
37
38<meta property="og:description" content="Store Locator">
39<meta property="og:site_name" content="Madam Yong Delight | Nyonya Kuih | Est. 1985">
40
41
42
43  <meta name="twitter:card" content="summary">
44
45
46
47
48
49
50
51  <!-- Helpers ================================================== -->
52  <link rel="canonical" href="https://madamyongdelight.com/store-locator">
53  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=3.0">
54  <meta name="theme-color" content="">
55
56  <!-- CSS ================================================== -->
57  <link href="https://store-themes.easystore.co/360437/themes/3809/assets/timber.css?t=1787076042" rel="stylesheet" type="text/css" media="screen" />
58  <link href="https://store-themes.easystore.co/360437/themes/3809/assets/theme.css?t=1787076042" rel="stylesheet" type="text/css" media="screen" />
59
60  
61
62
63
64<link href="https://fonts.googleapis.com/css?family=Karla:400,700&display=swap" rel="stylesheet">
65
66
67  
67<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js" type="text/javascript" ></script>
67
68  <!-- Header hook for plugins ================================================== -->
69  
70<!-- ScriptTags -->
71<script>window.__st={p: "store-locator",cid: null,cem: null,cph: null,cfn: null,cln: null,cge: null,cdb: null,ccc: null};</script>
71<script src='/assets/events.js'></script>
71<script>(function(){function asyncLoad(){var urls=['/assets/facebook-pixel.js?v=1.2.1623053527','/assets/traffic.js?v=1'];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>
71
72<!-- /ScriptTags -->
73
74
75  
76<!--[if lt IE 9]>
77<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js" type="text/javascript" ></script>
vendor: 2 bytes, line 77
77
78<script src="https://store-themes.easystore.co/360437/themes/3809/assets/respond.min.js?t=1787076042" type="text/javascript" ></script>
78
79<link href="https://store-themes.easystore.co/360437/themes/3809/assets/respond-proxy.html" id="respond-proxy" rel="respond-proxy" />
80<link href="//madamyongdelight.com/search?q=b15159c3c4ee0e884d2174cc6f8e0417" id="respond-redirect" rel="respond-redirect" />
81<script src="//madamyongdelight.com/search?q=b15159c3c4ee0e884d2174cc6f8e0417" type="text/javascript"></script>
81
82<![endif]-->
83
84
85
86  
86<script src="https://store-themes.easystore.co/360437/themes/3809/assets/modernizr.min.js?t=1787076042" type="text/javascript" ></script>
86
87
88  
89  
90  
90<script>
91  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
92  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
93  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
94  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
95
96  ga('create', '', 'auto','myTracker');
97  ga('myTracker.send', 'pageview');
98
99  </script>
99
100  
101<!-- Snippet:global/head: Google Search Console -->
102<meta name="google-site-verification" content="abc123">
103<!-- /Snippet -->
104
105</head>
106
107<body id="store-locator" class="template-store-locator  " >
108
109  <ul id="MobileNav" class="mobile-nav">
110  
111  <li class="mobile-nav_icon-x">
112    
113      
114
115
116
117
118  	
119  	<span class="MobileNavTrigger icon icon-x"></span>
120  </li>
121  
122  <li class="mobile-nav__link header-bar__search-wrapper">
123    
124    <div class="header-bar__module header-bar__search mobile-nav_search">
125      
126  <form action="/search" method="get" class="header-bar__search-form clearfix" role="search">
127    
128    <button type="submit" class="btn icon-fallback-text header-bar__search-submit">
129      <span class="icon icon-search" aria-hidden="true"></span>
130      <span class="fallback-text">Search</span>
131    </button>
132    <input type="search" name="q" value="" aria-label="Search" class="header-bar__search-input" placeholder="Search" autocomplete="off">
133    <div class="dropdown" id="searchDropdown"></div>
134    <input type="hidden" name="search_history" id="search_history">
135  </form>
136
137
138
139
140<script>
141  var _search_history_listings = ""
142  if(_search_history_listings != "") localStorage.setItem('searchHistory', JSON.stringify(_search_history_listings));
143
144  function clearAll() {
145    localStorage.removeItem('searchHistory');
146  
147    var customer = "";
148    if(customer) {
149      // Your logic to clear all data or call an endpoint
150      fetch('/account/search_histories', {
151          method: 'DELETE',
152          headers: {
153            "Content-Type": "application/json",
154            "X-Requested-With": "XMLHttpRequest"
155          },
156          body: JSON.stringify({
157            _token: "FkJtfIYyPq1JdSUYJuIOBhtzw7jHetJ5UamtdR4M"
158          }),
159      })
160      .then(response => response.json())
161    }
162  }
163  // End - store view history in local storage
164  
165  // search history dropdown  
166  var searchInputs = document.querySelectorAll('input[type=search]');
167  
168  if(searchInputs.length > 0) {
169    
170    searchInputs.forEach((searchInput)=>{
171    
172      searchInput.addEventListener('focus', function() {
173        var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown');
174        searchDropdown.innerHTML = ''; // Clear existing items
175  
176        // retrieve data from local storage
177        var searchHistoryData = JSON.parse(localStorage.getItem('searchHistory')) || [];
178  
179        // Convert JSON to string
180        var search_history_json = JSON.stringify(searchHistoryData);
181  
182        // Set the value of the hidden input
183        searchInput.closest('form').querySelector("#search_history").value = search_history_json;
184  
185        // create dropdown items
186        var clearAllItem = document.createElement('div');
187        clearAllItem.className = 'dropdown-item clear-all';
188        clearAllItem.textContent = 'Clear';
189        clearAllItem.addEventListener('click', function() {
190            clearAll();
191            searchDropdown.style.display = 'none';
192            searchInput.classList.remove('is-focus');
193        });
194        searchDropdown.appendChild(clearAllItem);
195  
196        // create dropdown items
197        searchHistoryData.forEach(function(item) {
198          var dropdownItem = document.createElement('div');
199          dropdownItem.className = 'dropdown-item';
200          dropdownItem.textContent = item.term;
201          dropdownItem.addEventListener('click', function() {
202            searchInput.value = item.term;
203            searchDropdown.style.display = 'none';
204          });
205          searchDropdown.appendChild(dropdownItem);
206        });
207  
208        if(searchHistoryData.length > 0){
209          // display the dropdown
210          searchInput.classList.add('is-focus');
211          document.body.classList.add('search-input-focus');
212          searchDropdown.style.display = 'block';
213        }
214      });
215  
216      searchInput.addEventListener("focusout", (event) => {
217        var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown');
218        searchInput.classList.remove('is-focus');
219        searchDropdown.classList.add('transparent');
220        setTimeout(()=>{
221          searchDropdown.style.display = 'none';
222          searchDropdown.classList.remove('transparent');
223          document.body.classList.remove('search-input-focus');
224        }, 400);
225      });
226    })
227  }
228  // End - search history dropdown
229</script>
229
230    </div>
231    
232  </li>
233  
234  
235  
236  <li class="mobile-nav__link" aria-haspopup="true">
237    
238    <a href="/" >
239      Home
240    </a>
241    
242  </li>
243  
244  
245  <li class="mobile-nav__link" aria-haspopup="true">
246    
247    
248    <a href="/collections/all" class="mobile-nav__parent-link">
249      Products
250    </a>
251    <span class="mobile-nav__sublist-trigger">
252      <span class="icon-fallback-text mobile-nav__sublist-expand">
253  <span class="icon icon-plus" aria-hidden="true"></span>
254  <span class="fallback-text">+</span>
255</span>
256<span class="icon-fallback-text mobile-nav__sublist-contract">
257  <span class="icon icon-minus" aria-hidden="true"></span>
258  <span class="fallback-text">-</span>
259</span>
260
261    </span>
262    <ul class="mobile-nav__sublist">
263      
264      
265      <li class="mobile-nav__sublist-link" aria-haspopup="true">
266        
267        <a href="/collections/top-picks" >
268          Top Picks
269        </a>
270        
271      </li>
272      
273      
274      <li class="mobile-nav__sublist-link" aria-haspopup="true">
275        
276        <a href="/collections/sweets" >
277          Sweets
278        </a>
279        
280      </li>
281      
282      
283      <li class="mobile-nav__sublist-link" aria-haspopup="true">
284        
285        <a href="/collections/savouries" >
286          Savouries
287        </a>
288        
289      </li>
290      
291      
292      <li class="mobile-nav__sublist-link" aria-haspopup="true">
293        
294        <a href="/collections/vegetarian-vegan" >
295          Vegan
296        </a>
297        
298      </li>
299      
300      
301      <li class="mobile-nav__sublist-link" aria-haspopup="true">
302        
303        <a href="/collections/gift-sets" >
304          Gift Sets
305        </a>
306        
307      </li>
308      
309      
310      <li class="mobile-nav__sublist-link" aria-haspopup="true">
311        
312        <a href="/collections/cny-specials" >
313          CNY Specials
314        </a>
315        
316      </li>
317      
318      
319      <li class="mobile-nav__sublist-link" aria-haspopup="true">
320        
321        <a href="/collections/packaging" >
322          Packaging & Add-Ons
323        </a>
324        
325      </li>
326      
327    </ul>
328    
329  </li>
330  
331  
332  <li class="mobile-nav__link" aria-haspopup="true">
333    
334    <a href="https://www.madamyongdelight.com/collections/gift-sets" >
335      Gift Sets
336    </a>
337    
338  </li>
339  
340  
341  <li class="mobile-nav__link" aria-haspopup="true">
342    
343    <a href="/collections/packaging" >
344      Packaging & Add-Ons
345    </a>
346    
347  </li>
348  
349  
350  <li class="mobile-nav__link" aria-haspopup="true">
351    
352    <a href="/apps/contact-form-plus" >
353      Wholesale
354    </a>
355    
356  </li>
357  
358  
359  <li class="mobile-nav__link" aria-haspopup="true">
360    
361    <a href="/pages/media-feature" >
362      Media / Feature
363    </a>
364    
365  </li>
366  
367  
368  <li class="mobile-nav__link" aria-haspopup="true">
369    
370    <a href="/pages/join-our-team" >
371      Join Our Team!
372    </a>
373    
374  </li>
375  
376  
377  <li class="mobile-nav__link" aria-haspopup="true">
378    
379    <a href="/pages/faq" >
380      FAQ
381    </a>
382    
383  </li>
384  
385  
386  <li class="mobile-nav__link" aria-haspopup="true">
387    
388    <a href="/pages/contact-us" >
389      Contact Us
390    </a>
391    
392  </li>
393  
394
395  
396
397  
398  
399  
400  <li class="mobile-nav__link">
401    <a href="/account/login">Log in</a>
402  </li>
403  
404  <li class="mobile-nav__link">
405    <a href="/account/register">Create account</a>
406  </li>
407  
408  
409  
410  
411</ul>
412<div id="MobileNavOutside" class="mobile-nav-outside"></div>
413
414
415<div id="PageContainer" class="page-container">
416  
417<!-- Snippet:global/body_start: Console Extension -->
418<div id='es_console' style='display: none;'>360437</div>
419<!-- /Snippet -->
420
421  
422    <style>
423  .search-modal__form{
424    position: relative;
425  }
426  
427  .dropdown-wrapper {
428    position: relative;
429  }
430  
431  .dropdown-wrapper:hover .dropdown {
432    display: block;
433  }
434  
435  .header-icon-nav .dropdown {
436    left: -80px;
437  }
438  
439  .dropdown {
440    display: none;
441    position: absolute;
442    top: 100%;
443    left: 0px;
444    width: 100%;
445    padding: 8px;
446    background-color: #fff;
447    z-index: 1000;
448    border-radius: 5px;
449    border: 1px solid rgba(var(--color-foreground), 1);
450    border-top: none;
451    overflow-x: hidden;
452    overflow-y: auto;
453    max-height: 350px;
454    min-width: 150px;
455    box-shadow: 0 0 5px rgba(0,0,0,0.1);
456  }
457    
458  .dropdown a{
459    text-decoration: none;
460    color: #000 !important;
461  }
462  
463  .dropdown-item {
464    padding: 0.4rem 2rem;
465    cursor: pointer;
466    line-height: 1.4;
467    overflow: hidden;
468    text-overflow: ellipsis;
469    white-space: nowrap;
470  }
471  
472  .dropdown-item:hover{
473    background-color: #f3f3f3;
474  }
475  
476  .search__input.is-focus{
477    border-radius: 15px;
478    border-bottom-left-radius: 0;
479    border-bottom-right-radius: 0;
480    border: 1px solid rgba(var(--color-foreground), 1);
481    border-bottom: none;
482    box-shadow: none;
483  }
484  
485  .clear-all {
486    text-align: right;
487    padding: 0 2rem 0.2rem;
488    line-height: 1;
489    font-size: 70%;
490    margin-bottom: -2px;
491  }
492  
493  .clear-all:hover{
494    background-color: #fff;
495  }
496  
497  .referral-notification {
498    position: absolute;
499    top: 100%;
500    right: -12px;
501    background: white;
502    border: 1px solid #e0e0e0;
503    border-radius: 8px;
504    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
505    width: 280px;
506    z-index: 1000;
507    padding: 16px;
508    margin-top: 8px;
509    font-size: 14px;
510    line-height: 1.4;
511  }
512  
513  .referral-notification::before {
514    content: '';
515    position: absolute;
516    top: -8px;
517    right: 20px;
518    width: 0;
519    height: 0;
520    border-left: 8px solid transparent;
521    border-right: 8px solid transparent;
522    border-bottom: 8px solid white;
523  }
524  
525  .referral-notification::after {
526    content: '';
527    position: absolute;
528    top: -9px;
529    right: 20px;
530    width: 0;
531    height: 0;
532    border-left: 8px solid transparent;
533    border-right: 8px solid transparent;
534    border-bottom: 8px solid #e0e0e0;
535  }
536  
537  .referral-notification h4 {
538    margin: 0 0 8px 0;
539    color: #2196F3;
540    font-size: 16px;
541    font-weight: 600;
542  }
543  
544  .referral-notification p {
545    margin: 0 0 12px 0;
546    color: #666;
547  }
548  
549  .referral-notification .referral-code {
550    background: #f5f5f5;
551    padding: 8px;
552    border-radius: 4px;
553    font-family: monospace;
554    font-size: 13px;
555    text-align: center;
556    margin: 8px 0;
557    border: 1px solid #ddd;
558  }
559  
560  .referral-notification .close-btn {
561    position: absolute;
562    top: 8px;
563    right: 8px;
564    background: none;
565    border: none;
566    font-size: 18px;
567    color: #999;
568    cursor: pointer;
569    padding: 0;
570    width: 20px;
571    height: 20px;
572    line-height: 1;
573  }
574  
575  .referral-notification .close-btn:hover {
576    color: #333;
577  }
578  
579  .referral-notification .action-btn {
580    background: #2196F3;
581    color: white;
582    border: none;
583    padding: 8px 16px;
584    border-radius: 4px;
585    cursor: pointer;
586    font-size: 12px;
587    margin-right: 8px;
588    margin-top: 8px;
589  }
590  
591  .referral-notification .action-btn:hover {
592    background: #1976D2;
593  }
594  
595  .referral-notification .dismiss-btn {
596    background: transparent;
597    color: #666;
598    border: 1px solid #ddd;
599    padding: 8px 16px;
600    border-radius: 4px;
601    cursor: pointer;
602    font-size: 12px;
603    margin-top: 8px;
604  }
605  
606  .referral-notification .dismiss-btn:hover {
607    background: #f5f5f5;
608  }
609  .referral-modal__dialog {
610    transform: translate(-50%, 0);
611    transition: transform var(--duration-default) ease, visibility 0s;
612    z-index: 10000;
613    position: fixed;
614    top: 20vh;
615    left: 50%;
616    width: 100%;
617    max-width: 350px;
618    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
619    border-radius: 12px;
620    background-color: #fff;
621    color: #000;
622    padding: 20px;
623    text-align: center;
624  }
625  .modal-overlay.referral-modal-overlay {
626    position: fixed;
627    top: 0;
628    left: 0;
629    width: 100%;
630    height: 100%;
631    background-color: rgba(0, 0, 0, 0.7);
632    z-index: 2001;
633    display: block;
634    opacity: 1;
635    transition: opacity var(--duration-default) ease, visibility 0s;
636  }
637</style>
638
639<header id="es_header_bar" class="header-bar  sticky-topbar">
640  <div class="header-bg-wrapper">
641    <div class="header-wrapper wrapper">
642      
643
644      <div class="logo-header" role="banner">
645
646              
647                    <div class="h1 site-header__logo" itemscope itemtype="http://schema.org/Organization">
648              
649                    
650                        
651                      	
652                          <a href="/" class="logo-wrapper" itemprop="url">
653                            <img src="https://cdn.store-assets.com/s/360437/f/4829734.png?width=350&format=webp" alt="Madam Yong Delight | Nyonya Kuih | Est. 1985" itemprop="logo">
654                          </a>
655                        
656
657                    
658              
659                </div>
660              
661
662      </div>
663
664      <div class="header-nav-bar medium-down--hide">
665          
666<ul class="site-nav large--text-center" id="AccessibleNav">
667  
668    
669    
670      <li >
671        <a href="/"  class="site-nav__link">Home</a>
672      </li>
673    
674  
675    
676    
677      
678      <li class="site-nav--has-dropdown" aria-haspopup="true">
679        <a href="/collections/all"  class="site-nav__link">
680          Products
681          <span class="arrow-icon">
682            <svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><title>arrow down</title><path d="M50,78.18A7.35,7.35,0,0,1,44.82,76L3.15,34.36A7.35,7.35,0,1,1,13.55,24L50,60.44,86.45,24a7.35,7.35,0,1,1,10.4,10.4L55.21,76A7.32,7.32,0,0,1,50,78.18Z"/></svg>
683          </span>
684        </a>
685        <ul class="site-nav__dropdown">
686          
687            
688            
689              <li >
690                <a href="/collections/top-picks"  class="site-nav__link">Top Picks</a>
691              </li>
692            
693          
694            
695            
696              <li >
697                <a href="/collections/sweets"  class="site-nav__link">Sweets</a>
698              </li>
699            
700          
701            
702            
703              <li >
704                <a href="/collections/savouries"  class="site-nav__link">Savouries</a>
705              </li>
706            
707          
708            
709            
710              <li >
711                <a href="/collections/vegetarian-vegan"  class="site-nav__link">Vegan</a>
712              </li>
713            
714          
715            
716            
717              <li >
718                <a href="/collections/gift-sets"  class="site-nav__link">Gift Sets</a>
719              </li>
720            
721          
722            
723            
724              <li >
725                <a href="/collections/cny-specials"  class="site-nav__link">CNY Specials</a>
726              </li>
727            
728          
729            
730            
731              <li >
732                <a href="/collections/packaging"  class="site-nav__link">Packaging & Add-Ons</a>
733              </li>
734            
735          
736        </ul>
737      </li>
738    
739  
740    
741    
742      <li >
743        <a href="https://www.madamyongdelight.com/collections/gift-sets"  class="site-nav__link">
743Gift Sets</a>
744      </li>
745    
746  
747    
748    
749      <li >
750        <a href="/collections/packaging"  class="site-nav__link">Packaging & Add-Ons</a>
751      </li>
752    
753  
754    
755    
756      <li >
757        <a href="/apps/contact-form-plus"  class="site-nav__link">Wholesale</a>
758      </li>
759    
760  
761    
762    
763      <li >
764        <a href="/pages/media-feature"  class="site-nav__link">Media / Feature</a>
765      </li>
766    
767  
768    
769    
770      <li >
771        <a href="/pages/join-our-team"  class="site-nav__link">Join Our Team!</a>
772      </li>
773    
774  
775    
776    
777      <li >
778        <a href="/pages/faq"  class="site-nav__link">FAQ</a>
779      </li>
780    
781  
782    
783    
784      <li >
785        <a href="/pages/contact-us"  class="site-nav__link">Contact Us</a>
786      </li>
787    
788  
789  
790  
791      
792        
793          
794        
795          
796        
797      
798  
799  
800  
801</ul>
802
803      </div>
804
805      <div class="desktop-header-nav medium-down--hide">
806
807
808        <div class="header-subnav">
809          
810
811
812
813
814
815
816          <div class="header-icon-nav">
817
818                
819
820                
821
822
823                
824                  
825                    <div class="header-bar__module">
826                      
827  <a class="popup-with-form" href="#search-form">
828    
829
830
831
832	<svg class="icon-search svg-icon" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><title>icon-search</title><path d="M68.5,65.87a35.27,35.27,0,1,0-5.4,4.5l23.11,23.1a3.5,3.5,0,1,0,5-4.94ZM14.82,41A28.47,28.47,0,1,1,43.28,69.43,28.5,28.5,0,0,1,14.82,41Z"/></svg>    
833
834  
835
836  </a>
837
838
839
840<!-- form itself -->
841<div id="search-form" class="white-popup-block mfp-hide popup-search">
842  <div class="popup-search-content">
843    <form action="/search" method="get" class="input-group search-bar" role="search">
844      
845      <span class="input-group-btn">
846        <button type="submit" class="btn">
847        	
848
849
850
851	<svg class="icon-search svg-icon" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><title>icon-search</title><path d="M68.5,65.87a35.27,35.27,0,1,0-5.4,4.5l23.11,23.1a3.5,3.5,0,1,0,5-4.94ZM14.82,41A28.47,28.47,0,1,1,43.28,69.43,28.5,28.5,0,0,1,14.82,41Z"/></svg>    
852
853  
854
855        </button>
856      </span>
857      <input type="search" name="q" value="" placeholder="Search" class="input-group-field" aria-label="Search" placeholder="Search" autocomplete="off">
858      <div class="dropdown" id="searchDropdown"></div>
859      <input type="hidden" name="search_history" id="search_history">
860    </form>
861  </div>
862</div>
863
864<script src="https://store-themes.easystore.co/360437/themes/3809/assets/magnific-popup.min.js?t=1787076042" type="text/javascript" ></script>
vendor: 1 bytes, line 864
864
865<script>
866$(document).ready(function() {
867	$('.popup-with-form').magnificPopup({
868		type: 'inline',
869		preloader: false,
870		focus: '#name',
871      	mainClass: 'popup-search-bg-wrapper',
872
873		// When elemened is focused, some mobile browsers in some cases zoom in
874		// It looks not nice, so we disable it:
875		callbacks: {
876			beforeOpen: function() {
877				if($(window).width() < 700) {
878					this.st.focus = false;
879				} else {
880					this.st.focus = '#name';
881				}
882			}
883		}
884	});
885});
886</script>
886
887
888
889<script>
890  var _search_history_listings = ""
891  if(_search_history_listings != "") localStorage.setItem('searchHistory', JSON.stringify(_search_history_listings));
892
893  function clearAll() {
894    localStorage.removeItem('searchHistory');
895  
896    var customer = "";
897    if(customer) {
898      // Your logic to clear all data or call an endpoint
899      fetch('/account/search_histories', {
900          method: 'DELETE',
901          headers: {
902            "Content-Type": "application/json",
903            "X-Requested-With": "XMLHttpRequest"
904          },
905          body: JSON.stringify({
906            _token: "FkJtfIYyPq1JdSUYJuIOBhtzw7jHetJ5UamtdR4M"
907          }),
908      })
909      .then(response => response.json())
910    }
911  }
912  // End - store view history in local storage
913  
914  // search history dropdown  
915  var searchInputs = document.querySelectorAll('input[type=search]');
916  
917  if(searchInputs.length > 0) {
918    
919    searchInputs.forEach((searchInput)=>{
920    
921      searchInput.addEventListener('focus', function() {
922        var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown');
923        searchDropdown.innerHTML = ''; // Clear existing items
924  
925        // retrieve data from local storage
926        var searchHistoryData = JSON.parse(localStorage.getItem('searchHistory')) || [];
927  
928        // Convert JSON to string
929        var search_history_json = JSON.stringify(searchHistoryData);
930  
931        // Set the value of the hidden input
932        searchInput.closest('form').querySelector("#search_history").value = search_history_json;
933  
934        // create dropdown items
935        var clearAllItem = document.createElement('div');
936        clearAllItem.className = 'dropdown-item clear-all';
937        clearAllItem.textContent = 'Clear';
938        clearAllItem.addEventListener('click', function() {
939            clearAll();
940            searchDropdown.style.display = 'none';
941            searchInput.classList.remove('is-focus');
942        });
943        searchDropdown.appendChild(clearAllItem);
944  
945        // create dropdown items
946        searchHistoryData.forEach(function(item) {
947          var dropdownItem = document.createElement('div');
948          dropdownItem.className = 'dropdown-item';
949          dropdownItem.textContent = item.term;
950          dropdownItem.addEventListener('click', function() {
951            searchInput.value = item.term;
952            searchDropdown.style.display = 'none';
953          });
954          searchDropdown.appendChild(dropdownItem);
955        });
956  
957        if(searchHistoryData.length > 0){
958          // display the dropdown
959          searchInput.classList.add('is-focus');
960          document.body.classList.add('search-input-focus');
961          searchDropdown.style.display = 'block';
962        }
963      });
964  
965      searchInput.addEventListener("focusout", (event) => {
966        var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown');
967        searchInput.classList.remove('is-focus');
968        searchDropdown.classList.add('transparent');
969        setTimeout(()=>{
970          searchDropdown.style.display = 'none';
971          searchDropdown.classList.remove('transparent');
972          document.body.classList.remove('search-input-focus');
973        }, 400);
974      });
975    })
976  }
977  // End - search history dropdown
978</script>
978
979                    </div>
980                  
981                
982
983
984
985
986                
987                  <div class="header-bar__module dropdown-wrapper" style="position: relative;">
988                    
989                      <a href="/account/login">
990
991
992
993    <svg class="svg-icon" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><title>icon-profile</title><path d="M50,51.8A24.4,24.4,0,1,0,25.6,27.4,24.43,24.43,0,0,0,50,51.8ZM50,10A17.4,17.4,0,1,1,32.6,27.4,17.43,17.43,0,0,1,50,10Z"/><path d="M62.66,57.66H37.34a30.54,30.54,0,0,0-30.5,30.5V93.5a3.5,3.5,0,0,0,3.5,3.5H89.66a3.5,3.5,0,0,0,3.5-3.5V88.16A30.54,30.54,0,0,0,62.66,57.66ZM86.16,90H13.84V88.16a23.53,23.53,0,0,1,23.5-23.5H62.66a23.53,23.53,0,0,1,23.5,23.5Z"/></svg>
994
995  
996</a>
997
998                      <!-- Referral Notification Popup for Desktop -->
999                      <div id="referralNotification" class="referral-notification" style="display: none;">
1000                        <button class="close-btn" onclick="dismissReferralNotification()">&times;</button>
1001                        <div style="text-align: center; margin-bottom: 16px;">
1002                          <div style="width: 100px; height: 100px; margin: 0 auto;">
1003                            <img src="https://resources.easystore.co/storefront/icons/channels/vector_referral_program.svg">
1004                          </div>
1005                        </div>
1006                        <p id="referralSignupMessage" style="text-align: center; font-size: 14px; color: #666; margin: 0 0 20px 0;">
1007                          Your friend gifted you   credit! Sign up now to redeem.
1008                        </p>
1009                        <div style="text-align: center;">
1010                          <button class="btn" onclick="goToSignupPage()" style="width: 100%; color: #fff;">
1011                            Sign Up
1012                          </button>
1013                        </div>
1014                      </div>
1015                    
1016                  </div>
1017                
1018
1019                <div class="header-bar__module cart-page-link-wrapper">
1020                  <span class="header-bar__sep" aria-hidden="true"></span>
1021                  <a class="CartDrawerTrigger cart-page-link">
1022                    
1023
1024
1025
1026	<svg class="svg-icon" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><title>icon-bag</title><path d="M91.78,93.11,84.17,24.44a3.5,3.5,0,0,0-3.48-3.11H69.06C67.53,10.94,59.57,3,50,3S32.47,10.94,30.94,21.33H19.31a3.5,3.5,0,0,0-3.48,3.11L8.22,93.11A3.49,3.49,0,0,0,11.69,97H88.31a3.49,3.49,0,0,0,3.47-3.89ZM50,10c5.76,0,10.6,4.83,12,11.33H38.05C39.4,14.83,44.24,10,50,10ZM15.6,90l6.84-61.67h8.23v9.84a3.5,3.5,0,0,0,7,0V28.33H62.33v9.84a3.5,3.5,0,0,0,7,0V28.33h8.23L84.4,90Z"/></svg>	
1027
1028  
1029
1030                    <span class="cart-count header-bar__cart-count hidden-count">0</span>
1031                  </a>
1032                </div>
1033
1034
1035                
1036                  
1037                
1038
1039
1040          </div>
1041        </div>
1042
1043
1044
1045      </div>
1046      
1047	  <div class="mobile-header-icons large--hide">
1048        
1049        <div class="large--hide">
1050          
1051              
1052                
1053                  
1054                        <a href="/account/login">
1055
1056
1057
1058    <svg class="svg-icon" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><title>icon-profile</title><path d="M50,51.8A24.4,24.4,0,1,0,25.6,27.4,24.43,24.43,0,0,0,50,51.8ZM50,10A17.4,17.4,0,1,1,32.6,27.4,17.43,17.43,0,0,1,50,10Z"/><path d="M62.66,57.66H37.34a30.54,30.54,0,0,0-30.5,30.5V93.5a3.5,3.5,0,0,0,3.5,3.5H89.66a3.5,3.5,0,0,0,3.5-3.5V88.16A30.54,30.54,0,0,0,62.66,57.66ZM86.16,90H13.84V88.16a23.53,23.53,0,0,1,23.5-23.5H62.66a23.53,23.53,0,0,1,23.5,23.5Z"/></svg>
1059
1060  
1061</a>
1062                  
1063                
1064                  
1065                
1066              
1067          
1068        </div>
1069
1070
1071        <!--  Mobile cart  -->
1072        <div class="large--hide">
1073          <a class="CartDrawerTrigger cart-page-link mobile-cart-page-link">
1074            
1075
1076
1077
1078	<svg class="svg-icon" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><title>icon-bag</title><path d="M91.78,93.11,84.17,24.44a3.5,3.5,0,0,0-3.48-3.11H69.06C67.53,10.94,59.57,3,50,3S32.47,10.94,30.94,21.33H19.31a3.5,3.5,0,0,0-3.48,3.11L8.22,93.11A3.49,3.49,0,0,0,11.69,97H88.31a3.49,3.49,0,0,0,3.47-3.89ZM50,10c5.76,0,10.6,4.83,12,11.33H38.05C39.4,14.83,44.24,10,50,10ZM15.6,90l6.84-61.67h8.23v9.84a3.5,3.5,0,0,0,7,0V28.33H62.33v9.84a3.5,3.5,0,0,0,7,0V28.33h8.23L84.4,90Z"/></svg>	
1079
1080  
1081
1082            <span class="cart-count hidden-count">0</span>
1083          </a>
1084        </div>
1085
1086        <!--  Mobile hamburger  -->
1087        <div class="large--hide">
1088          <a class="mobile-nav-trigger MobileNavTrigger">
1089            
1090
1091
1092
1093    <svg class="svg-icon" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><title>icon-nav-menu</title><path d="M6.7,26.34H93a3.5,3.5,0,0,0,0-7H6.7a3.5,3.5,0,0,0,0,7Z"/><path d="M93.3,46.5H7a3.5,3.5,0,0,0,0,7H93.3a3.5,3.5,0,1,0,0-7Z"/><path d="M93.3,73.66H7a3.5,3.5,0,1,0,0,7H93.3a3.5,3.5,0,0,0,0-7Z"/></svg>
1094
1095  
1096
1097          </a>
1098        </div>
1099      
1100        
1101          
1102          <!-- Referral Notification Modal for Mobile -->
1103          <details-modal class="referral-modal" id="referralMobileModal">
1104            <details>
1105              <summary class="referral-modal__toggle" aria-haspopup="dialog" aria-label="Open referral modal" style="display: none;">
1106              </summary>
1107              <div class="modal-overlay referral-modal-overlay"></div>
1108              <div class="referral-modal__dialog" role="dialog" aria-modal="true" aria-label="Referral notification">
1109                <div class="referral-modal__content">
1110                  <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;">
1111                    &times;
1112                  </button>
1113
1114                  <div style="margin-bottom: 24px;">
1115                    <div style="width: 120px; height: 120px; margin: 0 auto 20px;">
1116                      <img src="https://resources.easystore.co/storefront/icons/channels/vector_referral_program.svg" style="width: 100%; height: 100%;">
1117                    </div>
1118                  </div>
1119
1120                  <p id="referralSignupMessageMobile" style="font-size: 16px; color: #333; margin: 0 0 30px 0; line-height: 1.5;">
1121                    Your friend gifted you   credit! Sign up now to redeem.
1122                  </p>
1123
1124                  <button type="button" class="btn" onclick="goToSignupPageFromMobile()" style="width: 100%; color: #fff;">
1125                    Sign Up
1126                  </button>
1127                </div>
1128              </div>
1129            </details>
1130          </details-modal>
1131          
1132        
1133        
1134      </div>
1135		
1136    </div>
1137  </div>
1138</header>
1139
1140
1141
1142
1143
1144
1145    
1146    <main class="wrapper main-content" role="main">
1147      <div class="grid">
1148          <div class="grid__item">
1149            
1150  
1151            <link rel="stylesheet" href="/assets/css/store-locator.css?v3.1">
1152
1153
1154  <div class="store-locator-heading">
1155   <h1 class="section-header__title">Store Locator</h1>
1156   <b>Select a state below to find a store near you</b>
1157   <div class="store-locator-search">
1158     <select id="province-select">
1159       <option value="all">All</option>
1160     </select>
1161   </div>
1162  </div>
1163  <div class='store-locator-section no-watermark'>
1164      <div class="store-locator-grid">
1165        
1166          <div class="store-locator-grid_item" data-province="Selangor">
1167              <div class="store-selector-item">
1168                <div class="location-detail">
1169                  <strong>
1170                    Madam Yong
1171                  </strong>
1172                   <a href="tel:[email protected]">0122381396</a> <br> 
1173                   <a href="mailto:[email protected]">[email protected]</a> <br> 
1174                  <address>
1175                     45 Jalan 6/31 <br> 
1176                    
1177                    Petaling Jaya, 46000<br>
1178                    Selangor , Malaysia <br>
1179
1180                    <div id="business-hour-0"></div>
1181                  </address>
1182
1183                </div>
1184                <a class="btn btn--small" href="https://www.google.com/maps?q=Madam Yong 45 Jalan 6/31  Petaling Jaya 46000 MY" target="_blank">Navigate</a>
1185              </div>
1186          </div>
1187        
1188      </div>
1189  </div>
1190
1191
1192
1193
1194
1195
1196<script>
1197
1198  var locations = [{"id":10134,"store_id":360437,"code":"madam yong","name":"Madam Yong","company":null,"address1":"45 Jalan 6\/31","address2":null,"city":"Petaling Jaya","zip":"46000","village":null,"sub_district":null,"sub_district_code":null,"district":null,"district_code":null,"province":"Selangor","province_code":"MY-10","country":"Malaysia","country_code":"MY","phone":"0122381396","email":"[email protected]","pickup_charge":"0.0","service_provider":null,"latitude":"3.088727","longitude":"101.65329","geocoded_at":null,"geocoding_status":null,"cod_type":0,"cod_min_amount":"0.0","cod_max_amount":"0.0","is_primary":true,"enable_pickup":true,"business_hour":"{}","disabled_date":"2021-02-12,2021-02-13,2021-02-14,2021-05-13,2021-05-14,2021-05-15,2021-05-16,2022-02-01,2022-02-02,2022-02-03,2022-02-04,2022-02-05,2022-05-03,2022-05-04,2022-05-05,2022-05-06,2022-05-07,2022-05-08,2022-07-10,2022-07-11,2022-09-05,2023-01-22,2023-01-23,2023-01-24,2023-01-25,2023-04-22,2023-04-23,2023-04-24,2023-04-25,2023-05-15,2023-06-29,2024-02-10,2024-02-11,2024-02-12,2024-02-13,2024-04-10,2024-04-11,2024-04-12,2024-04-13,2025-01-29,2025-01-30,2025-01-31,2025-02-01,2025-03-31,2025-04-01,2025-04-02,2025-04-03,2025-06-07,2026-02-17,2026-02-18,2026-02-19,2026-02-20,2026-03-20,2026-03-21,2026-03-22,2026-03-23,2026-05-27","cutoff_day":2,"cutoff_value":2,"cutoff_unit":"day","pickup_available_unit":"day","pickup_available_value":30,"track_inventory_enabled":true,"is_hidden":false,"online_fulfillment_enabled":true,"fulfillment_priority":null,"pickup_time_selection_enabled":true,"pickup_description":null,"is_visitable":true,"is_enabled":true,"is_deleted":false,"deleted_at":null,"updated_at":"2026-05-11T10:19:55.000+08:00","created_at":"2020-06-10T02:46:21.000+08:00","formatted":"Madam Yong 45 Jalan 6\/31  Petaling Jaya 46000 MY"}];
1199
1200  const ordering = { mon: 1, tue: 2, wed: 3, thur: 4, fri: 5, sat: 6, sun: 7 }
1201
1202  const formatDay = day => day.replace(day[0], day[0].toUpperCase())
1203
1204  const convertTime = time => {
1205
1206    if(!time.includes(":")) time += ":00"
1207
1208    time = time.toString ().match (/^([01]\d|2[0-3])(:)([0-5]\d)(:[0-5]\d)?$/) || [time];
1209
1210    if (time.length > 1) {
1211      time = time.slice (1);
1212      time[5] = +time[0] < 12 ? 'am' : 'pm';
1213      time[0] = +time[0] % 12 || 12;
1214    }
1215
1216    return time.join ('');
1217  }
1218
1219  const checkTimeFormat = value => {
1220
1221    if(value.split(':').length == 3) {
1222      return value.slice(0, value.length - 3)
1223    }
1224    return value
1225  }
1226
1227  const formatTime = time => {
1228
1229    var start = convertTime(checkTimeFormat(time.start))
1230    var end = convertTime(checkTimeFormat(time.end))
1231
1232    return `${start} - ${end}`
1233  }
1234
1235  const getToday = businessHour => {
1236
1237    var today = new Date().getDay()
1238
1239    var today = Object.keys(businessHour).filter(key => ordering[key] === today)[0];
1240
1241    return today
1242
1243  }
1244
1245  const checkOpen = businessHour => {
1246
1247    var today = getToday(businessHour)
1248
1249    var result = businessHour.everyday;
1250
1251    if(today !== undefined) result = businessHour[today]
1252
1253    if (result === 'closed') return false
1254
1255    var { start, end } = result
1256
1257    start = start.split(':')
1258    if(start.length > 2) start.pop()
1259    start = parseInt(start.join(''))
1260
1261    end = end.split(':')
1262    if(end.length > 2) end.pop()
1263    end = parseInt(end.join(''))
1264
1265    var now = new Date()
1266    now = parseInt(`${now.getHours()}${String(now.getMinutes()).padStart(2, "0")}`)
1267
1268    if(now < start || now >= end) {
1269      return false
1270    }
1271
1272    return true
1273
1274  }
1275
1276
1277
1278  var provinceSelect = document.getElementById('province-select'),
1279      locationItem = document.querySelectorAll("[data-province]")
1280  provinceSelect.addEventListener("change", function(){
1281    locationItem.forEach(function(item){
1282      if(item.getAttribute('data-province') != provinceSelect.value && provinceSelect.value != 'all'){
1283        item.style.display = "none";
1284      }else{
1285        item.style.display = "";
1286      }
1287    });
1288  });
1289
1290
1291
1292  for(var i = 0; i < locations.length; i++) {
1293
1294    // Update provinceSelect Option
1295    var provinceOptionExist = false
1296    for (x = 0; x < provinceSelect.length; ++x){
1297      if (provinceSelect.options[x].value == locations[i].province){
1298        provinceOptionExist = true
1299      }
1300    }
1301    if(!provinceOptionExist){
1302      var opt = document.createElement('option');
1303      opt.appendChild( document.createTextNode(locations[i].province) );
1304      opt.value = locations[i].province;
1305      provinceSelect.appendChild(opt);
1306    }
1307
1308    var node = document.getElementById(`business-hour-${i}`)
1309    var businessHour = JSON.parse(locations[i].business_hour)
1310
1311    var dropdown = document.createElement("div")
1312    dropdown.className = "dropdown"
1313    dropdown.setAttribute("data-toggle","0")
1314
1315    var dropdownToggle = document.createElement("span")
1316    dropdownToggle.className = "dropdown-toggle"
1317
1318    var caret = document.createElement("span")
1319    caret.className = "caret"
1320
1321    var dropdownMenu = document.createElement("ul")
1322    dropdownMenu.className = "dropdown-menu"
1323
1324    if(Object.keys(businessHour).length <= 0) {
1325
1326      dropdownToggle.innerHTML = `<span style="color: green; font-weight: bold;">Open</span>`
1327
1328      var li = document.createElement("li")
1329      var a = document.createElement("a")
1330      a.innerHTML = "Open for 24 hours"
1331      li.appendChild(a)
1332      dropdownMenu.appendChild(li)
1333
1334    }
1335
1336    else if("everyday" in businessHour) {
1337
1338      dropdownToggle.innerHTML = `<span style="color: red; font-weight: bold;">Closed</span>`
1339
1340      if(checkOpen(businessHour)) {
1341        dropdownToggle.innerHTML = `<span style="color: green; font-weight: bold;">Open</span> ⋅ Closes ${convertTime(businessHour.everyday.end)}`
1342      }
1343
1344      var li = document.createElement("li")
1345      var a = document.createElement("a")
1346      a.innerHTML = `Everyday: ${formatTime(businessHour.everyday)}`
1347      li.appendChild(a)
1348      dropdownMenu.appendChild(li)
1349    }
1350
1351    else {
1352
1353      dropdownToggle.innerHTML = `<span style="color: red; font-weight: bold;">Closed</span>`
1354
1355      var today = getToday(businessHour)
1356
1357      if(checkOpen(businessHour)) {
1358        dropdownToggle.innerHTML = `<span style="color: green; font-weight: bold;">Open</span> ⋅ Closes ${convertTime(businessHour[today].end)}`
1359      }
1360
1361      var listItems = []
1362
1363      for(var day in businessHour) {
1364
1365        var li = document.createElement("li")
1366        var a = document.createElement("a")
1367        a.innerHTML = `${formatDay(day)}: ${businessHour[day] === 'closed' ? 'Closed': formatTime(businessHour[day])}`
1368        li.appendChild(a)
1369
1370        listItems[ordering[day]] = li
1371
1372      }
1373
1374      listItems.forEach(el => el != undefined && dropdownMenu.appendChild(el))
1375
1376    }
1377
1378    dropdown.appendChild(dropdownToggle)
1379    dropdown.appendChild(caret)
1380    dropdown.appendChild(dropdownMenu)
1381
1382
1383
1384    node.appendChild(dropdown)
1385
1386
1387  }
1388
1389  var dropdowns = document.querySelectorAll("[data-toggle]");
1390  dropdowns.forEach(function(btn){
1391    btn.addEventListener('click', function(el) {
1392       if(btn.getAttribute('data-toggle') != '0'){
1393        btn.setAttribute("data-toggle", "0")
1394      }else{
1395       btn.setAttribute("data-toggle", "1")
1396     }
1397   });
1398  });
1399
1400  window.addEventListener('click', function(e){
1401    dropdowns.forEach(function(btn){
1402      if (!btn.contains(e.target)){
1403        btn.setAttribute("data-toggle", "0")
1404      }
1405    });
1406  });
1407
1408
1409</script>
1409
1410
1411
1412
1413
1414  
1415            
1416          </div>
1417      </div>
1418      
1419          </main>
1420  
1421    <footer id="es_footer_section" class="site-footer small--text-center" role="contentinfo">
1422      
1423      
1424        <div id="es_logo_list_section" class="logo-list-section">
1425  	<h2 class="section-header__title"></h2>
1426	<ul class="logo-list-wrapper">
1427      	
1428      		
1429      		
1430            
1431                  <li class="logo-list-item">
1432                    
1433                    <a href="/collections/all"></a>
1434                    
1435                    <img class="lozad" data-src="https://cdn.store-assets.com/s/360437/f/14326811.jpg?width=350&format=webp"/>
1436                  </li>
1437            
1438      	
1439      		
1440      		
1441            
1442      	
1443      		
1444      		
1445            
1446      	
1447      		
1448      		
1449            
1450      	
1451      		
1452      		
1453            
1454      	
1455      		
1456      		
1457            
1458      	
1459      		
1460      		
1461            
1462      	
1463      		
1464      		
1465            
1466      	
1467	</ul>
1468</div>
1469
1470      
1471      
1472      <div class="wrapper">
1473  
1474        <div class="grid-uniform">
1475  
1476          
1477          
1478          
1479          
1480            
1481          
1482          
1483          
1484            
1485          
1486          
1487          
1488  
1489          
1490              
1491            
1492  
1493          
1494      
1495          
1496          
1497          <div class="grid__item large--one-half ">
1498            <a href="/" class="logo-wrapper" itemprop="url" >
1499              
1500                <img class="footer-logo" src="https://cdn.store-assets.com/s/360437/f/14326839.png?width=350&format=webp" alt="Madam Yong Delight | Nyonya Kuih | Est. 1985" itemprop="logo">
1501              
1502            </a>
1503            <p class="site-footer__links">© 2024 MADAM YONG DELIGHT SDN BHD (202001004265)</p>
1504          </div>
1505          
1506          
1507            <div class="grid__item large--one-quarter medium--one-half">
1508              
1509        <!-- <h4>Quick Links</h4> -->
1510              
1511              <ul class="site-footer__links">
1512                
1513                  <li><a href="/pages/home" >Home</a></li>
1514                
1515                  <li><a href="/pages/faq" >FAQ</a></li>
1516                
1517                  <li><a href="/store-locator" >Location</a></li>
1518                
1519                
1520              </ul>
1521            </div>
1522          
1523  
1524          
1525            <div class="grid__item large--one-quarter medium--one-half">
1526              <!-- <h4>Follow Us</h4> -->
1527                
1528                <ul class="inline-list social-icons">
1529  
1530  
1531    <li>
1532      <a class="icon-fallback-text" href="https://www.facebook.com/madamyongdelight" title="Madam Yong Delight | Nyonya Kuih | Est. 1985 on Facebook" target="_blank">
1533        
1534
1535
1536
1537    <svg xmlns="http://www.w3.org/2000/svg" class="facebook-icon-svg social-icon-svg" viewBox="0 0 1024 1024">
1538        <title>icon-facebook</title>
1539        <path d="M837.66,223.9a33.73,33.73,0,0,0-3.11-15c-6.78-13.85-17.87-21.09-33.37-21.09q-288.46,0-576.91,0c-.62,0-1.24,0-1.85,0a34.51,34.51,0,0,0-25.88,12.11c-6.31,7.13-8.85,15.57-8.85,25.07q.08,287.7,0,575.4c0,1,0,1.9,0,2.86A32.93,32.93,0,0,0,190,814.71c4.45,11.79,16.3,23.11,35,23.1q153.61-.1,307.24,0c2.36,0,2.36,0,2.36-2.37q0-123.3,0-246.6c0-2.55,0-2.55-2.53-2.55H452.27c-2.26,0-2.26,0-2.26-2.17v-96.3h84.63v-2.46c0-22.12-.11-44.24.06-66.36.07-8.29.57-16.59,1.28-24.85a129.58,129.58,0,0,1,7.43-33c10.86-30,30.59-51.74,60-64.51A133.44,133.44,0,0,1,653,285.82c12.45-.37,24.93,0,37.38.34,9.64.27,19.27.95,28.9,1.6,5.36.36,10.7,1.07,16.06,1.5,1.46.12,1.65.75,1.65,2q0,42.2,0,84.39c0,.59-.06,1.18-.09,1.85h-2.39c-16.28,0-32.56,0-48.84.05-7.63,0-15.23.54-22.65,2.61-11.61,3.23-19.86,10.09-23.65,21.78a55.66,55.66,0,0,0-2.74,16.86c-.14,22.23-.1,44.47-.13,66.7,0,2.25,0,2.25,2.31,2.25h94.66a15.13,15.13,0,0,1,0,1.54c-.38,2.94-.81,5.88-1.18,8.82-1.17,9.16-2.3,18.33-3.48,27.5-1.29,10-2.63,20-3.94,30-1.23,9.44-2.43,18.88-3.67,28.32-.31,2.32-.35,2.32-2.78,2.32h-79a4.62,4.62,0,0,0-1.67,0,2.5,2.5,0,0,0-1.2,1.16,3.68,3.68,0,0,0,0,1.49V835.21c0,2.56,0,2.56,2.53,2.56H797.83c2.13,0,4.27-.07,6.39-.21,11.56-.78,20.61-6.07,27.23-15.48,4.66-6.6,6.24-14.09,6.24-22.11q-.06-287.19,0-574.38Z" fill="#999"/>
1540    </svg>
1541
1542  
1543
1544        <span class="fallback-text">Facebook</span>
1545      </a>
1546    </li>
1547  
1548  
1549  
1550    <li>
1551      <a class="icon-fallback-text" href="https://instagram.com/madamyongdelight" title="Madam Yong Delight | Nyonya Kuih | Est. 1985 on Instagram" target="_blank">
1552        
1553
1554
1555
1556    <svg xmlns="http://www.w3.org/2000/svg" class="instagram-icon-svg social-icon-svg" viewBox="0 0 1024 1024">
1557        <title>icon-instagram</title>
1558        <path d="M834.35,341.22a231.23,231.23,0,0,0-9.59-46.45,166.71,166.71,0,0,0-52.17-78.33c-17-14.41-36.33-24.44-57.44-31.3-21.52-7-43.69-10.21-66.19-11.12-22.28-.9-44.58-1.73-66.87-1.85-47.68-.26-95.37-.16-143.06,0-27.47.11-54.95.69-82.32,3.39a220.7,220.7,0,0,0-37.43,6.95c-26.2,7.26-50,19-70.24,37.45-18.06,16.4-32.3,35.52-41.87,58.05-9.89,23.29-15.13,47.68-16.69,72.82-1.23,19.78-2.06,39.6-2.32,59.41-.38,28.91-.1,57.82-.1,86.73-.23,39.92-.67,79.85,1,119.76.72,17.66,1.57,35.3,4.6,52.76,3.22,18.52,8.32,36.51,16.71,53.34C232.83,768,268.81,797,317.12,811a246.28,246.28,0,0,0,59.24,9.11c25.3.95,50.63,1.78,75.95,1.94,43.83.28,87.66.1,131.5,0,26-.08,52.08-.72,78.06-2.74a234.52,234.52,0,0,0,45.76-8c24.54-6.92,46.82-18.12,66.22-34.79,24.65-21.17,41.5-47.44,51.3-78.36,6.7-21.14,9.83-42.88,10.73-64.94.9-21.84,1.73-43.69,1.82-65.55q.33-78.21-.15-156.44C837.42,387.82,836.72,364.47,834.35,341.22Zm-55.3,232.84c-.12,20.41-1,40.84-2,61.24-1,19.2-4.13,38.08-11.74,55.92q-18.43,43.24-62.47,60c-14.36,5.48-29.3,8.3-44.55,9.53-27.07,2.18-54.21,2.63-81.36,2.73-21.31.07-42.62,0-63.93,0v-.16c-28.47,0-56.94.22-85.4-.09-17.5-.18-35-1-52.49-1.89-19.94-1-39.51-4.31-57.95-12.38q-41.6-18.2-58-60.68a162.37,162.37,0,0,1-9.95-45.62c-2-24.66-2.62-49.38-2.66-74.1-.09-50.88-.16-101.77.12-152.65.11-19,1-38.09,2-57.11a180,180,0,0,1,8.78-48.23c8.32-24.84,23.63-44.14,45.66-58.12,11.78-7.48,24.85-11.91,38.36-15,15.57-3.61,31.43-4.65,47.34-5.32,54.32-2.28,108.68-1.46,163-1.5,18.67,0,37.34.12,56,.56,15.84.38,31.7,1,47.51,2,18.33,1.18,36.27,4.59,53.19,12q41.67,18.25,58.1,60.83c5.67,14.7,8.64,30,9.91,45.63,2,25,2.63,50,2.67,75.09C779.25,475.82,779.35,524.94,779.05,574.06Z" fill="#999"/><path d="M513,330.12c-92-.34-167,74.55-167.08,166.87s74.71,167,167,167A166.86,166.86,0,0,0,679.77,497.12C679.87,405,605.46,330.45,513,330.12Zm-.29,275.31A108.38,108.38,0,1,1,621.21,497.15,108.38,108.38,0,0,1,512.7,605.43Z" fill="#999"/><path d="M686.47,284.5a39,39,0,1,0,38.92,39.14A39,39,0,0,0,686.47,284.5Z" fill="#999"/>
1559    </svg>
1560
1561  
1562
1563        <span class="fallback-text">Instagram</span>
1564      </a>
1565    </li>
1566  
1567  
1568  
1569  
1570  
1571  
1572    <li>
1573      <a class="icon-fallback-text" href="https://wa.me/60122381396" title="Madam Yong Delight | Nyonya Kuih | Est. 1985 on Whatsapp" target="_blank">
1574        
1575
1576
1577
1578    <svg xmlns="http://www.w3.org/2000/svg" class="whatsapp-icon-svg social-icon-svg" viewBox="0 0 1024 1024">
1579        <title>icon-whatsapp</title>
1580        <path d="M816.7,348.82A345.81,345.81,0,0,0,694.1,218.71c-44.79-28-93.6-44.39-146.07-49.88a345.45,345.45,0,0,0-92,2.72,339.05,339.05,0,0,0-94.38,29.87A343.85,343.85,0,0,0,238,302.05Q177.25,381,167.56,480.22a345,345,0,0,0,43.29,203.46,6.68,6.68,0,0,1,.57,4.56q-16.36,60.35-32.93,120.63c-5.08,18.56-10.2,37.12-15.43,56.13,1.15-.24,1.8-.34,2.43-.51Q254.72,841.08,344,817.7a7.88,7.88,0,0,1,4.84.57c11.92,5.41,23.56,11.5,35.68,16.39a344.42,344.42,0,0,0,274.43-8.3,343.9,343.9,0,0,0,122.89-97q64.35-80.48,74.57-183.1a344.59,344.59,0,0,0-2.88-89.12A336.49,336.49,0,0,0,816.7,348.82ZM799.12,528.11c-3.35,60.82-23.74,115.33-61.56,163C695.72,743.88,641.71,778,576.15,793.47A277.11,277.11,0,0,1,491.09,800a284.89,284.89,0,0,1-129.36-41.68,16.37,16.37,0,0,0-14.17-2c-33.08,8.93-66.26,17.47-99.4,26.13-.46.12-.93.19-2,.42,1.61-5.94,3.07-11.39,4.56-16.83q11.91-43.44,23.73-86.9a6.64,6.64,0,0,0-.91-4.73c-11.53-18-21.73-36.58-29.45-56.51a287.49,287.49,0,0,1-17.41-68.71c-5.7-46-.87-90.81,15-134.35a287.26,287.26,0,0,1,479.82-98.72c32.53,34.66,55.29,74.85,67.86,120.72A284,284,0,0,1,799.12,528.11Z" fill="#999"/><path d="M679.23,590c-12.9-6.08-25.57-12.63-38.44-18.75-10.69-5.09-21.41-10.15-32.36-14.63-8.48-3.47-12.2-1.6-17.82,5.65-8.75,11.27-17.79,22.32-26.93,33.28-4.38,5.25-8.82,6.33-15,3.54-11.48-5.18-23.13-10.16-34.09-16.32C477.68,562,449.73,532.17,428.22,496c-4.54-7.64-4-11.33,2-17.83,8.45-9.23,17.15-18.29,22.45-29.93a16.29,16.29,0,0,0,.44-13.68c-8.9-21.42-17.75-42.87-26.8-64.23a70.6,70.6,0,0,0-6.52-11.83c-2.39-3.56-6.15-5.12-10.51-5-3.28,0-6.56,0-9.84,0,0-.17,0-.34,0-.52-5.1.27-10.26.1-15.27.89-8.07,1.27-14,6.29-19.53,12.06-23.72,24.67-32.22,53.95-26.71,87.44a135.88,135.88,0,0,0,19.34,50.09c9.28,14.85,19.38,29.25,29.94,43.23a405.65,405.65,0,0,0,65.73,68.21c29.34,24.26,62.45,41.51,98.38,53.66,15,5.07,29.89,10.33,46,10.64,10.73.21,21.46.08,31.83-3a103.21,103.21,0,0,0,39.24-22c5.11-4.48,9.77-9.49,12.29-15.89a103.2,103.2,0,0,0,7.06-34.67C687.88,597,685.22,592.79,679.23,590Z" fill="#999"/>
1581    </svg>
1582
1583  
1584
1585        <span class="fallback-text">Whatsapp</span>
1586      </a>
1587    </li>
1588    
1589  
1590  
1591  
1592</ul>
1593
1594            </div>
1595          
1596        </div>
1597  
1598        <hr class="hr--small hr--clear">
1599  
1600        
1601  
1602         <div class="grid">
1603           <div class="grid__item text-center">
1604             
1605             
1606             <p class="site-footer__links">
1607              
1608              
1609                
1610                  <a href="/legal/terms-of-service">Terms of Service</a>
1611                
1612                
1613              
1614                
1615                  | <a href="/legal/privacy-policy">Privacy Policy</a>
1616                
1617                
1618              
1619                
1620                  | <a href="/legal/refund-policy">Refund Policy</a>
1621                
1622                
1623              
1624             </p>
1625             
1626           </div>
1627         </div>
1628  
1629      </div>
1630    </footer>
1631    
1632      
1633
1634    
1635
1636    
1637    
1638      <div id="scrollTopButton" class="on-left" style="display: none">
1639        <svg class="svg-icon" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M22,18.25a1.21,1.21,0,0,1-.88-.37L12,8.77,2.88,17.88a1.24,1.24,0,0,1-1.76-1.76l10-10a1.24,1.24,0,0,1,1.76,0l10,10a1.24,1.24,0,0,1,0,1.76A1.21,1.21,0,0,1,22,18.25Z"/></svg>
1640      </div>
1641      
1641<script>
1642        $( document ).ready(function() {
1643          var winScroll = $(this).scrollTop(),
1644          this_el = $("#scrollTopButton");
1645
1646          // Header bar
1647          if(winScroll > 400){
1648            this_el.fadeIn();
1649          }else{
1650            this_el.fadeOut();
1651          }
1652
1653          $("#scrollTopButton").click(function() {
1654            $('html,body').animate({ scrollTop: 0 });
1655          });
1656
1657          $(window).scroll(function(){
1658            var winScroll = $(this).scrollTop();
1659
1660            // Header bar
1661            if(winScroll > 400){
1662              this_el.fadeIn();
1663            }else{
1664              this_el.fadeOut();
1665            }
1666
1667          });
1668        });
1669      </script>
1669
1670    
1671
1672  
1673    
1674  
1675    
1675<script src="https://store-themes.easystore.co/360437/themes/3809/assets/fastclick.min.js?t=1787076042" type="text/javascript" ></script>
1675
1676    
1676<script src="https://store-themes.easystore.co/360437/themes/3809/assets/timber.js?v1.1?t=1787076042" type="text/javascript" ></script>
1676
1677    
1677<script src="https://store-themes.easystore.co/360437/themes/3809/assets/theme.js?t=1787076042" type="text/javascript" ></script>
1677
1678  
1679  
1680  
1681    
1682        
1682<script>
1683          if (typeof Object.assign !== 'function') {
1684          // Must be writable: true, enumerable: false, configurable: true
1685          Object.defineProperty(Object, "assign", {
1686            value: function assign(target, varArgs) { // .length of function is 2
1687              'use strict';
1688              if (target === null || target === undefined) {
1689                throw new TypeError('Cannot convert undefined or null to object');
1690              }
1691
1692              var to = Object(target);
1693
1694              for (var index = 1; index < arguments.length; index++) {
1695                var nextSource = arguments[index];
1696
1697                if (nextSource !== null && nextSource !== undefined) { 
1698                  for (var nextKey in nextSource) {
1699                    // Avoid bugs when hasOwnProperty is shadowed
1700                    if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
1701                      to[nextKey] = nextSource[nextKey];
1702                    }
1703                  }
1704                }
1705              }
1706              return to;
1707            },
1708            writable: true,
1709            configurable: true
1710          });
1711        }
1712      </script>
1712
1713      
1713<script src="https://store-themes.easystore.co/360437/themes/3809/assets/lozad.min.js?t=1787076042" type="text/javascript" ></script>
1713
1714      
1714<script>
1715        const observer = lozad('.lozad', {
1716            loaded: function(el) {
1717                // Custom implementation on a loaded element
1718                el.onload = function() {
1719                  el.classList.add('loaded');
1720                };
1721            }
1722        });
1723        observer.observe();
1724      </script>
1724
1725    
1726  
1727    
1728  
1729    
1730  
1731    
1732
1733<script src="/assets/currencies.js" type="text/javascript" ></script>
vendor: 1 bytes, line 1733
1733
1734<script src="/assets/jquery.currencies.min.js" type="text/javascript" ></script>
vendor: 1 bytes, line 1734
1734
1735<script src="/assets/currencies_format.js" type="text/javascript" ></script>
1735
1736
1737<script>
1738Currency.format = "money_with_currency_format";
1739var shopCurrency = 'MYR';
1740var selectedCurrency = '';
1741
1742
1743  Currency.convert = function(amount, from, to) {
1744    return amount;
1745  };
1746
1747  
1748if( $.cookie("currency") == null ){
1749  
1750  if( selectedCurrency != false ) {
1751
1752  Currency.convertAll(shopCurrency, selectedCurrency);
1753  jQuery('.selected-currency').text(Currency.currentCurrency);  
1754
1755  }
1756
1757}
1758
1759/* Sometimes merchants change their shop currency, let's tell our JavaScript file */
1760// Currency.moneyFormats[shopCurrency].money_with_currency_format = "";
1761// Currency.moneyFormats[shopCurrency].money_format = "RM {{amount}} ";
1762  
1763/* Default currency */
1764var defaultCurrency = 'MYR';
1765  
1766/* Cookie currency */
1767var cookieCurrency = Currency.cookie.read();
1768
1769  cookieCurrency = shopCurrency;
1770
1771$("input[name=current_currency]").val(cookieCurrency);
1772if(cookieCurrency == null){
1773  cookieCurrency = shopCurrency;
1774  Currency.cookie.write(shopCurrency);
1775}
1776/* Fix for customer account pages */
1777jQuery('span.money span.money').each(function() {
1778  jQuery(this).parents('span.money').removeClass('money');
1779});
1780/* Saving the current price */
1781jQuery('span.money').each(function() {
1782  jQuery(this).attr('data-currency-MYR', jQuery(this).html());
1783});
1784// If there's no cookie.
1785if (cookieCurrency == null) {
1786  if (shopCurrency !== defaultCurrency) {
1787    Currency.convertAll(shopCurrency, defaultCurrency);
1788  }
1789  else {
1790    Currency.currentCurrency = defaultCurrency;
1791  }
1792}
1793// If the cookie value does not correspond to any value in the currency dropdown.
1794else if (jQuery('[name=currencies]').size() && jQuery('[name=currencies] option[value=' + cookieCurrency + ']').size() === 0) {
1795  Currency.currentCurrency = shopCurrency;
1796  Currency.cookie.write(shopCurrency);
1797}
1798else if (cookieCurrency === shopCurrency) {
1799  Currency.currentCurrency = shopCurrency;
1800  Currency.convertAll(shopCurrency, cookieCurrency);
1801}
1802else {
1803  Currency.convertAll(shopCurrency, cookieCurrency);
1804}
1805jQuery('[name=currencies]').val(Currency.currentCurrency).change(function() {
1806  var newCurrency = jQuery(this).val();
1807  
1808  
1809    Currency.cookie.write(newCurrency)
1810    if ('store-locator' == 'cart') {
1811      const params = new URLSearchParams(window.location.search);
1812      params.set('delete_cache', 1);
1813      window.location.search = params;
1814    } else {
1815      window.location.reload();
1816    }
1817  
1818});
1819var original_selectCallback = window.selectCallback;
1820var selectCallback = function(variant, selector) {
1821  var currencies = null;
1822  original_selectCallback(variant, selector);
1823  if(typeof jQuery('[name=currencies]').val() == "undefined"){
1824    currencies = shopCurrency;
1825  }
1826  else{
1827    currencies = jQuery('[name=currencies]').val();
1828  }
1829  Currency.convertAll(shopCurrency, currencies);
1830  jQuery('.selected-currency').text(Currency.currentCurrency);
1831};
1832$('body').on('ajaxCart.afterCartLoad', function(cart) {
1833  Currency.convertAll(shopCurrency, jQuery('[name=currencies]').val());
1834  jQuery('.selected-currency').text(Currency.currentCurrency);  
1835});
1836jQuery('.selected-currency').text(Currency.currentCurrency);
1837</script>
1837
1838
1839
1840  
1840<script>
1841
1842  /*
1843
1844    ------
1845    Events
1846    ------
1847
1848    pages/viewed
1849
1850    customers/signup
1851
1852    customers/login
1853
1854    products/searched
1855
1856    collections/viewed
1857
1858    products/viewed
1859
1860    products/shared
1861
1862    wishlists/item_added
1863
1864    carts/items_added
1865
1866    carts/viewed
1867
1868    carts/item_removed
1869
1870    checkouts/initiated
1871
1872    checkouts/shipping_info_added
1873
1874    checkouts/payment_info_added
1875
1876    checkouts/completed
1877
1878    orders/placed
1879
1880    orders/purchased
1881
1882    payments/captured
1883
1884    payments/failed
1885
1886  */
1887
1888  window.__latest_cart = window.__latest_cart || null;
1889
1890  const _selector = document.querySelector.bind(document),
1891        _selectorAll = document.querySelectorAll.bind(document)
1892
1893  document.addEventListener('DOMContentLoaded', (event) => {
1894
1895    const default_currency = getCookie("currency")
1896    const customer_id = window.__st.cid
1897    const template    = window.__st.p
1898
1899    onPageView()
1900
1901    //-----------------------//
1902    //        Configs        //
1903    //-----------------------//
1904
1905    window.dataLayer = window.dataLayer || []
1906
1907    Array.prototype.last = Array.prototype.last || function() {
1908      return this[this.length - 1] || null
1909    }
1910
1911    Array.prototype.first = Array.prototype.first || function() {
1912      return this[0] || null
1913    }
1914
1915    //----------------------//
1916    //       Triggers       //
1917    //----------------------//
1918
1919    const XHR = window.XMLHttpRequest
1920
1921    function xhr() {
1922
1923      const xhr = new XHR()
1924
1925      xhr.addEventListener("readystatechange", function() {
1926
1927        if(xhr.readyState != 4) return
1928
1929        try {
1930
1931          const response_url = xhr.responseURL
1932
1933          if (response_url.includes("cart/add")) {
1934
1935            window.__latest_cart = JSON.parse(xhr.response)
1936
1937            onCartItemsAdded() // ok
1938
1939          }
1940
1941          if (response_url.includes("cart/remove_item_quantity")) {
1942
1943            window.__latest_cart = JSON.parse(xhr.response)
1944
1945            onCartItemRemoved() // ok
1946
1947          }
1948
1949          if (response_url.includes("new_cart?retrieve=true")) {
1950
1951            result = JSON.parse(xhr.response)
1952
1953            if (result.cart) {
1954              window.__latest_cart = result.cart
1955            }
1956
1957          }
1958
1959        } catch(e) {
1960
1961          console.error(e)
1962
1963        }
1964
1965      }, false);
1966
1967      return xhr
1968
1969    }
1970
1971    window.XMLHttpRequest = xhr
1972
1973    switch(template) {
1974
1975      case 'cart': onCartView() // ok
1976      break
1977      case 'product': onProductView() // ok
1978      break
1979      case 'collection': onCollectionView() // ok
1980      break
1981      case 'blog': onBlogView()
1982      break
1983      case 'article': onArticleView()
1984      break
1985      case 'payment_completed': onOrderPlace()
1986      break
1987      case 'payment_fail': onPaymentFail()
1988      break
1989
1990    }
1991
1992    // _selector('form[action="/checkout/payments"]').addEventListener("submit", onPaymentInfoAdded(_selector('form[action="/checkout/payments"]')))
1993    if (_selector('form[action="/checkout/detail"]'))                            _selector('form[action="/checkout/detail"]').addEventListener("submit", ()=>{onShippingInfoAdded(_selector('form[action="/checkout/detail"]'))})  // ok
1994    if (_selector('form[action="/checkout/shipping"]'))                          _selector('form[action="/checkout/shipping"]').addEventListener("submit", ()=>{onShippingInfoAdded(_selector('form[action="/checkout/shipping"]'))})  // ok
1995    if (_selector('form[action="/account/register"]'))                           _selector('form[action="/account/register"]').addEventListener("submit", onSignUp)  // ok
1996    if (_selector('form[action="/account/login"]'))                              _selector('form[action="/account/login"]').addEventListener("submit", onLogin)  // ok
1997    if (_selector('form[action="/search"]'))                                     _selector('form[action="/search"]').addEventListener("submit", onProductSearch()) // ok
1998    if (_selector('#line-login-btn'))                                            _selector('#line-login-btn').addEventListener('click', onLineLogin) // ok
1999    if (_selector('#PlaceOrder'))                                                _selector('#PlaceOrder').addEventListener("click", ()=>{onCheckoutComplete(_selector('form[action="/checkout/payments"]'))});  // ok
2000    if (_selector('#add_wishlist'))                                              _selector('#add_wishlist').addEventListener("click", onWishlistItemAdded) // ok
2001    if (_selectorAll('a[href="/account/logout"]'))                               _selectorAll('a[href="/account/logout"]').forEach(logoutButton => logoutButton.addEventListener("click", onLogout)) // ok
2002    if (_selector('.CartDrawerTrigger.cart-page-link'))                          _selector('.CartDrawerTrigger.cart-page-link').addEventListener("click", onCartView) // ok
2003    if (_selector('.CartDrawerTrigger.cart-page-link.mobile-cart-page-link'))    _selector('.CartDrawerTrigger.cart-page-link.mobile-cart-page-link').addEventListener("click", onCartView) // ok
2004    if (_selectorAll('a[class^="share-"]'))                                      _selectorAll('a[class^="share-"]').forEach(shareButton => shareButton.addEventListener("click", ()=>{onProductShare(shareButton)}) ) // ok
2005    if (_selectorAll('[name$="checkout"]'))                                      _selectorAll('[name$="checkout"]').forEach(checkoutButton => checkoutButton.addEventListener("click", onCheckoutInitiate))
2006
2007    // For append elements
2008    const bodyMutationObserver = new MutationObserver(() => {
2009      if (_selector('#form__spc #PlaceOrder'))             _selector('#form__spc #PlaceOrder').addEventListener("click", onSinglePageCheckout) // ok
2010      if (_selectorAll('[name$="checkout"]'))              _selectorAll('[name$="checkout"]').forEach(checkoutButton => checkoutButton.addEventListener("click", onCheckoutInitiate))
2011    });
2012    bodyMutationObserver.observe(_selector("body"), {subtree: true, childList: true});
2013
2014    //------------------------------//
2015    //        Event handlers        //
2016    //------------------------------//
2017
2018    function onPageView() {
2019
2020      EasyStore.Event.dispatch('pages/viewed', {
2021        page: {
2022          type: template,
2023          title: document.title,
2024          description: _selector('meta[name=description]') ? _selector('meta[name=description]').getAttribute('content') : null,
2025          url: location.href,
2026        }
2027      })
2028
2029    }
2030
2031    function onSignUp() {
2032
2033      const email_regex = new RegExp(/^[a-zA-Z0-9.!#$%&"*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/)
2034      const phone_regex = new RegExp(/^(\+?6?01)[0-46-9]-*[0-9]{7,8}$/)
2035
2036      const email_or_phone = _selector(`input[name="customer[email_or_phone]"]`).value.replace("+", "").replace(/\s+/, "")
2037
2038      let data = {}
2039
2040      if (email_regex.test(email_or_phone)) {
2041        data.method = 'email'
2042        data.email = email_or_phone
2043      }
2044
2045      if (phone_regex.test(email_or_phone)) {
2046        data.method = "phone"
2047        data.phone = email_or_phone
2048      }
2049
2050      if (!data.method) return
2051
2052      EasyStore.Event.dispatch('customers/signup', data)
2053
2054    }
2055
2056    function onLogin() {
2057
2058      const email_regex = new RegExp(/^[a-zA-Z0-9.!#$%&"*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/)
2059      const phone_regex = new RegExp(/^(\+?6?01)[0-46-9]-*[0-9]{7,8}$/)
2060
2061      const email_or_phone = _selector(`input[name="customer[email_or_phone]"]`).value.replace("+", "").replace(/\s+/, "")
2062
2063      let data = {}
2064
2065      if (email_regex.test(email_or_phone)) {
2066        data.method = 'email'
2067        data.email = email_or_phone
2068      }
2069
2070      if (phone_regex.test(email_or_phone)) {
2071        data.method = "phone"
2072        data.phone = email_or_phone
2073      }
2074
2075      if (!data.method) return
2076
2077      EasyStore.Event.dispatch('customers/login', data)
2078
2079    }
2080
2081    function onLineLogin() {
2082
2083      EasyStore.Event.dispatch('customers/login', { method: 'line' })
2084
2085    }
2086
2087    function onLogout() {
2088
2089      EasyStore.Event.dispatch('customers/logout', { customer_id })
2090
2091    }
2092
2093    function onBlogView() {
2094
2095      const blog = ""
2096
2097      EasyStore.Event.dispatch('blogs/viewed', { blog })
2098
2099    }
2100
2101    function onArticleView() {
2102
2103      const article = ""
2104
2105      EasyStore.Event.dispatch('articles/viewed', { article })
2106
2107    }
2108
2109    function onProductSearch() {
2110
2111      const query = _selector('input[name=q]').value
2112
2113      if (!query) return
2114
2115      EasyStore.Event.dispatch('products/searched', { query })
2116
2117    }
2118
2119    function onCollectionView() {
2120
2121      const collection = ""
2122
2123      EasyStore.Event.dispatch('collections/viewed', { collection })
2124
2125    }
2126
2127    function onProductView() {
2128
2129      const product = ""
2130
2131      EasyStore.Event.dispatch("products/viewed", { product })
2132
2133    }
2134
2135    function onProductShare(el) {
2136
2137      const product = ""
2138
2139      const channel = el.getAttribute("class").split("-").last()
2140
2141      EasyStore.Event.dispatch('products/shared', { product, channel })
2142
2143    }
2144
2145    function onWishlistItemAdded() {
2146
2147      let product  = ""
2148      const quantity = _selector("#Quantity").value
2149
2150      EasyStore.Event.dispatch('wishlists/item_added', { product })
2151
2152    }
2153
2154    async function onCartItemsAdded() {
2155
2156      const cart = await getCart()
2157
2158      if(cart && cart.items != undefined && cart.items.length > 0) {
2159
2160        EasyStore.Event.dispatch('carts/item_added', { cart })
2161
2162      }
2163
2164    }
2165
2166    async function onCartView() {
2167
2168      const cart = await getCart()
2169
2170      EasyStore.Event.dispatch('carts/viewed', { cart })
2171
2172    }
2173
2174    async function onCartItemRemoved() {
2175
2176      const cart = await getCart()
2177
2178      cart.items = []
2179
2180      if(cart) {
2181
2182        EasyStore.Event.dispatch('carts/item_removed', { cart })
2183
2184      }
2185
2186    }
2187
2188    async function onCheckoutInitiate() {
2189
2190      const cart = await getCart()
2191
2192      EasyStore.Event.dispatch('checkouts/initiated', { cart })
2193
2194    }
2195
2196    async function onShippingInfoAdded(form) {
2197      let checkout = getCheckout()
2198
2199      let form_data = {}
2200      new FormData(form).forEach((value, key) => form_data[key] = value)
2201
2202      let shipping_tier = null
2203
2204      if (form_data.type && form_data.type.startsWith("r_pickup")) {
2205        shipping_tier = `Pickup - ${form_data.pick_location}`
2206      }
2207
2208      if (form_data.s_id) {
2209        shipping_tier = _selector(`input[id='`+form_data.s_id+`']`).getAttribute("data-shipping-name")
2210      }
2211
2212      if (!shipping_tier) return
2213
2214      EasyStore.Event.dispatch('checkouts/shipping_info_added', { checkout, shipping_tier })
2215
2216    }
2217
2218    async function onPaymentInfoAdded(form) {
2219
2220      let checkout = getCheckout()
2221
2222      let payment_type = new FormData(form).get('payment_method')
2223
2224      EasyStore.Event.dispatch("checkouts/payment_info_added", { checkout, payment_type })
2225
2226    }
2227
2228    async function onOrderPlace() {
2229
2230      let cart_token  = getCookie("cart_js")
2231      let previous_cart_token = getCookie("previous_cart_ga4_js")
2232
2233      if (previous_cart_token && previous_cart_token == cart_token) {
2234        // Prevent duplicate purchase tracking
2235        return
2236      }
2237
2238      let order = getOrder()
2239
2240      EasyStore.Event.dispatch('orders/placed', { order })
2241
2242      if(order.is_manual_payment) {
2243
2244        EasyStore.Event.dispatch('orders/purchased', { order })
2245
2246      }
2247
2248      const last_transaction = order.transactions.last()
2249
2250      if (last_transaction.status) {
2251
2252        EasyStore.Event.dispatch('orders/purchased', { order })
2253        EasyStore.Event.dispatch('payments/captured', { order })
2254
2255      }
2256
2257    }
2258
2259    async function onPaymentFail() {
2260
2261      const order = getOrder()
2262
2263      EasyStore.Event.dispatch('payments/failed', { order })
2264
2265    }
2266
2267    async function onCheckoutComplete(form) {
2268
2269      onPaymentInfoAdded(form)
2270
2271      const checkout = getCheckout()
2272
2273      EasyStore.Event.dispatch('checkouts/completed', { checkout })
2274
2275    }
2276
2277    async function onSinglePageCheckout() {
2278
2279      // let checkout = $("[data-app-checkout]").data("app-checkout")
2280
2281      let checkout = getCheckout()
2282
2283      // const payment_type = _selector("#app_spc_payment_method").find(`[class*="label-content"]`).first().find("b").first().text()
2284      const payment_type = _selector("#app_spc_payment_method").getElementsByClassName('label-content')[0].getElementsByTagName('b')[0].innerHTML
2285
2286      const shipping_method = _selector("#delivery_method").value
2287
2288      let shipping_tier = null
2289      let app_spc_customer_info_label = _selector("#app_spc_customer_info").getElementsByClassName('label-content')
2290      if (shipping_method == "shipping") {
2291        shipping_tier = app_spc_customer_info_label[app_spc_customer_info_label.length - 1].getElementsByTagName('b')[0].innerHTML
2292      }
2293
2294      if (shipping_method == "pickup") {
2295        shipping_tier = app_spc_customer_info_label[0].innerHTML
2296      }
2297
2298      if (shipping_tier) {
2299
2300        EasyStore.Event.dispatch('checkouts/shipping_info_added', {
2301          checkout,
2302          shipping_tier,
2303        })
2304
2305      }
2306
2307      if (payment_type) {
2308
2309        EasyStore.Event.dispatch('checkouts/payment_info_added', {
2310          checkout,
2311          payment_type,
2312        })
2313
2314      }
2315
2316      EasyStore.Event.dispatch('checkouts/completed', { checkout })
2317
2318    }
2319
2320  })
2321
2322
2323  //-----------------------//
2324  //       Functions       //
2325  //-----------------------//
2326
2327  function getCookie(name) {
2328
2329    name += "="
2330
2331    decodedCookie = decodeURIComponent(document.cookie)
2332
2333    ca = decodedCookie.split(";")
2334
2335    for(i = 0; i < ca.length; i++) {
2336      c = ca[i]
2337      while (c.charAt(0) == " ") {
2338        c = c.substring(1)
2339      }
2340      if (c.indexOf(name) == 0) {
2341        return c.substring(name.length, c.length)
2342      }
2343    }
2344
2345    return ""
2346
2347  }
2348
2349  const parsePrice = price => {
2350    if(typeof price === 'string') {
2351      return parseFloat(price.split(',').join(''))
2352    }
2353
2354    return price
2355  }
2356
2357  const requestCart = async (method, data) => {
2358
2359  let response = await fetch('/cart.json', {method: 'GET',headers: {'Content-Type': 'application/json'}})
2360    result = await response.json()
2361
2362    return result.cart
2363
2364  }
2365  const getCart = async (latest = false) => {
2366
2367    let cart = window.__latest_cart
2368
2369    const cart_invalid = !cart || !cart.items || (cart.total_price > 0 && !cart.items.length)
2370
2371    if(latest || cart_invalid) {
2372      cart = await requestCart()
2373    }
2374
2375    cart.items = cart.items || []
2376
2377    return mapCart(cart)
2378
2379  }
2380
2381  const getCheckout = async () => {
2382    mapCheckout(window.__latest_cart || await requestCart())
2383  }
2384
2385  const getOrder = async () => {
2386    mapOrder(window.__latest_cart || await requestCart())
2387  }
2388
2389  //-----------------------//
2390  //        Mappers        //
2391  //-----------------------//
2392
2393  const fallbackAttribute = (object, attribute) => {
2394
2395    if(!Array.isArray(attribute)) {
2396      attribute = [attribute]
2397    }
2398
2399    let final_value = null
2400
2401    do {
2402
2403      final_value = object[attribute.shift()]
2404
2405    } while(!final_value && attribute.length)
2406
2407    return final_value
2408
2409  }
2410
2411  const map = (object, mapper) => {
2412
2413    const newObject = {}
2414
2415    for(const key in mapper) {
2416
2417      // Handle different keys between new and old format
2418      newObject[key] = fallbackAttribute(object, mapper[key])
2419
2420      // Cast price to float
2421      if(newObject[key] && ['price', 'amount', 'discount', 'discounts'].some(x => key.endsWith(x))) {
2422        newObject[key] = parsePrice(newObject[key])
2423      }
2424
2425      if(newObject[key] === undefined) {
2426        delete newObject[key]
2427      }
2428
2429    }
2430
2431    return newObject
2432
2433  }
2434
2435  const mapCart = cart => {
2436
2437    const oldCart = cart
2438
2439    const mapper = {
2440      id: 'id',
2441      currency: 'currency',
2442      item_count: 'item_count',
2443      items: 'items',
2444      total_price: 'total_price',
2445      latest_items: 'latest_items'
2446    }
2447
2448    cart = map(cart, mapper)
2449
2450    const discounts = (oldCart.storewide_discounts || []).concat((oldCart.voucher_discounts || []))
2451
2452    cart.discount_applications = discounts.map(discount => ({
2453      title: discount.voucher_code || null,
2454      value: parsePrice(discount.amount),
2455    }))
2456
2457    cart.original_total_price = cart.items.length
2458    ? cart.items
2459      .map(item => item.original_price)
2460      .reduce((sum, price) => sum + price)
2461    : 0
2462
2463    cart.total_discount = cart.discount_applications.length
2464    ? cart.discount_applications
2465      .map(discount => parsePrice(discount.value))
2466      .reduce((sum, value) => sum + value)
2467    : 0
2468
2469    cart.items = cart.items.map(item => mapLineItem(item))
2470
2471    return cart
2472
2473  }
2474
2475  const mapCheckout = checkout => {
2476
2477    const mapper = {
2478      note: 'note',
2479      attributes: 'note_attributes',
2480      billing_address: 'billing_address',
2481      currency: 'currency',
2482      customer_id: 'customer_id',
2483      discounts_amount: 'total_discount',
2484      id: 'id',
2485      line_items: 'order_item',
2486      order_number: 'order_number',
2487      shipping_address: 'shipping_address',
2488      shipping_price: 'shipping_tax',
2489      shipping_method: 'shipping_method_name',
2490      tax_price: 'total_tax',
2491    }
2492
2493    checkout = map(checkout, mapper)
2494
2495    checkout.requires_shipping = checkout.line_items.some(item => item.shipping_required)
2496
2497    checkout.line_items = checkout.line_items.map(item => mapLineItem(item))
2498
2499    return checkout
2500
2501  }
2502
2503  const mapOrder = order => {
2504
2505    const mapper = {
2506      attributes: 'note_attributes',
2507      billing_address: 'billing_address',
2508      cancelled: 'is_cancelled',
2509      cancelled_at: 'cancelled_at',
2510      created_at: 'created_at',
2511      customer_id: 'customer_id',
2512      // discount_applications: 'discount_applications',
2513      email: 'email',
2514      financial_status: 'financial_status',
2515      fulfillment_status: 'fulfillment_status',
2516      line_items: 'order_item',
2517      note: 'note',
2518      order_number: 'order_number',
2519      phone: 'phone',
2520      shipping_address: 'shipping_address',
2521      shipping_methods: 'shipping_methods',
2522      shipping_price: 'total_shipping',
2523      subtotal_price: 'subtotal_price',
2524      // tax_lines: 'tax_lines',
2525      tax_price: 'total_tax',
2526      total_discounts: 'total_discount',
2527      total_net_amount: 'total_amount_include_transaction',
2528      total_price: 'total_price',
2529      transactions: 'transaction_records',
2530      is_manual_payment: 'is_manual_payment',
2531    }
2532
2533    order.email = order.billing_address.email
2534    order.phone = order.billing_address.phone
2535    order.shipping_method = order.shipping_method_name
2536
2537    order = map(order, mapper)
2538
2539    order.line_items = order.line_items.map(item => mapLineItem(item))
2540    order.transactions = order.transactions.map(transaction => mapTransaction(transaction))
2541
2542    return order
2543
2544  }
2545
2546  const mapLineItem = line_item => {
2547
2548    const old_line_item = line_item
2549
2550    const mapper = {
2551      final_price: 'price',
2552      image: 'img_url',
2553      message: 'message',
2554      original_line_price: 'original_line_price',
2555      original_price: 'original_price',
2556      properties: 'properties',
2557      quantity: 'quantity',
2558      requires_shipping: 'shipping_required',
2559      sku: 'sku',
2560      taxable: 'taxable',
2561      title: 'product_name',
2562      product_name: 'product_name',
2563      url: 'url',
2564      product_id: 'product_id',
2565      variant_id: 'variant_id',
2566      id: ['id', 'i_id'],
2567    }
2568
2569    line_item = map(line_item, mapper)
2570
2571    line_item.product_id = line_item.product_id || (old_line_item.product && old_line_item.product.id) || null
2572    line_item.variant_id = line_item.variant_id || (old_line_item.variant && old_line_item.variant.id) || null
2573    line_item.image      = line_item.image || (old_line_item.image && old_line_item.image.url) || null
2574
2575    return line_item
2576
2577  }
2578
2579  const mapTransaction = transaction => {
2580
2581    const mapper = {
2582      amount: 'amount',
2583      created_at: 'created_at',
2584      gateway: 'gateway_type',
2585      id: 'id',
2586      status: 'status',
2587    }
2588
2589    transaction = map(transaction, mapper)
2590
2591    return transaction
2592
2593  }
2594
2595
2596</script>
2596
2597
2598</div>
2599
2600  
2601    <div id="CartDrawer" class="cart-drawer" data-fetch="0">
2602  
2603
2604  <div class="cart-drawer-wrapper">
2605    <div id="cart-promotion-top"></div>
2606
2607
2608    <div id="CartTemplate">
2609      
2610
2611  
2612
2613  <div id="noCartItem" class="cart-drawer-content">
2614    <div class="cart-drawer-content-wrapper text-center">
2615      <div class="section-header">
2616        <span></span>
2617        <span class="CartDrawerTrigger icon icon-x"></span>
2618      </div>
2619      <div class="section-header__title h2">Your cart is currently empty.</div>
2620      <a class="btn btn--secondary" href="/collections/all">Continue shopping</a>
2621    </div>
2622  </div>
2623
2624
2625
2626
2627    </div>
2628
2629    <link href="/assets/css/promotion.css?v2.94" rel="stylesheet" type="text/css" media="screen" />
2630<div id="cart-promotion-section"></div>
2631
2632<script>var shop_money_format = "<span class=money data-ori-price='{{amount}}'>RM {{amount}} </span>";</script>
vendor: 1 bytes, line 2632
2632
2633<script src="/assets/js/promotion/promotion.js?v1.11" type="text/javascript"></script>
2633
2634
2635<script>
2636
2637    window.EasyStore = window.EasyStore || {};
2638    window.EasyStore.Promotion = window.EasyStore.Promotion || {};
2639
2640    var get_cart_promo_initial = false,
2641        current_template = 'store-locator';
2642
2643    window.EasyStore.Promotion.updateCartPromotion = function (){
2644        get_cart_promo_initial = true
2645        $.ajax({
2646        type: "GET",
2647        dataType: 'json',
2648        url: "/new_cart/promotion",
2649        success: function(response){
2650            $("#cart-promotion-section").html(response["cart/content_bottom"].trim());
2651            $("#cart-promotion-top").html(response["cart/content_top"].trim());
2652
2653            promoVariantDetailInitial()
2654        },
2655        error: function(xhr){
2656        }
2657        });
2658    }
2659
2660
2661    if(current_template == 'cart') {
2662        document.addEventListener("DOMContentLoaded", function() {
2663            window.EasyStore.Promotion.updateCartPromotion()
2664        });
2665    }
2666
2667</script>
vendor: 1 bytes, line 2667
2667
2668<script>
2669  document.addEventListener('DOMContentLoaded', function () {
2670    window._getVoucherErrorTranslation = Object.assign(window._getVoucherErrorTranslation || {}, {
2671      "condition_not_matched":    "Voucher condition not matched",
2672      "promotion_unavailable":    "This promotion is currently unavailable",
2673      "available_on":             "Available on channels",
2674      "available_on_only":        "Available on channels only",
2675      "available_with_locations": "Available on channels (locations only)",
2676      "pos_at_locations":         "Retail Store at locations only",
2677      "channel_website":          "Website",
2678      "channel_mobile":           "Mobile Apps",
2679      "channel_pos":              "Retail Store"
2680    });
2681  });
2682</script>
2682
2683
2684  </div>
2685  
2686
2687  
2688</div>
2689
2690<div id="toast"><div id="toastContent"></div></div>
2691<style>
2692  .cart-drawer .cart-drawer-content .cart-sticky-button-wrapper a.btn.CartDrawerTrigger{margin-bottom: 10px !important;}
2693  #toastContent a{color: #fff;text-decoration: underline;margin-top: 10px;display: block;}
2694  #toastContent .svg-icon{margin-right: 8px;margin-top: -1px;}
2695</style>
2696
2697<script type="text/javascript">
2698  $('body').on("submit", "#CartForm", function() {
2699    $(this).find('[type=submit]').addClass('btn--loading');
2700  });
2701  
2702  $("input[name=current_currency]").val($( "select.currency-picker" ).val());
2703  $( "select.currency-picker" ).change(function(){
2704    $("select.currency-picker").val($(this).val());
2705    url=window.location.href;
2706    newParam="currency=" + $( "select.currency-picker" ).val();
2707    if(url.indexOf("currency=")===-1){
2708      separator = (url.indexOf("?")===-1)?"?":"&";
2709      newUrl= url + separator + newParam;
2710    }else{
2711      oldParam= new URL(url);
2712      oldParam = oldParam.searchParams.get("currency");
2713      newParam= $(this).val();
2714      newUrl=url.replace(oldParam,newParam);
2715    }
2716    $("input[name=current_currency]").val($( "select.currency-picker" ).val());
2717    // window.location.href =newUrl;
2718    $('#CartDrawer').attr('data-fetch', 0);
2719  });
2720
2721  $("body").on("click", ".cart__remove", function() {
2722    $('#CartTemplate').addClass('is-loading');
2723    $.ajax({
2724      type: 'POST',
2725      url: '/cart/remove_item_quantity',
2726      data: {
2727        variant_id: $(this).data( "variant-id"),
2728        item_id: $(this).data( "item-id"),
2729        quantity: $(this).data( "quantity"),
2730        i_id: $(this).data("i_id"),
2731      },
2732      dataType: 'json',
2733      success: function(response){
2734
2735        theme.cartDrawer(response);
2736        $('#CartTemplate').removeClass('is-loading');
2737
2738        if (window.checkProductProperties !== undefined){
2739          window.checkProductProperties();
2740        }
2741      },
2742      error: function(xhr){
2743        console.log('error',xhr);
2744        $('#CartTemplate').removeClass('is-loading');
2745      }
2746    });
2747
2748  });
2749
2750
2751  $('body').on("click", "#applycode",function() {
2752    
2753    if($("input[name='voucher_code']").val() != '') {
2754
2755      $('#CartTemplate').addClass('is-loading');
2756
2757      $.ajax({
2758        type: 'POST',
2759        url: '/new_cart/voucher',
2760        data: {
2761          voucher_code: $("input[name='voucher_code']").val(),
2762          category: 'create'
2763        },
2764        dataType: 'json',
2765        success: function(response){
2766
2767          // console.log(response);
2768
2769          if(response.error != undefined){
2770            
2771            if(response.error.message != undefined) popToast(response.error.message); 
2772          
2773            $("input[name='voucher_code']").val('')
2774          
2775          } 
2776          
2777          if(response.cart_content != undefined) theme.cartDrawer(response); 
2778
2779          $('#CartTemplate').removeClass('is-loading');
2780          
2781        },
2782        error: function(xhr){
2783          console.log('error',xhr);
2784          $('#CartTemplate').removeClass('is-loading');
2785        }
2786      });
2787
2788    }
2789
2790  });
2791
2792
2793  $("body").on("click", ".remove_voucher_btn", function() {
2794        $('#CartTemplate').addClass('is-loading');
2795        $.ajax({
2796          type: 'DELETE',
2797          url: '/new_cart/voucher',
2798          data: {
2799            category: 'remove',
2800            order_discount_id: $(this).data( "discount-id")
2801          },
2802          dataType: 'json',
2803          success: function(data){
2804            // console.log(data);
2805            theme.cartDrawer(data);
2806            $('#CartTemplate').removeClass('is-loading');
2807          },
2808          error: function(xhr){
2809            console.log('error',xhr);
2810            $('#CartTemplate').removeClass('is-loading');
2811          }
2812        });
2813
2814    });
2815  
2816
2817  theme.cartDrawer = function(data){
2818    
2819      $('#CartDrawer').attr('data-fetch', 1);
2820      $('#CartTemplate').addClass('is-loading');
2821
2822      
2823      if(typeof data.cart_content  == 'string'){
2824        $('#CartTemplate').html(data.cart_content);
2825      }
2826
2827      let cart_item_count = data.item_count || data.cart.item_count;
2828
2829      if(cart_item_count > 0){
2830        $('.cart-count').removeClass('hidden-count');
2831      }else{
2832        $('.cart-count').addClass('hidden-count');
2833      }
2834
2835      $('.cart-count').text(cart_item_count);
2836      $('#CartTemplate').removeClass('is-loading');
2837      $(".cart-drawer-content").animate({ scrollTop: 0 });
2838
2839      if(window.EasyStore != undefined && window.EasyStore.Promotion != undefined && window.EasyStore.Promotion.updateCartPromotion != undefined) window.EasyStore.Promotion.updateCartPromotion()
2840
2841  }
2842
2843
2844  theme.fetchCartDrawer = function(data){
2845      $('#CartTemplate').addClass('is-loading');
2846      $.ajax({
2847        url: '/new_cart?retrieve=true',
2848        type: 'GET',
2849        success: function(data, status) {
2850          // console.log(data);
2851          theme.cartDrawer(data);
2852
2853          $('#CartTemplate').removeClass('is-loading');
2854
2855          if (window.checkProductProperties !== undefined){
2856            window.checkProductProperties();
2857          }
2858        },
2859        error: function(XMLHttpRequest, textStatus) {
2860          console.log('error',XMLHttpRequest,textStatus);
2861          $('#CartTemplate').removeClass('is-loading');
2862        }
2863      });
2864  }
2865
2866  theme.updateCartDrawer = function(data){
2867    $('#CartTemplate').addClass('is-loading');
2868
2869    $.ajax({
2870      url: '/new_cart/update',
2871      type: 'PUT',
2872      dataType: 'json',
2873      data: $('#CartDrawer form').serialize(),
2874      success: function(data, status) {
2875        theme.cartDrawer(data);
2876
2877        if (window.checkProductProperties !== undefined){
2878          window.checkProductProperties();
2879        }
2880      },
2881      error: function(XMLHttpRequest, textStatus) {
2882        console.log('error',XMLHttpRequest,textStatus);
2883      }
2884    });
2885  }
2886
2887  function debounce(func, wait, immediate) {
2888    var timeout;
2889    return function() {
2890        var context = this, args = arguments;
2891        var later = function() {
2892            timeout = null;
2893            if (!immediate) func.apply(context, args);
2894        };
2895        var callNow = immediate && !timeout;
2896        clearTimeout(timeout);
2897        timeout = setTimeout(later, wait);
2898        if (callNow) func.apply(context, args);
2899    };
2900  };
2901
2902  $('body').on("change", 'input.cart__quantity-selector', function (){
2903    theme.updateCartDrawer();
2904  });
2905
2906
2907  $('#updateCartDrawer').click(function() {
2908    theme.updateCartDrawer();
2909  });
2910
2911  $('body').on("click", ".btn-qty-adjust", function() {
2912
2913    var $button = $(this);
2914    var oldValue = $button.parent().find("input.cart__quantity-selector").val();
2915
2916    if ($button.attr('data-adjust') == 1) {
2917      var newVal = parseFloat(oldValue) + 1;
2918    } else {
2919    // Don't allow decrementing below zero
2920      if (oldValue > 0) {
2921        var newVal = parseFloat(oldValue) - 1;
2922      } else {
2923        newVal = 0;
2924      }
2925    }
2926
2927    $button.parent().find("input").val(newVal);
2928  });
2929    
2930  $('body').on("click", ".btn-qty-adjust", debounce(function() {
2931    theme.updateCartDrawer();
2932  },350));
2933
2934  $('button.checkout').click(function() {
2935    $(this).addClass('btn--loading');
2936  });
2937
2938  var add_cart_success_html = '<svg class="svg-icon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve"> <g> <g> <path d="M383.841,171.838c-7.881-8.31-21.02-8.676-29.343-0.775L221.987,296.732l-63.204-64.893 c-8.005-8.213-21.13-8.393-29.35-0.387c-8.213,7.998-8.386,21.137-0.388,29.35l77.492,79.561 c4.061,4.172,9.458,6.275,14.869,6.275c5.134,0,10.268-1.896,14.288-5.694l147.373-139.762 C391.383,193.294,391.735,180.155,383.841,171.838z"/> </g> </g> <g> <g> <path d="M256,0C114.84,0,0,114.84,0,256s114.84,256,256,256s256-114.84,256-256S397.16,0,256,0z M256,470.487 c-118.265,0-214.487-96.214-214.487-214.487c0-118.265,96.221-214.487,214.487-214.487c118.272,0,214.487,96.221,214.487,214.487 C470.487,374.272,374.272,470.487,256,470.487z"/> </g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> </svg>';
2939      add_cart_success_html += 'Added to cart <br><a class="CartDrawerTrigger">View cart</a>';
2940
2941  function popToast(content) {
2942    var x = document.getElementById("toast"),
2943        y = document.getElementById("toastContent");
2944
2945    y.innerHTML = content;
2946    x.className += " show";
2947    
2948    var hideToast = setTimeout(function(){ x.className = x.className.replace(" show", ""); }, 3000);
2949  }
2950
2951
2952</script>
2952
2953
2954<style>
2955  vouchers-modal .vouchers-modal.active ,
2956  vouchers-modal #vouchers-modal-backdrop.active{
2957    z-index: 2147483647;
2958  }
2959</style>
2960
2961<link href="/assets/css/vouchers.css?v1.2" rel="stylesheet" type="text/css" media="screen" />
2962<link href="/assets/account/vouchers/vouchers.css" rel="stylesheet" type="text/css" media="screen" />
2963<link href="/assets/account/vouchers/voucher-widget.css" rel="stylesheet" type="text/css" media="screen" />
2964<script src="/assets/js/promotion/vouchers.js?v1.3" type="text/javascript" ></script>
vendor: 1 bytes, line 2964
2964
2965<script src="/assets/account/vouchers/voucher-widget.js" type="text/javascript" ></script>
2965
2966
2967<vouchers-modal>
2968  <div id="vouchers-modal-backdrop" class="vouchers-modal__close"></div>
2969  <div class="vouchers-modal-wrapper page-width">
2970    <div id="vouchers-modal" class="vouchers-modal focus-inset" aria-modal="true" role="dialog" tabindex="-1">
2971      <div class="vouchers-modal__header">
2972        <div class="vouchers-modal__heading">Vouchers</div>
2973        <button type="button" class="vouchers-modal__close modal__close-button link link--text focus-inset" aria-label="accessibility.close">
2974          <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" role="presentation" class="icon icon-close " fill="none" viewBox="0 0 18 17">
2975            <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">
2976            </path>
2977          </svg>
2978        </button>
2979      </div>
2980
2981      <discount-input>
2982        <div class="field">
2983          <input type="text" id="input-discount_code" class="search__input field__input" name="voucher_code" placeholder="Discount code">
2984          <button type="button" name="apply" class="btn btn--secondary button button--secondary">Apply</button>
2985        </div>
2986        <div class="form__message hidden" tabindex="-1" autofocus>
2987          <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-error " viewBox="0 0 13 13">
2988            <circle cx="6.5" cy="6.50049" r="5.5" stroke="white" stroke-width="2"></circle>
2989            <circle cx="6.5" cy="6.5" r="5.5" fill="#EB001B" stroke="#EB001B" stroke-width="0.7"></circle>
2990            <path d="M5.87413 3.52832L5.97439 7.57216H7.02713L7.12739 3.52832H5.87413ZM6.50076 9.66091C6.88091 9.66091 7.18169 9.37267 7.18169 9.00504C7.18169 8.63742 6.88091 8.34917 6.50076 8.34917C6.12061 8.34917 5.81982 8.63742 5.81982 9.00504C5.81982 9.37267 6.12061 9.66091 6.50076 9.66091Z" fill="white"></path>
2991            <path d="M5.87413 3.17832H5.51535L5.52424 3.537L5.6245 7.58083L5.63296 7.92216H5.97439H7.02713H7.36856L7.37702 7.58083L7.47728 3.537L7.48617 3.17832H7.12739H5.87413ZM6.50076 10.0109C7.06121 10.0109 7.5317 9.57872 7.5317 9.00504C7.5317 8.43137 7.06121 7.99918 6.50076 7.99918C5.94031 7.99918 5.46982 8.43137 5.46982 9.00504C5.46982 9.57872 5.94031 10.0109 6.50076 10.0109Z" fill="white" stroke="#EB001B" stroke-width="0.7"></path>
2992          </svg>
2993          <div class="js-error-content"></div>
2994        </div>
2995      </discount-input>
2996      <br>
2997
2998      
2999      
3000        <div class="empty-vouchers_placeholder">No available vouchers</div>
3001      
3002
3003       <!-- For voucher widget -->
3004      
3004<script type="text/javascript">
3005        let settings = {"logo_use_image":"1","logo_img":"https:\/\/cdn.store-assets.com\/s\/360437\/f\/4829734.png?width=350&format=webp","footer_logo_img":"https:\/\/cdn.store-assets.com\/s\/360437\/f\/14326839.png?width=350&format=webp","nav_below_logo":"","logo_alignment":"center","left_aligned_logo":"0","favicon_enable":"1","favicon_img":"https:\/\/cdn.store-assets.com\/s\/360437\/f\/4829761.png","header_message":"","header_search_enable":true,"topbar_sticky":"1","footer_quicklinks_enable":true,"footer_quicklinks_linklist":"footer","footer_social_enable":"1","footer_show_credit_card_logo":0,"footer_show_methods_of_payment":0,"footer_visa":0,"footer_master":0,"footer_american_express":0,"footer_jcb":0,"footer_diners_club":0,"footer_discover":0,"footer_ssl":0,"show_footer_lines":"1","home_section_1":"img-text-section","home_section_2":"highlight-section","home_section_3":"","home_section_4":"","home_section_5":"","home_section_6":"","home_section_7":"","featured_title":"","featured_1_img":"https:\/\/cdn.store-assets.com\/s\/360437\/f\/4871780.jpeg?width=650&format=webp","featured_1_text":"","featured_1_link_text":"View More","featured_1_link":"\/collections\/top-picks","featured_2_img":"https:\/\/cdn.store-assets.com\/s\/360437\/f\/4871915.jpeg?width=650&format=webp","featured_2_text":"","featured_2_link_text":"View more","featured_2_link":"\/collections\/sweets","featured_3_img":"https:\/\/cdn.store-assets.com\/s\/360437\/f\/4871918.jpeg?width=650&format=webp","featured_3_text":"","featured_3_link_text":"View more","featured_3_link":"\/collections\/savouries","featured_4_img":"","featured_4_text":"STYLE","featured_4_link_text":"STYLE","featured_4_link":"\/collections\/style","featured_5_img":"","featured_5_text":"","featured_5_link_text":"","featured_5_link":"","featured_6_img":"","featured_6_text":"","featured_6_link_text":"","featured_6_link":"","featured_7_img":"","featured_7_text":"","featured_7_link_text":"","featured_7_link":"","featured_8_img":"","featured_8_text":"","featured_8_link_text":"","featured_8_link":"","parallax_img":"https:\/\/cdn.store-assets.com\/s\/326197\/f\/4479426.jpeg?width=1500&format=webp","parallax_mobile_img":"","parallax_title":"Sign Up for 50% OFF","parallax_subtitle":"For new member only","parallax_button_text":"Sign Up Now","parallax_button_link":"\/account\/register","parallax_full_width":"1","slider_home_auto":"1","slider_home_show_dots":"1","slider_home_rate":"4000","slider_home_transition":"slide","slider_full_screen":"0","slide_1":"1","slide_1_jpg":"https:\/\/cdn.store-assets.com\/s\/360437\/f\/4867346.jpeg?width=1500&format=webp","slide_1_mobile_jpg":"https:\/\/cdn.store-assets.com\/s\/360437\/f\/4867347.jpeg?width=900&format=webp","slide_1_link":"\/collections\/all","slide_1_alt":"","slide_1_title":"NYONYA KUIH","slide_1_subtitle":"","slide_1_button_text":"SHOP NOW","slide_2":"1","slide_2_jpg":"","slide_2_mobile_jpg":"","slide_2_link":"","slide_2_alt":"","slide_2_title":"","slide_2_subtitle":"","slide_2_button_text":"","slide_3":"","slide_3_jpg":"","slide_3_mobile_jpg":"","slide_3_link":"","slide_3_alt":"","slide_3_title":"","slide_3_subtitle":"","slide_3_button_text":"","slide_4":"","slide_4_jpg":"","slide_4_mobile_jpg":"","slide_4_link":"","slide_4_alt":"","slide_4_title":"","slide_4_subtitle":"","slide_4_button_text":"","slide_5":"","slide_5_jpg":"","slide_5_mobile_jpg":"","slide_5_link":"","slide_5_alt":"","slide_5_title":"","slide_5_subtitle":"","slide_5_button_text":"","slide_6":"","slide_6_jpg":"","slide_6_mobile_jpg":"","slide_6_link":"","slide_6_alt":"","slide_6_title":"","slide_6_subtitle":"","slide_6_button_text":"","testimonial_slide_img_crop":0,"testimonial_slide_1_img":"https:\/\/cdn.store-assets.com\/s\/278885\/f\/3915980.jpeg?width=1500&format=webp","testimonial_slide_1_title":"Aleksejs Bergmanis","testimonial_slide_1_content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur non mattis dui, sit amet hendrerit nibh. Duis congue volutpat urna ut accumsan.","testimonial_slide_1_text_link":"Read more","testimonial_slide_
30051_link":"#","testimonial_slide_2_img":"https:\/\/cdn.store-assets.com\/s\/278885\/f\/3915981.jpeg?width=1500&format=webp","testimonial_slide_2_title":"Thiago Japyassu","testimonial_slide_2_content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur non mattis dui, sit amet hendrerit nibh. Duis congue volutpat urna ut accumsan. Vivam mauris augue, ultrices at faucibus vitae, mattis eu lacus.","testimonial_slide_2_text_link":"Read more","testimonial_slide_2_link":"#","testimonial_slide_3_img":"","testimonial_slide_3_title":"","testimonial_slide_3_content":"","testimonial_slide_3_text_link":"","testimonial_slide_3_link":"","testimonial_slide_4_img":"","testimonial_slide_4_title":"","testimonial_slide_4_content":"","testimonial_slide_4_text_link":"","testimonial_slide_4_link":"","testimonial_slide_5_img":"","testimonial_slide_5_title":"","testimonial_slide_5_content":"","testimonial_slide_5_text_link":"","testimonial_slide_5_link":"","testimonial_slide_6_img":"","testimonial_slide_6_title":"","testimonial_slide_6_content":"","testimonial_slide_6_text_link":"","testimonial_slide_6_link":"","logo_list_on_footer":"1","logo_list_title":"","logo_list_1_img":"https:\/\/cdn.store-assets.com\/s\/360437\/f\/14326811.jpg?width=350&format=webp","logo_list_1_link":"\/collections\/all","logo_list_2_img":"","logo_list_2_link":"\/collections\/all","logo_list_3_img":"","logo_list_3_link":"\/collections\/all","logo_list_4_img":"","logo_list_4_link":"\/collections\/all","logo_list_5_img":"","logo_list_5_link":"\/collections\/all","logo_list_6_img":"","logo_list_6_link":"\/collections\/all","logo_list_7_img":"","logo_list_7_link":"\/collections\/all","logo_list_8_img":"","logo_list_8_link":"\/collections\/all","home_featured_products":"feature-on-homepage","home_featured_products_num":"20","home_featured_products_row_num":"7","home_featured_products_show_heading":"","home_page_content":"home","home_page_show_heading":"0","home_page_add_to_cart":"1","scroll_to_top_button":"on-left","product_quantity_enable":"1","product_image_zoom_type":"lightbox","product_thumbnails_position":"below","product_related_enable":true,"products_per_row":4,"products_list_per_row":"3","collection_products_list_per_row":"3","product_page_float_btn":"1","product_page_variants_tag":"1","featured_product_title":"Top picks","product_img_res":"grande","product_img_crop":"product_img-crop ratio_1-1","collections_show_sale_circle":"1","collections_show_sold_out_circle":"1","collections_sort_enable":true,"collections_tags_enable":"0","collections_products_per_row":"3","collections_rows":"6","footer_bar":0,"footer_bar_icon_product_page":"1","footer_bar_icon_1":"https:\/\/cdn.easystore.blue\/s\/201\/f\/5590.png?width=150&format=webp","footer_bar_icon_1_text":"Home","footer_bar_icon_1_link":"\/","footer_bar_icon_2":"https:\/\/cdn.easystore.blue\/s\/201\/f\/5591.png?width=150&format=webp","footer_bar_icon_2_text":"All products","footer_bar_icon_2_link":"\/collections\/all","footer_bar_icon_3":"https:\/\/cdn.easystore.blue\/s\/201\/f\/5592.png?width=150&format=webp","footer_bar_icon_3_text":"Promotions","footer_bar_icon_3_link":"\/collections\/all","footer_bar_icon_4":"https:\/\/cdn.easystore.blue\/s\/201\/f\/5593.png?width=150&format=webp","footer_bar_icon_4_text":"Account","footer_bar_icon_4_link":"\/account\/login","cart_enable_ajax":"1","social_sharing_products":"1","social_sharing_blog":"1","social_sharing_count":"1","share_facebook":"1","share_twitter":"1","share_line":"1","share_pinterest":"1","facebook_url":"https:\/\/www.facebook.com\/madamyongdelight","twitter_url":"","pinterest_url":"","instagram_url":"https:\/\/instagram.com\/madamyongdelight","tumblr_url":"","youtube_url":"","vimeo_url":"","wechat_url":"","whatsapp_url":"https:\/\/wa.me\/60122381396","line_url":"","featured_blog":"","featured_blog_title":"Blog Post","articles_handle_1":"","articles_handle_2":"","articles_handle_3":"","video_section_id":"","video_section_img":"https:\/\/cdn.store-assets.com\/s\/326197\/f\/4480409.jpeg?width=1500&format=webp","img_text_section_img":"","img_text_section_heading":"About Us","img_text_section_text":"We are a family run business that has been producing Nyonya Kuih since 1985 (for over 35 years!). We take pride in being regarded as one of the leading suppliers of Nyonya Kuih in the Klang Valley.   Here, we aim to bring our delicacies closer to you with the option of delivery right to your door step in just a few clicks. Order from us today to savor our Nyonya Kuih!","img_text_section_link_text":"","img_text_section_url":"\/collections\/all","img_text_section_class":"image-right","lazy_loader":"1","featured_single_product_handle":"","placeholder":{"featured-single-product":"https:\/\/s3-ap-southeast-1.amazonaws.com\/eesb.themes\/onboarding\/candy\/en_placeholder_featured-single-product.jpg","featured-blog":"https:\/\/s3-ap-southeast-1.amazonaws.com\/eesb.themes\/onboarding\/candy\/en_placeholder_featured-blog.jpg"},"use_original_image":0,"promotion_uis":{"primary_color":"#4089e4","header_bg_color":"#4089e4","header_text_color":"#fff","recommendation":{"is_show_product_page":true,"is_show_cart_page_top":true,"is_show_cart_page_bottom":true},"voucher_widget":{"primary_color":"#4089e4"}},"show_multiple_currencies":true,"supported_currencies":"MYR ","theme_id":3809,"theme_is_edited":1,"theme_updated_at":"2026-08-18T18:00:42.000Z","phone_account_enabled":false,"line_login_enabled":false,"apple_login_enabled":false,"timezone":"Asia\/Kuala_Lumpur","is_server_side_currency_conversion":true,"is_self_registration_enabled":true,"is_highlight_enabled":false,"is_auto_gen_highlight_enabled":false,"is_common_question_enabled":false,"is_auto_gen_common_question_enabled":false,"highlight_section_title":"Highlights","common_question_section_title":"Frequently asked questions","is_new_promotion_enabled":true}
3006        if (settings.promotion_uis.voucher_widget != null) {
3007          setVoucherTheme(settings.promotion_uis.voucher_widget)
3008        }
3009        var shop = {
3010          money_prefix: "",
3011          format_decimals: ""
3012        };
3013        var _getEntitlementTranslation = {
3014          "free_shipping": "FREE SHIPPING",
3015          "free_of_charge": "FREE GIFT",
3016        }
3017        var _getTargetTypeTranslation = {
3018          "amount_credit": " CREDIT",
3019          "amount_off": " OFF",
3020        }
3021        var _getPrerequisiteTranslation = {
3022          "min_quantity": "Min formatValue item(s) purchase",
3023          "every_quantity": "Every formatValue item(s) purchase",
3024          "min_amount": "Min formatCurrency spend",
3025          "every_amount": "Every formatCurrency spend"
3026        }
3027        var _getPrerequisiteConditionTranslation = {
3028          "selected_items": "Selected Items",
3029          "selected_collections": "Selected Collections",
3030          "storewide": "Storewide",
3031          "order_subtotal": "Order Subtotal"
3032        }
3033        var _getVoucherButtonTextTranslation = {
3034          "apply": "Apply",
3035        }
3036        var _getVoucherErrorTranslation = {
3037          "condition_not_matched": "Voucher condition not matched"
3038        }
3039      </script>
3039
3040
3041    </div>
3042  </div>
3043</vouchers-modal>
3044  
3045  
3046<!-- GetButton.io widget -->
3047<script type="text/javascript">
3048    (function () {
3049        var options = {
3050            whatsapp: "+60122381396", // WhatsApp number
3051            call_to_action: "Message us", // Call to action
3052            position: "right", // Position may be 'right' or 'left'
3053        };
3054        var proto = document.location.protocol, host = "getbutton.io", url = proto + "//static." + host;
3055        var s = document.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = url + '/widget-send-button/js/init.js';
3056        s.onload = function () { WhWidgetSendButton.init(host, proto, options); };
3057        var x = document.getElementsByTagName('script')[0]; x.parentNode.insertBefore(s, x);
3058    })();
3059</script>
3059
3060<!-- /GetButton.io widget -->
3061  
3062
3063</body>
3064</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.