PageSourceSearch

https://taiwanvolleyball.com/cart

html taiwanvolleyball.com collected 2026-10-08 20:25:23 UTC 93,900 bytes, 2,481 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/1331442/f/11961147.jpg" />
15  
16
17  <!-- Title and description ================================================== -->
18  <title>
19  Cart &ndash; VolleyBa!!
20  </title>
21
22  
23
24  <!-- Social meta ================================================== -->
25  
26
27  <meta property="og:type" content="website">
28  <meta property="og:title" content="Cart">
29  <meta property="og:url" content="https://taiwanvolleyball.com/cart">
30  
31    <meta property="og:image" content="https://cdn.store-assets.com/s/1331442/f/11961147.jpg">
32    <meta property="og:image:secure_url" content="https://cdn.store-assets.com/s/1331442/f/11961147.jpg">
33  
34
35
36<meta property="og:description" content="VolleyBa!! 官方網站">
37<meta property="og:site_name" content="VolleyBa!!">
38
39
40
41  <meta name="twitter:card" content="summary">
42
43
44
45  <meta name="twitter:site" content="@">
46
47
48
49
50
51  <!-- Helpers ================================================== -->
52  <link rel="canonical" href="https://taiwanvolleyball.com/cart">
53  <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1">
54  <meta name="theme-color" content="#000000">
55  
56  
56<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js" type="text/javascript" ></script>
56
57  
58  <!-- Header hook for plugins ================================================== -->
59  
60<!-- ScriptTags -->
61<script>window.__st={p: "cart",cid: null,cem: null,cph: null,cfn: null,cln: null,cge: null,cdb: null,ccc: null};</script>
61<script src='/assets/events.js'></script>
61<script>(function(){function asyncLoad(){var urls=['/assets/facebook-pixel.js?v=1.2.1736866863','/assets/traffic.js?v=1','https://apps.easystore.co/facebook-login/script.js?shop=twvolleyball.easy.co&t=1699150087'];for(var i=0;i<urls.length;i++){var s=document.createElement('script');s.type='text/javascript';s.async=true;s.src=urls[i];var x=document.getElementsByTagName('script')[0];x.parentNode.insertBefore(s, x);}}window.attachEvent ? window.attachEvent('onload', asyncLoad) : window.addEventListener('load', asyncLoad, false);})();</script>
61
62<!-- /ScriptTags -->
63
64  
65  
66  
66<script src="https://store-themes.easystore.co/1331442/themes/181882/assets/global.js?t=1789887612" defer="defer"></script>
66
67
68  
69  
70  
70<script>
71  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
72  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
73  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
74  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
75
76  ga('create', '', 'auto','myTracker');
77  ga('myTracker.send', 'pageview');
78
79  </script>
79
80  
81  
81<script src="/assets/storefront.js?id=1d419de2011a5572c98b" type="text/javascript" ></script>
81
82  
83
84  <!-- CSS ================================================== -->
85  <style>
86      @font-face {
87        font-family: 'Alata';
88        font-style: normal;
89        font-weight: regular;
90        src: local('Alata regular'), local('Alata-regular'), url(https://fonts.gstatic.com/s/alata/v2/PbytFmztEwbIofe6xKcRQEOX.ttf) format('truetype');
91      }
92
93      @font-face {
94        font-family: 'Alata';
95        font-style: normal;
96        font-weight: regular;
97        src: local('Alata regular'), local('Alata-regular'), url(https://fonts.gstatic.com/s/alata/v2/PbytFmztEwbIofe6xKcRQEOX.ttf) format('truetype');
98      }
99
100      :root {
101        --font-body-family: 'Alata', sans-serif;
102        --font-body-style: normal;
103        --font-body-weight: 500;
104
105        --font-heading-family: 'Alata', sans-serif;
106        --font-heading-style: normal;
107        --font-heading-weight: 700;
108
109        --color-heading-text: 0,0,0;
110        --color-base-text: 0,0,0;
111        --color-base-background-1: 255,255,255;
112        --color-base-background-2: 255,255,255;
113        
114        --color-base-solid-button-labels: 255,255,255;
115        --color-base-outline-button-labels: 5,28,98;
116        
117        --color-base-accent-1: 0,0,0;
118        --color-base-accent-2: 0,0,0;
119        --payment-terms-background-color: 255,255,255;
120
121        --gradient-base-background-1: 255,255,255;
122        --gradient-base-background-2: 255,255,255;
123        --gradient-base-accent-1: 0,0,0;
124        --gradient-base-accent-2: 0,0,0;
125
126        --page-width: 125rem;
127      }
128
129      *,
130      *::before,
131      *::after {
132        box-sizing: inherit;
133      }
134
135      html {
136        box-sizing: border-box;
137        font-size: 62.5%;
138        height: 100%;
139      }
140
141      body {
142        display: grid;
143        grid-template-rows: auto auto 1fr auto;
144        grid-template-columns: 100%;
145        min-height: 100%;
146        margin: 0;
147        font-size: 1.5rem;
148        letter-spacing: 0.06rem;
149        line-height: 1.8;
150        font-family: var(--font-body-family);
151        font-style: var(--font-body-style);
152        font-weight: var(--font-body-weight);
153        
154      }
155
156      @media screen and (min-width: 750px) {
157        body {
158          font-size: 1.6rem;
159        }
160      }
161   </style>
162  
163  <link href="https://store-themes.easystore.co/1331442/themes/181882/assets/base.css?t=1789887612" rel="stylesheet" type="text/css" media="screen" />
164
165  
166  
167<!-- Snippet:global/head: Google Search Console -->
168<meta name="google-site-verification" content="JvNTKCNmjIlzXAGiBskqTZoHjmpDPTzRiVLLJyuby3k" />
169<!-- /Snippet -->
170
171
172  
172<script>document.documentElement.className = document.documentElement.className.replace('no-js', 'js');</script>
172
173</head>
174
175<body id="cart" class="template-cart" >
176	
177  
178<!-- Snippet:global/body_start: Console Extension -->
179<div id='es_console' style='display: none;'>1331442</div>
180<!-- /Snippet -->
181
182	
183 	<style>
184  header {
185    --logo-width: 120px;
186  }
187  .header-wrapper,
188  .header-wrapper .list-menu--disclosure,
189  .header-wrapper .search-modal{
190    background-color: #FFFFFF;
191  }
192  .header-wrapper .search-modal .field__input{
193    background-color: rgb(var(--color-background));
194  }
195  .header-wrapper summary .icon-caret,
196  .header-wrapper .header__menu-item a,
197  .header-wrapper .list-menu__item,
198  .header-wrapper .link--text{
199    color: #000000;
200  }
201  
202  .search-modal__form{
203    position: relative;
204  }
205  
206  .dropdown {
207    display: none;
208    position: absolute;
209    top: 100%;
210    left: 0;
211    width: 100%;
212    padding: 5px 0;
213    background-color: #fff;
214    color:#000;
215    z-index: 1000;
216    border-bottom-left-radius: 15px;
217    border-bottom-right-radius: 15px;
218    border: 1px solid rgba(var(--color-foreground), 1);
219    border-top: none;
220    overflow-x: hidden;
221    overflow-y: auto;
222    max-height: 350px;
223  }
224  
225  .dropdown-item {
226    padding: 0.4rem 2rem;
227    cursor: pointer;
228    line-height: 1.4;
229    overflow: hidden;
230    text-overflow: ellipsis;
231    white-space: nowrap;
232  }
233  
234  .dropdown-item:hover{
235    background-color: #f3f3f3;
236  }
237  
238  .search__input.is-focus{
239    border-radius: 15px;
240    border-bottom-left-radius: 0;
241    border-bottom-right-radius: 0;
242    border: 1px solid rgba(var(--color-foreground), 1);
243    border-bottom: none;
244    box-shadow: none;
245  }
246  
247  .clear-all {
248    text-align: right;
249    padding: 0 2rem 0.2rem;
250    line-height: 1;
251    font-size: 70%;
252    margin-bottom: -2px;
253  }
254  
255  .clear-all:hover{
256    background-color: #fff;
257  }
258  
259  .search-input-focus .easystore-section-header-hidden{
260    transform: none;
261  }
262  .referral-notification {
263    position: absolute;
264    top: 100%;
265    right: 0;
266    background: white;
267    border: 1px solid #e0e0e0;
268    border-radius: 8px;
269    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
270    width: 280px;
271    z-index: 1000;
272    padding: 16px;
273    margin-top: 8px;
274    font-size: 14px;
275    line-height: 1.4;
276  }
277  
278  .referral-notification::before {
279    content: '';
280    position: absolute;
281    top: -8px;
282    right: 20px;
283    width: 0;
284    height: 0;
285    border-left: 8px solid transparent;
286    border-right: 8px solid transparent;
287    border-bottom: 8px solid white;
288  }
289  
290  .referral-notification::after {
291    content: '';
292    position: absolute;
293    top: -9px;
294    right: 20px;
295    width: 0;
296    height: 0;
297    border-left: 8px solid transparent;
298    border-right: 8px solid transparent;
299    border-bottom: 8px solid #e0e0e0;
300  }
301  
302  .referral-notification h4 {
303    margin: 0 0 8px 0;
304    color: #2196F3;
305    font-size: 16px;
306    font-weight: 600;
307  }
308  
309  .referral-notification p {
310    margin: 0 0 12px 0;
311    color: #666;
312  }
313  
314  .referral-notification .referral-code {
315    background: #f5f5f5;
316    padding: 8px;
317    border-radius: 4px;
318    font-family: monospace;
319    font-size: 13px;
320    text-align: center;
321    margin: 8px 0;
322    border: 1px solid #ddd;
323  }
324  
325  .referral-notification .close-btn {
326    position: absolute;
327    top: 8px;
328    right: 8px;
329    background: none;
330    border: none;
331    font-size: 18px;
332    color: #999;
333    cursor: pointer;
334    padding: 0;
335    width: 20px;
336    height: 20px;
337    line-height: 1;
338  }
339  
340  .referral-notification .close-btn:hover {
341    color: #333;
342  }
343  
344  .referral-notification .action-btn {
345    background: #2196F3;
346    color: white;
347    border: none;
348    padding: 8px 16px;
349    border-radius: 4px;
350    cursor: pointer;
351    font-size: 12px;
352    margin-right: 8px;
353    margin-top: 8px;
354  }
355  
356  .referral-notification .action-btn:hover {
357    background: #1976D2;
358  }
359  
360  .referral-notification .dismiss-btn {
361    background: transparent;
362    color: #666;
363    border: 1px solid #ddd;
364    padding: 8px 16px;
365    border-radius: 4px;
366    cursor: pointer;
367    font-size: 12px;
368    margin-top: 8px;
369  }
370  
371  .referral-notification .dismiss-btn:hover {
372    background: #f5f5f5;
373  }
374  .referral-modal__dialog {
375    transform: translate(-50%, 0);
376    transition: transform var(--duration-default) ease, visibility 0s;
377    z-index: 10000;
378    position: fixed;
379    top: 20vh;
380    left: 50%;
381    width: 100%;
382    max-width: 350px;
383    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
384    border-radius: 12px;
385    background-color: #fff;
386    color: #000;
387    padding: 20px;
388    text-align: center;
389  }
390
391  .modal-overlay.referral-modal-overlay {
392    position: fixed;
393    top: 0;
394    left: 0;
395    width: 100%;
396    height: 100%;
397    background-color: rgba(0, 0, 0, 0.7);
398    z-index: 2001;
399    display: block;
400    opacity: 1;
401    transition: opacity var(--duration-default) ease, visibility 0s;
402  }
403</style>
404
405<link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/section-header.css?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
406<link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/component-list-menu.css?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
407<link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/component-menu-drawer.css?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
408<link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/component-cart-notification.css?v1.1?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
409
410<script src="https://store-themes.easystore.co/1331442/themes/181882/assets/cart-notification.js?t=1789887612" defer="defer"></script>
vendor: 2 bytes, line 410
410
411<script src="https://store-themes.easystore.co/1331442/themes/181882/assets/details-modal.js?t=1789887612" defer="defer"></script>
411
412
413<svg xmlns="http://www.w3.org/2000/svg" class="hidden">
414  <symbol id="icon-search" viewbox="0 0 18 19" fill="none">
415    <path fill-rule="evenodd" clip-rule="evenodd" d="M11.03 11.68A5.784 5.784 0 112.85 3.5a5.784 5.784 0 018.18 8.18zm.26 1.12a6.78 6.78 0 11.72-.7l5.4 5.4a.5.5 0 11-.71.7l-5.41-5.4z" fill="currentColor"/>
416  </symbol>
417
418  <symbol id="icon-close" class="icon icon-close" fill="none" viewBox="0 0 18 17">
419    <path d="M.865 15.978a.5.5 0 00.707.707l7.433-7.431 7.579 7.282a.501.501 0 00.846-.37.5.5 0 00-.153-.351L9.712 8.546l7.417-7.416a.5.5 0 10-.707-.708L8.991 7.853 1.413.573a.5.5 0 10-.693.72l7.563 7.268-7.418 7.417z" fill="currentColor">
420  </symbol>
421</svg>
422
423
424<div id="easystore-section-header">
425  <sticky-header class="header-wrapper header-wrapper--border-bottom">
426    <header class="header header--top-center page-width header--has-menu" itemscope itemtype="http://schema.org/Organization">
427      <header-drawer data-breakpoint="tablet">
428        <details class="menu-drawer-container menu-opening">
429          <summary class="header__icon header__icon--menu header__icon--summary link link--text focus-inset" aria-label="Menu" role="button" aria-expanded="true" aria-controls="menu-drawer">
430            <span>
431              
432
433
434    <svg class="icon icon-hamburger " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M32.5,65h535a25,25,0,0,0,0-50H32.5a25,25,0,0,0,0,50Z" fill="currentColor"/><path d="M567.5,275H32.5a25,25,0,0,0,0,50h535a25,25,0,0,0,0-50Z" fill="currentColor"/><path d="M567.5,535H32.5a25,25,0,0,0,0,50h535a25,25,0,0,0,0-50Z" fill="currentColor"/></svg>
435
436  
437
438              
439
440
441    <svg class="icon icon-close " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M335.36,300,581.87,53.48a25,25,0,0,0-35.35-35.35L300,264.64,53.48,18.13A25,25,0,0,0,18.13,53.48L264.64,300,18.13,546.52a25,25,0,0,0,35.35,35.35L300,335.36,546.52,581.87a25,25,0,0,0,35.35-35.35Z" fill="currentColor"/></svg>
442
443  
444
445            </span>
446          </summary>
447          <div id="menu-drawer" class="menu-drawer motion-reduce" tabindex="-1">
448            <div class="menu-drawer__inner-container">
449              <div class="menu-drawer__navigation-container">
450                <nav class="menu-drawer__navigation">
451                  <ul class="menu-drawer__menu list-menu" role="list">
452                    
453                    
454                      
455                        <li>
456                          <a href="/collections/volleyba-x-oh9-official-collab"  class="menu-drawer__menu-item list-menu__item link link--text focus-inset">
457                            VolleyBa!! X OH9
458                          </a>
459                        </li>
460                      
461                    
462                    
463                      
464                        <li>
465                          <a href="/collections/uvst-university-sport-學院運動品牌"  class="menu-drawer__menu-item list-menu__item link link--text focus-inset">
466                            UVST(University Sport)學院運動品牌
467                          </a>
468                        </li>
469                      
470                    
471                    
472                      
473                        <li>
474                          <a href="/collections/vol-sports"  class="menu-drawer__menu-item list-menu__item link link--text focus-inset">
475                            VOL SPORTS 品牌專區
476                          </a>
477                        </li>
478                      
479                    
480                    
481                      
482                        <li>
483                          <a href="/collections/basketball-籃球裝備區"  class="menu-drawer__menu-item list-menu__item link link--text focus-inset">
484                            BASKETBALL籃球配件
485                          </a>
486                        </li>
487                      
488                    
489                    
490                      
491                        <li>
492                          <a href="/collections/高質感球類運動服飾"  class="menu-drawer__menu-item list-menu__item link link--text focus-inset">
493                            運動服飾
494                          </a>
495                        </li>
496                      
497                    
498                    
499                      
500                        <li>
501                          <a href="/collections/束褲"  class="menu-drawer__menu-item list-menu__item link link--text focus-inset">
502                            日系束褲
503                          </a>
504                        </li>
505                      
506                    
507                    
508                      
509                        <li>
510                          <a href="/collections/volleyba-x-oh9-萌兔出擊|電繡羽排兔-usagi-|排球x羽球-
510實戰白襪"  class="menu-drawer__menu-item list-menu__item link link--text focus-inset">
511                            VOLLEYBA!! X OH9 萌兔出擊|電繡羽排兔 (Usagi)
512                          </a>
513                        </li>
514                      
515                    
516                    
517                      
518                        <li>
519                          <a href="/collections/聰明排球人組合優惠區"  class="menu-drawer__menu-item list-menu__item link link--text focus-inset">
520                            獨家口碑 超高CP值 訓練襪
521                          </a>
522                        </li>
523                      
524                    
525                    
526                      
527                        <li>
528                          <a href="/collections/排球抱枕-沙發枕-拋接毛絨排球"  class="menu-drawer__menu-item list-menu__item link link--text focus-inset">
529                            排球抱枕 沙發枕 毛絨排球拋接玩物
530                          </a>
531                        </li>
532                      
533                    
534                  </ul>
535                </nav>
536
537                <div class="menu-drawer__utility-links">
538
539                  
540
541
542
543
544
545                  
546                  
547                  
548                    <a href="/account/login" class="menu-drawer__account link link--text focus-inset h5">
549                       
550
551
552    <svg class="icon icon-account " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M300,296.19c-70.7,0-137.11,28.74-187,80.93-49.59,51.87-76.9,120.77-76.9,194v25H563.89v-25c0-73.22-27.31-142.12-76.9-194C437.11,324.93,370.7,296.19,300,296.19ZM87.42,546.11C99.29,433.81,190.1,346.19,300,346.19s200.71,87.62,212.58,199.92Z" fill="currentColor"/><path d="M300,285.34c77.6,0,140.73-63.13,140.73-140.73S377.6,3.89,300,3.89,159.27,67,159.27,144.61,222.4,285.34,300,285.34Zm0-231.45a90.73,90.73,0,1,1-90.73,90.72A90.82,90.82,0,0,1,300,53.89Z" fill="currentColor"/></svg>
553
554  
555 
556                      
557                      登入
558                    </a>
559                  
560                    <a href="/account/register" class="menu-drawer__account link link--text focus-inset h5">
561                      
562                       
563
564
565    <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" role="presentation" class="icon icon-plus " fill="none" viewBox="0 0 10 10">
566      <path fill-rule="evenodd" clip-rule="evenodd" d="M1 4.51a.5.5 0 000 1h3.5l.01 3.5a.5.5 0 001-.01V5.5l3.5-.01a.5.5 0 00-.01-1H5.5L5.49.99a.5.5 0 00-1 .01v3.5l-3.5.01H1z" fill="currentColor"></path>
567    </svg>
568
569  
570 
571                      註冊帳號
572                    </a>
573                  
574                  
575                  
576                </div>
577              </div>
578            </div>
579          </div>
580        </details>
581      </header-drawer>
582  
583      
584        <a href="/" class="header__heading-link link link--text focus-inset" itemprop="url">
585          <img src="https://cdn.store-assets.com/s/1331442/f/11961147.jpg" class="header__heading-logo" alt="VolleyBa!!" loading="lazy" itemprop="logo">
586        </a>
587      
588
589      
590      <div class="header__search-input" tabindex="-1">
591        <form action="/search" method="get" role="search" class="search search-modal__form">
592          <div class="field">
593            <input class="search__input field__input" 
594              id="Search-In-Modal"
595              type="search"
596              name="q"
597              value=""
598              placeholder="搜尋"
599              autocomplete="off"
600            >
601            <label class="field__label" for="Search-In-Modal">搜尋</label>
602            <div class="dropdown" id="searchDropdown"></div>
603            <input type="hidden" name="search_history" class="hidden_search_history">
604            <input type="hidden" name="options[prefix]" value="last">
605            <button class="search__button field__button" aria-label="搜尋">
606              <svg class="icon icon-search" aria-hidden="true" focusable="false" role="presentation">
607                <use href="#icon-search">
608              </svg>
609            </button> 
610          </div>
611        </form>
612      </div>
613      
614
615      <nav class="header__inline-menu">
616        <ul class="list-menu list-menu--inline" role="list">
617          
618            
619              
620                <li>
621                  <a href="/collections/volleyba-x-oh9-official-collab"  class="header__menu-item header__menu-item list-menu__item link link--text focus-inset">
622                    VolleyBa!! X OH9
623                  </a>
624                </li>
625              
626            
627            
628              
629                <li>
630                  <a href="/collections/uvst-university-sport-學院運動品牌"  class="header__menu-item header__menu-item list-menu__item link link--text focus-inset">
631                    UVST(University Sport)學院運動品牌
632                  </a>
633                </li>
634              
635            
636            
637              
638                <li>
639                  <a href="/collections/vol-sports"  class="header__menu-item header__menu-item list-menu__item link link--text focus-inset">
640                    VOL SPORTS 品牌專區
641                  </a>
642                </li>
643              
644            
645            
646              
647                <li>
648                  <a href="/collections/basketball-籃球裝備區"  class="header__menu-item header__menu-item list-menu__item link link--text focus-inset">
649                    BASKETBALL籃球配件
650                  </a>
651                </li>
652              
653            
654            
655              
656                <li>
657                  <a href="/collections/高質感球類運動服飾"  class="header__menu-item header__menu-item list-menu__item link link--text focus-inset">
658                    運動服飾
659                  </a>
660                </li>
661              
662            
663            
664              
665                <li>
666                  <a href="/collections/束褲"  class="header__menu-item header__menu-item list-menu__item link link--text focus-inset">
667                    日系束褲
668                  </a>
669                </li>
670              
671            
672            
673              
674                <li>
675                  <a href="/collections/volleyba-x-oh9-萌兔出擊|電繡羽排兔-usagi-|排球x羽球-
675實戰白襪"  class="header__menu-item header__menu-item list-menu__item link link--text focus-inset">
676                    VOLLEYBA!! X OH9 萌兔出擊|電繡羽排兔 (Usagi)
677                  </a>
678                </li>
679              
680            
681            
682              
683                <li>
684                  <a href="/collections/聰明排球人組合優惠區"  class="header__menu-item header__menu-item list-menu__item link link--text focus-inset">
685                    獨家口碑 超高CP值 訓練襪
686                  </a>
687                </li>
688              
689            
690            
691              
692                <li>
693                  <a href="/collections/排球抱枕-沙發枕-拋接毛絨排球"  class="header__menu-item header__menu-item list-menu__item link link--text focus-inset">
694                    排球抱枕 沙發枕 毛絨排球拋接玩物
695                  </a>
696                </li>
697              
698            
699            
700            
701              
702                
703                  
704                
705                  
706                
707              
708            
709        </ul>
710      </nav>
711      <div class="header__icons">
712
713        
714          
715            <div class="header__icon header__icon--account link link--text focus-inset small-hide medium-hide" style="position: relative;">
716              <a href="/account/login" class="header__icon link link--text focus-inset p-2">
717                
718
719
720    <svg class="icon icon-account " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M300,296.19c-70.7,0-137.11,28.74-187,80.93-49.59,51.87-76.9,120.77-76.9,194v25H563.89v-25c0-73.22-27.31-142.12-76.9-194C437.11,324.93,370.7,296.19,300,296.19ZM87.42,546.11C99.29,433.81,190.1,346.19,300,346.19s200.71,87.62,212.58,199.92Z" fill="currentColor"/><path d="M300,285.34c77.6,0,140.73-63.13,140.73-140.73S377.6,3.89,300,3.89,159.27,67,159.27,144.61,222.4,285.34,300,285.34Zm0-231.45a90.73,90.73,0,1,1-90.73,90.72A90.82,90.82,0,0,1,300,53.89Z" fill="currentColor"/></svg>
721
722  
723
724                <span id="my-account" class="header__link-label">登入</span>
725              </a>
726
727              <!-- Referral Notification Popup for Desktop -->
728              <div id="referralNotification" class="referral-notification" style="display: none;">
729                <button class="close-btn" onclick="dismissReferralNotification()">&times;</button>
730                <div style="text-align: center; margin-bottom: 16px;">
731                  <div style="width: 100px; height: 100px; margin: 0 auto;">
732                    <img src="https://resources.easystore.co/storefront/icons/channels/vector_referral_program.svg">
733                  </div>
734                </div>
735                <p id="referralSignupMessage" style="text-align: center; font-size: 14px; color: #666; margin: 0 0 20px 0;">
736                  您的好友送您   回饋金!立即註冊領取。
737                </p>
738                <div style="text-align: center;">
739                  <button class="btn" onclick="goToSignupPage()" style="width: 100%;">
740                    註冊
741                  </button>
742                </div>
743              </div>
744            </div>
745          
746        
747
748        <a href="/cart" class="header__icon link link--text focus-inset" id="cart-icon-bubble">
749          <span class="header__icon--cart">
750            
751
752
753    <svg class="icon icon-cart-empty " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496.56 600"><path d="M453.52,128.63a25,25,0,0,0-24.91-22.8H364.72a117.48,117.48,0,0,0-232.89,0H67.94A25,25,0,0,0,43,128.63L8.8,515.21a72.11,72.11,0,0,0,19.05,55.6,79,79,0,0,0,58.22,25.3H410.49a79,79,0,0,0,58.22-25.3,72.11,72.11,0,0,0,19.05-55.6ZM248.28,53.89a67.58,67.58,0,0,1,65.65,51.94H182.63A67.57,67.57,0,0,1,248.28,53.89ZM431.83,537.05a28.85,28.85,0,0,1-21.34,9.06H86.07a28.85,28.85,0,0,1-21.34-9.06,22.69,22.69,0,0,1-6.13-17.43L90.82,155.83h40v51.23a25,25,0,0,0,50,0V155.83h135v51.23a25,25,0,0,0,50,0V155.83h40L438,519.62A22.68,22.68,0,0,1,431.83,537.05Z" fill="currentColor"/></svg>
754
755  
756
757            <div class="cart-count-bubble hidden">
758              <span aria-hidden="true" class="js-content-cart-count"></span>
759            </div>
760          </span>
761          <span class="header__link-label medium-hide small-hide">
762            購物車
763          </span>
764        </a>
765
766        
767          
768          <!-- Referral Notification Modal for Mobile -->
769          <details-modal class="referral-modal" id="referralMobileModal">
770            <details>
771              <summary class="referral-modal__toggle" aria-haspopup="dialog" aria-label="Open referral modal" style="display: none;">
772              </summary>
773              <div class="modal-overlay referral-modal-overlay"></div>
774              <div class="referral-modal__dialog" role="dialog" aria-modal="true" aria-label="Referral notification">
775                <div class="referral-modal__content">
776                  <button type="button" class="modal__close-button" aria-label="Close" onclick="closeMobileReferralModal()" style="position: absolute; top: 16px; right: 16px; background: none; border: none; font-size: 24px; cursor: pointer;">
777                    &times;
778                  </button>
779                  
780                  <div style="margin-bottom: 24px;">
781                    <div style="width: 120px; height: 120px; margin: 0 auto 20px;">
782                      <img src="https://resources.easystore.co/storefront/icons/channels/vector_referral_program.svg" style="width: 100%; height: 100%;">
783                    </div>
784                  </div>
785                  
786                  <p id="referralSignupMessageMobile" style="font-size: 16px; color: #333; margin: 0 0 30px 0; line-height: 1.5;">
787                    您的好友送您   回饋金!立即註冊領取。
788                  </p>
789                  
790                  <button type="button" class="btn" onclick="goToSignupPageFromMobile()" style="width: 100%;">
791                    註冊
792                  </button>
793                </div>
794              </div>
795            </details>
796          </details-modal>
797          
798        
799        
800      </div>
801    </header>
802  </sticky-header>
803  
804<cart-notification>
805  <div class="cart-notification-wrapper page-width color-background-1">
806    <div id="cart-notification" class="cart-notification focus-inset" aria-modal="true" aria-label="已加入購物車" role="dialog" tabindex="-1">
807      <div class="cart-notification__header">
808        <h2 class="cart-notification__heading caption-large">
809
810
811    <svg class="icon icon-checkmark color-foreground-text " aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 9" fill="none">
812      <path fill-rule="evenodd" clip-rule="evenodd" d="M11.35.643a.5.5 0 01.006.707l-6.77 6.886a.5.5 0 01-.719-.006L.638 4.845a.5.5 0 11.724-.69l2.872 3.011 6.41-6.517a.5.5 0 01.707-.006h-.001z" fill="currentColor"></path>
813    </svg>
814
815  
816 已加入購物車</h2>
817        <button type="button" class="cart-notification__close modal__close-button link link--text focus-inset" aria-label="accessibility.close">
818          
819
820
821    <svg class="icon icon-close " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M335.36,300,581.87,53.48a25,25,0,0,0-35.35-35.35L300,264.64,53.48,18.13A25,25,0,0,0,18.13,53.48L264.64,300,18.13,546.52a25,25,0,0,0,35.35,35.35L300,335.36,546.52,581.87a25,25,0,0,0,35.35-35.35Z" fill="currentColor"/></svg>
822
823  
824
825        </button>
826      </div>
827      <div id="cart-notification-product" class="cart-notification-product"></div>
828      <div class="cart-notification__links">
829        <a href="/cart" id="cart-notification-button" class="button button--secondary button--full-width">查看購物車 (<span class="js-content-cart-count"></span>)</a>
830        <form action="/cart" method="post" id="cart-notification-form">
831          <input type="hidden" name="_token" value="P65EqdKiPifER775IgX0LOP4npCxYm3X9rgjpG6X">
832          <input type="hidden" name="current_currency" value="">
833          <button class="button button--primary button--full-width" name="checkout" value="true">結帳</button>
834        </form>
835        <button type="button" class="link button-label">繼續購物</button>
836      </div>
837    </div>
838  </div>
839</cart-notification>
840<style>
841  .cart-notification {
842     display: none;
843  }
844</style>
845<script>
846document.getElementById('cart-notification-form').addEventListener('submit',(event)=>{
847  if(event.submitter) event.submitter.classList.add('loading');
848})
849
850</script>
850
851
852</div>
853
854
855<script>
856
857  class StickyHeader extends HTMLElement {
858    constructor() {
859      super();
860    }
861
862    connectedCallback() {
863      this.header = document.getElementById('easystore-section-header');
864      this.headerBounds = {};
865      this.currentScrollTop = 0;
866      this.preventReveal = false;
867
868      this.onScrollHandler = this.onScroll.bind(this);
869      this.hideHeaderOnScrollUp = () => this.preventReveal = true;
870
871      this.addEventListener('preventHeaderReveal', this.hideHeaderOnScrollUp);
872      window.addEventListener('scroll', this.onScrollHandler, false);
873
874      this.createObserver();
875    }
876
877    disconnectedCallback() {
878      this.removeEventListener('preventHeaderReveal', this.hideHeaderOnScrollUp);
879      window.removeEventListener('scroll', this.onScrollHandler);
880    }
881
882    createObserver() {
883      let observer = new IntersectionObserver((entries, observer) => {
884        this.headerBounds = entries[0].intersectionRect;
885        observer.disconnect();
886      });
887
888      observer.observe(this.header);
889    }
890
891    onScroll() {
892      const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
893
894      if (scrollTop > this.currentScrollTop && scrollTop > this.headerBounds.bottom) {
895        requestAnimationFrame(this.hide.bind(this));
896      } else if (scrollTop < this.currentScrollTop && scrollTop > this.headerBounds.bottom) {
897        if (!this.preventReveal) {
898          requestAnimationFrame(this.reveal.bind(this));
899        } else {
900          window.clearTimeout(this.isScrolling);
901
902          this.isScrolling = setTimeout(() => {
903            this.preventReveal = false;
904          }, 66);
905
906          requestAnimationFrame(this.hide.bind(this));
907        }
908      } else if (scrollTop <= this.headerBounds.top) {
909        requestAnimationFrame(this.reset.bind(this));
910      }
911
912
913      this.currentScrollTop = scrollTop;
914    }
915
916    hide() {
917      this.header.classList.add('easystore-section-header-hidden', 'easystore-section-header-sticky');
918      this.closeMenuDisclosure();
919      // this.closeSearchModal();
920    }
921
922    reveal() {
923      this.header.classList.add('easystore-section-header-sticky', 'animate');
924      this.header.classList.remove('easystore-section-header-hidden');
925    }
926
927    reset() {
928      this.header.classList.remove('easystore-section-header-hidden', 'easystore-section-header-sticky', 'animate');
929    }
930
931    closeMenuDisclosure() {
932      this.disclosures = this.disclosures || this.header.querySelectorAll('details-disclosure');
933      this.disclosures.forEach(disclosure => disclosure.close());
934    }
935
936    // closeSearchModal() {
937    //   this.searchModal = this.searchModal || this.header.querySelector('details-modal');
938    //   this.searchModal.close(false);
939    // }
940  }
941
942  customElements.define('sticky-header', StickyHeader);
943
944  
945  class DetailsDisclosure extends HTMLElement{
946    constructor() {
947      super();
948      this.mainDetailsToggle = this.querySelector('details');
949      // this.mainDetailsToggle.addEventListener('focusout', this.onFocusOut.bind(this));
950      this.mainDetailsToggle.addEventListener('mouseover', this.open.bind(this));
951      this.mainDetailsToggle.addEventListener('mouseleave', this.close.bind(this));
952    }
953
954    onFocusOut() {
955      setTimeout(() => {
956        if (!this.contains(document.activeElement)) this.close();
957      })
958    }
959
960    open() {
961      this.mainDetailsToggle.setAttribute('open',1)
962    }
963
964    close() {
965      this.mainDetailsToggle.removeAttribute('open')
966    }
967  }
968
969  customElements.define('details-disclosure', DetailsDisclosure);
970
971  function clearAll() {
972    localStorage.removeItem('searchHistory'); 
973    
974    var customer = "";
975    if(customer) {
976      // Your logic to clear all data or call an endpoint
977      fetch('/account/search_histories', {
978          method: 'DELETE',
979          headers: {
980            "Content-Type": "application/json",
981            "X-Requested-With": "XMLHttpRequest"
982          },
983          body: JSON.stringify({
984            _token: "P65EqdKiPifER775IgX0LOP4npCxYm3X9rgjpG6X"
985          }),
986      })
987      .then(response => response.json())
988    }
989  }
990  // End - delete search history from local storage
991  
992  // search history dropdown  
993  var searchInputs = document.querySelectorAll('.search__input');
994  
995  if(searchInputs.length > 0) {
996    
997    searchInputs.forEach((searchInput)=> {
998    
999      searchInput.addEventListener('focus', function() {
1000        var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown');
1001        searchDropdown.innerHTML = ''; // Clear existing items
1002  
1003        // retrieve data from local storage
1004        var searchHistoryData = JSON.parse(localStorage.getItem('searchHistory')) || [];
1005  
1006        // Convert JSON to string
1007        var search_history_json = JSON.stringify(searchHistoryData);
1008  
1009        // Set the value of the hidden input
1010        searchInput.closest('form').querySelector(".hidden_search_history").value = search_history_json;
1011  
1012        // create dropdown items
1013        var clearAllItem = document.createElement('div');
1014        clearAllItem.className = 'dropdown-item clear-all';
1015        clearAllItem.textContent = 'Clear';
1016        clearAllItem.addEventListener('click', function() {
1017          clearAll();
1018          searchDropdown.style.display = 'none';
1019          searchInput.classList.remove('is-focus');
1020        });
1021        searchDropdown.appendChild(clearAllItem);
1022  
1023        // create dropdown items
1024        searchHistoryData.forEach(function(item) {
1025          var dropdownItem = document.createElement('div');
1026          dropdownItem.className = 'dropdown-item';
1027          dropdownItem.textContent = item.term;
1028          dropdownItem.addEventListener('click', function() {
1029            searchInput.value = item.term;
1030            searchInput.closest('form').submit();
1031            searchDropdown.style.display = 'none';
1032          });
1033          searchDropdown.appendChild(dropdownItem);
1034        });
1035  
1036        if(searchHistoryData.length > 0){
1037          // display the dropdown
1038          searchInput.classList.add('is-focus');
1039          document.body.classList.add('search-input-focus');
1040          searchDropdown.style.display = 'block';
1041        }
1042      });
1043  
1044      searchInput.addEventListener("focusout", (event) => {
1045        var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown');
1046        searchInput.classList.remove('is-focus');
1047        searchDropdown.classList.add('transparent');
1048        setTimeout(()=>{
1049          searchDropdown.style.display = 'none';
1050          searchDropdown.classList.remove('transparent');
1051          document.body.classList.remove('search-input-focus');
1052        }, 400);
1053      });
1054    })
1055  }
1056  // End - search history dropdown
1057
1058  // referral notification popup
1059  const referralMessageTemplate = '您的好友送您 __CURRENCY_CODE__ __CREDIT_AMOUNT__ 回饋金!立即註冊領取。';
1060  const shopCurrency = 'NT$';
1061
1062  function getCookie(name) {
1063    const value = `; ${document.cookie}`;
1064    const parts = value.split(`; ${name}=`);
1065    if (parts.length === 2) return parts.pop().split(';').shift();
1066    return null;
1067  }
1068
1069  function removeCookie(name) {
1070    document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;
1071  }
1072
1073  function showReferralNotification() {
1074    const referralCode = getCookie('customer_referral_code');
1075    
1076    
1077    const customerReferralCode = null;
1078    
1079    
1080    const activeReferralCode = referralCode || customerReferralCode;
1081    const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {};
1082    
1083    if (referralData.timestamp && referralData.expirationDays) {
1084      const expirationTime = referralData.timestamp + (referralData.expirationDays * 24 * 60 * 60 * 1000);
1085      if (Date.now() > expirationTime) {
1086        localStorage.removeItem('referral_notification_data');
1087        return;
1088      }
1089    }
1090    
1091    if (referralData.dismissed) return;
1092    
1093    if (activeReferralCode) {
1094      if (referralData.creditAmount) {
1095        displayReferralNotification(referralData.creditAmount);
1096      } else {
1097        fetchReferralCampaignData(activeReferralCode);
1098      }
1099    }
1100  }
1101    
1102  function fetchReferralCampaignData(referralCode) {
1103    fetch(`/customer/referral_program/campaigns/${referralCode}`)
1104      .then(response => {
1105        if (!response.ok) {
1106          throw new Error('Network response was not ok');
1107        }
1108        return response.json();
1109      })
1110      .then(data => {
1111        let refereeCreditAmount = null;
1112        if (data.data.campaign && data.data.campaign.referral_rules) {
1113          const refereeRule = data.data.campaign.referral_rules.find(rule => 
1114            rule.target_type === 'referee' && 
1115            rule.event_name === 'customer/create' && 
1116            rule.entitlement && 
1117            rule.entitlement.type === 'credit'
1118          );
1119          
1120          if (refereeRule) {
1121            refereeCreditAmount = refereeRule.entitlement.amount;
1122          }
1123        }
1124        
1125        const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {};
1126        referralData.creditAmount = refereeCreditAmount;
1127        referralData.dismissed = referralData.dismissed || false;
1128        referralData.timestamp = Date.now();
1129        referralData.expirationDays = 3;
1130        localStorage.setItem('referral_notification_data', JSON.stringify(referralData));
1131        
1132        displayReferralNotification(refereeCreditAmount);
1133      })
1134      .catch(error => {
1135        removeCookie('customer_referral_code');
1136      });
1137  }
1138    
1139  function displayReferralNotification(creditAmount = null) {
1140    const isMobile = innerWidth <= 749;
1141    
1142    if (isMobile) {
1143      const mobileModal = document.querySelector('#referralMobileModal details');
1144      const mobileMessageElement = document.getElementById('referralSignupMessageMobile');
1145      
1146      if (mobileModal && mobileMessageElement) {
1147        if (creditAmount) {
1148          const finalMessage = referralMessageTemplate
1149            .replace('__CREDIT_AMOUNT__', creditAmount)
1150            .replace('__CURRENCY_CODE__', shopCurrency);
1151          
1152          mobileMessageElement.textContent = finalMessage;
1153        }
1154        
1155        mobileModal.setAttribute('open', '');
1156      }
1157    } else {
1158      const notification = document.getElementById('referralNotification');
1159      
1160      if (notification) {
1161        if (creditAmount) {
1162          const messageElement = document.getElementById('referralSignupMessage');
1163          if (messageElement) {
1164            const finalMessage = referralMessageTemplate
1165              .replace('__CREDIT_AMOUNT__', creditAmount)
1166              .replace('__CURRENCY_CODE__', shopCurrency);
1167            
1168            messageElement.textContent = finalMessage;
1169          }
1170        }
1171        
1172        notification.style.display = 'block';
1173      }
1174    }
1175  }
1176
1177  showReferralNotification();
1178
1179  addEventListener('beforeunload', function() {
1180    const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {};
1181    
1182    if (referralData.creditAmount !== undefined) {
1183      referralData.creditAmount = null;
1184      localStorage.setItem('referral_notification_data', JSON.stringify(referralData));
1185    }
1186  });
1187
1188  function closeReferralNotification() {
1189    const notification = document.getElementById('referralNotification');
1190    if (notification) {
1191      notification.style.display = 'none';
1192    }
1193  }
1194
1195  function dismissReferralNotification() {
1196    const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {};
1197    
1198    referralData.dismissed = true;
1199    referralData.timestamp = referralData.timestamp || Date.now();
1200    referralData.expirationDays = referralData.expirationDays || 3;
1201    
1202    localStorage.setItem('referral_notification_data', JSON.stringify(referralData));
1203    
1204    closeReferralNotification();
1205  }
1206
1207  function goToSignupPage() {
1208    location.href = '/account/register';
1209    dismissReferralNotification();
1210  }
1211
1212  function closeMobileReferralModal() {
1213    const mobileModal = document.querySelector('#referralMobileModal details');
1214    if (mobileModal) {
1215      mobileModal.removeAttribute('open');
1216    }
1217    
1218    const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {};
1219    referralData.dismissed = true;
1220    referralData.timestamp = referralData.timestamp || Date.now();
1221    referralData.expirationDays = referralData.expirationDays || 3;
1222    localStorage.setItem('referral_notification_data', JSON.stringify(referralData));
1223  }
1224
1225  function goToSignupPageFromMobile() {
1226    location.href = '/account/register';
1227    closeMobileReferralModal();
1228  }
1229  // End - referral notification popup
1230</script>
1230
1231
1232
1233
1234  <main id="MainContent" class="content-for-layout focus-none" role="main" tabindex="-1">
1235    
1236    <link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/component-cart.css?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
1237<link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/component-cart-items.css?v1.01?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
1238<link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/component-totals.css?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
1239<link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/component-price.css?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
1240<link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/component-discounts.css?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
1241<link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/component-loading-overlay.css?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
1242<link rel="preload" href="/assets/css/vouchers.css?v1.2" as="style" onload="this.onload=null;this.rel='stylesheet'">
1243<link rel="preload" href="/assets/account/vouchers/vouchers.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
1244<link rel="preload" href="/assets/account/vouchers/voucher-widget.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
1245
1246<script src="/assets/js/promotion/vouchers.js?v1.3" type="text/javascript" ></script>
vendor: 2 bytes, line 1246
1246
1247<script src="/assets/account/vouchers/voucher-widget.js" type="text/javascript" ></script>
vendor: 2 bytes, line 1247
1247
1248<script src="https://store-themes.easystore.co/1331442/themes/181882/assets/cart.js?t=1789887612" defer="defer"></script>
1248
1249
1250<section class="spaced-section">
1251  <div id="cart-promotion-top"></div>
1252
1253  <div id="cart-template">
1254    <form action="/cart" class="cart__contents critical-hidden" method="post" id="cart-form">
1255  <input type="hidden" name="_token" value="P65EqdKiPifER775IgX0LOP4npCxYm3X9rgjpG6X">
1256
1257  <cart-items class="page-width is-empty">
1258    <div class="title-wrapper-with-link">
1259      <h1 class="title title--primary">您的購物車</h1>
1260      <a href="/collections/all" class="underlined-link">繼續購物</a>
1261    </div>
1262
1263    <div class="cart__warnings">
1264      <h1 class="cart__empty-text">您的購物車目前還是空的。</h1>
1265      <a href="/collections/all" class="button">
1266        繼續購物
1267      </a>
1268    </div>
1269
1270    <!-- Cart error -->
1271    
1272    
1273    <div class="cart_form__error note errors hidden">
1274      <div class="js-error-content"></div>
1275    </div>
1276
1277    <div class="cart__items" id="main-cart-items">
1278      <div class="js-contents">
1279          <table class="cart-items">
1280            <thead>
1281                <tr>
1282                  <th class="caption-with-letter-spacing" colspan="2" scope="col">商品</th>
1283                  <th class="medium-hide large-up-hide right caption-with-letter-spacing" colspan="1" scope="col">小計</th>
1284                  <th class="cart-items__heading--wide small-hide caption-with-letter-spacing" colspan="1" scope="col">數量</th>
1285                  <th class="small-hide right caption-with-letter-spacing" colspan="1" scope="col">小計</th>
1286                </tr>
1287            </thead>
1288            <tbody>
1289              
1290            </tbody>
1291          </table>
1292      </div>
1293    </div>
1294  </cart-items>
1295
1296  <div class="page-width is-empty" id="main-cart-footer">
1297    <div class="cart__footer">
1298      <div class="cart__blocks">
1299        
1300
1301        
1302
1303        <!-- Cart discount -->
1304        
1305
1306        <div>
1307            <div class="totals">
1308              <h3 class="totals__subtotal">合計</h3>
1309              <p class="totals__subtotal-value"></p>
1310            </div>
1311            
1312            <div></div>
1313            <small class="tax-note caption-large rte">運費,稅務和折扣將在結帳時計算。</small>
1314        </div>
1315        <div class="cart__ctas">
1316            <input type="hidden" name="current_currency" value="">
1317            <input type="text" name="greeting_card_message" id="greetingCardMessage" class="hp hide hidden" tabindex="-1" autocomplete="off">
1318            <input type="text" name="product_ids" id="productIds" class="hp hide hidden" tabindex="-1" autocomplete="off">
1319
1320            <noscript>
1321              <button type="submit" name="update" class="cart__update-button button button--secondary">
1322                更新購物車
1323              </button>
1324            </noscript>
1325            <button type="submit" id="checkout" class="cart__checkout-button button" name="checkout" value="true">
1326              結帳
1327            </button>
1328            
1329        </div>
1330        
1331      </div>
1332    </div>
1333  </div>
1334
1335</form>
1336
1337  </div>
1338  <link href="/assets/css/promotion.css?v2.94" rel="stylesheet" type="text/css" media="screen" />
1339<div id="cart-promotion-section"></div>
1340
1341<script>var shop_money_format = "<span class=money data-ori-price='{{amount}}'>NT$ {{amount}} </span>";</script>
vendor: 1 bytes, line 1341
1341
1342<script src="/assets/js/promotion/promotion.js?v1.11" type="text/javascript"></script>
1342
1343
1344<script>
1345
1346    window.EasyStore = window.EasyStore || {};
1347    window.EasyStore.Promotion = window.EasyStore.Promotion || {};
1348
1349    var get_cart_promo_initial = false,
1350        current_template = 'cart';
1351
1352    window.EasyStore.Promotion.updateCartPromotion = function (){
1353        get_cart_promo_initial = true
1354        $.ajax({
1355        type: "GET",
1356        dataType: 'json',
1357        url: "/new_cart/promotion",
1358        success: function(response){
1359            $("#cart-promotion-section").html(response["cart/content_bottom"].trim());
1360            $("#cart-promotion-top").html(response["cart/content_top"].trim());
1361
1362            promoVariantDetailInitial()
1363        },
1364        error: function(xhr){
1365        }
1366        });
1367    }
1368
1369
1370    if(current_template == 'cart') {
1371        document.addEventListener("DOMContentLoaded", function() {
1372            window.EasyStore.Promotion.updateCartPromotion()
1373        });
1374    }
1375
1376</script>
vendor: 1 bytes, line 1376
1376
1377<script>
1378  document.addEventListener('DOMContentLoaded', function () {
1379    window._getVoucherErrorTranslation = Object.assign(window._getVoucherErrorTranslation || {}, {
1380      "condition_not_matched":    "優惠代碼條件不匹配",
1381      "promotion_unavailable":    "此優惠目前不可用",
1382      "available_on":             "可在 channels 使用",
1383      "available_on_only":        "僅限在 channels 使用",
1384      "available_with_locations": "可在 channels 使用(僅限 locations)",
1385      "pos_at_locations":         "僅限 locations 門市使用",
1386      "channel_website":          "網站",
1387      "channel_mobile":           "應用程式",
1388      "channel_pos":              "門市"
1389    });
1390  });
1391</script>
1391
1392
1393</section>
1394
1395<style>
1396  discount-input .field__input{
1397    margin-right: 10px;
1398  }
1399</style>
1400
1401<vouchers-modal>
1402  <div class="vouchers-modal-wrapper page-width">
1403    <div id="vouchers-modal" class="vouchers-modal focus-inset" aria-modal="true" role="dialog" tabindex="-1">
1404      <div class="vouchers-modal__header">
1405        <div class="vouchers-modal__heading">優惠券</div>
1406        <button type="button" class="vouchers-modal__close modal__close-button link link--text focus-inset" aria-label="accessibility.close">
1407          
1408
1409
1410    <svg class="icon icon-close " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M335.36,300,581.87,53.48a25,25,0,0,0-35.35-35.35L300,264.64,53.48,18.13A25,25,0,0,0,18.13,53.48L264.64,300,18.13,546.52a25,25,0,0,0,35.35,35.35L300,335.36,546.52,581.87a25,25,0,0,0,35.35-35.35Z" fill="currentColor"/></svg>
1411
1412  
1413
1414        </button>
1415      </div>
1416
1417      <discount-input>
1418        <div class="field">
1419          <input type="text" id="input-discount_code" class="search__input field__input" name="voucher_code" placeholder="折扣碼">
1420          <label class="field__label" for="input-discount_code">折扣碼</label>
1421          <button type="button" name="apply" class="button button--secondary">套用</button>
1422        </div>
1423        <div class="form__message hidden" tabindex="-1" autofocus>
1424          
1425
1426
1427    <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-error " viewBox="0 0 13 13">
1428      <circle cx="6.5" cy="6.50049" r="5.5" stroke="white" stroke-width="2"/>
1429      <circle cx="6.5" cy="6.5" r="5.5" fill="#EB001B" stroke="#EB001B" stroke-width="0.7"/>
1430      <path d="M5.87413 3.52832L5.97439 7.57216H7.02713L7.12739 3.52832H5.87413ZM6.50076 9.66091C6.88091 9.66091 7.18169 9.37267 7.18169 9.00504C7.18169 8.63742 6.88091 8.34917 6.50076 8.34917C6.12061 8.34917 5.81982 8.63742 5.81982 9.00504C5.81982 9.37267 6.12061 9.66091 6.50076 9.66091Z" fill="white"/>
1431      <path d="M5.87413 3.17832H5.51535L5.52424 3.537L5.6245 7.58083L5.63296 7.92216H5.97439H7.02713H7.36856L7.37702 7.58083L7.47728 3.537L7.48617 3.17832H7.12739H5.87413ZM6.50076 10.0109C7.06121 10.0109 7.5317 9.57872 7.5317 9.00504C7.5317 8.43137 7.06121 7.99918 6.50076 7.99918C5.94031 7.99918 5.46982 8.43137 5.46982 9.00504C5.46982 9.57872 5.94031 10.0109 6.50076 10.0109Z" fill="white" stroke="#EB001B" stroke-width="0.7"/>
1432    </svg>
1433
1434  
1435
1436          <div class="js-error-content"></div>
1437        </div>
1438      </discount-input>
1439      <br>
1440
1441      
1442      
1443        <div class="empty-vouchers_placeholder">目前無可用的優惠券</div>
1444      
1445
1446    </div>
1447  </div>
1448  <div id="vouchers-modal-backdrop" class="vouchers-modal__close"></div>
1449</vouchers-modal>
1450
1451<script>
1452  //  For voucher widget 
1453  let settings = {"colors_solid_button_labels":"#FFFFFF","colors_accent_1":"#000000","colors_text":"#000000","colors_outline_button_labels":"#051C62","colors_background_1":"#FFFFFF","gradient_background_1":"#FFFFFF","page_width":1250,"body_bg_image":"","bg_img_position":"top center","bg_img_repeat":0,"type_header_font":{"category":"sans-serif","font_family":"Alata","font_id":15,"name":"Alata","title":"Alata","variant":"regular","variant_file":"https:\/\/fonts.gstatic.com\/s\/alata\/v2\/PbytFmztEwbIofe6xKcRQEOX.ttf"},"type_body_font":{"category":"sans-serif","font_family":"Alata","font_id":15,"name":"Alata","title":"Alata","variant":"regular","variant_file":"https:\/\/fonts.gstatic.com\/s\/alata\/v2\/PbytFmztEwbIofe6xKcRQEOX.ttf"},"body_font_style":"normal","body_font_weight":"500","header_font_style":"normal","header_font_weight":"700","product_description_position":"bottom","logo_img":"https:\/\/cdn.store-assets.com\/s\/1331442\/f\/11961147.jpg?width=350&format=webp","logo_width":100,"favicon_img":"https:\/\/cdn.store-assets.com\/s\/1331442\/f\/11961147.jpg","meta_img":"https:\/\/cdn.store-assets.com\/s\/1331442\/f\/11961147.jpg","use_original_image":"0","product_img_res":"grande","show_add_to_cart_button":1,"sections":{"header":{"type":"header","settings":{"logo":"https:\/\/cdn.store-assets.com\/s\/1331442\/f\/11961147.jpg","align_logo":"top-center","logo_max_width":120,"main_linklist":"main-menu","message":0,"home_page_only":true,"message_text":"Announce something here","message_link":"","color_bg":"#FFFFFF","color_text":"#000000","enable_sticky_header":true}},"main-cart-featured-collection":{"type":"main-cart-featured-collection","settings":{"title":"\u63a8\u85a6\u5546\u54c1","collection__id":4352883,"products_per_row":5,"products_to_show":20,"show_view_all":true,"swipe_on_mobile":true,"show_secondary_image":true,"product_bg_color":"rgba(245, 245, 245, 1)","show_product_info":true,"show_add_to_cart_button":true}},"main-collection":{"type":"main-collection","settings":{"products_per_row":4,"show_secondary_image":true,"show_add_to_cart_button":true,"image_ratio":"square","product_bg_color":"rgba(245, 245, 245, 1)","show_product_info":true}},"main-product":{"type":"main-product","settings":{"variant_options_display":"radio","product_description_position":"bottom","wrapper_bg_color":"rgba(245, 245, 245, 1)","show_selected_variant_image":true,"show_product_brand":0},"blocks":{"main-product-0wkbnnri6s7r-budfnl":{"type":"text","settings":{"image":"https:\/\/cdn.store-assets.com\/s\/943101\/f\/8656462.png","text":"12\u5c0f\u6642\u5167\u5bc4\u51fa(\u6700\u616224\u5c0f\u6642\u5167\u5bc4\u51fa)"}}},"blocks_order":["main-product-0wkbnnri6s7r-budfnl"]},"footer":{"type":"footer","blocks":{"footer-sj4k55g9j8-fojkr4l":{"type":"quick_link","settings":{"title":"\u5b98\u7db2\u4fdd\u969c\uff1a \u5feb\u901f\u51fa\u8ca8 (\u5b98\u7db2\u8a02\u55ae\u512a\u5148\u8655\u7406\/\u63d0\u4f9b\u6025\u4ef6\u670d\u52d9) |  \u6d41\u7a0b\u7c21\u4fbf (25\u79d2\u5b8c\u6210\u4e0b\u55ae) |  \u5c08\u4eba\u670d\u52d9 (\u4efb\u4f55\u554f\u984c\u8acb\u79c1\u8a0aIG\u5c08\u4eba\u79d2\u56de) | \u8cfc\u7269\u4eab\u56de\u994b\u91d1 | \u751f\u65e5\u79ae\u91d1"}}},"blocks_order":["footer-sj4k55g9j8-fojkr4l"],"settings":{"color_footer_background":"#2D2D2D","color_footer_heading_text":"#FFFFFF","color_footer_body_text":"#FEFEFE"}},"1667497743109":{"settings":[],"type":"rich-text","blocks_order":["1667497743109-brlhqnr837s-u32o4a6","1667497743109-xbt7k5hyyar-4fd0zv"],"blocks":{"1667497743109-brlhqnr837s-u32o4a6":{"type":"heading","settings":{"heading":"VolleyBa!!\u5b98\u65b9\u7db2\u7ad9","heading_size":"h2"}},"1667497743109-xbt7k5hyyar-4fd0zv":{"type":"text","settings":{"text":"\u2728 \u5b98\u7db2\u4eab\u6709\u9023\u5047\u7167\u5e38\u51fa\u8ca8\u798f\u5229, \u5728\u9019\u88e1\uff0c\u6211\u5011\u63d0\u4f9b\u6bd4\u8766\u76ae\u5e73\u53f0\u66f4\u512a\u8cea\u7684\u670d\u52d9\u8207\u56de\u994b\u3002\u5b98\u7db2\u5168\u54c1\u9805\u7686\u4eab \u300c\u7368\u5bb6\u76f4\u8cfc\u50f9\u300d\u5916\u52a0\ud83c\udf81 2026\u5e74\uff0e\u5b98\u7db2\u9650\u5b9a\u56de\u994b \u53f0\u7063 \u2705 \u6eff $500 \u6298 $20 \u2705 \u6eff $700 \u6298 $45(\u7b49\u65bc\u514d\u904b) \u2705 \u6eff $900 \u6298 $70 \ud83d\udd25 \u6eff $1200 \u6574\u55ae\u4eab 9 \u6298  (\u9069\u5408\u7403\u968a\u5718\u8cfc\u3001\u63ea\u5718\u6e4a\u55ae\uff0c\u8b93\u60a8\u7684\u88dd\u5099\u5347\u7d1a\u66f4\u8f15\u9b06) \u9ede\u5206\u985e\u53ef\u4ee5\u67e5\u7
145370b\u66f4\u591a\u597d\u7269\u5537  \u82e5\u9700\u6253\u7d71\u7de8\u6216\u4efb\u4f55\u554f\u984c\u8acb\u79c1\u8a0aIG\u5c08\u4eba\u79d2\u56de\u3002\u6211\u5011\u5728\u9999\u6e2f\u6709\u5169\u9593\u975e\u5e38\u512a\u79c0\u7684\u5be6\u9ad4\u5e97\u9762\u5408\u4f5c\u5925\u4f34\uff01 \u6fb3\u9580\u4e5f\u6709\u4e00\u9593\u975e\u5e38\u512a\u79c0\u7684\u5be6\u9ad4\u5e97\u9762\u5925\u4f34\uff01\u6e2f\u6fb3\u670b\u53cb\u5011\u53ef\u4ee5\u591a\u53bb\u901b\u901b \u76f4\u63a5\u627e\u4ed6\u5011\u8cfc\u8cb7 \u652f\u6301\u4ed6\u5011\uff01\u6216\u79c1\u8a0a\u6211\u5011IG \u6703\u6709\u5c08\u4eba\u56de\u8986"}}}},"1667498127486":{"settings":{"title":"VolleyBa!! X OH9 ","collection__id":4488490,"products_per_row":5,"products_to_show":20,"show_view_all":true,"image_ratio":"square","show_secondary_image":true,"show_add_to_cart_button":true,"swipe_on_mobile":true,"center_title":true,"show_product_info":true,"product_bg_color":"rgba(246, 246, 246, 1)"},"type":"featured-collection"},"1667498929068":{"settings":{"title":"OH9\u9ed1\u72d7\u88dd\u5099","collection__id":4504023,"products_per_row":5,"products_to_show":20,"show_view_all":true,"image_ratio":"square","show_secondary_image":true,"show_add_to_cart_button":true,"swipe_on_mobile":true,"center_title":true,"show_product_info":true,"product_bg_color":"rgba(245, 245, 245, 1)"},"type":"featured-collection"},"1736761713879":{"settings":{"title":"\u840c\u5154\u51fa\u64ca\uff5cVOLLEYBA!! \u96fb\u7e61\u7fbd\u6392\u5154 (Usagi)","collection__id":4602636,"products_per_row":5,"products_to_show":20,"show_view_all":true,"image_ratio":"square","show_secondary_image":true,"show_add_to_cart_button":true,"swipe_on_mobile":true,"center_title":true,"show_product_info":true,"product_bg_color":"rgba(245, 245, 245, 1)"},"type":"featured-collection"},"1736768805583":{"settings":{"title":"\u7368\u5bb6\u53e3\u7891 \u9ad8CP\u503c\u5be6\u6230\u8a13\u7df4\u896a","collection__id":"\u8070\u660e\u6392\u7403\u4eba\u7d44\u5408\u512a\u60e0\u5340","products_per_row":5,"products_to_show":20,"show_view_all":true,"image_ratio":"square","show_secondary_image":true,"show_add_to_cart_button":true,"swipe_on_mobile":true,"center_title":true,"show_product_info":true,"product_bg_color":"rgba(245, 245, 245, 1)"},"type":"featured-collection"},"1736769100471":{"settings":{"title":"BADMINTON \u7fbd\u7403\u914d\u4ef6","collection__id":4504118,"products_per_row":5,"products_to_show":20,"show_view_all":true,"image_ratio":"square","show_secondary_image":true,"show_add_to_cart_button":true,"swipe_on_mobile":true,"center_title":true,"show_product_info":true,"product_bg_color":"rgba(245, 245, 245, 1)"},"type":"featured-collection"},"1736769147472":{"settings":{"title":"\u904b\u52d5\u670d\u98fe","collection__id":4504212,"products_per_row":5,"products_to_show":20,"show_view_all":true,"image_ratio":"square","show_secondary_image":true,"show_add_to_cart_button":true,"swipe_on_mobile":true,"center_title":true,"show_product_info":true,"product_bg_color":"rgba(245, 245, 245, 1)"},"type":"featured-collection"},"1736769609498":{"settings":{"title":"\u65e5\u7cfb\u30d0\u30ec\u30fc\u90e8 \u675f\u8932","collection__id":4504232,"products_per_row":5,"products_to_show":20,"show_view_all":true,"image_ratio":"square","show_secondary_image":true,"show_add_to_cart_button":true,"swipe_on_mobile":true,"center_title":true,"show_product_info":true,"product_bg_color":"rgba(245, 245, 245, 1)"},"type":"featured-collection"},"1736769692828":{"settings":{"title":"\u6392\u7403\u62b1\u6795 \u7d68\u6bdb\u6392\u7403 \u5750\u588a","collection__id":"\u6392\u7403\u62b1\u6795-\u6c99\u767c\u6795-\u62cb\u63a5\u6bdb\u7d68\u6392\u7403","products_per_row":5,"products_to_show":20,"show_view_all":true,"image_ratio":"square","show_secondary_image":true,"show_add_to_cart_button":true,"swipe_on_mobile":true,"center_title":true,"show_product_info":true,"product_bg_color":"rgba(245, 245, 245, 1)"},"type":"featured-collection"},"1736984970695":{"settings":{"title":"UVST UNIVERSITY SPORT","collection__id":4503756,"products_per_row":5,"products_to_show":20,"show_view_all":true,"image_ratio":"square","show_secondary_image":true,"show_add_to_cart_button":true,"swipe_on_mobile":true,"center_title":true,"show_product_info":true,"product_bg_color":"rgba(245, 245, 245, 1)"},"type":"featured-collection"}},"content_for_index":["1667497743109","1736769147472","1667498127486","1736761713879","1736769609498","1736984970695","1736769692828","1667498929068","1736769100471","1736768805583"],"placeholder":{"featured_single_product":"https:\/\/s3-ap-southeast-1.amazonaws.com\/eesb.themes\/onboarding\/candy\/en_placeholder_featured-single-product.jpg","featured_blog":"https:\/\/s3-ap-southeast-1.amazonaws.com\/eesb.themes\/onboarding\/candy\/en_placeholder_featured-blog.jpg"},"promotion_uis":{"primary_color":"#4089e4","header_bg_color":"#4089e4","header_text_color":"#fff","recommendation":{"is_show_product_page":true,"is_show_cart_page_top":true,"is_show_cart_page_bottom":true},"voucher_widget":{"primary_color":"#4089e4"}},"show_multiple_currencies":true,"supported_currencies":"TWD ","header_search_enable":true,"header_message":"","products_per_row":4,"footer_quicklinks_enable":true,"collections_sort_enable":true,"product_related_enable":true,"theme_id":181882,"theme_is_edited":1,"theme_updated_at":"2026-09-20T07:00:12.000Z","phone_account_enabled":false,"line_login_enabled":false,"apple_login_enabled":false,"timezone":"Asia\/Taipei","is_server_side_currency_conversion":true,"is_self_registration_enabled":true,"is_highlight_enabled":false,"is_auto_gen_highlight_enabled":false,"is_common_question_enabled":false,"is_auto_gen_common_question_enabled":false,"highlight_section_title":"Highlights","common_question_section_title":"Frequently asked questions","is_new_promotion_enabled":true}
1454  if (settings.promotion_uis.voucher_widget != null) {
1455    setVoucherTheme(settings.promotion_uis.voucher_widget)
1456  }
1457  var shop = {
1458    money_prefix: "",
1459    format_decimals: ""
1460  };
1461  var _getEntitlementTranslation = {
1462    "free_shipping": "免運費",
1463    "free_of_charge": "免費贈品",
1464  }
1465  var _getTargetTypeTranslation = {
1466    "amount_credit": " 回饋金",
1467    "amount_off": " 折扣",
1468  }
1469  var _getPrerequisiteTranslation = {
1470    "min_quantity": "至少購買 formatValue 件商品",
1471    "every_quantity": "每購買 formatValue 件商品",
1472    "min_amount": "最低消費 formatCurrency",
1473    "every_amount": "每消費 formatCurrency"
1474  }
1475  var _getPrerequisiteConditionTranslation = {
1476    "selected_items": "指定商品",
1477    "selected_collections": "指定分類",
1478    "storewide": "全店",
1479    "order_subtotal": "訂單金額"
1480  }
1481  var _getVoucherButtonTextTranslation = {
1482    "apply": "套用",
1483  }
1484  var _getVoucherErrorTranslation = {
1485    "condition_not_matched": "優惠代碼條件不匹配"
1486  }
1487</script>
1487
1488
1489<link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/component-card.css?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
1490<link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/component-price.css?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
1491<link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/component-product-grid.css?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
1492<link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/component-loading-overlay.css?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
1493
1494<link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/component-slider.css?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
1495<link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/template-collection.css?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
1496
1497<style>
1498  #section-main-cart-featured-collection .product-card-wrapper{
1499    background-color: rgba(245, 245, 245, 1);
1500  }
1501</style>
1502
1503
1504
1505
1506 
1507
1508
1509
1510
1511
1512<div id="section-main-cart-featured-collection" class="collection page-width page-margin">
1513  <div class="title-wrapper-with-link ">
1514    <h2 class="title">
1515       
1516        推薦商品
1517      
1518    </h2>
1519
1520    
1521  </div>
1522
1523  <slider-component class="slider-mobile-gutter">
1524    <ul class="grid grid--2-col product-grid grid--3-col-tablet grid--5-col-desktop" role="list">
1525      
1526    </ul>
1527    
1528  </slider-component>
1529
1530  
1531</div>
1532
1533
1534
1535
1536    
1537  </main>
1538 	<style>
1539  .footer{
1540    background-color: #2D2D2D;
1541    color: #FEFEFE;
1542    --color-foreground: 254,254,254;
1543  }
1544  .footer .link--text,
1545  .footer .list-menu__item--link,
1546  .footer .footer-block__details-content .list-menu__item--link{
1547    color: #FEFEFE;
1548  }
1549  .footer-block__heading{
1550    color: #FFFFFF;
1551  }
1552  .rounded{
1553    border-radius: 10px;
1554  }
1555  .shopping-app-border{
1556    border: 1px #ECECEC solid;
1557    margin-right: 3px;
1558  }
1559  .app-download-badge{
1560    display: inline-block; 
1561    margin-right: 3px;
1562  }
1563</style>
1564
1565<link rel="preload" href="https://store-themes.easystore.co/1331442/themes/181882/assets/section-footer.css?t=1789887612" as="style" onload="this.onload=null;this.rel='stylesheet'">
1566
1567<footer class="footer color-background-1">
1568  <div class="footer__content-top page-width">
1569    <div class="grid grid--1-col grid--4-col-tablet ">
1570      
1571      
1572      
1573        <div class="grid__item">
1574          
1575              <h2 class="footer-block__heading">
1576                官網保障: 快速出貨 (官網訂單優先處理/提供急件服務) |  流程簡便 (25秒完成下單) |  專人服務 (任何問題請私訊IG專人秒回) | 購物享回饋金 | 生日禮金
1577              </h2>
1578              <ul class="footer-block__details-content list-unstyled">
1579                
1580                <li>
1581                  <a href="https://www.instagram.com/volleyball.mall/"  target="_blank"  class="link link--text list-menu__item list-menu__item--link">
1582                    點擊進入VolleyBa!!官方IG
1583                  </a>
1584                </li>
1585                
1586                <li>
1587                  <a href="https://s.shopee.tw/8pUZ7BHDeK"  target="_blank"  class="link link--text list-menu__item list-menu__item--link">
1588                    點擊進入VolleyBa!!官方蝦皮
1589                  </a>
1590                </li>
1591                
1592                
1593              </ul>
1594            
1595        </div>
1596      
1597    </div>
1598  </div>
1599  <div class="footer__content-bottom">
1600    <div class="footer__content-bottom-wrapper page-width">
1601      <div class="footer__column footer__column--info">
1602
1603        
1604
1605
1606
1607
1608        
1609        <div class="footer__copyright caption">
1610          <div class="copyright__content">© 2026 VolleyBall. Powered by <a href="http://www.easystore.co/?utm_source=storefront&utm_medium=sf_ref_footer&utm_campaign=sf_ref">EasyStore</a></div>
1611        </div>
1612
1613        <div class="footer__copyright caption">
1614          
1615        </div>
1616        
1617      </div>
1618    </div>
1619  </div>
1620</footer>
1621
1622
1623
1624
1625  
1626
1627  
1627<script>
1628  EasyStore.Currencies.init([{"name":"New Taiwan Dollar","code":"TWD","rate":"1.0","format_prefix":"NT$","format_suffix":null,"format_decimals":0,"thousand_separator":",","is_primary":true}], 1)
1629</script>
1629
1630
1631
1632
1633  
1633<script>
1634    let page_template = 'cart';
1635
1636    if(document.querySelector('.currency-picker')) {
1637      EasyStore.Currencies.change(document.querySelector('.currency-picker').value)
1638      EasyStore.Currencies.convertAll() 
1639    }
1640
1641    document.querySelectorAll('.currency-picker').forEach((el)=>{
1642      el.addEventListener('change',(event)=>{
1643        EasyStore.Currencies.change(event.target.value)
1644
1645        
1646          if (page_template == 'cart') {
1647            const params = new URLSearchParams(window.location.search);
1648            params.set('delete_cache', 1);
1649            window.location.search = params;
1650          } else {
1651            window.location.reload();
1652          }
1653
1654          return
1655        
1656
1657        document.querySelectorAll('[name=currencies],[name=current_currency]').forEach((el)=>{
1658          el.value = event.target.value
1659        })
1660
1661        if(page_template == 'cart') location.reload();
1662      })
1663    })
1664  </script>
1664
1665
1666
1667
1668
1669  
1669<script>
1670
1671    window.variantStrings = {
1672      addToCart: `加入購物車`,
1673      updateCart: `更新購物車`,
1674      soldOut: `<span style='font-size:14px;'>售完</span>`,
1675      unavailable: `暫無供應`,
1676    }
1677
1678    window.accessibilityStrings = {
1679      shareSuccess: `鏈接已復製到剪貼板`,
1680    }
1681    
1682    window.promotionStrings = {
1683      title: `適用優惠`,
1684    }
1685    
1686    window.productSettings = {
1687      variantOptionsDisplay: `radio`,
1688    }
1689  </script>
1689
1690
1691  <link href="https://store-themes.easystore.co/1331442/themes/181882/assets/section-main-product.css?t=1789887612" rel="stylesheet" type="text/css" media="screen" />
1692<link href="https://store-themes.easystore.co/1331442/themes/181882/assets/component-loading-overlay.css?t=1789887612" rel="stylesheet" type="text/css" media="screen" />
1693<link href="https://store-themes.easystore.co/1331442/themes/181882/assets/product-quickview.css?t=1789887612" rel="stylesheet" type="text/css" media="screen" />
1694
1695<product-quickview-modal>
1696  <div id="product-quickview-modal" class="product-quickview-modal-wrapper focus-inset" aria-modal="true" role="dialog" tabindex="-1">
1697    <button type="button" class="product-quickview-modal__close modal__close-button link link--text focus-inset" aria-label="accessibility.close">
1698      
1699
1700
1701    <svg class="icon icon-close " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M335.36,300,581.87,53.48a25,25,0,0,0-35.35-35.35L300,264.64,53.48,18.13A25,25,0,0,0,18.13,53.48L264.64,300,18.13,546.52a25,25,0,0,0,35.35,35.35L300,335.36,546.52,581.87a25,25,0,0,0,35.35-35.35Z" fill="currentColor"/></svg>
1702
1703  
1704
1705    </button>
1706
1707    <div class="loading-overlay">	
1708      <div class="loading-overlay__spinner">	
1709        <svg aria-hidden="true" focusable="false" role="presentation" class="spinner" viewBox="0 0 66 66" xmlns="http://www.w3.org/2000/svg">	
1710            <circle class="path" fill="none" stroke-width="6" cx="33" cy="33" r="30"></circle>	
1711        </svg>	
1712      </div>	
1713    </div>	
1714
1715    <div class="product-quickview-modal__body" style="display: none;"></div>
1716  </div>
1717  <div class="product-quickview-modal-backdrop"></div>
1718</product-quickview-modal>
1719
1720<script src="https://store-themes.easystore.co/1331442/themes/181882/assets/product-form.js?t=1789887612" type="text/javascript" ></script>
vendor: 1 bytes, line 1720
1720
1721<script src="https://store-themes.easystore.co/1331442/themes/181882/assets/product-quickview.js?t=1789887612" type="text/javascript" ></script>
1721
1722  
1722<script>
1723
1724  /*
1725
1726    ------
1727    Events
1728    ------
1729
1730    pages/viewed
1731
1732    customers/signup
1733
1734    customers/login
1735
1736    products/searched
1737
1738    collections/viewed
1739
1740    products/viewed
1741
1742    products/shared
1743
1744    wishlists/item_added
1745
1746    carts/items_added
1747
1748    carts/viewed
1749
1750    carts/item_removed
1751
1752    checkouts/initiated
1753
1754    checkouts/shipping_info_added
1755
1756    checkouts/payment_info_added
1757
1758    checkouts/completed
1759
1760    orders/placed
1761
1762    orders/purchased
1763
1764    payments/captured
1765
1766    payments/failed
1767
1768  */
1769
1770  window.__latest_cart = window.__latest_cart || null;
1771
1772  const _selector = document.querySelector.bind(document),
1773        _selectorAll = document.querySelectorAll.bind(document)
1774
1775  document.addEventListener('DOMContentLoaded', (event) => {
1776
1777    const default_currency = getCookie("currency")
1778    const customer_id = window.__st.cid
1779    const template    = window.__st.p
1780
1781    onPageView()
1782
1783    //-----------------------//
1784    //        Configs        //
1785    //-----------------------//
1786
1787    window.dataLayer = window.dataLayer || []
1788
1789    Array.prototype.last = Array.prototype.last || function() {
1790      return this[this.length - 1] || null
1791    }
1792
1793    Array.prototype.first = Array.prototype.first || function() {
1794      return this[0] || null
1795    }
1796
1797    //----------------------//
1798    //       Triggers       //
1799    //----------------------//
1800
1801    const XHR = window.XMLHttpRequest
1802
1803    function xhr() {
1804
1805      const xhr = new XHR()
1806
1807      xhr.addEventListener("readystatechange", function() {
1808
1809        if(xhr.readyState != 4) return
1810
1811        try {
1812
1813          const response_url = xhr.responseURL
1814
1815          if (response_url.includes("cart/add")) {
1816
1817            window.__latest_cart = JSON.parse(xhr.response)
1818
1819            onCartItemsAdded() // ok
1820
1821          }
1822
1823          if (response_url.includes("cart/remove_item_quantity")) {
1824
1825            window.__latest_cart = JSON.parse(xhr.response)
1826
1827            onCartItemRemoved() // ok
1828
1829          }
1830
1831          if (response_url.includes("new_cart?retrieve=true")) {
1832
1833            result = JSON.parse(xhr.response)
1834
1835            if (result.cart) {
1836              window.__latest_cart = result.cart
1837            }
1838
1839          }
1840
1841        } catch(e) {
1842
1843          console.error(e)
1844
1845        }
1846
1847      }, false);
1848
1849      return xhr
1850
1851    }
1852
1853    window.XMLHttpRequest = xhr
1854
1855    switch(template) {
1856
1857      case 'cart': onCartView() // ok
1858      break
1859      case 'product': onProductView() // ok
1860      break
1861      case 'collection': onCollectionView() // ok
1862      break
1863      case 'blog': onBlogView()
1864      break
1865      case 'article': onArticleView()
1866      break
1867      case 'payment_completed': onOrderPlace()
1868      break
1869      case 'payment_fail': onPaymentFail()
1870      break
1871
1872    }
1873
1874    // _selector('form[action="/checkout/payments"]').addEventListener("submit", onPaymentInfoAdded(_selector('form[action="/checkout/payments"]')))
1875    if (_selector('form[action="/checkout/detail"]'))                            _selector('form[action="/checkout/detail"]').addEventListener("submit", ()=>{onShippingInfoAdded(_selector('form[action="/checkout/detail"]'))})  // ok
1876    if (_selector('form[action="/checkout/shipping"]'))                          _selector('form[action="/checkout/shipping"]').addEventListener("submit", ()=>{onShippingInfoAdded(_selector('form[action="/checkout/shipping"]'))})  // ok
1877    if (_selector('form[action="/account/register"]'))                           _selector('form[action="/account/register"]').addEventListener("submit", onSignUp)  // ok
1878    if (_selector('form[action="/account/login"]'))                              _selector('form[action="/account/login"]').addEventListener("submit", onLogin)  // ok
1879    if (_selector('form[action="/search"]'))                                     _selector('form[action="/search"]').addEventListener("submit", onProductSearch()) // ok
1880    if (_selector('#line-login-btn'))                                            _selector('#line-login-btn').addEventListener('click', onLineLogin) // ok
1881    if (_selector('#PlaceOrder'))                                                _selector('#PlaceOrder').addEventListener("click", ()=>{onCheckoutComplete(_selector('form[action="/checkout/payments"]'))});  // ok
1882    if (_selector('#add_wishlist'))                                              _selector('#add_wishlist').addEventListener("click", onWishlistItemAdded) // ok
1883    if (_selectorAll('a[href="/account/logout"]'))                               _selectorAll('a[href="/account/logout"]').forEach(logoutButton => logoutButton.addEventListener("click", onLogout)) // ok
1884    if (_selector('.CartDrawerTrigger.cart-page-link'))                          _selector('.CartDrawerTrigger.cart-page-link').addEventListener("click", onCartView) // ok
1885    if (_selector('.CartDrawerTrigger.cart-page-link.mobile-cart-page-link'))    _selector('.CartDrawerTrigger.cart-page-link.mobile-cart-page-link').addEventListener("click", onCartView) // ok
1886    if (_selectorAll('a[class^="share-"]'))                                      _selectorAll('a[class^="share-"]').forEach(shareButton => shareButton.addEventListener("click", ()=>{onProductShare(shareButton)}) ) // ok
1887    if (_selectorAll('[name$="checkout"]'))                                      _selectorAll('[name$="checkout"]').forEach(checkoutButton => checkoutButton.addEventListener("click", onCheckoutInitiate))
1888
1889    // For append elements
1890    const bodyMutationObserver = new MutationObserver(() => {
1891      if (_selector('#form__spc #PlaceOrder'))             _selector('#form__spc #PlaceOrder').addEventListener("click", onSinglePageCheckout) // ok
1892      if (_selectorAll('[name$="checkout"]'))              _selectorAll('[name$="checkout"]').forEach(checkoutButton => checkoutButton.addEventListener("click", onCheckoutInitiate))
1893    });
1894    bodyMutationObserver.observe(_selector("body"), {subtree: true, childList: true});
1895
1896    //------------------------------//
1897    //        Event handlers        //
1898    //------------------------------//
1899
1900    function onPageView() {
1901
1902      EasyStore.Event.dispatch('pages/viewed', {
1903        page: {
1904          type: template,
1905          title: document.title,
1906          description: _selector('meta[name=description]') ? _selector('meta[name=description]').getAttribute('content') : null,
1907          url: location.href,
1908        }
1909      })
1910
1911    }
1912
1913    function onSignUp() {
1914
1915      const email_regex = new RegExp(/^[a-zA-Z0-9.!#$%&"*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/)
1916      const phone_regex = new RegExp(/^(\+?6?01)[0-46-9]-*[0-9]{7,8}$/)
1917
1918      const email_or_phone = _selector(`input[name="customer[email_or_phone]"]`).value.replace("+", "").replace(/\s+/, "")
1919
1920      let data = {}
1921
1922      if (email_regex.test(email_or_phone)) {
1923        data.method = 'email'
1924        data.email = email_or_phone
1925      }
1926
1927      if (phone_regex.test(email_or_phone)) {
1928        data.method = "phone"
1929        data.phone = email_or_phone
1930      }
1931
1932      if (!data.method) return
1933
1934      EasyStore.Event.dispatch('customers/signup', data)
1935
1936    }
1937
1938    function onLogin() {
1939
1940      const email_regex = new RegExp(/^[a-zA-Z0-9.!#$%&"*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/)
1941      const phone_regex = new RegExp(/^(\+?6?01)[0-46-9]-*[0-9]{7,8}$/)
1942
1943      const email_or_phone = _selector(`input[name="customer[email_or_phone]"]`).value.replace("+", "").replace(/\s+/, "")
1944
1945      let data = {}
1946
1947      if (email_regex.test(email_or_phone)) {
1948        data.method = 'email'
1949        data.email = email_or_phone
1950      }
1951
1952      if (phone_regex.test(email_or_phone)) {
1953        data.method = "phone"
1954        data.phone = email_or_phone
1955      }
1956
1957      if (!data.method) return
1958
1959      EasyStore.Event.dispatch('customers/login', data)
1960
1961    }
1962
1963    function onLineLogin() {
1964
1965      EasyStore.Event.dispatch('customers/login', { method: 'line' })
1966
1967    }
1968
1969    function onLogout() {
1970
1971      EasyStore.Event.dispatch('customers/logout', { customer_id })
1972
1973    }
1974
1975    function onBlogView() {
1976
1977      const blog = ""
1978
1979      EasyStore.Event.dispatch('blogs/viewed', { blog })
1980
1981    }
1982
1983    function onArticleView() {
1984
1985      const article = ""
1986
1987      EasyStore.Event.dispatch('articles/viewed', { article })
1988
1989    }
1990
1991    function onProductSearch() {
1992
1993      const query = _selector('input[name=q]').value
1994
1995      if (!query) return
1996
1997      EasyStore.Event.dispatch('products/searched', { query })
1998
1999    }
2000
2001    function onCollectionView() {
2002
2003      const collection = ""
2004
2005      EasyStore.Event.dispatch('collections/viewed', { collection })
2006
2007    }
2008
2009    function onProductView() {
2010
2011      const product = ""
2012
2013      EasyStore.Event.dispatch("products/viewed", { product })
2014
2015    }
2016
2017    function onProductShare(el) {
2018
2019      const product = ""
2020
2021      const channel = el.getAttribute("class").split("-").last()
2022
2023      EasyStore.Event.dispatch('products/shared', { product, channel })
2024
2025    }
2026
2027    function onWishlistItemAdded() {
2028
2029      let product  = ""
2030      const quantity = _selector("#Quantity").value
2031
2032      EasyStore.Event.dispatch('wishlists/item_added', { product })
2033
2034    }
2035
2036    async function onCartItemsAdded() {
2037
2038      const cart = await getCart()
2039
2040      if(cart && cart.items != undefined && cart.items.length > 0) {
2041
2042        EasyStore.Event.dispatch('carts/item_added', { cart })
2043
2044      }
2045
2046    }
2047
2048    async function onCartView() {
2049
2050      const cart = await getCart()
2051
2052      EasyStore.Event.dispatch('carts/viewed', { cart })
2053
2054    }
2055
2056    async function onCartItemRemoved() {
2057
2058      const cart = await getCart()
2059
2060      cart.items = []
2061
2062      if(cart) {
2063
2064        EasyStore.Event.dispatch('carts/item_removed', { cart })
2065
2066      }
2067
2068    }
2069
2070    async function onCheckoutInitiate() {
2071
2072      const cart = await getCart()
2073
2074      EasyStore.Event.dispatch('checkouts/initiated', { cart })
2075
2076    }
2077
2078    async function onShippingInfoAdded(form) {
2079      let checkout = getCheckout()
2080
2081      let form_data = {}
2082      new FormData(form).forEach((value, key) => form_data[key] = value)
2083
2084      let shipping_tier = null
2085
2086      if (form_data.type && form_data.type.startsWith("r_pickup")) {
2087        shipping_tier = `Pickup - ${form_data.pick_location}`
2088      }
2089
2090      if (form_data.s_id) {
2091        shipping_tier = _selector(`input[id='`+form_data.s_id+`']`).getAttribute("data-shipping-name")
2092      }
2093
2094      if (!shipping_tier) return
2095
2096      EasyStore.Event.dispatch('checkouts/shipping_info_added', { checkout, shipping_tier })
2097
2098    }
2099
2100    async function onPaymentInfoAdded(form) {
2101
2102      let checkout = getCheckout()
2103
2104      let payment_type = new FormData(form).get('payment_method')
2105
2106      EasyStore.Event.dispatch("checkouts/payment_info_added", { checkout, payment_type })
2107
2108    }
2109
2110    async function onOrderPlace() {
2111
2112      let cart_token  = getCookie("cart_js")
2113      let previous_cart_token = getCookie("previous_cart_ga4_js")
2114
2115      if (previous_cart_token && previous_cart_token == cart_token) {
2116        // Prevent duplicate purchase tracking
2117        return
2118      }
2119
2120      let order = getOrder()
2121
2122      EasyStore.Event.dispatch('orders/placed', { order })
2123
2124      if(order.is_manual_payment) {
2125
2126        EasyStore.Event.dispatch('orders/purchased', { order })
2127
2128      }
2129
2130      const last_transaction = order.transactions.last()
2131
2132      if (last_transaction.status) {
2133
2134        EasyStore.Event.dispatch('orders/purchased', { order })
2135        EasyStore.Event.dispatch('payments/captured', { order })
2136
2137      }
2138
2139    }
2140
2141    async function onPaymentFail() {
2142
2143      const order = getOrder()
2144
2145      EasyStore.Event.dispatch('payments/failed', { order })
2146
2147    }
2148
2149    async function onCheckoutComplete(form) {
2150
2151      onPaymentInfoAdded(form)
2152
2153      const checkout = getCheckout()
2154
2155      EasyStore.Event.dispatch('checkouts/completed', { checkout })
2156
2157    }
2158
2159    async function onSinglePageCheckout() {
2160
2161      // let checkout = $("[data-app-checkout]").data("app-checkout")
2162
2163      let checkout = getCheckout()
2164
2165      // const payment_type = _selector("#app_spc_payment_method").find(`[class*="label-content"]`).first().find("b").first().text()
2166      const payment_type = _selector("#app_spc_payment_method").getElementsByClassName('label-content')[0].getElementsByTagName('b')[0].innerHTML
2167
2168      const shipping_method = _selector("#delivery_method").value
2169
2170      let shipping_tier = null
2171      let app_spc_customer_info_label = _selector("#app_spc_customer_info").getElementsByClassName('label-content')
2172      if (shipping_method == "shipping") {
2173        shipping_tier = app_spc_customer_info_label[app_spc_customer_info_label.length - 1].getElementsByTagName('b')[0].innerHTML
2174      }
2175
2176      if (shipping_method == "pickup") {
2177        shipping_tier = app_spc_customer_info_label[0].innerHTML
2178      }
2179
2180      if (shipping_tier) {
2181
2182        EasyStore.Event.dispatch('checkouts/shipping_info_added', {
2183          checkout,
2184          shipping_tier,
2185        })
2186
2187      }
2188
2189      if (payment_type) {
2190
2191        EasyStore.Event.dispatch('checkouts/payment_info_added', {
2192          checkout,
2193          payment_type,
2194        })
2195
2196      }
2197
2198      EasyStore.Event.dispatch('checkouts/completed', { checkout })
2199
2200    }
2201
2202  })
2203
2204
2205  //-----------------------//
2206  //       Functions       //
2207  //-----------------------//
2208
2209  function getCookie(name) {
2210
2211    name += "="
2212
2213    decodedCookie = decodeURIComponent(document.cookie)
2214
2215    ca = decodedCookie.split(";")
2216
2217    for(i = 0; i < ca.length; i++) {
2218      c = ca[i]
2219      while (c.charAt(0) == " ") {
2220        c = c.substring(1)
2221      }
2222      if (c.indexOf(name) == 0) {
2223        return c.substring(name.length, c.length)
2224      }
2225    }
2226
2227    return ""
2228
2229  }
2230
2231  const parsePrice = price => {
2232    if(typeof price === 'string') {
2233      return parseFloat(price.split(',').join(''))
2234    }
2235
2236    return price
2237  }
2238
2239  const requestCart = async (method, data) => {
2240
2241  let response = await fetch('/cart.json', {method: 'GET',headers: {'Content-Type': 'application/json'}})
2242    result = await response.json()
2243
2244    return result.cart
2245
2246  }
2247  const getCart = async (latest = false) => {
2248
2249    let cart = window.__latest_cart
2250
2251    const cart_invalid = !cart || !cart.items || (cart.total_price > 0 && !cart.items.length)
2252
2253    if(latest || cart_invalid) {
2254      cart = await requestCart()
2255    }
2256
2257    cart.items = cart.items || []
2258
2259    return mapCart(cart)
2260
2261  }
2262
2263  const getCheckout = async () => {
2264    mapCheckout(window.__latest_cart || await requestCart())
2265  }
2266
2267  const getOrder = async () => {
2268    mapOrder(window.__latest_cart || await requestCart())
2269  }
2270
2271  //-----------------------//
2272  //        Mappers        //
2273  //-----------------------//
2274
2275  const fallbackAttribute = (object, attribute) => {
2276
2277    if(!Array.isArray(attribute)) {
2278      attribute = [attribute]
2279    }
2280
2281    let final_value = null
2282
2283    do {
2284
2285      final_value = object[attribute.shift()]
2286
2287    } while(!final_value && attribute.length)
2288
2289    return final_value
2290
2291  }
2292
2293  const map = (object, mapper) => {
2294
2295    const newObject = {}
2296
2297    for(const key in mapper) {
2298
2299      // Handle different keys between new and old format
2300      newObject[key] = fallbackAttribute(object, mapper[key])
2301
2302      // Cast price to float
2303      if(newObject[key] && ['price', 'amount', 'discount', 'discounts'].some(x => key.endsWith(x))) {
2304        newObject[key] = parsePrice(newObject[key])
2305      }
2306
2307      if(newObject[key] === undefined) {
2308        delete newObject[key]
2309      }
2310
2311    }
2312
2313    return newObject
2314
2315  }
2316
2317  const mapCart = cart => {
2318
2319    const oldCart = cart
2320
2321    const mapper = {
2322      id: 'id',
2323      currency: 'currency',
2324      item_count: 'item_count',
2325      items: 'items',
2326      total_price: 'total_price',
2327      latest_items: 'latest_items'
2328    }
2329
2330    cart = map(cart, mapper)
2331
2332    const discounts = (oldCart.storewide_discounts || []).concat((oldCart.voucher_discounts || []))
2333
2334    cart.discount_applications = discounts.map(discount => ({
2335      title: discount.voucher_code || null,
2336      value: parsePrice(discount.amount),
2337    }))
2338
2339    cart.original_total_price = cart.items.length
2340    ? cart.items
2341      .map(item => item.original_price)
2342      .reduce((sum, price) => sum + price)
2343    : 0
2344
2345    cart.total_discount = cart.discount_applications.length
2346    ? cart.discount_applications
2347      .map(discount => parsePrice(discount.value))
2348      .reduce((sum, value) => sum + value)
2349    : 0
2350
2351    cart.items = cart.items.map(item => mapLineItem(item))
2352
2353    return cart
2354
2355  }
2356
2357  const mapCheckout = checkout => {
2358
2359    const mapper = {
2360      note: 'note',
2361      attributes: 'note_attributes',
2362      billing_address: 'billing_address',
2363      currency: 'currency',
2364      customer_id: 'customer_id',
2365      discounts_amount: 'total_discount',
2366      id: 'id',
2367      line_items: 'order_item',
2368      order_number: 'order_number',
2369      shipping_address: 'shipping_address',
2370      shipping_price: 'shipping_tax',
2371      shipping_method: 'shipping_method_name',
2372      tax_price: 'total_tax',
2373    }
2374
2375    checkout = map(checkout, mapper)
2376
2377    checkout.requires_shipping = checkout.line_items.some(item => item.shipping_required)
2378
2379    checkout.line_items = checkout.line_items.map(item => mapLineItem(item))
2380
2381    return checkout
2382
2383  }
2384
2385  const mapOrder = order => {
2386
2387    const mapper = {
2388      attributes: 'note_attributes',
2389      billing_address: 'billing_address',
2390      cancelled: 'is_cancelled',
2391      cancelled_at: 'cancelled_at',
2392      created_at: 'created_at',
2393      customer_id: 'customer_id',
2394      // discount_applications: 'discount_applications',
2395      email: 'email',
2396      financial_status: 'financial_status',
2397      fulfillment_status: 'fulfillment_status',
2398      line_items: 'order_item',
2399      note: 'note',
2400      order_number: 'order_number',
2401      phone: 'phone',
2402      shipping_address: 'shipping_address',
2403      shipping_methods: 'shipping_methods',
2404      shipping_price: 'total_shipping',
2405      subtotal_price: 'subtotal_price',
2406      // tax_lines: 'tax_lines',
2407      tax_price: 'total_tax',
2408      total_discounts: 'total_discount',
2409      total_net_amount: 'total_amount_include_transaction',
2410      total_price: 'total_price',
2411      transactions: 'transaction_records',
2412      is_manual_payment: 'is_manual_payment',
2413    }
2414
2415    order.email = order.billing_address.email
2416    order.phone = order.billing_address.phone
2417    order.shipping_method = order.shipping_method_name
2418
2419    order = map(order, mapper)
2420
2421    order.line_items = order.line_items.map(item => mapLineItem(item))
2422    order.transactions = order.transactions.map(transaction => mapTransaction(transaction))
2423
2424    return order
2425
2426  }
2427
2428  const mapLineItem = line_item => {
2429
2430    const old_line_item = line_item
2431
2432    const mapper = {
2433      final_price: 'price',
2434      image: 'img_url',
2435      message: 'message',
2436      original_line_price: 'original_line_price',
2437      original_price: 'original_price',
2438      properties: 'properties',
2439      quantity: 'quantity',
2440      requires_shipping: 'shipping_required',
2441      sku: 'sku',
2442      taxable: 'taxable',
2443      title: 'product_name',
2444      product_name: 'product_name',
2445      url: 'url',
2446      product_id: 'product_id',
2447      variant_id: 'variant_id',
2448      id: ['id', 'i_id'],
2449    }
2450
2451    line_item = map(line_item, mapper)
2452
2453    line_item.product_id = line_item.product_id || (old_line_item.product && old_line_item.product.id) || null
2454    line_item.variant_id = line_item.variant_id || (old_line_item.variant && old_line_item.variant.id) || null
2455    line_item.image      = line_item.image || (old_line_item.image && old_line_item.image.url) || null
2456
2457    return line_item
2458
2459  }
2460
2461  const mapTransaction = transaction => {
2462
2463    const mapper = {
2464      amount: 'amount',
2465      created_at: 'created_at',
2466      gateway: 'gateway_type',
2467      id: 'id',
2468      status: 'status',
2469    }
2470
2471    transaction = map(transaction, mapper)
2472
2473    return transaction
2474
2475  }
2476
2477
2478</script>
2478
2479
2480</body>
2481</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.