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/648936/f/9092034.png" /> 15 16 17 <!-- Title and description ================================================== --> 18 <title> 19 ææ°æ¶æ¯ – çå ç©ä½ 20 </title> 21 22 23 24 <!-- Social meta ================================================== --> 25 26 27 <meta property="og:type" content="blog"> 28 <meta property="og:title" content="ææ°æ¶æ¯"> 29 <meta property="og:url" content="https://hsushaoyi.com/blogs/news"> 30 31 32<meta property="og:description" content="以ãçå ãçºåï¼æ¨å¨å¯¦ç¾æ¥åºèä½ï¼æ¥è½èæ¯ççæ´»æ¹å¼ââãçå ç©ä½ãæè¨±å°æ¥å çæº«åº¦èå ¥ä½åä¸ï¼å¤ä»¥ç´ç²¹æå·¥ææ³ä¿çé¶åæ¬èº«çè³ªæ¨¸èæº«æ½¤ãçºç¹å¿çæ¥å¸¸çæ´»æ³¨å ¥æå¿«èçççå åã"> 33<meta property="og:site_name" content="çå ç©ä½"> 34 35 36 37 <meta name="twitter:card" content="summary"> 38 39 40 41 <meta name="twitter:site" content="@"> 42 43 44 <meta name="twitter:title" content="ææ°æ¶æ¯"> 45 <meta name="twitter:description" content=""> 46 47 48 49 50 <!-- Helpers ================================================== --> 51 <link rel="canonical" href="https://hsushaoyi.com/blogs/news"> 52 <meta name="viewport" content="width=device-width,initial-scale=1"> 53 <meta name="theme-color" content="#717071"> 54 55
55<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js" type="text/javascript" ></script>
55 56 57 <!-- Header hook for plugins ================================================== --> 58 59<!-- ScriptTags -->
60<script>window.__st={p: "blog",cid: null,cem: null,cph: null,cfn: null,cln: null,cge: null,cdb: null,ccc: null};</script>
60<script src='/assets/events.js'></script>
60<script>(function(){function asyncLoad(){var urls=['/assets/traffic.js?v=1','https://apps.easystore.co/facebook-login/script.js?shop=hsushaoyi.easy.co'];for(var i=0;i<urls.length;i++){var s=document.createElement('script');s.type='text/javascript';s.async=true;s.src=urls[i];var x=document.getElementsByTagName('script')[0];x.parentNode.insertBefore(s, x);}}window.attachEvent ? window.attachEvent('onload', asyncLoad) : window.addEventListener('load', asyncLoad, false);})();</script>
60 61<!-- /ScriptTags --> 62 63 64 65
65<script src="https://store-themes.easystore.co/648936/themes/117661/assets/global.js?t=1788259614" defer="defer"></script>
65 66 67 68 69
69<script> 70 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 71 (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 72 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 73 })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); 74 75 ga('create', '', 'auto','myTracker'); 76 ga('myTracker.send', 'pageview'); 77 78 </script>
78 79 80
80<script src="/assets/storefront.js?id=1d419de2011a5572c98b" type="text/javascript" ></script>
80 81 82 83 <!-- CSS ================================================== --> 84 <style> 85 @font-face { 86 font-family: 'Average'; 87 font-style: normal; 88 font-weight: regular; 89 src: local('Average regular'), local('Average-regular'), url(https://fonts.gstatic.com/s/average/v9/fC1hPYBHe23MxA7rIeJwVWytTyk.ttf) format('truetype'); 90 } 91 92 @font-face { 93 font-family: 'Average'; 94 font-style: normal; 95 font-weight: regular; 96 src: local('Average regular'), local('Average-regular'), url(https://fonts.gstatic.com/s/average/v9/fC1hPYBHe23MxA7rIeJwVWytTyk.ttf) format('truetype'); 97 } 98 99 :root { 100 --font-body-family: 'Average', serif; 101 --font-body-style: normal; 102 --font-body-weight: 500; 103 104 --font-heading-family: 'Average', serif; 105 --font-heading-style: normal; 106 --font-heading-weight: 700; 107 108 --color-heading-text: 113,112,113; 109 --color-base-text: 113,112,113; 110 --color-base-background-1: 255,255,255; 111 --color-base-background-2: 255,255,255; 112 113 --color-base-solid-button-labels: 247,248,248; 114 --color-base-outline-button-labels: 247,248,248; 115 116 --color-base-accent-1: 113,112,113; 117 --color-base-accent-2: 113,112,113; 118 --payment-terms-background-color: 255,255,255; 119 120 --gradient-base-background-1: 255,255,255; 121 --gradient-base-background-2: 255,255,255; 122 --gradient-base-accent-1: 113,112,113; 123 --gradient-base-accent-2: 113,112,113; 124 125 --page-width: 125rem; 126 } 127 128 *, 129 *::before, 130 *::after { 131 box-sizing: inherit; 132 } 133 134 html { 135 box-sizing: border-box; 136 font-size: 62.5%; 137 height: 100%; 138 } 139 140 body { 141 display: grid; 142 grid-template-rows: auto auto 1fr auto; 143 grid-template-columns: 100%; 144 min-height: 100%; 145 margin: 0; 146 font-size: 1.5rem; 147 letter-spacing: 0.06rem; 148 line-height: 1.8; 149 font-family: var(--font-body-family); 150 font-style: var(--font-body-style); 151 font-weight: var(--font-body-weight); 152 153 } 154 155 @media screen and (min-width: 750px) { 156 body { 157 font-size: 1.6rem; 158 } 159 } 160 </style> 161 162 <link href="https://store-themes.easystore.co/648936/themes/117661/assets/base.css?t=1788259614" rel="stylesheet" type="text/css" media="screen" /> 163 164 165 166 167
167<script>document.documentElement.className = document.documentElement.className.replace('no-js', 'js');</script>
167 168</head> 169 170<body id="------------" class="template-blog" > 171 172 173<!-- Snippet:global/body_start: Console Extension --> 174<div id='es_console' style='display: none;'>648936</div> 175<!-- /Snippet --> 176 177 178 <style> 179 header { 180 --logo-width: 250px; 181 } 182 .header-wrapper, 183 .header-wrapper .list-menu--disclosure, 184 .header-wrapper .search-modal{ 185 background-color: #F7F8F8; 186 } 187 .header-wrapper .search-modal .field__input{ 188 background-color: rgb(var(--color-background)); 189 } 190 .header-wrapper summary .icon-caret, 191 .header-wrapper .header__menu-item a, 192 .header-wrapper .list-menu__item, 193 .header-wrapper .link--text{ 194 color: #717071; 195 } 196 197 .search-modal__form{ 198 position: relative; 199 } 200 201 .dropdown { 202 display: none; 203 position: absolute; 204 top: 100%; 205 left: 0; 206 width: 100%; 207 padding: 5px 0; 208 background-color: #fff; 209 color:#000; 210 z-index: 1000; 211 border-bottom-left-radius: 15px; 212 border-bottom-right-radius: 15px; 213 border: 1px solid rgba(var(--color-foreground), 1); 214 border-top: none; 215 overflow-x: hidden; 216 overflow-y: auto; 217 max-height: 350px; 218 } 219 220 .dropdown-item { 221 padding: 0.4rem 2rem; 222 cursor: pointer; 223 line-height: 1.4; 224 overflow: hidden; 225 text-overflow: ellipsis; 226 white-space: nowrap; 227 } 228 229 .dropdown-item:hover{ 230 background-color: #f3f3f3; 231 } 232 233 .search__input.is-focus{ 234 border-radius: 15px; 235 border-bottom-left-radius: 0; 236 border-bottom-right-radius: 0; 237 border: 1px solid rgba(var(--color-foreground), 1); 238 border-bottom: none; 239 box-shadow: none; 240 } 241 242 .clear-all { 243 text-align: right; 244 padding: 0 2rem 0.2rem; 245 line-height: 1; 246 font-size: 70%; 247 margin-bottom: -2px; 248 } 249 250 .clear-all:hover{ 251 background-color: #fff; 252 } 253 254 .search-input-focus .easystore-section-header-hidden{ 255 transform: none; 256 } 257 .referral-notification { 258 position: absolute; 259 top: 100%; 260 right: 0; 261 background: white; 262 border: 1px solid #e0e0e0; 263 border-radius: 8px; 264 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); 265 width: 280px; 266 z-index: 1000; 267 padding: 16px; 268 margin-top: 8px; 269 font-size: 14px; 270 line-height: 1.4; 271 } 272 273 .referral-notification::before { 274 content: ''; 275 position: absolute; 276 top: -8px; 277 right: 20px; 278 width: 0; 279 height: 0; 280 border-left: 8px solid transparent; 281 border-right: 8px solid transparent; 282 border-bottom: 8px solid white; 283 } 284 285 .referral-notification::after { 286 content: ''; 287 position: absolute; 288 top: -9px; 289 right: 20px; 290 width: 0; 291 height: 0; 292 border-left: 8px solid transparent; 293 border-right: 8px solid transparent; 294 border-bottom: 8px solid #e0e0e0; 295 } 296 297 .referral-notification h4 { 298 margin: 0 0 8px 0; 299 color: #2196F3; 300 font-size: 16px; 301 font-weight: 600; 302 } 303 304 .referral-notification p { 305 margin: 0 0 12px 0; 306 color: #666; 307 } 308 309 .referral-notification .referral-code { 310 background: #f5f5f5; 311 padding: 8px; 312 border-radius: 4px; 313 font-family: monospace; 314 font-size: 13px; 315 text-align: center; 316 margin: 8px 0; 317 border: 1px solid #ddd; 318 } 319 320 .referral-notification .close-btn { 321 position: absolute; 322 top: 8px; 323 right: 8px; 324 background: none; 325 border: none; 326 font-size: 18px; 327 color: #999; 328 cursor: pointer; 329 padding: 0; 330 width: 20px; 331 height: 20px; 332 line-height: 1; 333 } 334 335 .referral-notification .close-btn:hover { 336 color: #333; 337 } 338 339 .referral-notification .action-btn { 340 background: #2196F3; 341 color: white; 342 border: none; 343 padding: 8px 16px; 344 border-radius: 4px; 345 cursor: pointer; 346 font-size: 12px; 347 margin-right: 8px; 348 margin-top: 8px; 349 } 350 351 .referral-notification .action-btn:hover { 352 background: #1976D2; 353 } 354 355 .referral-notification .dismiss-btn { 356 background: transparent; 357 color: #666; 358 border: 1px solid #ddd; 359 padding: 8px 16px; 360 border-radius: 4px; 361 cursor: pointer; 362 font-size: 12px; 363 margin-top: 8px; 364 } 365 366 .referral-notification .dismiss-btn:hover { 367 background: #f5f5f5; 368 } 369 .referral-modal__dialog { 370 transform: translate(-50%, 0); 371 transition: transform var(--duration-default) ease, visibility 0s; 372 z-index: 10000; 373 position: fixed; 374 top: 20vh; 375 left: 50%; 376 width: 100%; 377 max-width: 350px; 378 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); 379 border-radius: 12px; 380 background-color: #fff; 381 color: #000; 382 padding: 20px; 383 text-align: center; 384 } 385 386 .modal-overlay.referral-modal-overlay { 387 position: fixed; 388 top: 0; 389 left: 0; 390 width: 100%; 391 height: 100%; 392 background-color: rgba(0, 0, 0, 0.7); 393 z-index: 2001; 394 display: block; 395 opacity: 1;
396 transition: opacity var(--duration-default) ease, visibility 0s; 397 } 398</style> 399 400<link rel="preload" href="https://store-themes.easystore.co/648936/themes/117661/assets/section-header.css?t=1788259614" as="style" onload="this.onload=null;this.rel='stylesheet'"> 401<link rel="preload" href="https://store-themes.easystore.co/648936/themes/117661/assets/component-list-menu.css?t=1788259614" as="style" onload="this.onload=null;this.rel='stylesheet'"> 402<link rel="preload" href="https://store-themes.easystore.co/648936/themes/117661/assets/component-menu-drawer.css?t=1788259614" as="style" onload="this.onload=null;this.rel='stylesheet'"> 403<link rel="preload" href="https://store-themes.easystore.co/648936/themes/117661/assets/component-cart-notification.css?v1.1?t=1788259614" as="style" onload="this.onload=null;this.rel='stylesheet'"> 404
405<script src="https://store-themes.easystore.co/648936/themes/117661/assets/cart-notification.js?t=1788259614" defer="defer"></script>
vendor: 2 bytes, line 405
405
406<script src="https://store-themes.easystore.co/648936/themes/117661/assets/details-modal.js?t=1788259614" defer="defer"></script>
406 407 408<svg xmlns="http://www.w3.org/2000/svg" class="hidden"> 409 <symbol id="icon-search" viewbox="0 0 18 19" fill="none"> 410 <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"/> 411 </symbol> 412 413 <symbol id="icon-close" class="icon icon-close" fill="none" viewBox="0 0 18 17"> 414 <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"> 415 </symbol> 416</svg> 417 418 419<div id="easystore-section-header"> 420 <sticky-header class="header-wrapper header-wrapper--border-bottom"> 421 <header class="header header--top-center page-width header--has-menu" itemscope itemtype="http://schema.org/Organization"> 422 <header-drawer data-breakpoint="tablet"> 423 <details class="menu-drawer-container menu-opening"> 424 <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"> 425 <span> 426 427 428 429 <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> 430 431 432 433 434 435 436 <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> 437 438 439 440 </span> 441 </summary> 442 <div id="menu-drawer" class="menu-drawer motion-reduce" tabindex="-1"> 443 <div class="menu-drawer__inner-container"> 444 <div class="menu-drawer__navigation-container"> 445 <nav class="menu-drawer__navigation"> 446 <ul class="menu-drawer__menu list-menu" role="list"> 447 448 449 450 <li> 451 <a href="/" class="menu-drawer__menu-item list-menu__item link link--text focus-inset"> 452 HOME 453 </a> 454 </li> 455 456 457 458 459 460 <li> 461 <details> 462 <summary class="menu-drawer__menu-item list-menu__item link link--text focus-inset" role="button" aria-expanded="false" aria-controls="link-Bags"> 463 <a href="/collections/all" class="link--text list-menu__item menu-drawer__menu-item"> 464 ææåå 465 </a> 466 467 468 469 <svg class="icon icon-arrow " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 339.56"><path d="M31.06,196.67H504l-88.56,88.56a26.89,26.89,0,1,0,38,38L588,188.79a26.89,26.89,0,0,0,0-38L453.49,16.29a26.89,26.89,0,0,0-38,38L504,142.88H31.06a26.9,26.9,0,0,0,0,53.79Z" fill="currentColor"/></svg> 470 471 472 473 474 475 476 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 477 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z" fill="currentColor"></path> 478 </svg> 479 480 481 482 </summary> 483 <div class="menu-drawer__submenu motion-reduce" tabindex="-1"> 484 <div class="menu-drawer__inner-submenu"> 485 <button class="menu-drawer__close-button link link--text focus-inset" aria-expanded="true"> 486 487 488 489 <svg class="icon icon-arrow " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 339.56"><path d="M31.06,196.67H504l-88.56,88.56a26.89,26.89,0,1,0,38,38L588,188.79a26.89,26.89,0,0,0,0-38L453.49,16.29a26.89,26.89,0,0,0-38,38L504,142.88H31.06a26.9,26.9,0,0,0,0,53.79Z" fill="currentColor"/></svg> 490 491 492 493 ææåå 494 </button> 495 <ul class="menu-drawer__menu list-menu" role="list" tabindex="-1"> 496 497 498 499 <li> 500 <a href="/collections/zine" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 501 å±±é°å¤§æ£æ¥ 502 </a> 503 </li> 504 505 506 507 508 <li> 509 <a href="/collections/expo" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 510 æåæå¾æ¥è« 511 </a> 512 </li> 513 514 515 516 517 <li> 518 <a href="/collections/springsong" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 519 æ¥ä¹æ~Spring Song 520 </a> 521 </li> 522 523 524 525 526 <li> 527 <a href="/collections/2512" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 528 æ´¾å°æ¥ï¼ 529 </a> 530 </li> 531 532 533 534 535 <li> 536 <a href="/collections/2508" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 537 ãå«è³£äººåãCarle Vernet vol.2 538 </a> 539 </li> 540 541 542 543 544 <li> 545 <a href="/collections/2506" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 546 ãå«è³£äººåãCarle Vernet vol.1 547 </a> 548 </li> 549 550 551 552 553 <li> 554 <a href="/collections/2502" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 555 麵å åççæ¥æ¥ 556 </a> 557 </li> 558 559 560 561 562 563 <li> 564 <details> 565 <summary class="menu-drawer__menu-item list-menu__item link link--text focus-inset" role="button" aria-expanded="false" aria-controls="link-Bags"> 566 <a href="/collections/人åç³»å" class="link--text list-menu__item menu-drawer__menu-item"> 567 人åç³»å 568 </a> 569 570 571 572 <svg class="icon icon-arrow " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 339.56"><path d="M31.06,196.67H504l-88.56,88.56a26.89,26.89,0,1,0,38,38L588,188.79a26.89,26.89,0,0,0,0-38L453.49,16.29a26.89,26.89,0,0,0-38,38L504,142.88H31.06a26.9,26.9,0,0,0,0,53.79Z" fill="currentColor"/></svg> 573 574 575 576 577 578 579 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 580 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z" fill="currentColor"></path> 581 </svg> 582 583 584 585 </summary> 586 <div class="menu-drawer__submenu motion-reduce" tabindex="-1"> 587 <div class="menu-drawer__inner-submenu"> 588 <button class="menu-drawer__close-button link link--text focus-inset" aria-expanded="true"> 589 590 591 592 <svg class="icon icon-arrow " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 339.56"><path d="M31.06,196.67H504l-88.56,88.56a26.89,26.89,0,1,0,38,38L588,188.79a26.89,26.89,0,0,0,0-38L453.49,16.29a26.89,26.89,0,0,0-38,38L504,142.88H31.06a26.9,26.9,0,0,0,0,53.79Z" fill="currentColor"/></svg> 593 594 595 596 人åç³»å 597 </button> 598 <ul class="menu-drawer__menu list-menu" role="list" tabindex="-1"> 599 600 601 602 <li> 603 <a href="/collections/人å-å代" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 604 人åï¼åä»£ï¼ 605 </a> 606 </li> 607 608 609 610 611 <li> 612 <a href="/collections/人å-å代-1" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 613 人åï¼å代+ï¼ 614 </a> 615 </li> 616 617 618 619 620 <li> 621 <a href="/collections/äºä»£" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 622 人åï¼äºä»£ï¼ 623 </a> 624 </li> 625 626 627 628 </ul> 629 </div> 630 </div> 631 </details> 632 </li> 633 634 635 636 637 <li> 638 <a href="/collections/èè馬鳴" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 639 è±ç¶å°æ¯ 640 </a> 641 </li> 642 643 644 645 646 <li> 647 <a href="/collections/é£å¾è" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 648 é£éè»è» 649 </a> 650 </li> 651 652 653 654 655 <li> 656 <a href="/collections/é¶å¶æºé£¾" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 657 é¶å¶æºé£¾ 658 </a> 659 </li> 660 661 662 663 664 <li> 665 <a href="/collections/ç´é¡è£½å" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 666 ç´é¡è£½å 667 </a> 668 </li> 669 670 671 672 </ul> 673 </div> 674 </div> 675 </details> 676 </li> 677 678 679 680 681 <li> 682 <a href="/pages/éæ¼çå " class="menu-drawer__menu-item list-menu__item link link--text
682 focus-inset"> 683 éæ¼çå 684 </a> 685 </li> 686 687 688 689 690 <li> 691 <a href="/blogs/news" class="menu-drawer__menu-item list-menu__item link link--text focus-inset"> 692 BLOG 693 </a> 694 </li> 695 696 697 698 699 <li> 700 <a href="https://www.behance.net/hsushaoyi" target="_blank" class="menu-drawer__menu-item list-menu__item link link--text focus-inset"> 701 åéé 702 </a> 703 </li> 704 705 706 707 708 <li> 709 <a href="/pages/è³¼ç©é ç¥-注æäºé " class="menu-drawer__menu-item list-menu__item link link--text focus-inset"> 710 è³¼ç©é ç¥/注æäºé 711 </a> 712 </li> 713 714 715 </ul> 716 </nav> 717 718 <div class="menu-drawer__utility-links"> 719 720 721 722 723 724 725 726 727 728 729 <a href="/account/login" class="menu-drawer__account link link--text focus-inset h5"> 730 731 732 733 <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> 734 735 736 737 738 ç»å ¥ 739 </a> 740 741 <a href="/account/register" class="menu-drawer__account link link--text focus-inset h5"> 742 743 744 745 746 <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"> 747 <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> 748 </svg> 749 750 751 752 註å帳è 753 </a> 754 755 756 757 </div> 758 </div> 759 </div> 760 </div> 761 </details> 762 </header-drawer> 763 764 765 <a href="/" class="header__heading-link link link--text focus-inset" itemprop="url"> 766 <img src="https://cdn.store-assets.com/s/648936/f/9092036.png" class="header__heading-logo" alt="çå ç©ä½" loading="lazy" itemprop="logo"> 767 </a> 768 769 770 771 <div class="header__search-input" tabindex="-1"> 772 <form action="/search" method="get" role="search" class="search search-modal__form"> 773 <div class="field"> 774 <input class="search__input field__input" 775 id="Search-In-Modal" 776 type="search" 777 name="q" 778 value="" 779 placeholder="æå°" 780 autocomplete="off" 781 > 782 <label class="field__label" for="Search-In-Modal">æå°</label> 783 <div class="dropdown" id="searchDropdown"></div> 784 <input type="hidden" name="search_history" class="hidden_search_history"> 785 <input type="hidden" name="options[prefix]" value="last"> 786 <button class="search__button field__button" aria-label="æå°"> 787 <svg class="icon icon-search" aria-hidden="true" focusable="false" role="presentation"> 788 <use href="#icon-search"> 789 </svg> 790 </button> 791 </div> 792 </form> 793 </div> 794 795 796 <nav class="header__inline-menu"> 797 <ul class="list-menu list-menu--inline" role="list"> 798 799 800 801 <li> 802 <a href="/" class="header__menu-item header__menu-item list-menu__item link link--text focus-inset"> 803 HOME 804 </a> 805 </li> 806 807 808 809 810 811 <li> 812 <details-disclosure> 813 <details> 814 <summary class="header__menu-item list-menu__item link focus-inset"> 815 <a href="/collections/all" >ææåå</a> 816 817 818 819 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 820 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z" fill="currentColor"></path> 821 </svg> 822 823 824 825 </summary> 826 <ul class="header__submenu list-menu list-menu--disclosure caption-large motion-reduce" role="list" tabindex="-1"> 827 828 829 830 831 832 <li> 833 <a href="/collections/zine" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 834 å±±é°å¤§æ£æ¥ 835 </a> 836 </li> 837 838 839 840 841 842 <li> 843 <a href="/collections/expo" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 844 æåæå¾æ¥è« 845 </a> 846 </li> 847 848 849 850 851 852 <li> 853 <a href="/collections/springsong" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 854 æ¥ä¹æ~Spring Song 855 </a> 856 </li> 857 858 859 860 861 862 <li> 863 <a href="/collections/2512" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 864 æ´¾å°æ¥ï¼ 865 </a> 866 </li> 867 868 869 870 871 872 <li> 873 <a href="/collections/2508" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 874 ãå«è³£äººåãCarle Vernet vol.2 875 </a> 876 </li> 877 878 879 880 881 882 <li> 883 <a href="/collections/2506" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 884 ãå«è³£äººåãCarle Vernet vol.1 885 </a> 886 </li> 887 888 889 890 891 892 <li> 893 <a href="/collections/2502" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 894 麵å åççæ¥æ¥ 895 </a> 896 </li> 897 898 899 900 901 902 <li> 903 <details-disclosure> 904 <details> 905 <summary class="header__menu-item link link--text list-menu__item focus-inset caption-large"> 906 <a href="/collections/人åç³»å" >人åç³»å</a> 907 908 909 910 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret rotate-90" viewBox="0 0 10 6"> 911 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z" fill="currentColor"></path> 912 </svg> 913 914 915 916 </summary> 917 <ul class="header__submenu list-menu list-menu--disclosure motion-reduce"> 918 919 920 921 <li> 922 <a href="/collections/人å-å代" class="header__menu-item list-menu__item link link--text focus-inset caption-large">人åï¼å代ï¼</a> 923 </li> 924 925 926 927 928 <li> 929 <a href="/collections/人å-å代-1" class="header__menu-item list-menu__item link link--text focus-inset caption-large">人åï¼å代+ï¼</a> 930 </li> 931 932 933 934 935 <li> 936 <a href="/collections/äºä»£" class="header__menu-item list-menu__item link link--text focus-inset caption-large">人åï¼äºä»£ï¼</a> 937 </li> 938 939 940 </ul> 941 </details> 942 </details-disclosure> 943 </li> 944 945 946 947 948 949 950 <li> 951 <a href="/collections/èè馬鳴" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 952 è±ç¶å°æ¯ 953 </a> 954 </li> 955 956 957 958 959 960 <li> 961 <a href="/collections/é£å¾è" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 962 é£éè»è» 963 </a> 964 </li> 965 966 967 968 969 970 <li> 971 <a href="/collections/é¶å¶æºé£¾" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 972 é¶å¶æºé£¾ 973 </a> 974 </li> 975 976 977 978 979 980 <li> 981 <a href="/collections/ç´é¡è£½å" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 982 ç´é¡è£½å 983 </a> 984 </li> 985 986 987 </ul> 988 </details> 989 </details-disclosure> 990 </li> 991 992 993 994 995 <li> 996 <a href="/pages/éæ¼çå " class="header__menu-item header__menu-item list-menu__item link link--text focus-inset"> 997 éæ¼çå 998 </a> 999 </li> 1000 1001 1002 1003 1004 <li> 1005 <a href="/blogs/news" class="header__menu-item header__menu-item list-menu__item link link--text focus-inset"> 1006 BLOG 1007 </a> 1008 </li> 1009 1010 1011 1012 1013 <li> 1014 <a href="https://www.behance.net/hsushaoyi" target="_blank" class="header__menu-item header__menu-item list-menu__item link link--text focus-inset"> 1015 åéé 1016 </a> 1017 </li> 1018 1019 1020 1021 1022 <li> 1023 <a href="/pages/è³¼ç©é ç¥-注æäºé " class="header__menu-item header__menu-item list-menu__item link link--text focus-inset"> 1024 è³¼ç©é ç¥/注æäºé 1025 </a> 1026 </li> 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 </ul> 1040 </nav> 1041 <div class="header__icons"> 1042 1043 1044 1045 <div class="header__icon header__icon--account link link--text focus-inset small-hide medium-hide" style="position: relative;"> 1046 <a href="/account/login" class="header__icon link link--text focus-inset p-2"> 1047 1048 1049 1050 <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> 1051 1052 1053
1054 <span id="my-account" class="header__link-label">ç»å ¥</span> 1055 </a> 1056 1057 <!-- Referral Notification Popup for Desktop --> 1058 <div id="referralNotification" class="referral-notification" style="display: none;"> 1059 <button class="close-btn" onclick="dismissReferralNotification()">×</button> 1060 <div style="text-align: center; margin-bottom: 16px;"> 1061 <div style="width: 100px; height: 100px; margin: 0 auto;"> 1062 <img src="https://resources.easystore.co/storefront/icons/channels/vector_referral_program.svg"> 1063 </div> 1064 </div> 1065 <p id="referralSignupMessage" style="text-align: center; font-size: 14px; color: #666; margin: 0 0 20px 0;"> 1066 æ¨ç好å鿍 åé¥éï¼ç«å³è¨»åé åã 1067 </p> 1068 <div style="text-align: center;"> 1069 <button class="btn" onclick="goToSignupPage()" style="width: 100%;"> 1070 註å 1071 </button> 1072 </div> 1073 </div> 1074 </div> 1075 1076 1077 1078 <a href="/cart" class="header__icon link link--text focus-inset" id="cart-icon-bubble"> 1079 <span class="header__icon--cart"> 1080 1081 1082 1083 <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> 1084 1085 1086 1087 <div class="cart-count-bubble hidden"> 1088 <span aria-hidden="true" class="js-content-cart-count">0</span> 1089 </div> 1090 </span> 1091 <span class="header__link-label medium-hide small-hide"> 1092 è³¼ç©è» 1093 </span> 1094 </a> 1095 1096 1097 1098 <!-- Referral Notification Modal for Mobile --> 1099 <details-modal class="referral-modal" id="referralMobileModal"> 1100 <details> 1101 <summary class="referral-modal__toggle" aria-haspopup="dialog" aria-label="Open referral modal" style="display: none;"> 1102 </summary> 1103 <div class="modal-overlay referral-modal-overlay"></div> 1104 <div class="referral-modal__dialog" role="dialog" aria-modal="true" aria-label="Referral notification"> 1105 <div class="referral-modal__content"> 1106 <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;"> 1107 × 1108 </button> 1109 1110 <div style="margin-bottom: 24px;"> 1111 <div style="width: 120px; height: 120px; margin: 0 auto 20px;"> 1112 <img src="https://resources.easystore.co/storefront/icons/channels/vector_referral_program.svg" style="width: 100%; height: 100%;"> 1113 </div> 1114 </div> 1115 1116 <p id="referralSignupMessageMobile" style="font-size: 16px; color: #333; margin: 0 0 30px 0; line-height: 1.5;"> 1117 æ¨ç好å鿍 åé¥éï¼ç«å³è¨»åé åã 1118 </p> 1119 1120 <button type="button" class="btn" onclick="goToSignupPageFromMobile()" style="width: 100%;"> 1121 註å 1122 </button> 1123 </div> 1124 </div> 1125 </details> 1126 </details-modal> 1127 1128 1129 1130 </div> 1131 </header> 1132 </sticky-header> 1133 1134<cart-notification> 1135 <div class="cart-notification-wrapper page-width color-background-1"> 1136 <div id="cart-notification" class="cart-notification focus-inset" aria-modal="true" aria-label="å·²å å ¥è³¼ç©è»" role="dialog" tabindex="-1"> 1137 <div class="cart-notification__header"> 1138 <h2 class="cart-notification__heading caption-large"> 1139 1140 1141 <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"> 1142 <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> 1143 </svg> 1144 1145 1146 å·²å å ¥è³¼ç©è»</h2> 1147 <button type="button" class="cart-notification__close modal__close-button link link--text focus-inset" aria-label="accessibility.close"> 1148 1149 1150 1151 <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> 1152 1153 1154 1155 </button> 1156 </div> 1157 <div id="cart-notification-product" class="cart-notification-product"></div> 1158 <div class="cart-notification__links"> 1159 <a href="/cart" id="cart-notification-button" class="button button--secondary button--full-width">æ¥çè³¼ç©è» (<span class="js-content-cart-count">0</span>)</a> 1160 <form action="/cart" method="post" id="cart-notification-form"> 1161 <input type="hidden" name="_token" value="37EREEB4V1TyTheffGObTkhXr9VMSywS0VmCwRRi"> 1162 <input type="hidden" name="current_currency" value=""> 1163 <button class="button button--primary button--full-width" name="checkout" value="true">çµå¸³</button> 1164 </form> 1165 <button type="button" class="link button-label">ç¹¼çºè³¼ç©</button> 1166 </div> 1167 </div> 1168 </div> 1169</cart-notification> 1170<style> 1171 .cart-notification { 1172 display: none; 1173 } 1174</style>
1175<script> 1176document.getElementById('cart-notification-form').addEventListener('submit',(event)=>{ 1177 if(event.submitter) event.submitter.classList.add('loading'); 1178}) 1179 1180</script>
1180 1181 1182</div> 1183 1184
1185<script> 1186 1187 class StickyHeader extends HTMLElement { 1188 constructor() { 1189 super(); 1190 } 1191 1192 connectedCallback() { 1193 this.header = document.getElementById('easystore-section-header'); 1194 this.headerBounds = {}; 1195 this.currentScrollTop = 0; 1196 this.preventReveal = false; 1197 1198 this.onScrollHandler = this.onScroll.bind(this); 1199 this.hideHeaderOnScrollUp = () => this.preventReveal = true; 1200 1201 this.addEventListener('preventHeaderReveal', this.hideHeaderOnScrollUp); 1202 window.addEventListener('scroll', this.onScrollHandler, false); 1203 1204 this.createObserver(); 1205 } 1206 1207 disconnectedCallback() { 1208 this.removeEventListener('preventHeaderReveal', this.hideHeaderOnScrollUp); 1209 window.removeEventListener('scroll', this.onScrollHandler); 1210 } 1211 1212 createObserver() { 1213 let observer = new IntersectionObserver((entries, observer) => { 1214 this.headerBounds = entries[0].intersectionRect; 1215 observer.disconnect(); 1216 }); 1217 1218 observer.observe(this.header); 1219 } 1220 1221 onScroll() { 1222 const scrollTop = window.pageYOffset || document.documentElement.scrollTop; 1223 1224 if (scrollTop > this.currentScrollTop && scrollTop > this.headerBounds.bottom) { 1225 requestAnimationFrame(this.hide.bind(this)); 1226 } else if (scrollTop < this.currentScrollTop && scrollTop > this.headerBounds.bottom) { 1227 if (!this.preventReveal) { 1228 requestAnimationFrame(this.reveal.bind(this)); 1229 } else { 1230 window.clearTimeout(this.isScrolling); 1231 1232 this.isScrolling = setTimeout(() => { 1233 this.preventReveal = false; 1234 }, 66); 1235 1236 requestAnimationFrame(this.hide.bind(this)); 1237 } 1238 } else if (scrollTop <= this.headerBounds.top) { 1239 requestAnimationFrame(this.reset.bind(this)); 1240 } 1241 1242 1243 this.currentScrollTop = scrollTop; 1244 } 1245 1246 hide() { 1247 this.header.classList.add('easystore-section-header-hidden', 'easystore-section-header-sticky'); 1248 this.closeMenuDisclosure(); 1249 // this.closeSearchModal(); 1250 } 1251 1252 reveal() { 1253 this.header.classList.add('easystore-section-header-sticky', 'animate'); 1254 this.header.classList.remove('easystore-section-header-hidden'); 1255 } 1256 1257 reset() { 1258 this.header.classList.remove('easystore-section-header-hidden', 'easystore-section-header-sticky', 'animate'); 1259 } 1260 1261 closeMenuDisclosure() { 1262 this.disclosures = this.disclosures || this.header.querySelectorAll('details-disclosure'); 1263 this.disclosures.forEach(disclosure => disclosure.close()); 1264 } 1265 1266 // closeSearchModal() { 1267 // this.searchModal = this.searchModal || this.header.querySelector('details-modal'); 1268 // this.searchModal.close(false); 1269 // } 1270 } 1271 1272 customElements.define('sticky-header', StickyHeader); 1273 1274 1275 class DetailsDisclosure extends HTMLElement{ 1276 constructor() { 1277 super(); 1278 this.mainDetailsToggle = this.querySelector('details'); 1279 // this.mainDetailsToggle.addEventListener('focusout', this.onFocusOut.bind(this)); 1280 this.mainDetailsToggle.addEventListener('mouseover', this.open.bind(this)); 1281 this.mainDetailsToggle.addEventListener('mouseleave', this.close.bind(this)); 1282 } 1283 1284 onFocusOut() { 1285 setTimeout(() => { 1286 if (!this.contains(document.activeElement)) this.close(); 1287 }) 1288 } 1289 1290 open() { 1291 this.mainDetailsToggle.setAttribute('open',1) 1292 } 1293 1294 close() { 1295 this.mainDetailsToggle.removeAttribute('open') 1296 } 1297 } 1298 1299 customElements.define('details-disclosure', DetailsDisclosure); 1300 1301 function clearAll() { 1302 localStorage.removeItem('searchHistory'); 1303 1304 var customer = ""; 1305 if(customer) { 1306 // Your logic to clear all data or call an endpoint 1307 fetch('/account/search_histories', { 1308 method: 'DELETE', 1309 headers: { 1310 "Content-Type": "application/json", 1311 "X-Requested-With": "XMLHttpRequest" 1312 }, 1313 body: JSON.stringify({ 1314 _token: "37EREEB4V1TyTheffGObTkhXr9VMSywS0VmCwRRi" 1315 }), 1316 }) 1317 .then(response => response.json()) 1318 } 1319 } 1320 // End - delete search history from local storage 1321 1322 // search history dropdown 1323 var searchInputs = document.querySelectorAll('.search__input'); 1324 1325 if(searchInputs.length > 0) { 1326
1327 searchInputs.forEach((searchInput)=> { 1328 1329 searchInput.addEventListener('focus', function() { 1330 var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown'); 1331 searchDropdown.innerHTML = ''; // Clear existing items 1332 1333 // retrieve data from local storage 1334 var searchHistoryData = JSON.parse(localStorage.getItem('searchHistory')) || []; 1335 1336 // Convert JSON to string 1337 var search_history_json = JSON.stringify(searchHistoryData); 1338 1339 // Set the value of the hidden input 1340 searchInput.closest('form').querySelector(".hidden_search_history").value = search_history_json; 1341 1342 // create dropdown items 1343 var clearAllItem = document.createElement('div'); 1344 clearAllItem.className = 'dropdown-item clear-all'; 1345 clearAllItem.textContent = 'Clear'; 1346 clearAllItem.addEventListener('click', function() { 1347 clearAll(); 1348 searchDropdown.style.display = 'none'; 1349 searchInput.classList.remove('is-focus'); 1350 }); 1351 searchDropdown.appendChild(clearAllItem); 1352 1353 // create dropdown items 1354 searchHistoryData.forEach(function(item) { 1355 var dropdownItem = document.createElement('div'); 1356 dropdownItem.className = 'dropdown-item'; 1357 dropdownItem.textContent = item.term; 1358 dropdownItem.addEventListener('click', function() { 1359 searchInput.value = item.term; 1360 searchInput.closest('form').submit(); 1361 searchDropdown.style.display = 'none'; 1362 }); 1363 searchDropdown.appendChild(dropdownItem); 1364 }); 1365 1366 if(searchHistoryData.length > 0){ 1367 // display the dropdown 1368 searchInput.classList.add('is-focus'); 1369 document.body.classList.add('search-input-focus'); 1370 searchDropdown.style.display = 'block'; 1371 } 1372 }); 1373 1374 searchInput.addEventListener("focusout", (event) => { 1375 var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown'); 1376 searchInput.classList.remove('is-focus'); 1377 searchDropdown.classList.add('transparent'); 1378 setTimeout(()=>{ 1379 searchDropdown.style.display = 'none'; 1380 searchDropdown.classList.remove('transparent'); 1381 document.body.classList.remove('search-input-focus'); 1382 }, 400); 1383 }); 1384 }) 1385 } 1386 // End - search history dropdown 1387 1388 // referral notification popup 1389 const referralMessageTemplate = 'æ¨ç好å鿍 __CURRENCY_CODE__ __CREDIT_AMOUNT__ åé¥éï¼ç«å³è¨»åé åã'; 1390 const shopCurrency = 'NT$'; 1391 1392 function getCookie(name) { 1393 const value = `; ${document.cookie}`; 1394 const parts = value.split(`; ${name}=`); 1395 if (parts.length === 2) return parts.pop().split(';').shift(); 1396 return null; 1397 } 1398 1399 function removeCookie(name) { 1400 document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`; 1401 } 1402 1403 function showReferralNotification() { 1404 const referralCode = getCookie('customer_referral_code'); 1405 1406 1407 const customerReferralCode = null; 1408 1409 1410 const activeReferralCode = referralCode || customerReferralCode; 1411 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 1412 1413 if (referralData.timestamp && referralData.expirationDays) { 1414 const expirationTime = referralData.timestamp + (referralData.expirationDays * 24 * 60 * 60 * 1000); 1415 if (Date.now() > expirationTime) { 1416 localStorage.removeItem('referral_notification_data'); 1417 return; 1418 } 1419 } 1420 1421 if (referralData.dismissed) return; 1422 1423 if (activeReferralCode) { 1424 if (referralData.creditAmount) { 1425 displayReferralNotification(referralData.creditAmount); 1426 } else { 1427 fetchReferralCampaignData(activeReferralCode); 1428 } 1429 } 1430 } 1431 1432 function fetchReferralCampaignData(referralCode) { 1433 fetch(`/customer/referral_program/campaigns/${referralCode}`) 1434 .then(response => { 1435 if (!response.ok) { 1436 throw new Error('Network response was not ok'); 1437 } 1438 return response.json(); 1439 }) 1440 .then(data => { 1441 let refereeCreditAmount = null; 1442 if (data.data.campaign && data.data.campaign.referral_rules) { 1443 const refereeRule = data.data.campaign.referral_rules.find(rule => 1444 rule.target_type === 'referee' && 1445 rule.event_name === 'customer/create' && 1446 rule.entitlement && 1447 rule.entitlement.type === 'credit' 1448 ); 1449 1450 if (refereeRule) { 1451 refereeCreditAmount = refereeRule.entitlement.amount; 1452 } 1453 } 1454 1455 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 1456 referralData.creditAmount = refereeCreditAmount; 1457 referralData.dismissed = referralData.dismissed || false; 1458 referralData.timestamp = Date.now(); 1459 referralData.expirationDays = 3; 1460 localStorage.setItem('referral_notification_data', JSON.stringify(referralData)); 1461 1462 displayReferralNotification(refereeCreditAmount); 1463 }) 1464 .catch(error => { 1465 removeCookie('customer_referral_code'); 1466 }); 1467 } 1468 1469 function displayReferralNotification(creditAmount = null) { 1470 const isMobile = innerWidth <= 749; 1471 1472 if (isMobile) { 1473 const mobileModal = document.querySelector('#referralMobileModal details'); 1474 const mobileMessageElement = document.getElementById('referralSignupMessageMobile'); 1475 1476 if (mobileModal && mobileMessageElement) { 1477 if (creditAmount) {
1478 const finalMessage = referralMessageTemplate 1479 .replace('__CREDIT_AMOUNT__', creditAmount) 1480 .replace('__CURRENCY_CODE__', shopCurrency); 1481 1482 mobileMessageElement.textContent = finalMessage; 1483 } 1484 1485 mobileModal.setAttribute('open', ''); 1486 } 1487 } else { 1488 const notification = document.getElementById('referralNotification'); 1489 1490 if (notification) { 1491 if (creditAmount) { 1492 const messageElement = document.getElementById('referralSignupMessage'); 1493 if (messageElement) { 1494 const finalMessage = referralMessageTemplate 1495 .replace('__CREDIT_AMOUNT__', creditAmount) 1496 .replace('__CURRENCY_CODE__', shopCurrency); 1497 1498 messageElement.textContent = finalMessage; 1499 } 1500 } 1501 1502 notification.style.display = 'block'; 1503 } 1504 } 1505 } 1506 1507 showReferralNotification(); 1508 1509 addEventListener('beforeunload', function() { 1510 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 1511 1512 if (referralData.creditAmount !== undefined) { 1513 referralData.creditAmount = null; 1514 localStorage.setItem('referral_notification_data', JSON.stringify(referralData)); 1515 } 1516 }); 1517 1518 function closeReferralNotification() { 1519 const notification = document.getElementById('referralNotification'); 1520 if (notification) { 1521 notification.style.display = 'none'; 1522 } 1523 } 1524 1525 function dismissReferralNotification() { 1526 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 1527 1528 referralData.dismissed = true; 1529 referralData.timestamp = referralData.timestamp || Date.now(); 1530 referralData.expirationDays = referralData.expirationDays || 3; 1531 1532 localStorage.setItem('referral_notification_data', JSON.stringify(referralData)); 1533 1534 closeReferralNotification(); 1535 } 1536 1537 function goToSignupPage() { 1538 location.href = '/account/register'; 1539 dismissReferralNotification(); 1540 } 1541 1542 function closeMobileReferralModal() { 1543 const mobileModal = document.querySelector('#referralMobileModal details'); 1544 if (mobileModal) { 1545 mobileModal.removeAttribute('open'); 1546 } 1547 1548 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 1549 referralData.dismissed = true; 1550 referralData.timestamp = referralData.timestamp || Date.now(); 1551 referralData.expirationDays = referralData.expirationDays || 3; 1552 localStorage.setItem('referral_notification_data', JSON.stringify(referralData)); 1553 } 1554 1555 function goToSignupPageFromMobile() { 1556 location.href = '/account/register'; 1557 closeMobileReferralModal(); 1558 } 1559 // End - referral notification popup 1560</script>
1560 1561 1562 1563 1564 <main id="MainContent" class="content-for-layout focus-none" role="main" tabindex="-1"> 1565 1566 <link rel="preload" href="https://store-themes.easystore.co/648936/themes/117661/assets/blog.css?t=1788259614" as="style" onload="this.onload=null;this.rel='stylesheet'"> 1567<link rel="preload" href="https://store-themes.easystore.co/648936/themes/117661/assets/component-card.css?t=1788259614" as="style" onload="this.onload=null;this.rel='stylesheet'"> 1568 1569<div class="main-blog page-width"> 1570 <h1 class="title--primary"> 1571 1572 ææ°æ¶æ¯ 1573 1574 </h1> 1575 <div class="blog-articles"> 1576 1577 <div class="blog-articles__article article"> 1578 <article class="article-card "> 1579 <a href="/blogs/news/-book-bread-çå ç©ä½ä½é¶å±" class="article-content motion-reduce"> 1580 1581 <div class="article-card__image-wrapper"> 1582 <div class="article-card__image media media--landscape"> 1583 <img src="https://cdn.store-assets.com/s/648936/f/9186184.jpg" alt="ãBOOK & BREADã " class="motion-reduce"> 1584 </div> 1585 </div> 1586 1587 <div class="article-card__info"> 1588 <header class="article-card__header"> 1589 <h2 class="article-card__title"> 1590 ãBOOK & BREADã 1591 </h2> 1592 <span class="circle-divider caption-with-letter-spacing"> 1593 <time datetime="2022-09-16"> Sep 16, 22</time> 1594 </span> 1595 1596 <span class="caption-with-letter-spacing"> 1597 HSUSHAOYI 1598 </span> 1599 1600 </header> 1601 <p class="article-card__excerpt rte-width break">ä¹¾ç¥æº«æçæ®æä¸ï¼éºµå èé±è®æäºæå¥½çéªä¼´ï¼ ç¨ä»åæ®å¥å¤æ¥çç¥ç±ï¼è¿ä¾ç§æ¥æº«åå¾é¢¨ï¼ä¹å 實é«å §å種è½éï¼ </p> 1602 </div> 1603 </a> 1604 </article> 1605 </div> 1606 1607 <div class="blog-articles__article article"> 1608 <article class="article-card "> 1609 <a href="/blogs/news/å°æ¯2-森森è¢çå°ç©è¯å±-2020-10-01-written-by-hsushaoyi" class="article-content motion-reduce"> 1610 1611 <div class="article-card__image-wrapper"> 1612 <div class="article-card__image media media--landscape"> 1613 <img src="https://cdn.store-assets.com/s/648936/f/6008759.jpeg" alt="å°æ¯2 â æ£®æ£®è¢çå°ç©è¯å±ï¼2020-10-01 Written by HSUSHAOYIï¼" class="motion-reduce"> 1614 </div> 1615 </div> 1616 1617 <div class="article-card__info"> 1618 <header class="article-card__header"> 1619 <h2 class="article-card__title"> 1620 å°æ¯2 â æ£®æ£®è¢çå°ç©è¯å±ï¼2020-10-01 Written by HSUSHAOYIï¼ 1621 </h2> 1622 <span class="circle-divider caption-with-letter-spacing"> 1623 <time datetime="2021-01-17"> Jan 17, 21</time> 1624 </span> 1625 1626 <span class="caption-with-letter-spacing"> 1627 HSUSHAOYI 1628 </span> 1629 1630 </header> 1631 <p class="article-card__excerpt rte-width break">æ²æ³å°æè¾¦ç¬¬äºæ¬¡çå°æ¯å±ã å°æ¯ æææ¯æ å°å°ä¸çä¸çæ´»çæ¯è±¡ï¼ç¹¼ä¸æ¬¡çç¶é©ï¼é次å種ä½ç½®èæºæ¾çæ³æ³å¤§åç´ãç¨ç¡æ¹æ³è®ç©ºéå³ä½¿å¡æ»¿ä½åä¹ä¸éäºï¼å ¨èªç¶å è®äººå¿æ æ¸ ç½ï¼æ´é«æ°å徿£ï¼æåèªå·±å¾æ»¿æï¼çæ¯å¯åå¯è³å¯åå¯è³ãï¼å種èªå¹èªæ
1631ï¼ äººçå¯ä»¥ä¸è²·æ¼äº®è¡£æï¼ä¸åç¾å³å¤§é¤ï¼ä½ä¸å¯ä»¥æ²æç©å ·ãç©å ·å¾éè¦ï¼ å¯ä¸ç¾ä¸ä¸è¶³æ¯ææ²æè好å®åºå¾ç宿ï¼å°è´æè§å±è å°ç¾å ´ï¼å»æ²æè¾¦æ³çå°ææå±åãï¼å çºå·²åæ¥è¢«å¸¶èµ°æå¯åºï¼ ææ³äºå¾ä¹ 該å¦ä½å½è£ï¼ç¶å¾çè¦æè¿å ç«æ ï¼ç´ç´æ¹ä»¥ç·ä¸å±å½¢å¼å±è¦½çæ¥æ¬ä½å®¶åï¼æ </p> 1632 </div> 1633 </a> 1634 </article> 1635 </div> 1636 1637 <div class="blog-articles__article article"> 1638 <article class="article-card "> 1639 <a href="/blogs/news/粼粼-æ£®æ£®çæ´»å¨ç©è¯å±-2020-05-07-written-by-hsushaoyi" class="article-content motion-reduce"> 1640 1641 <div class="article-card__image-wrapper"> 1642 <div class="article-card__image media media--landscape"> 1643 <img src="https://cdn.store-assets.com/s/648936/f/6008743.jpeg" alt="ç²¼ç²¼ï¼æ£®æ£®çæ´»å¨ç©è¯å±ï¼2020-05-07 Written by HSUSHAOYIï¼" class="motion-reduce"> 1644 </div> 1645 </div> 1646 1647 <div class="article-card__info"> 1648 <header class="article-card__header"> 1649 <h2 class="article-card__title"> 1650 ç²¼ç²¼ï¼æ£®æ£®çæ´»å¨ç©è¯å±ï¼2020-05-07 Written by HSUSHAOYIï¼ 1651 </h2> 1652 <span class="circle-divider caption-with-letter-spacing"> 1653 <time datetime="2021-01-17"> Jan 17, 21</time> 1654 </span> 1655 1656 <span class="caption-with-letter-spacing"> 1657 HSUSHAOYI 1658 </span> 1659 1660 </header> 1661 <p class="article-card__excerpt rte-width break">æè¬æå¾®èç©çéè«ï¼éæ¬¡ä¹æ¯è森森夥伴åä¸èµ·çè¯å±ã æ¬æ¬¡æä»¥å¤æ¥é½å 䏿°´å ææ³ï¼æ³¢å 粼粼ä½çºç¼æ³ï¼æåºäºæ°´çéé³¥å èè±èçæ³åãæ¹é¢é¡åä¸ï¼è¸©é²æ°´è£¡çé³¥å æå¤§ãå便¯èº«éè±æµï¼æå°çåèæ¯åæ¬é«è³ç樹æ¨ã æçå¨ç©è³ä»å¤ä»¥è½è½¤æå½¢ãè鿬¡åæ¹ç¨å ¨ææçæ¹å¼åç¾ï¼éç¶è³ªæä¸å¦è½è½¤æå½¢æç·æ¢æ¸ æ°ï¼ä½æ´è½è¡¨ç¾åºè£½ä½è çæ ç·ãå¦ä¸æ¹é¢ï¼é次å±è¦½ä¸æåºä¸ç³»åé æ¯è¨ç«ï¼å¸æå¨ä»²å¤å¤è£¡ï¼ç¨ç²¼ç²¼çä½å忝å°é ï¼å¯ä»¥æåå°æå¦å¤æ¥å¾®é¢¨å¹æçæ¶¼æ æ¬æ¬¡å ç«æ å½±é¿ï¼åå æºåçéå¹é æèæ´»åé½ç¡æ³èè¡ï¼æå°æé»å¯æ </p> 1662 </div> 1663 </a> 1664 </article> 1665 </div> 1666 1667 <div class="blog-articles__article article"> 1668 <article class="article-card "> 1669 <a href="/blogs/news/2020-happy-new-year-2020-01-01-written-by-hsushaoyi" class="article-content motion-reduce"> 1670 1671 <div class="article-card__image-wrapper"> 1672 <div class="article-card__image media media--landscape"> 1673 <img src="https://cdn.store-assets.com/s/648936/f/6008724.jpeg" alt="2020 happy new yearï¼2020-01-01 Written by HSUSHAOYIï¼" class="motion-reduce"> 1674 </div> 1675 </div> 1676 1677 <div class="article-card__info"> 1678 <header class="article-card__header"> 1679 <h2 class="article-card__title"> 1680 2020 happy new yearï¼2020-01-01 Written by HSUSHAOYIï¼ 1681 </h2> 1682 <span class="circle-divider caption-with-letter-spacing"> 1683 <time datetime="2021-01-17"> Jan 17, 21</time> 1684 </span> 1685
1686 <span class="caption-with-letter-spacing"> 1687 HSUSHAOYI 1688 </span> 1689 1690 </header> 1691 <p class="article-card__excerpt rte-width break">2020ä¹æç¹¼çºåªå. . ââââââ. åµä½å°±åç §é¡åï¼æäºä¸æ»¿æä¸åæ¡çé¨å齿å¨ä½åä¸è·åºä¾ï¼æ°¸é é½çå¾å°ç¼ºé»ã 使çµï¼æ¥ç´é¡å裡çèªå·±ï¼ä¹æ¯æ¥ç´ä¸æ»¿æçé¨åãç¶å¾ç¶éå §åæè¯ï¼ä½¿å ¶ä¸ååªè½èº²å¨è§è½ï¼èæ¯å å å¨é½å ä¸è¢«ç¾äººæ³¨è¦ã éç¶èµ°å¾å¾æ ¢ï¼çè³æ¯é£æ»¾å¸¶ç¬çæ¢ç´¢ãä½æè¨±2020çèªå·±è½å¤ ç¹¼çºæé·é²æ¥ï¼æçºä¸ååªç§çåµä½è ã </p> 1692 </div> 1693 </a> 1694 </article> 1695 </div> 1696 1697 <div class="blog-articles__article article"> 1698 <article class="article-card "> 1699 <a href="/blogs/news/22-ããããã®è¡¨ç¾-2019-12-27-written-by-hsushaoyi" class="article-content motion-reduce"> 1700 1701 <div class="article-card__image-wrapper"> 1702 <div class="article-card__image media media--landscape"> 1703 <img src="https://cdn.store-assets.com/s/648936/f/6008717.jpeg" alt="22 -ããããã®è¡¨ç¾ï¼2019-12-27 Written by HSUSHAOYIï¼" class="motion-reduce"> 1704 </div> 1705 </div> 1706 1707 <div class="article-card__info"> 1708 <header class="article-card__header"> 1709 <h2 class="article-card__title"> 1710 22 -ããããã®è¡¨ç¾ï¼2019-12-27 Written by HSUSHAOYIï¼ 1711 </h2> 1712 <span class="circle-divider caption-with-letter-spacing"> 1713 <time datetime="2021-01-17"> Jan 17, 21</time> 1714 </span> 1715 1716 <span class="caption-with-letter-spacing"> 1717 HSUSHAOYI 1718 </span> 1719 1720 </header> 1721 <p class="article-card__excerpt rte-width break">è¨å¾ä»å¹´å¹´å䏿åå©éæ²æï¼æå¨IG䏿å°éæ¼å½©è¹èé³¥çè²¼æãé£ç¯è²¼ææçºå¥æ©ï¼å人Açå°å¾å°±ç§ä¸æ²æèªªï¼ãææåè¨ç«ï¼ä½ è¦ä¸è¦ä¹ä¾åå ï¼ã äºå¯¦ä¸å人Aæ ¹æ¬ä¸äºè§£å°ç£çå©å§»å¹³æ¬éåï¼ä¹ä¸æçºä»éº¼ä»çå°ç£æååååé½å¥½æ¿åã她å åªæ¯çäºæè²¼æä¸çå¹¾åééµåï¼è¦ºå¾ä¸å®æ¯å½éç宿ï¼ï¼ï¼ä¸å¤©çæ¨æï¼ï¼ï¼ï¼è®é å¨å°ç£çæä¸å®è¦åå ã ä½éåè¨ç«ä¸¦ä¸æ¯é次çå±è¦½ãå çºåç¨®äºæ ï¼å人Açè¨ç«è³ä»éæ²æä»»ä½é²åº¦ã叿ä»å¹´è½å¤ 實ç¾ã æ¼æ¯å¨å人Aæåçåå±äººä¸ï¼å¬çäºé次æ°çå±è¦½ã ä½åå稱çºç»å±±ï¼å±±ç»ãï¼ </p> 1722 </div> 1723 </a> 1724 </article> 1725 </div> 1726 1727 <div class="blog-articles__article article"> 1728 <article class="article-card "> 1729 <a href="/blogs/news/å°æ¯-森森è¢çå°ç©è¯å±-2019-11-15-written-by-hsushaoyi" class="article-content motion-reduce"> 1730 1731 <div class="article-card__image-wrapper"> 1732 <div class="article-card__image media media--landscape"> 1733 <img src="https://cdn.store-assets.com/s/648936/f/6008705.jpeg" alt="å°æ¯â 森森è¢çå°ç©è¯å± ï¼2019-11-15 Written by HSUSHAOYIï¼" class="motion-reduce"> 1734 </div> 1735 </div> 1736 1737 <div class="article-card__info"> 1738 <header class="article-card__header"> 1739 <h2 class="article-card__title"> 1740 å°æ¯â 森森è¢çå°ç©è¯å± ï¼2019-11-15 Written by HSUSHAOYIï¼ 1741 </h2>
1742 <span class="circle-divider caption-with-letter-spacing"> 1743 <time datetime="2021-01-17"> Jan 17, 21</time> 1744 </span> 1745 1746 <span class="caption-with-letter-spacing"> 1747 HSUSHAOYI 1748 </span> 1749 1750 </header> 1751 <p class="article-card__excerpt rte-width break">èæ£®æ£®å°å¤¥ä¼´åçè¯å±ï¼å¾æä¸éå§çç©ç¬è©±å°çªç¶èªçæ¾å°é»ï¼åå°è¨è¨å±è¦½ä½åèæç §è£½ä½æä¿¡çãå種çç©å¾å¾æå¿«ï¼æç夥伴大家æç¶é½å¾æ£ï¼ååï¼ æ¬æ¬¡è¢ç屿³è¡¨ç¾çï¼æ¯æåæ¯å人å¿ä¸çå°å®å®ãèæ®éæ¯ç¢çæ´»é¶ç¸æ¯ï¼ç¸®å°çå°é¶å¶åä½çºç©ä»¶ï¼æ´è½é¡è¿°é£ç¨®å §å¿ä¸ï¼æ¯åäººç¨æçä¸çè§ã æçé¨åæ¯ç©¿èåå¼ç¡è¢çäººï¼æéçåç©èå±±ãè¨å®ä¸æ¯æ²æ¼ å°åç¶ æ´²åé®çè¡é å¸éãåå°èéèä¾çæ¤è²©åæ¬éå種ååï¼å©¦å¥³åæ¿èå弿°å©åï¼æééå¶æé£ç¦½èè²çéæãå¸æè¡¨ç¾ä¸ç¨®å¸éçæ éæã ä¹å çºæ¯ç±åå°èéèµ·ä¾ç人åï¼æ </p> 1752 </div> 1753 </a> 1754 </article> 1755 </div> 1756 1757 <div class="blog-articles__article article"> 1758 <article class="article-card "> 1759 <a href="/blogs/news/2019-merry-xmas-2019-12-16-written-by-hsushaoyi" class="article-content motion-reduce"> 1760 1761 <div class="article-card__image-wrapper"> 1762 <div class="article-card__image media media--landscape"> 1763 <img src="https://cdn.store-assets.com/s/648936/f/6008691.jpeg" alt="2019 Merry Xmas ï¼2019-12-16 Written by HSUSHAOYIï¼" class="motion-reduce"> 1764 </div> 1765 </div> 1766 1767 <div class="article-card__info"> 1768 <header class="article-card__header"> 1769 <h2 class="article-card__title"> 1770 2019 Merry Xmas ï¼2019-12-16 Written by HSUSHAOYIï¼ 1771 </h2> 1772 <span class="circle-divider caption-with-letter-spacing"> 1773 <time datetime="2021-01-17"> Jan 17, 21</time> 1774 </span> 1775 1776 <span class="caption-with-letter-spacing"> 1777 HSUSHAOYI 1778 </span> 1779 1780 </header> 1781 <p class="article-card__excerpt rte-width break">2019çèèªæ°åå°±æ¯è²é é·¹åäºï¼èä¸éè¨è¨äºå£ç¯éå®çä¸è§å°å¸½å¸½ã 鿬¡èèªæå¾12æåéå§ï¼ä¸è·¯åå ç°¡å®çæ´»ç¯å¾ååå æ¾è¸å¥½å¥½ï¼éè·å°æ°ç«¹èç©ãèä¸éä¸åçµæå¾ï¼æé幾天éè¦æèå°ä¼éµåè¡å»å¤§éªåå è¯å±ãç°¡ç´æ¯ç¡æ¥µéè¶ äººè¡ç¨ãï¼ååï¼ èªªå°ç°¡å®çæ´»ç¯ä»å¹´æ¯ç¬¬äºå¹´åå äºï¼å°é»å¾è¯å±±æ¹å°101å»£å ´è®äººè »ä¸ç¿æ £çãå»å¹´èå°ä¸å種åå°æ¾é£èªæç人ä¹å®å ¨çä¸è¦ï¼æ¯èµ·ä¸æ¬¡å¤§å®¶æ¢çæ§ï¼ï¼ï¼åå·éãå䏿¬¡ç¸æ¯é次ç天氣簡ç´ç³ç³éé ï¼é å ©å¤©ç¢°å°å種è®äººå´©æ½°ç大風大é¨ï¼å°è´ç´è¢æ¿äºå ææ¿äºï¼å°±é£è£å¨å¤§å¡è è¢è£¡ </p> 1782 </div> 1783 </a> 1784 </article> 1785 </div> 1786 1787 </div> 1788</div> 1789 1790 1791 1792 1793 1794 </main> 1795 <style> 1796 .footer{ 1797 background-color: #F7F8F8; 1798 color: #717071; 1799 --color-foreground: 113,112,113; 1800 } 1801 .footer .link--text, 1802 .footer .list-menu__item--link, 1803 .footer .footer-block__details-content .list-menu__item--link{ 1804 color: #717071; 1805 } 1806 .footer-block__heading{ 1807 color: #717071; 1808 } 1809</style> 1810 1811<link rel="preload" href="https://store-themes.easystore.co/648936/themes/117661/assets/section-footer.css?t=1788259614" as="style" onload="this.onload=null;this.rel='stylesheet'"> 1812 1813<footer class="footer color-background-1">
1814 <div class="footer__content-top page-width"> 1815 <div class="grid grid--1-col grid--4-col-tablet "> 1816 1817 1818 1819 <div class="grid__item"> 1820 1821 <h2 class="footer-block__heading">åå¼ç¤¾ç¾¤å¹³å°</h2> 1822 <ul class="footer__list-social list-unstyled list-social footer-block__details-content" role="list"> 1823 1824 <li class="list-social__item"> 1825 <a href="https://twitter.com/hsushaoyi" class="link link--text list-social__link"> 1826 1827 1828 1829 <svg class="icon icon-twitter " viewBox="0 0 22 22" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1830 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 1831 <path d="M3 3l11.733 16h4.267l-11.733 -16z" /> 1832 <path d="M3 19l6.768 -6.768m2.46 -2.46l6.772 -6.772" /> 1833 </svg> 1834 1835 1836 1837 </a> 1838 </li> 1839 1840 1841 <li class="list-social__item"> 1842 <a href="https://www.facebook.com/hsushaoyi.form" class="link link--text list-social__link"> 1843 1844 1845 1846 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-facebook " 1847 viewBox="0 0 18 18"> 1848 <path fill="currentColor" 1849 d="M16.42.61c.27 0 .5.1.69.28.19.2.28.42.28.7v15.44c0 .27-.1.5-.28.69a.94.94 0 01-.7.28h-4.39v-6.7h2.25l.31-2.65h-2.56v-1.7c0-.4.1-.72.28-.93.18-.2.5-.32 1-.32h1.37V3.35c-.6-.06-1.27-.1-2.01-.1-1.01 0-1.83.3-2.45.9-.62.6-.93 1.44-.93 2.53v1.97H7.04v2.65h2.24V18H.98c-.28 0-.5-.1-.7-.28a.94.94 0 01-.28-.7V1.59c0-.27.1-.5.28-.69a.94.94 0 01.7-.28h15.44z"> 1850 </path> 1851 </svg> 1852 1853 1854 1855 </a> 1856 </li> 1857 1858 1859 <li class="list-social__item"> 1860 <a href="https://www.instagram.com/hsushaoyi/" class="link link--text list-social__link"> 1861 1862 1863 1864 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-instagram " 1865 viewBox="0 0 18 18"> 1866 <path fill="currentColor" 1867 d="M8.77 1.58c2.34 0 2.62.01 3.54.05.86.04 1.32.18 1.63.3.41.17.7.35 1.01.66.3.3.5.6.65 1 .12.32.27.78.3 1.64.05.92.06 1.2.06 3.54s-.01 2.62-.05 3.54a4.79 4.79 0 01-.3 1.63c-.17.41-.35.7-.66 1.01-.3.3-.6.5-1.01.66-.31.12-.77.26-1.63.3-.92.04-1.2.05-3.54.05s-2.62 0-3.55-.05a4.79 4.79 0 01-1.62-.3c-.42-.16-.7-.35-1.01-.66-.31-.3-.5-.6-.66-1a4.87 4.87 0 01-.3-1.64c-.04-.92-.05-1.2-.05-3.54s0-2.62.05-3.54c.04-.86.18-1.32.3-1.63.16-.41.35-.7.66-1.01.3-.3.6-.5 1-.65.32-.12.78-.27 1.63-.3.93-.05 1.2-.06 3.55-.06zm0-1.58C6.39 0 6.09.01 5.15.05c-.93.04-1.57.2-2.13.4-.57.23-1.06.54-1.55 1.02C1 1.96.7 2.45.46 3.02c-.22.56-.37 1.2-.4 2.13C0 6.1 0 6.4 0 8.77s.01 2.68.05 3.61c.04.94.2 1.57.4 2.13.23.58.54 1.07 1.02 1.56.49.48.98.78 1.55 1.01.56.22 1.2.37 2.13.4.94.05 1.24.06 3.62.06 2.39 0 2.68-.01 3.62-.05.93-.04 1.57-.2 2.13-.41a4.27 4.27 0 001.55-1.01c.49-.49.79-.98 1.01-1.56.22-.55.37-1.19.41-2.13.04-.93.05-1.23.05-3.61 0-2.39 0-2.68-.05-3.62a6.47 6.47 0 00-.4-2.13 4.27 4.27 0 00-1.02-1.55A4.35 4.35 0 0014.52.46a6.43 6.43 0 00-2.13-.41A69 69 0 008.77 0z"> 1868 </path> 1869 <path fill="currentColor" 1870 d="M8.8 4a4.5 4.5 0 100 9 4.5 4.5 0 000-9zm0 7.43a2.92 2.92 0 110-5.85 2.92 2.92 0 010 5.85zM13.43 5a1.05 1.05 0 100-2.1 1.05 1.05 0 000 2.1z"> 1871 </path> 1872 </svg> 1873 1874 1875 1876 </a> 1877 </li> 1878 1879 1880 1881 1882 1883 1884 1885 </ul> 1886 1887 </div> 1888 1889 1890 1891 <div class="grid__item"> 1892 1893 <h2 class="footer-block__heading">仿¬¾æ¹å¼</h2> 1894 <div class="footer-block__details-content footer__payment"> 1895 <ul class="list list-payment" role="list"> 1896 1897 <li class="list-payment__item"> 1898 1899 1900 1901 <svg class="icon icon--full-color " viewBox="0 0 38 24" xmlns="http://www.w3.org/2000/svg" role="img" 1902 width="38" height="24" aria-labelledby="pi-visa"> 1903 <path opacity=".07" 1904 d="M35 0H3C1.3 0 0 1.3 0 3v18c0 1.7 1.4 3 3 3h32c1.7 0 3-1.3 3-3V3c0-1.7-1.4-3-3-3z"></path> 1905 <path fill="#fff" d="M35 1c1.1 0 2 .9 2 2v18c0 1.1-.9 2-2 2H3c-1.1 0-2-.9-2-2V3c0-1.1.9-2 2-2h32"> 1906 </path> 1907 <path 1908 d="M28.3 10.1H28c-.4 1-.7 1.5-1 3h1.9c-.3-1.5-.3-2.2-.6-3zm2.9 5.9h-1.7c-.1 0-.1 0-.2-.1l-.2-.9-.1-.2h-2.4c-.1 0-.2
19080-.2.2l-.3.9c0 .1-.1.1-.1.1h-2.1l.2-.5L27 8.7c0-.5.3-.7.8-.7h1.5c.1 0 .2 0 .2.2l1.4 6.5c.1.4.2.7.2 1.1.1.1.1.1.1.2zm-13.4-.3l.4-1.8c.1 0 .2.1.2.1.7.3 1.4.5 2.1.4.2 0 .5-.1.7-.2.5-.2.5-.7.1-1.1-.2-.2-.5-.3-.8-.5-.4-.2-.8-.4-1.1-.7-1.2-1-.8-2.4-.1-3.1.6-.4.9-.8 1.7-.8 1.2 0 2.5 0 3.1.2h.1c-.1.6-.2 1.1-.4 1.7-.5-.2-1-.4-1.5-.4-.3 0-.6 0-.9.1-.2 0-.3.1-.4.2-.2.2-.2.5 0 .7l.5.4c.4.2.8.4 1.1.6.5.3 1 .8 1.1 1.4.2.9-.1 1.7-.9 2.3-.5.4-.7.6-1.4.6-1.4 0-2.5.1-3.4-.2-.1.2-.1.2-.2.1zm-3.5.3c.1-.7.1-.7.2-1 .5-2.2 1-4.5 1.4-6.7.1-.2.1-.3.3-.3H18c-.2 1.2-.4 2.1-.7 3.2-.3 1.5-.6 3-1 4.5 0 .2-.1.2-.3.2M5 8.2c0-.1.2-.2.3-.2h3.4c.5 0 .9.3 1 .8l.9 4.4c0 .1 0 .1.1.2 0-.1.1-.1.1-.1l2.1-5.1c-.1-.1 0-.2.1-.2h2.1c0 .1 0 .1-.1.2l-3.1 7.3c-.1.2-.1.3-.2.4-.1.1-.3 0-.5 0H9.7c-.1 0-.2 0-.2-.2L7.9 9.5c-.2-.2-.5-.5-.9-.6-.6-.3-1.7-.5-1.9-.5L5 8.2z" 1909 fill="#142688"></path> 1910 </svg> 1911 1912 1913 1914 </li> 1915 1916 1917 <li class="list-payment__item"> 1918 1919 1920 1921 <svg class="icon icon--full-color " viewBox="0 0 38 24" xmlns="http://www.w3.org/2000/svg" role="img" 1922 width="38" height="24" aria-labelledby="pi-master"> 1923 <path opacity=".07" 1924 d="M35 0H3C1.3 0 0 1.3 0 3v18c0 1.7 1.4 3 3 3h32c1.7 0 3-1.3 3-3V3c0-1.7-1.4-3-3-3z"></path> 1925 <path fill="#fff" d="M35 1c1.1 0 2 .9 2 2v18c0 1.1-.9 2-2 2H3c-1.1 0-2-.9-2-2V3c0-1.1.9-2 2-2h32"> 1926 </path> 1927 <circle fill="#EB001B" cx="15" cy="12" r="7"></circle> 1928 <circle fill="#F79E1B" cx="23" cy="12" r="7"></circle> 1929 <path fill="#FF5F00" 1930 d="M22 12c0-2.4-1.2-4.5-3-5.7-1.8 1.3-3 3.4-3 5.7s1.2 4.5 3 5.7c1.8-1.2 3-3.3 3-5.7z"></path> 1931 </svg> 1932 1933 1934 1935 </li> 1936 1937 1938 1939 1940 1941 </ul> 1942 </div> 1943 1944 <div class="footer__payment"> 1945 <ul class="list list-payment" role="list"> 1946 1947 <li class="list-payment__item"> 1948 <img src="https://s3.dualstack.ap-southeast-1.amazonaws.com/eesb.public/images/payment/payments_paypal.svg" alt="payment_paypal" loading="lazy" width="85px"> 1949 </li> 1950 1951 <li class="list-payment__item"> 1952 <img src="https://s3.dualstack.ap-southeast-1.amazonaws.com/eesb.public/images/payment/payments_newebpay.svg" alt="payment_newebpay" loading="lazy" width="85px"> 1953 </li> 1954 1955 </ul> 1956 </div> 1957 1958 1959 </div> 1960 1961 1962 1963 <div class="grid__item"> 1964 1965 <h2 class="footer-block__heading"> 1966 è¯çµ¡è³è¨ 1967 </h2> 1968 <ul class="footer-block__details-content list-unstyled"> 1969 1970 <li> 1971 <a href="/store-locator" class="link link--text list-menu__item list-menu__item--link"> 1972 ðªï¼[email protected] 1973 </a> 1974 </li> 1975 1976 <li> 1977 <a href="http://linktr.ee/hsushaoyi" target="_blank" class="link link--text list-menu__item list-menu__item--link"> 1978 ï¼åä½ç¸éè«å¯ä¿¡ç®±ï¼éèè«æ´½åå¹³å°ç§è¨ãï¼ 1979 </a> 1980 </li> 1981 1982 1983 </ul> 1984 1985 </div> 1986 1987 </div> 1988 </div> 1989 <div class="footer__content-bottom"> 1990 <div class="footer__content-bottom-wrapper page-width"> 1991 <div class="footer__column footer__column--info"> 1992 1993 1994 1995 1996 1997 1998 1999 <div class="footer__copyright caption"> 2000 <div class="copyright__content">© 2026 hsushaoyi.以ä¸åæªçæ¬ææï¼åä¸å¯èªè¡ä¸è¼ç§ç¨ãï¼å å«åç¨éåç¨ï¼</div> 2001 </div> 2002 2003 <div class="footer__copyright caption"> 2004 2005 <div> 2006 2007 2008 2009 <a href="/legal/é貨é ç¥">ç³¾ç´èç/é貨é ç¥</a> 2010 2011 2012 2013 2014 | <a href="/pages/é±ç§æ¬-æåæ¢æ¬¾">é±ç§æ¬/æåæ¢æ¬¾</a> 2015 2016 2017 2018 2019 | <a href="/pages/è³¼ç©é ç¥-注æäºé ">è³¼ç©é ç¥/注æäºé </a> 2020 2021 2022 2023 </div> 2024 2025 </div> 2026 2027 </div> 2028 </div> 2029 </div> 2030</footer> 2031 2032 2033 2034 2035 2036 2037
2037<script> 2038 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) 2039</script>
2039 2040 2041 2042 2043
2043<script> 2044 let page_template = 'blog'; 2045 2046 if(document.querySelector('.currency-picker')) { 2047 EasyStore.Currencies.change(document.querySelector('.currency-picker').value) 2048 EasyStore.Currencies.convertAll() 2049 } 2050 2051 document.querySelectorAll('.currency-picker').forEach((el)=>{ 2052 el.addEventListener('change',(event)=>{ 2053 EasyStore.Currencies.change(event.target.value) 2054 2055 2056 if (page_template == 'cart') { 2057 const params = new URLSearchParams(window.location.search); 2058 params.set('delete_cache', 1); 2059 window.location.search = params; 2060 } else { 2061 window.location.reload(); 2062 } 2063 2064 return 2065 2066 2067 document.querySelectorAll('[name=currencies],[name=current_currency]').forEach((el)=>{ 2068 el.value = event.target.value 2069 }) 2070 2071 if(page_template == 'cart') location.reload(); 2072 }) 2073 }) 2074 </script>
2074 2075 2076 2077 2078 2079
2079<script> 2080 2081 window.variantStrings = { 2082 addToCart: `å å ¥è³¼ç©è»`, 2083 soldOut: `<span style='font-size:14px;'>å®å®</span>`, 2084 unavailable: `æ«ç¡ä¾æ`, 2085 } 2086 2087 window.accessibilityStrings = { 2088 shareSuccess: `éæ¥å·²å¾©è£½å°åªè²¼æ¿`, 2089 } 2090 </script>
2090 2091
2091<script> 2092 2093 /* 2094 2095 ------ 2096 Events 2097 ------ 2098 2099 pages/viewed 2100 2101 customers/signup 2102 2103 customers/login 2104 2105 products/searched 2106 2107 collections/viewed 2108 2109 products/viewed 2110 2111 products/shared 2112 2113 wishlists/item_added 2114 2115 carts/items_added 2116 2117 carts/viewed 2118 2119 carts/item_removed 2120 2121 checkouts/initiated 2122 2123 checkouts/shipping_info_added 2124 2125 checkouts/payment_info_added 2126 2127 checkouts/completed 2128 2129 orders/placed 2130 2131 orders/purchased 2132 2133 payments/captured 2134 2135 payments/failed 2136 2137 */ 2138 2139 window.__latest_cart = window.__latest_cart || null; 2140 2141 const _selector = document.querySelector.bind(document), 2142 _selectorAll = document.querySelectorAll.bind(document) 2143 2144 document.addEventListener('DOMContentLoaded', (event) => { 2145 2146 const default_currency = getCookie("currency") 2147 const customer_id = window.__st.cid 2148 const template = window.__st.p 2149 2150 onPageView() 2151 2152 //-----------------------// 2153 // Configs // 2154 //-----------------------// 2155 2156 window.dataLayer = window.dataLayer || [] 2157 2158 Array.prototype.last = Array.prototype.last || function() { 2159 return this[this.length - 1] || null 2160 } 2161 2162 Array.prototype.first = Array.prototype.first || function() { 2163 return this[0] || null 2164 } 2165 2166 //----------------------// 2167 // Triggers // 2168 //----------------------// 2169 2170 const XHR = window.XMLHttpRequest 2171 2172 function xhr() { 2173 2174 const xhr = new XHR() 2175 2176 xhr.addEventListener("readystatechange", function() { 2177 2178 if(xhr.readyState != 4) return 2179 2180 try { 2181 2182 const response_url = xhr.responseURL 2183 2184 if (response_url.includes("cart/add")) { 2185 2186 window.__latest_cart = JSON.parse(xhr.response) 2187 2188 onCartItemsAdded() // ok 2189 2190 } 2191 2192 if (response_url.includes("cart/remove_item_quantity")) { 2193 2194 window.__latest_cart = JSON.parse(xhr.response) 2195 2196 onCartItemRemoved() // ok 2197 2198 } 2199 2200 if (response_url.includes("new_cart?retrieve=true")) { 2201 2202 result = JSON.parse(xhr.response) 2203 2204 if (result.cart) { 2205 window.__latest_cart = result.cart 2206 } 2207 2208 } 2209 2210 } catch(e) { 2211 2212 console.error(e) 2213 2214 } 2215 2216 }, false); 2217 2218 return xhr 2219 2220 } 2221 2222 window.XMLHttpRequest = xhr 2223 2224 switch(template) { 2225 2226 case 'cart': onCartView() // ok 2227 break 2228 case 'product': onProductView() // ok 2229 break 2230 case 'collection': onCollectionView() // ok 2231 break 2232 case 'blog': onBlogView() 2233 break 2234 case 'article': onArticleView() 2235 break 2236 case 'payment_completed': onOrderPlace() 2237 break 2238 case 'payment_fail': onPaymentFail() 2239 break 2240 2241 } 2242 2243 // _selector('form[action="/checkout/payments"]').addEventListener("submit", onPaymentInfoAdded(_selector('form[action="/checkout/payments"]'))) 2244 if (_selector('form[action="/checkout/detail"]')) _selector('form[action="/checkout/detail"]').addEventListener("submit", ()=>{onShippingInfoAdded(_selector('form[action="/checkout/detail"]'))}) // ok 2245 if (_selector('form[action="/checkout/shipping"]')) _selector('form[action="/checkout/shipping"]').addEventListener("submit", ()=>{onShippingInfoAdded(_selector('form[action="/checkout/shipping"]'))}) // ok 2246 if (_selector('form[action="/account/register"]')) _selector('form[action="/account/register"]').addEventListener("submit", onSignUp) // ok 2247 if (_selector('form[action="/account/login"]')) _selector('form[action="/account/login"]').addEventListener("submit", onLogin) // ok 2248 if (_selector('form[action="/search"]')) _selector('form[action="/search"]').addEventListener("submit", onProductSearch()) // ok 2249 if (_selector('#line-login-btn')) _selector('#line-login-btn').addEventListener('click', onLineLogin) // ok 2250 if (_selector('#PlaceOrder')) _selector('#PlaceOrder').addEventListener("click", ()=>{onCheckoutComplete(_selector('form[action="/checkout/payments"]'))}); // ok 2251 if (_selector('#add_wishlist')) _selector('#add_wishlist').addEventListener("click", onWishlistItemAdded) // ok 2252 if (_selectorAll('a[href="/account/logout"]')) _selectorAll('a[href="/account/logout"]').forEach(logoutButton => logoutButton.addEventListener("click", onLogout)) // ok 2253 if (_selector('.CartDrawerTrigger.cart-page-link')) _selector('.CartDrawerTrigger.cart-page-link').addEventListener("click", onCartView) // ok 2254 if (_selector('.CartDrawerTrigger.cart-page-link.mobile-cart-page-link')) _selector('.CartDrawerTrigger.cart-page-link.mobile-cart-page-link').addEventListener("click", onCartView) // ok 2255 if (_selectorAll('a[class^="share-"]')) _selectorAll('a[class^="share-"]').forEach(shareButton => shareButton.addEventListener("click", ()=>{onProductShare(shareButton)}) ) // ok 2256 if (_selectorAll('[name$="checkout"]')) _selectorAll('[name$="checkout"]').forEach(checkoutButton => checkoutButton.addEventListener("click", onCheckoutInitiate)) 2257 2258 // For append elements 2259 const bodyMutationObserver = new MutationObserver(() => { 2260 if (_selector('#form__spc #PlaceOrder')) _selector('#form__spc #PlaceOrder').addEventListener("click", onSinglePageCheckout) // ok 2261 if (_selectorAll('[name$="checkout"]')) _selectorAll('[name$="checkout"]').forEach(checkoutButton => checkoutButton.addEventListener("click", onCheckoutInitiate)) 2262 }); 2263 bodyMutationObserver.observe(_selector("body"), {subtree: true, childList: true}); 2264 2265 //------------------------------// 2266 // Event handlers // 2267 //------------------------------// 2268 2269 function onPageView() { 2270 2271 EasyStore.Event.dispatch('pages/viewed', { 2272 page: { 2273 type: template, 2274 title: document.title, 2275 description: _selector('meta[name=description]') ? _selector('meta[name=description]').getAttribute('content') : null, 2276 url: location.href, 2277 } 2278 }) 2279 2280 } 2281 2282 function onSignUp() { 2283 2284 const email_regex = new RegExp(/^[a-zA-Z0-9.!#$%&"*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/) 2285 const phone_regex = new RegExp(/^(\+?6?01)[0-46-9]-*[0-9]{7,8}$/) 2286 2287 const email_or_phone = _selector(`input[name="customer[email_or_phone]"]`).value.replace("+", "").replace(/\s+/, "") 2288 2289 let data = {} 2290 2291 if (email_regex.test(email_or_phone)) { 2292 data.method = 'email' 2293 data.email = email_or_phone 2294 } 2295 2296 if (phone_regex.test(email_or_phone)) { 2297 data.method = "phone" 2298 data.phone = email_or_phone 2299 } 2300 2301 if (!data.method) return 2302 2303 EasyStore.Event.dispatch('customers/signup', data) 2304 2305 } 2306 2307 function onLogin() { 2308 2309 const email_regex = new RegExp(/^[a-zA-Z0-9.!#$%&"*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/) 2310 const phone_regex = new RegExp(/^(\+?6?01)[0-46-9]-*[0-9]{7,8}$/) 2311 2312 const email_or_phone = _selector(`input[name="customer[email_or_phone]"]`).value.replace("+", "").replace(/\s+/, "") 2313 2314 let data = {} 2315 2316 if (email_regex.test(email_or_phone)) { 2317 data.method = 'email' 2318 data.email = email_or_phone 2319 } 2320 2321 if (phone_regex.test(email_or_phone)) { 2322 data.method = "phone" 2323 data.phone = email_or_phone 2324 } 2325 2326 if (!data.method) return 2327 2328 EasyStore.Event.dispatch('customers/login', data) 2329 2330 } 2331 2332 function onLineLogin() { 2333 2334 EasyStore.Event.dispatch('customers/login', { method: 'line' }) 2335 2336 } 2337 2338 function onLogout() { 2339 2340 EasyStore.Event.dispatch('customers/logout', { customer_id }) 2341 2342 } 2343 2344 function onBlogView() { 2345 2346 const blog = {"id":449405,"handle":"news","url":"\/blogs\/news","title":"\u6700\u65b0\u6d88\u606f","description":"","articles_count":7,"all_tags":null,"comments_enabled":null,"moderated":null,"next_article":null,"previous_article":null,"tags":null,"updated_at":"2021-01-17T13:08:03.000+08:00","articles":[{"id":515505,"title":"\u3010BOOK & BREAD\u3011 ","handle":"-book-bread-\u70cf\u5149\u7269\u4f5c\u4f5c\u9676\u5c55","url":"\/blogs\/news\/-book-bread-\u70cf\u5149\u7269\u4f5c\u4f5c\u9676\u5c55","author":"HSUSHAOYI","description":"\u4e7e\u71e5\u6eab\u6696\u7684\u6b98\u6691\u4e2d\uff0c\u9eb5\u5305\u8207\u95b1\u8b80\u6210\u4e86\u6700\u597d\u7684\u966a\u4f34\uff0c \u7528\u4ed6\u5011\u63ee\u5225\u590f\u65e5\u7684\u71e5\u71b1\uff0c\u8fce\u4f86\u79cb\u65e5\u6eab\u548c\u5f90\u98a8\uff0c\u4e5f\u5145\u5be6\u9ad4\u5167\u5404\u7a2e\u80fd\u91cf\uff01","image_url":"https:\/\/cdn.store-assets.com\/s\/648936\/f\/9186184.jpg","image":{"src":"https:\/\/cdn.store-assets.com\/s\/648936\/f\/9186184.jpg"},"published_at":"2022-09-16T22:11:32.000+08:00","updated_at":"2023-10-06T23:24:39.000+08:00"},{"id":332403,"title":"\u5c0f\u666f2 \u2013 \u68ee\u68ee\u8896\u73cd\u5c0f\u7269\u806f\u5c55\uff082020-10-01 Written by HSUSHAOYI\uff09","handle":"\u5c0f\u666f2-\u68ee\u68ee\u8896\u73cd\u5c0f\u7269\u806f\u5c55-2020-10-01-written-by-hsushaoyi","url":"\/blogs\/news\/\u5c0f\u666f2-\u68ee\u68ee\u8896\u73cd\u5c0f\u7269\u806f\u5c55-2020-10-01-written-by-hsushaoyi","author":"HSUSHAOYI","description":"\u6c92\u60f3\u5230\u6703\u8fa6\u7b2c\u4e8c\u6b21\u7684\u5c0f\u666f\u5c55\u3002 \u5c0f\u666f \u610f\u601d\u662f\u6307 \u5c0f\u5c0f\u4e16\u754c\u4e2d\u751f\u6d3b\u7684\u666f\u8c61\uff0c\u7e7c\u4e0a\u6b21\u7684\u7d93\u9a57\uff0c\u9019\u6b21\u5404\u7a2e\u4f48\u7f6e\u8207\u64fa\u653e\u7684\u60f3\u6cd5\u5927\u5347\u7d1a\u3002\u7528\u76e1\u65b9\u6cd5\u8b93\u7a7a\u9593\u5373\u4f7f\u585e\u6eff\u4f5c\u54c1\u4e5f\u4e0d\u96dc\u4e82\uff0c\u5168\u81ea\u7136\u5149\u8b93\u4eba\u5fc3\u60c5\u6e05\u723d\uff0c\u6574\u9ad4\u6c1b\u570d\u5f88\u68d2\uff0c\u6211\u5011\u81ea\u5df1\u5f88\u6eff\u
2346610f\uff0c\u771f\u662f\u53ef\u559c\u53ef\u8cc0\u53ef\u559c\u53ef\u8cc0\u3002\uff08\u5404\u7a2e\u81ea\u5439\u81ea\u64c2\uff09 \u4eba\u751f\u53ef\u4ee5\u4e0d\u8cb7\u6f02\u4eae\u8863\u670d\uff0c\u4e0d\u5403\u7f8e\u5473\u5927\u9910\uff0c\u4f46\u4e0d\u53ef\u4ee5\u6c92\u6709\u73a9\u5177\u3002\u73a9\u5177\u5f88\u91cd\u8981\uff01 \u552f\u4e00\u7f8e\u4e2d\u4e0d\u8db3\u662f\u6211\u6c92\u601d\u8003\u597d\u552e\u51fa\u5f8c\u7684\u5b89\u6392\uff0c\u5c0e\u81f4\u6709\u89c0\u5c55\u8005\u5230\u73fe\u5834\uff0c\u537b\u6c92\u6709\u8fa6\u6cd5\u770b\u5230\u6240\u6709\u5c55\u54c1\u3002\uff08\u56e0\u70ba\u5df2\u540c\u6b65\u88ab\u5e36\u8d70\u6216\u5bc4\u51fa\uff09 \u6211\u60f3\u4e86\u5f88\u4e45\u8a72\u5982\u4f55\u5f4c\u88dc\uff0c\u7136\u5f8c\u770b\u898b\u6700\u8fd1\u56e0\u75ab\u60c5\uff0c\u7d1b\u7d1b\u6539\u4ee5\u7dda\u4e0a\u5c55\u5f62\u5f0f\u5c55\u89bd\u7684\u65e5\u672c\u4f5c\u5bb6\u5011\uff0c\u6216","image_url":"https:\/\/cdn.store-assets.com\/s\/648936\/f\/6008759.jpeg","image":{"src":"https:\/\/cdn.store-assets.com\/s\/648936\/f\/6008759.jpeg"},"published_at":"2021-01-17T13:40:39.000+08:00","updated_at":"2023-10-06T22:35:52.000+08:00"},{"id":332402,"title":"\u7cbc\u7cbc\uff0d\u68ee\u68ee\u751f\u6d3b\u5668\u7269\u806f\u5c55\uff082020-05-07 Written by HSUSHAOYI\uff09","handle":"\u7cbc\u7cbc-\u68ee\u68ee\u751f\u6d3b\u5668\u7269\u806f\u5c55-2020-05-07-written-by-hsushaoyi","url":"\/blogs\/news\/\u7cbc\u7cbc-\u68ee\u68ee\u751f\u6d3b\u5668\u7269\u806f\u5c55-2020-05-07-written-by-hsushaoyi","author":"HSUSHAOYI","description":"\u611f\u8b1d\u601d\u5fae\u85cf\u7269\u7684\u9080\u8acb\uff0c\u9019\u6b21\u4e5f\u662f\u8207\u68ee\u68ee\u5925\u4f34\u5011\u4e00\u8d77\u7684\u806f\u5c55\u3002 \u672c\u6b21\u6211\u4ee5\u590f\u65e5\u967d\u5149\u4e0b\u6c34\u5149\u6416\u66f3\uff0c\u6ce2\u5149\u7cbc\u7cbc\u4f5c\u70ba\u767c\u60f3\uff0c\u63d0\u51fa\u4e86\u6c34\u7554\u908a\u9ce5\u5152\u8207\u82b1\u8349\u7684\u60f3\u50cf\u3002\u6e56\u9762\u93e1\u5b50\u4e2d\uff0c\u8e29\u9032\u6c34\u88e1\u7684\u9ce5\u5152\u6700\u5927\u3001\u518d\u4f86\u662f\u8eab\u908a\u82b1\u6735\uff0c\u6700\u5c0f\u7684\u53cd\u800c\u662f\u539f\u672c\u9ad8\u8073\u7684\u6a39\u6728\u3002 \u6211\u7684\u5668\u7269\u81f3\u4eca\u591a\u4ee5\u8f46\u8f64\u6210\u5f62\u3002\u800c\u9019\u6b21\u5247\u6539\u7528\u5168\u624b\u634f\u7684\u65b9\u5f0f\u5448\u73fe\uff0c\u96d6\u7136\u8cea\u611f\u4e0d\u5982\u8f46\u8f64\u6210\u5f62\u6642\u7dda\u689d\u6e05\u6670\uff0c\u4f46\u66f4\u80fd\u8868\u73fe\u51fa\u88fd\u4f5c\u8005\u7684\u60c5\u7dd2\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u9019\u6b21\u5c55\u89bd\u4e2d\u63d0\u51fa\u4e00\u7cfb\u5217\u9152\u676f\u8a08\u756b\uff0c\u5e0c\u671b\u5728\u4ef2\u590f\u591c\u88e1\uff0c\u7528\u7cbc\u7cbc\u7684\u4f5c\u54c1\u559d\u676f\u5c0f\u9152\uff0c\u53ef\u4ee5\u611f\u53d7\u5230\u6709\u5982\u590f\u65e5\u5fae\u98a8\u5439\u62c2\u7684\u6dbc\u610f \u672c\u6b21\u56e0\u75ab\u60c5\u5f71\u97ff\uff0c\u539f\u5148\u6e96\u5099\u7684\u958b\u5e55\u9152\u6703\u8207\u6d3b\u52d5\u90fd\u7121\u6cd5\u8209\u884c\uff0c\u611f\u5230\u6709\u9ede\u53ef\u60dc","image_url":"https:\/\/cdn.store-assets.com\/s\/648936\/f\/6008743.jpeg","image":{"src":"https:\/\/cdn.store-assets.com\/s\/648936\/f\/6008743.jpeg"},"published_at":"2021-01-17T13:38:45.000+08:00","updated_at":"2023-10-06T22:35:52.000+08:00"},{"id":332398,"title":"2020 happy new year\uff082020-01-01 Written by HSUSHAOYI\uff09","handle":"2020-happy-new-year-2020-01-01-written-by-hsushaoyi","url":"\/blogs\/news\/2020-happy-new-year-2020-01-01-written-by-hsushaoyi","author":"HSUSHAOYI","description":"2020\u4e5f\u6703\u7e7c\u7e8c\u52aa\u529b. . \u2014\u2014\u2014\u2014\u2014\u2014. \u5275\u4f5c\u5c31\u50cf\u7167\u93e1\u5b50\uff0c\u6709\u4e9b\u4e0d\u6eff\u610f\u4e0d\u559c\u6b61\u7684\u90e8\u5206\u90fd\u6703\u5728\u4f5c\u54c1\u4e2d\u8dd1\u51fa\u4f86\uff0c\u6c38\u9060\u90fd\u770b\u5f97\u5230\u7f3a\u9ede\u3002 \u4f46\u6700\u7d42\uff0c\u63a5\u7d0d\u93e1\u5b50\u88e1\u7684\u81ea\u5df1\uff0c\u4e5f\u662f\u63a5\u7d0d\u4e0d\u6eff\u610f\u7684\u90e8\u5206\u3002\u7136\u5f8c\u7d93\u904e\u5167\u5316\u6607\u83ef\uff0c\u4f7f\u5176\u4e0d\u518d\u53ea\u80fd\u8eb2\u5728\u89d2\u843d\uff0c\u800c\u662f\u5802\u5802\u5728\u967d\u5149\u4e0b\u88ab\u773e\u4eba\u6ce8\u8996\u3002 \u96d6\u7136\u8d70\u5f97\u5f88\u6162\uff0c\u751a\u81f3\u662f\u9023\u6efe\u5e36\u722c\u7684\u63a2\u7d22\u3002\u4f46\u671f\u8a312020\u7684\u81ea\u5df1\u80fd\u5920\u7e7c\u7e8c\u6210\u9577\u9032\u6b65\uff0c\u6210\u70ba\u4e00\u500b\u512a\u79c0\u7684\u5275\u4f5c\u8005\u3002","image_url":"https:\/\/cdn.store-assets.com\/s\/648936\/f\/6008724.jpeg","image":{"src":"https:\/\/cdn.store-assets.com\/s\/648936\/f\/6008724.jpeg"},"published_at":"2021-01-17T13:37:06.000+08:00","updated_at":"2023-10-06T22:35:52.000+08:00"},{"id":332395,"title":"22 -\u305d\u308c\u305e\u308c\u306e\u8868\u73fe\uff082019-12-27 Written by HSUSHAOYI\uff09","handle":"22-\u305d\u308c\u305e\u308c\u306e\u8868\u73fe-2019-12-27-written-by-hsushaoyi","url":"\/blogs\/news\/22-\u305d\u308c\u305e\u308c\u306e\u8868\u73fe-2019-12-27-written-by-hsushaoyi","author":"HSUSHAOYI","description":"\u8a18\u5f97\u4eca\u5e74\u5e74\u521d\u4e09\u6708\u540c\u5a5a\u91cb\u61b2\u6642\uff0c\u6211\u5728IG\u4e0a\u63d0\u5230\u95dc\u65bc\u5f69\u8679\u8207\u9ce5\u7684\u8cbc\u6587\u3002\u90a3\u7bc7\u8cbc\u6587\u6210\u70ba\u5951\u6a5f\uff0c\u53cb\u4ebaA\u770b\u5230\u5f8c\u5c31\u79c1\u4e0b\u6572\u6211\u8aaa\uff1a\u300c\u6211\u6709\u500b\u8a08\u756b\uff0c\u4f60\u8981\u4e0d\u8981\u4e5f\u4f86\u53c3\u52a0\uff1f\u300d \u4e8b\u5be6\u4e0a\u53cb\u4ebaA\u6839\u672c\u4e0d\u4e86\u89e3\u53f0\u7063\u7684\u5a5a\u59fb\u5e73\u6b0a\u904b\u52d5\uff0c\u4e5f\u4e0d\u61c2\u70ba\u4ec0\u9ebc\u4ed6\u7684\u53f0\u7063\u670b\u53cb\u5011\u5404\u500b\u90fd\u597d\u6fc0\u52d5\u3002\u5979\u50c5\u53ea\u662f\u770b\u4e86\u6211\u8cbc\u6587\u4e2d\u7684\u5e7e\u500b\u95dc\u9375\u5b57\uff0c\u89ba\u5f97\u4e00\u5b9a\u662f\u547d\u904b\u7684\u5b89\u6392\uff08\uff1f\uff09\u4e0a\u5929\u7684\u65e8\u610f\uff08\uff1f\uff09\uff0c\u8b93\u9060\u5728\u53f0\u7063\u7684\u6211\u4e00\u5b9a\u8981\u53c3\u52a0\u3002 \u4f46\u9019\u500b\u8a08\u756b\u4e26\u4e0d\u662f\u9019\u6b21\u7684\u5c55\u89bd\u3002\u56e0\u70ba\u5404\u7a2e\u4e8b\u6545\uff0c\u53cb\u4ebaA\u7684\u8a08\u756b\u81f3\u4eca\u9084\u6c92\u6709\u4efb\u4f55\u9032\u5ea6\u3002\u5e0c\u671b\u4eca\u5e74\u80fd\u5920\u5be6\u73fe\u3002 \u65bc\u662f\u5728\u53cb\u4ebaA\u62db\u52df\u7684\u53c3\u5c55\u4eba\u4e2d\uff0c\u50ac\u751f\u4e86\u9019\u6b21\u65b
23460\u7684\u5c55\u89bd\u3002 \u4f5c\u54c1\u540d\u7a31\u70ba\u767b\u5c71\uff08\u5c71\u767b\u308a\uff09","image_url":"https:\/\/cdn.store-assets.com\/s\/648936\/f\/6008717.jpeg","image":{"src":"https:\/\/cdn.store-assets.com\/s\/648936\/f\/6008717.jpeg"},"published_at":"2021-01-17T13:35:15.000+08:00","updated_at":"2023-10-06T22:35:52.000+08:00"},{"id":332392,"title":"\u5c0f\u666f\u2014 \u68ee\u68ee\u8896\u73cd\u5c0f\u7269\u806f\u5c55 \uff082019-11-15 Written by HSUSHAOYI\uff09","handle":"\u5c0f\u666f-\u68ee\u68ee\u8896\u73cd\u5c0f\u7269\u806f\u5c55-2019-11-15-written-by-hsushaoyi","url":"\/blogs\/news\/\u5c0f\u666f-\u68ee\u68ee\u8896\u73cd\u5c0f\u7269\u806f\u5c55-2019-11-15-written-by-hsushaoyi","author":"HSUSHAOYI","description":"\u8207\u68ee\u68ee\u5c0f\u5925\u4f34\u5011\u7684\u806f\u5c55\uff0c\u5f9e\u6700\u4e00\u958b\u59cb\u7684\u73a9\u7b11\u8a71\u5230\u7a81\u7136\u8a8d\u771f\u627e\u5730\u9ede\uff0c\u518d\u5230\u8a2d\u8a08\u5c55\u89bd\u4f5c\u54c1\u8207\u62cd\u7167\u88fd\u4f5c\u660e\u4fe1\u7247\u3002\u5404\u7a2e\u7684\u73a9\u5f97\u5f88\u6109\u5feb\uff0c\u6211\u7684\u5925\u4f34\u5927\u5bb6\u679c\u7136\u90fd\u5f88\u68d2\uff01\u54c8\u54c8\uff01 \u672c\u6b21\u8896\u73cd\u5c55\u60f3\u8868\u73fe\u7684\uff0c\u662f\u6211\u5011\u6bcf\u500b\u4eba\u5fc3\u4e2d\u7684\u5c0f\u5b87\u5b99\u3002\u8207\u666e\u901a\u676f\u7897\u751f\u6d3b\u9676\u76f8\u6bd4\uff0c\u7e2e\u5c0f\u7684\u5c0f\u9676\u5076\u5011\u4f5c\u70ba\u7269\u4ef6\uff0c\u66f4\u80fd\u95e1\u8ff0\u90a3\u7a2e\u5167\u5fc3\u4e2d\uff0c\u6bcf\u500b\u4eba\u7368\u6709\u7684\u4e16\u754c\u89c0\u3002 \u6211\u7684\u90e8\u5206\u662f\u7a7f\u8457\u5404\u5f0f\u7761\u888d\u7684\u4eba\uff0c\u65c1\u908a\u7684\u52d5\u7269\u8207\u5c71\u3002\u8a2d\u5b9a\u4e0a\u662f\u6c99\u6f20\u5730\u5340\u7da0\u6d32\u57ce\u93ae\u7684\u8857\u982d\u5e02\u96c6\u3002\u5404\u5730\u805a\u96c6\u800c\u4f86\u7684\u6524\u8ca9\u5011\u642c\u904b\u5404\u7a2e\u5546\u54c1\uff0c\u5a66\u5973\u5011\u62ff\u8457\u5404\u5f0f\u6230\u5229\u54c1\uff0c\u65c1\u908a\u9084\u5076\u6709\u98db\u79bd\u8207\u8c93\u72d7\u9592\u6643\u3002\u5e0c\u671b\u8868\u73fe\u4e00\u7a2e\u5e02\u96c6\u7684\u60a0\u9592\u611f\u3002 \u4e5f\u56e0\u70ba\u662f\u7531\u5404\u5730\u805a\u96c6\u8d77\u4f86\u7684\u4eba\u5011\uff0c\u670d","image_url":"https:\/\/cdn.store-assets.com\/s\/648936\/f\/6008705.jpeg","image":{"src":"https:\/\/cdn.store-assets.com\/s\/648936\/f\/6008705.jpeg"}
2346,"published_at":"2021-01-17T13:32:28.000+08:00","updated_at":"2023-10-06T22:35:52.000+08:00"},{"id":332391,"title":"2019 Merry Xmas \uff082019-12-16 Written by HSUSHAOYI\uff09","handle":"2019-merry-xmas-2019-12-16-written-by-hsushaoyi","url":"\/blogs\/news\/2019-merry-xmas-2019-12-16-written-by-hsushaoyi","author":"HSUSHAOYI","description":"2019\u7684\u8056\u8a95\u65b0\u54c1\u5c31\u662f\u8c93\u982d\u9df9\u5011\u4e86\uff0c\u800c\u4e14\u9084\u8a2d\u8a08\u4e86\u5b63\u7bc0\u9650\u5b9a\u7684\u4e09\u89d2\u5c0f\u5e3d\u5e3d\u3002 \u9019\u6b21\u8056\u8a95\u6708\u5f9e12\u6708\u521d\u958b\u59cb\uff0c\u4e00\u8def\u53c3\u52a0\u7c21\u55ae\u751f\u6d3b\u7bc0\u5f8c\u53c8\u53c3\u52a0\u677e\u83f8\u597d\u597d\uff0c\u9084\u8dd1\u5230\u65b0\u7af9\u85cf\u7269\u3002\u800c\u4e14\u9019\u4e00\u5207\u7d50\u675f\u5f8c\uff0c\u6211\u904e\u5e7e\u5929\u9084\u8981\u62d6\u8457\u5c0f\u4f01\u9d5d\u5011\u885d\u53bb\u5927\u962a\u53c3\u52a0\u806f\u5c55\u3002\u7c21\u76f4\u662f\u7121\u6975\u9650\u8d85\u4eba\u884c\u7a0b\u3002\uff08\u54c8\u54c8\uff09 \u8aaa\u5230\u7c21\u55ae\u751f\u6d3b\u7bc0\u4eca\u5e74\u662f\u7b2c\u4e8c\u5e74\u53c3\u52a0\u4e86\uff0c\u5730\u9ede\u5f9e\u83ef\u5c71\u6539\u5230101\u5ee3\u5834\u8b93\u4eba\u883b\u4e0d\u7fd2\u6163\u7684\u3002\u53bb\u5e74\u8349\u5730\u4e0a\u5404\u7a2e\u559d\u5230\u653e\u98db\u81ea\u6211\u7684\u4eba\u4e5f\u5b8c\u5168\u770b\u4e0d\u898b\uff0c\u6bd4\u8d77\u4e0a\u6b21\u5927\u5bb6\u65e2\u7406\u6027\uff08\uff1f\uff09\u53c8\u51b7\u975c\u3002\u548c\u4e0a\u6b21\u76f8\u6bd4\u9019\u6b21\u7684\u5929\u6c23\u7c21\u76f4\u7cdf\u7cd5\u900f\u9802\uff0c\u982d\u5169\u5929\u78b0\u5230\u5404\u7a2e\u8b93\u4eba\u5d29\u6f70\u7684\u5927\u98a8\u5927\u96e8\uff0c\u5c0e\u81f4\u7d19\u888b\u6fd5\u4e86\u5305\u6750\u6fd5\u4e86\uff0c\u5c31\u9023\u88dd\u5728\u5927\u5851\u81a0\u888b\u88e1","image_url":"https:\/\/cdn.store-assets.com\/s\/648936\/f\/6008691.jpeg","image":{"src":"https:\/\/cdn.store-assets.com\/s\/648936\/f\/6008691.jpeg"},"published_at":"2021-01-17T13:28:17.000+08:00","updated_at":"2023-10-06T22:35:52.000+08:00"}]} 2347 2348 EasyStore.Event.dispatch('blogs/viewed', { blog }) 2349 2350 } 2351 2352 function onArticleView() { 2353 2354 const article = "" 2355 2356 EasyStore.Event.dispatch('articles/viewed', { article }) 2357 2358 } 2359 2360 function onProductSearch() { 2361 2362 const query = _selector('input[name=q]').value 2363 2364 if (!query) return 2365 2366 EasyStore.Event.dispatch('products/searched', { query }) 2367 2368 } 2369 2370 function onCollectionView() { 2371 2372 const collection = "" 2373 2374 EasyStore.Event.dispatch('collections/viewed', { collection }) 2375 2376 } 2377 2378 function onProductView() { 2379 2380 const product = "" 2381 2382 EasyStore.Event.dispatch("products/viewed", { product }) 2383 2384 } 2385 2386 function onProductShare(el) { 2387 2388 const product = "" 2389 2390 const channel = el.getAttribute("class").split("-").last() 2391 2392 EasyStore.Event.dispatch('products/shared', { product, channel }) 2393 2394 } 2395 2396 function onWishlistItemAdded() { 2397 2398 let product = "" 2399 const quantity = _selector("#Quantity").value 2400 2401 EasyStore.Event.dispatch('wishlists/item_added', { product }) 2402 2403 } 2404 2405 async function onCartItemsAdded() { 2406 2407 const cart = await getCart() 2408 2409 if(cart && cart.items != undefined && cart.items.length > 0) { 2410 2411 EasyStore.Event.dispatch('carts/item_added', { cart }) 2412 2413 } 2414 2415 } 2416 2417 async function onCartView() { 2418 2419 const cart = await getCart() 2420 2421 EasyStore.Event.dispatch('carts/viewed', { cart }) 2422 2423 } 2424 2425 async function onCartItemRemoved() { 2426 2427 const cart = await getCart() 2428 2429 cart.items = [] 2430 2431 if(cart) { 2432 2433 EasyStore.Event.dispatch('carts/item_removed', { cart }) 2434 2435 } 2436 2437 } 2438 2439 async function onCheckoutInitiate() { 2440 2441 const cart = await getCart() 2442 2443 EasyStore.Event.dispatch('checkouts/initiated', { cart }) 2444 2445 } 2446 2447 async function onShippingInfoAdded(form) { 2448 let checkout = getCheckout() 2449 2450 let form_data = {} 2451 new FormData(form).forEach((value, key) => form_data[key] = value) 2452 2453 let shipping_tier = null 2454 2455 if (form_data.type && form_data.type.startsWith("r_pickup")) { 2456 shipping_tier = `Pickup - ${form_data.pick_location}` 2457 } 2458 2459 if (form_data.s_id) {
2460 shipping_tier = _selector(`input[id='`+form_data.s_id+`']`).getAttribute("data-shipping-name") 2461 } 2462 2463 if (!shipping_tier) return 2464 2465 EasyStore.Event.dispatch('checkouts/shipping_info_added', { checkout, shipping_tier }) 2466 2467 } 2468 2469 async function onPaymentInfoAdded(form) { 2470 2471 let checkout = getCheckout() 2472 2473 let payment_type = new FormData(form).get('payment_method') 2474 2475 EasyStore.Event.dispatch("checkouts/payment_info_added", { checkout, payment_type }) 2476 2477 } 2478 2479 async function onOrderPlace() { 2480 2481 let cart_token = getCookie("cart_js") 2482 let previous_cart_token = getCookie("previous_cart_ga4_js") 2483 2484 if (previous_cart_token && previous_cart_token == cart_token) { 2485 // Prevent duplicate purchase tracking 2486 return 2487 } 2488 2489 let order = getOrder() 2490 2491 EasyStore.Event.dispatch('orders/placed', { order }) 2492 2493 if(order.is_manual_payment) { 2494 2495 EasyStore.Event.dispatch('orders/purchased', { order }) 2496 2497 } 2498 2499 const last_transaction = order.transactions.last() 2500 2501 if (last_transaction.status) { 2502 2503 EasyStore.Event.dispatch('orders/purchased', { order }) 2504 EasyStore.Event.dispatch('payments/captured', { order }) 2505 2506 } 2507 2508 } 2509 2510 async function onPaymentFail() { 2511 2512 const order = getOrder() 2513 2514 EasyStore.Event.dispatch('payments/failed', { order }) 2515 2516 } 2517 2518 async function onCheckoutComplete(form) { 2519 2520 onPaymentInfoAdded(form) 2521 2522 const checkout = getCheckout() 2523 2524 EasyStore.Event.dispatch('checkouts/completed', { checkout }) 2525 2526 } 2527 2528 async function onSinglePageCheckout() { 2529 2530 // let checkout = $("[data-app-checkout]").data("app-checkout") 2531 2532 let checkout = getCheckout() 2533 2534 // const payment_type = _selector("#app_spc_payment_method").find(`[class*="label-content"]`).first().find("b").first().text() 2535 const payment_type = _selector("#app_spc_payment_method").getElementsByClassName('label-content')[0].getElementsByTagName('b')[0].innerHTML 2536 2537 const shipping_method = _selector("#delivery_method").value 2538 2539 let shipping_tier = null 2540 let app_spc_customer_info_label = _selector("#app_spc_customer_info").getElementsByClassName('label-content') 2541 if (shipping_method == "shipping") { 2542 shipping_tier = app_spc_customer_info_label[app_spc_customer_info_label.length - 1].getElementsByTagName('b')[0].innerHTML 2543 } 2544 2545 if (shipping_method == "pickup") { 2546 shipping_tier = app_spc_customer_info_label[0].innerHTML 2547 } 2548 2549 if (shipping_tier) { 2550 2551 EasyStore.Event.dispatch('checkouts/shipping_info_added', { 2552 checkout, 2553 shipping_tier, 2554 }) 2555 2556 } 2557 2558 if (payment_type) { 2559 2560 EasyStore.Event.dispatch('checkouts/payment_info_added', { 2561 checkout, 2562 payment_type, 2563 }) 2564 2565 } 2566 2567 EasyStore.Event.dispatch('checkouts/completed', { checkout }) 2568 2569 } 2570 2571 }) 2572 2573 2574 //-----------------------// 2575 // Functions // 2576 //-----------------------// 2577 2578 function getCookie(name) { 2579 2580 name += "=" 2581 2582 decodedCookie = decodeURIComponent(document.cookie) 2583 2584 ca = decodedCookie.split(";") 2585 2586 for(i = 0; i < ca.length; i++) { 2587 c = ca[i] 2588 while (c.charAt(0) == " ") { 2589 c = c.substring(1) 2590 } 2591 if (c.indexOf(name) == 0) { 2592 return c.substring(name.length, c.length) 2593 } 2594 } 2595 2596 return "" 2597 2598 } 2599 2600 const parsePrice = price => { 2601 if(typeof price === 'string') { 2602 return parseFloat(price.split(',').join('')) 2603 } 2604 2605 return price 2606 } 2607 2608 const requestCart = async (method, data) => { 2609 2610 let response = await fetch('/cart.json', {method: 'GET',headers: {'Content-Type': 'application/json'}}) 2611 result = await response.json() 2612 2613 return result.cart 2614 2615 } 2616 const getCart = async (latest = false) => { 2617 2618 let cart = window.__latest_cart 2619 2620 const cart_invalid = !cart || !cart.items || (cart.total_price > 0 && !cart.items.length) 2621 2622 if(latest || cart_invalid) { 2623 cart = await requestCart() 2624 } 2625 2626 cart.items = cart.items || [] 2627 2628 return mapCart(cart) 2629 2630 } 2631 2632 const getCheckout = async () => { 2633 mapCheckout(window.__latest_cart || await requestCart()) 2634 } 2635 2636 const getOrder = async () => { 2637 mapOrder(window.__latest_cart || await requestCart()) 2638 } 2639 2640 //-----------------------// 2641 // Mappers // 2642 //-----------------------// 2643 2644 const fallbackAttribute = (object, attribute) => { 2645 2646 if(!Array.isArray(attribute)) { 2647 attribute = [attribute] 2648 } 2649 2650 let final_value = null 2651 2652 do { 2653 2654 final_value = object[attribute.shift()] 2655 2656 } while(!final_value && attribute.length) 2657 2658 return final_value 2659 2660 } 2661 2662 const map = (object, mapper) => { 2663 2664 const newObject = {} 2665 2666 for(const key in mapper) { 2667 2668 // Handle different keys between new and old format
2669 newObject[key] = fallbackAttribute(object, mapper[key]) 2670 2671 // Cast price to float 2672 if(newObject[key] && ['price', 'amount', 'discount', 'discounts'].some(x => key.endsWith(x))) { 2673 newObject[key] = parsePrice(newObject[key]) 2674 } 2675 2676 if(newObject[key] === undefined) { 2677 delete newObject[key] 2678 } 2679 2680 } 2681 2682 return newObject 2683 2684 } 2685 2686 const mapCart = cart => { 2687 2688 const oldCart = cart 2689 2690 const mapper = { 2691 id: 'id', 2692 currency: 'currency', 2693 item_count: 'item_count', 2694 items: 'items', 2695 total_price: 'total_price', 2696 latest_items: 'latest_items' 2697 } 2698 2699 cart = map(cart, mapper) 2700 2701 const discounts = (oldCart.storewide_discounts || []).concat((oldCart.voucher_discounts || [])) 2702 2703 cart.discount_applications = discounts.map(discount => ({ 2704 title: discount.voucher_code || null, 2705 value: parsePrice(discount.amount), 2706 })) 2707 2708 cart.original_total_price = cart.items.length 2709 ? cart.items 2710 .map(item => item.original_price) 2711 .reduce((sum, price) => sum + price) 2712 : 0 2713 2714 cart.total_discount = cart.discount_applications.length 2715 ? cart.discount_applications 2716 .map(discount => parsePrice(discount.value)) 2717 .reduce((sum, value) => sum + value) 2718 : 0 2719 2720 cart.items = cart.items.map(item => mapLineItem(item)) 2721 2722 return cart 2723 2724 } 2725 2726 const mapCheckout = checkout => { 2727 2728 const mapper = { 2729 note: 'note', 2730 attributes: 'note_attributes', 2731 billing_address: 'billing_address', 2732 currency: 'currency', 2733 customer_id: 'customer_id', 2734 discounts_amount: 'total_discount', 2735 id: 'id', 2736 line_items: 'order_item', 2737 order_number: 'order_number', 2738 shipping_address: 'shipping_address', 2739 shipping_price: 'shipping_tax', 2740 shipping_method: 'shipping_method_name', 2741 tax_price: 'total_tax', 2742 } 2743 2744 checkout = map(checkout, mapper) 2745 2746 checkout.requires_shipping = checkout.line_items.some(item => item.shipping_required) 2747 2748 checkout.line_items = checkout.line_items.map(item => mapLineItem(item)) 2749 2750 return checkout 2751 2752 } 2753 2754 const mapOrder = order => { 2755 2756 const mapper = { 2757 attributes: 'note_attributes', 2758 billing_address: 'billing_address', 2759 cancelled: 'is_cancelled', 2760 cancelled_at: 'cancelled_at', 2761 created_at: 'created_at', 2762 customer_id: 'customer_id', 2763 // discount_applications: 'discount_applications', 2764 email: 'email', 2765 financial_status: 'financial_status', 2766 fulfillment_status: 'fulfillment_status', 2767 line_items: 'order_item', 2768 note: 'note', 2769 order_number: 'order_number', 2770 phone: 'phone', 2771 shipping_address: 'shipping_address', 2772 shipping_methods: 'shipping_methods', 2773 shipping_price: 'total_shipping', 2774 subtotal_price: 'subtotal_price', 2775 // tax_lines: 'tax_lines', 2776 tax_price: 'total_tax', 2777 total_discounts: 'total_discount', 2778 total_net_amount: 'total_amount_include_transaction', 2779 total_price: 'total_price', 2780 transactions: 'transaction_records', 2781 is_manual_payment: 'is_manual_payment', 2782 } 2783 2784 order.email = order.billing_address.email 2785 order.phone = order.billing_address.phone 2786 order.shipping_method = order.shipping_method_name 2787 2788 order = map(order, mapper) 2789 2790 order.line_items = order.line_items.map(item => mapLineItem(item)) 2791 order.transactions = order.transactions.map(transaction => mapTransaction(transaction)) 2792 2793 return order 2794 2795 } 2796 2797 const mapLineItem = line_item => { 2798 2799 const old_line_item = line_item 2800 2801 const mapper = { 2802 final_price: 'price', 2803 image: 'img_url', 2804 message: 'message', 2805 original_line_price: 'original_line_price', 2806 original_price: 'original_price', 2807 properties: 'properties', 2808 quantity: 'quantity', 2809 requires_shipping: 'shipping_required', 2810 sku: 'sku', 2811 taxable: 'taxable', 2812 title: 'product_name', 2813 product_name: 'product_name', 2814 url: 'url', 2815 product_id: 'product_id', 2816 variant_id: 'variant_id', 2817 id: ['id', 'i_id'], 2818 } 2819 2820 line_item = map(line_item, mapper) 2821 2822 line_item.product_id = line_item.product_id || (old_line_item.product && old_line_item.product.id) || null 2823 line_item.variant_id = line_item.variant_id || (old_line_item.variant && old_line_item.variant.id) || null 2824 line_item.image = line_item.image || (old_line_item.image && old_line_item.image.url) || null 2825 2826 return line_item 2827 2828 } 2829 2830 const mapTransaction = transaction => { 2831 2832 const mapper = { 2833 amount: 'amount', 2834 created_at: 'created_at', 2835 gateway: 'gateway_type', 2836 id: 'id', 2837 status: 'status', 2838 } 2839 2840 transaction = map(transaction, mapper) 2841 2842 return transaction 2843 2844 } 2845 2846 2847</script>
2847 2848 2849</body> 2850</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.