jigsaw_engine 0.4.0

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 (759) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +18 -0
  3. data/Rakefile +6 -0
  4. data/app/assets/stylesheets/jigsaw/grid_resize.css +21 -0
  5. data/app/assets/stylesheets/jigsaw/layout_editor.css +356 -0
  6. data/app/components/custom_module_component.rb +38 -0
  7. data/app/controllers/jigsaw/application_controller.rb +5 -0
  8. data/app/controllers/jigsaw/dashboard_controller.rb +8 -0
  9. data/app/controllers/jigsaw/layout_templates_controller.rb +73 -0
  10. data/app/controllers/jigsaw/pages_controller.rb +114 -0
  11. data/app/controllers/jigsaw/slot_templates_controller.rb +71 -0
  12. data/app/controllers/jigsaw/slots_controller.rb +54 -0
  13. data/app/helpers/jigsaw/custom_module_helper.rb +7 -0
  14. data/app/helpers/jigsaw/pages_helper.rb +7 -0
  15. data/app/javascript/jigsaw/components/ui/button.js +53 -0
  16. data/app/javascript/jigsaw/components/ui/dropdown-menu.js +157 -0
  17. data/app/javascript/jigsaw/components/ui/sheet.js +122 -0
  18. data/app/javascript/jigsaw/components/ui/utils.js +8 -0
  19. data/app/javascript/jigsaw/controllers/custom_module_controller.js +75 -0
  20. data/app/javascript/jigsaw/controllers/custom_page_controller.js +23 -0
  21. data/app/javascript/jigsaw/controllers/flyout_resize_controller.js +60 -0
  22. data/app/javascript/jigsaw/controllers/grid_resize_controller.js +228 -0
  23. data/app/javascript/jigsaw/controllers/layout_editor_controller.js +502 -0
  24. data/app/javascript/jigsaw/controllers/module_editor_controller.js +146 -0
  25. data/app/javascript/jigsaw/controllers/monaco_editor_controller.js +49 -0
  26. data/app/javascript/jigsaw/lib/generate_layout_css.js +52 -0
  27. data/app/javascript/seeds/blocks/authentication-forms-1/config.json +1 -0
  28. data/app/javascript/seeds/blocks/authentication-forms-1/data.js +1 -0
  29. data/app/javascript/seeds/blocks/authentication-forms-1/render.jsx +80 -0
  30. data/app/javascript/seeds/blocks/authentication-forms-2/config.json +1 -0
  31. data/app/javascript/seeds/blocks/authentication-forms-2/data.js +1 -0
  32. data/app/javascript/seeds/blocks/authentication-forms-2/render.jsx +90 -0
  33. data/app/javascript/seeds/blocks/authentication-forms-3/config.json +1 -0
  34. data/app/javascript/seeds/blocks/authentication-forms-3/data.js +1 -0
  35. data/app/javascript/seeds/blocks/authentication-forms-3/render.jsx +94 -0
  36. data/app/javascript/seeds/blocks/authentication-forms-4/config.json +1 -0
  37. data/app/javascript/seeds/blocks/authentication-forms-4/data.js +1 -0
  38. data/app/javascript/seeds/blocks/authentication-forms-4/render.jsx +97 -0
  39. data/app/javascript/seeds/blocks/authentication-forms-5/config.json +1 -0
  40. data/app/javascript/seeds/blocks/authentication-forms-5/data.js +1 -0
  41. data/app/javascript/seeds/blocks/authentication-forms-5/render.jsx +82 -0
  42. data/app/javascript/seeds/blocks/authentication-forms-6/config.json +1 -0
  43. data/app/javascript/seeds/blocks/authentication-forms-6/data.js +1 -0
  44. data/app/javascript/seeds/blocks/authentication-forms-6/render.jsx +34 -0
  45. data/app/javascript/seeds/blocks/dashboard-ui/charts-1/config.json +1 -0
  46. data/app/javascript/seeds/blocks/dashboard-ui/charts-1/data.js +1 -0
  47. data/app/javascript/seeds/blocks/dashboard-ui/charts-1/render.jsx +98 -0
  48. data/app/javascript/seeds/blocks/dashboard-ui/charts-10/config.json +1 -0
  49. data/app/javascript/seeds/blocks/dashboard-ui/charts-10/data.js +1 -0
  50. data/app/javascript/seeds/blocks/dashboard-ui/charts-10/render.jsx +181 -0
  51. data/app/javascript/seeds/blocks/dashboard-ui/charts-11/config.json +1 -0
  52. data/app/javascript/seeds/blocks/dashboard-ui/charts-11/data.js +1 -0
  53. data/app/javascript/seeds/blocks/dashboard-ui/charts-11/render.jsx +184 -0
  54. data/app/javascript/seeds/blocks/dashboard-ui/charts-12/config.json +1 -0
  55. data/app/javascript/seeds/blocks/dashboard-ui/charts-12/data.js +1 -0
  56. data/app/javascript/seeds/blocks/dashboard-ui/charts-12/render.jsx +180 -0
  57. data/app/javascript/seeds/blocks/dashboard-ui/charts-13/config.json +1 -0
  58. data/app/javascript/seeds/blocks/dashboard-ui/charts-13/data.js +1 -0
  59. data/app/javascript/seeds/blocks/dashboard-ui/charts-13/render.jsx +151 -0
  60. data/app/javascript/seeds/blocks/dashboard-ui/charts-14/config.json +1 -0
  61. data/app/javascript/seeds/blocks/dashboard-ui/charts-14/data.js +1 -0
  62. data/app/javascript/seeds/blocks/dashboard-ui/charts-14/render.jsx +169 -0
  63. data/app/javascript/seeds/blocks/dashboard-ui/charts-15/config.json +1 -0
  64. data/app/javascript/seeds/blocks/dashboard-ui/charts-15/data.js +1 -0
  65. data/app/javascript/seeds/blocks/dashboard-ui/charts-15/render.jsx +115 -0
  66. data/app/javascript/seeds/blocks/dashboard-ui/charts-16/config.json +1 -0
  67. data/app/javascript/seeds/blocks/dashboard-ui/charts-16/data.js +1 -0
  68. data/app/javascript/seeds/blocks/dashboard-ui/charts-16/render.jsx +128 -0
  69. data/app/javascript/seeds/blocks/dashboard-ui/charts-17/config.json +1 -0
  70. data/app/javascript/seeds/blocks/dashboard-ui/charts-17/data.js +1 -0
  71. data/app/javascript/seeds/blocks/dashboard-ui/charts-17/render.jsx +84 -0
  72. data/app/javascript/seeds/blocks/dashboard-ui/charts-18/config.json +1 -0
  73. data/app/javascript/seeds/blocks/dashboard-ui/charts-18/data.js +1 -0
  74. data/app/javascript/seeds/blocks/dashboard-ui/charts-18/render.jsx +139 -0
  75. data/app/javascript/seeds/blocks/dashboard-ui/charts-19/config.json +1 -0
  76. data/app/javascript/seeds/blocks/dashboard-ui/charts-19/data.js +1 -0
  77. data/app/javascript/seeds/blocks/dashboard-ui/charts-19/render.jsx +146 -0
  78. data/app/javascript/seeds/blocks/dashboard-ui/charts-2/config.json +1 -0
  79. data/app/javascript/seeds/blocks/dashboard-ui/charts-2/data.js +1 -0
  80. data/app/javascript/seeds/blocks/dashboard-ui/charts-2/render.jsx +163 -0
  81. data/app/javascript/seeds/blocks/dashboard-ui/charts-20/config.json +1 -0
  82. data/app/javascript/seeds/blocks/dashboard-ui/charts-20/data.js +1 -0
  83. data/app/javascript/seeds/blocks/dashboard-ui/charts-20/render.jsx +71 -0
  84. data/app/javascript/seeds/blocks/dashboard-ui/charts-3/config.json +1 -0
  85. data/app/javascript/seeds/blocks/dashboard-ui/charts-3/data.js +1 -0
  86. data/app/javascript/seeds/blocks/dashboard-ui/charts-3/render.jsx +122 -0
  87. data/app/javascript/seeds/blocks/dashboard-ui/charts-4/config.json +1 -0
  88. data/app/javascript/seeds/blocks/dashboard-ui/charts-4/data.js +1 -0
  89. data/app/javascript/seeds/blocks/dashboard-ui/charts-4/render.jsx +136 -0
  90. data/app/javascript/seeds/blocks/dashboard-ui/charts-5/config.json +1 -0
  91. data/app/javascript/seeds/blocks/dashboard-ui/charts-5/data.js +1 -0
  92. data/app/javascript/seeds/blocks/dashboard-ui/charts-5/render.jsx +294 -0
  93. data/app/javascript/seeds/blocks/dashboard-ui/charts-6/config.json +1 -0
  94. data/app/javascript/seeds/blocks/dashboard-ui/charts-6/data.js +1 -0
  95. data/app/javascript/seeds/blocks/dashboard-ui/charts-6/render.jsx +139 -0
  96. data/app/javascript/seeds/blocks/dashboard-ui/charts-7/config.json +1 -0
  97. data/app/javascript/seeds/blocks/dashboard-ui/charts-7/data.js +1 -0
  98. data/app/javascript/seeds/blocks/dashboard-ui/charts-7/render.jsx +219 -0
  99. data/app/javascript/seeds/blocks/dashboard-ui/charts-8/config.json +1 -0
  100. data/app/javascript/seeds/blocks/dashboard-ui/charts-8/data.js +1 -0
  101. data/app/javascript/seeds/blocks/dashboard-ui/charts-8/render.jsx +249 -0
  102. data/app/javascript/seeds/blocks/dashboard-ui/charts-9/config.json +1 -0
  103. data/app/javascript/seeds/blocks/dashboard-ui/charts-9/data.js +1 -0
  104. data/app/javascript/seeds/blocks/dashboard-ui/charts-9/render.jsx +213 -0
  105. data/app/javascript/seeds/blocks/dashboard-ui/form-layouts-1/config.json +1 -0
  106. data/app/javascript/seeds/blocks/dashboard-ui/form-layouts-1/data.js +1 -0
  107. data/app/javascript/seeds/blocks/dashboard-ui/form-layouts-1/render.jsx +434 -0
  108. data/app/javascript/seeds/blocks/dashboard-ui/form-layouts-2/config.json +1 -0
  109. data/app/javascript/seeds/blocks/dashboard-ui/form-layouts-2/data.js +1 -0
  110. data/app/javascript/seeds/blocks/dashboard-ui/form-layouts-2/render.jsx +332 -0
  111. data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-1/config.json +1 -0
  112. data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-1/data.js +1 -0
  113. data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-1/render.jsx +121 -0
  114. data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-2/config.json +1 -0
  115. data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-2/data.js +1 -0
  116. data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-2/render.jsx +99 -0
  117. data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-3/config.json +1 -0
  118. data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-3/data.js +1 -0
  119. data/app/javascript/seeds/blocks/dashboard-ui/modal-dialogs-3/render.jsx +176 -0
  120. data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-1/config.json +1 -0
  121. data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-1/data.js +1 -0
  122. data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-1/render.jsx +20 -0
  123. data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-2/config.json +1 -0
  124. data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-2/data.js +1 -0
  125. data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-2/render.jsx +22 -0
  126. data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-3/config.json +1 -0
  127. data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-3/data.js +1 -0
  128. data/app/javascript/seeds/blocks/dashboard-ui/page-layouts-3/render.jsx +22 -0
  129. data/app/javascript/seeds/blocks/dashboard-ui/sidebar-layouts-1/config.json +1 -0
  130. data/app/javascript/seeds/blocks/dashboard-ui/sidebar-layouts-1/data.js +1 -0
  131. data/app/javascript/seeds/blocks/dashboard-ui/sidebar-layouts-1/render.jsx +20 -0
  132. data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-1/config.json +1 -0
  133. data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-1/data.js +1 -0
  134. data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-1/render.jsx +98 -0
  135. data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-2/config.json +1 -0
  136. data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-2/data.js +1 -0
  137. data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-2/render.jsx +116 -0
  138. data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-3/config.json +1 -0
  139. data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-3/data.js +1 -0
  140. data/app/javascript/seeds/blocks/dashboard-ui/sign-in-forms-3/render.jsx +104 -0
  141. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-1/config.json +1 -0
  142. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-1/data.js +1 -0
  143. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-1/render.jsx +147 -0
  144. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-2/config.json +1 -0
  145. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-2/data.js +1 -0
  146. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-2/render.jsx +120 -0
  147. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-3/config.json +1 -0
  148. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-3/data.js +1 -0
  149. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-3/render.jsx +62 -0
  150. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-4/config.json +1 -0
  151. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-4/data.js +1 -0
  152. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-4/render.jsx +49 -0
  153. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-5/config.json +1 -0
  154. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-5/data.js +1 -0
  155. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-5/render.jsx +106 -0
  156. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-6/config.json +1 -0
  157. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-6/data.js +1 -0
  158. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-6/render.jsx +79 -0
  159. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-7/config.json +1 -0
  160. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-7/data.js +1 -0
  161. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-7/render.jsx +57 -0
  162. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-8/config.json +1 -0
  163. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-8/data.js +1 -0
  164. data/app/javascript/seeds/blocks/dashboard-ui/stat-cards-8/render.jsx +234 -0
  165. data/app/javascript/seeds/blocks/dashboard-ui/tables-1/config.json +1 -0
  166. data/app/javascript/seeds/blocks/dashboard-ui/tables-1/data.js +1 -0
  167. data/app/javascript/seeds/blocks/dashboard-ui/tables-1/render.jsx +295 -0
  168. data/app/javascript/seeds/blocks/datepicker-1/config.json +1 -0
  169. data/app/javascript/seeds/blocks/datepicker-1/data.js +1 -0
  170. data/app/javascript/seeds/blocks/datepicker-1/render.jsx +14 -0
  171. data/app/javascript/seeds/blocks/datepicker-2/config.json +1 -0
  172. data/app/javascript/seeds/blocks/datepicker-2/data.js +1 -0
  173. data/app/javascript/seeds/blocks/datepicker-2/render.jsx +29 -0
  174. data/app/javascript/seeds/blocks/datepicker-3/config.json +1 -0
  175. data/app/javascript/seeds/blocks/datepicker-3/data.js +1 -0
  176. data/app/javascript/seeds/blocks/datepicker-3/render.jsx +163 -0
  177. data/app/javascript/seeds/blocks/datepicker-4/config.json +1 -0
  178. data/app/javascript/seeds/blocks/datepicker-4/data.js +1 -0
  179. data/app/javascript/seeds/blocks/datepicker-4/render.jsx +192 -0
  180. data/app/javascript/seeds/blocks/ecommerce/checkout-page-1/config.json +1 -0
  181. data/app/javascript/seeds/blocks/ecommerce/checkout-page-1/data.js +1 -0
  182. data/app/javascript/seeds/blocks/ecommerce/checkout-page-1/render.jsx +723 -0
  183. data/app/javascript/seeds/blocks/ecommerce/checkout-page-2/config.json +1 -0
  184. data/app/javascript/seeds/blocks/ecommerce/checkout-page-2/data.js +1 -0
  185. data/app/javascript/seeds/blocks/ecommerce/checkout-page-2/render.jsx +508 -0
  186. data/app/javascript/seeds/blocks/ecommerce/checkout-page-3/config.json +1 -0
  187. data/app/javascript/seeds/blocks/ecommerce/checkout-page-3/data.js +1 -0
  188. data/app/javascript/seeds/blocks/ecommerce/checkout-page-3/render.jsx +632 -0
  189. data/app/javascript/seeds/blocks/ecommerce/checkout-page-4/config.json +1 -0
  190. data/app/javascript/seeds/blocks/ecommerce/checkout-page-4/data.js +1 -0
  191. data/app/javascript/seeds/blocks/ecommerce/checkout-page-4/render.jsx +1013 -0
  192. data/app/javascript/seeds/blocks/ecommerce/checkout-page-5/config.json +1 -0
  193. data/app/javascript/seeds/blocks/ecommerce/checkout-page-5/data.js +1 -0
  194. data/app/javascript/seeds/blocks/ecommerce/checkout-page-5/render.jsx +520 -0
  195. data/app/javascript/seeds/blocks/ecommerce/product-category-1/config.json +1 -0
  196. data/app/javascript/seeds/blocks/ecommerce/product-category-1/data.js +1 -0
  197. data/app/javascript/seeds/blocks/ecommerce/product-category-1/render.jsx +121 -0
  198. data/app/javascript/seeds/blocks/ecommerce/product-category-2/config.json +1 -0
  199. data/app/javascript/seeds/blocks/ecommerce/product-category-2/data.js +1 -0
  200. data/app/javascript/seeds/blocks/ecommerce/product-category-2/render.jsx +126 -0
  201. data/app/javascript/seeds/blocks/ecommerce/product-category-3/config.json +1 -0
  202. data/app/javascript/seeds/blocks/ecommerce/product-category-3/data.js +1 -0
  203. data/app/javascript/seeds/blocks/ecommerce/product-category-3/render.jsx +81 -0
  204. data/app/javascript/seeds/blocks/ecommerce/product-category-4/config.json +1 -0
  205. data/app/javascript/seeds/blocks/ecommerce/product-category-4/data.js +1 -0
  206. data/app/javascript/seeds/blocks/ecommerce/product-category-4/render.jsx +85 -0
  207. data/app/javascript/seeds/blocks/ecommerce/product-detail-1/config.json +1 -0
  208. data/app/javascript/seeds/blocks/ecommerce/product-detail-1/data.js +1 -0
  209. data/app/javascript/seeds/blocks/ecommerce/product-detail-1/render.jsx +80 -0
  210. data/app/javascript/seeds/blocks/ecommerce/product-detail-2/config.json +1 -0
  211. data/app/javascript/seeds/blocks/ecommerce/product-detail-2/data.js +1 -0
  212. data/app/javascript/seeds/blocks/ecommerce/product-detail-2/render.jsx +226 -0
  213. data/app/javascript/seeds/blocks/ecommerce/product-detail-3/config.json +1 -0
  214. data/app/javascript/seeds/blocks/ecommerce/product-detail-3/data.js +1 -0
  215. data/app/javascript/seeds/blocks/ecommerce/product-detail-3/render.jsx +315 -0
  216. data/app/javascript/seeds/blocks/ecommerce/product-detail-4/config.json +1 -0
  217. data/app/javascript/seeds/blocks/ecommerce/product-detail-4/data.js +1 -0
  218. data/app/javascript/seeds/blocks/ecommerce/product-detail-4/render.jsx +269 -0
  219. data/app/javascript/seeds/blocks/ecommerce/product-detail-5/config.json +1 -0
  220. data/app/javascript/seeds/blocks/ecommerce/product-detail-5/data.js +1 -0
  221. data/app/javascript/seeds/blocks/ecommerce/product-detail-5/render.jsx +265 -0
  222. data/app/javascript/seeds/blocks/ecommerce/product-detail-6/config.json +1 -0
  223. data/app/javascript/seeds/blocks/ecommerce/product-detail-6/data.js +1 -0
  224. data/app/javascript/seeds/blocks/ecommerce/product-detail-6/render.jsx +477 -0
  225. data/app/javascript/seeds/blocks/ecommerce/product-detail-7/config.json +1 -0
  226. data/app/javascript/seeds/blocks/ecommerce/product-detail-7/data.js +1 -0
  227. data/app/javascript/seeds/blocks/ecommerce/product-detail-7/render.jsx +405 -0
  228. data/app/javascript/seeds/blocks/ecommerce/product-features-1/config.json +1 -0
  229. data/app/javascript/seeds/blocks/ecommerce/product-features-1/data.js +1 -0
  230. data/app/javascript/seeds/blocks/ecommerce/product-features-1/render.jsx +71 -0
  231. data/app/javascript/seeds/blocks/ecommerce/product-features-2/config.json +1 -0
  232. data/app/javascript/seeds/blocks/ecommerce/product-features-2/data.js +1 -0
  233. data/app/javascript/seeds/blocks/ecommerce/product-features-2/render.jsx +135 -0
  234. data/app/javascript/seeds/blocks/ecommerce/product-list-1/config.json +1 -0
  235. data/app/javascript/seeds/blocks/ecommerce/product-list-1/data.js +1 -0
  236. data/app/javascript/seeds/blocks/ecommerce/product-list-1/render.jsx +87 -0
  237. data/app/javascript/seeds/blocks/ecommerce/product-list-2/config.json +1 -0
  238. data/app/javascript/seeds/blocks/ecommerce/product-list-2/data.js +1 -0
  239. data/app/javascript/seeds/blocks/ecommerce/product-list-2/render.jsx +151 -0
  240. data/app/javascript/seeds/blocks/ecommerce/product-list-3/config.json +1 -0
  241. data/app/javascript/seeds/blocks/ecommerce/product-list-3/data.js +1 -0
  242. data/app/javascript/seeds/blocks/ecommerce/product-list-3/render.jsx +313 -0
  243. data/app/javascript/seeds/blocks/ecommerce/product-list-4/config.json +1 -0
  244. data/app/javascript/seeds/blocks/ecommerce/product-list-4/data.js +1 -0
  245. data/app/javascript/seeds/blocks/ecommerce/product-list-4/render.jsx +223 -0
  246. data/app/javascript/seeds/blocks/ecommerce/product-list-5/config.json +1 -0
  247. data/app/javascript/seeds/blocks/ecommerce/product-list-5/data.js +1 -0
  248. data/app/javascript/seeds/blocks/ecommerce/product-list-5/render.jsx +200 -0
  249. data/app/javascript/seeds/blocks/ecommerce/product-list-6/config.json +1 -0
  250. data/app/javascript/seeds/blocks/ecommerce/product-list-6/data.js +1 -0
  251. data/app/javascript/seeds/blocks/ecommerce/product-list-6/render.jsx +177 -0
  252. data/app/javascript/seeds/blocks/ecommerce/product-list-7/config.json +1 -0
  253. data/app/javascript/seeds/blocks/ecommerce/product-list-7/data.js +1 -0
  254. data/app/javascript/seeds/blocks/ecommerce/product-list-7/render.jsx +175 -0
  255. data/app/javascript/seeds/blocks/ecommerce/product-list-8/config.json +1 -0
  256. data/app/javascript/seeds/blocks/ecommerce/product-list-8/data.js +1 -0
  257. data/app/javascript/seeds/blocks/ecommerce/product-list-8/render.jsx +231 -0
  258. data/app/javascript/seeds/blocks/ecommerce/product-quickview-1/config.json +1 -0
  259. data/app/javascript/seeds/blocks/ecommerce/product-quickview-1/data.js +1 -0
  260. data/app/javascript/seeds/blocks/ecommerce/product-quickview-1/render.jsx +64 -0
  261. data/app/javascript/seeds/blocks/ecommerce/product-quickview-2/config.json +1 -0
  262. data/app/javascript/seeds/blocks/ecommerce/product-quickview-2/data.js +1 -0
  263. data/app/javascript/seeds/blocks/ecommerce/product-quickview-2/render.jsx +62 -0
  264. data/app/javascript/seeds/blocks/ecommerce/promo-sections-1/config.json +1 -0
  265. data/app/javascript/seeds/blocks/ecommerce/promo-sections-1/data.js +1 -0
  266. data/app/javascript/seeds/blocks/ecommerce/promo-sections-1/render.jsx +75 -0
  267. data/app/javascript/seeds/blocks/ecommerce/shopping-cart-1/config.json +1 -0
  268. data/app/javascript/seeds/blocks/ecommerce/shopping-cart-1/data.js +1 -0
  269. data/app/javascript/seeds/blocks/ecommerce/shopping-cart-1/render.jsx +197 -0
  270. data/app/javascript/seeds/blocks/ecommerce/shopping-cart-2/config.json +1 -0
  271. data/app/javascript/seeds/blocks/ecommerce/shopping-cart-2/data.js +1 -0
  272. data/app/javascript/seeds/blocks/ecommerce/shopping-cart-2/render.jsx +143 -0
  273. data/app/javascript/seeds/blocks/ecommerce/shopping-cart-3/config.json +1 -0
  274. data/app/javascript/seeds/blocks/ecommerce/shopping-cart-3/data.js +1 -0
  275. data/app/javascript/seeds/blocks/ecommerce/shopping-cart-3/render.jsx +225 -0
  276. data/app/javascript/seeds/blocks/ecommerce/shopping-cart-4/config.json +1 -0
  277. data/app/javascript/seeds/blocks/ecommerce/shopping-cart-4/data.js +1 -0
  278. data/app/javascript/seeds/blocks/ecommerce/shopping-cart-4/render.jsx +93 -0
  279. data/app/javascript/seeds/blocks/ecommerce/store-navigation-1/config.json +1 -0
  280. data/app/javascript/seeds/blocks/ecommerce/store-navigation-1/data.js +1 -0
  281. data/app/javascript/seeds/blocks/ecommerce/store-navigation-1/render.jsx +290 -0
  282. data/app/javascript/seeds/blocks/ecommerce-charts-1/config.json +1 -0
  283. data/app/javascript/seeds/blocks/ecommerce-charts-1/data.js +1 -0
  284. data/app/javascript/seeds/blocks/ecommerce-charts-1/render.jsx +86 -0
  285. data/app/javascript/seeds/blocks/ecommerce-charts-2/config.json +1 -0
  286. data/app/javascript/seeds/blocks/ecommerce-charts-2/data.js +1 -0
  287. data/app/javascript/seeds/blocks/ecommerce-charts-2/render.jsx +119 -0
  288. data/app/javascript/seeds/blocks/ecommerce-charts-3/config.json +1 -0
  289. data/app/javascript/seeds/blocks/ecommerce-charts-3/data.js +1 -0
  290. data/app/javascript/seeds/blocks/ecommerce-charts-3/render.jsx +97 -0
  291. data/app/javascript/seeds/blocks/ecommerce-charts-4/config.json +1 -0
  292. data/app/javascript/seeds/blocks/ecommerce-charts-4/data.js +1 -0
  293. data/app/javascript/seeds/blocks/ecommerce-charts-4/render.jsx +108 -0
  294. data/app/javascript/seeds/blocks/line-charts-1/config.json +1 -0
  295. data/app/javascript/seeds/blocks/line-charts-1/data.js +1 -0
  296. data/app/javascript/seeds/blocks/line-charts-1/render.jsx +230 -0
  297. data/app/javascript/seeds/blocks/line-charts-2/config.json +1 -0
  298. data/app/javascript/seeds/blocks/line-charts-2/data.js +1 -0
  299. data/app/javascript/seeds/blocks/line-charts-2/render.jsx +118 -0
  300. data/app/javascript/seeds/blocks/line-charts-3/config.json +1 -0
  301. data/app/javascript/seeds/blocks/line-charts-3/data.js +1 -0
  302. data/app/javascript/seeds/blocks/line-charts-3/render.jsx +134 -0
  303. data/app/javascript/seeds/blocks/line-charts-4/config.json +1 -0
  304. data/app/javascript/seeds/blocks/line-charts-4/data.js +1 -0
  305. data/app/javascript/seeds/blocks/line-charts-4/render.jsx +115 -0
  306. data/app/javascript/seeds/blocks/marketing/call-to-action-1/config.json +1 -0
  307. data/app/javascript/seeds/blocks/marketing/call-to-action-1/data.js +1 -0
  308. data/app/javascript/seeds/blocks/marketing/call-to-action-1/render.jsx +31 -0
  309. data/app/javascript/seeds/blocks/marketing/call-to-action-10/config.json +1 -0
  310. data/app/javascript/seeds/blocks/marketing/call-to-action-10/data.js +1 -0
  311. data/app/javascript/seeds/blocks/marketing/call-to-action-10/render.jsx +76 -0
  312. data/app/javascript/seeds/blocks/marketing/call-to-action-2/config.json +1 -0
  313. data/app/javascript/seeds/blocks/marketing/call-to-action-2/data.js +1 -0
  314. data/app/javascript/seeds/blocks/marketing/call-to-action-2/render.jsx +78 -0
  315. data/app/javascript/seeds/blocks/marketing/call-to-action-3/config.json +1 -0
  316. data/app/javascript/seeds/blocks/marketing/call-to-action-3/data.js +1 -0
  317. data/app/javascript/seeds/blocks/marketing/call-to-action-3/render.jsx +50 -0
  318. data/app/javascript/seeds/blocks/marketing/call-to-action-4/config.json +1 -0
  319. data/app/javascript/seeds/blocks/marketing/call-to-action-4/data.js +1 -0
  320. data/app/javascript/seeds/blocks/marketing/call-to-action-4/render.jsx +24 -0
  321. data/app/javascript/seeds/blocks/marketing/call-to-action-5/config.json +1 -0
  322. data/app/javascript/seeds/blocks/marketing/call-to-action-5/data.js +1 -0
  323. data/app/javascript/seeds/blocks/marketing/call-to-action-5/render.jsx +66 -0
  324. data/app/javascript/seeds/blocks/marketing/call-to-action-6/config.json +1 -0
  325. data/app/javascript/seeds/blocks/marketing/call-to-action-6/data.js +1 -0
  326. data/app/javascript/seeds/blocks/marketing/call-to-action-6/render.jsx +69 -0
  327. data/app/javascript/seeds/blocks/marketing/call-to-action-7/config.json +1 -0
  328. data/app/javascript/seeds/blocks/marketing/call-to-action-7/data.js +1 -0
  329. data/app/javascript/seeds/blocks/marketing/call-to-action-7/render.jsx +43 -0
  330. data/app/javascript/seeds/blocks/marketing/call-to-action-8/config.json +1 -0
  331. data/app/javascript/seeds/blocks/marketing/call-to-action-8/data.js +1 -0
  332. data/app/javascript/seeds/blocks/marketing/call-to-action-8/render.jsx +63 -0
  333. data/app/javascript/seeds/blocks/marketing/call-to-action-9/config.json +1 -0
  334. data/app/javascript/seeds/blocks/marketing/call-to-action-9/data.js +1 -0
  335. data/app/javascript/seeds/blocks/marketing/call-to-action-9/render.jsx +27 -0
  336. data/app/javascript/seeds/blocks/marketing/changelog-1/config.json +1 -0
  337. data/app/javascript/seeds/blocks/marketing/changelog-1/data.js +1 -0
  338. data/app/javascript/seeds/blocks/marketing/changelog-1/render.jsx +106 -0
  339. data/app/javascript/seeds/blocks/marketing/changelog-2/config.json +1 -0
  340. data/app/javascript/seeds/blocks/marketing/changelog-2/data.js +1 -0
  341. data/app/javascript/seeds/blocks/marketing/changelog-2/render.jsx +157 -0
  342. data/app/javascript/seeds/blocks/marketing/changelog-3/config.json +1 -0
  343. data/app/javascript/seeds/blocks/marketing/changelog-3/data.js +1 -0
  344. data/app/javascript/seeds/blocks/marketing/changelog-3/render.jsx +204 -0
  345. data/app/javascript/seeds/blocks/marketing/changelog-4/config.json +1 -0
  346. data/app/javascript/seeds/blocks/marketing/changelog-4/data.js +1 -0
  347. data/app/javascript/seeds/blocks/marketing/changelog-4/render.jsx +199 -0
  348. data/app/javascript/seeds/blocks/marketing/feature-section-1/config.json +1 -0
  349. data/app/javascript/seeds/blocks/marketing/feature-section-1/data.js +1 -0
  350. data/app/javascript/seeds/blocks/marketing/feature-section-1/render.jsx +155 -0
  351. data/app/javascript/seeds/blocks/marketing/feature-section-10/config.json +1 -0
  352. data/app/javascript/seeds/blocks/marketing/feature-section-10/data.js +1 -0
  353. data/app/javascript/seeds/blocks/marketing/feature-section-10/render.jsx +83 -0
  354. data/app/javascript/seeds/blocks/marketing/feature-section-11/config.json +1 -0
  355. data/app/javascript/seeds/blocks/marketing/feature-section-11/data.js +1 -0
  356. data/app/javascript/seeds/blocks/marketing/feature-section-11/render.jsx +338 -0
  357. data/app/javascript/seeds/blocks/marketing/feature-section-12/config.json +1 -0
  358. data/app/javascript/seeds/blocks/marketing/feature-section-12/data.js +1 -0
  359. data/app/javascript/seeds/blocks/marketing/feature-section-12/render.jsx +96 -0
  360. data/app/javascript/seeds/blocks/marketing/feature-section-13/config.json +1 -0
  361. data/app/javascript/seeds/blocks/marketing/feature-section-13/data.js +1 -0
  362. data/app/javascript/seeds/blocks/marketing/feature-section-13/render.jsx +77 -0
  363. data/app/javascript/seeds/blocks/marketing/feature-section-2/config.json +1 -0
  364. data/app/javascript/seeds/blocks/marketing/feature-section-2/data.js +1 -0
  365. data/app/javascript/seeds/blocks/marketing/feature-section-2/render.jsx +117 -0
  366. data/app/javascript/seeds/blocks/marketing/feature-section-3/config.json +1 -0
  367. data/app/javascript/seeds/blocks/marketing/feature-section-3/data.js +1 -0
  368. data/app/javascript/seeds/blocks/marketing/feature-section-3/render.jsx +105 -0
  369. data/app/javascript/seeds/blocks/marketing/feature-section-4/config.json +1 -0
  370. data/app/javascript/seeds/blocks/marketing/feature-section-4/data.js +1 -0
  371. data/app/javascript/seeds/blocks/marketing/feature-section-4/render.jsx +127 -0
  372. data/app/javascript/seeds/blocks/marketing/feature-section-5/config.json +1 -0
  373. data/app/javascript/seeds/blocks/marketing/feature-section-5/data.js +1 -0
  374. data/app/javascript/seeds/blocks/marketing/feature-section-5/render.jsx +78 -0
  375. data/app/javascript/seeds/blocks/marketing/feature-section-6/config.json +1 -0
  376. data/app/javascript/seeds/blocks/marketing/feature-section-6/data.js +1 -0
  377. data/app/javascript/seeds/blocks/marketing/feature-section-6/render.jsx +79 -0
  378. data/app/javascript/seeds/blocks/marketing/feature-section-7/config.json +1 -0
  379. data/app/javascript/seeds/blocks/marketing/feature-section-7/data.js +1 -0
  380. data/app/javascript/seeds/blocks/marketing/feature-section-7/render.jsx +138 -0
  381. data/app/javascript/seeds/blocks/marketing/feature-section-8/config.json +1 -0
  382. data/app/javascript/seeds/blocks/marketing/feature-section-8/data.js +1 -0
  383. data/app/javascript/seeds/blocks/marketing/feature-section-8/render.jsx +215 -0
  384. data/app/javascript/seeds/blocks/marketing/feature-section-9/config.json +1 -0
  385. data/app/javascript/seeds/blocks/marketing/feature-section-9/data.js +1 -0
  386. data/app/javascript/seeds/blocks/marketing/feature-section-9/render.jsx +81 -0
  387. data/app/javascript/seeds/blocks/marketing/footers-1/config.json +1 -0
  388. data/app/javascript/seeds/blocks/marketing/footers-1/data.js +1 -0
  389. data/app/javascript/seeds/blocks/marketing/footers-1/render.jsx +106 -0
  390. data/app/javascript/seeds/blocks/marketing/footers-2/config.json +1 -0
  391. data/app/javascript/seeds/blocks/marketing/footers-2/data.js +1 -0
  392. data/app/javascript/seeds/blocks/marketing/footers-2/render.jsx +76 -0
  393. data/app/javascript/seeds/blocks/marketing/footers-3/config.json +1 -0
  394. data/app/javascript/seeds/blocks/marketing/footers-3/data.js +1 -0
  395. data/app/javascript/seeds/blocks/marketing/footers-3/render.jsx +160 -0
  396. data/app/javascript/seeds/blocks/marketing/footers-4/config.json +1 -0
  397. data/app/javascript/seeds/blocks/marketing/footers-4/data.js +1 -0
  398. data/app/javascript/seeds/blocks/marketing/footers-4/render.jsx +167 -0
  399. data/app/javascript/seeds/blocks/marketing/footers-5/config.json +1 -0
  400. data/app/javascript/seeds/blocks/marketing/footers-5/data.js +1 -0
  401. data/app/javascript/seeds/blocks/marketing/footers-5/render.jsx +223 -0
  402. data/app/javascript/seeds/blocks/marketing/hero-section-1/config.json +1 -0
  403. data/app/javascript/seeds/blocks/marketing/hero-section-1/data.js +1 -0
  404. data/app/javascript/seeds/blocks/marketing/hero-section-1/render.jsx +49 -0
  405. data/app/javascript/seeds/blocks/marketing/hero-section-10/config.json +1 -0
  406. data/app/javascript/seeds/blocks/marketing/hero-section-10/data.js +1 -0
  407. data/app/javascript/seeds/blocks/marketing/hero-section-10/render.jsx +147 -0
  408. data/app/javascript/seeds/blocks/marketing/hero-section-11/config.json +1 -0
  409. data/app/javascript/seeds/blocks/marketing/hero-section-11/data.js +1 -0
  410. data/app/javascript/seeds/blocks/marketing/hero-section-11/render.jsx +218 -0
  411. data/app/javascript/seeds/blocks/marketing/hero-section-12/config.json +1 -0
  412. data/app/javascript/seeds/blocks/marketing/hero-section-12/data.js +1 -0
  413. data/app/javascript/seeds/blocks/marketing/hero-section-12/render.jsx +287 -0
  414. data/app/javascript/seeds/blocks/marketing/hero-section-13/config.json +1 -0
  415. data/app/javascript/seeds/blocks/marketing/hero-section-13/data.js +1 -0
  416. data/app/javascript/seeds/blocks/marketing/hero-section-13/render.jsx +113 -0
  417. data/app/javascript/seeds/blocks/marketing/hero-section-14/config.json +1 -0
  418. data/app/javascript/seeds/blocks/marketing/hero-section-14/data.js +1 -0
  419. data/app/javascript/seeds/blocks/marketing/hero-section-14/render.jsx +249 -0
  420. data/app/javascript/seeds/blocks/marketing/hero-section-2/config.json +1 -0
  421. data/app/javascript/seeds/blocks/marketing/hero-section-2/data.js +1 -0
  422. data/app/javascript/seeds/blocks/marketing/hero-section-2/render.jsx +94 -0
  423. data/app/javascript/seeds/blocks/marketing/hero-section-3/config.json +1 -0
  424. data/app/javascript/seeds/blocks/marketing/hero-section-3/data.js +1 -0
  425. data/app/javascript/seeds/blocks/marketing/hero-section-3/render.jsx +51 -0
  426. data/app/javascript/seeds/blocks/marketing/hero-section-4/config.json +1 -0
  427. data/app/javascript/seeds/blocks/marketing/hero-section-4/data.js +1 -0
  428. data/app/javascript/seeds/blocks/marketing/hero-section-4/render.jsx +153 -0
  429. data/app/javascript/seeds/blocks/marketing/hero-section-5/config.json +1 -0
  430. data/app/javascript/seeds/blocks/marketing/hero-section-5/data.js +1 -0
  431. data/app/javascript/seeds/blocks/marketing/hero-section-5/render.jsx +210 -0
  432. data/app/javascript/seeds/blocks/marketing/hero-section-6/config.json +1 -0
  433. data/app/javascript/seeds/blocks/marketing/hero-section-6/data.js +1 -0
  434. data/app/javascript/seeds/blocks/marketing/hero-section-6/render.jsx +191 -0
  435. data/app/javascript/seeds/blocks/marketing/hero-section-7/config.json +1 -0
  436. data/app/javascript/seeds/blocks/marketing/hero-section-7/data.js +1 -0
  437. data/app/javascript/seeds/blocks/marketing/hero-section-7/render.jsx +306 -0
  438. data/app/javascript/seeds/blocks/marketing/hero-section-8/config.json +1 -0
  439. data/app/javascript/seeds/blocks/marketing/hero-section-8/data.js +1 -0
  440. data/app/javascript/seeds/blocks/marketing/hero-section-8/render.jsx +103 -0
  441. data/app/javascript/seeds/blocks/marketing/hero-section-9/config.json +1 -0
  442. data/app/javascript/seeds/blocks/marketing/hero-section-9/data.js +1 -0
  443. data/app/javascript/seeds/blocks/marketing/hero-section-9/render.jsx +354 -0
  444. data/app/javascript/seeds/blocks/marketing/integrations-1/config.json +1 -0
  445. data/app/javascript/seeds/blocks/marketing/integrations-1/data.js +1 -0
  446. data/app/javascript/seeds/blocks/marketing/integrations-1/render.jsx +483 -0
  447. data/app/javascript/seeds/blocks/marketing/integrations-2/config.json +1 -0
  448. data/app/javascript/seeds/blocks/marketing/integrations-2/data.js +1 -0
  449. data/app/javascript/seeds/blocks/marketing/integrations-2/render.jsx +468 -0
  450. data/app/javascript/seeds/blocks/marketing/integrations-3/config.json +1 -0
  451. data/app/javascript/seeds/blocks/marketing/integrations-3/data.js +1 -0
  452. data/app/javascript/seeds/blocks/marketing/integrations-3/render.jsx +441 -0
  453. data/app/javascript/seeds/blocks/marketing/integrations-4/config.json +1 -0
  454. data/app/javascript/seeds/blocks/marketing/integrations-4/data.js +1 -0
  455. data/app/javascript/seeds/blocks/marketing/integrations-4/render.jsx +433 -0
  456. data/app/javascript/seeds/blocks/marketing/integrations-5/config.json +1 -0
  457. data/app/javascript/seeds/blocks/marketing/integrations-5/data.js +1 -0
  458. data/app/javascript/seeds/blocks/marketing/integrations-5/render.jsx +477 -0
  459. data/app/javascript/seeds/blocks/marketing/integrations-6/config.json +1 -0
  460. data/app/javascript/seeds/blocks/marketing/integrations-6/data.js +1 -0
  461. data/app/javascript/seeds/blocks/marketing/integrations-6/render.jsx +468 -0
  462. data/app/javascript/seeds/blocks/marketing/navbars-1/config.json +1 -0
  463. data/app/javascript/seeds/blocks/marketing/navbars-1/data.js +1 -0
  464. data/app/javascript/seeds/blocks/marketing/navbars-1/render.jsx +133 -0
  465. data/app/javascript/seeds/blocks/marketing/navbars-2/config.json +1 -0
  466. data/app/javascript/seeds/blocks/marketing/navbars-2/data.js +1 -0
  467. data/app/javascript/seeds/blocks/marketing/navbars-2/render.jsx +95 -0
  468. data/app/javascript/seeds/blocks/marketing/navbars-3/config.json +1 -0
  469. data/app/javascript/seeds/blocks/marketing/navbars-3/data.js +1 -0
  470. data/app/javascript/seeds/blocks/marketing/navbars-3/render.jsx +246 -0
  471. data/app/javascript/seeds/blocks/marketing/newsletter-sections-1/config.json +1 -0
  472. data/app/javascript/seeds/blocks/marketing/newsletter-sections-1/data.js +1 -0
  473. data/app/javascript/seeds/blocks/marketing/newsletter-sections-1/render.jsx +45 -0
  474. data/app/javascript/seeds/blocks/marketing/newsletter-sections-2/config.json +1 -0
  475. data/app/javascript/seeds/blocks/marketing/newsletter-sections-2/data.js +1 -0
  476. data/app/javascript/seeds/blocks/marketing/newsletter-sections-2/render.jsx +55 -0
  477. data/app/javascript/seeds/blocks/marketing/newsletter-sections-3/config.json +1 -0
  478. data/app/javascript/seeds/blocks/marketing/newsletter-sections-3/data.js +1 -0
  479. data/app/javascript/seeds/blocks/marketing/newsletter-sections-3/render.jsx +29 -0
  480. data/app/javascript/seeds/blocks/marketing/pricing-table-1/config.json +1 -0
  481. data/app/javascript/seeds/blocks/marketing/pricing-table-1/data.js +1 -0
  482. data/app/javascript/seeds/blocks/marketing/pricing-table-1/render.jsx +110 -0
  483. data/app/javascript/seeds/blocks/marketing/pricing-table-2/config.json +1 -0
  484. data/app/javascript/seeds/blocks/marketing/pricing-table-2/data.js +1 -0
  485. data/app/javascript/seeds/blocks/marketing/pricing-table-2/render.jsx +71 -0
  486. data/app/javascript/seeds/blocks/marketing/pricing-table-3/config.json +1 -0
  487. data/app/javascript/seeds/blocks/marketing/pricing-table-3/data.js +1 -0
  488. data/app/javascript/seeds/blocks/marketing/pricing-table-3/render.jsx +124 -0
  489. data/app/javascript/seeds/blocks/marketing/pricing-table-4/config.json +1 -0
  490. data/app/javascript/seeds/blocks/marketing/pricing-table-4/data.js +1 -0
  491. data/app/javascript/seeds/blocks/marketing/pricing-table-4/render.jsx +205 -0
  492. data/app/javascript/seeds/blocks/marketing/pricing-table-5/config.json +1 -0
  493. data/app/javascript/seeds/blocks/marketing/pricing-table-5/data.js +1 -0
  494. data/app/javascript/seeds/blocks/marketing/pricing-table-5/render.jsx +143 -0
  495. data/app/javascript/seeds/blocks/marketing/pricing-table-6/config.json +1 -0
  496. data/app/javascript/seeds/blocks/marketing/pricing-table-6/data.js +1 -0
  497. data/app/javascript/seeds/blocks/marketing/pricing-table-6/render.jsx +195 -0
  498. data/app/javascript/seeds/blocks/marketing/pricing-table-7/config.json +1 -0
  499. data/app/javascript/seeds/blocks/marketing/pricing-table-7/data.js +1 -0
  500. data/app/javascript/seeds/blocks/marketing/pricing-table-7/render.jsx +351 -0
  501. data/app/javascript/seeds/blocks/marketing/team-sections-1/config.json +1 -0
  502. data/app/javascript/seeds/blocks/marketing/team-sections-1/data.js +1 -0
  503. data/app/javascript/seeds/blocks/marketing/team-sections-1/render.jsx +71 -0
  504. data/app/javascript/seeds/blocks/marketing/team-sections-2/config.json +1 -0
  505. data/app/javascript/seeds/blocks/marketing/team-sections-2/data.js +1 -0
  506. data/app/javascript/seeds/blocks/marketing/team-sections-2/render.jsx +125 -0
  507. data/app/javascript/seeds/blocks/marketing/team-sections-3/config.json +1 -0
  508. data/app/javascript/seeds/blocks/marketing/team-sections-3/data.js +1 -0
  509. data/app/javascript/seeds/blocks/marketing/team-sections-3/render.jsx +136 -0
  510. data/app/javascript/seeds/blocks/marketing/team-sections-4/config.json +1 -0
  511. data/app/javascript/seeds/blocks/marketing/team-sections-4/data.js +1 -0
  512. data/app/javascript/seeds/blocks/marketing/team-sections-4/render.jsx +107 -0
  513. data/app/javascript/seeds/blocks/marketing/team-sections-5/config.json +1 -0
  514. data/app/javascript/seeds/blocks/marketing/team-sections-5/data.js +1 -0
  515. data/app/javascript/seeds/blocks/marketing/team-sections-5/render.jsx +124 -0
  516. data/app/javascript/seeds/blocks/marketing/testimonials-1/config.json +1 -0
  517. data/app/javascript/seeds/blocks/marketing/testimonials-1/data.js +1 -0
  518. data/app/javascript/seeds/blocks/marketing/testimonials-1/render.jsx +112 -0
  519. data/app/javascript/seeds/blocks/marketing/testimonials-10/config.json +1 -0
  520. data/app/javascript/seeds/blocks/marketing/testimonials-10/data.js +1 -0
  521. data/app/javascript/seeds/blocks/marketing/testimonials-10/render.jsx +106 -0
  522. data/app/javascript/seeds/blocks/marketing/testimonials-11/config.json +1 -0
  523. data/app/javascript/seeds/blocks/marketing/testimonials-11/data.js +1 -0
  524. data/app/javascript/seeds/blocks/marketing/testimonials-11/render.jsx +79 -0
  525. data/app/javascript/seeds/blocks/marketing/testimonials-12/config.json +1 -0
  526. data/app/javascript/seeds/blocks/marketing/testimonials-12/data.js +1 -0
  527. data/app/javascript/seeds/blocks/marketing/testimonials-12/render.jsx +173 -0
  528. data/app/javascript/seeds/blocks/marketing/testimonials-13/config.json +1 -0
  529. data/app/javascript/seeds/blocks/marketing/testimonials-13/data.js +1 -0
  530. data/app/javascript/seeds/blocks/marketing/testimonials-13/render.jsx +121 -0
  531. data/app/javascript/seeds/blocks/marketing/testimonials-14/config.json +1 -0
  532. data/app/javascript/seeds/blocks/marketing/testimonials-14/data.js +1 -0
  533. data/app/javascript/seeds/blocks/marketing/testimonials-14/render.jsx +158 -0
  534. data/app/javascript/seeds/blocks/marketing/testimonials-15/config.json +1 -0
  535. data/app/javascript/seeds/blocks/marketing/testimonials-15/data.js +1 -0
  536. data/app/javascript/seeds/blocks/marketing/testimonials-15/render.jsx +109 -0
  537. data/app/javascript/seeds/blocks/marketing/testimonials-2/config.json +1 -0
  538. data/app/javascript/seeds/blocks/marketing/testimonials-2/data.js +1 -0
  539. data/app/javascript/seeds/blocks/marketing/testimonials-2/render.jsx +81 -0
  540. data/app/javascript/seeds/blocks/marketing/testimonials-3/config.json +1 -0
  541. data/app/javascript/seeds/blocks/marketing/testimonials-3/data.js +1 -0
  542. data/app/javascript/seeds/blocks/marketing/testimonials-3/render.jsx +149 -0
  543. data/app/javascript/seeds/blocks/marketing/testimonials-4/config.json +1 -0
  544. data/app/javascript/seeds/blocks/marketing/testimonials-4/data.js +1 -0
  545. data/app/javascript/seeds/blocks/marketing/testimonials-4/render.jsx +148 -0
  546. data/app/javascript/seeds/blocks/marketing/testimonials-5/config.json +1 -0
  547. data/app/javascript/seeds/blocks/marketing/testimonials-5/data.js +1 -0
  548. data/app/javascript/seeds/blocks/marketing/testimonials-5/render.jsx +153 -0
  549. data/app/javascript/seeds/blocks/marketing/testimonials-6/config.json +1 -0
  550. data/app/javascript/seeds/blocks/marketing/testimonials-6/data.js +1 -0
  551. data/app/javascript/seeds/blocks/marketing/testimonials-6/render.jsx +155 -0
  552. data/app/javascript/seeds/blocks/marketing/testimonials-7/config.json +1 -0
  553. data/app/javascript/seeds/blocks/marketing/testimonials-7/data.js +1 -0
  554. data/app/javascript/seeds/blocks/marketing/testimonials-7/render.jsx +102 -0
  555. data/app/javascript/seeds/blocks/marketing/testimonials-8/config.json +1 -0
  556. data/app/javascript/seeds/blocks/marketing/testimonials-8/data.js +1 -0
  557. data/app/javascript/seeds/blocks/marketing/testimonials-8/render.jsx +161 -0
  558. data/app/javascript/seeds/blocks/marketing/testimonials-9/config.json +1 -0
  559. data/app/javascript/seeds/blocks/marketing/testimonials-9/data.js +1 -0
  560. data/app/javascript/seeds/blocks/marketing/testimonials-9/render.jsx +195 -0
  561. data/app/javascript/seeds/blocks/project-management-charts-1/config.json +1 -0
  562. data/app/javascript/seeds/blocks/project-management-charts-1/data.js +1 -0
  563. data/app/javascript/seeds/blocks/project-management-charts-1/render.jsx +172 -0
  564. data/app/javascript/seeds/blocks/project-management-charts-2/config.json +1 -0
  565. data/app/javascript/seeds/blocks/project-management-charts-2/data.js +1 -0
  566. data/app/javascript/seeds/blocks/project-management-charts-2/render.jsx +147 -0
  567. data/app/javascript/seeds/blocks/switch-cards-1/config.json +1 -0
  568. data/app/javascript/seeds/blocks/switch-cards-1/data.js +1 -0
  569. data/app/javascript/seeds/blocks/switch-cards-1/render.jsx +116 -0
  570. data/app/javascript/seeds/blocks/theme-switchers-1/config.json +1 -0
  571. data/app/javascript/seeds/blocks/theme-switchers-1/data.js +1 -0
  572. data/app/javascript/seeds/blocks/theme-switchers-1/render.jsx +22 -0
  573. data/app/javascript/seeds/blocks/theme-switchers-2/config.json +1 -0
  574. data/app/javascript/seeds/blocks/theme-switchers-2/data.js +1 -0
  575. data/app/javascript/seeds/blocks/theme-switchers-2/render.jsx +51 -0
  576. data/app/javascript/seeds/blocks/theme-switchers-3/config.json +1 -0
  577. data/app/javascript/seeds/blocks/theme-switchers-3/data.js +1 -0
  578. data/app/javascript/seeds/blocks/theme-switchers-3/render.jsx +37 -0
  579. data/app/javascript/seeds/examples/blog-cards-1/config.json +1 -0
  580. data/app/javascript/seeds/examples/blog-cards-1/data.js +1 -0
  581. data/app/javascript/seeds/examples/blog-cards-1/render.jsx +81 -0
  582. data/app/javascript/seeds/examples/blog-cards-2/config.json +1 -0
  583. data/app/javascript/seeds/examples/blog-cards-2/data.js +1 -0
  584. data/app/javascript/seeds/examples/blog-cards-2/render.jsx +78 -0
  585. data/app/javascript/seeds/examples/blog-cards-3/config.json +1 -0
  586. data/app/javascript/seeds/examples/blog-cards-3/data.js +1 -0
  587. data/app/javascript/seeds/examples/blog-cards-3/render.jsx +80 -0
  588. data/app/javascript/seeds/examples/blog-cards-4/config.json +1 -0
  589. data/app/javascript/seeds/examples/blog-cards-4/data.js +1 -0
  590. data/app/javascript/seeds/examples/blog-cards-4/render.jsx +32 -0
  591. data/app/javascript/seeds/examples/chat-bubbles-1/config.json +1 -0
  592. data/app/javascript/seeds/examples/chat-bubbles-1/data.js +1 -0
  593. data/app/javascript/seeds/examples/chat-bubbles-1/render.jsx +154 -0
  594. data/app/javascript/seeds/examples/chat-bubbles-2/config.json +1 -0
  595. data/app/javascript/seeds/examples/chat-bubbles-2/data.js +1 -0
  596. data/app/javascript/seeds/examples/chat-bubbles-2/render.jsx +88 -0
  597. data/app/javascript/seeds/examples/chat-bubbles-3/config.json +1 -0
  598. data/app/javascript/seeds/examples/chat-bubbles-3/data.js +1 -0
  599. data/app/javascript/seeds/examples/chat-bubbles-3/render.jsx +90 -0
  600. data/app/javascript/seeds/examples/chat-bubbles-4/config.json +1 -0
  601. data/app/javascript/seeds/examples/chat-bubbles-4/data.js +1 -0
  602. data/app/javascript/seeds/examples/chat-bubbles-4/render.jsx +169 -0
  603. data/app/javascript/seeds/examples/payment-methods-1/config.json +1 -0
  604. data/app/javascript/seeds/examples/payment-methods-1/data.js +1 -0
  605. data/app/javascript/seeds/examples/payment-methods-1/render.jsx +128 -0
  606. data/app/javascript/seeds/examples/payment-methods-2/config.json +1 -0
  607. data/app/javascript/seeds/examples/payment-methods-2/data.js +1 -0
  608. data/app/javascript/seeds/examples/payment-methods-2/render.jsx +80 -0
  609. data/app/javascript/seeds/examples/payment-methods-3/config.json +1 -0
  610. data/app/javascript/seeds/examples/payment-methods-3/data.js +1 -0
  611. data/app/javascript/seeds/examples/payment-methods-3/render.jsx +1 -0
  612. data/app/javascript/seeds/examples/product-cards-1/config.json +1 -0
  613. data/app/javascript/seeds/examples/product-cards-1/data.js +1 -0
  614. data/app/javascript/seeds/examples/product-cards-1/render.jsx +48 -0
  615. data/app/javascript/seeds/examples/product-cards-2/config.json +1 -0
  616. data/app/javascript/seeds/examples/product-cards-2/data.js +1 -0
  617. data/app/javascript/seeds/examples/product-cards-2/render.jsx +53 -0
  618. data/app/javascript/seeds/examples/product-cards-3/config.json +1 -0
  619. data/app/javascript/seeds/examples/product-cards-3/data.js +1 -0
  620. data/app/javascript/seeds/examples/product-cards-3/render.jsx +102 -0
  621. data/app/javascript/seeds/examples/product-cards-4/config.json +1 -0
  622. data/app/javascript/seeds/examples/product-cards-4/data.js +1 -0
  623. data/app/javascript/seeds/examples/product-cards-4/render.jsx +40 -0
  624. data/app/javascript/seeds/examples/product-cards-5/config.json +1 -0
  625. data/app/javascript/seeds/examples/product-cards-5/data.js +1 -0
  626. data/app/javascript/seeds/examples/product-cards-5/render.jsx +79 -0
  627. data/app/javascript/seeds/examples/product-cards-6/config.json +1 -0
  628. data/app/javascript/seeds/examples/product-cards-6/data.js +1 -0
  629. data/app/javascript/seeds/examples/product-cards-6/render.jsx +180 -0
  630. data/app/javascript/seeds/examples/product-cards-7/config.json +1 -0
  631. data/app/javascript/seeds/examples/product-cards-7/data.js +1 -0
  632. data/app/javascript/seeds/examples/product-cards-7/render.jsx +181 -0
  633. data/app/javascript/seeds/examples/product-list-1/config.json +1 -0
  634. data/app/javascript/seeds/examples/product-list-1/data.js +1 -0
  635. data/app/javascript/seeds/examples/product-list-1/render.jsx +114 -0
  636. data/app/javascript/seeds/examples/review-cards-1/config.json +1 -0
  637. data/app/javascript/seeds/examples/review-cards-1/data.js +1 -0
  638. data/app/javascript/seeds/examples/review-cards-1/render.jsx +54 -0
  639. data/app/javascript/seeds/examples/review-cards-2/config.json +1 -0
  640. data/app/javascript/seeds/examples/review-cards-2/data.js +1 -0
  641. data/app/javascript/seeds/examples/review-cards-2/render.jsx +68 -0
  642. data/app/javascript/seeds/examples/review-cards-3/config.json +1 -0
  643. data/app/javascript/seeds/examples/review-cards-3/data.js +1 -0
  644. data/app/javascript/seeds/examples/review-cards-3/render.jsx +101 -0
  645. data/app/javascript/seeds/examples/social-media-post-1/config.json +1 -0
  646. data/app/javascript/seeds/examples/social-media-post-1/data.js +1 -0
  647. data/app/javascript/seeds/examples/social-media-post-1/render.jsx +162 -0
  648. data/app/javascript/seeds/examples/social-media-post-2/config.json +1 -0
  649. data/app/javascript/seeds/examples/social-media-post-2/data.js +1 -0
  650. data/app/javascript/seeds/examples/social-media-post-2/render.jsx +172 -0
  651. data/app/javascript/seeds/examples/social-media-post-3/config.json +1 -0
  652. data/app/javascript/seeds/examples/social-media-post-3/data.js +1 -0
  653. data/app/javascript/seeds/examples/social-media-post-3/render.jsx +270 -0
  654. data/app/javascript/seeds/examples/social-media-post-4/config.json +1 -0
  655. data/app/javascript/seeds/examples/social-media-post-4/data.js +1 -0
  656. data/app/javascript/seeds/examples/social-media-post-4/render.jsx +188 -0
  657. data/app/javascript/seeds/examples/stat-cards-1/config.json +1 -0
  658. data/app/javascript/seeds/examples/stat-cards-1/data.js +1 -0
  659. data/app/javascript/seeds/examples/stat-cards-1/render.jsx +31 -0
  660. data/app/javascript/seeds/examples/stat-cards-2/config.json +1 -0
  661. data/app/javascript/seeds/examples/stat-cards-2/data.js +1 -0
  662. data/app/javascript/seeds/examples/stat-cards-2/render.jsx +42 -0
  663. data/app/javascript/seeds/examples/stat-cards-3/config.json +1 -0
  664. data/app/javascript/seeds/examples/stat-cards-3/data.js +1 -0
  665. data/app/javascript/seeds/examples/stat-cards-3/render.jsx +114 -0
  666. data/app/javascript/seeds/examples/stat-cards-4/config.json +1 -0
  667. data/app/javascript/seeds/examples/stat-cards-4/data.js +1 -0
  668. data/app/javascript/seeds/examples/stat-cards-4/render.jsx +117 -0
  669. data/app/javascript/seeds/examples/task-cards-1/config.json +1 -0
  670. data/app/javascript/seeds/examples/task-cards-1/data.js +1 -0
  671. data/app/javascript/seeds/examples/task-cards-1/render.jsx +133 -0
  672. data/app/javascript/seeds/examples/task-cards-2/config.json +1 -0
  673. data/app/javascript/seeds/examples/task-cards-2/data.js +1 -0
  674. data/app/javascript/seeds/examples/task-cards-2/render.jsx +122 -0
  675. data/app/javascript/seeds/examples/welcome-cards-1/config.json +1 -0
  676. data/app/javascript/seeds/examples/welcome-cards-1/data.js +1 -0
  677. data/app/javascript/seeds/examples/welcome-cards-1/render.jsx +40 -0
  678. data/app/javascript/seeds/examples/welcome-cards-2/config.json +1 -0
  679. data/app/javascript/seeds/examples/welcome-cards-2/data.js +1 -0
  680. data/app/javascript/seeds/examples/welcome-cards-2/render.jsx +58 -0
  681. data/app/javascript/seeds/examples/welcome-cards-3/config.json +1 -0
  682. data/app/javascript/seeds/examples/welcome-cards-3/data.js +1 -0
  683. data/app/javascript/seeds/examples/welcome-cards-3/render.jsx +91 -0
  684. data/app/javascript/seeds/ide-editor/config.json +4 -0
  685. data/app/javascript/seeds/ide-editor/data.js +16 -0
  686. data/app/javascript/seeds/ide-editor/render.jsx +132 -0
  687. data/app/javascript/seeds/ide-file-tree/config.json +4 -0
  688. data/app/javascript/seeds/ide-file-tree/data.js +50 -0
  689. data/app/javascript/seeds/ide-file-tree/render.jsx +426 -0
  690. data/app/javascript/seeds/ide-preview/config.json +4 -0
  691. data/app/javascript/seeds/ide-preview/data.js +4 -0
  692. data/app/javascript/seeds/ide-preview/render.jsx +49 -0
  693. data/app/javascript/seeds/ide-terminal/config.json +4 -0
  694. data/app/javascript/seeds/ide-terminal/data.js +4 -0
  695. data/app/javascript/seeds/ide-terminal/render.jsx +247 -0
  696. data/app/javascript/seeds/main-menu/config.json +9 -0
  697. data/app/javascript/seeds/main-menu/data.js +6 -0
  698. data/app/javascript/seeds/main-menu/render.jsx +70 -0
  699. data/app/models/concerns/jigsaw/grid_configurable.rb +89 -0
  700. data/app/models/concerns/jigsaw/slot_compilable.rb +69 -0
  701. data/app/models/jigsaw/application_record.rb +5 -0
  702. data/app/models/jigsaw/layout.rb +61 -0
  703. data/app/models/jigsaw/layout_template.rb +16 -0
  704. data/app/models/jigsaw/page.rb +35 -0
  705. data/app/models/jigsaw/schemas/layout_config.json +54 -0
  706. data/app/models/jigsaw/slot.rb +109 -0
  707. data/app/models/jigsaw/slot_template.rb +29 -0
  708. data/app/views/jigsaw/dashboard/index.html.ruby +23 -0
  709. data/app/views/jigsaw/layout_templates/_form.html.ruby +69 -0
  710. data/app/views/jigsaw/layout_templates/edit.html.ruby +72 -0
  711. data/app/views/jigsaw/layout_templates/index.html.ruby +48 -0
  712. data/app/views/jigsaw/layout_templates/new.html.ruby +19 -0
  713. data/app/views/jigsaw/pages/_form.html.ruby +75 -0
  714. data/app/views/jigsaw/pages/edit.html.ruby +104 -0
  715. data/app/views/jigsaw/pages/index.html.ruby +65 -0
  716. data/app/views/jigsaw/pages/new.html.ruby +34 -0
  717. data/app/views/jigsaw/pages/show.html.ruby +28 -0
  718. data/app/views/jigsaw/slot_templates/edit.html.ruby +42 -0
  719. data/app/views/jigsaw/slot_templates/index.html.ruby +73 -0
  720. data/app/views/jigsaw/slot_templates/new.html.ruby +21 -0
  721. data/app/views/jigsaw/slot_templates/show.html.ruby +38 -0
  722. data/app/views/jigsaw/slots/_shared/_menu.html.ruby +7 -0
  723. data/app/views/jigsaw/slots/edit.html.ruby +52 -0
  724. data/app/views/jigsaw/slots/index.html.ruby +17 -0
  725. data/app/views/layouts/jigsaw/application.html.ruby +31 -0
  726. data/config/importmap.rb +35 -0
  727. data/config/routes.rb +27 -0
  728. data/db/migrate/20260505185636_create_jigsaw_custom_pages.rb +12 -0
  729. data/db/migrate/20260505185637_create_jigsaw_data_functions.rb +15 -0
  730. data/db/migrate/20260505185638_create_jigsaw_render_functions.rb +15 -0
  731. data/db/migrate/20260505185639_create_jigsaw_page_modules.rb +15 -0
  732. data/db/migrate/20260505185640_create_jigsaw_layouts.rb +14 -0
  733. data/db/migrate/20260506000001_remove_slot_from_jigsaw_page_modules.rb +5 -0
  734. data/db/migrate/20260506000002_make_page_module_functions_optional.rb +6 -0
  735. data/db/migrate/20260506000003_inline_functions_on_page_modules.rb +55 -0
  736. data/db/migrate/20260507000001_move_layout_fk_to_layouts_table.rb +30 -0
  737. data/db/migrate/20260507000002_move_page_modules_to_layouts.rb +30 -0
  738. data/db/migrate/20260508000001_rename_custom_pages_to_pages.rb +18 -0
  739. data/db/migrate/20260508000002_rename_page_modules_to_slots.rb +7 -0
  740. data/db/migrate/20260509000001_create_jigsaw_templates.rb +13 -0
  741. data/db/migrate/20260509000002_create_jigsaw_template_layouts.rb +12 -0
  742. data/db/migrate/20260509000003_create_jigsaw_template_slots.rb +22 -0
  743. data/db/migrate/20260509000004_add_template_linking_to_layouts.rb +6 -0
  744. data/db/migrate/20260509000005_add_linked_to_template_to_slots.rb +5 -0
  745. data/db/migrate/20260510000001_refactor_templates_to_layout_and_slot_templates.rb +104 -0
  746. data/db/seeds/01_pages.rb +69 -0
  747. data/db/seeds/02_main_menu_slot.rb +15 -0
  748. data/db/seeds/03_webcontainer_ide.rb +51 -0
  749. data/db/seeds.rb +120 -0
  750. data/lib/jigsaw/engine.rb +29 -0
  751. data/lib/jigsaw/grid_layout_generator.rb +55 -0
  752. data/lib/jigsaw/jsx_compiler.rb +21 -0
  753. data/lib/jigsaw/version.rb +3 -0
  754. data/lib/jigsaw/version.rb.erb +3 -0
  755. data/lib/jigsaw.rb +11 -0
  756. data/lib/jigsaw_engine.rb +4 -0
  757. data/lib/tasks/kube_tasks.rake +4 -0
  758. data/lib/tasks/shadcn.rake +171 -0
  759. metadata +1033 -0
@@ -0,0 +1,1013 @@
1
+ "use client";
2
+
3
+ import Image from "next/image";
4
+ import { zodResolver } from "@hookform/resolvers/zod";
5
+ import { useForm, useWatch } from "react-hook-form";
6
+ import { useMemo, useState } from "react";
7
+ import { create } from "zustand";
8
+ import { z } from "zod";
9
+ import { useMaskInput } from "use-mask-input";
10
+ import { Store, Truck } from "lucide-react";
11
+
12
+ import { Button } from "@/components/ui/button";
13
+ import { Card, CardContent } from "@/components/ui/card";
14
+ import { Checkbox } from "@/components/ui/checkbox";
15
+ import {
16
+ Form,
17
+ FormControl,
18
+ FormField,
19
+ FormItem,
20
+ FormLabel,
21
+ } from "@/components/ui/form";
22
+ import { Input } from "@/components/ui/input";
23
+ import {
24
+ Select,
25
+ SelectContent,
26
+ SelectItem,
27
+ SelectTrigger,
28
+ SelectValue,
29
+ } from "@/components/ui/select";
30
+ import { Separator } from "@/components/ui/separator";
31
+ import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group";
32
+ import {
33
+ InputGroup,
34
+ InputGroupAddon,
35
+ InputGroupButton,
36
+ InputGroupInput,
37
+ } from "@/components/ui/input-group";
38
+ import {
39
+ Stepper,
40
+ StepperIndicator,
41
+ StepperItem,
42
+ StepperSeparator,
43
+ StepperTitle,
44
+ StepperTrigger,
45
+ } from "@/components/ui/stepper";
46
+
47
+ const checkoutItems = [
48
+ {
49
+ id: 1,
50
+ name: "The boy’s Soft Cloud Couture",
51
+ variant: {
52
+ color: "Black",
53
+ size: "Man • 40.5",
54
+ },
55
+ imageSrc: "/images/products/01.jpeg",
56
+ imageAlt: "A yellow kids jacket on a hanger.",
57
+ price: 56,
58
+ quantity: 1,
59
+ },
60
+ {
61
+ id: 2,
62
+ name: "The boy’s Soft Cloud Couture",
63
+ variant: {
64
+ color: "Black",
65
+ size: "Man • 40.5",
66
+ },
67
+ imageSrc: "/images/products/02.jpeg",
68
+ imageAlt: "A patterned kids jacket on a hanger.",
69
+ price: 56,
70
+ quantity: 1,
71
+ },
72
+ {
73
+ id: 3,
74
+ name: "The boy’s Soft Cloud Couture",
75
+ variant: {
76
+ color: "Black",
77
+ size: "Man • 40.5",
78
+ },
79
+ imageSrc: "/images/products/03.jpeg",
80
+ imageAlt: "A green plush toy.",
81
+ price: 56,
82
+ quantity: 1,
83
+ },
84
+ ];
85
+
86
+ type CartItem = (typeof checkoutItems)[number];
87
+ type CheckoutStep = "cart" | "information" | "shipping" | "payment";
88
+
89
+ type CheckoutState = {
90
+ step: CheckoutStep;
91
+ items: CartItem[];
92
+ setStep: (step: CheckoutStep) => void;
93
+ updateQuantity: (id: number, quantity: number) => void;
94
+ removeItem: (id: number) => void;
95
+ clearCart: () => void;
96
+ };
97
+
98
+ const useCheckoutPage4Store = create<CheckoutState>((set) => ({
99
+ step: "information",
100
+ items: checkoutItems,
101
+ setStep: (step) => set({ step }),
102
+ updateQuantity: (id, quantity) =>
103
+ set((state) => ({
104
+ items: state.items.map((item) =>
105
+ item.id === id ? { ...item, quantity: Math.max(1, quantity) } : item,
106
+ ),
107
+ })),
108
+ removeItem: (id) =>
109
+ set((state) => ({ items: state.items.filter((item) => item.id !== id) })),
110
+ clearCart: () => set({ items: [] }),
111
+ }));
112
+
113
+ const checkoutSchema = z
114
+ .object({
115
+ deliveryMethod: z.enum(["delivery", "pickup"]),
116
+ fullName: z.string().min(1, "Full name is required"),
117
+ email: z.string().email("Enter a valid email"),
118
+ phoneCode: z.string().min(1, "Select phone code"),
119
+ phoneNumber: z.string().min(7, "Enter a valid phone number"),
120
+ country: z.enum(["bd", "us", "tr", "de"]),
121
+ city: z.string().min(1, "City is required"),
122
+ state: z.string().min(1, "State is required"),
123
+ zipCode: z
124
+ .string()
125
+ .min(3, "Zip code is required")
126
+ .max(10, "Zip is too long"),
127
+ addressLine1: z.string().min(1, "Address is required"),
128
+ addressLine2: z.string().optional(),
129
+ shippingMethod: z.enum(["standard", "express"]),
130
+ discountCode: z.string().optional(),
131
+ paymentMethod: z.enum(["card", "paypal"]),
132
+ cardName: z.string(),
133
+ cardNumber: z.string().optional(),
134
+ cardExpiry: z.string().optional(),
135
+ cardCvc: z.string().optional(),
136
+ acceptedTerms: z.boolean(),
137
+ })
138
+ .superRefine((values, ctx) => {
139
+ if (!values.acceptedTerms) {
140
+ ctx.addIssue({
141
+ code: z.ZodIssueCode.custom,
142
+ message: "You must accept the terms",
143
+ path: ["acceptedTerms"],
144
+ });
145
+ }
146
+
147
+ if (values.paymentMethod !== "card") return;
148
+
149
+ const name = (values.cardName ?? "").trim();
150
+ if (!name) {
151
+ ctx.addIssue({
152
+ code: z.ZodIssueCode.custom,
153
+ message: "Name on card is required",
154
+ path: ["cardName"],
155
+ });
156
+ }
157
+
158
+ const cardNumber = (values.cardNumber ?? "").replaceAll(" ", "").trim();
159
+ if (cardNumber.length < 12) {
160
+ ctx.addIssue({
161
+ code: z.ZodIssueCode.custom,
162
+ message: "Enter a valid card number",
163
+ path: ["cardNumber"],
164
+ });
165
+ }
166
+
167
+ const expiry = (values.cardExpiry ?? "").trim();
168
+ if (!/^\d{2}\s?\/\s?\d{2}$/.test(expiry)) {
169
+ ctx.addIssue({
170
+ code: z.ZodIssueCode.custom,
171
+ message: "Use MM / YY format",
172
+ path: ["cardExpiry"],
173
+ });
174
+ }
175
+
176
+ const cvc = (values.cardCvc ?? "").trim();
177
+ if (cvc.length !== 3) {
178
+ ctx.addIssue({
179
+ code: z.ZodIssueCode.custom,
180
+ message: "Enter a valid CVC",
181
+ path: ["cardCvc"],
182
+ });
183
+ }
184
+ });
185
+
186
+ type CheckoutValues = z.infer<typeof checkoutSchema>;
187
+
188
+ const steps: Array<{
189
+ id: Exclude<CheckoutStep, "cart">;
190
+ step: number;
191
+ title: string;
192
+ description: string;
193
+ }> = [
194
+ {
195
+ id: "information",
196
+ step: 1,
197
+ title: "Information",
198
+ description: "Contact details",
199
+ },
200
+ {
201
+ id: "shipping",
202
+ step: 2,
203
+ title: "Shipping",
204
+ description: "Delivery options",
205
+ },
206
+ { id: "payment", step: 3, title: "Payment", description: "Pay securely" },
207
+ ];
208
+
209
+ function formatMoney(value: number) {
210
+ return new Intl.NumberFormat("en-US", {
211
+ style: "currency",
212
+ currency: "USD",
213
+ maximumFractionDigits: 0,
214
+ }).format(value);
215
+ }
216
+
217
+ export default function CheckoutPage4() {
218
+ const cardNumberMaskRef = useMaskInput({ mask: "9999 9999 9999 9999" });
219
+ const cardExpiryMaskRef = useMaskInput({ mask: "99/99" });
220
+ const cardCvcMaskRef = useMaskInput({ mask: "999" });
221
+
222
+ const step = useCheckoutPage4Store((s) => s.step);
223
+ const setStep = useCheckoutPage4Store((s) => s.setStep);
224
+ const items = useCheckoutPage4Store((s) => s.items);
225
+ const updateQuantity = useCheckoutPage4Store((s) => s.updateQuantity);
226
+
227
+ const activeStepNumber = steps.find((s) => s.id === step)?.step ?? 1;
228
+
229
+ const handleStepperChange = (nextStepNumber: number) => {
230
+ const next = steps.find((s) => s.step === nextStepNumber)?.id;
231
+ if (next) setStep(next);
232
+ };
233
+
234
+ const form = useForm<CheckoutValues>({
235
+ resolver: zodResolver(checkoutSchema),
236
+ defaultValues: {
237
+ deliveryMethod: "delivery",
238
+ fullName: "",
239
+ email: "",
240
+ phoneCode: "+49",
241
+ phoneNumber: "",
242
+ country: "bd",
243
+ city: "",
244
+ state: "",
245
+ zipCode: "",
246
+ addressLine1: "",
247
+ addressLine2: "",
248
+ shippingMethod: "standard",
249
+ discountCode: "",
250
+ paymentMethod: "card",
251
+ cardName: "",
252
+ cardNumber: "",
253
+ cardExpiry: "",
254
+ cardCvc: "",
255
+ acceptedTerms: false,
256
+ },
257
+ mode: "onSubmit",
258
+ });
259
+
260
+ const deliveryMethod = useWatch({
261
+ control: form.control,
262
+ name: "deliveryMethod",
263
+ });
264
+ const shippingMethod = useWatch({
265
+ control: form.control,
266
+ name: "shippingMethod",
267
+ });
268
+ const discountCode = useWatch({
269
+ control: form.control,
270
+ name: "discountCode",
271
+ });
272
+
273
+ const [appliedDiscount, setAppliedDiscount] = useState(0);
274
+
275
+ const subtotal = useMemo(
276
+ () => items.reduce((sum, item) => sum + item.price * item.quantity, 0),
277
+ [items],
278
+ );
279
+
280
+ const computedShipping = useMemo(() => {
281
+ if (deliveryMethod === "pickup") return 0;
282
+ return shippingMethod === "express" ? 8 : 0;
283
+ }, [deliveryMethod, shippingMethod]);
284
+
285
+ const total = Math.max(subtotal + computedShipping - appliedDiscount, 0);
286
+
287
+ const handleApplyDiscount = () => {
288
+ const code = (form.getValues("discountCode") ?? "").trim().toUpperCase();
289
+ if (!code) {
290
+ setAppliedDiscount(0);
291
+ return;
292
+ }
293
+
294
+ if (code) setAppliedDiscount(10);
295
+ else setAppliedDiscount(0);
296
+ };
297
+
298
+ const canComputeShipping = step === "payment" || step === "shipping";
299
+
300
+ const validateAndGoNext = async () => {
301
+ const stepFields: Record<
302
+ Exclude<CheckoutStep, "cart">,
303
+ Array<keyof CheckoutValues>
304
+ > = {
305
+ information: [
306
+ "deliveryMethod",
307
+ "fullName",
308
+ "email",
309
+ "phoneCode",
310
+ "phoneNumber",
311
+ "country",
312
+ "city",
313
+ "state",
314
+ "zipCode",
315
+ "addressLine1",
316
+ "addressLine2",
317
+ "acceptedTerms",
318
+ ],
319
+ shipping: ["shippingMethod"],
320
+ payment: [
321
+ "paymentMethod",
322
+ "cardName",
323
+ "cardNumber",
324
+ "cardExpiry",
325
+ "cardCvc",
326
+ ],
327
+ };
328
+
329
+ const currentIndex = steps.findIndex((s) => s.id === step);
330
+ if (currentIndex === -1) {
331
+ setStep("information");
332
+ return;
333
+ }
334
+
335
+ const fields = stepFields[step as Exclude<CheckoutStep, "cart">];
336
+ const ok =
337
+ fields.length === 0
338
+ ? true
339
+ : await form.trigger(fields, { shouldFocus: true });
340
+ if (!ok) return;
341
+
342
+ const next = steps[currentIndex + 1]?.id;
343
+ if (next) {
344
+ setStep(next);
345
+ return;
346
+ }
347
+
348
+ // Last step: fake submit.
349
+ onSubmit(form.getValues() as CheckoutValues);
350
+ };
351
+
352
+ const onSubmit = (values: CheckoutValues) => {
353
+ console.log("Checkout submitted", {
354
+ ...values,
355
+ appliedDiscount,
356
+ items,
357
+ subtotal,
358
+ shipping: computedShipping,
359
+ total,
360
+ });
361
+ };
362
+
363
+ return (
364
+ <section className="mx-auto w-full max-w-5xl px-4 py-12 lg:py-20">
365
+ <header className="mb-8">
366
+ <Stepper
367
+ defaultValue={2}
368
+ value={activeStepNumber}
369
+ onValueChange={handleStepperChange}
370
+ >
371
+ {steps.map(({ step: stepNumber, title, description }) => (
372
+ <StepperItem
373
+ className="relative not-last:flex-1 max-md:items-start"
374
+ key={stepNumber}
375
+ step={stepNumber}
376
+ >
377
+ <StepperTrigger className="rounded max-md:flex-col">
378
+ <StepperIndicator className="data-[state=completed]:bg-emerald-500 data-[state=completed]:text-white" />
379
+ <StepperTitle>{title}</StepperTitle>
380
+ </StepperTrigger>
381
+ {stepNumber < steps.length && (
382
+ <StepperSeparator className="max-md:mt-3.5 md:mx-4" />
383
+ )}
384
+ </StepperItem>
385
+ ))}
386
+ </Stepper>
387
+ </header>
388
+
389
+ <div className="grid gap-4 lg:grid-cols-[1fr_420px] lg:items-start lg:gap-8">
390
+ <main className="min-w-0">
391
+ <Form {...form}>
392
+ <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-8">
393
+ <div
394
+ hidden={step !== "information"}
395
+ aria-hidden={step !== "information"}
396
+ className="space-y-8"
397
+ >
398
+ <section className="space-y-3">
399
+ <h3 className="text-sm font-medium">Pick Delivery Method</h3>
400
+ <FormField
401
+ control={form.control}
402
+ name="deliveryMethod"
403
+ render={({ field }) => (
404
+ <FormItem>
405
+ <FormControl>
406
+ <RadioGroup
407
+ value={field.value}
408
+ onValueChange={field.onChange}
409
+ className="grid grid-cols-2"
410
+ >
411
+ <label className="border-input has-checked:ring-ring text-muted-foreground has-checked:text-primary flex items-center gap-2 rounded-md border p-4 has-checked:ring">
412
+ <RadioGroupItem
413
+ value="delivery"
414
+ className="sr-only"
415
+ />
416
+ <Truck className="text-muted-foreground size-4" />
417
+ <span>Delivery</span>
418
+ </label>
419
+ <label className="border-input has-checked:ring-ring text-muted-foreground has-checked:text-primary flex items-center gap-2 rounded-md border p-4 has-checked:ring">
420
+ <RadioGroupItem
421
+ value="pickup"
422
+ className="sr-only"
423
+ />
424
+ <Store className="text-muted-foreground size-4" />
425
+ <span>Pickup</span>
426
+ </label>
427
+ </RadioGroup>
428
+ </FormControl>
429
+ </FormItem>
430
+ )}
431
+ />
432
+ </section>
433
+
434
+ <section className="space-y-6">
435
+ <h3 className="text-sm font-medium">Shipping Information</h3>
436
+ <FormField
437
+ control={form.control}
438
+ name="fullName"
439
+ render={({ field }) => (
440
+ <FormItem>
441
+ <FormLabel>Full Name</FormLabel>
442
+ <FormControl>
443
+ <Input placeholder="Enter your name" {...field} />
444
+ </FormControl>
445
+ </FormItem>
446
+ )}
447
+ />
448
+
449
+ <FormField
450
+ control={form.control}
451
+ name="email"
452
+ render={({ field }) => (
453
+ <FormItem>
454
+ <FormLabel>Email</FormLabel>
455
+ <FormControl>
456
+ <Input
457
+ placeholder="Enter your email"
458
+ type="email"
459
+ {...field}
460
+ />
461
+ </FormControl>
462
+ </FormItem>
463
+ )}
464
+ />
465
+
466
+ <FormField
467
+ control={form.control}
468
+ name="phoneNumber"
469
+ render={({ field }) => (
470
+ <FormItem>
471
+ <FormLabel>Phone Number</FormLabel>
472
+ <FormControl>
473
+ <div className="flex gap-2">
474
+ <FormField
475
+ control={form.control}
476
+ name="phoneCode"
477
+ render={({ field: codeField }) => (
478
+ <FormItem className="w-28 space-y-0">
479
+ <FormControl>
480
+ <Select
481
+ value={codeField.value}
482
+ onValueChange={codeField.onChange}
483
+ >
484
+ <SelectTrigger className="w-full">
485
+ <SelectValue placeholder="Code" />
486
+ </SelectTrigger>
487
+ <SelectContent>
488
+ <SelectItem value="+880">
489
+ +880
490
+ </SelectItem>
491
+ <SelectItem value="+1">+1</SelectItem>
492
+ <SelectItem value="+49">+49</SelectItem>
493
+ <SelectItem value="+44">+44</SelectItem>
494
+ <SelectItem value="+33">+33</SelectItem>
495
+ <SelectItem value="+34">+34</SelectItem>
496
+ <SelectItem value="+39">+39</SelectItem>
497
+ </SelectContent>
498
+ </Select>
499
+ </FormControl>
500
+ </FormItem>
501
+ )}
502
+ />
503
+
504
+ <Input
505
+ placeholder="151 898 9280"
506
+ type="tel"
507
+ {...field}
508
+ />
509
+ </div>
510
+ </FormControl>
511
+ </FormItem>
512
+ )}
513
+ />
514
+
515
+ <div className="grid gap-4 md:grid-cols-2">
516
+ <FormField
517
+ control={form.control}
518
+ name="country"
519
+ render={({ field }) => (
520
+ <FormItem>
521
+ <FormLabel>Country</FormLabel>
522
+ <FormControl>
523
+ <Select
524
+ value={field.value}
525
+ onValueChange={field.onChange}
526
+ >
527
+ <SelectTrigger className="w-full">
528
+ <SelectValue placeholder="Select country" />
529
+ </SelectTrigger>
530
+ <SelectContent>
531
+ <SelectItem value="bd">Bangladesh</SelectItem>
532
+ <SelectItem value="us">
533
+ United States
534
+ </SelectItem>
535
+ <SelectItem value="de">Germany</SelectItem>
536
+ </SelectContent>
537
+ </Select>
538
+ </FormControl>
539
+ </FormItem>
540
+ )}
541
+ />
542
+
543
+ <FormField
544
+ control={form.control}
545
+ name="addressLine1"
546
+ render={({ field }) => (
547
+ <FormItem>
548
+ <FormLabel>Address</FormLabel>
549
+ <FormControl>
550
+ <Input placeholder="Street address" {...field} />
551
+ </FormControl>
552
+ </FormItem>
553
+ )}
554
+ />
555
+ </div>
556
+
557
+ <div className="grid gap-4 md:grid-cols-3">
558
+ <FormField
559
+ control={form.control}
560
+ name="city"
561
+ render={({ field }) => (
562
+ <FormItem>
563
+ <FormLabel>City</FormLabel>
564
+ <FormControl>
565
+ <Input placeholder="City" {...field} />
566
+ </FormControl>
567
+ </FormItem>
568
+ )}
569
+ />
570
+ <FormField
571
+ control={form.control}
572
+ name="state"
573
+ render={({ field }) => (
574
+ <FormItem>
575
+ <FormLabel>State</FormLabel>
576
+ <FormControl>
577
+ <Input placeholder="State" {...field} />
578
+ </FormControl>
579
+ </FormItem>
580
+ )}
581
+ />
582
+ <FormField
583
+ control={form.control}
584
+ name="zipCode"
585
+ render={({ field }) => (
586
+ <FormItem>
587
+ <FormLabel>Zip Code</FormLabel>
588
+ <FormControl>
589
+ <Input placeholder="Zip code" {...field} />
590
+ </FormControl>
591
+ </FormItem>
592
+ )}
593
+ />
594
+ </div>
595
+
596
+ <FormField
597
+ control={form.control}
598
+ name="addressLine2"
599
+ render={({ field }) => (
600
+ <FormItem>
601
+ <FormLabel>Apartment, Suit, Flat etc.</FormLabel>
602
+ <FormControl>
603
+ <Input placeholder="Optional" {...field} />
604
+ </FormControl>
605
+ </FormItem>
606
+ )}
607
+ />
608
+
609
+ <FormField
610
+ control={form.control}
611
+ name="acceptedTerms"
612
+ render={({ field }) => (
613
+ <FormItem>
614
+ <div className="flex items-start gap-3">
615
+ <FormControl>
616
+ <Checkbox
617
+ checked={field.value}
618
+ onCheckedChange={(checked) =>
619
+ field.onChange(checked === true)
620
+ }
621
+ aria-label="Accept terms"
622
+ />
623
+ </FormControl>
624
+ <FormLabel className="leading-snug">
625
+ I accept the terms and conditions of service.
626
+ </FormLabel>
627
+ </div>
628
+ </FormItem>
629
+ )}
630
+ />
631
+ </section>
632
+ </div>
633
+
634
+ <div
635
+ hidden={step !== "shipping"}
636
+ aria-hidden={step !== "shipping"}
637
+ className="space-y-4"
638
+ >
639
+ <div className="space-y-1">
640
+ <h2 className="text-xl font-semibold">Shipping</h2>
641
+ <p className="text-muted-foreground text-sm">
642
+ Choose a shipping option for your order.
643
+ </p>
644
+ </div>
645
+
646
+ <FormField
647
+ control={form.control}
648
+ name="shippingMethod"
649
+ render={({ field }) => (
650
+ <FormItem>
651
+ <FormControl>
652
+ <RadioGroup
653
+ value={field.value}
654
+ onValueChange={field.onChange}
655
+ className="grid gap-3"
656
+ >
657
+ <label className="border-input has-checked:ring-ring flex items-center justify-between gap-4 rounded-md border p-4 has-checked:ring">
658
+ <div className="space-y-1">
659
+ <p className="text-sm font-medium">
660
+ Standard Shipping
661
+ </p>
662
+ <p className="text-muted-foreground text-xs">
663
+ 3–7 business days
664
+ </p>
665
+ </div>
666
+ <div className="flex items-center gap-3">
667
+ <span className="text-sm font-semibold">
668
+ {deliveryMethod === "pickup"
669
+ ? formatMoney(0)
670
+ : formatMoney(0)}
671
+ </span>
672
+ <RadioGroupItem
673
+ value="standard"
674
+ className="sr-only"
675
+ />
676
+ </div>
677
+ </label>
678
+ <label className="border-input has-checked:ring-ring flex items-center justify-between gap-4 rounded-md border p-4 has-checked:ring">
679
+ <div className="space-y-1">
680
+ <p className="text-sm font-medium">
681
+ Express Shipping
682
+ </p>
683
+ <p className="text-muted-foreground text-xs">
684
+ 1–2 business days
685
+ </p>
686
+ </div>
687
+ <div className="flex items-center gap-3">
688
+ <span className="text-sm font-semibold">
689
+ {deliveryMethod === "pickup"
690
+ ? formatMoney(0)
691
+ : formatMoney(8)}
692
+ </span>
693
+ <RadioGroupItem
694
+ value="express"
695
+ className="sr-only"
696
+ />
697
+ </div>
698
+ </label>
699
+ </RadioGroup>
700
+ </FormControl>
701
+ </FormItem>
702
+ )}
703
+ />
704
+ </div>
705
+
706
+ <div
707
+ hidden={step !== "payment"}
708
+ aria-hidden={step !== "payment"}
709
+ className="space-y-6"
710
+ >
711
+ <div className="space-y-1">
712
+ <h2 className="text-xl font-semibold">Payment</h2>
713
+ <p className="text-muted-foreground text-xs">
714
+ Complete your purchase by providing payment details.
715
+ </p>
716
+ </div>
717
+
718
+ <section className="space-y-4">
719
+ <h2 className="text-lg font-semibold">Express Checkout</h2>
720
+ <div className="grid grid-cols-2 gap-3">
721
+ <Button type="button" size="lg" variant="outline">
722
+ <GooglePayLogo />
723
+ Google Pay
724
+ </Button>
725
+ <Button type="button" size="lg" variant="outline">
726
+ <PaypalLogo />
727
+ PayPal
728
+ </Button>
729
+ </div>
730
+ </section>
731
+
732
+ <div className="flex items-center gap-3">
733
+ <Separator className="flex-1" />
734
+ <span className="text-muted-foreground text-xs tracking-widest uppercase">
735
+ or
736
+ </span>
737
+ <Separator className="flex-1" />
738
+ </div>
739
+
740
+ <div className="space-y-4">
741
+ <FormField
742
+ control={form.control}
743
+ name="cardName"
744
+ render={({ field }) => (
745
+ <FormItem>
746
+ <FormLabel>Name on card</FormLabel>
747
+ <FormControl>
748
+ <Input placeholder="John Doe" {...field} />
749
+ </FormControl>
750
+ </FormItem>
751
+ )}
752
+ />
753
+
754
+ <FormField
755
+ control={form.control}
756
+ name="cardNumber"
757
+ render={({ field }) => (
758
+ <FormItem>
759
+ <FormLabel>Card number</FormLabel>
760
+ <FormControl>
761
+ {(() => {
762
+ const { ref, ...restField } = field;
763
+ return (
764
+ <InputGroup>
765
+ <InputGroupInput
766
+ placeholder="1234 5678 9012 3456"
767
+ inputMode="numeric"
768
+ ref={(element) => {
769
+ (
770
+ cardNumberMaskRef as unknown as React.MutableRefObject<HTMLInputElement | null>
771
+ ).current = element;
772
+ ref(element);
773
+ }}
774
+ {...restField}
775
+ />
776
+ <InputGroupAddon align="inline-end">
777
+ <span className="text-muted-foreground px-3 text-xs font-medium">
778
+ VISA
779
+ </span>
780
+ </InputGroupAddon>
781
+ </InputGroup>
782
+ );
783
+ })()}
784
+ </FormControl>
785
+ </FormItem>
786
+ )}
787
+ />
788
+
789
+ <div className="grid gap-4 sm:grid-cols-2">
790
+ <FormField
791
+ control={form.control}
792
+ name="cardExpiry"
793
+ render={({ field }) => (
794
+ <FormItem>
795
+ <FormLabel>Expiry</FormLabel>
796
+ <FormControl>
797
+ {(() => {
798
+ const { ref, ...restField } = field;
799
+ return (
800
+ <Input
801
+ placeholder="MM/YY"
802
+ inputMode="numeric"
803
+ ref={(element) => {
804
+ (
805
+ cardExpiryMaskRef as unknown as React.MutableRefObject<HTMLInputElement | null>
806
+ ).current = element;
807
+ ref(element);
808
+ }}
809
+ {...restField}
810
+ />
811
+ );
812
+ })()}
813
+ </FormControl>
814
+ </FormItem>
815
+ )}
816
+ />
817
+
818
+ <FormField
819
+ control={form.control}
820
+ name="cardCvc"
821
+ render={({ field }) => (
822
+ <FormItem>
823
+ <FormLabel>CVC</FormLabel>
824
+ <FormControl>
825
+ {(() => {
826
+ const { ref, ...restField } = field;
827
+ return (
828
+ <Input
829
+ placeholder="123"
830
+ inputMode="numeric"
831
+ ref={(element) => {
832
+ (
833
+ cardCvcMaskRef as unknown as React.MutableRefObject<HTMLInputElement | null>
834
+ ).current = element;
835
+ ref(element);
836
+ }}
837
+ {...restField}
838
+ />
839
+ );
840
+ })()}
841
+ </FormControl>
842
+ </FormItem>
843
+ )}
844
+ />
845
+ </div>
846
+ </div>
847
+ </div>
848
+ </form>
849
+ </Form>
850
+ </main>
851
+
852
+ <Card className="shadow-none">
853
+ <CardContent className="space-y-6">
854
+ <div className="space-y-6">
855
+ {items.map((item) => (
856
+ <div key={item.id} className="flex items-start gap-4">
857
+ <div className="relative size-16 overflow-hidden rounded-md">
858
+ <Image
859
+ src={item.imageSrc}
860
+ alt={item.imageAlt}
861
+ width={50}
862
+ height={50}
863
+ className="h-full w-full object-cover"
864
+ unoptimized
865
+ />
866
+ </div>
867
+ <div className="min-w-0 flex-1 space-y-2">
868
+ <div className="flex justify-between">
869
+ <p className="truncate text-sm font-semibold">
870
+ {item.name}
871
+ </p>
872
+
873
+ <div className="text-right">
874
+ <p className="text-sm font-semibold">
875
+ {formatMoney(item.price)}
876
+ </p>
877
+ </div>
878
+ </div>
879
+ <div className="flex justify-between">
880
+ <div className="min-w-0">
881
+ <p className="text-muted-foreground text-xs">
882
+ Color {item.variant.color}
883
+ </p>
884
+ <p className="text-muted-foreground text-xs">
885
+ Size {item.variant.size}
886
+ </p>
887
+ </div>
888
+ <InputGroup className="max-w-28" aria-label="Quantity">
889
+ <InputGroupAddon align="inline-start">
890
+ <InputGroupButton
891
+ aria-label="Decrease quantity"
892
+ onClick={() =>
893
+ updateQuantity(item.id, item.quantity - 1)
894
+ }
895
+ >
896
+ -
897
+ </InputGroupButton>
898
+ </InputGroupAddon>
899
+ <InputGroupInput
900
+ value={String(item.quantity)}
901
+ readOnly
902
+ inputMode="numeric"
903
+ aria-label="Item quantity"
904
+ className="text-center tabular-nums"
905
+ />
906
+ <InputGroupAddon align="inline-end">
907
+ <InputGroupButton
908
+ aria-label="Increase quantity"
909
+ onClick={() =>
910
+ updateQuantity(item.id, item.quantity + 1)
911
+ }
912
+ >
913
+ +
914
+ </InputGroupButton>
915
+ </InputGroupAddon>
916
+ </InputGroup>
917
+ </div>
918
+ </div>
919
+ </div>
920
+ ))}
921
+ </div>
922
+
923
+ <div className="flex items-center gap-2">
924
+ <Input
925
+ placeholder="Coupon code"
926
+ value={discountCode ?? ""}
927
+ onChange={(event) =>
928
+ form.setValue("discountCode", event.target.value)
929
+ }
930
+ />
931
+ <Button
932
+ type="button"
933
+ variant="outline"
934
+ onClick={handleApplyDiscount}
935
+ >
936
+ Apply
937
+ </Button>
938
+ </div>
939
+
940
+ <dl className="space-y-3 text-sm">
941
+ <div className="flex items-center justify-between">
942
+ <dt className="text-muted-foreground">Subtotal</dt>
943
+ <dd className="font-medium">{formatMoney(subtotal)}</dd>
944
+ </div>
945
+ <div className="flex items-center justify-between">
946
+ <dt className="text-muted-foreground">Shipping</dt>
947
+ <dd className="font-medium">
948
+ {canComputeShipping ? (
949
+ formatMoney(computedShipping)
950
+ ) : (
951
+ <span className="text-muted-foreground text-xs">
952
+ Calculated at next step
953
+ </span>
954
+ )}
955
+ </dd>
956
+ </div>
957
+ {appliedDiscount > 0 && (
958
+ <div className="flex items-center justify-between">
959
+ <dt className="text-muted-foreground">Discount</dt>
960
+ <dd className="font-medium">
961
+ -{formatMoney(appliedDiscount)}
962
+ </dd>
963
+ </div>
964
+ )}
965
+ </dl>
966
+
967
+ <Separator />
968
+
969
+ <div className="flex items-center justify-between">
970
+ <span className="text-sm font-semibold">Total</span>
971
+ <span className="text-base font-semibold">
972
+ {formatMoney(total)}
973
+ </span>
974
+ </div>
975
+
976
+ <Button
977
+ type="submit"
978
+ className="w-full"
979
+ size="lg"
980
+ onClick={validateAndGoNext}
981
+ >
982
+ {step === "payment"
983
+ ? "Complete Payment"
984
+ : step === "shipping"
985
+ ? "Continue to Payment"
986
+ : "Continue to Shipping"}
987
+ </Button>
988
+ </CardContent>
989
+ </Card>
990
+ </div>
991
+ </section>
992
+ );
993
+ }
994
+
995
+ const GooglePayLogo = () => {
996
+ return (
997
+ <img
998
+ className="size-5"
999
+ src="data:image/svg+xml,%3Csvg%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Asvg%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.1%22%20viewBox%3D%220%200%20268.1522%20273.8827%22%20overflow%3D%22hidden%22%20xml%3Aspace%3D%22preserve%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22a%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%230fbc5c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%230cba65%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22g%22%3E%3Cstop%20offset%3D%22.2312727%22%20stop-color%3D%22%230fbc5f%22%2F%3E%3Cstop%20offset%3D%22.3115468%22%20stop-color%3D%22%230fbc5f%22%2F%3E%3Cstop%20offset%3D%22.3660131%22%20stop-color%3D%22%230fbc5e%22%2F%3E%3Cstop%20offset%3D%22.4575163%22%20stop-color%3D%22%230fbc5d%22%2F%3E%3Cstop%20offset%3D%22.540305%22%20stop-color%3D%22%2312bc58%22%2F%3E%3Cstop%20offset%3D%22.6993464%22%20stop-color%3D%22%2328bf3c%22%2F%3E%3Cstop%20offset%3D%22.7712418%22%20stop-color%3D%22%2338c02b%22%2F%3E%3Cstop%20offset%3D%22.8605665%22%20stop-color%3D%22%2352c218%22%2F%3E%3Cstop%20offset%3D%22.9150327%22%20stop-color%3D%22%2367c30f%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2386c504%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22h%22%3E%3Cstop%20offset%3D%22.1416122%22%20stop-color%3D%22%231abd4d%22%2F%3E%3Cstop%20offset%3D%22.2475151%22%20stop-color%3D%22%236ec30d%22%2F%3E%3Cstop%20offset%3D%22.3115468%22%20stop-color%3D%22%238ac502%22%2F%3E%3Cstop%20offset%3D%22.3660131%22%20stop-color%3D%22%23a2c600%22%2F%3E%3Cstop%20offset%3D%22.4456735%22%20stop-color%3D%22%23c8c903%22%2F%3E%3Cstop%20offset%3D%22.540305%22%20stop-color%3D%22%23ebcb03%22%2F%3E%3Cstop%20offset%3D%22.6156363%22%20stop-color%3D%22%23f7cd07%22%2F%3E%3Cstop%20offset%3D%22.6993454%22%20stop-color%3D%22%23fdcd04%22%2F%3E%3Cstop%20offset%3D%22.7712418%22%20stop-color%3D%22%23fdce05%22%2F%3E%3Cstop%20offset%3D%22.8605661%22%20stop-color%3D%22%23ffce0a%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22f%22%3E%3Cstop%20offset%3D%22.3159041%22%20stop-color%3D%22%23ff4c3c%22%2F%3E%3Cstop%20offset%3D%22.6038179%22%20stop-color%3D%22%23ff692c%22%2F%3E%3Cstop%20offset%3D%22.7268366%22%20stop-color%3D%22%23ff7825%22%2F%3E%3Cstop%20offset%3D%22.884534%22%20stop-color%3D%22%23ff8d1b%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23ff9f13%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22b%22%3E%3Cstop%20offset%3D%22.2312727%22%20stop-color%3D%22%23ff4541%22%2F%3E%3Cstop%20offset%3D%22.3115468%22%20stop-color%3D%22%23ff4540%22%2F%3E%3Cstop%20offset%3D%22.4575163%22%20stop-color%3D%22%23ff4640%22%2F%3E%3Cstop%20offset%3D%22.540305%22%20stop-color%3D%22%23ff473f%22%2F%3E%3Cstop%20offset%3D%22.6993464%22%20stop-color%3D%22%23ff5138%22%2F%3E%3Cstop%20offset%3D%22.7712418%22%20stop-color%3D%22%23ff5b33%22%2F%3E%3Cstop%20offset%3D%22.8605665%22%20stop-color%3D%22%23ff6c29%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23ff8c18%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22d%22%3E%3Cstop%20offset%3D%22.4084578%22%20stop-color%3D%22%23fb4e5a%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23ff4540%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22c%22%3E%3Cstop%20offset%3D%22.1315461%22%20stop-color%3D%22%230cba65%22%2F%3E%3Cstop%20offset%3D%22.2097843%22%20stop-color%3D%22%230bb86d%22%2F%3E%3Cstop%20offset%3D%22.2972969%22%20stop-color%3D%22%2309b479%22%2F%3E%3Cstop%20offset%3D%22.3962575%22%20stop-color%3D%22%2308ad93%22%2F%3E%3Cstop%20offset%3D%22.4771242%22%20stop-color%3D%22%230aa6a9%22%2F%3E%3Cstop%20offset%3D%22.5684245%22%20stop-color%3D%22%230d9cc6%22%2F%3E%3Cstop%20offset%3D%22.667385%22%20stop-color%3D%22%231893dd%22%2F%3E%3Cstop%20offset%3D%22.7687273%22%20stop-color%3D%22%23258bf1%22%2F%3E%3Cstop%20offset%3D%22.8585063%22%20stop-color%3D%22%233086ff%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22e%22%3E%3Cstop%20offset%3D%22.3660131%22%20stop-color%3D%22%23ff4e3a%22%2F%3E%3Cstop%20offset%3D%22.4575163%22%20stop-color%3D%22%23ff8a1b%22%2F%3E%3Cstop%20offset%3D%22.540305%22%20stop-color%3D%22%23ffa312%22%2F%3E%3Cstop%20offset%3D%22.6156363%22%20stop-color%3D%22%23ffb60c%22%2F%3E%3Cstop%20offset%3D%22.7712418%22%20stop-color%3D%22%23ffcd0a%22%2F%3E%3Cstop%20offset%3D%22.8605665%22%20stop-color%3D%22%23fecf0a%22%2F%3E%3Cstop%20offset%3D%22.9150327%22%20stop-color%3D%22%23fecf08%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23fdcd01%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20xlink%3Ahref%3D%22%23a%22%20id%3D%22s%22%20x1%3D%22219.6997%22%20y1%3D%22329.5351%22%20x2%3D%22254.4673%22%20y2%3D%22329.5351%22%20gradientUnits%3D%22userSpaceOnUse%22%2F%3E%3CradialGradient%20xlink%3Ahref%3D%22%23b%22%20id%3D%22m%22%20gradientUnits%3D%22userSpaceOnUse%22%20gradientTransform%3D%22matrix(-1.936885%2C1.043001%2C1.455731%2C2.555422%2C290.5254%2C-400.6338)%22%20cx%3D%22109.6267%22%20cy%3D%22135.8619%22%20fx%3D%22109.6267%22%20fy%3D%22135.8619%22%20r%3D%2271.46001%22%2F%3E%3CradialGradient%20xlink%3Ahref%3D%22%23c%22%20id%3D%22n%22%20gradientUnits%3D%22userSpaceOnUse%22%20gradientTransform%3D%22matrix(-3.512595%2C-4.45809%2C-1.692547%2C1.260616%2C870.8006%2C191.554)%22%20cx%3D%2245.25866%22%20cy%3D%22279.2738%22%20fx%3D%2245.25866%22%20fy%3D%22279.2738%22%20r%3D%2271.46001%22%2F%3E%3CradialGradient%20xlink%3Ahref%3D%22%23d%22%20id%3D%22l%22%20cx%3D%22304.0166%22%20cy%3D%22118.0089%22%20fx%3D%22304.0166%22%20fy%3D%22118.0089%22%20r%3D%2247.85445%22%20gradientTransform%3D%22matrix(2.064353%2C-4.926832e-6%2C-2.901531e-6%2C2.592041%2C-297.6788%2C-151.7469)%22%20gradientUnits%3D%22userSpaceOnUse%22%2F%3E%3CradialGradient%20xlink%3Ahref%3D%22%23e%22%20id%3D%22o%22%20gradientUnits%3D%22userSpaceOnUse%22%20gradientTransform%3D%22matrix(-0.2485783%2C2.083138%2C2.962486%2C0.3341668%2C-255.1463%2C-331.1636)%22%20cx%3D%22181.001%22%20cy%3D%22177.2013%22%20fx%3D%22181.001%22%20fy%3D%22177.2013%22%20r%3D%2271.46001%22%2F%3E%3CradialGradient%20xlink%3Ahref%3D%22%23f%22%20id%3D%22p%22%20cx%3D%22207.6733%22%20cy%3D%22108.0972%22%20fx%3D%22207.6733%22%20fy%3D%22108.0972%22%20r%3D%2241.1025%22%20gradientTransform%3D%22matrix(-1.249206%2C1.343263%2C-3.896837%2C-3.425693%2C880.5011%2C194.9051)%22%20gradientUnits%3D%22userSpaceOnUse%22%2F%3E%3CradialGradient%20xlink%3Ahref%3D%22%23g%22%20id%3D%22r%22%20gradientUnits%3D%22userSpaceOnUse%22%20gradientTransform%3D%22matrix(-1.936885%2C-1.043001%2C1.455731%2C-2.555422%2C290.5254%2C838.6834)%22%20cx%3D%22109.6267%22%20cy%3D%22135.8619%22%20fx%3D%22109.6267%22%20fy%3D%22135.8619%22%20r%3D%2271.46001%22%2F%3E%3CradialGradient%20xlink%3Ahref%3D%22%23h%22%20id%3D%22j%22%20gradientUnits%3D%22userSpaceOnUse%22%20gradientTransform%3D%22matrix(-0.081402%2C-1.93722%2C2.926737%2C-0.1162508%2C-215.1345%2C632.8606)%22%20cx%3D%22154.8697%22%20cy%3D%22145.9691%22%20fx%3D%22154.8697%22%20fy%3D%22145.9691%22%20r%3D%2271.46001%22%2F%3E%3Cfilter%20id%3D%22q%22%20x%3D%22-.04842873%22%20y%3D%22-.0582241%22%20width%3D%221.096857%22%20height%3D%221.116448%22%20color-interpolation-filters%3D%22sRGB%22%3E%3CfeGaussianBlur%20stdDeviation%3D%221.700914%22%2F%3E%3C%2Ffilter%3E%3Cfilter%20id%3D%22k%22%20x%3D%22-.01670084%22%20y%3D%22-.01009856%22%20width%3D%221.033402%22%20height%3D%221.020197%22%20color-interpolation-filters%3D%22sRGB%22%3E%3CfeGaussianBlur%20stdDeviation%3D%22.2419367%22%2F%3E%3C%2Ffilter%3E%3CclipPath%20clipPathUnits%3D%22userSpaceOnUse%22%20id%3D%22i%22%3E%3Cpath%20d%3D%22M371.3784%20193.2406H237.0825v53.4375h77.167c-1.2405%207.5627-4.0259%2015.0024-8.1049%2021.7862-4.6734%207.7723-10.4511%2013.6895-16.373%2018.1957-17.7389%2013.4983-38.42%2016.2584-52.7828%2016.2584-36.2824%200-67.2833-23.2865-79.2844-54.9287-.4843-1.1482-.8059-2.3344-1.1975-3.5068-2.652-8.0533-4.101-16.5825-4.101-25.4474%200-9.226%201.5691-18.0575%204.4301-26.3985%2011.2851-32.8967%2042.9849-57.4674%2080.1789-57.4674%207.4811%200%2014.6854.8843%2021.5173%202.6481%2015.6135%204.0309%2026.6578%2011.9698%2033.4252%2018.2494l40.834-39.7111c-24.839-22.616-57.2194-36.3201-95.8444-36.3201-30.8782-.00066-59.3863%209.55308-82.7477%2025.6992-18.9454%2013.0941-34.4833%2030.6254-44.9695%2050.9861-9.75366%2018.8785-15.09441%2039.7994-15.09441%2062.2934%200%2022.495%205.34891%2043.6334%2015.10261%2062.3374v.126c10.3023%2019.8567%2025.3678%2036.9537%2043.6783%2049.9878%2015.9962%2011.3866%2044.6789%2026.5516%2084.0307%2026.5516%2022.6301%200%2042.6867-4.0517%2060.3748-11.6447%2012.76-5.4775%2024.0655-12.6217%2034.3012-21.8036%2013.5247-12.1323%2024.1168-27.1388%2031.3465-44.4041%207.2297-17.2654%2011.097-36.7895%2011.097-57.957%200-9.858-.9971-19.8694-2.6881-28.9684Z%22%20fill%3D%22%23000%22%2F%3E%3C%2FclipPath%3E%3C%2Fdefs%3E%3Cg%20transform%3D%22matrix(0.957922%2C0%2C0%2C0.985255%2C-90.17436%2C-78.85577)%22%3E%3Cg%20clip-path%3D%22url(%23i)%22%3E%3Cpath%20d%3D%22M92.07563%20219.9585c.14844%2022.14%206.5014%2044.983%2016.11767%2063.4234v.1269c6.9482%2013.3919%2016.4444%2023.9704%2027.2604%2034.4518l65.326-23.67c-12.3593-6.2344-14.2452-10.0546-23.1048-17.0253-9.0537-9.0658-15.8015-19.4735-20.0038-31.677h-.1693l.1693-.1269c-2.7646-8.0587-3.0373-16.6129-3.1393-25.5029Z%22%20fill%3D%22url(%23j)%22%20filter%3D%22url(%23k)%22%2F%3E%3Cpath%20d%3D%22M237.0835%2079.02491c-6.4568%2022.52569-3.988%2044.42139%200%2057.16129%207.4561.0055%2014.6388.8881%2021.4494%202.6464%2015.6135%204.0309%2026.6566%2011.97%2033.424%2018.2496l41.8794-40.7256c-24.8094-22.58904-54.6663-37.2961-96.7528-37.33169Z%22%20fill%3D%22url(%23l)%22%20filter%3D%22url(%23k)%22%2F%3E%3Cpath%20d%3D%22M236.9434%2078.84678c-31.6709-.00068-60.9107%209.79833-84.8718%2026.35902-8.8968%206.149-17.0612%2013.2521-24.3311%2021.1509-1.9045%2017.7429%2014.2569%2039.5507%2046.2615%2039.3702%2015.5284-17.9373%2038.4946-29.5427%2064.0561-29.5427.0233%200%20.046.0019.0693.002l-1.0439-57.33536c-.0472-.00003-.0929-.00406-.1401-.00406Z%22%20fill%3D%22url(%23m)%22%20filter%3D%22url(%23k)%22%2F%3E%3Cpath%20d%3D%22m341.4751%20226.3788-28.2685%2019.2848c-1.2405%207.5627-4.0278%2015.0023-8.1068%2021.7861-4.6734%207.7723-10.4506%2013.6898-16.3725%2018.196-17.7022%2013.4704-38.3286%2016.2439-52.6877%2016.2553-14.8415%2025.1018-17.4435%2037.6749%201.0439%2057.9342%2022.8762-.0167%2043.157-4.1174%2061.0458-11.7965%2012.9312-5.551%2024.3879-12.7913%2034.7609-22.0964%2013.7061-12.295%2024.4421-27.5034%2031.7688-45.0003%207.3267-17.497%2011.2446-37.2822%2011.2446-58.7336Z%22%20fill%3D%22url(%23n)%22%20filter%3D%22url(%23k)%22%2F%3E%3Cpath%20d%3D%22M234.9956%20191.2104v57.4981h136.0062c1.1962-7.8745%205.1523-18.0644%205.1523-26.5001%200-9.858-.9963-21.899-2.6873-30.998Z%22%20fill%3D%22%233086ff%22%20filter%3D%22url(%23k)%22%2F%3E%3Cpath%20d%3D%22M128.3894%20124.3268c-8.393%209.1191-15.5632%2019.326-21.2483%2030.3646-9.75351%2018.8785-15.09402%2041.8295-15.09402%2064.3235%200%20.317.02642.6271.02855.9436%204.31953%208.2244%2059.66647%206.6495%2062.45617%200-.0035-.3103-.0387-.6128-.0387-.9238%200-9.226%201.5696-16.0262%204.4306-24.3672%203.5294-10.2885%209.0557-19.7628%2016.1223-27.9257%201.6019-2.0309%205.8748-6.3969%207.1214-9.0157.4749-.9975-.8621-1.5574-.9369-1.9085-.0836-.3927-1.8762-.0769-2.2778-.3694-1.2751-.9288-3.8001-1.4138-5.3334-1.8449-3.2772-.9215-8.7085-2.9536-11.7252-5.0601-9.5357-6.6586-24.417-14.6122-33.5047-24.2164Z%22%20fill%3D%22url(%23o)%22%20filter%3D%22url(%23k)%22%2F%3E%3Cpath%20d%3D%22M162.0989%20155.8569c22.1123%2013.3013%2028.4714-6.7139%2043.173-12.9771L179.698%2090.21568c-9.4075%203.92642-18.2957%208.80465-26.5426%2014.50442-12.316%208.5122-23.192%2018.8995-32.1763%2030.7204Z%22%20fill%3D%22url(%23p)%22%20filter%3D%22url(%23q)%22%2F%3E%3Cpath%20d%3D%22M171.0987%20290.222c-29.6829%2010.6413-34.3299%2011.023-37.0622%2029.2903%205.2213%205.0597%2010.8312%209.74%2016.7926%2013.9835%2015.9962%2011.3867%2046.766%2026.5517%2086.1178%2026.5517.0462%200%20.0904-.004.1366-.004v-59.1574c-.0298.0001-.064.002-.0938.002-14.7359%200-26.5113-3.8435-38.5848-10.5273-2.9768-1.6479-8.3775%202.7772-11.1229.799-3.7865-2.7284-12.8991%202.3508-16.1833-.9378Z%22%20fill%3D%22url(%23r)%22%20filter%3D%22url(%23k)%22%2F%3E%3Cpath%20d%3D%22M219.6997%20299.0227v59.9959c5.506.6402%2011.2361%201.0289%2017.2472%201.0289%206.0259%200%2011.8556-.3073%2017.5204-.8723v-59.7481c-6.3482%201.0777-12.3272%201.461-17.4776%201.461-5.9318%200-11.7005-.6858-17.29-1.8654Z%22%20opacity%3D%22.5%22%20fill%3D%22url(%23s)%22%20filter%3D%22url(%23k)%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E"
1000
+ alt="google pay logo"
1001
+ />
1002
+ );
1003
+ };
1004
+
1005
+ const PaypalLogo = () => {
1006
+ return (
1007
+ <img
1008
+ className="size-5"
1009
+ src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%227.056000232696533%203%2037.35095977783203%2045%22%3E%3Cg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20clip-path%3D%22url(%23a)%22%3E%3Cpath%20fill%3D%22%23002991%22%20d%3D%22M38.914%2013.35c0%205.574-5.144%2012.15-12.927%2012.15H18.49l-.368%202.322L16.373%2039H7.056l5.605-36h15.095c5.083%200%209.082%202.833%2010.555%206.77a9.687%209.687%200%200%201%20.603%203.58z%22%2F%3E%3Cpath%20fill%3D%22%2360CDFF%22%20d%3D%22M44.284%2023.7A12.894%2012.894%200%200%201%2031.53%2034.5h-5.206L24.157%2048H14.89l1.483-9%201.75-11.178.367-2.322h7.497c7.773%200%2012.927-6.576%2012.927-12.15%203.825%201.974%206.055%205.963%205.37%2010.35z%22%2F%3E%3Cpath%20fill%3D%22%23008CFF%22%20d%3D%22M38.914%2013.35C37.31%2012.511%2035.365%2012%2033.248%2012h-12.64L18.49%2025.5h7.497c7.773%200%2012.927-6.576%2012.927-12.15z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"
1010
+ alt="paypal logo"
1011
+ />
1012
+ );
1013
+ };