spree_storefront 5.0.0.rc1

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 (341) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.md +13 -0
  3. data/Rakefile +15 -0
  4. data/app/assets/config/spree_storefront_manifest.js +6 -0
  5. data/app/assets/stylesheets/storefront_page_builder.css +51 -0
  6. data/app/controllers/concerns/spree/cart_methods.rb +40 -0
  7. data/app/controllers/concerns/spree/locale_urls.rb +23 -0
  8. data/app/controllers/concerns/spree/password_protected.rb +17 -0
  9. data/app/controllers/concerns/spree/theme_concern.rb +29 -0
  10. data/app/controllers/spree/account/addresses_controller.rb +16 -0
  11. data/app/controllers/spree/account/base_controller.rb +20 -0
  12. data/app/controllers/spree/account/newsletter_controller.rb +34 -0
  13. data/app/controllers/spree/account/orders_controller.rb +34 -0
  14. data/app/controllers/spree/account/profile_controller.rb +23 -0
  15. data/app/controllers/spree/account/store_credits_controller.rb +23 -0
  16. data/app/controllers/spree/account/wished_items_controller.rb +45 -0
  17. data/app/controllers/spree/addresses_controller.rb +101 -0
  18. data/app/controllers/spree/checkout_controller.rb +365 -0
  19. data/app/controllers/spree/contacts_controller.rb +46 -0
  20. data/app/controllers/spree/digital_links_controller.rb +48 -0
  21. data/app/controllers/spree/home_controller.rb +5 -0
  22. data/app/controllers/spree/line_items_controller.rb +96 -0
  23. data/app/controllers/spree/newsletter_subscribers_controller.rb +43 -0
  24. data/app/controllers/spree/order_status_controller.rb +32 -0
  25. data/app/controllers/spree/orders_controller.rb +104 -0
  26. data/app/controllers/spree/page_sections_controller.rb +17 -0
  27. data/app/controllers/spree/pages_controller.rb +13 -0
  28. data/app/controllers/spree/password_controller.rb +21 -0
  29. data/app/controllers/spree/policies_controller.rb +17 -0
  30. data/app/controllers/spree/posts_controller.rb +76 -0
  31. data/app/controllers/spree/products_controller.rb +99 -0
  32. data/app/controllers/spree/search_controller.rb +39 -0
  33. data/app/controllers/spree/seo_controller.rb +25 -0
  34. data/app/controllers/spree/settings_controller.rb +68 -0
  35. data/app/controllers/spree/store_controller.rb +247 -0
  36. data/app/controllers/spree/taxonomies_controller.rb +30 -0
  37. data/app/controllers/spree/taxons_controller.rb +46 -0
  38. data/app/controllers/spree/wishlists_controller.rb +19 -0
  39. data/app/finders/spree/storefront/variant_finder.rb +80 -0
  40. data/app/helpers/spree/analytics_helper.rb +28 -0
  41. data/app/helpers/spree/cart_helper.rb +48 -0
  42. data/app/helpers/spree/checkout_analytics_helper.rb +77 -0
  43. data/app/helpers/spree/checkout_helper.rb +58 -0
  44. data/app/helpers/spree/filters_helper.rb +180 -0
  45. data/app/helpers/spree/fonts_helper.rb +58 -0
  46. data/app/helpers/spree/orders_helper.rb +7 -0
  47. data/app/helpers/spree/page_helper.rb +67 -0
  48. data/app/helpers/spree/posts_helper.rb +42 -0
  49. data/app/helpers/spree/products_helper.rb +205 -0
  50. data/app/helpers/spree/storefront_helper.rb +86 -0
  51. data/app/helpers/spree/storefront_locale_helper.rb +42 -0
  52. data/app/helpers/spree/theme_helper.rb +244 -0
  53. data/app/helpers/spree/turbo_helper.rb +13 -0
  54. data/app/helpers/spree/turbo_stream_actions_helper.rb +13 -0
  55. data/app/helpers/spree/wishlist_helper.rb +7 -0
  56. data/app/javascript/spree/storefront/application.js +156 -0
  57. data/app/javascript/spree/storefront/controllers/accordion_controller.js +25 -0
  58. data/app/javascript/spree/storefront/controllers/account_nav_controller.js +10 -0
  59. data/app/javascript/spree/storefront/controllers/card_validation_controller.js +103 -0
  60. data/app/javascript/spree/storefront/controllers/carousel_controller.js +44 -0
  61. data/app/javascript/spree/storefront/controllers/cart_controller.js +10 -0
  62. data/app/javascript/spree/storefront/controllers/checkout_address_book_controller.js +28 -0
  63. data/app/javascript/spree/storefront/controllers/checkout_delivery_controller.js +39 -0
  64. data/app/javascript/spree/storefront/controllers/checkout_promotions_controller.js +28 -0
  65. data/app/javascript/spree/storefront/controllers/checkout_summary_controller.js +46 -0
  66. data/app/javascript/spree/storefront/controllers/clear_input_controller.js +23 -0
  67. data/app/javascript/spree/storefront/controllers/copy_input_controller.js +19 -0
  68. data/app/javascript/spree/storefront/controllers/dropdown_controller.js +14 -0
  69. data/app/javascript/spree/storefront/controllers/header_controller.js +33 -0
  70. data/app/javascript/spree/storefront/controllers/infinite_scroll_controller.js +31 -0
  71. data/app/javascript/spree/storefront/controllers/lightbox_controller.js +138 -0
  72. data/app/javascript/spree/storefront/controllers/mobile_nav_controller.js +17 -0
  73. data/app/javascript/spree/storefront/controllers/modal_controller.js +15 -0
  74. data/app/javascript/spree/storefront/controllers/no_ui_slider_controller.js +55 -0
  75. data/app/javascript/spree/storefront/controllers/pdp_desktop_gallery_controller.js +28 -0
  76. data/app/javascript/spree/storefront/controllers/plp_variant_picker_controller.js +151 -0
  77. data/app/javascript/spree/storefront/controllers/product_form_controller.js +136 -0
  78. data/app/javascript/spree/storefront/controllers/quantity_picker_controller.js +43 -0
  79. data/app/javascript/spree/storefront/controllers/search_suggestions_controller.js +61 -0
  80. data/app/javascript/spree/storefront/controllers/searchable_list_controller.js +25 -0
  81. data/app/javascript/spree/storefront/controllers/slideover_controller.js +40 -0
  82. data/app/javascript/spree/storefront/controllers/sticky_button_controller.js +32 -0
  83. data/app/javascript/spree/storefront/controllers/toggle_menu_controller.js +32 -0
  84. data/app/javascript/spree/storefront/controllers/turbo_stream_form_controller.js +51 -0
  85. data/app/javascript/spree/storefront/controllers/wished_item_controller.js +69 -0
  86. data/app/javascript/spree/storefront/helpers/lazy_load_controllers_with_manifest.js +78 -0
  87. data/app/javascript/spree/storefront/helpers/show_flash_message.js +25 -0
  88. data/app/models/spree/color_names.rb +35 -0
  89. data/app/models/spree/contact.rb +24 -0
  90. data/app/presenters/spree/colors_preview_styles_presenter.rb +84 -0
  91. data/app/presenters/spree/featured_product_presenter.rb +42 -0
  92. data/app/presenters/spree/mega_nav_presenter.rb +55 -0
  93. data/app/views/devise/passwords/edit.html.erb +22 -0
  94. data/app/views/devise/passwords/new.html.erb +16 -0
  95. data/app/views/devise/registrations/_form.html.erb +21 -0
  96. data/app/views/devise/registrations/edit.html.erb +24 -0
  97. data/app/views/devise/registrations/new.html.erb +27 -0
  98. data/app/views/devise/sessions/new.html.erb +25 -0
  99. data/app/views/devise/shared/_links.html.erb +22 -0
  100. data/app/views/layouts/spree/checkout.html.erb +58 -0
  101. data/app/views/layouts/spree/password.html.erb +34 -0
  102. data/app/views/layouts/spree/storefront.html.erb +38 -0
  103. data/app/views/spree/account/wished_items/create.turbo_stream.erb +8 -0
  104. data/app/views/spree/account/wished_items/destroy.turbo_stream.erb +20 -0
  105. data/app/views/spree/addresses/destroy.turbo_stream.erb +1 -0
  106. data/app/views/spree/addresses/edit.html.erb +57 -0
  107. data/app/views/spree/addresses/new.html.erb +71 -0
  108. data/app/views/spree/checkout/_address.html.erb +153 -0
  109. data/app/views/spree/checkout/_button_processing.html.erb +7 -0
  110. data/app/views/spree/checkout/_coupon_code.html.erb +55 -0
  111. data/app/views/spree/checkout/_credit_card.html.erb +12 -0
  112. data/app/views/spree/checkout/_delivery.html.erb +70 -0
  113. data/app/views/spree/checkout/_line_item.html.erb +26 -0
  114. data/app/views/spree/checkout/_line_items.html.erb +7 -0
  115. data/app/views/spree/checkout/_missing_all_line_items.html.erb +17 -0
  116. data/app/views/spree/checkout/_missing_line_items.html.erb +28 -0
  117. data/app/views/spree/checkout/_payment.html.erb +35 -0
  118. data/app/views/spree/checkout/_payment_methods.html.erb +72 -0
  119. data/app/views/spree/checkout/_payment_sources.html.erb +24 -0
  120. data/app/views/spree/checkout/_quick_checkout.html.erb +1 -0
  121. data/app/views/spree/checkout/_sidebar.html.erb +34 -0
  122. data/app/views/spree/checkout/_store_credit.html.erb +21 -0
  123. data/app/views/spree/checkout/_summary.html.erb +116 -0
  124. data/app/views/spree/checkout/_user_account.html.erb +9 -0
  125. data/app/views/spree/checkout/apply_coupon_code.turbo_stream.erb +45 -0
  126. data/app/views/spree/checkout/apply_store_credit.turbo_stream.erb +19 -0
  127. data/app/views/spree/checkout/edit.html.erb +98 -0
  128. data/app/views/spree/checkout/payment/_check.html.erb +0 -0
  129. data/app/views/spree/checkout/payment/_gateway.html.erb +74 -0
  130. data/app/views/spree/checkout/payment/_store_credit.html.erb +13 -0
  131. data/app/views/spree/checkout/remove_coupon_code.turbo_stream.erb +34 -0
  132. data/app/views/spree/checkout/remove_store_credit.turbo_stream.erb +19 -0
  133. data/app/views/spree/checkout/update.turbo_stream.erb +25 -0
  134. data/app/views/spree/home/index.html.erb +1 -0
  135. data/app/views/spree/line_items/create.turbo_stream.erb +13 -0
  136. data/app/views/spree/line_items/destroy.turbo_stream.erb +11 -0
  137. data/app/views/spree/line_items/update.turbo_stream.erb +10 -0
  138. data/app/views/spree/newsletter_subscribers/create.turbo_stream.erb +7 -0
  139. data/app/views/spree/order_status/new.html.erb +16 -0
  140. data/app/views/spree/page_sections/show.html.erb +3 -0
  141. data/app/views/spree/pages/show.html.erb +1 -0
  142. data/app/views/spree/password/show.html.erb +1 -0
  143. data/app/views/spree/posts/index.html.erb +1 -0
  144. data/app/views/spree/posts/related_products.html.erb +7 -0
  145. data/app/views/spree/posts/show.html.erb +1 -0
  146. data/app/views/spree/products/index.html.erb +1 -0
  147. data/app/views/spree/products/index.turbo_stream.erb +1 -0
  148. data/app/views/spree/products/related.html.erb +3 -0
  149. data/app/views/spree/products/show.html.erb +1 -0
  150. data/app/views/spree/search/show.html.erb +6 -0
  151. data/app/views/spree/search/show.turbo_stream.erb +1 -0
  152. data/app/views/spree/search/suggestions.turbo_stream.erb +8 -0
  153. data/app/views/spree/seo/robots.text.erb +31 -0
  154. data/app/views/spree/seo/sitemap.xml.erb +25 -0
  155. data/app/views/spree/shared/_fonts.html.erb +14 -0
  156. data/app/views/spree/shared/_head.html.erb +36 -0
  157. data/app/views/spree/shared/_load_more_products.turbo_stream.erb +7 -0
  158. data/app/views/spree/shared/_product_listing_page.html.erb +11 -0
  159. data/app/views/spree/shared/_products.html.erb +1 -0
  160. data/app/views/spree/taxonomies/show.html.erb +1 -0
  161. data/app/views/spree/taxons/show.html.erb +1 -0
  162. data/app/views/spree/taxons/show.turbo_stream.erb +1 -0
  163. data/app/views/spree/waitlists/create.turbo_stream.erb +9 -0
  164. data/app/views/themes/default/kaminari/storefront/_first_page.html.erb +8 -0
  165. data/app/views/themes/default/kaminari/storefront/_gap.html.erb +8 -0
  166. data/app/views/themes/default/kaminari/storefront/_last_page.html.erb +8 -0
  167. data/app/views/themes/default/kaminari/storefront/_next_page.html.erb +13 -0
  168. data/app/views/themes/default/kaminari/storefront/_page.html.erb +10 -0
  169. data/app/views/themes/default/kaminari/storefront/_paginator.html.erb +27 -0
  170. data/app/views/themes/default/kaminari/storefront/_prev_page.html.erb +13 -0
  171. data/app/views/themes/default/spree/account/_account_nav.html.erb +46 -0
  172. data/app/views/themes/default/spree/account/_order.html.erb +39 -0
  173. data/app/views/themes/default/spree/account/_orders.html.erb +16 -0
  174. data/app/views/themes/default/spree/account/addresses/_address.html.erb +42 -0
  175. data/app/views/themes/default/spree/account/addresses/index.html.erb +28 -0
  176. data/app/views/themes/default/spree/account/newsletter/_newsletter_settings.html.erb +13 -0
  177. data/app/views/themes/default/spree/account/newsletter/edit.html.erb +16 -0
  178. data/app/views/themes/default/spree/account/newsletter/update.html.erb +1 -0
  179. data/app/views/themes/default/spree/account/orders/index.html.erb +24 -0
  180. data/app/views/themes/default/spree/account/orders/show.html.erb +22 -0
  181. data/app/views/themes/default/spree/account/profile/edit.html.erb +36 -0
  182. data/app/views/themes/default/spree/account/store_credits/_store_credit_event.html.erb +29 -0
  183. data/app/views/themes/default/spree/account/store_credits/index.html.erb +31 -0
  184. data/app/views/themes/default/spree/checkout/_footer.html.erb +10 -0
  185. data/app/views/themes/default/spree/checkout/complete.html.erb +84 -0
  186. data/app/views/themes/default/spree/contacts/new.html.erb +23 -0
  187. data/app/views/themes/default/spree/orders/_cart.html.erb +14 -0
  188. data/app/views/themes/default/spree/orders/_empty.html.erb +11 -0
  189. data/app/views/themes/default/spree/orders/_line_item.html.erb +47 -0
  190. data/app/views/themes/default/spree/orders/_line_item_quantity.html.erb +11 -0
  191. data/app/views/themes/default/spree/orders/_summary.html.erb +41 -0
  192. data/app/views/themes/default/spree/orders/edit.html.erb +18 -0
  193. data/app/views/themes/default/spree/orders/show.html.erb +6 -0
  194. data/app/views/themes/default/spree/page_sections/_announcement_bar.html.erb +10 -0
  195. data/app/views/themes/default/spree/page_sections/_custom_code.html.erb +5 -0
  196. data/app/views/themes/default/spree/page_sections/_featured_product.html.erb +136 -0
  197. data/app/views/themes/default/spree/page_sections/_featured_taxon.html.erb +116 -0
  198. data/app/views/themes/default/spree/page_sections/_featured_taxons.html.erb +71 -0
  199. data/app/views/themes/default/spree/page_sections/_footer.html.erb +62 -0
  200. data/app/views/themes/default/spree/page_sections/_header.html.erb +166 -0
  201. data/app/views/themes/default/spree/page_sections/_image_banner.html.erb +57 -0
  202. data/app/views/themes/default/spree/page_sections/_image_with_text.html.erb +66 -0
  203. data/app/views/themes/default/spree/page_sections/_main_password_footer.html.erb +64 -0
  204. data/app/views/themes/default/spree/page_sections/_main_password_header.html.erb +54 -0
  205. data/app/views/themes/default/spree/page_sections/_newsletter.html.erb +47 -0
  206. data/app/views/themes/default/spree/page_sections/_page_title.html.erb +7 -0
  207. data/app/views/themes/default/spree/page_sections/_post_details.html.erb +19 -0
  208. data/app/views/themes/default/spree/page_sections/_post_grid.html.erb +11 -0
  209. data/app/views/themes/default/spree/page_sections/_product_details.html.erb +102 -0
  210. data/app/views/themes/default/spree/page_sections/_product_grid.html.erb +52 -0
  211. data/app/views/themes/default/spree/page_sections/_related_products.html.erb +15 -0
  212. data/app/views/themes/default/spree/page_sections/_rich_text.html.erb +18 -0
  213. data/app/views/themes/default/spree/page_sections/_taxon_banner.html.erb +37 -0
  214. data/app/views/themes/default/spree/page_sections/_taxon_grid.html.erb +103 -0
  215. data/app/views/themes/default/spree/page_sections/_video.html.erb +27 -0
  216. data/app/views/themes/default/spree/page_sections/nav/_desktop.html.erb +49 -0
  217. data/app/views/themes/default/spree/page_sections/nav/_mobile.html.erb +136 -0
  218. data/app/views/themes/default/spree/policies/show.html.erb +11 -0
  219. data/app/views/themes/default/spree/posts/_json_ld.html.erb +20 -0
  220. data/app/views/themes/default/spree/posts/_pagination.html.erb +1 -0
  221. data/app/views/themes/default/spree/posts/_post.html.erb +13 -0
  222. data/app/views/themes/default/spree/products/_add_to_cart_button.html.erb +58 -0
  223. data/app/views/themes/default/spree/products/_add_to_waitlist.html.erb +36 -0
  224. data/app/views/themes/default/spree/products/_add_to_wishlist.html.erb +33 -0
  225. data/app/views/themes/default/spree/products/_breadcrumbs.html.erb +23 -0
  226. data/app/views/themes/default/spree/products/_color_picker.html.erb +19 -0
  227. data/app/views/themes/default/spree/products/_color_swatches.html.erb +61 -0
  228. data/app/views/themes/default/spree/products/_details.html.erb +55 -0
  229. data/app/views/themes/default/spree/products/_featured_image.html.erb +37 -0
  230. data/app/views/themes/default/spree/products/_filters.html.erb +45 -0
  231. data/app/views/themes/default/spree/products/_json_ld.html.erb +38 -0
  232. data/app/views/themes/default/spree/products/_json_ld_list.html.erb +9 -0
  233. data/app/views/themes/default/spree/products/_json_ld_variant.html.erb +10 -0
  234. data/app/views/themes/default/spree/products/_label.html.erb +26 -0
  235. data/app/views/themes/default/spree/products/_media_gallery.html.erb +94 -0
  236. data/app/views/themes/default/spree/products/_price.html.erb +59 -0
  237. data/app/views/themes/default/spree/products/_product.html.erb +62 -0
  238. data/app/views/themes/default/spree/products/_quantity_selector.html.erb +32 -0
  239. data/app/views/themes/default/spree/products/_returns_policy_modal.html.erb +22 -0
  240. data/app/views/themes/default/spree/products/_show_more_button.html.erb +8 -0
  241. data/app/views/themes/default/spree/products/_sort.html.erb +45 -0
  242. data/app/views/themes/default/spree/products/_swiper.html.erb +85 -0
  243. data/app/views/themes/default/spree/products/_tags.html.erb +0 -0
  244. data/app/views/themes/default/spree/products/_variant_options.html.erb +71 -0
  245. data/app/views/themes/default/spree/products/_variant_picker.html.erb +50 -0
  246. data/app/views/themes/default/spree/products/filters/_availability.html.erb +32 -0
  247. data/app/views/themes/default/spree/products/filters/_colors.html.erb +23 -0
  248. data/app/views/themes/default/spree/products/filters/_generic.html.erb +75 -0
  249. data/app/views/themes/default/spree/products/filters/_price.html.erb +35 -0
  250. data/app/views/themes/default/spree/products/filters/_taxons.erb +78 -0
  251. data/app/views/themes/default/spree/search/_suggestions.html.erb +92 -0
  252. data/app/views/themes/default/spree/settings/show.html.erb +32 -0
  253. data/app/views/themes/default/spree/shared/_account_pane.html.erb +28 -0
  254. data/app/views/themes/default/spree/shared/_address.html.erb +35 -0
  255. data/app/views/themes/default/spree/shared/_cart_icon.html.erb +13 -0
  256. data/app/views/themes/default/spree/shared/_cart_pane.html.erb +38 -0
  257. data/app/views/themes/default/spree/shared/_css_variables.html.erb +54 -0
  258. data/app/views/themes/default/spree/shared/_custom_head.html.erb +0 -0
  259. data/app/views/themes/default/spree/shared/_error_messages.html.erb +9 -0
  260. data/app/views/themes/default/spree/shared/_error_messages_without_base_attribute.html.erb +15 -0
  261. data/app/views/themes/default/spree/shared/_flash.html.erb +16 -0
  262. data/app/views/themes/default/spree/shared/_flashes.html.erb +10 -0
  263. data/app/views/themes/default/spree/shared/_json_ld.html.erb +32 -0
  264. data/app/views/themes/default/spree/shared/_line_item_options.html.erb +18 -0
  265. data/app/views/themes/default/spree/shared/_logo.html.erb +42 -0
  266. data/app/views/themes/default/spree/shared/_meta_tags.html.erb +45 -0
  267. data/app/views/themes/default/spree/shared/_order_details.html.erb +106 -0
  268. data/app/views/themes/default/spree/shared/_order_line_item.html.erb +65 -0
  269. data/app/views/themes/default/spree/shared/_order_shipment.html.erb +71 -0
  270. data/app/views/themes/default/spree/shared/_search.html.erb +32 -0
  271. data/app/views/themes/default/spree/shared/_title.html.erb +3 -0
  272. data/app/views/themes/default/spree/shared/_wishlist_icon.html.erb +13 -0
  273. data/app/views/themes/default/spree/shared/icons/_account.html.erb +17 -0
  274. data/app/views/themes/default/spree/shared/icons/_arrow-left.html.erb +8 -0
  275. data/app/views/themes/default/spree/shared/icons/_arrow-right.html.erb +3 -0
  276. data/app/views/themes/default/spree/shared/icons/_bell.html.erb +9 -0
  277. data/app/views/themes/default/spree/shared/icons/_cart.html.erb +10 -0
  278. data/app/views/themes/default/spree/shared/icons/_cart_48.html.erb +6 -0
  279. data/app/views/themes/default/spree/shared/icons/_check.html.erb +4 -0
  280. data/app/views/themes/default/spree/shared/icons/_chevron.html.erb +15 -0
  281. data/app/views/themes/default/spree/shared/icons/_chevron_down.html.erb +5 -0
  282. data/app/views/themes/default/spree/shared/icons/_chevron_right.html.erb +15 -0
  283. data/app/views/themes/default/spree/shared/icons/_chevron_up.html.erb +3 -0
  284. data/app/views/themes/default/spree/shared/icons/_close.html.erb +9 -0
  285. data/app/views/themes/default/spree/shared/icons/_cross.html.erb +16 -0
  286. data/app/views/themes/default/spree/shared/icons/_delete.html.erb +3 -0
  287. data/app/views/themes/default/spree/shared/icons/_delivery.html.erb +5 -0
  288. data/app/views/themes/default/spree/shared/icons/_disabled.html.erb +13 -0
  289. data/app/views/themes/default/spree/shared/icons/_edit.html.erb +3 -0
  290. data/app/views/themes/default/spree/shared/icons/_facebook.html.erb +16 -0
  291. data/app/views/themes/default/spree/shared/icons/_filter.html.erb +8 -0
  292. data/app/views/themes/default/spree/shared/icons/_heart.html.erb +12 -0
  293. data/app/views/themes/default/spree/shared/icons/_info.html.erb +7 -0
  294. data/app/views/themes/default/spree/shared/icons/_instagram.html.erb +18 -0
  295. data/app/views/themes/default/spree/shared/icons/_lock.html.erb +13 -0
  296. data/app/views/themes/default/spree/shared/icons/_menu.html.erb +10 -0
  297. data/app/views/themes/default/spree/shared/icons/_minus.html.erb +5 -0
  298. data/app/views/themes/default/spree/shared/icons/_pinch.html.erb +6 -0
  299. data/app/views/themes/default/spree/shared/icons/_pinterest.html.erb +8 -0
  300. data/app/views/themes/default/spree/shared/icons/_plus.html.erb +17 -0
  301. data/app/views/themes/default/spree/shared/icons/_return.html.erb +11 -0
  302. data/app/views/themes/default/spree/shared/icons/_search.html.erb +17 -0
  303. data/app/views/themes/default/spree/shared/icons/_spinner.html.erb +1 -0
  304. data/app/views/themes/default/spree/shared/icons/_spotify.html.erb +8 -0
  305. data/app/views/themes/default/spree/shared/icons/_tiktok.html.erb +9 -0
  306. data/app/views/themes/default/spree/shared/icons/_twitter.html.erb +16 -0
  307. data/app/views/themes/default/spree/shared/icons/_youtube.html.erb +9 -0
  308. data/app/views/themes/default/spree/shared/icons/_zoom.html.erb +10 -0
  309. data/app/views/themes/default/spree/wishlists/_no_wished_items.html.erb +10 -0
  310. data/app/views/themes/default/spree/wishlists/_wished_item.html.erb +38 -0
  311. data/app/views/themes/default/spree/wishlists/show.html.erb +17 -0
  312. data/config/i18n-tasks.yml +176 -0
  313. data/config/importmap.rb +22 -0
  314. data/config/initializers/assets.rb +1 -0
  315. data/config/initializers/heroicon.rb +10 -0
  316. data/config/locales/en.yml +76 -0
  317. data/config/routes.rb +88 -0
  318. data/lib/generators/spree/storefront/install/install_generator.rb +45 -0
  319. data/lib/generators/spree/storefront/install/templates/application.tailwind.css +1760 -0
  320. data/lib/generators/spree/storefront/install/templates/dev +16 -0
  321. data/lib/generators/spree/storefront/install/templates/tailwind.config.js +128 -0
  322. data/lib/generators/spree/storefront/theme/templates/model.rb.tt +12 -0
  323. data/lib/generators/spree/storefront/theme/theme_generator.rb +41 -0
  324. data/lib/spree/storefront/configuration.rb +11 -0
  325. data/lib/spree/storefront/engine.rb +51 -0
  326. data/lib/spree/storefront/testing_support/capybara_utils.rb +13 -0
  327. data/lib/spree/storefront.rb +16 -0
  328. data/lib/spree_storefront.rb +1 -0
  329. data/vendor/colornames.json +1 -0
  330. data/vendor/javascript/@kanety--stimulus-accordion.js +4 -0
  331. data/vendor/javascript/@stimulus-components--carousel.js +4 -0
  332. data/vendor/javascript/card-validator.js +4 -0
  333. data/vendor/javascript/credit-card-type.js +4 -0
  334. data/vendor/javascript/headroom.js.js +19 -0
  335. data/vendor/javascript/nouislider.js +4 -0
  336. data/vendor/javascript/photoswipe--dist--photoswipe-lightbox.esm.js.js +667 -0
  337. data/vendor/javascript/photoswipe.js +1675 -0
  338. data/vendor/javascript/stimulus-read-more.js +4 -0
  339. data/vendor/javascript/stimulus-scroll-to.js +4 -0
  340. data/vendor/javascript/swiper--bundle.js +4 -0
  341. metadata +567 -0
@@ -0,0 +1,25 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+
3
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
4
+ <% cache current_store.taxons do %>
5
+ <% current_store.taxons.each do |taxon| %>
6
+ <url>
7
+ <loc><%= spree_storefront_resource_url(taxon) %></loc>
8
+ <lastmod><%= taxon.updated_at.strftime('%Y-%m-%d') %></lastmod>
9
+ <changefreq>daily</changefreq>
10
+ <priority>0.5</priority>
11
+ </url>
12
+ <% end %>
13
+ <% end %>
14
+
15
+ <% cache [current_store.products, current_currency] do %>
16
+ <% current_store.products.active(current_currency).find_each do |product| %>
17
+ <url>
18
+ <loc><%= spree_storefront_resource_url(product) %></loc>
19
+ <lastmod><%= product.updated_at.strftime('%Y-%m-%d') %></lastmod>
20
+ <changefreq>weekly</changefreq>
21
+ <priority>0.5</priority>
22
+ </url>
23
+ <% end %>
24
+ <% end %>
25
+ </urlset>
@@ -0,0 +1,14 @@
1
+ <link rel="preconnect" href="https://fonts.googleapis.com">
2
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
3
+
4
+ <% cache_unless page_builder_enabled?, current_theme do %>
5
+ <%= google_fonts_link_tag %>
6
+
7
+ <style type="text/css">
8
+ <%= font_styles %>
9
+ </style>
10
+
11
+ <% if current_theme_or_preview.preferred_custom_font_code.present? %>
12
+ <%= raw(current_theme_or_preview.preferred_custom_font_code) %>
13
+ <% end %>
14
+ <% end %>
@@ -0,0 +1,36 @@
1
+ <meta charset="utf-8">
2
+ <title><%= title %></title>
3
+ <meta name="viewport" content="width=device-width, initial-scale=1">
4
+ <%= canonical_tag(current_store.url_or_custom_domain) %>
5
+ <%= csrf_meta_tags %>
6
+
7
+ <% cache current_store do %>
8
+ <% if current_store.favicon_image.attached? && current_store.favicon_image.variable? %>
9
+ <link rel="icon" href="<%= main_app.cdn_image_url(current_store.favicon_image.variant(spree_image_variant_options(resize_to_fill: [256, 256]))) %>">
10
+ <% end %>
11
+ <% end %>
12
+
13
+ <%= render 'spree/shared/meta_tags' %>
14
+ <%= render 'spree/shared/css_variables' %>
15
+ <%= render 'spree/shared/fonts' %>
16
+
17
+ <%= javascript_importmap_tags 'application-spree-storefront' %>
18
+ <%= javascript_tag "wishedVariantIds = #{(current_wishlist&.variant_ids&.map(&:to_s) || []).to_json.html_safe};" %>
19
+
20
+ <%= stylesheet_link_tag "tailwind", defer: true, data: { turbo_track: 'reload' } %>
21
+ <%= stylesheet_link_tag "storefront_page_builder", defer: true, data: { turbo_track: 'reload' } if page_builder_enabled? %>
22
+
23
+ <%= yield :head %>
24
+
25
+ <%= render_storefront_partials(:head_partials) unless page_builder_enabled? %>
26
+
27
+ <% if Rails.env.test? %>
28
+ <% # for test environment we need to skip uppercase so we won't get false failures with different text transforms %>
29
+ <style>
30
+ .uppercase {
31
+ text-transform: none !important;
32
+ }
33
+ </style>
34
+ <% end %>
35
+
36
+ <%= render 'spree/shared/google_places_api_loader' %>
@@ -0,0 +1,7 @@
1
+ <%= turbo_stream.replace "next_page" do %>
2
+ <%= render 'spree/products/show_more_button' if storefront_products.any? %>
3
+ <% end %>
4
+
5
+ <%= turbo_stream.append "products" do %>
6
+ <%= render 'spree/shared/products', products: storefront_products.records %>
7
+ <% end %>
@@ -0,0 +1,11 @@
1
+ <% if turbo_frame_request? && current_theme_preview.nil? %>
2
+ <%= render 'spree/page_sections/product_grid', products: storefront_products.records, section: current_page.sections.find_by(type: 'Spree::PageSections::ProductGrid') %>
3
+ <% else %>
4
+ <%= render_page(
5
+ current_page,
6
+ taxon: @taxon,
7
+ collection: @collection,
8
+ products: storefront_products.records,
9
+ ) %>
10
+ <% end %>
11
+
@@ -0,0 +1 @@
1
+ <%= render partial: 'spree/products/product', collection: products, cached: ->(product) { product_cache_key(product) } %>
@@ -0,0 +1 @@
1
+ <%= render_page(current_page, taxons: @taxons) %>
@@ -0,0 +1 @@
1
+ <%= render 'spree/shared/product_listing_page' %>
@@ -0,0 +1 @@
1
+ <%= render 'spree/shared/load_more_products' %>
@@ -0,0 +1,9 @@
1
+ <%= spree_turbo_update_flashes %>
2
+
3
+ <% if @waitlist.persisted? %>
4
+ <%= turbo_stream.append "main-product-#{@waitlist.variant.product.id}" do %>
5
+ <script>
6
+ window.dispatchEvent(new CustomEvent('waitlist:created'));
7
+ </script>
8
+ <% end %>
9
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%# Link to the "First" page
2
+ - available local variables
3
+ url: url to the first page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
@@ -0,0 +1,8 @@
1
+ <%# Non-link tag that stands for skipped pages...
2
+ - available local variables
3
+ current_page: a page object for the currently displayed page
4
+ total_pages: total number of pages
5
+ per_page: number of items to fetch per page
6
+ remote: data-remote
7
+ -%>
8
+ <span class="w-8 text-center"><%= t('views.pagination.truncate').html_safe %></span>
@@ -0,0 +1,8 @@
1
+ <%# Link to the "Last" page
2
+ - available local variables
3
+ url: url to the last page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
@@ -0,0 +1,13 @@
1
+ <%# Link to the "Next" page
2
+ - available local variables
3
+ url: url to the next page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <% css = "inline-flex justify-center items-center gap-x-1.5 px-4#{' pagination-link--disabled' if current_page.last?}" %>
10
+
11
+ <%= link_to(url, disabled: current_page.last?, class: css) do %>
12
+ <%= render 'spree/shared/icons/chevron_right', size: 20, color: current_page.last? ? theme_setting(:neutral_color) : theme_setting(:text_color) %>
13
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <%# Link showing page number
2
+ - available local variables
3
+ page: a page object for "this" page
4
+ url: url to this page
5
+ current_page: a page object for the currently displayed page
6
+ total_pages: total number of pages
7
+ per_page: number of items to fetch per page
8
+ remote: data-remote
9
+ -%>
10
+ <%= active_link_to page, url, class: 'pagination-link w-8 text-center', active: page.current?, class_active: 'pagination-link--active' %>
@@ -0,0 +1,27 @@
1
+ <%# The container tag
2
+ - available local variables
3
+ current_page: a page object for the currently displayed page
4
+ total_pages: total number of pages
5
+ per_page: number of items to fetch per page
6
+ remote: data-remote
7
+ paginator: the paginator that renders the pagination tags inside
8
+ -%>
9
+ <%= paginator.render do -%>
10
+ <nav class="pagination flex items-center justify-center gap-x-1 mt-16" role="navigation" aria-label="pager">
11
+ <%= prev_page_tag %>
12
+
13
+ <div class="flex items-center gap-x-1">
14
+ <% each_page do |page| -%>
15
+ <% if page.display_tag? -%>
16
+ <%= page_tag page %>
17
+ <% elsif !page.was_truncated? -%>
18
+ <%= gap_tag %>
19
+ <% end -%>
20
+ <% end -%>
21
+ </div>
22
+
23
+ <% unless current_page.out_of_range? %>
24
+ <%= next_page_tag %>
25
+ <% end %>
26
+ </nav>
27
+ <% end -%>
@@ -0,0 +1,13 @@
1
+ <%# Link to the "Previous" page
2
+ - available local variables
3
+ url: url to the previous page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <% css = "inline-flex justify-center items-center gap-x-1.5 px-4#{' pagination-link--disabled' if current_page.first?}" %>
10
+
11
+ <%= link_to(url, disabled: current_page.first?, class: css) do %>
12
+ <%= render 'spree/shared/icons/chevron', size: 20, color: current_page.first? ? theme_setting(:neutral_color) : theme_setting(:text_color) %>
13
+ <% end %>
@@ -0,0 +1,46 @@
1
+ <h1 class="font-semibold uppercase hidden lg:block">
2
+ <%= Spree.t(:my_account) %>
3
+ </h1>
4
+ <div
5
+ data-controller="account-nav"
6
+ class="mt-2 lg:mt-6 font-medium flex overflow-auto no-scrollbar -mx-4 mb-6 lg:mx-0 lg:mb-11 lg:flex-col"
7
+ >
8
+ <%= link_to "#{Spree.t(:orders)} & #{Spree.t(:returns)}", spree.account_orders_path,
9
+ data: { active: current == "orders" },
10
+ class: "shrink-0 block lg:px-4 lg:py-3 px-3 py-4 border-b lg:border-b-0 text-neutral-700 hover:border-accent-100 hover:bg-accent-100 hover:text-black #{current == "orders" ? "lg:bg-accent border-text lg:border-b-0 lg:border-l-[1.5px]" : "border-accrent lg:border-l"}"
11
+ %>
12
+ <%= link_to Spree.t(:addresses), spree.account_addresses_path,
13
+ data: { active: current == "address" },
14
+ class: "shrink-0 block lg:px-4 lg:py-3 px-3 py-4 border-b lg:border-b-0 text-neutral-700 hover:border-accent-100 hover:bg-accent-100 hover:text-black #{current == "address" ? "lg:bg-accent border-text lg:border-b-0 lg:border-l-[1.5px]" : "border-accrent lg:border-l"}"
15
+ %>
16
+ <%= link_to Spree.t(:personal_details), spree.edit_account_profile_path,
17
+ data: { active: current == "account" },
18
+ class: "shrink-0 block lg:px-4 lg:py-3 px-3 py-4 border-b lg:border-b-0 text-neutral-700 hover:border-accent-100 hover:bg-accent-100 hover:text-black #{current == "account" ? "lg:bg-accent border-text lg:border-b-0 lg:border-l-[1.5px]" : "border-accrent lg:border-l"}"
19
+ %>
20
+ <%= link_to Spree.t(:wishlist), spree.account_wishlist_path,
21
+ data: { active: current == "wishlist" },
22
+ class: "shrink-0 block lg:px-4 lg:py-3 px-3 py-4 border-b lg:border-b-0 text-neutral-700 hover:border-accent-100 hover:bg-accent-100 hover:text-black #{current == "wishlist" ? "lg:bg-accent border-text lg:border-b-0 lg:border-l-[1.5px]" : "border-accrent lg:border-l"}"
23
+ %>
24
+
25
+ <% if spree.respond_to?(:account_gift_cards_path) %>
26
+ <%= link_to Spree.t(:gift_cards), spree.account_gift_cards_path,
27
+ data: { active: current == "gift_cards" },
28
+ class: "shrink-0 block lg:px-4 lg:py-3 px-3 py-4 border-b lg:border-b-0 text-neutral-700 hover:border-accent-100 hover:bg-accent-100 hover:text-black #{current == "gift_cards" ? "lg:bg-accent border-text lg:border-b-0 lg:border-l-[1.5px]" : "border-accrent lg:border-l"}"
29
+ %>
30
+ <% end %>
31
+
32
+ <%= link_to Spree.t(:store_credits), spree.account_store_credits_path,
33
+ data: { active: current == "gift_cards" },
34
+ class: "shrink-0 block lg:px-4 lg:py-3 px-3 py-4 border-b lg:border-b-0 text-neutral-700 hover:border-accent-100 hover:bg-accent-100 hover:text-black #{current == "store_credits" ? "lg:bg-accent border-text lg:border-b-0 lg:border-l-[1.5px]" : "border-accrent lg:border-l"}"
35
+ %>
36
+
37
+ <%= link_to Spree.t('storefront.account.newsletter_settings'), spree.edit_account_newsletter_path,
38
+ data: { active: current == "newsletter" },
39
+ class: "shrink-0 block lg:px-4 lg:py-3 px-3 py-4 border-b lg:border-b-0 text-neutral-700 hover:border-accent-100 hover:bg-accent-100 hover:text-black #{current == "newsletter" ? "lg:bg-accent border-text lg:border-b-0 lg:border-l-[1.5px]" : "border-accrent lg:border-l"}"
40
+ %>
41
+
42
+ <%= button_to Spree.t(:logout), spree_logout_path,
43
+ class: "w-full text-left hidden shrink-0 md:block lg:px-4 lg:py-3 px-3 py-4 border-b lg:border-b-0 border-accrent lg:border-l text-neutral-700 hover:border-accent-100 hover:bg-accent-100 hover:text-black",
44
+ method: :delete,
45
+ data: { turbo: false } if defined?(spree_logout_path) %>
46
+ </div>
@@ -0,0 +1,39 @@
1
+ <tr class="flex flex-wrap w-full md:table-row md:h-[72px] border border-accent md:border-none mb-4 p-4 md:p-0 hover:bg-accent-100">
2
+ <td class="mb-4 w-1/2 md:w-auto -order-1 md:px-4 md:border-y border-accent md:border-l font-medium">
3
+ <%= link_to "##{order.number}", spree.account_order_path(order) %>
4
+ </td>
5
+ <td class="mb-4 w-full md:w-auto md:px-4 md:border-y border-accent"><%= local_date(order.completed_at.to_date) %></td>
6
+ <td class="md:w-auto pr-2 md:px-4 md:border-y border-accent">
7
+ <% if order.payment_state %>
8
+ <% if order.payment_state == 'void' %>
9
+ <% if order.order_refunded? %>
10
+ <span class="badge-refunded">
11
+ <%= Spree.t("payment_states.refunded").titleize %>
12
+ </span>
13
+ <% else %>
14
+ <span class="badge-void">
15
+ <%= Spree.t("payment_states.#{order.payment_state}").titleize %>
16
+ </span>
17
+ <% end %>
18
+ <% else %>
19
+ <span class="badge-success">
20
+ <%= Spree.t("payment_states.#{order.payment_state}").titleize %>
21
+ </span>
22
+ <% end %>
23
+ <% end %>
24
+ </td>
25
+ <td class="md:w-auto md:px-4 md:border-y border-accent">
26
+ <% if order.shipment_state %>
27
+ <% if order.shipment_state == 'shipped' %>
28
+ <span class="badge-success">
29
+ <%= Spree.t("shipment_states.#{order.shipment_state}").titleize %>
30
+ </span>
31
+ <% else %>
32
+ <span class="badge-<%= order.shipment_state %>">
33
+ <%= Spree.t("shipment_states.#{order.shipment_state}").titleize %>
34
+ </span>
35
+ <% end %>
36
+ <% end %>
37
+ </td>
38
+ <td class="mb-4 w-1/2 md:w-auto -order-1 md:px-4 md:border-y md:border-r border-accent font-me text-right"><%= order.display_total_minus_store_credits %></td>
39
+ </tr>
@@ -0,0 +1,16 @@
1
+
2
+ <table class="inline-table md:table table-auto overflow-scroll w-full text-sm border-separate border-spacing-y-4 mb-24 mt-4">
3
+ <thead class="hidden md:table-row-group">
4
+ <tr class="text-left text-neutral text-xs">
5
+ <th class="font-normal px-4"><%= Spree::Order.human_attribute_name(:number) %></th>
6
+ <th class="font-normal px-4"><%= Spree.t(:date) %></th>
7
+ <th class="font-normal px-4"><%= Spree.t(:payment_state) %></th>
8
+ <th class="font-normal px-4"><%= Spree.t(:shipment_state) %></th>
9
+ <th class="font-normal px-4 text-right"><%= Spree.t(:total) %></th>
10
+ </tr>
11
+ </thead>
12
+ <tbody class="block md:table-row-group">
13
+ <%= render collection: orders, partial: 'spree/account/order', cached: spree_base_cache_scope %>
14
+ </tbody>
15
+ </table>
16
+
@@ -0,0 +1,42 @@
1
+ <li class="p-4 my-4 border border-accent lg:flex justify-between relative" id="<%= dom_id(address) %>">
2
+ <%= render 'spree/shared/address', address: address %>
3
+ <div class="flex gap-6 h-6 lg:h-10 mt-6 lg:mt-0">
4
+ <%= link_to spree.edit_address_path(address), class: 'flex gap-2 lg:p-2' do %>
5
+ <%= render 'spree/shared/icons/edit' %>
6
+ <span class="uppercase text-sm font-semibold tracking-widest"><%= Spree.t(:edit_address) %></span>
7
+ <% end %>
8
+ <div
9
+ data-controller="modal"
10
+ data-modal-allow-background-close="true"
11
+ data-modal-backdrop-color-value="rgba(0,0,0,0.32)"
12
+ >
13
+ <button data-action="click->modal#open" class="flex p-2 max-lg:absolute top-2 right-2" data-test-id="delete_address">
14
+ <%= render 'spree/shared/icons/delete' %>
15
+ </button>
16
+ <div
17
+ data-modal-target="container"
18
+ data-action="click->modal#closeBackground keyup@window->modal#closeWithKeyboard"
19
+ class="hidden animated fadeIn fixed inset-0 overflow-y-auto flex items-center justify-center z-[9999]"
20
+ >
21
+ <div class="w-full lg:w-[424px] relative">
22
+ <div class="mx-4 lg:mx-0 bg-white">
23
+ <div class="px-8 py-6">
24
+ <div class="flex justify-end">
25
+ <button data-action="click->modal#close">
26
+ <%= render 'spree/shared/icons/close' %>
27
+ <span class="sr-only"><%= Spree.t(:close) %></span>
28
+ </button>
29
+ </div>
30
+ <h2 class="text-xl lg:text-2xl my-4 uppercase"><%= Spree.t(:delete_address) %></h2>
31
+ <p class="mb-8"><%= Spree.t(:are_you_sure) %></p>
32
+ <div class="flex justify-end items-center flex-wrap mt-4 gap-4">
33
+ <%= button_tag Spree.t(:cancel), class: 'uppercase text-sm font-semibold tracking-widest', data: { action: 'click->modal#close' } %>
34
+ <%= button_to Spree.t(:delete), spree.address_path(address), method: :delete, class: 'btn-primary !px-6 !py-3 !leading-[1.375rem]', data: { test_id: 'confirm_delete_address' } %>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ </div>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ </li>
@@ -0,0 +1,28 @@
1
+ <div class="page-container grid grid-cols-1 lg:grid-cols-12 lg:gap-6 lg:mt-6">
2
+ <div class="lg:col-span-3">
3
+ <%= render 'spree/account/account_nav', current: 'address' %>
4
+ </div>
5
+ <div class="lg:col-span-8 lg:col-start-5">
6
+ <div class="mb-12 lg:mb-24">
7
+ <div class="font-medium mb-4">
8
+ <%= Spree.t(:addresses) %>
9
+ </div>
10
+ <% if @addresses.any? %>
11
+ <ul>
12
+ <%= render partial: 'spree/account/addresses/address', collection: @addresses, cached: ->a {[*spree_base_cache_scope.call(a), try_spree_current_user.ship_address_id, try_spree_current_user.bill_address_id]}, as: :address %>
13
+ </ul>
14
+ <div class="flex">
15
+ <%= link_to Spree.t(:add_address), spree.new_address_path, class: 'btn-primary block w-full lg:w-auto' %>
16
+ </div>
17
+ <% else %>
18
+ <div class="text-center py-6">
19
+ <p class="mb-2 font-medium uppercase"><%= Spree.t('storefront.account.no_addresses_title') %></p>
20
+ <p><%= Spree.t('storefront.account.no_addresses_description') %></p>
21
+ <div class="flex mt-8 justify-center">
22
+ <%= link_to Spree.t(:add), spree.new_address_path, class: 'btn-primary block' %>
23
+ </div>
24
+ </div>
25
+ <% end %>
26
+ </div>
27
+ </div>
28
+ </div>
@@ -0,0 +1,13 @@
1
+ <%= turbo_frame_tag :newsletter_settings, class: 'flex flex-col gap-4' do %>
2
+ <div class="flex flex-col gap-1">
3
+ <h3 class="font-medium uppercase text-lg leading-8"><%= Spree.t(:newsletters) %></h3>
4
+ <p class="text-base text-neutral-600"><%= Spree.t('storefront.newsletter_subscription.status', status: @user.accepts_email_marketing ? Spree.t(:subscribed) : Spree.t(:not_subscribed)).html_safe %>
5
+ </p>
6
+ </div>
7
+ <%= form_for @user, url: spree.account_newsletter_path, method: :put do |f| %>
8
+ <%= f.hidden_field :accepts_email_marketing, value: !@user.accepts_email_marketing %>
9
+ <%= f.button type: :submit, class: 'btn-primary w-full', data: {turbo_submits_with: render('spree/shared/icons/spinner') } do %>
10
+ <%= @user.accepts_email_marketing? ? :unsubscribe : :subscribe %>
11
+ <% end %>
12
+ <% end %>
13
+ <% end %>
@@ -0,0 +1,16 @@
1
+ <div class="page-container grid grid-cols-1 lg:grid-cols-12 lg:gap-6 lg:mt-6">
2
+ <div class="lg:col-span-3">
3
+ <%= render 'spree/account/account_nav', current: 'newsletter' %>
4
+ </div>
5
+ <div class="lg:col-span-8 lg:col-start-5">
6
+ <div class="flex flex-col gap-4 max-w-[26.5rem]">
7
+ <div class="flex flex-col gap-1">
8
+ <h3 class="font-medium uppercase text-base"><%= Spree.t('storefront.account.newsletter_settings') %></h3>
9
+ <p class="text-base text-neutral-600">
10
+ <%= Spree.t('storefront.newsletter_subscription.description') %>
11
+ </p>
12
+ </div>
13
+ <%= render 'newsletter_settings' %>
14
+ </div>
15
+ </div>
16
+ </div>
@@ -0,0 +1 @@
1
+ <%= render 'newsletter_settings' %>
@@ -0,0 +1,24 @@
1
+ <div class="page-container grid grid-cols-1 lg:grid-cols-12 lg:gap-6 lg:mt-6">
2
+ <div class="lg:col-span-3">
3
+ <%= render 'spree/account/account_nav', current: 'orders' %>
4
+ </div>
5
+ <div class="lg:col-span-8 lg:col-start-5">
6
+ <div class="flex gap-4">
7
+ <div class="uppercase font-medium font-base pb-4 border-b border-text">
8
+ <%= Spree.t(:orders) %>
9
+ </div>
10
+ </div>
11
+ <% if @orders.any? %>
12
+ <%= render 'spree/account/orders', orders: @orders %>
13
+ <!-- add pagination -->
14
+ <% else %>
15
+ <div class="text-center my-16 lg:my14">
16
+ <p class="mb-2 font-medium uppercase"><%= Spree.t('storefront.account.no_orders_title') %></p>
17
+ <p><%= Spree.t('storefront.account.no_orders_description') %></p>
18
+ <div class="flex justify-center mt-8">
19
+ <%= link_to Spree.t(:shop_all), spree.root_url, class: 'btn-primary flex' %>
20
+ </div>
21
+ </div>
22
+ <% end %>
23
+ </div>
24
+ </div>
@@ -0,0 +1,22 @@
1
+ <div class="page-container lg:grid lg:grid-cols-12">
2
+ <div class="py-3 text-sm hidden lg:flex items-center col-span-12 gap-4">
3
+ <%= link_to spree.account_orders_path, class: "text-neutral" do %>
4
+ <%= Spree.t(:orders) %> & <%= Spree.t(:returns) %>
5
+ <% end %>
6
+ <div class="w-1 h-1 bg-accent"></div>
7
+ <span>
8
+ <%= accurate_title %>
9
+ </span>
10
+ </div>
11
+
12
+ <div class="lg:col-start-3 lg:col-span-8 mt-6">
13
+ <%= link_to spree.account_orders_path, class: 'text-sm font-semibold uppercase tracking-widest flex gap-2 items-center' do %>
14
+ <%= render 'spree/shared/icons/chevron' %>
15
+ <%= Spree.t(:back)%>
16
+ <% end %>
17
+ <h1 class="text-xl uppercase font-medium my-4 ">
18
+ <%= accurate_title %>
19
+ </h1>
20
+ <%= render 'spree/shared/order_details', order: @order, shipments: @shipments %>
21
+ </div>
22
+ </div>
@@ -0,0 +1,36 @@
1
+ <div class="page-container grid grid-cols-1 lg:grid-cols-12 lg:gap-6 lg:mt-6">
2
+ <div class="lg:col-span-3">
3
+ <%= render 'spree/account/account_nav', current: 'account' %>
4
+ </div>
5
+ <div class="lg:col-span-8 lg:col-start-5 pb-6">
6
+ <h5 class="uppercase font-medium mb-4"><%= Spree.t('storefront.account.personal_details') %></h5>
7
+ <div class="flex justify-between">
8
+ <p class="mb-3 text-neutral-600">
9
+ <%= Spree.t('storefront.account.please_update_your_contact_details') %>
10
+ </p>
11
+ <% if defined?(spree_edit_password_path) %>
12
+ <%= link_to Spree.t('storefront.account.change_password'), spree_edit_password_path %>
13
+ <% end %>
14
+ </div>
15
+ <%= render partial: 'spree/shared/error_messages', locals: { target: @user } %>
16
+ <%= form_for @user, url: spree.account_profile_path, html: {class: "flex flex-col gap-4"}, method: :put do |f| %>
17
+ <div>
18
+ <%= f.label :first_name, Spree.t(:first_name), class: 'text-xs text-neutral-600 block mb-2' %>
19
+ <%= f.text_field :first_name, class: 'text-input w-full', placeholder: Spree.t(:first_name), required: true %>
20
+ </div>
21
+ <div>
22
+ <%= f.label :last_name, Spree.t(:last_name), class: 'text-xs text-neutral-600 block mb-2' %>
23
+ <%= f.text_field :last_name, class: 'text-input w-full', placeholder: Spree.t(:last_name), required: true %>
24
+ </div>
25
+ <div>
26
+ <%= f.label :phone, Spree.t(:phone), class: 'text-xs text-neutral-600 block mb-2' %>
27
+ <%= f.telephone_field :phone, class: 'text-input w-full', placeholder: Spree.t(:phone) %>
28
+ </div>
29
+ <div>
30
+ <%= f.label :email, Spree.t(:email), class: 'text-xs text-neutral-600 block mb-2' %>
31
+ <%= f.text_field :email, class: 'text-input w-full', placeholder: Spree.t(:email), required: true %>
32
+ </div>
33
+ <%= f.submit Spree.t(:update), class: 'btn-primary w-full mb-6' %>
34
+ <% end %>
35
+ </div>
36
+ </div>
@@ -0,0 +1,29 @@
1
+ <tr class="flex flex-wrap w-full md:table-row md:h-[72px] border border-accent md:border-none mb-4 p-4 md:p-0 hover:bg-accent-100" id="<%= dom_id(store_credit_event) %>">
2
+ <td class="mb-2 w-full md:w-auto md:px-4 md:border-y border-accent md:border-l font-medium">
3
+ <%= local_date(store_credit_event.created_at) %>
4
+ </td>
5
+
6
+ <td class="w-full md:w-auto md:px-4 md:border-y border-accent">
7
+ <span class="md:hidden font-medium mr-1"><%= Spree.t(:change) %>:</span>
8
+
9
+ <% if store_credit_event.allocation? || store_credit_event.credit? %>
10
+ <span class="badge-success">+<%= store_credit_event.display_amount %></span>
11
+ <% else %>
12
+ <span class="badge-warning">-<%= store_credit_event.display_amount %></span>
13
+ <% end %>
14
+ </td>
15
+
16
+ <td class="w-full md:w-auto md:px-4 md:border-y border-accent">
17
+ <span class="md:hidden font-medium mr-1"><%= Spree.t(:action) %>:</span>
18
+ <%= store_credit_event.display_action %>
19
+
20
+ <% if store_credit_event.captured? && store_credit_event.order.present? %>
21
+ (<%= link_to "#{Spree.t(:order)} ##{store_credit_event.order.number}", spree.account_order_path(store_credit_event.order), class: 'font-medium' %>)
22
+ <% end %>
23
+ </td>
24
+
25
+ <td class="w-full md:w-auto md:px-4 md:border-y md:border-r border-accent">
26
+ <span class="md:hidden font-medium mr-1"><%= Spree.t(:new_balance) %>:</span>
27
+ <%= store_credit_event.display_user_total_amount %>
28
+ </td>
29
+ </tr>
@@ -0,0 +1,31 @@
1
+ <div class="page-container grid grid-cols-1 lg:grid-cols-12 lg:gap-6 lg:mt-6">
2
+ <div class="lg:col-span-3">
3
+ <%= render 'spree/account/account_nav', current: 'store_credits' %>
4
+ </div>
5
+ <div class="lg:col-span-8 lg:col-start-5">
6
+ <div class="flex gap-4">
7
+ <div class="uppercase font-medium pb-2">
8
+ <%= Spree.t(:store_credits) %>
9
+ </div>
10
+ </div>
11
+ <% if @store_credit_events.any? %>
12
+ <p class="text-neutral-600 mb-3"><%= Spree.t('storefront.account.store_credits_history') %></p>
13
+
14
+ <table class="inline-table md:table table-auto overflow-scroll w-full text-sm border-separate border-spacing-y-4 mb-24 mt-4">
15
+ <thead class="hidden md:table-row-group">
16
+ <tr class="text-left text-neutral text-xs">
17
+ <th class="font-normal px-4"><%= Spree.t(:date) %></th>
18
+ <th class="font-normal px-4"><%= Spree.t(:change) %></th>
19
+ <th class="font-normal px-4"><%= Spree.t(:action) %></th>
20
+ <th class="font-normal px-4"><%= Spree.t(:balance) %></th>
21
+ </tr>
22
+ </thead>
23
+ <tbody class="block md:table-row-group">
24
+ <%= render collection: @store_credit_events, partial: 'spree/account/store_credits/store_credit_event', cached: spree_base_cache_scope %>
25
+ </tbody>
26
+ </table>
27
+ <% else %>
28
+ <p class="text-neutral-600"><%= Spree.t('storefront.account.no_store_credits') %></p>
29
+ <% end %>
30
+ </div>
31
+ </div>
@@ -0,0 +1,10 @@
1
+ <% cache spree_base_cache_scope.call(current_store) do %>
2
+ <div class="flex flex-col gap-4 text-sm">
3
+ <ul class="flex justify-center flex-wrap gap-4">
4
+ <%= link_to Spree.t(:privacy_policy), "/policies/privacy_policy", target: '_blank' if legal_policy('privacy_policy').present? %>
5
+ <%= link_to Spree.t(:terms_of_service), "/policies/terms_of_service", target: '_blank' if legal_policy('terms_of_service').present? %>
6
+ <%= link_to Spree.t(:returns_policy), "/policies/returns_policy", target: '_blank' if legal_policy('returns_policy').present? %>
7
+ <%= link_to Spree.t(:shipping_policy), "/policies/shipping_policy", target: '_blank' if legal_policy('shipping_policy').present? %>
8
+ </ul>
9
+ </div>
10
+ <% end %>