shoplazza-cli 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/.editorconfig +28 -0
  2. package/.prettierrc +9 -0
  3. package/LICENSE +21 -0
  4. package/README.md +208 -0
  5. package/bin/shoplazza +117 -0
  6. package/fixtures/assets/blog.scss +74 -0
  7. package/fixtures/assets/cart_modal.scss +450 -0
  8. package/fixtures/assets/collection_detail.js +234 -0
  9. package/fixtures/assets/collection_detail.scss +345 -0
  10. package/fixtures/assets/collection_list.scss +11 -0
  11. package/fixtures/assets/collection_slider.scss +169 -0
  12. package/fixtures/assets/feature_columns.scss +26 -0
  13. package/fixtures/assets/feature_product.scss +109 -0
  14. package/fixtures/assets/footer.js +58 -0
  15. package/fixtures/assets/footer.scss +337 -0
  16. package/fixtures/assets/four_images.scss +29 -0
  17. package/fixtures/assets/gallery.scss +55 -0
  18. package/fixtures/assets/header.js +178 -0
  19. package/fixtures/assets/header.scss +929 -0
  20. package/fixtures/assets/image_text.scss +72 -0
  21. package/fixtures/assets/logo_bar.scss +11 -0
  22. package/fixtures/assets/newsletter.scss +90 -0
  23. package/fixtures/assets/not_found.scss +39 -0
  24. package/fixtures/assets/page_detail.scss +16 -0
  25. package/fixtures/assets/pagination.scss +150 -0
  26. package/fixtures/assets/postcss.config.js +6 -0
  27. package/fixtures/assets/product_description.scss +88 -0
  28. package/fixtures/assets/product_detail.js +634 -0
  29. package/fixtures/assets/product_detail.scss +1106 -0
  30. package/fixtures/assets/relative_product.scss +45 -0
  31. package/fixtures/assets/reviews.scss +70 -0
  32. package/fixtures/assets/rich_text.scss +71 -0
  33. package/fixtures/assets/search.js +87 -0
  34. package/fixtures/assets/search.scss +67 -0
  35. package/fixtures/assets/slide.scss +51 -0
  36. package/fixtures/assets/slider.scss +141 -0
  37. package/fixtures/assets/theme.css +976 -0
  38. package/fixtures/assets/theme.scss +1100 -0
  39. package/fixtures/assets/three_images.scss +20 -0
  40. package/fixtures/assets/tools.scss +23 -0
  41. package/fixtures/assets/two_images.scss +24 -0
  42. package/fixtures/assets/video.scss +45 -0
  43. package/fixtures/assets/video_text.scss +63 -0
  44. package/fixtures/config/settings_data.json +107 -0
  45. package/fixtures/config/settings_schema.json +690 -0
  46. package/fixtures/layout/theme.liquid +76 -0
  47. package/fixtures/locales/ar-SA.json +212 -0
  48. package/fixtures/locales/de-DE.json +290 -0
  49. package/fixtures/locales/en-US.json +290 -0
  50. package/fixtures/locales/es-ES.json +290 -0
  51. package/fixtures/locales/fr-FR.json +290 -0
  52. package/fixtures/locales/id-ID.json +212 -0
  53. package/fixtures/locales/it-IT.json +212 -0
  54. package/fixtures/locales/ja-JP.json +289 -0
  55. package/fixtures/locales/ko-KR.json +290 -0
  56. package/fixtures/locales/nl-NL.json +290 -0
  57. package/fixtures/locales/pl-PL.json +290 -0
  58. package/fixtures/locales/pt-PT.json +212 -0
  59. package/fixtures/locales/ru-RU.json +212 -0
  60. package/fixtures/locales/th-TH.json +212 -0
  61. package/fixtures/locales/zh-CN.json +290 -0
  62. package/fixtures/locales/zh-TW.json +290 -0
  63. package/fixtures/sections/apps.liquid +47 -0
  64. package/fixtures/sections/blog.liquid +137 -0
  65. package/fixtures/sections/collection_desc.liquid +34 -0
  66. package/fixtures/sections/collection_detail.liquid +436 -0
  67. package/fixtures/sections/collection_image.liquid +104 -0
  68. package/fixtures/sections/collection_list.liquid +161 -0
  69. package/fixtures/sections/collection_name.liquid +34 -0
  70. package/fixtures/sections/collection_slider.liquid +330 -0
  71. package/fixtures/sections/feature_columns.liquid +275 -0
  72. package/fixtures/sections/feature_product.liquid +227 -0
  73. package/fixtures/sections/footer.liquid +488 -0
  74. package/fixtures/sections/four_images.liquid +160 -0
  75. package/fixtures/sections/gallery.liquid +258 -0
  76. package/fixtures/sections/header.liquid +1157 -0
  77. package/fixtures/sections/html.liquid +40 -0
  78. package/fixtures/sections/image_text.liquid +350 -0
  79. package/fixtures/sections/instagram_plus.liquid +393 -0
  80. package/fixtures/sections/logo_bar.liquid +183 -0
  81. package/fixtures/sections/newsletter.liquid +225 -0
  82. package/fixtures/sections/not_found.liquid +39 -0
  83. package/fixtures/sections/overlay_image.liquid +648 -0
  84. package/fixtures/sections/page_detail.liquid +39 -0
  85. package/fixtures/sections/photo_collection.liquid +433 -0
  86. package/fixtures/sections/product_description.liquid +208 -0
  87. package/fixtures/sections/product_detail.liquid +611 -0
  88. package/fixtures/sections/products.liquid +216 -0
  89. package/fixtures/sections/relative_product.liquid +121 -0
  90. package/fixtures/sections/reviews.liquid +115 -0
  91. package/fixtures/sections/rich_text.liquid +157 -0
  92. package/fixtures/sections/search.liquid +163 -0
  93. package/fixtures/sections/slide.liquid +719 -0
  94. package/fixtures/sections/three_images.liquid +157 -0
  95. package/fixtures/sections/two_images.liquid +125 -0
  96. package/fixtures/sections/video.liquid +95 -0
  97. package/fixtures/sections/video_text.liquid +128 -0
  98. package/fixtures/snippets/bgset.liquid +21 -0
  99. package/fixtures/snippets/card_title.liquid +8 -0
  100. package/fixtures/snippets/cart_modal.liquid +74 -0
  101. package/fixtures/snippets/collection.liquid +77 -0
  102. package/fixtures/snippets/collection_filter_modal.liquid +56 -0
  103. package/fixtures/snippets/default_image_4.liquid +14 -0
  104. package/fixtures/snippets/default_image_6.liquid +18 -0
  105. package/fixtures/snippets/default_image_8.liquid +23 -0
  106. package/fixtures/snippets/four_images_item.liquid +8 -0
  107. package/fixtures/snippets/header_ads.liquid +95 -0
  108. package/fixtures/snippets/hero_image.liquid +94 -0
  109. package/fixtures/snippets/icon_video_play_large.liquid +1 -0
  110. package/fixtures/snippets/icon_video_play_medium.liquid +4 -0
  111. package/fixtures/snippets/icon_video_play_small.liquid +4 -0
  112. package/fixtures/snippets/lazyimg.liquid +22 -0
  113. package/fixtures/snippets/lazyimg_art.liquid +36 -0
  114. package/fixtures/snippets/lazysizes.liquid +41 -0
  115. package/fixtures/snippets/link.liquid +2 -0
  116. package/fixtures/snippets/pagination.liquid +48 -0
  117. package/fixtures/snippets/product.liquid +126 -0
  118. package/fixtures/snippets/product_art_tpl.liquid +152 -0
  119. package/fixtures/snippets/product_info_body.liquid +337 -0
  120. package/fixtures/snippets/product_info_tpl.liquid +423 -0
  121. package/fixtures/snippets/product_label.liquid +46 -0
  122. package/fixtures/snippets/settings.liquid +295 -0
  123. package/fixtures/snippets/social-meta-tags.liquid +106 -0
  124. package/fixtures/snippets/video_html.liquid +11 -0
  125. package/fixtures/snippets/video_source.liquid +98 -0
  126. package/fixtures/snippets/video_thumb_icon.liquid +2 -0
  127. package/fixtures/templates/404.liquid +1 -0
  128. package/fixtures/templates/collection.liquid +92 -0
  129. package/fixtures/templates/index.liquid +206 -0
  130. package/fixtures/templates/page.liquid +1 -0
  131. package/fixtures/templates/product.liquid +99 -0
  132. package/fixtures/templates/search.liquid +1 -0
  133. package/jest.config.js +192 -0
  134. package/lib/__tests__/log.test.js +15 -0
  135. package/lib/__tests__/utils.test.js +69 -0
  136. package/lib/auth/__mocks__/getCode.js +7 -0
  137. package/lib/auth/__mocks__/index.js +0 -0
  138. package/lib/auth/child.js +23 -0
  139. package/lib/auth/getCode.js +35 -0
  140. package/lib/auth/index.js +91 -0
  141. package/lib/commands/__tests__/login.test.js +77 -0
  142. package/lib/commands/__tests__/logout.test.js +29 -0
  143. package/lib/commands/__tests__/store.test.js +44 -0
  144. package/lib/commands/__tests__/switch.test.js +45 -0
  145. package/lib/commands/login.js +99 -0
  146. package/lib/commands/logout.js +14 -0
  147. package/lib/commands/store.js +14 -0
  148. package/lib/commands/switch.js +52 -0
  149. package/lib/commands/theme/__tests__/delete.test.js +49 -0
  150. package/lib/commands/theme/__tests__/init.test.js +21 -0
  151. package/lib/commands/theme/__tests__/list.test.js +80 -0
  152. package/lib/commands/theme/__tests__/package.test.js +17 -0
  153. package/lib/commands/theme/__tests__/publish.test.js +61 -0
  154. package/lib/commands/theme/__tests__/pull.test.js +69 -0
  155. package/lib/commands/theme/__tests__/push.test.js +63 -0
  156. package/lib/commands/theme/__tests__/serve.test.js +107 -0
  157. package/lib/commands/theme/delete.js +64 -0
  158. package/lib/commands/theme/init.js +51 -0
  159. package/lib/commands/theme/list.js +28 -0
  160. package/lib/commands/theme/package.js +37 -0
  161. package/lib/commands/theme/publish.js +56 -0
  162. package/lib/commands/theme/pull.js +62 -0
  163. package/lib/commands/theme/push.js +106 -0
  164. package/lib/commands/theme/serve.js +153 -0
  165. package/lib/commands/theme/share.js +20 -0
  166. package/lib/commands/version.js +6 -0
  167. package/lib/config.js +5 -0
  168. package/lib/db/__mocks__/index.js +9 -0
  169. package/lib/db/__tests__/analytics.test.js +19 -0
  170. package/lib/db/__tests__/user.test.js +20 -0
  171. package/lib/db/analytics.js +48 -0
  172. package/lib/db/index.js +9 -0
  173. package/lib/db/user.js +68 -0
  174. package/lib/log.js +13 -0
  175. package/lib/openAPI/__mocks__/index.js +20 -0
  176. package/lib/openAPI/api.js +76 -0
  177. package/lib/openAPI/index.js +46 -0
  178. package/lib/report.js +37 -0
  179. package/lib/tracing.js +50 -0
  180. package/lib/utils.js +48 -0
  181. package/package.json +54 -0
@@ -0,0 +1,295 @@
1
+ {% assign titleFont = settings.skin_title_font_family %}
2
+ {% assign textFont = settings.skin_text_font_family %}
3
+ {% assign btnFont = settings.skin_btn_font_family %}
4
+ {% assign productHeaderFont = settings.skin_product_header_font_family %}
5
+
6
+ {% capture titleFontDesc %}
7
+ font-family: {{titleFont.family}},{{titleFont.fallback_families}} !important;
8
+ font-style:{{titleFont.style}} !important;
9
+ font-weight:{{titleFont.weight}} !important;
10
+ {% endcapture %}
11
+
12
+ {% capture textFontDesc %}
13
+ font-family: {{textFont.family}},{{textFont.fallback_families}} !important;
14
+ font-style:{{textFont.style}} !important;
15
+ font-weight:{{textFont.weight}} !important;
16
+ {% endcapture %}
17
+
18
+ {% capture btnFontDesc %}
19
+ font-family: {{btnFont.family}},{{btnFont.fallback_families}} !important;
20
+ font-style:{{btnFont.style}} !important;
21
+ font-weight:{{btnFont.weight}} !important;
22
+ {% endcapture %}
23
+
24
+ {% capture productHeaderFontDesc %}
25
+ font-family: {{productHeaderFont.family}},{{productHeaderFont.fallback_families}} !important;
26
+ font-style:{{productHeaderFont.style}} !important;
27
+ font-weight:{{productHeaderFont.weight}} !important;
28
+ {% endcapture %}
29
+ <style type="text/css">
30
+ :root {
31
+ --skin_primary_btn_bg_color: {{settings.skin_primary_btn_bg_color}};
32
+ --skin_primary_btn_text_color: {{settings.skin_primary_btn_text_color}};
33
+ --skin_bg: {{settings.skin_bg}};
34
+ }
35
+
36
+ @media (min-width: 768px){
37
+ {% assign general_layout_width = settings.general_layout_width | default: 1080 %}
38
+ {% assign general_layout_spacing = settings.general_layout_spacing | default: 40 %}
39
+ .container{
40
+ max-width: {{general_layout_spacing | times: 2 | plus : general_layout_width}}px !important;
41
+ padding-right: {{general_layout_spacing | plus : 15}}px !important;
42
+ padding-left: {{general_layout_spacing | plus : 15}}px !important;
43
+ }
44
+ .tw-container{
45
+ max-width: {{general_layout_spacing | times: 2 | plus : general_layout_width}}px !important;
46
+ padding-right: {{general_layout_spacing | plus : 15}}px !important;
47
+ padding-left: {{general_layout_spacing | plus : 15}}px !important;
48
+ margin: 0 auto;
49
+ }
50
+ }
51
+
52
+ .tw-container{
53
+ width: 100%;
54
+ padding-right: 15px;
55
+ padding-left: 15px;
56
+ margin-right: auto;
57
+ margin-left: auto;
58
+ }
59
+
60
+ /* 字体 */
61
+ {% assign titleFont = settings.skin_title_font_family %}
62
+ {% assign textFont = settings.skin_text_font_family %}
63
+ {% assign btnFont = settings.skin_btn_font_family %}
64
+ {% assign productHeaderFont = settings.skin_product_header_font_family %}
65
+ {% capture fonts %}{{ titleFont.font_face }}|{{ textFont.font_face }}|{{ btnFont.font_face }}|{{ productHeaderFont.font_face }}{% endcapture %}
66
+ {% assign arr = fonts | split:"|" | uniq %}
67
+ {% for f in arr %}{{ f }}{% endfor %}
68
+
69
+ /* 页面背景 */
70
+ .dj_skin_bg {
71
+ background-color: {{settings.skin_bg}} !important;
72
+ }
73
+ /* 全局标题 */
74
+ .dj_skin_title {
75
+ color: {{settings.skin_title_color}} !important;
76
+ font-size: {{settings.skin_title_font_size}}px !important;
77
+ {{titleFontDesc}}
78
+ }
79
+
80
+ /* 全局标题 --- 不包含font-size */
81
+ .dj_skin_title_font {
82
+ color: {{settings.skin_title_color}} !important;
83
+ {{titleFontDesc}}
84
+ }
85
+
86
+ .dj_skin_title_font_family {
87
+ {{titleFontDesc}}
88
+ }
89
+
90
+ /* 全局文本 */
91
+ .dj_skin_text {
92
+ color: {{settings.skin_text_color}} !important;
93
+ }
94
+
95
+ .dj_skin_body {
96
+ -webkit-font-smoothing: antialiased;
97
+ {{textFontDesc}}
98
+ }
99
+
100
+ /* 全局文本字体 */
101
+ .dj_skin_text_font_family {
102
+ {{textFontDesc}}
103
+ }
104
+
105
+ /*----------------------------*/
106
+
107
+ /* 商品标题 */
108
+ .dj_skin_product_title {
109
+ color: {{settings.skin_title_color}} !important;
110
+ {{titleFontDesc}};
111
+ }
112
+
113
+ /* 商品列表标题 */
114
+ .dj_skin_product_list_title{
115
+ color: {{settings.skin_text_color}} !important;
116
+ font-size: {{settings.skin_product_header_font_size}}px !important;
117
+ {{productHeaderFontDesc}};
118
+ }
119
+
120
+ /* 商品标题字体 */
121
+ .dj_skin_product_title_font_family{
122
+ {{productHeaderFontDesc}}
123
+ }
124
+
125
+ /* 商品副标题 */
126
+ .dj_skin_product_brief_title {
127
+ {{textFontDesc}}
128
+ }
129
+
130
+ /* 商品现价 */
131
+ .dj_skin_product_price {
132
+ color: {{settings.skin_price_color}} !important;
133
+ font-size: {{settings.skin_price_font_size}}px !important;
134
+ {{textFontDesc}}
135
+ }
136
+
137
+ /* 商品详情现价--不需要限制字体 */
138
+ .dj_skin_product_detail_price {
139
+ color: {{settings.skin_price_color}} !important;
140
+ {{textFontDesc}}
141
+ }
142
+
143
+ /* 商品原价 */
144
+ .dj_skin_product_compare_at_price {
145
+ color: {{settings.skin_compare_at_price_color}} !important;
146
+ font-size: {{settings.skin_compare_at_price_font_size}}px !important;
147
+ {{textFontDesc}}
148
+ }
149
+
150
+ /* 商品详情原价--不需要限制字体 */
151
+ .dj_skin_product_detail_compare_at_price {
152
+ color: {{settings.skin_compare_at_price_color}} !important;
153
+ {{textFontDesc}}
154
+ }
155
+
156
+ /* 商品数目和排序 */
157
+ .dj_skin_product_text {
158
+ color: {{settings.skin_text_color}} !important;
159
+ {{textFontDesc}}
160
+ }
161
+
162
+ /* 商品详情款式选择框 */
163
+ .dj_skin_product_variants_selected {
164
+ color: {{settings.skin_primary_btn_bg_color}} !important;
165
+ }
166
+
167
+ .dj_skin_product_variants_selected:hover {
168
+ color: {{settings.skin_primary_btn_bg_color}} !important;
169
+ }
170
+
171
+ .dj_skin_product_variants_selected::before,.dj_skin_product_variants_selected label::before {
172
+ border: 2px solid {{settings.skin_primary_btn_bg_color}} !important;
173
+ }
174
+
175
+ {% assign label_color = settings.label_color | default: '#FFFFFF' %}
176
+ {% assign label_background_color = settings.label_background_color | default: '#9B3C44' %}
177
+ .product-info__label {
178
+ color: {{label_color}};
179
+ background: {{label_background_color}};
180
+ }
181
+ .product-info__label-triangle {
182
+ box-shadow: 0px -100px 0px 100px {{label_background_color}};
183
+ }
184
+ /* 优惠折扣标签同时存在 */
185
+ {% if settings.is_discount_show and settings.product_save_amount %}
186
+ .product-info__discount-label{
187
+ font-size: 12px;
188
+ }
189
+ .product-info__save-label{
190
+ font-weight: 300;
191
+ }
192
+ .product-info__label-triangle{
193
+ max-width: 90px;
194
+ }
195
+ @media (max-width: 576px){
196
+ .product-info__discount-label, .product-info__label-badge .money{
197
+ font-size: 10px;
198
+ }
199
+ .product-info__save-label{
200
+ font-size: 12px;
201
+ }
202
+ }
203
+ {% endif %}
204
+
205
+ {% unless settings.is_discount_show %}.product-info__header_tag{display:none!important;}{% endunless %}
206
+ {% unless settings.skin_price_color %}.dj_skin_product_detail_price{display:none!important;}{% endunless %}
207
+ {% unless settings.is_compare_at_price_show %}.dj_skin_product_compare_at_price{display:none!important;}{% endunless %}
208
+ {% unless settings.is_sales_show %}.product__select_modal .product-info__header_sales {display:none!important;}{% endunless %}
209
+ {% unless settings.is_stock_show %}.product-info__qty_stock {display:none!important;}{% endunless %}
210
+ {% unless settings.is_brief_show %}.product-info__header_brief {display:none!important;}{% endunless %}
211
+ {% unless settings.is_quantity_box_show %}.product-info__qty_container {display:none!important;}{% endunless %}
212
+ {% unless settings.vendor_enable %}.product-info__vendor {display:none!important;}{% endunless %}
213
+
214
+ /*----------------------------*/
215
+ /* 页尾 */
216
+ .dj_skin_footer_title{
217
+ {{titleFontDesc}}
218
+ }
219
+ /*----------------------------*/
220
+ .btn {
221
+ {{btnFontDesc}}
222
+ }
223
+
224
+ /* 主要按钮 */
225
+ .btn-primary {
226
+ position: relative !important;
227
+ border-color: {{settings.skin_primary_btn_border_color}} !important;
228
+ background: {{settings.skin_primary_btn_bg_color}} !important;
229
+ color: {{settings.skin_primary_btn_text_color}} !important;
230
+ }
231
+ .btn-primary:hover {
232
+ color: {{settings.skin_primary_btn_text_color}} !important;
233
+ border-color: {{settings.skin_primary_btn_border_color}} !important;
234
+ background: {{settings.skin_primary_btn_bg_color}} !important;
235
+ opacity: .9 !important;
236
+ }
237
+ .btn-primary:active,.btn-primary:focus {
238
+ color: {{settings.skin_primary_btn_text_color}} !important;
239
+ border-color: {{settings.skin_primary_btn_border_color}} !important;
240
+ background: {{settings.skin_primary_btn_bg_color}} !important;
241
+ opacity: .9 !important;
242
+ }
243
+ .btn-primary:disabled,.btn-primary.disabled {
244
+ color: #f9f9f9 !important;
245
+ background: #d6d6d6 !important;
246
+ border: 1px solid #d6d6d6 !important;
247
+ }
248
+
249
+ /* 次级按钮 */
250
+ .btn-secondary {
251
+ position: relative !important;
252
+ background: {{settings.skin_secondary_btn_bg_color}} !important;
253
+ color: {{settings.skin_secondary_btn_text_color}} !important;
254
+ border: 1px solid {{settings.skin_secondary_btn_text_color}} !important;
255
+ }
256
+ .btn-secondary:hover {
257
+ color: {{settings.skin_secondary_btn_text_color}} !important;
258
+ border: 1px solid {{settings.skin_secondary_btn_text_color}} !important;
259
+ background: {{settings.skin_secondary_btn_bg_color}} !important;
260
+ opacity: .9 !important;
261
+ }
262
+ .btn-secondary:active,.btn-secondary:focus {
263
+ color: {{settings.skin_secondary_btn_text_color}} !important;
264
+ border: 1px solid {{settings.skin_secondary_btn_text_color}} !important;
265
+ background: {{settings.skin_secondary_btn_bg_color}} !important;
266
+ opacity: .9 !important;
267
+ }
268
+ .btn-secondary:disabled,.btn-secondary.disabled {
269
+ background: #f9f9f9 !important;
270
+ color: #d6d6d6 !important;
271
+ border-color: #d6d6d6 !important;
272
+ }
273
+
274
+ {% comment %} 列表色卡 {% endcomment %}
275
+ .color-swatch {
276
+ position: relative;
277
+ display: inline-block;
278
+ text-indent: -9999px;
279
+ overflow-y: hidden;
280
+ width: 14px;
281
+ height: 14px;
282
+ background-position: center;
283
+ background-size: cover;
284
+ background-repeat: no-repeat;
285
+ margin: 0 2px 2px 0;
286
+ border-radius: 50%;
287
+ border: 1px solid {{ settings.skin_primary_btn_border_color | default: '#212121' }};
288
+ }
289
+ @media (min-width: 768px){
290
+ .color-swatch {
291
+ width: 17px;
292
+ height: 17px;
293
+ }
294
+ }
295
+ </style>
@@ -0,0 +1,106 @@
1
+ {% assign template_base = template.name | split: '.' | first %}
2
+ {% assign og_title = shop.name %}
3
+ {% assign og_url = canonical_url | default: shop.url %}
4
+ {% assign og_type = 'website' %}
5
+ {% assign og_description = page_description | default: shop.description | default: shop.name %}
6
+
7
+ {% assign page_image = images[settings.homepage_social_image] %}
8
+
9
+ {% if template_base == 'product' %}
10
+ {% assign og_title = product.title | strip_html %}
11
+ {% assign og_type = 'product' %}
12
+ {% assign og_description = product.meta_description | newline_to_br | replace: "<br />", " " | default: shop.name %}
13
+ {% if og_description == " " %}
14
+ {% assign og_description = shop.name %}
15
+ {% endif %}
16
+ {% if product.image %}
17
+ {% assign page_image = product.image %}
18
+ {% endif %}
19
+ {% elsif template_base == 'article' %}
20
+ {% assign og_title = article.title | strip_html %}
21
+ {% assign og_type = 'article' %}
22
+ {% assign og_description = article.excerpt_or_content | strip_html %}
23
+ {% if article.image %}
24
+ {% assign page_image = article.image %}
25
+ {% endif %}
26
+ {% elsif template_base == 'collection' %}
27
+ {% if collection.image.src != blank %}
28
+ {% assign page_image = collection.image %}
29
+ {% else %}
30
+ {% paginate collection.products by 1 %}
31
+ {% assign collection_product0 = collection.products[0] %}
32
+ {% endpaginate %}
33
+ {% if collection_product0 %}
34
+ {% assign page_image = collection_product0.image %}
35
+ {% endif %}
36
+ {% endif %}
37
+ {% endif %}
38
+
39
+ <meta property="og:site_name" content="{{ shop.name }}">
40
+ <meta property="og:url" content="{{ og_url }}">
41
+ <meta property="og:title" content="{{ og_title }}">
42
+ <meta property="og:type" content="{{ og_type }}">
43
+ <meta property="og:description" content="{{ og_description | strip_html | escape }}">
44
+ {% if template_base == 'product' %}
45
+ {% unless product.published %}
46
+ {% assign availability = 'discontinued' %}
47
+ {% else %}
48
+ {% if product.available %}
49
+ {% assign availability = 'in stock' %}
50
+ {% else %}
51
+ {% assign availability = 'out of stock' %}
52
+ {% endif %}
53
+ {% endunless %}
54
+ {% assign selectedVariantId = "" %}
55
+ {% assign selectedVariant = nil %}
56
+ {% if product.variants.size == 1 %}
57
+ {% for variant in product.variants %}
58
+ {% if variant.available_quantity > 0 %}
59
+ {% assign selectedVariantId = variant.id %}
60
+ {% break %}
61
+ {% endif %}
62
+ {% endfor %}
63
+ {% endif %}
64
+
65
+ {% assign params = REQUEST_URI | split: "?" | last | split: "&" %}
66
+ {% for p in params %}
67
+ {% assign pair = p | split: "=" %}
68
+ {% if pair[0] contains "variant" and pair[1] != '' %}
69
+ {% assign selectedVariantId = pair[1] %}
70
+ {% endif %}
71
+ {% endfor %}
72
+
73
+ {% for variant in product.variants %}
74
+ {% if variant.id == selectedVariantId %}
75
+ {% assign selectedVariant = variant %}
76
+ {% endif %}
77
+ {% endfor %}
78
+
79
+ {% if selectedVariant %}
80
+ {% if selectedVariant.available %}
81
+ {% assign availability = 'in stock' %}
82
+ {% else %}
83
+ {% assign availability = 'out of stock' %}
84
+ {% endif %}
85
+ {% endif %}
86
+ <meta property="product:price:amount" content="{% if selectedVariant %}{{ selectedVariant.price }}{% else %}{{ product.price }}{% endif %}">
87
+ <meta property="product:price:currency" content="{{shop.currency_code}}">
88
+ <meta property="product:condition" content="new">
89
+ <meta property="product:availability" content="{{ availability }}">
90
+ <meta property="product:retailer_item_id" content="{% if selectedVariant %}{{ selectedVariant.id }}{% else %}{{ product.id }}{% endif %}">
91
+ {% comment %} 预加载商品选中的第一张图片 {% endcomment %}
92
+ <link rel="preload" as="image" href="{% if selectedVariant and selectedVariant.image.src %}{{ selectedVariant.image.src | img_url: '1080x' }}{% else %}{{ product.image.src | img_url: '1080x' }}{% endif %}">
93
+ {% endif %}
94
+
95
+ {% if page_image.src %}
96
+ <meta property="og:image" content="http:{{ page_image | img_url }}">
97
+ <meta property="og:image:secure_url" content="https:{{ page_image | img_url }}">
98
+ <meta property="og:image:width" content="{{ page_image.width }}">
99
+ <meta property="og:image:height" content="{{ page_image.height }}">
100
+ <meta property="og:image:alt" content="{{ page_image.alt }}">
101
+ {% endif %}
102
+
103
+ <meta name="twitter:site" content="{{ settings.twitter_url | split: 'twitter.com/' | last | prepend: '@' }}">
104
+ <meta name="twitter:card" content="summary_large_image">
105
+ <meta name="twitter:title" content="{{ og_title }}">
106
+ <meta name="twitter:description" content="{{ og_description | strip_html | escape }}">
@@ -0,0 +1,11 @@
1
+ <div style="padding-bottom: {{ padding_bottom }};" class="video_play_controls {{class}}">
2
+ <video x5-playsinline="true" playsinline="true" webkit-playsinline="true" poster="{{media.preview_image}}">
3
+ {% if media.hls %}
4
+ <source src="{{media.hls}}" type="application/x-mpegURL">
5
+ {% endif %}
6
+ {% if media.mp4 %}
7
+ <source src="{{media.mp4}}" type="video/mp4">
8
+ {% endif %}
9
+ </video>
10
+ <div class="video_pause_icon">{% include 'icon_video_play_large' %}</div>
11
+ </div>
@@ -0,0 +1,98 @@
1
+ <style>
2
+ .video_play_controls {
3
+ position: relative;
4
+ }
5
+ .video_play_controls > video {
6
+ position: absolute;
7
+ top: 0px;
8
+ right: 0px;
9
+ bottom: 0px;
10
+ left: 0px;
11
+ margin: auto;
12
+ width: 100%;
13
+ height: 100%;
14
+ object-fit: contain;
15
+ cursor: pointer;
16
+ }
17
+ .video_play_controls::after {
18
+ content: '';
19
+ position: absolute;
20
+ left: 0;
21
+ top: 0;
22
+ width: 100%;
23
+ height: 100%;
24
+ }
25
+ .video_play_controls > .video_pause_icon {
26
+ display: none;
27
+ position: absolute;
28
+ top: 50%;
29
+ left: 50%;
30
+ transform: translate(-50%, -50%);
31
+ }
32
+ .video_play_controls > .video_pause_icon > svg {
33
+ display: block;
34
+ }
35
+ .video_play_controls.playing > .video_pause_icon {
36
+ display: none !important;
37
+ }
38
+ .slides-active .video_play_controls > .video_pause_icon,
39
+ .slick-active .video_play_controls > .video_pause_icon {
40
+ display: block;
41
+ }
42
+ </style>
43
+
44
+ <script>
45
+ try {
46
+ window.handleVideoClick = window.handleVideoClick || (e => {
47
+ const classList = e.target.classList;
48
+ if (!classList.contains('video_play_controls')) return;
49
+ const video = e.target.querySelector('video');
50
+ video.paused ? video.play() : video.pause();
51
+ });
52
+ document.removeEventListener('click', window.handleVideoClick);
53
+ document.addEventListener('click', window.handleVideoClick);
54
+ ['pause', 'ended'].forEach(event => {
55
+ window.addEventListener(event, e => {
56
+ const video = e.target;
57
+ video.parentNode.classList.remove('playing');
58
+ }, true);
59
+ });
60
+ document.addEventListener('play', e => {
61
+ const video = e.target;
62
+ video.parentNode.classList.add('playing');
63
+ }, true);
64
+ } catch (e) {
65
+ console.error(e);
66
+ }
67
+ window.addEventListener("load", () => {
68
+ window.template.defaults.imports.media_parse = function (url) {
69
+ var result = {};
70
+ try {
71
+ url.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (str, key, value) {
72
+ try {
73
+ result[key] = decodeURIComponent(value);
74
+ } catch (e) {
75
+ result[key] = value;
76
+ }
77
+ });
78
+ result.preview_image = url.split('?')[0];
79
+ } catch (e) {};
80
+ return result;
81
+ }
82
+ });
83
+ </script>
84
+
85
+
86
+ <script type="text/html" id="video_html_tpl">
87
+ <div style="padding-bottom: <%= padding_bottom %>;" class="video_play_controls <%= class_name %>">
88
+ <video x5-playsinline="true" playsinline="true" webkit-playsinline="true" poster="<%-media.preview_image%>">
89
+ <% if (media.hls) { %>
90
+ <source src="<%-media.hls%>" type="application/x-mpegURL">
91
+ <% } %>
92
+ <% if (media.mp4) { %>
93
+ <source src="<%-media.mp4%>" type="video/mp4">
94
+ <% } %>
95
+ </video>
96
+ <div class="video_pause_icon">{% include 'icon_video_play_large' %}</div>
97
+ </div>
98
+ </script>
@@ -0,0 +1,2 @@
1
+ <div class="product-image__thumb-video d-none d-md-block">{% include 'icon_video_play_medium' %}</div>
2
+ <div class="product-image__thumb-video d-md-none">{% include 'icon_video_play_small' %}</div>
@@ -0,0 +1 @@
1
+ {"content_for_page":[1539137345643],"sections":{"1539137345643":{"type":"not_found","settings":{"style":"1"},"version":"1","card_name":"404\u9875\u9762","customer_card_extra":6,"customer_card_name":"404\u9875\u97626","is_new":true}}}
@@ -0,0 +1,92 @@
1
+ {
2
+ "content_for_page": [1646030043188, 1646030049883, 1646030047569, 1539149755240],
3
+ "sections": {
4
+ "1646030043188": {
5
+ "name": "collection_image",
6
+ "cname": {
7
+ "en-US": "Collection image",
8
+ "zh-CN": "专辑封面"
9
+ },
10
+ "category": {
11
+ "en-US": "Page",
12
+ "zh-CN": "页面"
13
+ },
14
+ "ccategory": {
15
+ "en-US": "Page",
16
+ "zh-CN": "页面"
17
+ },
18
+ "display": true,
19
+ "settings": {
20
+ "pc_img_height": 450,
21
+ "md_img_height": 200,
22
+ "cover_width": "auto"
23
+ },
24
+ "type": "collection_image"
25
+ },
26
+ "1646030049883": {
27
+ "name": "collection_name",
28
+ "cname": {
29
+ "en-US": "Collection name",
30
+ "zh-CN": "专辑名称"
31
+ },
32
+ "category": {
33
+ "en-US": "Page",
34
+ "zh-CN": "页面"
35
+ },
36
+ "ccategory": {
37
+ "en-US": "Page",
38
+ "zh-CN": "页面"
39
+ },
40
+ "display": true,
41
+ "settings": [],
42
+ "type": "collection_name"
43
+ },
44
+ "1646030047569": {
45
+ "name": "collection_desc",
46
+ "cname": {
47
+ "en-US": "Collection description",
48
+ "zh-CN": "专辑描述"
49
+ },
50
+ "category": {
51
+ "en-US": "Page",
52
+ "zh-CN": "页面"
53
+ },
54
+ "ccategory": {
55
+ "en-US": "Page",
56
+ "zh-CN": "页面"
57
+ },
58
+ "display": true,
59
+ "settings": [],
60
+ "type": "collection_desc"
61
+ },
62
+ "1539149755240": {
63
+ "type": "collection_detail",
64
+ "settings": {
65
+ "sort": true,
66
+ "is_pagination_show": false,
67
+ "select": 48,
68
+ "filter": false
69
+ },
70
+ "version": "1",
71
+ "card_name": "专辑详情",
72
+ "customer_card_extra": 405,
73
+ "customer_card_name": "专辑详情405",
74
+ "is_new": true,
75
+ "blocks": [{
76
+ "type": "tag_filter",
77
+ "settings": {
78
+ "title": "Color",
79
+ "is_all_tags_show": true,
80
+ "tags": "red,yellow,blue"
81
+ }
82
+ }, {
83
+ "type": "price_filter",
84
+ "settings": {
85
+ "title": "Price",
86
+ "is_last_price_show": true,
87
+ "tags": "0,50,100"
88
+ }
89
+ }]
90
+ }
91
+ }
92
+ }