PageSourceSearch

https://hsushaoyi.com/blogs/news

html hsushaoyi.com collected 2026-09-29 02:03:40 UTC 123,883 bytes, 2,850 lines download raw bytes

1<!doctype html>
2<!--[if lt IE 7]><html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]-->
3<!--[if IE 7]><html class="no-js lt-ie9 lt-ie8" lang="en"> <![endif]-->
4<!--[if IE 8]><html class="no-js lt-ie9" lang="en"> <![endif]-->
5<!--[if IE 9 ]><html class="ie9 no-js"> <![endif]-->
6<!--[if (gt IE 9)|!(IE)]><!--> <html class="no-js"> <!--<![endif]-->
7<head>
8
9  <!-- Basic page needs ================================================== -->
10  <meta charset="utf-8">
11  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
12
13  
14  <link rel="icon" href="https://cdn.store-assets.com/s/648936/f/9092034.png" />
15  
16
17  <!-- Title and description ================================================== -->
18  <title>
19  最新消息 &ndash; 烏光物作
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()">&times;</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                    &times;
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.