@akinon/projectzero 2.0.0-beta.2 → 2.0.0-beta.20

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 (377) hide show
  1. package/CHANGELOG.md +147 -6
  2. package/app-template/.env.example +8 -0
  3. package/app-template/.github/instructions/account.instructions.md +749 -0
  4. package/app-template/.github/instructions/checkout.instructions.md +678 -0
  5. package/app-template/.github/instructions/default.instructions.md +279 -0
  6. package/app-template/.github/instructions/edge-cases.instructions.md +73 -0
  7. package/app-template/.github/instructions/routing.instructions.md +603 -0
  8. package/app-template/.github/instructions/settings.instructions.md +338 -0
  9. package/app-template/.gitignore +5 -0
  10. package/app-template/AGENTS.md +7 -0
  11. package/app-template/CHANGELOG.md +1645 -61
  12. package/app-template/Procfile +1 -1
  13. package/app-template/README.md +6 -0
  14. package/app-template/akinon.json +1 -4
  15. package/app-template/build.sh +10 -0
  16. package/app-template/config/prebuild-tests.json +5 -0
  17. package/app-template/docs/advanced-usage.md +111 -0
  18. package/app-template/docs/plugins.md +60 -25
  19. package/app-template/docs/sentry-usage.md +35 -0
  20. package/app-template/jest.config.ts +2 -2
  21. package/app-template/next-env.d.ts +1 -0
  22. package/app-template/next.config.mjs +8 -5
  23. package/app-template/package.json +60 -50
  24. package/app-template/postcss.config.mjs +5 -0
  25. package/app-template/public/amex.svg +12 -0
  26. package/app-template/public/apple-pay.svg +16 -0
  27. package/app-template/public/assets/images/product-placeholder-1.jpg +0 -0
  28. package/app-template/public/assets/images/product-placeholder-2.jpg +0 -0
  29. package/app-template/public/assets/images/product-placeholder-3.jpg +0 -0
  30. package/app-template/public/assets/images/product-placeholder-4.jpg +0 -0
  31. package/app-template/public/google-pay.svg +16 -0
  32. package/app-template/public/locales/en/account.json +13 -4
  33. package/app-template/public/locales/en/auth.json +6 -7
  34. package/app-template/public/locales/en/basket.json +6 -6
  35. package/app-template/public/locales/en/blog.json +7 -0
  36. package/app-template/public/locales/en/category.json +3 -1
  37. package/app-template/public/locales/en/checkout.json +17 -4
  38. package/app-template/public/locales/en/common.json +71 -3
  39. package/app-template/public/locales/en/forgot_password.json +6 -7
  40. package/app-template/public/locales/en/product.json +84 -4
  41. package/app-template/public/locales/tr/account.json +13 -4
  42. package/app-template/public/locales/tr/auth.json +16 -17
  43. package/app-template/public/locales/tr/basket.json +4 -4
  44. package/app-template/public/locales/tr/blog.json +7 -0
  45. package/app-template/public/locales/tr/category.json +3 -1
  46. package/app-template/public/locales/tr/checkout.json +48 -36
  47. package/app-template/public/locales/tr/common.json +70 -2
  48. package/app-template/public/locales/tr/forgot_password.json +12 -13
  49. package/app-template/public/locales/tr/product.json +82 -0
  50. package/app-template/public/logo.svg +3 -27
  51. package/app-template/public/mastercard.svg +14 -0
  52. package/app-template/public/masterpass-javascript-sdk-web.min.js +1 -0
  53. package/app-template/public/promotion-banner.jpg +0 -0
  54. package/app-template/public/shop-pay.svg +12 -0
  55. package/app-template/public/visa.svg +12 -0
  56. package/app-template/src/__tests__/middleware-matcher.test.ts +135 -0
  57. package/app-template/src/app/[commerce]/[locale]/[currency]/blog/[slug]/page.tsx +118 -0
  58. package/app-template/src/app/[commerce]/[locale]/[currency]/pages/[slug]/page.tsx +15 -0
  59. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/[...prettyurl]/page.tsx +9 -9
  60. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/layout.tsx +2 -2
  61. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/cancellation/page.tsx +105 -13
  62. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/page.tsx +136 -52
  63. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/profile/page.tsx +2 -2
  64. package/app-template/src/app/[pz]/category/[pk]/page.tsx +27 -0
  65. package/app-template/src/app/[pz]/error.tsx +17 -0
  66. package/app-template/src/app/[pz]/flat-page/[pk]/page.tsx +23 -0
  67. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/forms/[pk]/generate/page.tsx +1 -2
  68. package/app-template/src/app/[pz]/group-product/[pk]/page.tsx +93 -0
  69. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/landing-page/[pk]/page.tsx +2 -4
  70. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/layout.tsx +3 -10
  71. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/list/page.tsx +2 -4
  72. package/app-template/src/app/{[commerce]/[locale]/[currency]/pz-not-found/page.tsx → [pz]/not-found.tsx} +5 -7
  73. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/checkout/page.tsx +7 -4
  74. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/completed/[token]/page.tsx +6 -4
  75. package/app-template/src/app/[pz]/product/[pk]/page.tsx +102 -0
  76. package/app-template/src/app/[pz]/special-page/[pk]/page.tsx +35 -0
  77. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/email-set-primary/[[...id]]/page.tsx +3 -4
  78. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/registration/account-confirm-email/[[...id]]/page.tsx +3 -3
  79. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/reset/[[...id]]/page.tsx +41 -5
  80. package/app-template/src/app/[pz]/xml-sitemap/[node]/route.ts +73 -0
  81. package/app-template/src/app/api/auth/[...nextauth]/route.ts +3 -0
  82. package/app-template/src/app/api/barcode-search/route.ts +1 -0
  83. package/app-template/src/app/api/form/[...id]/route.ts +1 -7
  84. package/app-template/src/app/api/image-proxy/route.ts +1 -0
  85. package/app-template/src/app/api/product-categories/route.ts +1 -0
  86. package/app-template/src/app/api/similar-product-list/route.ts +1 -0
  87. package/app-template/src/app/api/similar-products/route.ts +1 -0
  88. package/app-template/src/app/api/theme-settings/route.ts +12 -0
  89. package/app-template/src/app/api/virtual-try-on/limited-categories/route.ts +1 -0
  90. package/app-template/src/app/api/virtual-try-on/route.ts +1 -0
  91. package/app-template/src/assets/fonts/pz-icon.css +211 -49
  92. package/app-template/src/assets/fonts/pz-icon.eot +0 -0
  93. package/app-template/src/assets/fonts/pz-icon.html +486 -0
  94. package/app-template/src/assets/fonts/pz-icon.scss +373 -49
  95. package/app-template/src/assets/fonts/pz-icon.svg +215 -53
  96. package/app-template/src/assets/fonts/pz-icon.ttf +0 -0
  97. package/app-template/src/assets/fonts/pz-icon.woff +0 -0
  98. package/app-template/src/assets/fonts/pz-icon.woff2 +0 -0
  99. package/app-template/src/assets/globals.scss +37 -34
  100. package/app-template/src/assets/icons/arrow-right.svg +3 -0
  101. package/app-template/src/assets/icons/cart.svg +4 -12
  102. package/app-template/src/assets/icons/check.svg +2 -18
  103. package/app-template/src/assets/icons/chevron-down.svg +2 -7
  104. package/app-template/src/assets/icons/delete.svg +3 -0
  105. package/app-template/src/assets/icons/facebook.svg +2 -8
  106. package/app-template/src/assets/icons/fav-off.svg +5 -0
  107. package/app-template/src/assets/icons/fav-on.svg +5 -0
  108. package/app-template/src/assets/icons/filter-and-sort.svg +3 -0
  109. package/app-template/src/assets/icons/heart.svg +3 -0
  110. package/app-template/src/assets/icons/instagram.svg +2 -13
  111. package/app-template/src/assets/icons/materials.svg +3 -0
  112. package/app-template/src/assets/icons/person.svg +4 -0
  113. package/app-template/src/assets/icons/pinterest.svg +5 -11
  114. package/app-template/src/assets/icons/ruler.svg +3 -0
  115. package/app-template/src/assets/icons/search.svg +8 -11
  116. package/app-template/src/assets/icons/share.svg +2 -9
  117. package/app-template/src/assets/icons/snapchat.svg +3 -0
  118. package/app-template/src/assets/icons/tiktok.svg +3 -0
  119. package/app-template/src/assets/icons/tumblr.svg +6 -0
  120. package/app-template/src/assets/icons/twitter.svg +2 -10
  121. package/app-template/src/assets/icons/vimeo.svg +3 -0
  122. package/app-template/src/assets/icons/youtube.svg +3 -0
  123. package/app-template/src/assets/icons/zoom.svg +8 -0
  124. package/app-template/src/auth.ts +3 -0
  125. package/app-template/src/components/__tests__/link.test.tsx +2 -0
  126. package/app-template/src/components/accordion.tsx +48 -23
  127. package/app-template/src/components/action-tooltip.tsx +160 -0
  128. package/app-template/src/components/button.tsx +50 -35
  129. package/app-template/src/components/carousel-core.tsx +4 -11
  130. package/app-template/src/components/checkbox.tsx +2 -1
  131. package/app-template/src/components/currency-select.tsx +150 -4
  132. package/app-template/src/components/file-input.tsx +64 -2
  133. package/app-template/src/components/generate-form-fields.tsx +49 -10
  134. package/app-template/src/components/icon.tsx +5 -6
  135. package/app-template/src/components/index.ts +4 -1
  136. package/app-template/src/components/input.tsx +8 -2
  137. package/app-template/src/components/language-select.tsx +88 -2
  138. package/app-template/src/components/modal.tsx +34 -16
  139. package/app-template/src/components/pagination.tsx +133 -20
  140. package/app-template/src/components/price.tsx +1 -1
  141. package/app-template/src/components/pwa-tags.tsx +1 -0
  142. package/app-template/src/components/quantity-input.tsx +63 -0
  143. package/app-template/src/components/quantity-selector.tsx +203 -0
  144. package/app-template/src/components/route-handler.tsx +50 -0
  145. package/app-template/src/components/select.tsx +86 -54
  146. package/app-template/src/components/tabs.tsx +2 -2
  147. package/app-template/src/components/types/index.ts +55 -2
  148. package/app-template/src/components/widget-content.tsx +323 -0
  149. package/app-template/src/data/server/theme.ts +70 -0
  150. package/app-template/src/hooks/use-fav-button.tsx +9 -10
  151. package/app-template/src/hooks/use-product-cart.ts +80 -0
  152. package/app-template/src/hooks/use-stock-alert.ts +74 -0
  153. package/app-template/src/hooks/use-theme-settings.ts +42 -0
  154. package/app-template/src/lib/fonts.ts +149 -0
  155. package/app-template/src/middleware.ts +1 -0
  156. package/app-template/src/plugins.js +13 -2
  157. package/app-template/src/redux/middlewares/category.ts +6 -5
  158. package/app-template/src/redux/reducers/category.ts +1 -1
  159. package/app-template/src/redux/store.ts +21 -1
  160. package/app-template/src/routes/index.ts +2 -1
  161. package/app-template/src/settings.js +5 -3
  162. package/app-template/src/types/hookform-resolvers-yup.d.ts +28 -0
  163. package/app-template/src/types/index.ts +74 -3
  164. package/app-template/src/types/next-auth.d.ts +2 -2
  165. package/app-template/src/types/widget.ts +169 -0
  166. package/app-template/src/utils/convert-facet-search-params.ts +1 -1
  167. package/app-template/src/utils/formatDate.ts +48 -0
  168. package/app-template/src/utils/styles.ts +71 -0
  169. package/app-template/src/utils/variant-validation.ts +41 -0
  170. package/app-template/src/views/account/address-form.tsx +8 -4
  171. package/app-template/src/views/account/contact-form.tsx +148 -136
  172. package/app-template/src/views/account/content-header.tsx +2 -2
  173. package/app-template/src/views/account/faq/faq-tabs.tsx +8 -2
  174. package/app-template/src/views/account/favorite-item.tsx +1 -1
  175. package/app-template/src/views/account/order.tsx +10 -8
  176. package/app-template/src/views/account/orders/order-cancellation-item.tsx +4 -3
  177. package/app-template/src/views/account/orders/order-detail-header.tsx +1 -1
  178. package/app-template/src/views/anonymous-tracking/order-detail/index.tsx +44 -37
  179. package/app-template/src/views/basket/basket-item.tsx +697 -107
  180. package/app-template/src/views/basket/basket-summary-context.tsx +560 -0
  181. package/app-template/src/views/basket/designer-context.tsx +617 -0
  182. package/app-template/src/views/basket/index.ts +2 -0
  183. package/app-template/src/views/basket/summary.tsx +497 -60
  184. package/app-template/src/views/breadcrumb/breadcrumb-client.tsx +190 -0
  185. package/app-template/src/views/breadcrumb/breadcrumb-registrar.tsx +286 -0
  186. package/app-template/src/views/breadcrumb/constants.ts +15 -0
  187. package/app-template/src/views/breadcrumb/index.tsx +127 -0
  188. package/app-template/src/views/breadcrumb.tsx +13 -38
  189. package/app-template/src/views/category/category-active-filters.tsx +1 -1
  190. package/app-template/src/views/category/category-banner.tsx +4 -23
  191. package/app-template/src/views/category/category-header.tsx +289 -60
  192. package/app-template/src/views/category/category-info.tsx +177 -27
  193. package/app-template/src/views/category/filters/filter-item.tsx +138 -42
  194. package/app-template/src/views/category/filters/index.tsx +209 -49
  195. package/app-template/src/views/category/layout.tsx +7 -4
  196. package/app-template/src/views/category/native-widget-context.tsx +257 -0
  197. package/app-template/src/views/category/product-list-registrar.tsx +665 -0
  198. package/app-template/src/views/checkout/auth.tsx +64 -40
  199. package/app-template/src/views/checkout/checkout-address-registrar.tsx +254 -0
  200. package/app-template/src/views/checkout/checkout-buttons-registrar.tsx +183 -0
  201. package/app-template/src/views/checkout/checkout-delivery-method-registrar.tsx +259 -0
  202. package/app-template/src/views/checkout/checkout-payment-options-registrar.tsx +253 -0
  203. package/app-template/src/views/checkout/checkout-summary-registrar.tsx +183 -0
  204. package/app-template/src/views/checkout/constants.ts +5 -0
  205. package/app-template/src/views/checkout/index.tsx +5 -0
  206. package/app-template/src/views/checkout/layout/header.tsx +9 -5
  207. package/app-template/src/views/checkout/steps/payment/index.tsx +5 -2
  208. package/app-template/src/views/checkout/steps/payment/options/credit-card/index.tsx +93 -6
  209. package/app-template/src/views/checkout/steps/payment/options/funds-transfer.tsx +25 -5
  210. package/app-template/src/views/checkout/steps/payment/options/loyalty.tsx +21 -2
  211. package/app-template/src/views/checkout/steps/payment/options/masterpass-rest.tsx +15 -0
  212. package/app-template/src/views/checkout/steps/payment/options/redirection.tsx +27 -5
  213. package/app-template/src/views/checkout/steps/payment/options/saved-card.tsx +18 -0
  214. package/app-template/src/views/checkout/steps/payment/options/store-credit.tsx +464 -0
  215. package/app-template/src/views/checkout/steps/payment/payment-option-buttons.tsx +171 -40
  216. package/app-template/src/views/checkout/steps/shipping/address-box.tsx +104 -29
  217. package/app-template/src/views/checkout/steps/shipping/addresses.tsx +129 -46
  218. package/app-template/src/views/checkout/steps/shipping/shipping-options.tsx +232 -27
  219. package/app-template/src/views/checkout/summary.tsx +310 -26
  220. package/app-template/src/views/find-in-store/index.tsx +2 -2
  221. package/app-template/src/views/footer/footer-app-banner-context.tsx +326 -0
  222. package/app-template/src/views/footer/footer-bottom-context.tsx +215 -0
  223. package/app-template/src/views/footer/footer-bottom-wrapper.tsx +74 -0
  224. package/app-template/src/views/footer/footer-layout-constants.ts +35 -0
  225. package/app-template/src/views/footer/footer-layout-registrar.tsx +342 -0
  226. package/app-template/src/views/footer/footer-layout-switcher.tsx +110 -0
  227. package/app-template/src/views/footer/footer-menu-context.tsx +211 -0
  228. package/app-template/src/views/footer/footer-native-widgets.tsx +60 -0
  229. package/app-template/src/views/footer/footer-social-context.tsx +254 -0
  230. package/app-template/src/views/footer/footer-subscription-context.tsx +210 -0
  231. package/app-template/src/views/footer/footer-utils.ts +43 -0
  232. package/app-template/src/views/footer/footer-value-props-context.tsx +326 -0
  233. package/app-template/src/views/footer/logo-settings.ts +183 -0
  234. package/app-template/src/views/footer/native-widget-config.ts +262 -0
  235. package/app-template/src/views/footer/subscription-settings.ts +122 -0
  236. package/app-template/src/views/footer/use-footer-logo.ts +162 -0
  237. package/app-template/src/views/footer.tsx +415 -13
  238. package/app-template/src/views/guest-login/index.tsx +62 -58
  239. package/app-template/src/views/header/action-menu.tsx +284 -49
  240. package/app-template/src/views/header/band.tsx +6 -21
  241. package/app-template/src/views/header/designer-context.tsx +261 -0
  242. package/app-template/src/views/header/header-announcement-registrar.tsx +267 -0
  243. package/app-template/src/views/header/header-client-wrapper.tsx +496 -0
  244. package/app-template/src/views/header/header-content.tsx +1026 -0
  245. package/app-template/src/views/header/header-currency-registrar.tsx +348 -0
  246. package/app-template/src/views/header/header-icons-context.tsx +262 -0
  247. package/app-template/src/views/header/header-language-registrar.tsx +348 -0
  248. package/app-template/src/views/header/header-layout-context.tsx +143 -0
  249. package/app-template/src/views/header/header-layout-registrar.tsx +658 -0
  250. package/app-template/src/views/header/header-logo-context.tsx +228 -0
  251. package/app-template/src/views/header/header-logo.tsx +118 -0
  252. package/app-template/src/views/header/header-mini-basket-context.tsx +524 -0
  253. package/app-template/src/views/header/header-search-registrar.tsx +511 -0
  254. package/app-template/src/views/header/header-text-slider-registrar.tsx +382 -0
  255. package/app-template/src/views/header/index.tsx +110 -48
  256. package/app-template/src/views/header/inline-search.tsx +262 -0
  257. package/app-template/src/views/header/mini-basket.tsx +832 -46
  258. package/app-template/src/views/header/mobile-hamburger-button.tsx +5 -8
  259. package/app-template/src/views/header/mobile-menu.tsx +12 -0
  260. package/app-template/src/views/header/navbar-menu-context.tsx +219 -0
  261. package/app-template/src/views/header/navbar.tsx +178 -111
  262. package/app-template/src/views/header/search/index.tsx +85 -24
  263. package/app-template/src/views/header/search/results.tsx +127 -65
  264. package/app-template/src/views/header/search/search-input.tsx +61 -0
  265. package/app-template/src/views/header/server-settings-parser.ts +1105 -0
  266. package/app-template/src/views/header/use-header-icons.ts +241 -0
  267. package/app-template/src/views/header/use-header-logo.ts +213 -0
  268. package/app-template/src/views/header/use-navbar-menu.ts +179 -0
  269. package/app-template/src/views/installment-options/index.tsx +1 -1
  270. package/app-template/src/views/login/index.tsx +89 -56
  271. package/app-template/src/views/otp-login/index.tsx +23 -20
  272. package/app-template/src/views/product/accordion-section.tsx +61 -0
  273. package/app-template/src/views/product/accordion-wrapper.tsx +135 -43
  274. package/app-template/src/views/product/custom-button-group.tsx +69 -0
  275. package/app-template/src/views/product/favorites-button-section.tsx +69 -0
  276. package/app-template/src/views/product/find-in-store-section.tsx +60 -0
  277. package/app-template/src/views/product/index.ts +1 -0
  278. package/app-template/src/views/product/layout.tsx +21 -6
  279. package/app-template/src/views/product/misc-buttons.tsx +339 -25
  280. package/app-template/src/views/product/price-wrapper.tsx +3 -24
  281. package/app-template/src/views/product/product-actions.tsx +294 -0
  282. package/app-template/src/views/product/product-info-section.tsx +140 -0
  283. package/app-template/src/views/product/product-info.tsx +130 -254
  284. package/app-template/src/views/product/product-share.tsx +61 -0
  285. package/app-template/src/views/product/product-variants.tsx +26 -0
  286. package/app-template/src/views/product/quantity-section.tsx +73 -0
  287. package/app-template/src/views/product/sale-tag.tsx +10 -0
  288. package/app-template/src/views/product/share-section.tsx +357 -0
  289. package/app-template/src/views/product/slider.tsx +135 -76
  290. package/app-template/src/views/product/variant.tsx +69 -41
  291. package/app-template/src/views/product/variants-section.tsx +126 -0
  292. package/app-template/src/views/product-detail/constants.ts +272 -0
  293. package/app-template/src/views/product-detail/index.ts +10 -0
  294. package/app-template/src/views/product-detail/product-detail-registrar.tsx +616 -0
  295. package/app-template/src/views/product-item/index.tsx +119 -46
  296. package/app-template/src/views/register/index.tsx +54 -44
  297. package/app-template/src/views/share/index.tsx +9 -6
  298. package/app-template/src/views/widgets/home-hero-slider-content.tsx +41 -39
  299. package/app-template/src/widgets/flatpages/about-us/index.tsx +78 -0
  300. package/app-template/src/widgets/flatpages/blog-list/index.tsx +129 -0
  301. package/app-template/src/widgets/footer-app-banner.tsx +444 -0
  302. package/app-template/src/widgets/footer-bottom.tsx +127 -0
  303. package/app-template/src/widgets/footer-menu-compact.tsx +238 -0
  304. package/app-template/src/widgets/footer-menu-two.tsx +298 -0
  305. package/app-template/src/widgets/footer-menu.tsx +6 -2
  306. package/app-template/src/widgets/footer-social-client.tsx +251 -0
  307. package/app-template/src/widgets/footer-social.tsx +47 -16
  308. package/app-template/src/widgets/footer-subscription/footer-subscription-form.tsx +17 -14
  309. package/app-template/src/widgets/footer-subscription/index.tsx +183 -17
  310. package/app-template/src/widgets/footer-value-props.tsx +201 -0
  311. package/app-template/src/widgets/home-stories-eng.tsx +42 -34
  312. package/app-template/src/widgets/index.ts +7 -0
  313. package/app-template/src/widgets/schemas/about-us.json +46 -0
  314. package/app-template/src/widgets/schemas/blog-list.json +37 -0
  315. package/app-template/src/widgets/schemas/blog.json +29 -0
  316. package/app-template/tailwind.config.js +19 -7
  317. package/app-template/tsconfig.json +29 -11
  318. package/codemods/migrate-segments/index.js +591 -0
  319. package/codemods/sentry-9/index.js +30 -0
  320. package/codemods/sentry-9/remove-sentry-configs.js +14 -0
  321. package/codemods/sentry-9/remove-sentry-dependency.js +25 -0
  322. package/codemods/sentry-9/replace-error-page.js +32 -0
  323. package/codemods/update-tailwind-config/index.js +30 -0
  324. package/codemods/update-tailwind-config/transform.js +102 -0
  325. package/commands/codemod.ts +17 -0
  326. package/commands/index.ts +3 -1
  327. package/commands/plugins.ts +115 -46
  328. package/dist/codemods/sentry-9/templates/error.js +14 -0
  329. package/dist/commands/codemod.js +15 -0
  330. package/dist/commands/index.js +3 -1
  331. package/dist/commands/plugins.js +85 -34
  332. package/package.json +3 -2
  333. package/app-template/postcss.config.js +0 -6
  334. package/app-template/sentry.client.config.ts +0 -16
  335. package/app-template/sentry.edge.config.ts +0 -3
  336. package/app-template/sentry.properties +0 -4
  337. package/app-template/sentry.server.config.ts +0 -3
  338. package/app-template/src/app/[commerce]/[locale]/[currency]/category/[pk]/page.tsx +0 -22
  339. package/app-template/src/app/[commerce]/[locale]/[currency]/error.tsx +0 -20
  340. package/app-template/src/app/[commerce]/[locale]/[currency]/flat-page/[pk]/page.tsx +0 -20
  341. package/app-template/src/app/[commerce]/[locale]/[currency]/group-product/[pk]/page.tsx +0 -74
  342. package/app-template/src/app/[commerce]/[locale]/[currency]/product/[pk]/loading.tsx +0 -67
  343. package/app-template/src/app/[commerce]/[locale]/[currency]/product/[pk]/page.tsx +0 -84
  344. package/app-template/src/app/[commerce]/[locale]/[currency]/special-page/[pk]/page.tsx +0 -27
  345. package/app-template/src/app/[commerce]/[locale]/[currency]/xml-sitemap/[node]/route.ts +0 -25
  346. package/app-template/src/pages/api/auth/[...nextauth].ts +0 -3
  347. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/address/page.tsx +0 -0
  348. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/change-email/page.tsx +0 -0
  349. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/change-password/page.tsx +0 -0
  350. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/contact/page.tsx +0 -0
  351. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/coupons/page.tsx +0 -0
  352. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/email-verification/page.tsx +0 -0
  353. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/faq/page.tsx +0 -0
  354. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/favourite-products/page.tsx +0 -0
  355. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/my-quotations/page.tsx +0 -0
  356. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/layout.tsx +0 -0
  357. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/page.tsx +0 -0
  358. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/page.tsx +0 -0
  359. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/address/stores/page.tsx +0 -0
  360. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/anonymous-tracking/page.tsx +0 -0
  361. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/auth/oauth-login/page.tsx +0 -0
  362. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/auth/page.tsx +0 -0
  363. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/basket/page.tsx +0 -0
  364. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/basket-b2b/page.tsx +0 -0
  365. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/category/[pk]/loading.tsx +0 -0
  366. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/client-root.tsx +0 -0
  367. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/contact-us/page.tsx +0 -0
  368. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/flat-page/[pk]/loading.tsx +0 -0
  369. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/group-product/[pk]/loading.tsx +0 -0
  370. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/landing-page/[pk]/loading.tsx +0 -0
  371. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/list/loading.tsx +0 -0
  372. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/completed/[token]/layout.tsx +0 -0
  373. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/page.tsx +0 -0
  374. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/special-page/[pk]/loading.tsx +0 -0
  375. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/template.tsx +0 -0
  376. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/password/reset/page.tsx +0 -0
  377. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/xml-sitemap/route.ts +0 -0
@@ -10,6 +10,9 @@ import useFavButton from '../../hooks/use-fav-button';
10
10
  import { Product } from '@akinon/next/types';
11
11
  import { Image } from '@akinon/next/components/image';
12
12
  import { Price, Link } from '@theme/components';
13
+ import { SaleTag } from '../product/sale-tag';
14
+ import { useProductList } from '../category/product-list-registrar';
15
+ import { useNativeWidget } from '../category/native-widget-context';
13
16
 
14
17
  interface Props {
15
18
  product: Product;
@@ -19,17 +22,42 @@ interface Props {
19
22
  }
20
23
 
21
24
  export const ProductItem = (props: Props) => {
22
- // TODO: Static image will change (TR)
23
25
  const { product, width, height, index } = props;
24
26
  const [viewed, setViewed] = useState(false);
25
27
  const { FavButton } = useFavButton(product.pk);
26
28
  const { ref, inView } = useInView();
27
29
 
28
- const image_url = product.productimage_set[0]?.image;
30
+ // Get product-item properties from ProductListRegistrar
31
+ const {
32
+ productItemProperties: registrarProps,
33
+ productItemStyles: registrarStyles
34
+ } = useProductList();
35
+
36
+ // Get product-item properties from NativeWidgetProvider
37
+ const {
38
+ productItemProperties: widgetProps,
39
+ productItemStyles: widgetStyles
40
+ } = useNativeWidget();
41
+
42
+ // Designer mode uses registrar props, saved widget uses widget props
43
+ const isDesigner = typeof window !== 'undefined' && window.parent !== window;
44
+ const properties = isDesigner
45
+ ? { ...widgetProps, ...registrarProps }
46
+ : widgetProps;
47
+ const styles = isDesigner
48
+ ? { ...widgetStyles, ...registrarStyles }
49
+ : widgetStyles;
50
+
51
+ const showFavButton = properties['show-fav-button'] !== false;
52
+ const favButtonPosition =
53
+ (properties['fav-button-position'] as string) || 'top-right';
54
+
55
+ const image_url = product.productimage_set?.[0]?.image;
29
56
  const absolute_url = product.absolute_url;
30
57
  const product_name = product.name;
31
58
  const retail_price = product.retail_price;
32
59
  const price = product.price;
60
+ const isOnSale = parseFloat(String(retail_price)) > parseFloat(String(price));
33
61
 
34
62
  useEffect(() => {
35
63
  if (!viewed && inView) {
@@ -38,58 +66,103 @@ export const ProductItem = (props: Props) => {
38
66
  }
39
67
  }, [inView, viewed, product]);
40
68
 
69
+ // Position classes
70
+ const positionClasses = {
71
+ 'top-left': 'top-2.5 left-2.5',
72
+ 'top-right': 'top-2.5 right-2.5',
73
+ 'bottom-left': 'bottom-2.5 left-2.5',
74
+ 'bottom-right': 'bottom-2.5 right-2.5'
75
+ };
76
+
77
+ const favButtonStyles: React.CSSProperties = {
78
+ width: (styles['fav-button-size'] as string) || '32px',
79
+ height: (styles['fav-button-size'] as string) || '32px',
80
+ backgroundColor:
81
+ (styles['fav-button-bg-color'] as string) || 'rgba(255, 255, 255, 0.8)',
82
+ color: (styles['fav-button-icon-color'] as string) || '#000000',
83
+ borderRadius: (styles['fav-button-border-radius'] as string) || '50%'
84
+ };
85
+
86
+ const productNameStyles: React.CSSProperties = {
87
+ fontSize: (styles['product-name-font-size'] as string) || '14px',
88
+ color: (styles['product-name-color'] as string) || '#1a1a1a',
89
+ fontWeight: (styles['product-name-font-weight'] as string) || '400',
90
+ display: '-webkit-box',
91
+ WebkitLineClamp: parseInt(
92
+ (styles['product-name-line-clamp'] as string) || '2',
93
+ 10
94
+ ),
95
+ WebkitBoxOrient: 'vertical' as const,
96
+ overflow: 'hidden'
97
+ };
98
+
99
+ const priceStyles: React.CSSProperties = {
100
+ fontSize: (styles['price-font-size'] as string) || '16px',
101
+ color: (styles['price-color'] as string) || '#1a1a1a',
102
+ fontWeight: (styles['price-font-weight'] as string) || '400'
103
+ };
104
+
105
+ const oldPriceStyles: React.CSSProperties = {
106
+ fontSize: (styles['old-price-font-size'] as string) || '14px',
107
+ color: (styles['old-price-color'] as string) || '#6b7280'
108
+ };
109
+
41
110
  return (
42
111
  <div
43
- className="text-sm text-left flex flex-col justify-between"
112
+ className="flex flex-col group w-full"
44
113
  data-testid="product-box"
45
114
  ref={ref}
115
+ data-section-id="product-item-section"
46
116
  >
47
- <div className="relative mb-3 h-full">
117
+ <div className="relative mb-2 w-full aspect-square">
48
118
  <Link href={absolute_url} onClick={() => pushProductClicked(product)}>
49
- {image_url ? (
50
- <Image
51
- fill
52
- loading="lazy"
53
- src={image_url}
54
- alt={product_name}
55
- aspectRatio={width / height}
56
- sizes="
57
- (max-width: 768px) 50vw,
58
- (max-width: 1024px) 30vw,
59
- 33vw"
60
- crop="center"
61
- />
62
- ) : (
63
- <Image
64
- className="h-full"
65
- src="/noimage.jpg"
66
- fill
67
- aspectRatio={width / height}
68
- sizes="100vw"
69
- alt={product_name}
70
- imageClassName="object-cover"
71
- />
72
- )}
119
+ <Image
120
+ loading="lazy"
121
+ src={image_url || '/noimage.jpg'}
122
+ alt={product_name}
123
+ aspectRatio={width / height}
124
+ fill
125
+ crop="center"
126
+ sizes={`(max-width: 768px) ${
127
+ width === 260 ? 170 : width
128
+ }px, ${width}px`}
129
+ imageClassName="object-cover"
130
+ />
73
131
  </Link>
74
- <FavButton className="absolute top-4 right-4" />
132
+
133
+ {showFavButton && (
134
+ <FavButton
135
+ className={`absolute ${positionClasses[favButtonPosition]} hover:opacity-100 transition-all flex items-center justify-center z-10`}
136
+ style={favButtonStyles}
137
+ />
138
+ )}
139
+
140
+ {isOnSale && (
141
+ <div className="absolute bottom-4 left-2 z-10">
142
+ <SaleTag />
143
+ </div>
144
+ )}
75
145
  </div>
76
- <div>
77
- <Link
78
- href={absolute_url}
79
- data-testid={`${product_name}-${index}`}
80
- onClick={() => pushProductClicked(product)}
81
- >
82
- {product_name}
83
- </Link>
84
- <div className="font-semibold">
85
- {parseFloat(retail_price) > parseFloat(price) && (
86
- <Price
87
- value={retail_price}
88
- className="font-normal line-through mr-3"
89
- />
90
- )}
91
- <Price value={price} data-testid="product-price" />
92
- </div>
146
+
147
+ <Link
148
+ href={absolute_url}
149
+ data-testid={`${product_name}-${index}`}
150
+ onClick={() => pushProductClicked(product)}
151
+ className="hover:underline"
152
+ style={productNameStyles}
153
+ >
154
+ {product_name}
155
+ </Link>
156
+
157
+ <div className="flex items-center gap-2">
158
+ {isOnSale && (
159
+ <Price
160
+ value={retail_price}
161
+ className="line-through"
162
+ style={oldPriceStyles}
163
+ />
164
+ )}
165
+ <Price value={price} data-testid="product-price" style={priceStyles} />
93
166
  </div>
94
167
  </div>
95
168
  );
@@ -2,11 +2,11 @@
2
2
 
3
3
  import { yupResolver } from '@hookform/resolvers/yup';
4
4
  import clsx from 'clsx';
5
- import { signIn, SignInOptions } from 'next-auth/react';
5
+ import { signIn } from 'next-auth/react';
6
6
  import { useState } from 'react';
7
7
  import { SubmitHandler, useForm } from 'react-hook-form';
8
8
  import { useAppDispatch, useAppSelector } from '@akinon/next/redux/hooks';
9
- import { RegisterFormType } from '@theme/types';
9
+ import { RegisterFormType, FormType, PzSignInOptions } from '@theme/types';
10
10
  import { Button, Checkbox, Icon, Input, Modal } from '@theme/components';
11
11
  import * as yup from 'yup';
12
12
  import { useCaptcha, useLocalization, useRouter } from '@akinon/next/hooks';
@@ -120,28 +120,21 @@ export const Register = () => {
120
120
  const [showPassword, setShowPassword] = useState(false);
121
121
  const { user_phone_format } = useAppSelector((state) => state.config);
122
122
 
123
- const registerHandler: SubmitHandler<RegisterFormType> = async (data) => {
123
+ const registerHandler = async (data: RegisterFormType) => {
124
124
  return await signIn('default', {
125
125
  redirect: false,
126
126
  callbackUrl: '/',
127
127
  captchaValidated,
128
- ...data
129
- } as SignInOptions);
128
+ ...data,
129
+ formType: FormType.register
130
+ } as PzSignInOptions & { redirect: false });
130
131
  };
131
132
 
132
133
  const onSubmit: SubmitHandler<RegisterFormType> = async (data) => {
133
134
  const registerResponse = await registerHandler(data);
134
135
 
135
- if (registerResponse.error === 'Captcha') {
136
- if (await validateCaptcha()) {
137
- onSubmit(data);
138
- }
139
-
140
- return;
141
- }
142
-
143
136
  if (registerResponse.error) {
144
- const errors: AuthError[] = JSON.parse(registerResponse.error);
137
+ const errors: AuthError[] = JSON.parse(registerResponse.code);
145
138
 
146
139
  if (errors.find((error) => error.type === 'captcha')) {
147
140
  if (await validateCaptcha()) {
@@ -164,10 +157,34 @@ export const Register = () => {
164
157
  )?.data as string[];
165
158
 
166
159
  fieldErrors?.forEach((item) => {
167
- setError(item.name as keyof RegisterFormType, {
168
- type: 'custom',
169
- message: item.value.join(', ')
170
- });
160
+ let parsedValue: Record<string, string[]> | string[] = [];
161
+
162
+ if (typeof item.value === 'string') {
163
+ try {
164
+ parsedValue = JSON.parse(item.value);
165
+ } catch {
166
+ parsedValue = [item.value];
167
+ }
168
+ } else {
169
+ parsedValue = item.value;
170
+ }
171
+
172
+ if (Array.isArray(parsedValue)) {
173
+ setError(item.name as keyof RegisterFormType, {
174
+ type: 'custom',
175
+ message: parsedValue.join(', ')
176
+ });
177
+ } else {
178
+ Object.keys(parsedValue).forEach((key) => {
179
+ const fieldName = key as keyof RegisterFormType;
180
+ const errorMessages = parsedValue[key] as string[];
181
+
182
+ setError(fieldName, {
183
+ type: 'custom',
184
+ message: errorMessages.join(', ')
185
+ });
186
+ });
187
+ }
171
188
  });
172
189
 
173
190
  if (nonFieldErrors?.length) {
@@ -192,7 +209,7 @@ export const Register = () => {
192
209
  };
193
210
 
194
211
  return (
195
- <section className="w-full py-10 px-5 md:py-0 md:block md:px-8 md:mx-auto lg:px-16">
212
+ <section className="w-full mt-6 lg:mt-8">
196
213
  <Modal
197
214
  title={contentModal.title}
198
215
  portalId="portal-modal-container"
@@ -213,23 +230,19 @@ export const Register = () => {
213
230
  }}
214
231
  />
215
232
  )}
216
- <h2 className="mb-3 text-lg text-start text-black-800 font-light md:mb-9 md:text-2xl">
217
- {t('auth.register.title')}
218
- </h2>
219
-
220
- <p className="mb-3 text-xs leading-4 text-primary-400">
221
- {t('auth.register.subtitle')}
222
- </p>
223
-
224
233
  <form onSubmit={handleSubmit(onSubmit)} className="flex flex-col gap-4">
225
- <input type="hidden" value="register" {...register('formType')} />
234
+ <input
235
+ type="hidden"
236
+ value={FormType.register}
237
+ {...register('formType')}
238
+ />
226
239
  <input type="hidden" value={locale} {...register('locale')} />
227
240
 
228
- <div className={clsx({ 'mb-4': errors.email })}>
241
+ <div>
229
242
  <Input
230
243
  labelStyle="floating"
231
244
  label={t('auth.register.form.email.placeholder')}
232
- className="h-14"
245
+ className="h-12"
233
246
  {...register('email')}
234
247
  error={errors.email}
235
248
  data-testid="register-email"
@@ -238,15 +251,13 @@ export const Register = () => {
238
251
  </div>
239
252
 
240
253
  <div
241
- className={clsx('lg:flex', {
242
- 'mb-4': errors.first_name || errors.last_name
243
- })}
254
+ className="lg:flex"
244
255
  >
245
256
  <div className="w-full lg:pr-2">
246
257
  <Input
247
258
  labelStyle="floating"
248
259
  label={t('auth.register.form.name.placeholder')}
249
- className="block h-14"
260
+ className="block h-12"
250
261
  {...register('first_name')}
251
262
  error={errors.first_name}
252
263
  data-testid="register-name"
@@ -258,7 +269,7 @@ export const Register = () => {
258
269
  <Input
259
270
  labelStyle="floating"
260
271
  label={t('auth.register.form.surname.placeholder')}
261
- className="block h-14"
272
+ className="block h-12"
262
273
  {...register('last_name')}
263
274
  error={errors.last_name}
264
275
  data-testid="register-surname"
@@ -267,12 +278,12 @@ export const Register = () => {
267
278
  </div>
268
279
  </div>
269
280
 
270
- <div className={clsx('relative', { 'mb-4': errors.password })}>
281
+ <div className="relative">
271
282
  <div className="relative">
272
283
  <Input
273
284
  labelStyle="floating"
274
285
  label={t('auth.register.form.password.placeholder')}
275
- className="h-14 pr-16"
286
+ className="h-12 pr-16"
276
287
  type={showPassword ? 'text' : 'password'}
277
288
  {...register('password')}
278
289
  data-testid="register-password"
@@ -298,11 +309,11 @@ export const Register = () => {
298
309
  />
299
310
  </div>
300
311
 
301
- <div className={clsx({ 'mb-4': errors.phone })}>
312
+ <div>
302
313
  <Input
303
314
  labelStyle="floating"
304
315
  label={t('auth.register.form.phone.placeholder')}
305
- className="h-14"
316
+ className="h-12"
306
317
  format={user_phone_format.replace(/9/g, '#')}
307
318
  allowEmptyFormatting
308
319
  mask="_"
@@ -318,7 +329,6 @@ export const Register = () => {
318
329
  <p className="mb-4">{t('auth.register.form.agreements.title')}:</p>
319
330
 
320
331
  <Checkbox
321
- className={clsx(errors.confirm ? 'mb-8' : 'mb-4')}
322
332
  {...register('confirm')}
323
333
  error={errors.confirm}
324
334
  data-testid="register-agreement-1"
@@ -337,7 +347,7 @@ export const Register = () => {
337
347
  </Checkbox>
338
348
 
339
349
  <Checkbox
340
- className={clsx(errors.kvkk_confirm ? 'mb-8' : 'mb-4')}
350
+ className="mt-4"
341
351
  {...register('kvkk_confirm')}
342
352
  error={errors.kvkk_confirm}
343
353
  data-testid="register-agreement-2"
@@ -356,7 +366,7 @@ export const Register = () => {
356
366
  </Checkbox>
357
367
 
358
368
  <Checkbox
359
- className="mb-4"
369
+ className="mt-4"
360
370
  {...register('email_allowed')}
361
371
  data-testid="register-agreement-3"
362
372
  >
@@ -374,7 +384,7 @@ export const Register = () => {
374
384
  </Checkbox>
375
385
 
376
386
  <Checkbox
377
- className="mb-4"
387
+ className="mt-4"
378
388
  {...register('sms_allowed')}
379
389
  data-testid="register-agreement-4"
380
390
  >
@@ -400,7 +410,7 @@ export const Register = () => {
400
410
  </div>
401
411
 
402
412
  <Button
403
- className="text-xs font-semibold uppercase w-full h-14"
413
+ className="w-full h-12 text-sm font-normal"
404
414
  type="submit"
405
415
  disabled={isCaptchaVisible && !captchaValidated}
406
416
  data-testid="register-submit"
@@ -4,7 +4,7 @@ import React, { useState } from 'react';
4
4
  import { Button, Icon } from '@theme/components';
5
5
  // eslint-disable-next-line @akinon/projectzero/link-import
6
6
  import Link from 'next/link';
7
- import { ShareProps } from '@theme/components/types';
7
+ import { ShareProps } from '@theme/components/types/index';
8
8
  import clsx from 'clsx';
9
9
 
10
10
  const Share = ({
@@ -13,18 +13,21 @@ const Share = ({
13
13
  buttonAppearance = 'ghost',
14
14
  className,
15
15
  buttonIconName = 'share',
16
- buttonIconSize = 16,
16
+ buttonIconSize = 24,
17
17
  buttonIconProps = {},
18
18
  items
19
19
  }: ShareProps) => {
20
20
  const [open, setOpen] = useState(false);
21
21
 
22
22
  return (
23
- <div className={clsx('flex items-center', className)}>
23
+ <div className={clsx('flex items-center gap-4 border-t', className)}>
24
24
  <Button
25
25
  onClick={() => setOpen(!open)}
26
26
  appearance={buttonAppearance}
27
- className={clsx('text-base', buttonClassName)}
27
+ className={clsx(
28
+ 'text-base p-0 bg-transparent hover:bg-transparent hover:text-primary',
29
+ buttonClassName
30
+ )}
28
31
  aria-label="Share"
29
32
  >
30
33
  <div className="flex items-center gap-2">
@@ -53,12 +56,12 @@ const Share = ({
53
56
  className={
54
57
  item.className
55
58
  ? item.className
56
- : 'px-6 py-2 h-10 flex items-center hover:bg-gray-100'
59
+ : 'p-4 h-auto flex items-center hover:bg-gray-100'
57
60
  }
58
61
  >
59
62
  <Icon
60
63
  name={item.iconName}
61
- size={item.iconSize ? item.iconSize : 16}
64
+ size={item.iconSize ? item.iconSize : 12}
62
65
  />
63
66
  </Link>
64
67
  </div>
@@ -11,44 +11,46 @@ export default function HomeHeroSliderContent({ data }) {
11
11
  };
12
12
 
13
13
  return (
14
- <CarouselCore
15
- responsive={{
16
- all: {
17
- breakpoint: { max: 5000, min: 0 },
18
- items: 1
19
- }
20
- }}
21
- arrows={false}
22
- swipeable={true}
23
- containerAspectRatio={{
24
- mobile: imageRatio.mobile,
25
- desktop: imageRatio.desktop
26
- }}
27
- >
28
- {data?.attributes?.hero_slider?.map((item, i) => (
29
- <div key={i}>
30
- <Link href={item.value.url}>
31
- <Image
32
- src={item.kwargs.value.mobile_image.url}
33
- alt={item.value.alt}
34
- aspectRatio={imageRatio.mobile}
35
- draggable={false}
36
- sizes="375px"
37
- fill
38
- className="block md:hidden"
39
- />
40
- <Image
41
- src={item.kwargs.value.image.url}
42
- alt={item.value.alt}
43
- aspectRatio={imageRatio.desktop}
44
- draggable={false}
45
- sizes="1540px"
46
- fill
47
- className="hidden md:block"
48
- />
49
- </Link>
50
- </div>
51
- ))}
52
- </CarouselCore>
14
+ <>
15
+ <CarouselCore
16
+ responsive={{
17
+ all: {
18
+ breakpoint: { max: 5000, min: 0 },
19
+ items: 1
20
+ }
21
+ }}
22
+ arrows={false}
23
+ swipeable={true}
24
+ containerAspectRatio={{
25
+ mobile: imageRatio.mobile,
26
+ desktop: imageRatio.desktop
27
+ }}
28
+ >
29
+ {data?.attributes?.hero_slider?.map((item, i) => (
30
+ <div key={i}>
31
+ <Link href={item.value.url}>
32
+ <Image
33
+ src={item.kwargs.value.mobile_image.url}
34
+ alt={item.value.alt}
35
+ aspectRatio={imageRatio.mobile}
36
+ draggable={false}
37
+ sizes="375px"
38
+ fill
39
+ className="block md:hidden"
40
+ />
41
+ <Image
42
+ src={item.kwargs.value.image.url}
43
+ alt={item.value.alt}
44
+ aspectRatio={imageRatio.desktop}
45
+ draggable={false}
46
+ sizes="1540px"
47
+ fill
48
+ className="hidden md:block"
49
+ />
50
+ </Link>
51
+ </div>
52
+ ))}
53
+ </CarouselCore>
54
+ </>
53
55
  );
54
56
  }
@@ -0,0 +1,78 @@
1
+ 'use client';
2
+ import { Image } from '@akinon/next/components';
3
+ import { useGetWidgetQuery } from '@akinon/next/data/client/misc';
4
+ import { LoaderSpinner } from '@theme/components';
5
+
6
+ export default function AboutUs() {
7
+ const { data, isLoading } = useGetWidgetQuery('about-us');
8
+
9
+ if (isLoading) {
10
+ return (
11
+ <div className="py-20">
12
+ <LoaderSpinner />;
13
+ </div>
14
+ );
15
+ }
16
+
17
+ if (!data) {
18
+ return null;
19
+ }
20
+
21
+ return (
22
+ <div>
23
+ <div className="container px-3 lg:px-0 py-4 lg:py-10">
24
+ <div className="flex gap-2.5 flex-col lg:flex-row">
25
+ <Image
26
+ src={data?.attributes?.image_1?.kwargs?.url}
27
+ alt={data?.attributes?.image_1?.value}
28
+ aspectRatio={350 / 330}
29
+ sizes="350px"
30
+ fill
31
+ />
32
+
33
+ <Image
34
+ src={data?.attributes?.image_2?.kwargs?.url}
35
+ alt={data?.attributes?.image_2?.value}
36
+ aspectRatio={350 / 330}
37
+ sizes="350px"
38
+ fill
39
+ />
40
+
41
+ <Image
42
+ src={data?.attributes?.image_3?.kwargs?.url}
43
+ alt={data?.attributes?.image_3?.value}
44
+ aspectRatio={350 / 330}
45
+ sizes="350px"
46
+ fill
47
+ />
48
+ </div>
49
+
50
+ <div className="my-10 lg:my-16 max-w-[495px] mx-auto">
51
+ <h1 className="text-[30px] lg:text-[40px] mb-8">
52
+ {data?.attributes?.title?.value}
53
+ </h1>
54
+ <div
55
+ className="text-[#121212] leading-[1.72] tracking-[0.64px]"
56
+ dangerouslySetInnerHTML={{
57
+ __html: data?.attributes?.content?.value || ''
58
+ }}
59
+ />
60
+ </div>
61
+ </div>
62
+
63
+ <div className="bg-[#fafafa] lg:bg-black text-[#121212] lg:text-white py-10 lg:py-16">
64
+ <div className="container">
65
+ <h2 className="text-center text-xl lg:text-2xl mb-8">
66
+ {data?.attributes?.highlight_section_title?.value}
67
+ </h2>
68
+ <div
69
+ className="text-center max-w-[295px] lg:max-w-[700px] mx-auto leading-[1.72] tracking-[0.64px]"
70
+ dangerouslySetInnerHTML={{
71
+ __html: data?.attributes?.highlight_section?.value || ''
72
+ }}
73
+ />
74
+ </div>
75
+ </div>
76
+ </div>
77
+ );
78
+ }