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,102 @@
1
+ <turbo-frame id="main-product-<%= product.id %>" target="_top">
2
+ <% current_variant = @selected_variant || @variant_from_options || product.first_or_default_variant(current_currency) %>
3
+ <div class="main-product-container" style="<%= section_styles(section) %>">
4
+ <div
5
+ class="page-container lg:mb-16"
6
+ <%= 'data-controller=product-form' %>
7
+ data-product-form-required-options-value='<%= product.option_type_ids.map(&:to_s).to_json %>'
8
+ data-product-form-selected-variant-disabled-value='<%= !@selected_variant&.in_stock? %>'
9
+ data-product-form-variant-from-options-disabled-value='<%= !@variant_from_options&.in_stock? %>'
10
+ data-product-form-frame-name-value="main-product-<%= product.id %>"
11
+ data-product-form-url-value="<%= spree.product_url(product) %>">
12
+ <template data-product-form-target="spinnerTemplate">
13
+ <%= render "spree/shared/icons/spinner" %>
14
+ </template>
15
+ <%= render 'spree/products/breadcrumbs', product: product, taxons: product_breadcrumb_taxons(product) %>
16
+ <div id="product-details-page" class="grid grid-cols-1 lg:grid-cols-12 gap-x-14">
17
+ <div class="lg:hidden">
18
+ <% if product.brand %>
19
+ <%= link_to spree.nested_taxons_path(product.brand), title: product.brand_name do %>
20
+ <h3 class="text-sm lg:mt-0 inline-block mb-1">
21
+ <%= product.brand_name %>
22
+ </h3>
23
+ <% end %>
24
+ <% end %>
25
+ <h1 class="text-2xl uppercase tracking-tight mb-4 font-medium">
26
+ <%= product.name %>
27
+ </h1>
28
+ <%= link_to spree.product_path(product), class: "text-2xl uppercase tracking-tight font-medium hidden" do %>
29
+ <%= product.name %>
30
+ <% end %>
31
+ <%=
32
+ render 'spree/products/price',
33
+ product: product,
34
+ use_variant: true,
35
+ selected_variant: @selected_variant,
36
+ price_class: "my-4 lg:text-lg lg:font-medium",
37
+ price_container_class: "w-full"
38
+ %>
39
+ </div>
40
+
41
+ <div class="lg:col-span-7 relative">
42
+ <% images = product_media_gallery_images(product, selected_variant: @selected_variant, variant_from_options: @variant_from_options) %>
43
+
44
+ <div class="lg:hidden mb-6">
45
+ <%= render 'spree/products/media_gallery', images: images, product: product %>
46
+ </div>
47
+ <div class="hidden lg:block" data-product-form-target="desktopMediaGallery">
48
+ <%= render 'spree/products/media_gallery', images: images, desktop: true, product: product %>
49
+ </div>
50
+ </div>
51
+
52
+ <div class="lg:col-span-5 lg:col-start-8">
53
+ <div data-controller='sticky-button' data-product-form-target="productDetails">
54
+ <div class="hidden lg:block">
55
+ <% if product.brand %>
56
+ <%= link_to spree.nested_taxons_path(product.brand), title: product.brand_name do %>
57
+ <h3 class="text-sm mt-3 lg:mt-0 inline-block uppercase">
58
+ <%= product.brand_name %>
59
+ </h3>
60
+ <% end %>
61
+ <% end %>
62
+ <h1 class="text-2xl uppercase tracking-tight mb-4 mt-2 font-medium">
63
+ <%= product.name %>
64
+ </h1>
65
+
66
+ <%=
67
+ render 'spree/products/price',
68
+ product: product,
69
+ use_variant: true,
70
+ selected_variant: @selected_variant,
71
+ price_class: "my-4 lg:text-lg lg:font-medium"
72
+ %>
73
+ </div>
74
+ <%= render 'spree/products/tags', product: product %>
75
+ <% show_waitlist_modal = spree.respond_to?(:waitlists_path) && current_variant.present? %>
76
+ <div
77
+ <% if show_waitlist_modal %>
78
+ data-controller="modal"
79
+ <% end %>
80
+ data-modal-allow-background-close="true"
81
+ class="h-full w-full waitlist-modal"
82
+ data-modal-backdrop-color-value="rgba(0,0,0,0.32)">
83
+ <%= form_with(url: spree.line_items_path, method: :post, data: { controller: "turbo-stream-form", product_form_target: "form" }) do |f| %>
84
+ <%= render 'spree/products/variant_picker', product: product, selected_variant: @selected_variant %>
85
+ <%= render 'spree/products/quantity_selector', product: product, selected_variant: @selected_variant %>
86
+ <div class="flex w-full my-5">
87
+ <%= render 'spree/products/add_to_cart_button', product: product, selected_variant: @selected_variant, sticky_button_classes: "w-full" %>
88
+ <%= render 'spree/products/add_to_wishlist', variant: current_variant, css_classes: 'btn-secondary ml-5 h-12 !py-0 !px-3 border-default', icon_size: 24 %>
89
+ </div>
90
+ <% end %>
91
+ <%= render 'spree/products/add_to_waitlist', variant: current_variant if show_waitlist_modal %>
92
+ </div>
93
+
94
+ <%= render 'spree/products/details', product: product %>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ </div>
100
+
101
+ <%= render 'spree/products/json_ld', product: product, selected_variant: @selected_variant %>
102
+ </turbo-frame>
@@ -0,0 +1,52 @@
1
+ <%= turbo_frame_tag :products_list do %>
2
+ <div class='page-container'>
3
+ <div class='flex justify-between'>
4
+ <div
5
+ data-controller='slideover'
6
+ data-slideover-invisible-class='-translate-x-full,opacity-0'
7
+ data-slideover-visible-class='translate-x-0,opacity-100'
8
+ data-slideover-active-target='#slideover-filters'
9
+ >
10
+ <%= button_tag(
11
+ type: 'button',
12
+ class: 'uppercase flex gap-2 text-sm items-center font-semibold py-3',
13
+ data: {
14
+ action: 'click->slideover#toggle click@window->slideover#hide'
15
+ }
16
+ ) do %>
17
+ <%= render 'spree/shared/icons/filter' %>
18
+ <%= Spree.t(:filter) %>
19
+ <% if products_selected_filters_count > 0 %>
20
+ <span class="font-normal opacity-50">(<%= products_selected_filters_count %>)</span>
21
+ <% end %>
22
+ <% end %>
23
+ <!-- begin sidebar/slideover -->
24
+ <div
25
+ data-slideover-target='overlay'
26
+ class='fixed inset-0 flex flex-row z-50 transition-opacity hidden'
27
+ >
28
+ <div class='fixed inset-0'>
29
+ <div data-action='click->slideover#toggle' class='absolute inset-0 bg-background opacity-75'></div>
30
+ </div>
31
+ <%= render 'spree/products/filters' %>
32
+ </div>
33
+ <!-- end sidebar/slideover -->
34
+ </div>
35
+
36
+ <%= render 'spree/products/sort' %>
37
+ </div>
38
+ </div>
39
+
40
+ <% if products %>
41
+ <div style='<%= section_styles(section) %>'>
42
+ <div class='page-container'>
43
+ <div class='grid gap-y-8 gap-x-4 grid-cols-2 lg:grid-cols-4 lg:gap-x-6 lg:gap-y-10 mb-7' id='products'>
44
+ <%= render 'spree/shared/products', products: products %>
45
+ </div>
46
+ </div>
47
+ <%= render 'spree/products/show_more_button' %>
48
+ </div>
49
+
50
+ <%= render 'spree/products/json_ld_list', products: products unless turbo_frame_request? %>
51
+ <% end %>
52
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <% loaded ||= false %>
2
+ <% products ||= [] %>
3
+
4
+ <% if section && loaded && products.present? %>
5
+ <div style="<%= section_styles(section) %>" class="animate-fadeIn">
6
+ <div class="page-container">
7
+ <%= render partial: 'spree/products/swiper', locals: {
8
+ section: section,
9
+ products: products,
10
+ heading: section.preferred_heading,
11
+ arrows_on_top: true
12
+ } %>
13
+ </div>
14
+ </div>
15
+ <% end %>
@@ -0,0 +1,18 @@
1
+ <% cache_unless page_builder_enabled?, spree_base_cache_scope.call(section) do %>
2
+ <div style="<%= section_styles(section) %>">
3
+ <div class="page-container rich-text">
4
+ <% section.blocks.each do |block| %>
5
+ <% case block.type %>
6
+ <% when 'Spree::PageBlocks::Heading' %>
7
+ <h2 class="w-full <%= block.preferred_size == 'small' ? 'text-xl' : (block.preferred_size == 'medium' ? 'text-xl' : 'text-4xl') %> rich-text--heading" <%= block_attributes(block) %>>
8
+ <%= block.text %>
9
+ </h2>
10
+ <% when 'Spree::PageBlocks::Text' %>
11
+ <div class="w-full rich-text--text" <%= block_attributes(block) %>>
12
+ <%= block.text %>
13
+ </div>
14
+ <% end %>
15
+ <% end %>
16
+ </div>
17
+ </div>
18
+ <% end %>
@@ -0,0 +1,37 @@
1
+ <% cache_unless page_builder_enabled?, [*spree_base_cache_scope.call(section), taxon].compact do %>
2
+ <div
3
+ style="<%= section_styles(section) %>"
4
+ id="taxon-banner-<%= taxon.id %>"
5
+ <%= 'data-turbo-permanent' unless page_builder_enabled? %>>
6
+ <div class="page-container">
7
+ <div class="lg:gap-6 lg:grid lg:grid-cols-12">
8
+ <% if taxon.image.present? %>
9
+ <div class="flex lg:col-span-7 lg:col-start-6 lg:order-1 lg:items-center lg:justify-end">
10
+ <% aspect_ratio_style = "aspect-ratio: #{as_aspect_ratio(taxon.image)};" %>
11
+ <%= image_tag main_app.cdn_image_url(taxon.image.variant(spree_image_variant_options(resize_to_limit: [720, 720]))), alt: taxon.name, class: 'w-full lg:max-h-[280px] h-full lg:w-auto mb-6', style: aspect_ratio_style, loading: :lazy %>
12
+ </div>
13
+ <% end %>
14
+ <div class="lg:col-span-5 flex flex-col justify-center items-start gap-1">
15
+ <div class="text-xs lg:text-sm tracking-widest" style="<%= section_heading_styles(section) %>"><%= taxon.taxonomy.name.singularize %></div>
16
+ <h1 class="self-stretch text-2xl lg:text-3xl font-medium" style="<%= section_heading_styles(section) %>"><%= taxon.name %></h1>
17
+ <% description_text = taxon.description.to_plain_text %>
18
+ <div
19
+ data-controller="read-more"
20
+ class="flex flex-col gap-4"
21
+ data-read-more-more-text-value="<%= Spree.t(:read_more) %>"
22
+ data-read-more-less-text-value="<%= Spree.t(:read_less) %>">
23
+ <div class="prose self-stretch text-lg font-normal <%= 'product-description-truncated' if description_text.length > 250 %>" data-read-more-target="content">
24
+ <%= taxon.description %>
25
+ </div>
26
+ <% if description_text.length > 250 %>
27
+ <%= button_tag Spree.t(:read_more),
28
+ type: 'button',
29
+ class: "font-bold underline",
30
+ data: { action: "read-more#toggle" } %>
31
+ <% end %>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ </div>
36
+ </div>
37
+ <% end %>
@@ -0,0 +1,103 @@
1
+ <% cache_unless page_builder_enabled?, [*spree_base_cache_scope.call(section), @taxons].compact do %>
2
+ <div style='<%= section_styles(section) %>'>
3
+ <h1 class='text-xl lg:text-2xl font-medium pb-8 page-container' style='<%= section_heading_styles(section) %>'>
4
+ <%= section.heading %>
5
+ </h1>
6
+
7
+ <div class='border-y border-default py-3'>
8
+ <ul class='page-container overflow-auto flex gap-2 items-center justify-between text-sm'>
9
+ <li>
10
+ <%= link_to '#', class: 'block !leading-4 py-2 transition-all duration-300 border-b-[1.5px] border-transparent hover:border-accent uppercase', data: { controller: 'scroll-to', 'scroll-to-offset-value': '100', 'scroll-to-behavior-value': 'smooth' } do %>
11
+ <%= Spree.t(:all) %>
12
+ <% end %>
13
+ </li>
14
+ <% @taxons_grouped_by_letter.each do |letter, taxons| %>
15
+ <li>
16
+ <% if taxons.present? %>
17
+ <%= link_to "##{letter}", class: 'block w-8 !leading-4 py-2 text-center transition-all duration-300 border-b-[1.5px] border-transparent hover:border-accent', data: { controller: 'scroll-to', 'scroll-to-offset-value': '100', 'scroll-to-behavior-value': 'smooth' } do %>
18
+ <%= letter %>
19
+ <% end %>
20
+ <% else %>
21
+ <span class='block w-8 !leading-4 py-2 text-center transition-all duration-300 border-b-[1.5px] border-transparent hover:border-accent text-neutral cursor-default'>
22
+ <%= letter %>
23
+ </span>
24
+ <% end %>
25
+ </li>
26
+ <% end %>
27
+ <li>
28
+ <% if @taxons_grouped_by_numbers.any? %>
29
+ <%= link_to '#0-9', class: 'block w-8 !leading-4 py-2 text-center transition-all duration-300 border-b-[1.5px] border-transparent hover:border-accent uppercase', data: { controller: 'scroll-to', 'scroll-to-offset-value': '100', 'scroll-to-behavior-value': 'smooth' } do %>
30
+ 0-9
31
+ <% end %>
32
+ <% else %>
33
+ <span class='block w-8 !leading-4 py-2 text-center transition-all duration-300 border-b-[1.5px] border-transparent hover:border-accent uppercase text-neutral cursor-default'>
34
+ 0-9
35
+ </span>
36
+ <% end %>
37
+ </li>
38
+ <li>
39
+ <% if @taxons_grouped_by_other.any? %>
40
+ <%= link_to '##', class: 'block !leading-4 py-2 text-center transition-all duration-300 border-b-[1.5px] border-transparent hover:border-accent uppercase', data: { controller: 'scroll-to', 'scroll-to-offset-value': '100', 'scroll-to-behavior-value': 'smooth' } do %>
41
+ <%= Spree.t(:other) %>
42
+ <% end %>
43
+ <% else %>
44
+ <span class='block !leading-4 py-2 text-center transition-all duration-300 border-b-[1.5px] border-transparent hover:border-accent uppercase text-neutral cursor-default'>
45
+ <%= Spree.t(:other) %>
46
+ </span>
47
+ <% end %>
48
+ </li>
49
+ </ul>
50
+ </div>
51
+
52
+ <div class='page-container mt-10 mb-10 lg:mb-16'>
53
+ <div class='grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3'>
54
+ <% @taxons_grouped_by_letter.each do |letter, taxons| %>
55
+ <div id='<%= letter %>' class='grid gap-6 grid-cols-3 lg:grid-cols-2 border-b border-default py-6 lg:pr-6'>
56
+ <p class='font-medium text-2xl<%= ' pointer-events-none opacity-30' unless taxons.present? %>'>
57
+ <%= letter %>
58
+ </p>
59
+ <% if taxons.present? %>
60
+ <ul class='col-span-2 lg:col-span-1'>
61
+ <% taxons.each do |taxon| %>
62
+ <li>
63
+ <%= link_to taxon.name, spree.nested_taxons_path(taxon), class: 'block py-1 border-b-[1.5px] border-transparent hover:border-accent transition-all duration-300' %>
64
+ </li>
65
+ <% end %>
66
+ </ul>
67
+ <% end %>
68
+ </div>
69
+ <% end %>
70
+
71
+ <div id='0-9' class='grid gap-6 grid-cols-3 lg:grid-cols-2 border-b border-default py-6'>
72
+ <p class='font-medium text-2xl uppercase<%= ' pointer-events-none opacity-30' unless @taxons_grouped_by_numbers.any? %>'>
73
+ 0-9
74
+ </p>
75
+ <ul class='col-span-2 lg:col-span-1'>
76
+ <% @taxons_grouped_by_numbers.each do |_, taxons| %>
77
+ <% taxons.each do |taxon| %>
78
+ <li>
79
+ <%= link_to taxon.name, spree.nested_taxons_path(taxon), class: 'block py-1 border-b-[1.5px] border-transparent hover:border-accent transition-all duration-300' %>
80
+ </li>
81
+ <% end %>
82
+ <% end %>
83
+ </ul>
84
+ </div>
85
+
86
+ <div id='#' class='grid gap-6 grid-cols-3 lg:grid-cols-2 border-b border-default py-6'>
87
+ <p class='font-medium text-2xl uppercase<%= ' pointer-events-none opacity-30' unless @taxons_grouped_by_other.any? %>'>
88
+ <%= Spree.t(:other) %>
89
+ </p>
90
+ <ul class='col-span-2 lg:col-span-1'>
91
+ <% @taxons_grouped_by_other.each do |_, taxons| %>
92
+ <% taxons.each do |taxon| %>
93
+ <li>
94
+ <%= link_to taxon.name, spree.nested_taxons_path(taxon), class: 'block py-1 border-b-[1.5px] border-transparent hover:border-accent transition-all duration-300' %>
95
+ </li>
96
+ <% end %>
97
+ <% end %>
98
+ </ul>
99
+ </div>
100
+ </div>
101
+ </div>
102
+ </div>
103
+ <% end %>
@@ -0,0 +1,27 @@
1
+ <% cache_unless page_builder_enabled?, spree_base_cache_scope.call(section) do %>
2
+ <% separated_vertically = section.preferred_separated == 'vertically' %>
3
+
4
+ <div style="<%= section_styles(section) %>">
5
+ <div class="page-container">
6
+ <div class="<%= 'lg:grid lg:grid-cols-12 lg:gap-6' if separated_vertically %>">
7
+ <div class="<%= 'lg:col-span-6' if separated_vertically %>">
8
+ <% section.blocks.includes(:rich_text_text).each do |block| %>
9
+ <h2 class="text-center <%= 'lg:text-left' if separated_vertically %> <%= block.preferred_size == 'small' ? 'text-lg' : (block.preferred_size == 'medium' ? 'text-xl' : 'text-2xl lg:text-3xl') %> font-medium" <%= block_attributes(block) %>>
10
+ <%= block.text %>
11
+ </h2>
12
+ <% end %>
13
+ </div>
14
+
15
+ <% if section.video_embed.present? %>
16
+ <div class="<%= 'lg:col-span-5' if separated_vertically %>">
17
+ <div class="mx-auto <%= 'lg:mr-0' if separated_vertically %> rounded overflow-hidden">
18
+ <div class="video-embed-container">
19
+ <%= section.video_embed.raw_html.html_safe %>
20
+ </div>
21
+ </div>
22
+ </div>
23
+ <% end %>
24
+ </div>
25
+ </div>
26
+ </div>
27
+ <% end %>
@@ -0,0 +1,49 @@
1
+ <% if section.blocks.any? %>
2
+ <% section.blocks.includes(:links).each do |block| %>
3
+ <% presenter = Spree::MegaNavPresenter.new(block) %>
4
+ <% main_link = presenter.main_link %>
5
+ <% next unless main_link.present? %>
6
+ <div class="header--nav-item group" <%= block_attributes(block, allowed_styles: ['padding-top', 'padding-bottom']) %>>
7
+ <%= active_link_to spree_storefront_resource_url(main_link.linkable || main_link), data: { title: main_link.label.downcase.strip }, class: "shrink-0 menu-item header--nav-link px-4 py-1", class_active: "menu-item--active", target: main_link.open_in_new_tab.presence && "_blank", rel: main_link.open_in_new_tab.presence && "noopener noreferrer" do %>
8
+ <span class="group-hover:border-b-[1.5px] group-hover:border-b-accent"><%= main_link.label %></span>
9
+ <% end %>
10
+ <% if presenter.columns.any? %>
11
+ <div class="w-full bg-transparent invisible absolute translate-y-[10%] group-hover:translate-y-0 left-0 group-hover:opacity-100 opacity-0 group-hover:visible transition-none border-default border-b duration-150 ease-in block pointer-events-none group-hover:pointer-events-auto z-10 header--mega-nav-container" style="--bottom-padding: <%= section.preferred_bottom_padding %>px; --top-without-bottom-padding: calc(100% - var(--bottom-padding)); padding-top: calc(var(--bottom-padding) + var(--section--border-bottom-width)); top: var(--top-without-bottom-padding);">
12
+ <div class="bg-section-background">
13
+ <div class="page-container py-6 grid grid-cols-4 gap-5">
14
+ <% presenter.columns.each do |column| %>
15
+ <div class="flex flex-col">
16
+ <h6 class="uppercase text-sm tracking-widest px-2 font-semibold mb-5"><%= column.title %></h6>
17
+ <% column.links.each do |link| %>
18
+ <div class="p-2">
19
+ <%= page_builder_link_to link, data: { title: link.label.downcase.strip }, class: "shrink-0 menu-item !normal-case header--nav-link", target: link.open_in_new_tab.presence && "_blank", rel: link.open_in_new_tab.presence && "noopener noreferrer" do %>
20
+ <span><%= link.label %></span>
21
+ <% end %>
22
+ </div>
23
+ <% end %>
24
+ <%= link_to Spree.t(:view_all), spree_storefront_resource_url(column.view_all_linkable), class: "py-3 px-2 uppercase text-sm inline-block tracking-widest font-semibold" %>
25
+ </div>
26
+ <% end %>
27
+ <% if block.try(:featured_taxon) %>
28
+ <% cache spree_base_cache_scope.call(block.featured_taxon) do %>
29
+ <% if block.featured_taxon.image.attached? && block.featured_taxon.image.variable? %>
30
+ <%= link_to spree_storefront_resource_url(block.featured_taxon), class: "flex flex-col col-start-4" do %>
31
+ <%= image_tag main_app.cdn_image_url(block.featured_taxon.image.variant(spree_image_variant_options(resize_to_fill: [700, 700]))), class: 'w-full h-auto aspect-1', loading: :lazy, alt: block.featured_taxon.name %>
32
+ <span class="py-3 px-2 bg-accent block uppercase text-sm tracking-widest font-semibold header--mega-nav-featured-taxon-title"><%= Spree.t(:explore_taxon, taxon_name: block.featured_taxon.name) %></span>
33
+ <% end %>
34
+ <% end %>
35
+ <% end %>
36
+ <% end %>
37
+ </div>
38
+ </div>
39
+ </div>
40
+ <% end %>
41
+ </div>
42
+ <% end %>
43
+ <% else %>
44
+ <% section.links.each do |link| %>
45
+ <%= active_link_to spree_storefront_resource_url(link.linkable || link), data: { title: link.label.downcase.strip }, class: "shrink-0 menu-item header--nav-link px-4 py-1 focus:mx-0 focus:px-4", class_active: "menu-item--active", target: link.open_in_new_tab.presence && "_blank", rel: link.open_in_new_tab.presence && "noopener noreferrer", **link_attributes(link, as_html: false) do %>
46
+ <span><%= link.label %></span>
47
+ <% end %>
48
+ <% end %>
49
+ <% end %>
@@ -0,0 +1,136 @@
1
+ <div class="bg-background mt-4 border-default border-t overflow-x-hidden h-full w-screen overflow-y-hidden">
2
+ <div class="h-full flex transform has-[.currency-and-locale-modal:not(.hidden)]:transform-none relative transition-transform duration-300" data-controller="mobile-nav">
3
+ <div class="w-screen shrink-0 flex flex-col h-full flex-grow-0">
4
+ <div class="flex-grow overflow-y-scroll">
5
+ <% if section.blocks.any? %>
6
+ <% section.blocks.each do |block| %>
7
+ <% presenter = Spree::MegaNavPresenter.new(block) %>
8
+ <% main_link = presenter.main_link %>
9
+ <% next unless main_link.present? %>
10
+ <% if presenter.columns.any? %>
11
+ <button
12
+ data-action="click->mobile-nav#openSubmenu touch->mobile-nav#openSubmenu"
13
+ data-title="<%= main_link.label.downcase.strip %>"
14
+ class='text-base text-left tracking-widest p-4 w-full uppercase border-default border-b flex justify-between items-center header--nav-link'>
15
+ <%= main_link.label %>
16
+ <%= render 'spree/shared/icons/chevron_right', size: 12 %>
17
+ <template>
18
+ <button data-action="click->mobile-nav#closeSubmenu touch->mobile-nav#closeSubmenu" class='flex gap-2 items-center text-base font-medium text-left tracking-widest p-4 w-full uppercase border-default border-b header--mega-nav-close-submenu bg-background sticky top-0'>
19
+ <%= render 'spree/shared/icons/chevron', size: 12 %>
20
+ <%= main_link.label %>
21
+ </button>
22
+ <div class="p-4 pt-0 w-full gap-2 flex flex-col">
23
+ <% if block.try(:featured_taxon) %>
24
+ <% cache spree_base_cache_scope.call(block.featured_taxon) do %>
25
+ <% if block.featured_taxon.image.attached? && block.featured_taxon.image.variable? %>
26
+ <%= link_to spree_storefront_resource_url(block.featured_taxon), class: "flex w-full pt-4" do %>
27
+ <%= image_tag main_app.cdn_image_url(block.featured_taxon.image.variant(spree_image_variant_options(resize_to_fill: [280, 280]))), class: 'h-auto aspect-1 w-2/5 max-w-[140px]', loading: :lazy, alt: block.featured_taxon.name %>
28
+ <span class="bg-accent w-full flex items-center justify-center header--mega-nav-featured-taxon-title text-sm tracking-widest font-semibold uppercase">
29
+ <%= Spree.t(:explore_taxon, taxon_name: block.featured_taxon.name) %>
30
+ </span>
31
+ <% end %>
32
+ <% end %>
33
+ <% end %>
34
+ <% end %>
35
+ <% presenter.columns.each do |column| %>
36
+ <div
37
+ data-controller='toggle'
38
+ data-toggle-class='hidden'
39
+ class="w-full flex flex-col gap-2">
40
+ <% unless presenter.columns.size == 1 %>
41
+ <button
42
+ type="button"
43
+ class="text-base font-semibold tracking-widest uppercase w-full inline-flex justify-between py-3"
44
+ data-action='click->toggle#toggle touch->toggle#toggle'>
45
+ <%= column.title %>
46
+ <span data-toggle-target='toggleable'>
47
+ <%= render 'spree/shared/icons/chevron_down' %>
48
+ </span>
49
+ <span data-toggle-target='toggleable' class="hidden rotate-180">
50
+ <%= render 'spree/shared/icons/chevron_down' %>
51
+ </span>
52
+ </button>
53
+ <% end %>
54
+ <div
55
+ class="<%= class_names(hidden: presenter.columns.size != 1) %>"
56
+ data-toggle-target='toggleable'>
57
+ <% column.links.each do |link| %>
58
+ <%= page_builder_link_to link, data: { title: link.label.downcase.strip }, class: "block text-base py-3 w-full uppercase header--nav-link", target: link.open_in_new_tab.presence && "_blank", rel: link.open_in_new_tab.presence && "noopener noreferrer" do %>
59
+ <span><%= link.label %></span>
60
+ <% end %>
61
+ <% end %>
62
+ </div>
63
+ </div>
64
+ <% end %>
65
+ </div>
66
+ </template>
67
+ </button>
68
+ <% else %>
69
+ <%= page_builder_link_to main_link, data: { title: main_link.label.downcase.strip }, class: "block text-base tracking-widest p-4 w-full uppercase border-default border-b header--nav-link", target: main_link.open_in_new_tab.presence && "_blank", rel: main_link.open_in_new_tab.presence && "noopener noreferrer" do %>
70
+ <span><%= main_link.label %></span>
71
+ <% end %>
72
+ <% end %>
73
+ <% end %>
74
+ <% else %>
75
+ <% section.links.each do |link| %>
76
+ <%= page_builder_link_to link, data: { title: link.label.downcase.strip }, class: "block text-base tracking-widest p-4 w-full uppercase border-default border-b header--nav-link", target: link.open_in_new_tab.presence && "_blank", rel: link.open_in_new_tab.presence && "noopener noreferrer" do %>
77
+ <span><%= link.label %></span>
78
+ <% end %>
79
+ <% end %>
80
+ <% end %>
81
+ </div>
82
+ <div class='p-4 bg-accent'>
83
+ <% if try_spree_current_user %>
84
+ <%= link_to spree.account_path, class: 'btn-secondary gap-2 flex justify-center items-center w-full' do %>
85
+ <span><%= Spree.t(:my_account) %></span>
86
+ <%= render 'spree/shared/icons/account' %>
87
+ <% end %>
88
+
89
+ <% if defined?(spree_logout_path) %>
90
+ <%= link_to spree_logout_path, method: :delete, data: { turbo_method: :delete }, class: 'btn-secondary gap-2 flex justify-center items-center w-full mt-2' do %>
91
+ <%= Spree.t(:sign_out) %>
92
+ <% end %>
93
+ <% end %>
94
+ <% else %>
95
+ <button
96
+ id='mobile-menu'
97
+ data-action='click->slideover-account#toggle click@window->slideover-account#hide click->toggle-menu#hide touch->toggle-menu#hide'
98
+ class='btn-secondary gap-2 flex justify-center items-center w-full'>
99
+ <span><%= Spree.t(:my_account) %></span>
100
+ <%= render 'spree/shared/icons/account' %>
101
+ </button>
102
+ <% end %>
103
+
104
+ <% if should_render_currency_dropdown? || should_render_locale_dropdown? %>
105
+ <div class="flex mt-4 justify-end">
106
+ <div
107
+ data-controller="modal"
108
+ data-modal-allow-background-close="true"
109
+ data-modal-
110
+ class=""
111
+ data-modal-backdrop-color-value="rgba(0,0,0,0.32)">
112
+ <%= button_tag class: 'flex gap-2 items-center', data: {action: 'modal#open'} do %>
113
+ <% if should_render_currency_dropdown? %>
114
+ <span>
115
+ <%= "#{current_currency} (#{currency_money(current_currency).symbol})" %>
116
+ </span>
117
+ <% end %>
118
+ <% if should_render_locale_dropdown? %>
119
+ <span class="uppercase <%= should_render_currency_dropdown?.presence && "border-l pl-2" %> flex items-center gap-1">
120
+ <% country_code = current_locale.to_s.split("-").last %>
121
+ <%= svg_country_icon(country_code) %>
122
+ <span ><%= country_code %></span>
123
+ </span>
124
+ <% end %>
125
+ <% end %>
126
+ <%= turbo_frame_tag :settings_modal, src: spree.settings_path, loading: :eager %>
127
+ </div>
128
+ </div>
129
+ <% end %>
130
+ </div>
131
+ </div>
132
+ <% if section.blocks.any? %>
133
+ <div class="w-screen shrink-0 relative overflow-y-scroll" data-mobile-nav-target="submenuContainer"></div>
134
+ <% end %>
135
+ </div>
136
+ </div>
@@ -0,0 +1,11 @@
1
+ <div class="page-container py-12">
2
+ <h1 class="text-2xl tracking-tight text-center lg:text-left mb-3 uppercase">
3
+ <%= params[:id].titleize %>
4
+ </h1>
5
+ <p class="mb-8 text-center lg:text-left">
6
+ Last update: <%= @policy&.updated_at&.strftime('%d/%m/%Y') %>
7
+ </p>
8
+ <div class="mb-5">
9
+ <%= @policy&.to_s %>
10
+ </div>
11
+ </div>
@@ -0,0 +1,20 @@
1
+ <script type="application/ld+json" data-test-id="post-json-ld">
2
+ {
3
+ "@context": "https://schema.org",
4
+ "@type": "BlogPosting",
5
+ "headline": "<%= post.title %>",
6
+ "image": <%= post.image.attached? ? [main_app.cdn_image_url(post.image.variant(spree_image_variant_options(resize_to_limit: [1200, 675])))].to_json.html_safe : [].to_json.html_safe %>,
7
+ "datePublished": "<%= post.published_at&.iso8601 %>",
8
+ "dateModified": "<%= post.updated_at&.iso8601 %>",
9
+ "author": [
10
+ {
11
+ "@type": "Person",
12
+ "name": "<%= post.author_name %>"
13
+ }
14
+ ]
15
+ }
16
+ </script>
17
+
18
+ <script type="application/ld+json" data-test-id="post-breadcrumbs-json-ld">
19
+ <%= posts_json_ld_breadcrumbs(post).to_json.html_safe %>
20
+ </script>
@@ -0,0 +1 @@
1
+ <%= paginate @posts, theme: 'storefront', outer_window: 1, inner_window: 2 %>
@@ -0,0 +1,13 @@
1
+ <div id="<%= dom_id(post) %>">
2
+ <%= link_to spree.post_path(post), class: 'block hover:opacity-70 transition-opacity' do %>
3
+ <div class="h-[200px] w-full bg-gray-100">
4
+ <% if post.image.attached? && post.image.variable? %>
5
+ <%= image_tag main_app.cdn_image_url(post.image.variant(spree_image_variant_options(resize_to_fit: [nil, 800]))), height: 400, class: 'h-full w-full object-cover object-center', loading: :lazy, alt: post.title %>
6
+ <% end %>
7
+ </div>
8
+
9
+ <h1 class="uppercase text-lg font-medium mt-4"><%= post.title %></h1>
10
+ <div class="mt-2 text-sm"><%= local_time(post.published_at, '%B %e, %Y') %></div>
11
+ <div class="mt-4"><%= post.shortened_description %></div>
12
+ <% end %>
13
+ </div>