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 – 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()">×</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.