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,275 @@
1
+ {% use 'feature_columns.css' %}
2
+ <div class="container container-gap">
3
+ {% assign title= section.settings.title %}
4
+ {% assign align_text= section.settings.align_text %}
5
+ {% assign blocks= section.blocks %}
6
+ {% if title != blank %}
7
+ {% include 'card_title', title: title | escape %}
8
+ {% endif %}
9
+ <div class="row common__product-row {% if blocks.size == 1 %} justify-content-center {% endif %}">
10
+ {%- assign flex_item_width = 'col-md-4' -%}
11
+ {% case blocks.size %}
12
+ {% when 1 %}
13
+ {%- assign flex_item_width = 'col-md-6' -%}
14
+ {% when 2 %}
15
+ {%- assign flex_item_width = 'col-md-6' -%}
16
+ {% when 4 %}
17
+ {%- assign flex_item_width = 'col-md-6' -%}
18
+ {% endcase %}
19
+ {% for block in blocks %}
20
+ {% if blocks.size == 5 and forloop.index < 3 %}
21
+ {%- assign column_width = 'col-md-6' -%}
22
+ {% else %}
23
+ {%- assign column_width = flex_item_width -%}
24
+ {% endif %}
25
+
26
+ {% assign defaultImage = 'oss/operation/b4b69942763835db28831d896e0ab3aa.png' | img_url %}
27
+
28
+ <div class="block {{ column_width }} col-sm-12 text-{{ align_text }} common__product-gap">
29
+ {% if block.settings.enable_image %}
30
+ <div class="block__image">
31
+ {% assign link = block.settings.link %}
32
+ {% assign image = block.settings.image %}
33
+ <a class="common__img-wrapper_lazy"
34
+ {% if link.url != blank %}
35
+ href="{{ link.url }}"
36
+ data-track="viewImage"
37
+ data-track-url="{{ link.url }}"
38
+ {% endif %}
39
+ {% unless link.type != 'web' or link.url contains shop.domain %}
40
+ target="_blank"
41
+ {% endunless %}
42
+ style="padding-bottom:
43
+ {% if image != blank %}
44
+ {{ images[image].height | image_padding_bottom : images[image].width, origin: 'unlimit' }};
45
+ {% else %}
46
+ 100%;
47
+ {% endif %}
48
+ width: 100%;">
49
+ {% if image != blank %}
50
+ {% assign class = 'img-full-width' %}
51
+ {% if link.url %}
52
+ {% assign class = 'img-full-width' | append: ' common__img_hover' %}
53
+ {% endif %}
54
+ {% include 'lazyimg',
55
+ src: image,
56
+ style: "margin: auto;",
57
+ class: class
58
+ %}
59
+ {% else %}
60
+ <img src="{{ defaultImage }}"/>
61
+ {% endif %}
62
+ </a>
63
+ </div>
64
+ {% endif %}
65
+ {% if block.settings.title != blank %}
66
+ <div class="block__title dj_skin_title_font">{{ block.settings.title | escape }}</div>
67
+ {% endif %}
68
+ {% if block.settings.text != blank %}
69
+ <div class="block__text dj-mce-view dj_skin_text">{{ block.settings.text }}</div>
70
+ {% endif %}
71
+ {% if block.settings.button_label != blank and block.settings.button_link.url != blank %}
72
+ <a href="{{ block.settings.button_link.url }}" class="btn btn-primary block__btn"
73
+ {% unless block.settings.button_link.type != 'web' or block.settings.button_link.url contains shop.domain %}
74
+ target="_blank"
75
+ {% endunless %}
76
+ >
77
+ {{ block.settings.button_label | escape }}
78
+ </a>
79
+ {% endif %}
80
+ </div>
81
+
82
+ {% endfor %}
83
+ </div>
84
+ </div>
85
+
86
+ {% schema %}
87
+ {
88
+ "name": "feature_columns",
89
+ "max_blocks": 9999,
90
+ "settings": [
91
+ {
92
+ "type": "text",
93
+ "id": "title",
94
+ "label": {
95
+ "en-US": "Heading",
96
+ "zh-CN": "标题"
97
+ },
98
+ "placeholder": "",
99
+ "default": "Text Columns With Images"
100
+ },
101
+ {
102
+ "type": "select",
103
+ "id": "align_text",
104
+ "label": {
105
+ "en-US": "Text alignment",
106
+ "zh-CN": "文字对齐方式"
107
+ },
108
+ "options": [
109
+ {
110
+ "value": "left",
111
+ "label": {
112
+ "en-US": "Text left",
113
+ "zh-CN": "居左"
114
+ }
115
+ },
116
+ {
117
+ "value": "center",
118
+ "label": {
119
+ "zh-CN": "居中",
120
+ "en-US": "Text center"
121
+ }
122
+ }
123
+ ],
124
+ "default": "left"
125
+ }
126
+ ],
127
+ "blocks": [
128
+ {
129
+ "type": "text_block",
130
+ "name": {
131
+ "zh-CN": "图文",
132
+ "en-US": "Image with text"
133
+ },
134
+ "settings": [
135
+ {
136
+ "type": "checkbox",
137
+ "id": "enable_image",
138
+ "label": {
139
+ "en-US": "Show images",
140
+ "zh-CN": "图片是否展示"
141
+ },
142
+ "default": true
143
+ },
144
+ {
145
+ "type": "image_picker",
146
+ "id": "image",
147
+ "label": {
148
+ "zh-CN": "图片",
149
+ "en-US": "Image"
150
+ },
151
+ "info": {
152
+ "zh-CN": "建议尺寸:宽度800px,高度可自适应",
153
+ "en-US": "Recommended resolution: width 800px,responsive height"
154
+ },
155
+ "default": ""
156
+ },
157
+ {
158
+ "type": "url",
159
+ "id": "link",
160
+ "label": {
161
+ "en-US": "Link",
162
+ "zh-CN": "链接"
163
+ },
164
+ "default": ""
165
+ },
166
+ {
167
+ "type": "text",
168
+ "id": "title",
169
+ "label": {
170
+ "en-US": "Heading",
171
+ "zh-CN": "标题"
172
+ },
173
+ "placeholder": "",
174
+ "default": "Title"
175
+ },
176
+ {
177
+ "type": "richtext",
178
+ "id": "text",
179
+ "label": {
180
+ "en-US": "Text",
181
+ "zh-CN": "正文"
182
+ },
183
+ "default": "Use this text to describe products,share details on availability and style,or as a space to display recent reviews or FAQs."
184
+ },
185
+ {
186
+ "type": "text",
187
+ "id": "button_label",
188
+ "label": {
189
+ "en-US": "Button text",
190
+ "zh-CN": "按钮文字"
191
+ },
192
+ "default": ""
193
+ },
194
+ {
195
+ "type": "url",
196
+ "id": "button_link",
197
+ "label": {
198
+ "en-US": "Button link",
199
+ "zh-CN": "按钮链接"
200
+ },
201
+ "default": ""
202
+ }
203
+ ]
204
+ }
205
+ ],
206
+ "presets": [
207
+ {
208
+ "name": "feature_columns",
209
+ "cname": {
210
+ "zh-CN": "图文列表",
211
+ "en-US": "Image with text list"
212
+ },
213
+ "category": {
214
+ "en-US": "Material",
215
+ "zh-CN": "素材"
216
+ },
217
+ "ccategory": {
218
+ "en-US": "Material",
219
+ "zh-CN": "素材"
220
+ },
221
+ "display": true,
222
+ "blocks": [
223
+ {
224
+ "type": "text_block",
225
+ "name": {
226
+ "zh-CN": "图文",
227
+ "en-US": "Image with text"
228
+ },
229
+ "settings": {
230
+ "enable_image": true,
231
+ "image": "",
232
+ "url": "",
233
+ "title": "Title",
234
+ "text": "Use this text to describe products,share details on availability and style,or as a space to display recent reviews or FAQs.",
235
+ "button_label": "",
236
+ "button_link": ""
237
+ }
238
+ },
239
+ {
240
+ "type": "text_block",
241
+ "name": {
242
+ "zh-CN": "图文",
243
+ "en-US": "Image with text"
244
+ },
245
+ "settings": {
246
+ "enable_image": true,
247
+ "image": "",
248
+ "url": "",
249
+ "title": "Title",
250
+ "text": "Use this text to describe products,share details on availability and style,or as a space to display recent reviews or FAQs.",
251
+ "button_label": "",
252
+ "button_link": ""
253
+ }
254
+ },
255
+ {
256
+ "type": "text_block",
257
+ "name": {
258
+ "zh-CN": "图文",
259
+ "en-US": "Image with text"
260
+ },
261
+ "settings": {
262
+ "enable_image": true,
263
+ "image": "",
264
+ "url": "",
265
+ "title": "Title",
266
+ "text": "Use this text to describe products,share details on availability and style,or as a space to display recent reviews or FAQs.",
267
+ "button_label": "",
268
+ "button_link": ""
269
+ }
270
+ }
271
+ ]
272
+ }
273
+ ]
274
+ }
275
+ {% endschema %}
@@ -0,0 +1,227 @@
1
+ {% use 'feature_product.css' %}
2
+ {% assign block = section.settings.product %}
3
+ {% assign layout = section.settings.layout %}
4
+ {% if shop.env == 1 or block.id != 0 %}
5
+ {% if block.id != 0 and all_products[block.id].id %}
6
+ {% assign data = all_products[block.id] %}
7
+ {% elsif block.id != 0 and all_products[block.id].id == blank %}
8
+ {% comment %} 若选择产品后被删除,C端不展示,B端加上‘已删除’标记,展示默认商品信息{% endcomment %}
9
+ {% assign data = default_product %}
10
+ {% assign type = 'delete' %}
11
+ {% else %}
12
+ {% assign data = default_product %}
13
+ {% endif %}
14
+
15
+ {% comment %} 下架产品在C端不展示,B端预览区域要展示,B端选择产品后移除,id为0,其他信息保留 {% endcomment %}
16
+ {% if shop.env == 1 or all_products[block.id].published %}
17
+ <div class="container container-gap">
18
+ <div class="row featured-product d-flex align-items-center mb-padding {% if layout == "right" %}flex-md-row-reverse {%endif%}">
19
+ {% assign product = data %}
20
+ <div class="featured-product__image">
21
+ <a class="common__img-wrapper_lazy"
22
+ {% unless product.isMock %}
23
+ href="{{product.url}}"
24
+ data-track="viewImage"
25
+ data-track-url="{{ product.url }}"
26
+ data-track-id="{{product.id}}"
27
+ data-track-price="{{product.price}}"
28
+ data-track-name="{{product.title | escape}}"
29
+ data-track-type="{{product.type}}"
30
+ {% endunless %}
31
+ style="padding-bottom:
32
+ {% if product.url != blank %}
33
+ {{ product.image.height | image_padding_bottom : product.image.width, origin: 'unlimit' }};
34
+ {% else %}
35
+ 70.4%;
36
+ {% endif %}
37
+ width: 100%;">
38
+ {% include 'lazyimg',
39
+ src: product.image.src,
40
+ alt: product.image.alt | default: product.title,
41
+ class: 'img-full-width common__img_hover'
42
+ %}
43
+ </a>
44
+ {% include 'product_label', product: product %}
45
+ </div>
46
+
47
+ <div class="featured-product__text text-center" data-track="product" data-track-id="{{product.id}}" data-track-price="{{product.price}}" data-track-name="{{product.title | escape}}" data-track-type="{{product.type}}">
48
+ {% for block in section.blocks %}
49
+ {% if block.type == 'heading'%}
50
+ <a {% unless product.isMock %}href="{{ product.url }}"{% endunless %} class="featured-product__title dj_skin_title_font two_line_text_truncate">{{ product.title }}</a>
51
+ {% endif %}
52
+ {% if block.type == 'vendor' and product.vendor %}
53
+ <div class="text-center dj_skin_product_list_title">{{ product.vendor }}</div>
54
+ {% endif %}
55
+ {% if block.type == 'sub_heading' and product.brief %}
56
+ <div class="featured-product__desc dj_skin_text three_line_text_truncate">{{ product.brief }}</div>
57
+ {% endif %}
58
+ {% if block.type == 'price' %}
59
+ <div class="featured-product__price-wrapper">
60
+ <span class="text-truncate dj_skin_product_detail_price featured-product__price money">
61
+ {{ product.price | money_with_symbol}}
62
+ </span>
63
+ {% if product.compare_at_price > product.price %}
64
+ <del class="dj_skin_product_compare_at_price text-truncate dj_skin_product_detail_compare_at_price featured-product__compare-at-price money">
65
+ {{ product.compare_at_price | money_with_symbol}}
66
+ </del>
67
+ {% endif %}
68
+ </div>
69
+ {% endif %}
70
+ {% if block.type == 'button' and block.settings.button_label %}
71
+ <div>
72
+ {% if product.available %}
73
+ <a {% unless product.isMock %}href="{{ product.url }}"{%else%}data-product-mock="true"{% endunless %} class="btn btn-primary featured-product__btn">
74
+ {{ block.settings.button_label | escape }}
75
+ </a>
76
+ {% else %}
77
+ <button type="button" class="btn btn-primary " disabled="">{{ 'i18n.general.product.sold_out' | t }}</button>
78
+ {% endif %}
79
+ </div>
80
+ {% endif %}
81
+ {% endfor %}
82
+ </div>
83
+ </div>
84
+ </div>
85
+ {% endif %}
86
+ {% endif %}
87
+
88
+
89
+
90
+ {% schema %}
91
+ {
92
+ "name": "feature_product",
93
+ "max_blocks": 5,
94
+ "settings": [
95
+ {
96
+ "type": "product",
97
+ "id": "product",
98
+ "label": {
99
+ "zh-CN": "商品",
100
+ "en-US": "Product"
101
+ },
102
+ "default": ""
103
+ },
104
+ {
105
+ "type": "select",
106
+ "id": "layout",
107
+ "label": {
108
+ "zh-CN": "PC图片位置",
109
+ "en-US": "Image position on desktop"
110
+ },
111
+ "default": "left",
112
+ "options": [
113
+ {
114
+ "value": "left",
115
+ "label": {
116
+ "en-US": "Left",
117
+ "zh-CN": "居左"
118
+ }
119
+ },
120
+ {
121
+ "value": "right",
122
+ "label": {
123
+ "en-US": "Right",
124
+ "zh-CN": "居右"
125
+ }
126
+ }
127
+ ]
128
+ }
129
+ ],
130
+ "blocks": [
131
+ {
132
+ "type": "heading",
133
+ "name": {
134
+ "zh-CN": "标题",
135
+ "en-US": "Heading"
136
+ },
137
+ "limit": 1,
138
+ "settings": []
139
+ },
140
+ {
141
+ "type": "sub_heading",
142
+ "name": {
143
+ "zh-CN": "副标题",
144
+ "en-US": "Subheading"
145
+ },
146
+ "limit": 1,
147
+ "settings": []
148
+ },
149
+ {
150
+ "type": "price",
151
+ "name": {
152
+ "zh-CN": "价格",
153
+ "en-US": "Price"
154
+ },
155
+ "limit": 1,
156
+ "settings": []
157
+ },
158
+ {
159
+ "type": "button",
160
+ "name": {
161
+ "zh-CN": "按钮",
162
+ "en-US": "Button"
163
+ },
164
+ "limit": 1,
165
+ "settings": [
166
+ {
167
+ "type": "text",
168
+ "id": "button_label",
169
+ "label": {
170
+ "zh-CN": "按钮文字",
171
+ "en-US": "Button text"
172
+ },
173
+ "default": "Shop Now"
174
+ }
175
+ ]
176
+ },
177
+ {
178
+ "type": "vendor",
179
+ "limit": 1,
180
+ "name": {
181
+ "en-US": "vendor",
182
+ "zh-CN": "供应商"
183
+ },
184
+ "settings": []
185
+ }
186
+ ],
187
+ "presets": [
188
+ {
189
+ "name": "feature_product",
190
+ "cname": {
191
+ "en-US": "Single product",
192
+ "zh-CN": "单个商品"
193
+ },
194
+ "category": {
195
+ "en-US": "Products",
196
+ "zh-CN": "商品"
197
+ },
198
+ "ccategory": {
199
+ "en-US": "Product",
200
+ "zh-CN": "商品"
201
+ },
202
+ "display": true,
203
+ "blocks": [
204
+ {
205
+ "type": "heading",
206
+ "settings": {}
207
+ },
208
+ {
209
+ "type": "sub_heading",
210
+ "settings": {}
211
+ },
212
+ {
213
+ "type": "price",
214
+ "settings": {}
215
+ },
216
+ {
217
+ "type": "button",
218
+ "settings": {
219
+ "button_label": "Shop Now"
220
+ }
221
+ }
222
+ ],
223
+ "icon": "oss/operation/7e0a77a12be9e9b9ecabd1b3cd972f13.svg"
224
+ }
225
+ ]
226
+ }
227
+ {% endschema %}