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
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a85a5314ccfde9abdbc6aa20b457c36dea85e8e84aab3098f5d9c5b9a86e60c6
4
+ data.tar.gz: 0a762fa040c55ffe89e0393072e5f3ce899230bbfbf106ef0aacc8a690dde0be
5
+ SHA512:
6
+ metadata.gz: eb5bdae6df97ff2a7bb407a6e274b9d4e73f69606ec310639a099f6273da4dca58820e78a0047f066e75b1a431bf333b38a342ac053a58c904fee1377ff8027d
7
+ data.tar.gz: 5da6d30f25e1e3d9e736f3254fab117c099395f47fe1c9f90ad79be016bea0c85d3bcf52c6c6b61c29038bb377c7ae2bdd29b3abce5608782390276b8513c5b2
data/LICENSE.md ADDED
@@ -0,0 +1,13 @@
1
+ # License
2
+
3
+ Copyright © 2024-present, Vendo Connect Inc.
4
+
5
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
6
+
7
+ This program is distributed in the hope that it will be useful,
8
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
+ GNU Affero General Public License for more details.
11
+
12
+ You should have received a copy of the GNU Affero General Public License
13
+ along with this program. If not, see [https://www.gnu.org/licenses/](https://www.gnu.org/licenses/).
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+ require 'rspec/core/rake_task'
5
+ require 'spree/testing_support/common_rake'
6
+
7
+ RSpec::Core::RakeTask.new
8
+
9
+ task default: :spec
10
+
11
+ desc "Generates a dummy app for testing"
12
+ task :test_app do
13
+ ENV['LIB_NAME'] = 'spree/storefront'
14
+ Rake::Task['common:test_app'].execute
15
+ end
@@ -0,0 +1,6 @@
1
+ //= link spree/storefront/application.js
2
+ //= link_tree ../../javascript/spree/storefront/controllers .js
3
+ //= link_tree ../../javascript/spree/storefront/helpers .js
4
+ //= link_tree ../../../vendor/javascript .js
5
+
6
+ //= link storefront_page_builder.css
@@ -0,0 +1,51 @@
1
+ .editor-overlay {
2
+ z-index: 1089;
3
+ width: 100%;
4
+ }
5
+
6
+ .editor-overlay-toolbar {
7
+ position: absolute;
8
+ top: -26px;
9
+ left: -1px;
10
+ background-color: #0081f1;
11
+ color: #fff;
12
+ padding: 4px 8px;
13
+ font-size: 12px;
14
+ font-weight: bold;
15
+ border-radius: 4px 4px 0 0;
16
+ cursor: pointer;
17
+ display: none;
18
+ }
19
+ .editor-overlay-toolbar {
20
+ right: 2px;
21
+ top: 2px;
22
+ left: auto;
23
+ cursor: auto;
24
+ z-index: 1091;
25
+ padding: 2px 2px;
26
+ border-radius: 4px;
27
+ }
28
+ .editor-overlay-toolbar button {
29
+ padding: 8px;
30
+ border-radius: 4px;
31
+ }
32
+ .editor-overlay-toolbar button:hover,
33
+ .editor-overlay-toolbar button:focus {
34
+ background-color: #0d53b5;
35
+ }
36
+ .editor-overlay:hover,
37
+ .editor-overlay:focus,
38
+ .editor-overlay-active,
39
+ .editor-overlay-hover {
40
+ border: 1px solid #2c6ecb;
41
+ }
42
+ .editor-overlay:focus,
43
+ .editor-overlay-active {
44
+ border-width: 3px !important;
45
+ }
46
+ .editor-overlay:hover .editor-overlay-toolbar,
47
+ .editor-overlay:focus .editor-overlay-toolbar,
48
+ .editor-overlay-active .editor-overlay-toolbar,
49
+ .editor-overlay-hover .editor-overlay-toolbar {
50
+ display: block;
51
+ }
@@ -0,0 +1,40 @@
1
+ module Spree
2
+ module CartMethods
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ before_action :merge_orders
7
+ before_action :check_authorization
8
+ end
9
+
10
+ private
11
+
12
+ def merge_orders
13
+ current_order&.reload if set_current_order
14
+ end
15
+
16
+ def assign_order_with_lock
17
+ @order = current_order(lock: true)
18
+ unless @order
19
+ flash[:error] = Spree.t(:order_not_found)
20
+ redirect_to spree.cart_path(order_token: order_token) and return
21
+ end
22
+ end
23
+
24
+ def check_authorization
25
+ return if current_order.nil?
26
+
27
+ authorize! :edit, current_order, order_token
28
+ end
29
+
30
+ def load_line_items
31
+ @line_items = if @order.nil? || @order.new_record?
32
+ []
33
+ elsif @order.line_items.loaded?
34
+ @order.line_items.sort_by(&:created_at).reverse
35
+ else
36
+ @order.line_items.includes(variant: { option_values: [:option_type] }).order(created_at: :desc)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,23 @@
1
+ module Spree
2
+ module LocaleUrls
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ before_action :redirect_to_default_locale
7
+ end
8
+
9
+ private
10
+
11
+ def default_url_options
12
+ locale = current_locale == current_store.default_locale ? nil : current_locale
13
+
14
+ super.merge(locale: locale, currency: currency_param)
15
+ end
16
+
17
+ def redirect_to_default_locale
18
+ return if params[:locale].blank? || supported_locale?(params[:locale])
19
+
20
+ redirect_to url_for(request.parameters.merge(locale: nil))
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,17 @@
1
+ module Spree
2
+ module PasswordProtected
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ before_action :redirect_to_password
7
+ end
8
+
9
+ def redirect_to_password
10
+ return if page_builder_enabled?
11
+ return if session[:password_valid]
12
+ return if turbo_frame_request?
13
+
14
+ redirect_to password_path, status: 307 if respond_to?(:current_store) && current_store && current_store.prefers_password_protected?
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,29 @@
1
+ module Spree
2
+ module ThemeConcern
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ helper 'spree/theme'
7
+ include Spree::ThemeHelper
8
+
9
+ prepend_before_action :set_theme_view_paths
10
+ end
11
+
12
+ def default_url_options
13
+ if current_theme.present? && current_theme_preview.present?
14
+ super.merge!(theme_id: current_theme.id, theme_preview_id: current_theme_preview.id)
15
+ elsif params[:theme_id].present? && params[:theme_preview_id].blank?
16
+ super.merge!(theme_id: params[:theme_id])
17
+ else
18
+ super
19
+ end
20
+ end
21
+
22
+ def set_theme_view_paths
23
+ # add default Spree theme
24
+ prepend_view_path [Spree::Storefront::Engine.root, 'app/views/themes/default'].join('/')
25
+ # add current theme
26
+ prepend_view_path "app/views/themes/#{current_theme.class.name.demodulize.underscore}"
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ module Spree
2
+ module Account
3
+ class AddressesController < BaseController
4
+ include Spree::AddressesHelper
5
+
6
+ # GET /account/addresses
7
+ def index
8
+ @addresses = user_available_addresses.includes(:user)
9
+ end
10
+
11
+ def accurate_title
12
+ Spree.t(:my_addresses)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ module Spree
2
+ module Account
3
+ class BaseController < Spree::StoreController
4
+ before_action :require_user
5
+ before_action :set_user
6
+
7
+ protected
8
+
9
+ def accurate_title
10
+ Spree.t(:my_account)
11
+ end
12
+
13
+ private
14
+
15
+ def set_user
16
+ @user = try_spree_current_user
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,34 @@
1
+ module Spree
2
+ module Account
3
+ class NewsletterController < BaseController
4
+ # GET /account/newsletter
5
+ def edit; end
6
+
7
+ # PUT /account/newsletter
8
+ def update
9
+ try_spree_current_user.update(newsletter_params)
10
+
11
+ event_properties = {
12
+ user: try_spree_current_user,
13
+ email: try_spree_current_user.email
14
+ }
15
+
16
+ if try_spree_current_user.accepts_email_marketing?
17
+ track_event('subscribed_to_newsletter', event_properties)
18
+ else
19
+ track_event('unsubscribed_from_newsletter', event_properties)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def newsletter_params
26
+ params.require(:user).permit(:accepts_email_marketing)
27
+ end
28
+
29
+ def accurate_title
30
+ Spree.t('storefront.account.newsletter_settings')
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ module Spree
2
+ module Account
3
+ class OrdersController < BaseController
4
+ # GET /account/orders
5
+ def index
6
+ @orders = orders_scope.order(created_at: :desc).page(params[:page]).per(25)
7
+ end
8
+
9
+ # GET /account/orders/:id
10
+ def show
11
+ @order = orders_scope.find_by!(number: params[:id])
12
+ @shipments = @order.shipments.includes(:stock_location, :address, selected_shipping_rate: :shipping_method, inventory_units: :line_item)
13
+ end
14
+
15
+ private
16
+
17
+ def accurate_title
18
+ if action_name == 'show'
19
+ "#{Spree.t(:order)} ##{@order.number}"
20
+ else
21
+ Spree.t(:my_orders)
22
+ end
23
+ end
24
+
25
+ def orders_scope
26
+ order_finder.new(user: try_spree_current_user, store: current_store).execute
27
+ end
28
+
29
+ def order_finder
30
+ Spree::Dependencies.completed_order_finder.constantize
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,23 @@
1
+ module Spree
2
+ module Account
3
+ class ProfileController < BaseController
4
+ # GET /account/profile
5
+ def edit; end
6
+
7
+ # PUT /account/profile
8
+ def update
9
+ if try_spree_current_user.update(user_params)
10
+ redirect_to spree.edit_account_profile_path, notice: Spree.t(:account_updated)
11
+ else
12
+ render :edit, status: :unprocessable_entity
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def user_params
19
+ params.require(:user).permit(:first_name, :last_name, :phone, :email)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ module Spree
2
+ module Account
3
+ class StoreCreditsController < BaseController
4
+ # GET /account/store_credits
5
+ def index
6
+ @store_credit_events = Spree::StoreCreditEvent.where(store_credit: user_store_credits).
7
+ exposed_events.
8
+ reverse_chronological.
9
+ page(params[:page]).per(25)
10
+ end
11
+
12
+ private
13
+
14
+ def accurate_title
15
+ Spree.t(:store_credits)
16
+ end
17
+
18
+ def user_store_credits
19
+ try_spree_current_user.store_credits
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,45 @@
1
+ module Spree
2
+ module Account
3
+ class WishedItemsController < BaseController
4
+ skip_before_action :verify_authenticity_token
5
+
6
+ # POST /account/wished_items
7
+ def create
8
+ variant = current_store.variants.find(wished_item_params[:variant_id])
9
+ @wished_item = current_wishlist.wished_items.build(variant: variant)
10
+
11
+ if @wished_item.save
12
+ track_event('product_added_to_wishlist', variant: variant)
13
+ else
14
+ flash.now[:error] = @wished_item.errors.full_messages.to_sentence.strip
15
+ end
16
+
17
+ respond_to do |format|
18
+ format.html { redirect_to spree.account_wishlist_path }
19
+ format.turbo_stream
20
+ end
21
+ end
22
+
23
+ def destroy
24
+ @wished_item = current_wishlist.wished_items.find_by!(variant_id: params[:id])
25
+
26
+ if @wished_item.destroy
27
+ track_event('product_removed_from_wishlist', variant: @wished_item.variant)
28
+ else
29
+ flash.now[:error] = Spree.t('storefront.wished_items.remove_error')
30
+ end
31
+
32
+ respond_to do |format|
33
+ format.html { redirect_to spree.account_wishlist_path }
34
+ format.turbo_stream
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def wished_item_params
41
+ params.require(:wished_item).permit(:variant_id)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,101 @@
1
+ module Spree
2
+ class AddressesController < Spree::StoreController
3
+ helper Spree::AddressesHelper
4
+ load_and_authorize_resource class: Spree::Address
5
+
6
+ def create
7
+ order_token = params[:order_token]
8
+ @order = current_store.orders.incomplete.not_canceled.find_by(token: order_token) if order_token.present?
9
+ result = create_service.call(
10
+ user: try_spree_current_user,
11
+ address_params: address_params,
12
+ default_billing: params[:default_billing].to_b,
13
+ default_shipping: params[:default_shipping].to_b,
14
+ order: @order
15
+ )
16
+ @address = result.value
17
+
18
+ if result.success?
19
+ if @order.present?
20
+ respond_to do |format|
21
+ format.html { redirect_to spree.checkout_state_path(order_token, 'address') }
22
+ format.turbo_stream do
23
+ render turbo_stream: turbo_stream.update('checkout_content', partial: 'spree/checkout/address', locals: { order: @order })
24
+ end
25
+ end
26
+ else
27
+ redirect_to spree.account_addresses_path, notice: Spree.t('address_book.successfully_created')
28
+ end
29
+ else
30
+ render action: 'new', status: :unprocessable_entity
31
+ end
32
+ end
33
+
34
+ def edit
35
+ store_location(request.env['HTTP_REFERER'])
36
+ end
37
+
38
+ def new
39
+ @address = Spree::Address.new(country: current_store.default_country, user: try_spree_current_user)
40
+ end
41
+
42
+ def update
43
+ @order = if params[:checkout].present?
44
+ current_store.orders.incomplete.not_canceled.find_by(token: params[:checkout])
45
+ else
46
+ try_spree_current_user.orders.incomplete.not_canceled.where(ship_address_id: @address.id).
47
+ or(try_spree_current_user.orders.incomplete.not_canceled.where(bill_address_id: @address.id)).take
48
+ end
49
+ result = update_service.call(
50
+ address: @address,
51
+ address_params: address_params,
52
+ default_billing: params[:default_billing].to_b,
53
+ default_shipping: params[:default_shipping].to_b,
54
+ order: @order,
55
+ address_changes_except: address_changes_except
56
+ )
57
+ @address = result.value
58
+
59
+ if result.success?
60
+ flash[:notice] = Spree.t('address_book.successfully_updated') unless turbo_frame_request?
61
+
62
+ if params[:checkout].present?
63
+ respond_to do |format|
64
+ format.turbo_stream do
65
+ render turbo_stream: turbo_stream.update('checkout_content', partial: 'spree/checkout/address', locals: { order: @order })
66
+ end
67
+ format.html { redirect_to spree.checkout_state_path(@order.token, 'address') }
68
+ end
69
+ else
70
+ redirect_back_or_default(spree.account_addresses_path)
71
+ end
72
+ else
73
+ render :edit, status: :unprocessable_entity
74
+ end
75
+ end
76
+
77
+ def destroy
78
+ @address.destroy
79
+
80
+ redirect_to(spree.account_addresses_path, status: :see_other, notice: Spree.t('address_book.successfully_removed'))
81
+ end
82
+
83
+ private
84
+
85
+ def address_params
86
+ params.require(:address).permit(permitted_address_attributes)
87
+ end
88
+
89
+ def create_service
90
+ Spree::Dependencies.address_create_service.constantize
91
+ end
92
+
93
+ def update_service
94
+ Spree::Dependencies.address_update_service.constantize
95
+ end
96
+
97
+ def address_changes_except
98
+ []
99
+ end
100
+ end
101
+ end