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