PageSourceSearch

https://www.thehill.store/pages/stores

html thehill.store collected 2026-09-26 09:51:31 UTC 68,044 bytes, 2,301 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
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/305884/f/4338252.png" />
15  
16<link href="https://fonts.googleapis.com/css?family=Noto+Sans+TC&display=swap" rel="stylesheet">
17<link href="https://fonts.googleapis.com/css?family=Open+Sans&display=swap" rel="stylesheet">
18  <link href="https://fonts.googleapis.com/css?family=Roboto&display=swap" rel="stylesheet">
19  <!-- Title and description ================================================== -->
20  <title>
21  展售店資訊 Stores &ndash; thehill 樂丘
22  </title>
23
24  
25
26  <!-- Social meta ================================================== -->
27  
28
29  <meta property="og:type" content="website">
30  <meta property="og:title" content="展售店資訊 Stores">
31  <meta property="og:url" content="https://www.thehill.store/pages/stores">
32  
33  <meta property="og:image" content="https://cdn.store-assets.com/s/305884/f/4338208.png?width=350&format=webp">
34  <meta property="og:image:secure_url" content="https://cdn.store-assets.com/s/305884/f/4338208.png?width=350&format=webp">
35  
36
37
38<meta property="og:description" content="thehill 樂丘 我們為家人的幸福而開發產品。
39我們希望這些貼心與簡約設計的寵物居家用品,溫暖你與寵物的好感生活。 
40
41Where The Home Is,家之所在。這是我們探索產品設計的核心哲學。">
42<meta property="og:site_name" content="thehill 樂丘">
43
44
45
46  <meta name="twitter:card" content="summary">
47
48
49
50
51
52
53
54  <!-- Helpers ================================================== -->
55  <link rel="canonical" href="https://www.thehill.store/pages/stores">
56  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
57  <meta name="theme-color" content="">
58
59  <!-- CSS ================================================== -->
60  <link href="https://store-themes.easystore.co/305884/themes/1592/assets/timber.css?t=1787072505" rel="stylesheet" type="text/css" media="screen" />
61  <link href="https://store-themes.easystore.co/305884/themes/1592/assets/theme.css?t=1787072505" rel="stylesheet" type="text/css" media="screen" />
62
63  
64
65
66
67
68  
68<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js" type="text/javascript" ></script>
68
69  <!-- Header hook for plugins ================================================== -->
70  
71<!-- ScriptTags -->
72<script>window.__st={p: "page",cid: null,cem: null,cph: null,cfn: null,cln: null,cge: null,cdb: null,ccc: null};</script>
72<script src='/assets/events.js'></script>
72<script>(function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(d.getElementById(id))return;js=d.createElement(s);js.id=id;js.src='https://connect.facebook.net/zh_TW/sdk/xfbml.customerchat.js#xfbml=1&version=v6.0&autoLogAppEvents=1';fjs.parentNode.insertBefore(js,fjs);}(document,'script','facebook-jssdk'));</script>
72<script>(function(){function asyncLoad(){var urls=['/assets/facebook-pixel.js?v=1.2.1631439268','/assets/traffic.js?v=1','https://apps.easystore.co/facebook-login/script.js?shop=thehill2738.easy.co','https://apps.easystore.co/mobile-messaging-share/script.js?shop=thehill2738.easy.co','https://apps.easystore.co/instagram-feed/script.js?shop=thehill2738.easy.co','https://apps.easystore.co/google-analytics/script.js?shop=thehill2738.easy.co','https://apps.easystore.co/timer-discount/script.js?shop=thehill2738.easy.co','https://apps.easystore.co/social-media-share/script.js?shop=thehill2738.easy.co'];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>
72
73<!-- /ScriptTags -->
74
75
76  
77<!--[if lt IE 9]>
78<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js" type="text/javascript" ></script>
vendor: 2 bytes, line 78
78
79<script src="https://store-themes.easystore.co/305884/themes/1592/assets/respond.min.js?t=1787072505" type="text/javascript" ></script>
79
80<link href="https://store-themes.easystore.co/305884/themes/1592/assets/respond-proxy.html" id="respond-proxy" rel="respond-proxy" />
81<link href="//www.thehill.store/search?q=d2c45fb6c41794fa8a6962d5130935d8" id="respond-redirect" rel="respond-redirect" />
82<script src="//www.thehill.store/search?q=d2c45fb6c41794fa8a6962d5130935d8" type="text/javascript"></script>
82
83<![endif]-->
84
85
86
87  
87<script src="https://store-themes.easystore.co/305884/themes/1592/assets/modernizr.min.js?t=1787072505" type="text/javascript" ></script>
87
88
89  
90  
91  
91<script>
92  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
93  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
94  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
95  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
96
97  ga('create', '', 'auto','myTracker');
98  ga('myTracker.send', 'pageview');
99
100  </script>
100
101  
102<!-- Snippet:global/head: Pinterest Webmaster -->
103<meta name="p:domain_verify" content="abc123">
104<!-- /Snippet -->
105
106<!-- Snippet:global/head: Instagram Feed -->
107<link rel="stylesheet" href="https://apps.easystore.co/assets/css/instagram-feed/insta-feed-style.css?v2">
108<!-- /Snippet -->
109
110<!-- Snippet:global/head: Google Search Console -->
111<meta name="google-site-verification" content="abc123">
112<!-- /Snippet -->
113
114<!-- Snippet:global/head: OnVoard AOV Progress Bar -->
115<script>
116  (function() {
117    window.OnVoard = window.OnVoard || function() {
118      (window.OnVoard.q = window.OnVoard.q || []).push(arguments);
119    };
120    var script = document.createElement("script");
121    var parent = document.getElementsByTagName("script")[0].parentNode;
122    script.async = 1;
123
124    
125    script.src = "https://scripts.onvoard.com/apps/loader.js";
126    
127    parent.appendChild(script);
128  })();
129</script>
129
130
131
132<script>
133
134var ovData = {};
135ovData["ecommerce_platform"] = "easystore";
136ovData["account_id"] = "acct_rjmb5yadl7yqxaa";
137
138
139  ovData["template"] = "page";
140  ovData["cart"] = {"item_count":0,"total_price":0,"announcements":[]};
141  ovData["product"] = "";
142  ovData["shop"] = {};
143  ovData["customer"] = {};
144
145  
146    ovData["shop"] = {
147      "currency": "TWD",
148      "domain": "www.thehill.store",
149      "url": "https://www.thehill.store",
150      "money_format": "<span class=money data-ori-price='{{amount}}'>NT$ {{amount}} </span>",
151    };
152  
153
154  
155
156  window.OnVoardData = ovData;
157</script>
157
158
159<!-- /Snippet -->
160
161</head>
162
163<body id="----------------stores" class="template-page" >
164
165  <ul id="MobileNav" class="mobile-nav large--hide">
166
167  
168  
169  <li class="mobile-nav__link" aria-haspopup="true">
170    
171    
172    <a href="/pages/thehillnews" class="mobile-nav__parent-link">
173      最新消息 News
174    </a>
175    <span class="mobile-nav__sublist-trigger">
176      <span class="icon-fallback-text mobile-nav__sublist-expand">
177  <span class="icon icon-plus" aria-hidden="true"></span>
178  <span class="fallback-text">+</span>
179</span>
180<span class="icon-fallback-text mobile-nav__sublist-contract">
181  <span class="icon icon-minus" aria-hidden="true"></span>
182  <span class="fallback-text">-</span>
183</span>
184
185    </span>
186    <ul class="mobile-nav__sublist">
187      
188      
189      <li class="mobile-nav__sublist-link" aria-haspopup="true">
190        
191        <a href="/blogs/news" >
192          最新消息 News
193        </a>
194        
195      </li>
196      
197    </ul>
198    
199  </li>
200  
201  
202  <li class="mobile-nav__link" aria-haspopup="true">
203    
204    <a href="/collections/on-sale" >
205      優惠活動 On Sale
206    </a>
207    
208  </li>
209  
210  
211  <li class="mobile-nav__link" aria-haspopup="true">
212    
213    
214    <a href="/collections/all" class="mobile-nav__parent-link">
215      全部商品 All
216    </a>
217    <span class="mobile-nav__sublist-trigger">
218      <span class="icon-fallback-text mobile-nav__sublist-expand">
219  <span class="icon icon-plus" aria-hidden="true"></span>
220  <span class="fallback-text">+</span>
221</span>
222<span class="icon-fallback-text mobile-nav__sublist-contract">
223  <span class="icon icon-minus" aria-hidden="true"></span>
224  <span class="fallback-text">-</span>
225</span>
226
227    </span>
228    <ul class="mobile-nav__sublist">
229      
230      
231      <li class="mobile-nav__sublist-link" aria-haspopup="true">
232        
233        <a href="/collections/on-sale" >
234          優惠活動 On Sale
235        </a>
236        
237      </li>
238      
239      
240      <li class="mobile-nav__sublist-link" aria-haspopup="true">
241        
242        <a href="/collections/用餐食器台" >
243          用餐食器台
244        </a>
245        
246      </li>
247      
248      
249      <li class="mobile-nav__sublist-link" aria-haspopup="true">
250        
251        <a href="/collections/躲貓貓" >
252          躲貓貓
253        </a>
254        
255      </li>
256      
257      
258      <li class="mobile-nav__sublist-link" aria-haspopup="true">
259        
260        <a href="/collections/玩樂" >
261          玩樂
262        </a>
263        
264      </li>
265      
266      
267      <li class="mobile-nav__sublist-link" aria-haspopup="true">
268        
269        <a href="/collections/設計家具" >
270          設計家具
271        </a>
272        
273      </li>
274      
275      
276      <li class="mobile-nav__sublist-link" aria-haspopup="true">
277        
278        <a href="/collections/單買配件" >
279          單買配件
280        </a>
281        
282      </li>
283      
284      
285      <li class="mobile-nav__sublist-link" aria-haspopup="true">
286        
287        <a href="/collections/refurbished" >
288          樂福利品 Refurbished
289        </a>
290        
291      </li>
292      
293    </ul>
294    
295  </li>
296  
297  
298  <li class="mobile-nav__link" aria-haspopup="true">
299    
300    <a href="http://www.thehill.store/collections/refurbished" >
301      樂福利品 Refurbished
302    </a>
303    
304  </li>
305  
306  
307  <li class="mobile-nav__link" aria-haspopup="true">
308    
309    
310    <a href="/pages/about-thehill" class="mobile-nav__parent-link">
311      認識 thehill
312    </a>
313    <span class="mobile-nav__sublist-trigger">
314      <span class="icon-fallback-text mobile-nav__sublist-expand">
315  <span class="icon icon-plus" aria-hidden="true"></span>
316  <span class="fallback-text">+</span>
317</span>
318<span class="icon-fallback-text mobile-nav__sublist-contract">
319  <span class="icon icon-minus" aria-hidden="true"></span>
320  <span class="fallback-text">-</span>
321</span>
322
323    </span>
324    <ul class="mobile-nav__sublist">
325      
326      
327      <li class="mobile-nav__sublist-link" aria-haspopup="true">
328        
329        <a href="https://forms.gle/bs4FBU5HTcs5Sh5w8"  target="_blank" >
330          產品保固 Warranty
331        </a>
332        
333      </li>
334      
335      
336      <li class="mobile-nav__sublist-link" aria-haspopup="true">
337        
338        <a href="/pages/stores" >
339          展售店資訊 Stores
340        </a>
341        
342      </li>
343      
344    </ul>
345    
346  </li>
347  
348
349  
350
351  
352  
353  
354  <li class="mobile-nav__link">
355    <a href="/account/login">登入</a>
356  </li>
357  
358  <li class="mobile-nav__link">
359    <a href="/account/register">註冊</a>
360  </li>
361  
362  
363  
364  
365  
366    <li class="mobile-nav__link">
367      
368
369
370
371
372
373
374    </li>
375  
376  
377  <li class="mobile-nav__link header-bar__search-wrapper">
378    
379    <div class="header-bar__module header-bar__search">
380      
381  <a class="popup-with-form medium-down--hide" href="#test-form">
382    <span class="icon icon-search" aria-hidden="true"></span>
383  </a>
384  <form action="/search" method="get" class="header-bar__search-form clearfix large--hide" role="search">
385    
386    <button type="submit" class="btn icon-fallback-text header-bar__search-submit">
387      <span class="icon icon-search" aria-hidden="true"></span>
388      <span class="fallback-text">搜尋</span>
389    </button>
390    <input type="search" name="q" value="" aria-label="搜尋" class="header-bar__search-input" placeholder="搜尋" autocomplete="off">
391    <div class="dropdown" id="searchDropdown"></div>
392    <input type="hidden" name="search_history" id="search_history">
393  </form>
394
395
396
397<!-- form itself -->
398<div id="test-form" class="white-popup-block mfp-hide popup-search">
399  <div class="popup-search-content">
400    <form action="/search" method="get" class="input-group search-bar" role="search">
401      
402      <input type="search" name="q" value="" placeholder="搜尋" class="input-group-field" aria-label="搜尋" placeholder="搜尋" autocomplete="off">
403      <div class="dropdown" id="searchDropdown"></div>
404      <input type="hidden" name="search_history" id="search_history">
405      <span class="input-group-btn">
406        <button type="submit" class="btn icon-fallback-text">
407          <span class="icon icon-search" aria-hidden="true"></span>
408          <span class="fallback-text">搜尋</span>
409        </button>
410      </span>
411    </form>
412  </div>
413</div>
414
415<script src="https://store-themes.easystore.co/305884/themes/1592/assets/magnific-popup.min.js?t=1787072505" type="text/javascript" ></script>
vendor: 1 bytes, line 415
415
416<script>
417$(document).ready(function() {
418	$('.popup-with-form').magnificPopup({
419		type: 'inline',
420		preloader: false,
421		focus: '#name',
422      	mainClass: 'popup-search-bg-wrapper',
423
424		// When elemened is focused, some mobile browsers in some cases zoom in
425		// It looks not nice, so we disable it:
426		callbacks: {
427			beforeOpen: function() {
428				if($(window).width() < 700) {
429					this.st.focus = false;
430				} else {
431					this.st.focus = '#name';
432				}
433			}
434		}
435	});
436});
437</script>
437
438
439
440<script>
441  var _search_history_listings = ""
442  if(_search_history_listings != "") localStorage.setItem('searchHistory', JSON.stringify(_search_history_listings));
443
444  function clearAll() {
445    localStorage.removeItem('searchHistory');
446  
447    var customer = "";
448    if(customer) {
449      // Your logic to clear all data or call an endpoint
450      fetch('/account/search_histories', {
451          method: 'DELETE',
452          headers: {
453            "Content-Type": "application/json",
454            "X-Requested-With": "XMLHttpRequest"
455          },
456          body: JSON.stringify({
457            _token: "MnBaGIcIzUeIuixUxdB2qrTc1OxxgivnzlujA5S2"
458          }),
459      })
460      .then(response => response.json())
461    }
462  }
463  // End - store view history in local storage
464  
465  // search history dropdown  
466  var searchInputs = document.querySelectorAll('input[type=search]');
467  
468  if(searchInputs.length > 0) {
469    
470    searchInputs.forEach((searchInput)=>{
471    
472      searchInput.addEventListener('focus', function() {
473        var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown');
474        searchDropdown.innerHTML = ''; // Clear existing items
475  
476        // retrieve data from local storage
477        var searchHistoryData = JSON.parse(localStorage.getItem('searchHistory')) || [];
478  
479        // Convert JSON to string
480        var search_history_json = JSON.stringify(searchHistoryData);
481  
482        // Set the value of the hidden input
483        searchInput.closest('form').querySelector("#search_history").value = search_history_json;
484  
485        // create dropdown items
486        var clearAllItem = document.createElement('div');
487        clearAllItem.className = 'dropdown-item clear-all';
488        clearAllItem.textContent = 'Clear';
489        clearAllItem.addEventListener('click', function() {
490            clearAll();
491            searchDropdown.style.display = 'none';
492            searchInput.classList.remove('is-focus');
493        });
494        searchDropdown.appendChild(clearAllItem);
495  
496        // create dropdown items
497        searchHistoryData.forEach(function(item) {
498          var dropdownItem = document.createElement('div');
499          dropdownItem.className = 'dropdown-item';
500          dropdownItem.textContent = item.term;
501          dropdownItem.addEventListener('click', function() {
502            searchInput.value = item.term;
503            searchDropdown.style.display = 'none';
504          });
505          searchDropdown.appendChild(dropdownItem);
506        });
507  
508        if(searchHistoryData.length > 0){
509          // display the dropdown
510          searchInput.classList.add('is-focus');
511          document.body.classList.add('search-input-focus');
512          searchDropdown.style.display = 'block';
513        }
514      });
515  
516      searchInput.addEventListener("focusout", (event) => {
517        var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown');
518        searchInput.classList.remove('is-focus');
519        searchDropdown.classList.add('transparent');
520        setTimeout(()=>{
521          searchDropdown.style.display = 'none';
522          searchDropdown.classList.remove('transparent');
523          document.body.classList.remove('search-input-focus');
524        }, 400);
525      });
526    })
527  }
528  // End - search history dropdown
529</script>
529
530    </div>
531    
532  </li>
533  
534  
535</ul>
536<div id="MobileNavOutside" class="mobile-nav-outside"></div>
537
538
539<div id="PageContainer" class="page-container">
540  
541<!-- Snippet:global/body_start: Console Extension -->
542<div id='es_console' style='display: none;'>305884</div>
543<!-- /Snippet -->
544
545  
546    <style>
547  .search-modal__form{
548    position: relative;
549  }
550  
551  .dropdown-wrapper {
552    position: relative;
553  }
554  
555  .dropdown-wrapper:hover .dropdown {
556    display: block;
557  }
558  
559  .header-icon-nav .dropdown {
560    left: -80px;
561  }
562  
563  .dropdown {
564    display: none;
565    position: absolute;
566    top: 100%;
567    left: 0px;
568    width: 100%;
569    padding: 8px;
570    background-color: #fff;
571    z-index: 1000;
572    border-radius: 5px;
573    border: 1px solid rgba(var(--color-foreground), 1);
574    border-top: none;
575    overflow-x: hidden;
576    overflow-y: auto;
577    max-height: 350px;
578    min-width: 150px;
579    box-shadow: 0 0 5px rgba(0,0,0,0.1);
580  }
581    
582  .dropdown a{
583    text-decoration: none;
584    color: #000 !important;
585  }
586  
587  .dropdown-item {
588    padding: 0.4rem 2rem;
589    cursor: pointer;
590    line-height: 1.4;
591    overflow: hidden;
592    text-overflow: ellipsis;
593    white-space: nowrap;
594  }
595  
596  .dropdown-item:hover{
597    background-color: #f3f3f3;
598  }
599  
600  .search__input.is-focus{
601    border-radius: 15px;
602    border-bottom-left-radius: 0;
603    border-bottom-right-radius: 0;
604    border: 1px solid rgba(var(--color-foreground), 1);
605    border-bottom: none;
606    box-shadow: none;
607  }
608  
609  .clear-all {
610    text-align: right;
611    padding: 0 2rem 0.2rem;
612    line-height: 1;
613    font-size: 70%;
614    margin-bottom: -2px;
615  }
616  
617  .clear-all:hover{
618    background-color: #fff;
619  }
620  
621  .referral-notification {
622    position: absolute;
623    top: 100%;
624    right: -12px;
625    background: white;
626    border: 1px solid #e0e0e0;
627    border-radius: 8px;
628    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
629    width: 280px;
630    z-index: 1000;
631    padding: 16px;
632    margin-top: 8px;
633    font-size: 14px;
634    line-height: 1.4;
635  }
636  
637  .referral-notification::before {
638    content: '';
639    position: absolute;
640    top: -8px;
641    right: 20px;
642    width: 0;
643    height: 0;
644    border-left: 8px solid transparent;
645    border-right: 8px solid transparent;
646    border-bottom: 8px solid white;
647  }
648  
649  .referral-notification::after {
650    content: '';
651    position: absolute;
652    top: -9px;
653    right: 20px;
654    width: 0;
655    height: 0;
656    border-left: 8px solid transparent;
657    border-right: 8px solid transparent;
658    border-bottom: 8px solid #e0e0e0;
659  }
660  
661  .referral-notification h4 {
662    margin: 0 0 8px 0;
663    color: #2196F3;
664    font-size: 16px;
665    font-weight: 600;
666  }
667  
668  .referral-notification p {
669    margin: 0 0 12px 0;
670    color: #666;
671  }
672  
673  .referral-notification .referral-code {
674    background: #f5f5f5;
675    padding: 8px;
676    border-radius: 4px;
677    font-family: monospace;
678    font-size: 13px;
679    text-align: center;
680    margin: 8px 0;
681    border: 1px solid #ddd;
682  }
683  
684  .referral-notification .close-btn {
685    position: absolute;
686    top: 8px;
687    right: 8px;
688    background: none;
689    border: none;
690    font-size: 18px;
691    color: #999;
692    cursor: pointer;
693    padding: 0;
694    width: 20px;
695    height: 20px;
696    line-height: 1;
697  }
698  
699  .referral-notification .close-btn:hover {
700    color: #333;
701  }
702  
703  .referral-notification .action-btn {
704    background: #2196F3;
705    color: white;
706    border: none;
707    padding: 8px 16px;
708    border-radius: 4px;
709    cursor: pointer;
710    font-size: 12px;
711    margin-right: 8px;
712    margin-top: 8px;
713  }
714  
715  .referral-notification .action-btn:hover {
716    background: #1976D2;
717  }
718  
719  .referral-notification .dismiss-btn {
720    background: transparent;
721    color: #666;
722    border: 1px solid #ddd;
723    padding: 8px 16px;
724    border-radius: 4px;
725    cursor: pointer;
726    font-size: 12px;
727    margin-top: 8px;
728  }
729  
730  .referral-notification .dismiss-btn:hover {
731    background: #f5f5f5;
732  }
733  .referral-modal__dialog {
734    transform: translate(-50%, 0);
735    transition: transform var(--duration-default) ease, visibility 0s;
736    z-index: 10000;
737    position: fixed;
738    top: 20vh;
739    left: 50%;
740    width: 100%;
741    max-width: 350px;
742    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
743    border-radius: 12px;
744    background-color: #fff;
745    color: #000;
746    padding: 20px;
747    text-align: center;
748  }
749  .modal-overlay.referral-modal-overlay {
750    position: fixed;
751    top: 0;
752    left: 0;
753    width: 100%;
754    height: 100%;
755    background-color: rgba(0, 0, 0, 0.7);
756    z-index: 2001;
757    display: block;
758    opacity: 1;
759    transition: opacity var(--duration-default) ease, visibility 0s;
760  }
761</style>
762
763<header class="header-bar">
764  <div class="header-wrapper wrapper">
765
766    <!--  Mobile hamburger  -->
767    <div class="large--hide">
768      <button type="button" class="mobile-nav-trigger" id="MobileNavTrigger">
769        <span class="icon icon-hamburger" aria-hidden="true"></span>
770      </button>
771    </div>
772    
773    <div class="logo-header" role="banner">
774
775            
776                  <div class="h1 site-header__logo" itemscope itemtype="http://schema.org/Organization">
777            
778                  
779                    
780                    
781                        
782                          <a href="/" class="logo-wrapper" itemprop="url">
783                            <img src="https://cdn.store-assets.com/s/305884/f/4338208.png?width=350&format=webp" alt="thehill 樂丘" itemprop="logo">
784                          </a>
785                        
786                    
787                    
788                  
789            
790              </div>
791            
792        
793    </div>
794    
795    <div class="desktop-header-nav medium-down--hide">
796      
797      <div class="header-nav-bar">
798          
799<ul class="site-nav" id="AccessibleNav">
800  
801    
802    
803      
804      <li class="site-nav--has-dropdown" aria-haspopup="true">
805        <a href="/pages/thehillnews"  class="site-nav__link">
806          最新消息 News
807          <span class="icon-fallback-text">
808            <span class="icon icon-arrow-down" aria-hidden="true"></span>
809          </span>
810        </a>
811        <ul class="site-nav__dropdown">
812          
813            
814            
815              <li >
816                <a href="/blogs/news"  class="site-nav__link">最新消息 News</a>
817              </li>
818            
819          
820        </ul>
821      </li>
822    
823  
824    
825    
826      <li >
827        <a href="/collections/on-sale"  class="site-nav__link">優惠活動 On Sale</a>
828      </li>
829    
830  
831    
832    
833      
834      <li class="site-nav--has-dropdown" aria-haspopup="true">
835        <a href="/collections/all"  class="site-nav__link">
836          全部商品 All
837          <span class="icon-fallback-text">
838            <span class="icon icon-arrow-down" aria-hidden="true"></span>
839          </span>
840        </a>
841        <ul class="site-nav__dropdown">
842          
843            
844            
845              <li >
846                <a href="/collections/on-sale"  class="site-nav__link">優惠活動 On Sale</a>
847              </li>
848            
849          
850            
851            
852              <li >
853                <a href="/collections/用餐食器台"  class="site-nav__link">用餐食器台</a>
854              </li>
855            
856          
857            
858            
859              <li >
860                <a href="/collections/躲貓貓"  class="site-nav__link">躲貓貓</a>
861              </li>
862            
863          
864            
865            
866              <li >
867                <a href="/collections/玩樂"  class="site-nav__link">玩樂</a>
868              </li>
869            
870          
871            
872            
873              <li >
874                <a href="/collections/設計家具"  class="site-nav__link">設計家具</a>
875              </li>
876            
877          
878            
879            
880              <li >
881                <a href="/collections/單買配件"  class="site-nav__link">單買配件</a>
882              </li>
883            
884          
885            
886            
887              <li >
888                <a href="/collections/refurbished"  class="site-nav__link">樂福利品 Refurbished</a>
889              </li>
890            
891          
892        </ul>
893      </li>
894    
895  
896    
897    
898      <li >
899        <a href="http://www.thehill.store/collections/refurbished"  class="site-nav__link">樂福利品 Refurbished</a>
900      </li>
901    
902  
903    
904    
905      
906      <li class="site-nav--has-dropdown" aria-haspopup="true">
907        <a href="/pages/about-thehill"  class="site-nav__link">
908          認識 thehill
909          <span class="icon-fallback-text">
910            <span class="icon icon-arrow-down" aria-hidden="true"></span>
911          </span>
912        </a>
913        <ul class="site-nav__dropdown">
914          
915            
916            
917              <li >
918                <a href="https://forms.gle/bs4FBU5HTcs5Sh5w8"  target="_blank"  class="site-nav__link">產品保固 Warranty</a>
919              </li>
920            
921          
922            
923            
924              <li >
925                <a href="/pages/stores"  class="site-nav__link">展售店資訊 Stores</a>
926              </li>
927            
928          
929        </ul>
930      </li>
931    
932  
933  
934  
935      
936        
937          
938        
939          
940        
941      
942  
943  
944  
945</ul>
946
947      </div>
948
949      <div class="header-subnav">
950        
951
952
953
954
955
956
957        
958        
959        <div class="header-icon-nav">
960        
961              
962        
963              
964            
965              
966              
967                
968                  <div class="header-bar__module">
969                    
970  <a class="popup-with-form medium-down--hide" href="#test-form">
971    <span class="icon icon-search" aria-hidden="true"></span>
972  </a>
973  <form action="/search" method="get" class="header-bar__search-form clearfix large--hide" role="search">
974    
975    <button type="submit" class="btn icon-fallback-text header-bar__search-submit">
976      <span class="icon icon-search" aria-hidden="true"></span>
977      <span class="fallback-text">搜尋</span>
978    </button>
979    <input type="search" name="q" value="" aria-label="搜尋" class="header-bar__search-input" placeholder="搜尋" autocomplete="off">
980    <div class="dropdown" id="searchDropdown"></div>
981    <input type="hidden" name="search_history" id="search_history">
982  </form>
983
984
985
986<!-- form itself -->
987<div id="test-form" class="white-popup-block mfp-hide popup-search">
988  <div class="popup-search-content">
989    <form action="/search" method="get" class="input-group search-bar" role="search">
990      
991      <input type="search" name="q" value="" placeholder="搜尋" class="input-group-field" aria-label="搜尋" placeholder="搜尋" autocomplete="off">
992      <div class="dropdown" id="searchDropdown"></div>
993      <input type="hidden" name="search_history" id="search_history">
994      <span class="input-group-btn">
995        <button type="submit" class="btn icon-fallback-text">
996          <span class="icon icon-search" aria-hidden="true"></span>
997          <span class="fallback-text">搜尋</span>
998        </button>
999      </span>
1000    </form>
1001  </div>
1002</div>
1003
1004<script src="https://store-themes.easystore.co/305884/themes/1592/assets/magnific-popup.min.js?t=1787072505" type="text/javascript" ></script>
vendor: 1 bytes, line 1004
1004
1005<script>
1006$(document).ready(function() {
1007	$('.popup-with-form').magnificPopup({
1008		type: 'inline',
1009		preloader: false,
1010		focus: '#name',
1011      	mainClass: 'popup-search-bg-wrapper',
1012
1013		// When elemened is focused, some mobile browsers in some cases zoom in
1014		// It looks not nice, so we disable it:
1015		callbacks: {
1016			beforeOpen: function() {
1017				if($(window).width() < 700) {
1018					this.st.focus = false;
1019				} else {
1020					this.st.focus = '#name';
1021				}
1022			}
1023		}
1024	});
1025});
1026</script>
1026
1027
1028
1029<script>
1030  var _search_history_listings = ""
1031  if(_search_history_listings != "") localStorage.setItem('searchHistory', JSON.stringify(_search_history_listings));
1032
1033  function clearAll() {
1034    localStorage.removeItem('searchHistory');
1035  
1036    var customer = "";
1037    if(customer) {
1038      // Your logic to clear all data or call an endpoint
1039      fetch('/account/search_histories', {
1040          method: 'DELETE',
1041          headers: {
1042            "Content-Type": "application/json",
1043            "X-Requested-With": "XMLHttpRequest"
1044          },
1045          body: JSON.stringify({
1046            _token: "MnBaGIcIzUeIuixUxdB2qrTc1OxxgivnzlujA5S2"
1047          }),
1048      })
1049      .then(response => response.json())
1050    }
1051  }
1052  // End - store view history in local storage
1053  
1054  // search history dropdown  
1055  var searchInputs = document.querySelectorAll('input[type=search]');
1056  
1057  if(searchInputs.length > 0) {
1058    
1059    searchInputs.forEach((searchInput)=>{
1060    
1061      searchInput.addEventListener('focus', function() {
1062        var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown');
1063        searchDropdown.innerHTML = ''; // Clear existing items
1064  
1065        // retrieve data from local storage
1066        var searchHistoryData = JSON.parse(localStorage.getItem('searchHistory')) || [];
1067  
1068        // Convert JSON to string
1069        var search_history_json = JSON.stringify(searchHistoryData);
1070  
1071        // Set the value of the hidden input
1072        searchInput.closest('form').querySelector("#search_history").value = search_history_json;
1073  
1074        // create dropdown items
1075        var clearAllItem = document.createElement('div');
1076        clearAllItem.className = 'dropdown-item clear-all';
1077        clearAllItem.textContent = 'Clear';
1078        clearAllItem.addEventListener('click', function() {
1079            clearAll();
1080            searchDropdown.style.display = 'none';
1081            searchInput.classList.remove('is-focus');
1082        });
1083        searchDropdown.appendChild(clearAllItem);
1084  
1085        // create dropdown items
1086        searchHistoryData.forEach(function(item) {
1087          var dropdownItem = document.createElement('div');
1088          dropdownItem.className = 'dropdown-item';
1089          dropdownItem.textContent = item.term;
1090          dropdownItem.addEventListener('click', function() {
1091            searchInput.value = item.term;
1092            searchDropdown.style.display = 'none';
1093          });
1094          searchDropdown.appendChild(dropdownItem);
1095        });
1096  
1097        if(searchHistoryData.length > 0){
1098          // display the dropdown
1099          searchInput.classList.add('is-focus');
1100          document.body.classList.add('search-input-focus');
1101          searchDropdown.style.display = 'block';
1102        }
1103      });
1104  
1105      searchInput.addEventListener("focusout", (event) => {
1106        var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown');
1107        searchInput.classList.remove('is-focus');
1108        searchDropdown.classList.add('transparent');
1109        setTimeout(()=>{
1110          searchDropdown.style.display = 'none';
1111          searchDropdown.classList.remove('transparent');
1112          document.body.classList.remove('search-input-focus');
1113        }, 400);
1114      });
1115    })
1116  }
1117  // End - search history dropdown
1118</script>
1118
1119                  </div>
1120                
1121              
1122              
1123              
1124                <div class="header-bar__module dropdown-wrapper">
1125                  
1126                    <a href="/account/login">
1127
1128
1129
1130    <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>
1131
1132  
1133</a>
1134                  
1135
1136                  <!-- Referral Notification Popup for Desktop -->
1137                  <div id="referralNotification" class="referral-notification" style="display: none;">
1138                    <button class="close-btn" onclick="dismissReferralNotification()">&times;</button>
1139                    <div style="text-align: center; margin-bottom: 16px;">
1140                      <div style="width: 100px; height: 100px; margin: 0 auto;">
1141                        <img src="https://resources.easystore.co/storefront/icons/channels/vector_referral_program.svg">
1142                      </div>
1143                    </div>
1144                    <p id="referralSignupMessage" style="text-align: center; font-size: 14px; color: #666; margin: 0 0 20px 0;">
1145                      您的好友送您   回饋金!立即註冊領取。
1146                    </p>
1147                    <div style="text-align: center;">
1148                      <button class="btn" onclick="goToSignupPage()" style="width: 100%; color: #fff;">
1149                        註冊
1150                      </button>
1151                    </div>
1152                  </div>
1153                </div>
1154              
1155              
1156              <div class="header-bar__module cart-page-link-wrapper">
1157                <span class="header-bar__sep" aria-hidden="true"></span>
1158                <a href="/cart" class="cart-page-link">
1159                  <span class="icon icon-cart header-bar__cart-icon" aria-hidden="true"></span>
1160                  <span class="cart-count header-bar__cart-count hidden-count">0</span>
1161                </a>
1162              </div>
1163        
1164        
1165              
1166                
1167              
1168        
1169          
1170        </div>
1171      </div>
1172
1173      
1174      
1175    </div>
1176    
1177    
1178
1179    <!--  Mobile cart  -->
1180    <div class="large--hide">
1181      <a href="/cart" class="cart-page-link mobile-cart-page-link">
1182        <span class="icon icon-cart header-bar__cart-icon" aria-hidden="true"></span>
1183        <span class="cart-count  hidden-count">0</span>
1184      </a>
1185    </div>
1186    
1187  </div>
1188  
1189  
1190  
1191</header>
1192
1193
1194
1195
1196    
1197    <main class="wrapper main-content" role="main">
1198      <div class="grid">
1199          <div class="grid__item">
1200            
1201  
1202            
1203
1204<div class="rte">
1205  <link href='/assets/css/froala_style.min.css' rel='stylesheet' type='text/css'/><div class='fr-view'><p><img src="https://cdn.store-assets.com/s/305884/f/4702036.jpeg" alt="template_disti-27-s.jpg" title="template_disti-27-s.jpg" class="fr-fic fr-dii"><br></p>
1206    
1206<script type="text/javascript">
1207      $("img[data-type=youtube]").click(function(){
1208        var this_parent = $(this).closest("div.Grid-cell--wrapper");
1209        var height = $(this_parent).height();
1210        var youtube_player = document.createElement("iframe");
1211        youtube_player.setAttribute("style", "width:100%;  height:"+height+"px;");
1212        youtube_player.setAttribute("allowfullscreen","");
1213        youtube_player.setAttribute("src","https://www.youtube.com/embed/"+$(this).data("youtube-id")+"?autoplay=1&fs=1");
1214        this_parent.html(youtube_player);
1215      });
1216    </script>
1216</div>
1217  
1218
1219</div>
1220
1221
1222  
1223            
1224          </div>
1225      </div>
1226  
1227    </main>
1228  
1229    <footer class="site-footer small--text-center" role="contentinfo">
1230  
1231      <div class="wrapper">
1232  
1233        <div class="grid-uniform">
1234  
1235          
1236          
1237          
1238          
1239            
1240          
1241          
1242          
1243            
1244          
1245          
1246          
1247  
1248          
1249              
1250            
1251  
1252          
1253  
1254          
1255            <div class="grid__item large--one-half medium--one-half">
1256              
1257              <h4>快速連結</h4>
1258              
1259              <ul class="site-footer__links">
1260                
1261                  <li><a href="/pages/about-thehill" >認識 thehill</a></li>
1262                
1263                  <li><a href="/pages/stores" >thehill 展售店資訊</a></li>
1264                
1265                  <li><a href="/a/contact-form" >聯繫我們 Contact us</a></li>
1266                
1267                
1268              </ul>
1269            </div>
1270          
1271  
1272          
1273            <div class="grid__item large--one-half medium--one-half">
1274              <h4>關注我們</h4>
1275                
1276                <ul class="inline-list social-icons">
1277  
1278  
1279    <li>
1280      <a class="icon-fallback-text" href="https://www.facebook.com/thehill.tw" title="thehill 樂丘在Facebook上" target="_blank">
1281        
1282
1283
1284
1285    <svg xmlns="http://www.w3.org/2000/svg" class="facebook-icon-svg social-icon-svg" viewBox="0 0 1024 1024">
1286        <title>icon-facebook</title>
1287        <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"/>
1288    </svg>
1289
1290  
1291
1292        <span class="fallback-text">Facebook</span>
1293      </a>
1294    </li>
1295  
1296  
1297  
1298  
1299    <li>
1300      <a class="icon-fallback-text" href="https://www.instagram.com/thehill.store/" title="thehill 樂丘在Instagram上" target="_blank">
1301        
1302
1303
1304
1305    <svg xmlns="http://www.w3.org/2000/svg" class="instagram-icon-svg social-icon-svg" viewBox="0 0 1024 1024">
1306        <title>icon-instagram</title>
1307        <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"/>
1308    </svg>
1309
1310  
1311
1312        <span class="fallback-text">Instagram</span>
1313      </a>
1314    </li>
1315  
1316  
1317  
1318  
1319  
1320  
1321  
1322  
1323  
1324</ul>
1325
1326              <img style="width: 441px;margin-left: 0%;" src="https://cdn.store-assets.com/s/305884/f/14685055.png"/>
1327            </div>
1328          
1329        </div>
1330  
1331        <hr class="hr--small hr--clear">
1332  
1333        
1334          <div class="grid">
1335            
1336             <div class="grid__item text-center">
1337               <ul class="inline-list payment-icons">
1338                  
1339                    <li>
1340                      <span class="icon-fallback-text">
1341                        <span class="icon icon-visa" aria-hidden="true"></span>
1342                        <span class="fallback-text">Visa</span>
1343                      </span>
1344                    </li>
1345                  
1346                  
1347                    <li>
1348                      <span class="icon-fallback-text">
1349                        <span class="icon icon-master" aria-hidden="true"></span>
1350                        <span class="fallback-text">Master</span>
1351                      </span>
1352                    </li>
1353                  
1354                  
1355                    <li>
1356                      <span class="icon-fallback-text">
1357                        <span class="icon icon-american_express" aria-hidden="true"></span>
1358                        <span class="fallback-text">American Express</span>
1359                      </span>
1360                    </li>
1361                  
1362                  
1363                    <li>
1364                      <span class="icon-fallback-text">
1365                        <span class="icon icon-jcb" aria-hidden="true"></span>
1366                        <span class="fallback-text">JCB</span>
1367                      </span>
1368                    </li>
1369                  
1370                  
1371                  
1372               </ul>
1373             </div>
1374             
1375             
1376           
1377             <div class="grid__item text-center">
1378               <ul class="inline-list payment-icons">
1379                    <li>
1380                    <img src="https://s3-ap-southeast-1.amazonaws.com/eesb.public/images/payment/ssl_certified.png">
1381                    </li>
1382               </ul>
1383             </div>
1384           
1385           </div>
1386         
1387  
1388         <div class="grid">
1389           <div class="grid__item text-center">
1390             <p class="site-footer__links">Copyright© 2026 THEHILL SYSTEMS Co., Ltd. All Rights Reserved.</p>
1391             
1392             <p class="site-footer__links">
1393              
1394              
1395                
1396                  <a href="/legal/terms-of-service">服務條款</a>
1397                
1398                
1399              
1400                
1401                  | <a href="/legal/privacy-policy">隱私政策</a>
1402                
1403                
1404              
1405                
1406                  | <a href="/legal/refund-policy">退款政策</a>
1407                
1408                
1409              
1410             </p>
1411             
1412           </div>
1413         </div>
1414  
1415      </div>
1416    </footer>
1417  
1418    
1419  
1420    
1420<script src="https://store-themes.easystore.co/305884/themes/1592/assets/fastclick.min.js?t=1787072505" type="text/javascript" ></script>
1420
1421    
1421<script src="https://store-themes.easystore.co/305884/themes/1592/assets/timber.js?t=1787072505" type="text/javascript" ></script>
1421
1422    
1422<script src="https://store-themes.easystore.co/305884/themes/1592/assets/theme.js?t=1787072505" type="text/javascript" ></script>
1422
1423  
1424    
1425  
1426    
1427  
1428    
1429
1430<script src="/assets/currencies.js" type="text/javascript" ></script>
vendor: 2 bytes, line 1430
1430
1431<script src="/assets/jquery.currencies.min.js" type="text/javascript" ></script>
vendor: 2 bytes, line 1431
1431
1432<script src="/assets/currencies_format.js" type="text/javascript" ></script>
1432
1433
1434<script>
1435Currency.format = "money_with_currency_format";
1436var shopCurrency = 'TWD';
1437var selectedCurrency = '';
1438
1439
1440  Currency.convert = function(amount, from, to) {
1441    return amount;
1442  };
1443
1444  
1445if( $.cookie("currency") == null ){
1446  
1447  if( selectedCurrency != false ) {
1448
1449  Currency.convertAll(shopCurrency, selectedCurrency);
1450  jQuery('.selected-currency').text(Currency.currentCurrency);  
1451
1452  }
1453
1454}
1455
1456/* Sometimes merchants change their shop currency, let's tell our JavaScript file */
1457// Currency.moneyFormats[shopCurrency].money_with_currency_format = "";
1458// Currency.moneyFormats[shopCurrency].money_format = "NT$ {{amount}} ";
1459  
1460/* Default currency */
1461var defaultCurrency = 'TWD';
1462  
1463/* Cookie currency */
1464var cookieCurrency = Currency.cookie.read();
1465
1466  cookieCurrency = shopCurrency;
1467
1468$("input[name=current_currency]").val(cookieCurrency);
1469if(cookieCurrency == null){
1470  cookieCurrency = shopCurrency;
1471  Currency.cookie.write(shopCurrency);
1472}
1473/* Fix for customer account pages */
1474jQuery('span.money span.money').each(function() {
1475  jQuery(this).parents('span.money').removeClass('money');
1476});
1477/* Saving the current price */
1478jQuery('span.money').each(function() {
1479  jQuery(this).attr('data-currency-TWD', jQuery(this).html());
1480});
1481// If there's no cookie.
1482if (cookieCurrency == null) {
1483  if (shopCurrency !== defaultCurrency) {
1484    Currency.convertAll(shopCurrency, defaultCurrency);
1485  }
1486  else {
1487    Currency.currentCurrency = defaultCurrency;
1488  }
1489}
1490// If the cookie value does not correspond to any value in the currency dropdown.
1491else if (jQuery('[name=currencies]').size() && jQuery('[name=currencies] option[value=' + cookieCurrency + ']').size() === 0) {
1492  Currency.currentCurrency = shopCurrency;
1493  Currency.cookie.write(shopCurrency);
1494}
1495else if (cookieCurrency === shopCurrency) {
1496  Currency.currentCurrency = shopCurrency;
1497  Currency.convertAll(shopCurrency, cookieCurrency);
1498}
1499else {
1500  Currency.convertAll(shopCurrency, cookieCurrency);
1501}
1502jQuery('[name=currencies]').val(Currency.currentCurrency).change(function() {
1503  var newCurrency = jQuery(this).val();
1504  
1505  
1506    Currency.cookie.write(newCurrency)
1507    if ('page' == 'cart') {
1508      const params = new URLSearchParams(window.location.search);
1509      params.set('delete_cache', 1);
1510      window.location.search = params;
1511    } else {
1512      window.location.reload();
1513    }
1514  
1515});
1516var original_selectCallback = window.selectCallback;
1517var selectCallback = function(variant, selector) {
1518  var currencies = null;
1519  original_selectCallback(variant, selector);
1520  if(typeof jQuery('[name=currencies]').val() == "undefined"){
1521    currencies = shopCurrency;
1522  }
1523  else{
1524    currencies = jQuery('[name=currencies]').val();
1525  }
1526  Currency.convertAll(shopCurrency, currencies);
1527  jQuery('.selected-currency').text(Currency.currentCurrency);
1528};
1529$('body').on('ajaxCart.afterCartLoad', function(cart) {
1530  Currency.convertAll(shopCurrency, jQuery('[name=currencies]').val());
1531  jQuery('.selected-currency').text(Currency.currentCurrency);  
1532});
1533jQuery('.selected-currency').text(Currency.currentCurrency);
1534</script>
1534
1535
1536
1537  
1538<!-- Snippet:global/body_end: Product Label -->
1539<link href='https://apps.easystore.co/assets/css/product-label/main.css?v2' rel='stylesheet' type='text/css' media='screen' />
1539<script src='https://apps.easystore.co/product-labels/productlabelv2.js?shop=thehill2738.easy.co' type='text/javascript'></script>
1539
1540<!-- /Snippet -->
1541<script>
1542
1543  /*
1544
1545    ------
1546    Events
1547    ------
1548
1549    pages/viewed
1550
1551    customers/signup
1552
1553    customers/login
1554
1555    products/searched
1556
1557    collections/viewed
1558
1559    products/viewed
1560
1561    products/shared
1562
1563    wishlists/item_added
1564
1565    carts/items_added
1566
1567    carts/viewed
1568
1569    carts/item_removed
1570
1571    checkouts/initiated
1572
1573    checkouts/shipping_info_added
1574
1575    checkouts/payment_info_added
1576
1577    checkouts/completed
1578
1579    orders/placed
1580
1581    orders/purchased
1582
1583    payments/captured
1584
1585    payments/failed
1586
1587  */
1588
1589  window.__latest_cart = window.__latest_cart || null;
1590
1591  const _selector = document.querySelector.bind(document),
1592        _selectorAll = document.querySelectorAll.bind(document)
1593
1594  document.addEventListener('DOMContentLoaded', (event) => {
1595
1596    const default_currency = getCookie("currency")
1597    const customer_id = window.__st.cid
1598    const template    = window.__st.p
1599
1600    onPageView()
1601
1602    //-----------------------//
1603    //        Configs        //
1604    //-----------------------//
1605
1606    window.dataLayer = window.dataLayer || []
1607
1608    Array.prototype.last = Array.prototype.last || function() {
1609      return this[this.length - 1] || null
1610    }
1611
1612    Array.prototype.first = Array.prototype.first || function() {
1613      return this[0] || null
1614    }
1615
1616    //----------------------//
1617    //       Triggers       //
1618    //----------------------//
1619
1620    const XHR = window.XMLHttpRequest
1621
1622    function xhr() {
1623
1624      const xhr = new XHR()
1625
1626      xhr.addEventListener("readystatechange", function() {
1627
1628        if(xhr.readyState != 4) return
1629
1630        try {
1631
1632          const response_url = xhr.responseURL
1633
1634          if (response_url.includes("cart/add")) {
1635
1636            window.__latest_cart = JSON.parse(xhr.response)
1637
1638            onCartItemsAdded() // ok
1639
1640          }
1641
1642          if (response_url.includes("cart/remove_item_quantity")) {
1643
1644            window.__latest_cart = JSON.parse(xhr.response)
1645
1646            onCartItemRemoved() // ok
1647
1648          }
1649
1650          if (response_url.includes("new_cart?retrieve=true")) {
1651
1652            result = JSON.parse(xhr.response)
1653
1654            if (result.cart) {
1655              window.__latest_cart = result.cart
1656            }
1657
1658          }
1659
1660        } catch(e) {
1661
1662          console.error(e)
1663
1664        }
1665
1666      }, false);
1667
1668      return xhr
1669
1670    }
1671
1672    window.XMLHttpRequest = xhr
1673
1674    switch(template) {
1675
1676      case 'cart': onCartView() // ok
1677      break
1678      case 'product': onProductView() // ok
1679      break
1680      case 'collection': onCollectionView() // ok
1681      break
1682      case 'blog': onBlogView()
1683      break
1684      case 'article': onArticleView()
1685      break
1686      case 'payment_completed': onOrderPlace()
1687      break
1688      case 'payment_fail': onPaymentFail()
1689      break
1690
1691    }
1692
1693    // _selector('form[action="/checkout/payments"]').addEventListener("submit", onPaymentInfoAdded(_selector('form[action="/checkout/payments"]')))
1694    if (_selector('form[action="/checkout/detail"]'))                            _selector('form[action="/checkout/detail"]').addEventListener("submit", ()=>{onShippingInfoAdded(_selector('form[action="/checkout/detail"]'))})  // ok
1695    if (_selector('form[action="/checkout/shipping"]'))                          _selector('form[action="/checkout/shipping"]').addEventListener("submit", ()=>{onShippingInfoAdded(_selector('form[action="/checkout/shipping"]'))})  // ok
1696    if (_selector('form[action="/account/register"]'))                           _selector('form[action="/account/register"]').addEventListener("submit", onSignUp)  // ok
1697    if (_selector('form[action="/account/login"]'))                              _selector('form[action="/account/login"]').addEventListener("submit", onLogin)  // ok
1698    if (_selector('form[action="/search"]'))                                     _selector('form[action="/search"]').addEventListener("submit", onProductSearch()) // ok
1699    if (_selector('#line-login-btn'))                                            _selector('#line-login-btn').addEventListener('click', onLineLogin) // ok
1700    if (_selector('#PlaceOrder'))                                                _selector('#PlaceOrder').addEventListener("click", ()=>{onCheckoutComplete(_selector('form[action="/checkout/payments"]'))});  // ok
1701    if (_selector('#add_wishlist'))                                              _selector('#add_wishlist').addEventListener("click", onWishlistItemAdded) // ok
1702    if (_selectorAll('a[href="/account/logout"]'))                               _selectorAll('a[href="/account/logout"]').forEach(logoutButton => logoutButton.addEventListener("click", onLogout)) // ok
1703    if (_selector('.CartDrawerTrigger.cart-page-link'))                          _selector('.CartDrawerTrigger.cart-page-link').addEventListener("click", onCartView) // ok
1704    if (_selector('.CartDrawerTrigger.cart-page-link.mobile-cart-page-link'))    _selector('.CartDrawerTrigger.cart-page-link.mobile-cart-page-link').addEventListener("click", onCartView) // ok
1705    if (_selectorAll('a[class^="share-"]'))                                      _selectorAll('a[class^="share-"]').forEach(shareButton => shareButton.addEventListener("click", ()=>{onProductShare(shareButton)}) ) // ok
1706    if (_selectorAll('[name$="checkout"]'))                                      _selectorAll('[name$="checkout"]').forEach(checkoutButton => checkoutButton.addEventListener("click", onCheckoutInitiate))
1707
1708    // For append elements
1709    const bodyMutationObserver = new MutationObserver(() => {
1710      if (_selector('#form__spc #PlaceOrder'))             _selector('#form__spc #PlaceOrder').addEventListener("click", onSinglePageCheckout) // ok
1711      if (_selectorAll('[name$="checkout"]'))              _selectorAll('[name$="checkout"]').forEach(checkoutButton => checkoutButton.addEventListener("click", onCheckoutInitiate))
1712    });
1713    bodyMutationObserver.observe(_selector("body"), {subtree: true, childList: true});
1714
1715    //------------------------------//
1716    //        Event handlers        //
1717    //------------------------------//
1718
1719    function onPageView() {
1720
1721      EasyStore.Event.dispatch('pages/viewed', {
1722        page: {
1723          type: template,
1724          title: document.title,
1725          description: _selector('meta[name=description]') ? _selector('meta[name=description]').getAttribute('content') : null,
1726          url: location.href,
1727        }
1728      })
1729
1730    }
1731
1732    function onSignUp() {
1733
1734      const email_regex = new RegExp(/^[a-zA-Z0-9.!#$%&"*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/)
1735      const phone_regex = new RegExp(/^(\+?6?01)[0-46-9]-*[0-9]{7,8}$/)
1736
1737      const email_or_phone = _selector(`input[name="customer[email_or_phone]"]`).value.replace("+", "").replace(/\s+/, "")
1738
1739      let data = {}
1740
1741      if (email_regex.test(email_or_phone)) {
1742        data.method = 'email'
1743        data.email = email_or_phone
1744      }
1745
1746      if (phone_regex.test(email_or_phone)) {
1747        data.method = "phone"
1748        data.phone = email_or_phone
1749      }
1750
1751      if (!data.method) return
1752
1753      EasyStore.Event.dispatch('customers/signup', data)
1754
1755    }
1756
1757    function onLogin() {
1758
1759      const email_regex = new RegExp(/^[a-zA-Z0-9.!#$%&"*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/)
1760      const phone_regex = new RegExp(/^(\+?6?01)[0-46-9]-*[0-9]{7,8}$/)
1761
1762      const email_or_phone = _selector(`input[name="customer[email_or_phone]"]`).value.replace("+", "").replace(/\s+/, "")
1763
1764      let data = {}
1765
1766      if (email_regex.test(email_or_phone)) {
1767        data.method = 'email'
1768        data.email = email_or_phone
1769      }
1770
1771      if (phone_regex.test(email_or_phone)) {
1772        data.method = "phone"
1773        data.phone = email_or_phone
1774      }
1775
1776      if (!data.method) return
1777
1778      EasyStore.Event.dispatch('customers/login', data)
1779
1780    }
1781
1782    function onLineLogin() {
1783
1784      EasyStore.Event.dispatch('customers/login', { method: 'line' })
1785
1786    }
1787
1788    function onLogout() {
1789
1790      EasyStore.Event.dispatch('customers/logout', { customer_id })
1791
1792    }
1793
1794    function onBlogView() {
1795
1796      const blog = ""
1797
1798      EasyStore.Event.dispatch('blogs/viewed', { blog })
1799
1800    }
1801
1802    function onArticleView() {
1803
1804      const article = ""
1805
1806      EasyStore.Event.dispatch('articles/viewed', { article })
1807
1808    }
1809
1810    function onProductSearch() {
1811
1812      const query = _selector('input[name=q]').value
1813
1814      if (!query) return
1815
1816      EasyStore.Event.dispatch('products/searched', { query })
1817
1818    }
1819
1820    function onCollectionView() {
1821
1822      const collection = ""
1823
1824      EasyStore.Event.dispatch('collections/viewed', { collection })
1825
1826    }
1827
1828    function onProductView() {
1829
1830      const product = ""
1831
1832      EasyStore.Event.dispatch("products/viewed", { product })
1833
1834    }
1835
1836    function onProductShare(el) {
1837
1838      const product = ""
1839
1840      const channel = el.getAttribute("class").split("-").last()
1841
1842      EasyStore.Event.dispatch('products/shared', { product, channel })
1843
1844    }
1845
1846    function onWishlistItemAdded() {
1847
1848      let product  = ""
1849      const quantity = _selector("#Quantity").value
1850
1851      EasyStore.Event.dispatch('wishlists/item_added', { product })
1852
1853    }
1854
1855    async function onCartItemsAdded() {
1856
1857      const cart = await getCart()
1858
1859      if(cart && cart.items != undefined && cart.items.length > 0) {
1860
1861        EasyStore.Event.dispatch('carts/item_added', { cart })
1862
1863      }
1864
1865    }
1866
1867    async function onCartView() {
1868
1869      const cart = await getCart()
1870
1871      EasyStore.Event.dispatch('carts/viewed', { cart })
1872
1873    }
1874
1875    async function onCartItemRemoved() {
1876
1877      const cart = await getCart()
1878
1879      cart.items = []
1880
1881      if(cart) {
1882
1883        EasyStore.Event.dispatch('carts/item_removed', { cart })
1884
1885      }
1886
1887    }
1888
1889    async function onCheckoutInitiate() {
1890
1891      const cart = await getCart()
1892
1893      EasyStore.Event.dispatch('checkouts/initiated', { cart })
1894
1895    }
1896
1897    async function onShippingInfoAdded(form) {
1898      let checkout = getCheckout()
1899
1900      let form_data = {}
1901      new FormData(form).forEach((value, key) => form_data[key] = value)
1902
1903      let shipping_tier = null
1904
1905      if (form_data.type && form_data.type.startsWith("r_pickup")) {
1906        shipping_tier = `Pickup - ${form_data.pick_location}`
1907      }
1908
1909      if (form_data.s_id) {
1910        shipping_tier = _selector(`input[id='`+form_data.s_id+`']`).getAttribute("data-shipping-name")
1911      }
1912
1913      if (!shipping_tier) return
1914
1915      EasyStore.Event.dispatch('checkouts/shipping_info_added', { checkout, shipping_tier })
1916
1917    }
1918
1919    async function onPaymentInfoAdded(form) {
1920
1921      let checkout = getCheckout()
1922
1923      let payment_type = new FormData(form).get('payment_method')
1924
1925      EasyStore.Event.dispatch("checkouts/payment_info_added", { checkout, payment_type })
1926
1927    }
1928
1929    async function onOrderPlace() {
1930
1931      let cart_token  = getCookie("cart_js")
1932      let previous_cart_token = getCookie("previous_cart_ga4_js")
1933
1934      if (previous_cart_token && previous_cart_token == cart_token) {
1935        // Prevent duplicate purchase tracking
1936        return
1937      }
1938
1939      let order = getOrder()
1940
1941      EasyStore.Event.dispatch('orders/placed', { order })
1942
1943      if(order.is_manual_payment) {
1944
1945        EasyStore.Event.dispatch('orders/purchased', { order })
1946
1947      }
1948
1949      const last_transaction = order.transactions.last()
1950
1951      if (last_transaction.status) {
1952
1953        EasyStore.Event.dispatch('orders/purchased', { order })
1954        EasyStore.Event.dispatch('payments/captured', { order })
1955
1956      }
1957
1958    }
1959
1960    async function onPaymentFail() {
1961
1962      const order = getOrder()
1963
1964      EasyStore.Event.dispatch('payments/failed', { order })
1965
1966    }
1967
1968    async function onCheckoutComplete(form) {
1969
1970      onPaymentInfoAdded(form)
1971
1972      const checkout = getCheckout()
1973
1974      EasyStore.Event.dispatch('checkouts/completed', { checkout })
1975
1976    }
1977
1978    async function onSinglePageCheckout() {
1979
1980      // let checkout = $("[data-app-checkout]").data("app-checkout")
1981
1982      let checkout = getCheckout()
1983
1984      // const payment_type = _selector("#app_spc_payment_method").find(`[class*="label-content"]`).first().find("b").first().text()
1985      const payment_type = _selector("#app_spc_payment_method").getElementsByClassName('label-content')[0].getElementsByTagName('b')[0].innerHTML
1986
1987      const shipping_method = _selector("#delivery_method").value
1988
1989      let shipping_tier = null
1990      let app_spc_customer_info_label = _selector("#app_spc_customer_info").getElementsByClassName('label-content')
1991      if (shipping_method == "shipping") {
1992        shipping_tier = app_spc_customer_info_label[app_spc_customer_info_label.length - 1].getElementsByTagName('b')[0].innerHTML
1993      }
1994
1995      if (shipping_method == "pickup") {
1996        shipping_tier = app_spc_customer_info_label[0].innerHTML
1997      }
1998
1999      if (shipping_tier) {
2000
2001        EasyStore.Event.dispatch('checkouts/shipping_info_added', {
2002          checkout,
2003          shipping_tier,
2004        })
2005
2006      }
2007
2008      if (payment_type) {
2009
2010        EasyStore.Event.dispatch('checkouts/payment_info_added', {
2011          checkout,
2012          payment_type,
2013        })
2014
2015      }
2016
2017      EasyStore.Event.dispatch('checkouts/completed', { checkout })
2018
2019    }
2020
2021  })
2022
2023
2024  //-----------------------//
2025  //       Functions       //
2026  //-----------------------//
2027
2028  function getCookie(name) {
2029
2030    name += "="
2031
2032    decodedCookie = decodeURIComponent(document.cookie)
2033
2034    ca = decodedCookie.split(";")
2035
2036    for(i = 0; i < ca.length; i++) {
2037      c = ca[i]
2038      while (c.charAt(0) == " ") {
2039        c = c.substring(1)
2040      }
2041      if (c.indexOf(name) == 0) {
2042        return c.substring(name.length, c.length)
2043      }
2044    }
2045
2046    return ""
2047
2048  }
2049
2050  const parsePrice = price => {
2051    if(typeof price === 'string') {
2052      return parseFloat(price.split(',').join(''))
2053    }
2054
2055    return price
2056  }
2057
2058  const requestCart = async (method, data) => {
2059
2060  let response = await fetch('/cart.json', {method: 'GET',headers: {'Content-Type': 'application/json'}})
2061    result = await response.json()
2062
2063    return result.cart
2064
2065  }
2066  const getCart = async (latest = false) => {
2067
2068    let cart = window.__latest_cart
2069
2070    const cart_invalid = !cart || !cart.items || (cart.total_price > 0 && !cart.items.length)
2071
2072    if(latest || cart_invalid) {
2073      cart = await requestCart()
2074    }
2075
2076    cart.items = cart.items || []
2077
2078    return mapCart(cart)
2079
2080  }
2081
2082  const getCheckout = async () => {
2083    mapCheckout(window.__latest_cart || await requestCart())
2084  }
2085
2086  const getOrder = async () => {
2087    mapOrder(window.__latest_cart || await requestCart())
2088  }
2089
2090  //-----------------------//
2091  //        Mappers        //
2092  //-----------------------//
2093
2094  const fallbackAttribute = (object, attribute) => {
2095
2096    if(!Array.isArray(attribute)) {
2097      attribute = [attribute]
2098    }
2099
2100    let final_value = null
2101
2102    do {
2103
2104      final_value = object[attribute.shift()]
2105
2106    } while(!final_value && attribute.length)
2107
2108    return final_value
2109
2110  }
2111
2112  const map = (object, mapper) => {
2113
2114    const newObject = {}
2115
2116    for(const key in mapper) {
2117
2118      // Handle different keys between new and old format
2119      newObject[key] = fallbackAttribute(object, mapper[key])
2120
2121      // Cast price to float
2122      if(newObject[key] && ['price', 'amount', 'discount', 'discounts'].some(x => key.endsWith(x))) {
2123        newObject[key] = parsePrice(newObject[key])
2124      }
2125
2126      if(newObject[key] === undefined) {
2127        delete newObject[key]
2128      }
2129
2130    }
2131
2132    return newObject
2133
2134  }
2135
2136  const mapCart = cart => {
2137
2138    const oldCart = cart
2139
2140    const mapper = {
2141      id: 'id',
2142      currency: 'currency',
2143      item_count: 'item_count',
2144      items: 'items',
2145      total_price: 'total_price',
2146      latest_items: 'latest_items'
2147    }
2148
2149    cart = map(cart, mapper)
2150
2151    const discounts = (oldCart.storewide_discounts || []).concat((oldCart.voucher_discounts || []))
2152
2153    cart.discount_applications = discounts.map(discount => ({
2154      title: discount.voucher_code || null,
2155      value: parsePrice(discount.amount),
2156    }))
2157
2158    cart.original_total_price = cart.items.length
2159    ? cart.items
2160      .map(item => item.original_price)
2161      .reduce((sum, price) => sum + price)
2162    : 0
2163
2164    cart.total_discount = cart.discount_applications.length
2165    ? cart.discount_applications
2166      .map(discount => parsePrice(discount.value))
2167      .reduce((sum, value) => sum + value)
2168    : 0
2169
2170    cart.items = cart.items.map(item => mapLineItem(item))
2171
2172    return cart
2173
2174  }
2175
2176  const mapCheckout = checkout => {
2177
2178    const mapper = {
2179      note: 'note',
2180      attributes: 'note_attributes',
2181      billing_address: 'billing_address',
2182      currency: 'currency',
2183      customer_id: 'customer_id',
2184      discounts_amount: 'total_discount',
2185      id: 'id',
2186      line_items: 'order_item',
2187      order_number: 'order_number',
2188      shipping_address: 'shipping_address',
2189      shipping_price: 'shipping_tax',
2190      shipping_method: 'shipping_method_name',
2191      tax_price: 'total_tax',
2192    }
2193
2194    checkout = map(checkout, mapper)
2195
2196    checkout.requires_shipping = checkout.line_items.some(item => item.shipping_required)
2197
2198    checkout.line_items = checkout.line_items.map(item => mapLineItem(item))
2199
2200    return checkout
2201
2202  }
2203
2204  const mapOrder = order => {
2205
2206    const mapper = {
2207      attributes: 'note_attributes',
2208      billing_address: 'billing_address',
2209      cancelled: 'is_cancelled',
2210      cancelled_at: 'cancelled_at',
2211      created_at: 'created_at',
2212      customer_id: 'customer_id',
2213      // discount_applications: 'discount_applications',
2214      email: 'email',
2215      financial_status: 'financial_status',
2216      fulfillment_status: 'fulfillment_status',
2217      line_items: 'order_item',
2218      note: 'note',
2219      order_number: 'order_number',
2220      phone: 'phone',
2221      shipping_address: 'shipping_address',
2222      shipping_methods: 'shipping_methods',
2223      shipping_price: 'total_shipping',
2224      subtotal_price: 'subtotal_price',
2225      // tax_lines: 'tax_lines',
2226      tax_price: 'total_tax',
2227      total_discounts: 'total_discount',
2228      total_net_amount: 'total_amount_include_transaction',
2229      total_price: 'total_price',
2230      transactions: 'transaction_records',
2231      is_manual_payment: 'is_manual_payment',
2232    }
2233
2234    order.email = order.billing_address.email
2235    order.phone = order.billing_address.phone
2236    order.shipping_method = order.shipping_method_name
2237
2238    order = map(order, mapper)
2239
2240    order.line_items = order.line_items.map(item => mapLineItem(item))
2241    order.transactions = order.transactions.map(transaction => mapTransaction(transaction))
2242
2243    return order
2244
2245  }
2246
2247  const mapLineItem = line_item => {
2248
2249    const old_line_item = line_item
2250
2251    const mapper = {
2252      final_price: 'price',
2253      image: 'img_url',
2254      message: 'message',
2255      original_line_price: 'original_line_price',
2256      original_price: 'original_price',
2257      properties: 'properties',
2258      quantity: 'quantity',
2259      requires_shipping: 'shipping_required',
2260      sku: 'sku',
2261      taxable: 'taxable',
2262      title: 'product_name',
2263      product_name: 'product_name',
2264      url: 'url',
2265      product_id: 'product_id',
2266      variant_id: 'variant_id',
2267      id: ['id', 'i_id'],
2268    }
2269
2270    line_item = map(line_item, mapper)
2271
2272    line_item.product_id = line_item.product_id || (old_line_item.product && old_line_item.product.id) || null
2273    line_item.variant_id = line_item.variant_id || (old_line_item.variant && old_line_item.variant.id) || null
2274    line_item.image      = line_item.image || (old_line_item.image && old_line_item.image.url) || null
2275
2276    return line_item
2277
2278  }
2279
2280  const mapTransaction = transaction => {
2281
2282    const mapper = {
2283      amount: 'amount',
2284      created_at: 'created_at',
2285      gateway: 'gateway_type',
2286      id: 'id',
2287      status: 'status',
2288    }
2289
2290    transaction = map(transaction, mapper)
2291
2292    return transaction
2293
2294  }
2295
2296
2297</script>
2297
2298
2299</div>
2300</body>
2301</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.