@fayz-ai/storefront 0.9.0 → 0.11.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 (391) hide show
  1. package/README.md +3 -3
  2. package/dist/app/createStorefrontApp.d.ts +65 -0
  3. package/dist/app/createStorefrontApp.d.ts.map +1 -0
  4. package/dist/{define.d.ts → app/define.d.ts} +3 -3
  5. package/dist/app/define.d.ts.map +1 -0
  6. package/dist/app/hydration.d.ts +37 -0
  7. package/dist/app/hydration.d.ts.map +1 -0
  8. package/dist/app/prerender.d.ts +57 -0
  9. package/dist/app/prerender.d.ts.map +1 -0
  10. package/dist/{router.d.ts → app/router.d.ts} +140 -113
  11. package/dist/app/router.d.ts.map +1 -0
  12. package/dist/{scaffold.d.ts → app/scaffold.d.ts} +2 -2
  13. package/dist/app/scaffold.d.ts.map +1 -0
  14. package/dist/app/serving.d.ts +70 -0
  15. package/dist/app/serving.d.ts.map +1 -0
  16. package/dist/app/static-render.d.ts +46 -0
  17. package/dist/app/static-render.d.ts.map +1 -0
  18. package/dist/blocks/block-at-path.d.ts +59 -0
  19. package/dist/blocks/block-at-path.d.ts.map +1 -0
  20. package/dist/blocks/page-blocks.d.ts +163 -0
  21. package/dist/blocks/page-blocks.d.ts.map +1 -0
  22. package/dist/blocks/page-data.d.ts +105 -0
  23. package/dist/blocks/page-data.d.ts.map +1 -0
  24. package/dist/{blocks.d.ts → blocks/registry.d.ts} +1 -1
  25. package/dist/blocks/registry.d.ts.map +1 -0
  26. package/dist/{sections.d.ts → blocks/sections.d.ts} +40 -2
  27. package/dist/blocks/sections.d.ts.map +1 -0
  28. package/dist/chunk-6IXTENLB.js +162 -0
  29. package/dist/chunk-6IXTENLB.js.map +1 -0
  30. package/dist/chunk-SX3J3QIT.js +11046 -0
  31. package/dist/chunk-SX3J3QIT.js.map +1 -0
  32. package/dist/components/PaymentTerms.d.ts +34 -0
  33. package/dist/components/PaymentTerms.d.ts.map +1 -0
  34. package/dist/components/Skeleton.d.ts +17 -0
  35. package/dist/components/Skeleton.d.ts.map +1 -0
  36. package/dist/components/SmoothImage.d.ts +1 -1
  37. package/dist/components/SmoothImage.d.ts.map +1 -1
  38. package/dist/components/account/CustomerAccountShell.d.ts +17 -0
  39. package/dist/components/account/CustomerAccountShell.d.ts.map +1 -0
  40. package/dist/components/account/SignInModal.d.ts.map +1 -0
  41. package/dist/components/account/section.d.ts +15 -0
  42. package/dist/components/account/section.d.ts.map +1 -0
  43. package/dist/components/cart/CartDrawer.d.ts.map +1 -0
  44. package/dist/components/cart/QuantityInput.d.ts.map +1 -0
  45. package/dist/components/checkout/CheckoutPayment.d.ts +17 -0
  46. package/dist/components/checkout/CheckoutPayment.d.ts.map +1 -0
  47. package/dist/components/checkout/CheckoutSteps.d.ts +9 -0
  48. package/dist/components/checkout/CheckoutSteps.d.ts.map +1 -0
  49. package/dist/components/checkout/DeliveryEstimator.d.ts.map +1 -0
  50. package/dist/components/collection/CategoryShowcase.d.ts +44 -0
  51. package/dist/components/collection/CategoryShowcase.d.ts.map +1 -0
  52. package/dist/components/collection/FiltersPanel.d.ts +19 -0
  53. package/dist/components/collection/FiltersPanel.d.ts.map +1 -0
  54. package/dist/components/collection/ProductGrid.d.ts.map +1 -0
  55. package/dist/components/layout/PageBodyBlocks.d.ts +40 -0
  56. package/dist/components/layout/PageBodyBlocks.d.ts.map +1 -0
  57. package/dist/components/layout/SearchOverlay.d.ts +13 -0
  58. package/dist/components/layout/SearchOverlay.d.ts.map +1 -0
  59. package/dist/components/layout/StorefrontErrorBoundary.d.ts.map +1 -0
  60. package/dist/components/layout/StorefrontFooter.d.ts.map +1 -0
  61. package/dist/components/layout/StorefrontHeader.d.ts.map +1 -0
  62. package/dist/components/layout/Toaster.d.ts.map +1 -0
  63. package/dist/components/marketing/CollectionSections.d.ts +463 -0
  64. package/dist/components/marketing/CollectionSections.d.ts.map +1 -0
  65. package/dist/components/marketing/ConversionSections.d.ts +221 -0
  66. package/dist/components/marketing/ConversionSections.d.ts.map +1 -0
  67. package/dist/components/marketing/EditorialSections.d.ts +248 -0
  68. package/dist/components/marketing/EditorialSections.d.ts.map +1 -0
  69. package/dist/components/marketing/EntityList.d.ts +97 -0
  70. package/dist/components/marketing/EntityList.d.ts.map +1 -0
  71. package/dist/components/marketing/FormBlock.d.ts +167 -0
  72. package/dist/components/marketing/FormBlock.d.ts.map +1 -0
  73. package/dist/components/marketing/HeroSection.d.ts +125 -0
  74. package/dist/components/marketing/HeroSection.d.ts.map +1 -0
  75. package/dist/components/marketing/MediaCarousel.d.ts +135 -0
  76. package/dist/components/marketing/MediaCarousel.d.ts.map +1 -0
  77. package/dist/components/marketing/MiscSections.d.ts +252 -0
  78. package/dist/components/marketing/MiscSections.d.ts.map +1 -0
  79. package/dist/components/order/OrderTrackingTimeline.d.ts.map +1 -0
  80. package/dist/components/order/SuccessMark.d.ts +10 -0
  81. package/dist/components/order/SuccessMark.d.ts.map +1 -0
  82. package/dist/components/product/ProductCard.d.ts +14 -0
  83. package/dist/components/product/ProductCard.d.ts.map +1 -0
  84. package/dist/components/product/ProductEnquiryForm.d.ts.map +1 -0
  85. package/dist/components/product/ProductGallery.d.ts +36 -0
  86. package/dist/components/product/ProductGallery.d.ts.map +1 -0
  87. package/dist/components/{ProductOptionSelector.d.ts → product/ProductOptionSelector.d.ts} +1 -1
  88. package/dist/components/product/ProductOptionSelector.d.ts.map +1 -0
  89. package/dist/components/product/ProductRail.d.ts +93 -0
  90. package/dist/components/product/ProductRail.d.ts.map +1 -0
  91. package/dist/components/product/ProductReviews.d.ts +39 -0
  92. package/dist/components/product/ProductReviews.d.ts.map +1 -0
  93. package/dist/components/product/ProductSlider.d.ts +169 -0
  94. package/dist/components/product/ProductSlider.d.ts.map +1 -0
  95. package/dist/components/product/ProductSpecs.d.ts.map +1 -0
  96. package/dist/components/product/RelatedProducts.d.ts.map +1 -0
  97. package/dist/{auth.d.ts → data/auth.d.ts} +9 -0
  98. package/dist/data/auth.d.ts.map +1 -0
  99. package/dist/data/facets.d.ts +39 -0
  100. package/dist/data/facets.d.ts.map +1 -0
  101. package/dist/data/loaders.d.ts +52 -0
  102. package/dist/data/loaders.d.ts.map +1 -0
  103. package/dist/data/local-orders.d.ts +5 -0
  104. package/dist/data/local-orders.d.ts.map +1 -0
  105. package/dist/data/order-status.d.ts.map +1 -0
  106. package/dist/data/product-options.d.ts +36 -0
  107. package/dist/data/product-options.d.ts.map +1 -0
  108. package/dist/data/shipping-items.d.ts +20 -0
  109. package/dist/data/shipping-items.d.ts.map +1 -0
  110. package/dist/diagnostics/seo-audit.d.ts +54 -0
  111. package/dist/diagnostics/seo-audit.d.ts.map +1 -0
  112. package/dist/diagnostics/seo-audit.js +3 -0
  113. package/dist/diagnostics/seo-audit.js.map +1 -0
  114. package/dist/document/change.d.ts +100 -0
  115. package/dist/document/change.d.ts.map +1 -0
  116. package/dist/document/config.d.ts +311 -0
  117. package/dist/document/config.d.ts.map +1 -0
  118. package/dist/document/describe.d.ts +135 -0
  119. package/dist/document/describe.d.ts.map +1 -0
  120. package/dist/document/overlay.d.ts +58 -0
  121. package/dist/document/overlay.d.ts.map +1 -0
  122. package/dist/{presets.d.ts → document/presets.d.ts} +2 -2
  123. package/dist/document/presets.d.ts.map +1 -0
  124. package/dist/document/render.d.ts +171 -0
  125. package/dist/document/render.d.ts.map +1 -0
  126. package/dist/document/round-trip.d.ts +46 -0
  127. package/dist/document/round-trip.d.ts.map +1 -0
  128. package/dist/document/sections.d.ts +194 -0
  129. package/dist/document/sections.d.ts.map +1 -0
  130. package/dist/document/store-policy.d.ts +29 -0
  131. package/dist/document/store-policy.d.ts.map +1 -0
  132. package/dist/document/upgrade.d.ts +112 -0
  133. package/dist/document/upgrade.d.ts.map +1 -0
  134. package/dist/document/validate.d.ts +24 -0
  135. package/dist/document/validate.d.ts.map +1 -0
  136. package/dist/{component-contracts.d.ts → extend/component-contracts.d.ts} +74 -22
  137. package/dist/extend/component-contracts.d.ts.map +1 -0
  138. package/dist/extend/component-override.d.ts +38 -0
  139. package/dist/extend/component-override.d.ts.map +1 -0
  140. package/dist/extend/component-selectors.d.ts.map +1 -0
  141. package/dist/extend/editor-bridge.d.ts +59 -0
  142. package/dist/extend/editor-bridge.d.ts.map +1 -0
  143. package/dist/extend/extension-points.d.ts +103 -0
  144. package/dist/extend/extension-points.d.ts.map +1 -0
  145. package/dist/extend/slots.d.ts +216 -0
  146. package/dist/extend/slots.d.ts.map +1 -0
  147. package/dist/hooks/index.d.ts +25 -6
  148. package/dist/hooks/index.d.ts.map +1 -1
  149. package/dist/hooks/use-address.d.ts +26 -0
  150. package/dist/hooks/use-address.d.ts.map +1 -0
  151. package/dist/hooks/use-cart.d.ts +3 -0
  152. package/dist/hooks/use-cart.d.ts.map +1 -0
  153. package/dist/hooks/use-catalog.d.ts +24 -0
  154. package/dist/hooks/use-catalog.d.ts.map +1 -0
  155. package/dist/hooks/use-categories.d.ts +19 -0
  156. package/dist/hooks/use-categories.d.ts.map +1 -0
  157. package/dist/hooks/use-checkout.d.ts +41 -0
  158. package/dist/hooks/use-checkout.d.ts.map +1 -0
  159. package/dist/hooks/use-discount-validator.d.ts +20 -0
  160. package/dist/hooks/use-discount-validator.d.ts.map +1 -0
  161. package/dist/hooks/use-enquiry.d.ts +7 -0
  162. package/dist/hooks/use-enquiry.d.ts.map +1 -0
  163. package/dist/hooks/{useMyOrders.d.ts → use-my-orders.d.ts} +1 -1
  164. package/dist/hooks/use-my-orders.d.ts.map +1 -0
  165. package/dist/hooks/use-order.d.ts +17 -0
  166. package/dist/hooks/use-order.d.ts.map +1 -0
  167. package/dist/hooks/use-payment-methods.d.ts +19 -0
  168. package/dist/hooks/use-payment-methods.d.ts.map +1 -0
  169. package/dist/hooks/use-policies.d.ts +25 -0
  170. package/dist/hooks/use-policies.d.ts.map +1 -0
  171. package/dist/hooks/use-product.d.ts +15 -0
  172. package/dist/hooks/use-product.d.ts.map +1 -0
  173. package/dist/hooks/{useProducts.d.ts → use-products.d.ts} +1 -1
  174. package/dist/hooks/use-products.d.ts.map +1 -0
  175. package/dist/hooks/use-region.d.ts +15 -0
  176. package/dist/hooks/use-region.d.ts.map +1 -0
  177. package/dist/hooks/use-shipping.d.ts +32 -0
  178. package/dist/hooks/use-shipping.d.ts.map +1 -0
  179. package/dist/hooks/use-storefront-actions.d.ts +12 -0
  180. package/dist/hooks/use-storefront-actions.d.ts.map +1 -0
  181. package/dist/hooks/use-storefront-head.d.ts +19 -0
  182. package/dist/hooks/use-storefront-head.d.ts.map +1 -0
  183. package/dist/hooks/use-storefront.d.ts +3 -0
  184. package/dist/hooks/use-storefront.d.ts.map +1 -0
  185. package/dist/index.d.ts +124 -54
  186. package/dist/index.d.ts.map +1 -1
  187. package/dist/index.js +1310 -5010
  188. package/dist/index.js.map +1 -1
  189. package/dist/lib/errors.d.ts +9 -0
  190. package/dist/lib/errors.d.ts.map +1 -0
  191. package/dist/lib/format.d.ts.map +1 -0
  192. package/dist/lib/motion.d.ts.map +1 -0
  193. package/dist/lib/seo.d.ts +26 -0
  194. package/dist/lib/seo.d.ts.map +1 -0
  195. package/dist/{testids.d.ts → lib/testids.d.ts} +33 -0
  196. package/dist/lib/testids.d.ts.map +1 -0
  197. package/dist/{theme.d.ts → lib/theme.d.ts} +41 -3
  198. package/dist/lib/theme.d.ts.map +1 -0
  199. package/dist/render.d.ts +5 -0
  200. package/dist/render.d.ts.map +1 -0
  201. package/dist/render.js +359 -0
  202. package/dist/render.js.map +1 -0
  203. package/dist/stores/cart.store.d.ts +34 -2
  204. package/dist/stores/cart.store.d.ts.map +1 -1
  205. package/dist/stores/catalog.store.d.ts +11 -0
  206. package/dist/stores/catalog.store.d.ts.map +1 -1
  207. package/dist/stores/delivery.store.d.ts +9 -0
  208. package/dist/stores/delivery.store.d.ts.map +1 -1
  209. package/dist/views/CatalogPage.d.ts.map +1 -0
  210. package/dist/views/CheckoutPage.d.ts.map +1 -0
  211. package/dist/views/ContentPage.d.ts +11 -0
  212. package/dist/views/ContentPage.d.ts.map +1 -0
  213. package/dist/views/HomePage.d.ts +9 -0
  214. package/dist/views/HomePage.d.ts.map +1 -0
  215. package/dist/views/MyPurchasesPage.d.ts.map +1 -0
  216. package/dist/views/NotFoundPage.d.ts.map +1 -0
  217. package/dist/views/OrderConfirmationPage.d.ts.map +1 -0
  218. package/dist/{pages → views}/PolicyPage.d.ts.map +1 -1
  219. package/dist/views/ProductDetailPage.d.ts.map +1 -0
  220. package/dist/views/StorefrontPage.d.ts +35 -0
  221. package/dist/views/StorefrontPage.d.ts.map +1 -0
  222. package/dist/workflows/checkout.d.ts +1 -1
  223. package/dist/workflows/checkout.d.ts.map +1 -1
  224. package/package.json +21 -14
  225. package/dist/auth.d.ts.map +0 -1
  226. package/dist/blocks.d.ts.map +0 -1
  227. package/dist/component-contracts.d.ts.map +0 -1
  228. package/dist/component-selectors.d.ts.map +0 -1
  229. package/dist/components/CartDrawer.d.ts.map +0 -1
  230. package/dist/components/CustomerAccountShell.d.ts +0 -13
  231. package/dist/components/CustomerAccountShell.d.ts.map +0 -1
  232. package/dist/components/DeliveryEstimator.d.ts.map +0 -1
  233. package/dist/components/FiltersPanel.d.ts +0 -3
  234. package/dist/components/FiltersPanel.d.ts.map +0 -1
  235. package/dist/components/OrderTrackingTimeline.d.ts.map +0 -1
  236. package/dist/components/ProductCard.d.ts +0 -4
  237. package/dist/components/ProductCard.d.ts.map +0 -1
  238. package/dist/components/ProductEnquiryForm.d.ts.map +0 -1
  239. package/dist/components/ProductGallery.d.ts +0 -22
  240. package/dist/components/ProductGallery.d.ts.map +0 -1
  241. package/dist/components/ProductGrid.d.ts.map +0 -1
  242. package/dist/components/ProductOptionSelector.d.ts.map +0 -1
  243. package/dist/components/ProductSpecs.d.ts.map +0 -1
  244. package/dist/components/QuantityInput.d.ts.map +0 -1
  245. package/dist/components/RelatedProducts.d.ts.map +0 -1
  246. package/dist/components/SignInModal.d.ts.map +0 -1
  247. package/dist/components/StorefrontErrorBoundary.d.ts.map +0 -1
  248. package/dist/components/StorefrontFooter.d.ts.map +0 -1
  249. package/dist/components/StorefrontHeader.d.ts.map +0 -1
  250. package/dist/components/Toaster.d.ts.map +0 -1
  251. package/dist/components/sections/CategoryShowcase.d.ts +0 -6
  252. package/dist/components/sections/CategoryShowcase.d.ts.map +0 -1
  253. package/dist/components/sections/HeroSection.d.ts +0 -9
  254. package/dist/components/sections/HeroSection.d.ts.map +0 -1
  255. package/dist/components/sections/MediaCarousel.d.ts +0 -11
  256. package/dist/components/sections/MediaCarousel.d.ts.map +0 -1
  257. package/dist/components/sections/MiscSections.d.ts +0 -33
  258. package/dist/components/sections/MiscSections.d.ts.map +0 -1
  259. package/dist/components/sections/ProductRail.d.ts +0 -9
  260. package/dist/components/sections/ProductRail.d.ts.map +0 -1
  261. package/dist/components/sections/ProductSlider.d.ts +0 -15
  262. package/dist/components/sections/ProductSlider.d.ts.map +0 -1
  263. package/dist/config.d.ts +0 -174
  264. package/dist/config.d.ts.map +0 -1
  265. package/dist/createStorefrontApp.d.ts +0 -28
  266. package/dist/createStorefrontApp.d.ts.map +0 -1
  267. package/dist/define.d.ts.map +0 -1
  268. package/dist/format.d.ts.map +0 -1
  269. package/dist/hooks/useCategories.d.ts +0 -6
  270. package/dist/hooks/useCategories.d.ts.map +0 -1
  271. package/dist/hooks/useDiscountValidator.d.ts +0 -14
  272. package/dist/hooks/useDiscountValidator.d.ts.map +0 -1
  273. package/dist/hooks/useMyOrders.d.ts.map +0 -1
  274. package/dist/hooks/useProduct.d.ts +0 -7
  275. package/dist/hooks/useProduct.d.ts.map +0 -1
  276. package/dist/hooks/useProducts.d.ts.map +0 -1
  277. package/dist/hooks/useStorefront.d.ts +0 -35
  278. package/dist/hooks/useStorefront.d.ts.map +0 -1
  279. package/dist/hooks/useStorefrontHead.d.ts +0 -11
  280. package/dist/hooks/useStorefrontHead.d.ts.map +0 -1
  281. package/dist/motion.d.ts.map +0 -1
  282. package/dist/order-status.d.ts.map +0 -1
  283. package/dist/pages/CatalogPage.d.ts.map +0 -1
  284. package/dist/pages/CheckoutPage.d.ts.map +0 -1
  285. package/dist/pages/HomePage.d.ts +0 -9
  286. package/dist/pages/HomePage.d.ts.map +0 -1
  287. package/dist/pages/MyPurchasesPage.d.ts.map +0 -1
  288. package/dist/pages/NotFoundPage.d.ts.map +0 -1
  289. package/dist/pages/OrderConfirmationPage.d.ts.map +0 -1
  290. package/dist/pages/ProductDetailPage.d.ts.map +0 -1
  291. package/dist/presets.d.ts.map +0 -1
  292. package/dist/product-options.d.ts +0 -12
  293. package/dist/product-options.d.ts.map +0 -1
  294. package/dist/router.d.ts.map +0 -1
  295. package/dist/scaffold.d.ts.map +0 -1
  296. package/dist/sections.d.ts.map +0 -1
  297. package/dist/testids.d.ts.map +0 -1
  298. package/dist/theme.d.ts.map +0 -1
  299. package/src/auth.ts +0 -227
  300. package/src/blocks.tsx +0 -51
  301. package/src/catalog.ts +0 -3
  302. package/src/component-contracts.ts +0 -154
  303. package/src/component-selectors.ts +0 -31
  304. package/src/components/CartDrawer.tsx +0 -279
  305. package/src/components/CustomerAccountShell.tsx +0 -102
  306. package/src/components/DeliveryEstimator.tsx +0 -157
  307. package/src/components/FiltersPanel.tsx +0 -109
  308. package/src/components/OrderTrackingTimeline.tsx +0 -135
  309. package/src/components/Price.tsx +0 -32
  310. package/src/components/ProductCard.tsx +0 -120
  311. package/src/components/ProductEnquiryForm.tsx +0 -175
  312. package/src/components/ProductGallery.tsx +0 -174
  313. package/src/components/ProductGrid.tsx +0 -43
  314. package/src/components/ProductOptionSelector.tsx +0 -50
  315. package/src/components/ProductSpecs.tsx +0 -75
  316. package/src/components/QuantityInput.tsx +0 -52
  317. package/src/components/RelatedProducts.tsx +0 -40
  318. package/src/components/SignInModal.tsx +0 -120
  319. package/src/components/SmoothImage.tsx +0 -59
  320. package/src/components/StorefrontErrorBoundary.tsx +0 -51
  321. package/src/components/StorefrontFooter.tsx +0 -110
  322. package/src/components/StorefrontHeader.tsx +0 -477
  323. package/src/components/Toaster.tsx +0 -60
  324. package/src/components/sections/CategoryShowcase.tsx +0 -80
  325. package/src/components/sections/HeroSection.tsx +0 -193
  326. package/src/components/sections/MediaCarousel.tsx +0 -141
  327. package/src/components/sections/MiscSections.tsx +0 -158
  328. package/src/components/sections/ProductRail.tsx +0 -81
  329. package/src/components/sections/ProductSlider.tsx +0 -119
  330. package/src/config.ts +0 -229
  331. package/src/createStorefrontApp.tsx +0 -247
  332. package/src/define.ts +0 -34
  333. package/src/format.ts +0 -7
  334. package/src/hooks/index.ts +0 -6
  335. package/src/hooks/useCategories.ts +0 -26
  336. package/src/hooks/useDiscountValidator.ts +0 -43
  337. package/src/hooks/useMyOrders.ts +0 -41
  338. package/src/hooks/useProduct.ts +0 -36
  339. package/src/hooks/useProducts.ts +0 -39
  340. package/src/hooks/useStorefront.ts +0 -58
  341. package/src/hooks/useStorefrontHead.ts +0 -25
  342. package/src/index.ts +0 -202
  343. package/src/motion.tsx +0 -94
  344. package/src/order-status.ts +0 -33
  345. package/src/pages/CatalogPage.tsx +0 -118
  346. package/src/pages/CheckoutPage.tsx +0 -689
  347. package/src/pages/HomePage.tsx +0 -16
  348. package/src/pages/MyPurchasesPage.tsx +0 -311
  349. package/src/pages/NotFoundPage.tsx +0 -25
  350. package/src/pages/OrderConfirmationPage.tsx +0 -190
  351. package/src/pages/PolicyPage.tsx +0 -47
  352. package/src/pages/ProductDetailPage.tsx +0 -264
  353. package/src/presets.ts +0 -324
  354. package/src/product-options.ts +0 -63
  355. package/src/router.ts +0 -49
  356. package/src/scaffold.tsx +0 -115
  357. package/src/sections.ts +0 -116
  358. package/src/shop.ts +0 -4
  359. package/src/stores/cart.store.ts +0 -185
  360. package/src/stores/catalog.store.ts +0 -39
  361. package/src/stores/delivery.store.ts +0 -152
  362. package/src/stores/session.store.ts +0 -28
  363. package/src/stores/toast.store.ts +0 -43
  364. package/src/testids.ts +0 -136
  365. package/src/theme.ts +0 -194
  366. package/src/ui.ts +0 -5
  367. package/src/workflows/checkout.ts +0 -119
  368. /package/dist/components/{SignInModal.d.ts → account/SignInModal.d.ts} +0 -0
  369. /package/dist/components/{CartDrawer.d.ts → cart/CartDrawer.d.ts} +0 -0
  370. /package/dist/components/{QuantityInput.d.ts → cart/QuantityInput.d.ts} +0 -0
  371. /package/dist/components/{DeliveryEstimator.d.ts → checkout/DeliveryEstimator.d.ts} +0 -0
  372. /package/dist/components/{ProductGrid.d.ts → collection/ProductGrid.d.ts} +0 -0
  373. /package/dist/components/{StorefrontErrorBoundary.d.ts → layout/StorefrontErrorBoundary.d.ts} +0 -0
  374. /package/dist/components/{StorefrontFooter.d.ts → layout/StorefrontFooter.d.ts} +0 -0
  375. /package/dist/components/{StorefrontHeader.d.ts → layout/StorefrontHeader.d.ts} +0 -0
  376. /package/dist/components/{Toaster.d.ts → layout/Toaster.d.ts} +0 -0
  377. /package/dist/components/{OrderTrackingTimeline.d.ts → order/OrderTrackingTimeline.d.ts} +0 -0
  378. /package/dist/components/{ProductEnquiryForm.d.ts → product/ProductEnquiryForm.d.ts} +0 -0
  379. /package/dist/components/{ProductSpecs.d.ts → product/ProductSpecs.d.ts} +0 -0
  380. /package/dist/components/{RelatedProducts.d.ts → product/RelatedProducts.d.ts} +0 -0
  381. /package/dist/{order-status.d.ts → data/order-status.d.ts} +0 -0
  382. /package/dist/{component-selectors.d.ts → extend/component-selectors.d.ts} +0 -0
  383. /package/dist/{format.d.ts → lib/format.d.ts} +0 -0
  384. /package/dist/{motion.d.ts → lib/motion.d.ts} +0 -0
  385. /package/dist/{pages → views}/CatalogPage.d.ts +0 -0
  386. /package/dist/{pages → views}/CheckoutPage.d.ts +0 -0
  387. /package/dist/{pages → views}/MyPurchasesPage.d.ts +0 -0
  388. /package/dist/{pages → views}/NotFoundPage.d.ts +0 -0
  389. /package/dist/{pages → views}/OrderConfirmationPage.d.ts +0 -0
  390. /package/dist/{pages → views}/PolicyPage.d.ts +0 -0
  391. /package/dist/{pages → views}/ProductDetailPage.d.ts +0 -0
@@ -1,50 +0,0 @@
1
- import React from 'react'
2
- import type { ProductOptionGroup, ProductOptionSelection } from '../product-options'
3
- import { TID } from '../testids'
4
-
5
- export interface ProductOptionSelectorProps {
6
- groups: ProductOptionGroup[]
7
- value: ProductOptionSelection
8
- onChange: (value: ProductOptionSelection) => void
9
- }
10
-
11
- export function ProductOptionSelector({ groups, value, onChange }: ProductOptionSelectorProps) {
12
- if (groups.length === 0) return null
13
-
14
- return (
15
- <div className="mt-6 space-y-4">
16
- {groups.map((group) => (
17
- <div key={group.id} data-testid={TID.productOptionGroup(group.id)}>
18
- <div className="mb-2 flex items-center justify-between gap-3">
19
- <p className="text-sm font-medium">{group.label}</p>
20
- {value[group.label] && (
21
- <p className="truncate text-xs text-muted-foreground">{value[group.label]}</p>
22
- )}
23
- </div>
24
- <div className="flex flex-wrap gap-2">
25
- {group.values.map((option) => {
26
- const selected = value[group.label] === option
27
- return (
28
- <button
29
- key={option}
30
- type="button"
31
- data-testid={TID.productOptionValue(group.id, option)}
32
- aria-pressed={selected}
33
- onClick={() => onChange({ ...value, [group.label]: option })}
34
- className={[
35
- 'min-h-10 rounded-full border px-4 text-sm font-medium transition-colors',
36
- selected
37
- ? 'border-primary bg-primary text-primary-foreground'
38
- : 'border-border bg-background text-foreground hover:border-primary/60',
39
- ].join(' ')}
40
- >
41
- {option}
42
- </button>
43
- )
44
- })}
45
- </div>
46
- </div>
47
- ))}
48
- </div>
49
- )
50
- }
@@ -1,75 +0,0 @@
1
- import React from 'react'
2
- import type { Product } from '@fayz-ai/shop/types'
3
-
4
- // Metadata keys that drive the option selector (size/color) are excluded here so
5
- // specs don't duplicate the picker; the rest are internal SDK/seed/overlay keys
6
- // that aren't customer-facing specs.
7
- const EXCLUDED_KEYS = new Set([
8
- 'options', 'sizes', 'colors',
9
- 'fayzStoreCategory', 'source', 'storeKey', 'storeName', 'tenantId', 'slug',
10
- ])
11
-
12
- // Internal namespaced keys (fayz*, _*) are never shown as specs.
13
- function isInternalKey(key: string): boolean {
14
- return EXCLUDED_KEYS.has(key) || key.startsWith('_') || key.startsWith('fayz')
15
- }
16
-
17
- // Friendly PT-BR labels for common metadata keys; unknown keys are humanized.
18
- const LABELS: Record<string, string> = {
19
- colorway: 'Cor',
20
- color: 'Cor',
21
- fit: 'Caimento',
22
- material: 'Material',
23
- vintage: 'Safra',
24
- region: 'Região',
25
- grape: 'Uva',
26
- pairing: 'Harmonização',
27
- abv: 'Teor alcoólico',
28
- volume: 'Volume',
29
- brand: 'Marca',
30
- origin: 'Origem',
31
- warranty: 'Garantia',
32
- dimensions: 'Dimensões',
33
- }
34
-
35
- function humanize(key: string): string {
36
- if (LABELS[key]) return LABELS[key]
37
- const spaced = key.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/[_-]+/g, ' ').trim()
38
- return spaced.charAt(0).toUpperCase() + spaced.slice(1)
39
- }
40
-
41
- function scalarToString(value: unknown): string | null {
42
- if (typeof value === 'string') return value.trim() || null
43
- if (typeof value === 'number') return String(value)
44
- if (typeof value === 'boolean') return value ? 'Sim' : 'Não'
45
- return null
46
- }
47
-
48
- /** Real product specs from standard fields + scalar metadata. Renders nothing
49
- * when there's nothing to show. No invented data. */
50
- export function ProductSpecs({ product }: { product: Product }) {
51
- const rows: Array<[string, string]> = []
52
- if (product.sku) rows.push(['SKU', product.sku])
53
- if (product.categoryName) rows.push(['Categoria', product.categoryName])
54
- if (product.weight != null) rows.push(['Peso', `${product.weight} ${product.weightUnit}`])
55
- for (const [key, value] of Object.entries(product.metadata ?? {})) {
56
- if (isInternalKey(key)) continue
57
- const str = scalarToString(value)
58
- if (str) rows.push([humanize(key), str])
59
- }
60
- if (rows.length === 0) return null
61
-
62
- return (
63
- <section className="mt-14">
64
- <h2 className="sf-heading text-xl font-semibold tracking-tight">Especificações</h2>
65
- <dl className="mt-5 grid gap-x-12 sm:grid-cols-2">
66
- {rows.map(([label, value]) => (
67
- <div key={label} className="flex items-center justify-between gap-4 border-b py-3 text-sm">
68
- <dt className="text-muted-foreground">{label}</dt>
69
- <dd className="text-right font-medium">{value}</dd>
70
- </div>
71
- ))}
72
- </dl>
73
- </section>
74
- )
75
- }
@@ -1,52 +0,0 @@
1
- import React from 'react'
2
- import { Minus, Plus } from 'lucide-react'
3
-
4
- export interface QuantityInputProps {
5
- value: number
6
- onChange(next: number): void
7
- min?: number
8
- max?: number
9
- testId?: string
10
- incTestId?: string
11
- decTestId?: string
12
- }
13
-
14
- export function QuantityInput({ value, onChange, min = 1, max, testId, incTestId, decTestId }: QuantityInputProps) {
15
- const clamp = (n: number) => Math.max(min, max != null ? Math.min(n, max) : n)
16
- return (
17
- <div className="inline-flex items-center rounded-lg border">
18
- <button
19
- type="button"
20
- data-testid={decTestId}
21
- aria-label="Diminuir quantidade"
22
- onClick={() => onChange(clamp(value - 1))}
23
- className="px-2.5 py-1.5 text-muted-foreground hover:text-foreground disabled:opacity-40"
24
- disabled={value <= min}
25
- >
26
- <Minus className="h-3.5 w-3.5" />
27
- </button>
28
- <input
29
- data-testid={testId}
30
- type="number"
31
- value={value}
32
- min={min}
33
- max={max}
34
- onChange={(e) => {
35
- const n = parseInt(e.target.value, 10)
36
- if (!isNaN(n)) onChange(clamp(n))
37
- }}
38
- className="w-12 border-x bg-transparent py-1.5 text-center text-sm [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none"
39
- />
40
- <button
41
- type="button"
42
- data-testid={incTestId}
43
- aria-label="Aumentar quantidade"
44
- onClick={() => onChange(clamp(value + 1))}
45
- className="px-2.5 py-1.5 text-muted-foreground hover:text-foreground disabled:opacity-40"
46
- disabled={max != null && value >= max}
47
- >
48
- <Plus className="h-3.5 w-3.5" />
49
- </button>
50
- </div>
51
- )
52
- }
@@ -1,40 +0,0 @@
1
- import React from 'react'
2
- import type { ListProductsOptions, Product } from '@fayz-ai/shop/types'
3
- import { useProducts } from '../hooks/useProducts'
4
- import { getStorefrontComponents, useStorefrontConfig } from '../config'
5
- import { useStorefrontActions } from '../hooks/useStorefront'
6
- import { ProductCard } from './ProductCard'
7
-
8
- /** "Você também pode gostar" — products from the same category, excluding the
9
- * current one. Renders through the store's configured card component for visual
10
- * consistency with the catalog. Hidden when there's nothing relevant. */
11
- export function RelatedProducts({ product }: { product: Product }) {
12
- const config = useStorefrontConfig()
13
- const actions = useStorefrontActions()
14
- const components = getStorefrontComponents(config)
15
- const Card = components.ProductCard ?? ProductCard
16
- const opts: ListProductsOptions = product.categoryId
17
- ? { categoryId: product.categoryId, status: 'active', limit: 5 }
18
- : { status: 'active', limit: 5 }
19
- const { products, loading } = useProducts(opts)
20
- const related = products.filter((p) => p.id !== product.id).slice(0, 4)
21
-
22
- if (loading || related.length === 0) return null
23
-
24
- return (
25
- <section className="mt-16">
26
- <h2 className="sf-heading text-xl font-semibold tracking-tight">Você também pode gostar</h2>
27
- <div className="mt-6 grid grid-cols-2 gap-5 md:grid-cols-4">
28
- {related.map((p) => (
29
- <Card
30
- key={p.id}
31
- product={p}
32
- config={config}
33
- commerceMode={config.commerceMode}
34
- actions={actions}
35
- />
36
- ))}
37
- </div>
38
- </section>
39
- )
40
- }
@@ -1,120 +0,0 @@
1
- import React, { useEffect, useState } from 'react'
2
- import { Lock, X } from 'lucide-react'
3
- import { establishCustomerSession } from '../auth'
4
- import { useSessionStore } from '../stores/session.store'
5
- import { Link } from '../router'
6
-
7
- interface SignInModalProps {
8
- /** Prefill the email field (e.g. from a checkout contact field). */
9
- defaultEmail?: string
10
- onClose: () => void
11
- /** Called after a successful sign-in, with the resolved session. */
12
- onSignedIn?: (session: { email: string | null; name: string | null }) => void
13
- }
14
-
15
- /**
16
- * Customer sign-in as a focused modal dialog. Used from checkout ("Já tem
17
- * conta? Entrar") so a returning buyer can authenticate without leaving the
18
- * page. Auth goes through the shared establishCustomerSession path.
19
- */
20
- export function SignInModal({ defaultEmail = '', onClose, onSignedIn }: SignInModalProps) {
21
- const [email, setEmail] = useState(defaultEmail)
22
- const [password, setPassword] = useState('')
23
- const [busy, setBusy] = useState(false)
24
- const [error, setError] = useState<string | null>(null)
25
-
26
- useEffect(() => {
27
- const onKey = (event: KeyboardEvent) => { if (event.key === 'Escape') onClose() }
28
- document.addEventListener('keydown', onKey)
29
- return () => document.removeEventListener('keydown', onKey)
30
- }, [onClose])
31
-
32
- async function submit(event: React.FormEvent) {
33
- event.preventDefault()
34
- if (!email.trim() || !password) return
35
- setBusy(true)
36
- setError(null)
37
- try {
38
- await establishCustomerSession(email, { password })
39
- const session = useSessionStore.getState()
40
- onSignedIn?.({ email: session.email, name: session.name })
41
- onClose()
42
- } catch {
43
- setError('Não foi possível entrar. Verifique seu e-mail e senha.')
44
- } finally {
45
- setBusy(false)
46
- }
47
- }
48
-
49
- return (
50
- <div
51
- className="fixed inset-0 z-[60] flex items-center justify-center p-4"
52
- role="dialog"
53
- aria-modal="true"
54
- aria-label="Entrar na sua conta"
55
- >
56
- <div className="absolute inset-0 animate-fade-in bg-foreground/40 backdrop-blur-sm" onClick={onClose} />
57
- <div
58
- className="relative z-10 w-full max-w-sm animate-fade-up border bg-card p-6 shadow-2xl"
59
- style={{ borderRadius: 'var(--sf-radius-card)' }}
60
- >
61
- <button
62
- type="button"
63
- onClick={onClose}
64
- aria-label="Fechar"
65
- className="absolute right-4 top-4 rounded-full p-1 text-muted-foreground transition hover:bg-muted hover:text-foreground"
66
- >
67
- <X className="h-5 w-5" />
68
- </button>
69
-
70
- <div className="flex items-center gap-2">
71
- <span className="flex h-9 w-9 items-center justify-center rounded-full bg-primary/10 text-primary">
72
- <Lock className="h-4 w-4" />
73
- </span>
74
- <div>
75
- <h2 className="sf-heading text-lg font-semibold leading-tight">Entrar na sua conta</h2>
76
- <p className="text-xs text-muted-foreground">Use seus dados salvos e acompanhe pedidos.</p>
77
- </div>
78
- </div>
79
-
80
- <form onSubmit={submit} className="mt-5 space-y-3">
81
- <input
82
- type="email"
83
- required
84
- autoFocus
85
- placeholder="voce@exemplo.com"
86
- value={email}
87
- onChange={(event) => setEmail(event.target.value)}
88
- className="w-full border bg-background px-3 py-2.5 text-sm outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/10"
89
- style={{ borderRadius: 'var(--sf-radius-input)' }}
90
- />
91
- <input
92
- type="password"
93
- required
94
- placeholder="Senha"
95
- value={password}
96
- onChange={(event) => setPassword(event.target.value)}
97
- className="w-full border bg-background px-3 py-2.5 text-sm outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/10"
98
- style={{ borderRadius: 'var(--sf-radius-input)' }}
99
- />
100
- {error && <p className="text-sm text-destructive">{error}</p>}
101
- <button
102
- type="submit"
103
- disabled={busy}
104
- className="sf-cta w-full bg-primary py-3 font-semibold text-primary-foreground shadow-md transition-all hover:-translate-y-0.5 hover:shadow-lg disabled:opacity-60"
105
- style={{ borderRadius: 'var(--sf-radius-button)' }}
106
- >
107
- {busy ? 'Entrando…' : 'Entrar'}
108
- </button>
109
- </form>
110
-
111
- <p className="mt-4 text-center text-sm text-muted-foreground">
112
- Não tem conta?{' '}
113
- <Link to="/account" onClick={onClose} className="font-semibold text-primary hover:underline">
114
- Criar conta
115
- </Link>
116
- </p>
117
- </div>
118
- </div>
119
- )
120
- }
@@ -1,59 +0,0 @@
1
- import React from 'react'
2
- import { useStorefrontConfigOptional, type StorefrontImageLoadingConfig } from '../config'
3
-
4
- export interface SmoothImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {
5
- imageLoading?: StorefrontImageLoadingConfig
6
- }
7
-
8
- export function SmoothImage({
9
- imageLoading,
10
- loading = 'lazy',
11
- decoding = 'async',
12
- onLoad,
13
- style,
14
- ...props
15
- }: SmoothImageProps) {
16
- const config = useStorefrontConfigOptional()
17
- const resolved = {
18
- ...config?.imageLoading,
19
- ...imageLoading,
20
- }
21
- const mode = resolved.mode ?? 'fade'
22
- const durationMs = resolved.durationMs ?? 420
23
- const easing = resolved.easing ?? 'cubic-bezier(0.22, 1, 0.36, 1)'
24
- const blur = resolved.blur ?? true
25
- const ref = React.useRef<HTMLImageElement | null>(null)
26
- const [loaded, setLoaded] = React.useState(mode === 'none')
27
-
28
- React.useEffect(() => {
29
- if (mode === 'none') {
30
- setLoaded(true)
31
- return
32
- }
33
- if (ref.current?.complete && ref.current.naturalWidth > 0) setLoaded(true)
34
- }, [mode, props.src])
35
-
36
- const revealStyle: React.CSSProperties =
37
- mode === 'none'
38
- ? {}
39
- : {
40
- opacity: loaded ? 1 : 0,
41
- filter: blur && !loaded ? 'blur(10px)' : 'blur(0px)',
42
- transition: `opacity ${durationMs}ms ${easing}, filter ${durationMs}ms ${easing}, transform ${durationMs}ms ${easing}`,
43
- }
44
-
45
- return (
46
- <img
47
- {...props}
48
- ref={ref}
49
- loading={loading}
50
- decoding={decoding}
51
- data-sf-image-loaded={loaded ? 'true' : 'false'}
52
- style={{ ...style, ...revealStyle }}
53
- onLoad={(event) => {
54
- setLoaded(true)
55
- onLoad?.(event)
56
- }}
57
- />
58
- )
59
- }
@@ -1,51 +0,0 @@
1
- import React from 'react'
2
-
3
- interface Props {
4
- children: React.ReactNode
5
- }
6
-
7
- interface State {
8
- error: Error | null
9
- }
10
-
11
- /**
12
- * Catches render/runtime errors in the storefront tree so a single thrown
13
- * error (e.g. a provider failure) shows a recoverable fallback instead of a
14
- * blank white screen. Key it by route to auto-clear on navigation.
15
- */
16
- export class StorefrontErrorBoundary extends React.Component<Props, State> {
17
- state: State = { error: null }
18
-
19
- static getDerivedStateFromError(error: Error): State {
20
- return { error }
21
- }
22
-
23
- componentDidCatch(error: Error, info: React.ErrorInfo): void {
24
- // eslint-disable-next-line no-console
25
- console.error('[storefront] render error:', error, info.componentStack)
26
- }
27
-
28
- render(): React.ReactNode {
29
- if (!this.state.error) return this.props.children
30
- return (
31
- <div className="flex min-h-[60vh] flex-col items-center justify-center gap-4 px-4 py-16 text-center">
32
- <h1 className="sf-heading text-xl font-semibold">Algo deu errado</h1>
33
- <p className="max-w-md text-sm text-muted-foreground">
34
- Ocorreu um erro ao carregar esta parte da loja. Tente recarregar a página.
35
- </p>
36
- <div className="flex flex-wrap justify-center gap-3">
37
- <button
38
- type="button"
39
- onClick={() => window.location.reload()}
40
- className="rounded-lg bg-primary px-5 py-2.5 text-sm font-semibold text-primary-foreground transition hover:opacity-90"
41
- >
42
- Recarregar
43
- </button>
44
- <a href="#/" className="rounded-lg border px-5 py-2.5 text-sm font-semibold transition hover:bg-muted">
45
- Voltar ao início
46
- </a>
47
- </div>
48
- </div>
49
- )
50
- }
51
- }
@@ -1,110 +0,0 @@
1
- import React from 'react'
2
- import { useStorefrontConfig } from '../config'
3
- import { useCategories } from '../hooks/useCategories'
4
- import { useCatalogStore } from '../stores/catalog.store'
5
- import { Link, navigateTo } from '../router'
6
-
7
- export function StorefrontFooter() {
8
- const config = useStorefrontConfig()
9
- const { categories } = useCategories()
10
- const visibleCategories = categories.slice(0, 8)
11
- const hiddenCategoryCount = Math.max(categories.length - visibleCategories.length, 0)
12
- const labels = {
13
- categories: 'Departamentos',
14
- navigation: 'Navegação',
15
- contact: 'Contato',
16
- viewAll: 'Ver todos',
17
- purchases: 'Minhas compras',
18
- privacy: 'Privacidade',
19
- terms: 'Termos',
20
- returns: 'Trocas e devoluções',
21
- ...config.footer?.labels,
22
- }
23
-
24
- const goCategory = (categoryId: string) => {
25
- useCatalogStore.getState().reset()
26
- useCatalogStore.getState().setCategoryId(categoryId)
27
- navigateTo(config.catalogPath)
28
- }
29
-
30
- return (
31
- <footer className="mt-16 border-t bg-card">
32
- <div className="mx-auto grid max-w-7xl gap-10 px-4 py-12 sm:grid-cols-2 sm:px-6 lg:grid-cols-4">
33
- <div>
34
- <p className="sf-heading text-lg font-bold">{config.name}</p>
35
- {config.footer?.about && (
36
- <p className="mt-3 text-sm leading-relaxed text-muted-foreground">{config.footer.about}</p>
37
- )}
38
- </div>
39
-
40
- <div>
41
- <h3 className="mb-3 text-sm font-semibold uppercase tracking-wide text-muted-foreground">{labels.categories}</h3>
42
- <ul className="space-y-2 text-sm">
43
- {visibleCategories.map((c) => (
44
- <li key={c.id}>
45
- <button
46
- type="button"
47
- onClick={() => goCategory(c.id)}
48
- className="max-w-full truncate text-left transition-opacity hover:opacity-70"
49
- >
50
- {c.name}
51
- </button>
52
- </li>
53
- ))}
54
- {hiddenCategoryCount > 0 && (
55
- <li>
56
- <Link to={config.catalogPath} className="font-medium underline-offset-2 transition-opacity hover:underline">
57
- {labels.viewAll} ({categories.length})
58
- </Link>
59
- </li>
60
- )}
61
- </ul>
62
- </div>
63
-
64
- <div>
65
- <h3 className="mb-3 text-sm font-semibold uppercase tracking-wide text-muted-foreground">{labels.navigation}</h3>
66
- <ul className="space-y-2 text-sm">
67
- {config.nav.map((link) => (
68
- <li key={link.to}>
69
- <Link to={link.to} className="transition-opacity hover:opacity-70">{link.label}</Link>
70
- </li>
71
- ))}
72
- {config.features.accounts && (
73
- <li>
74
- <Link to="/account" className="transition-opacity hover:opacity-70">{labels.purchases}</Link>
75
- </li>
76
- )}
77
- </ul>
78
- </div>
79
-
80
- <div>
81
- <h3 className="mb-3 text-sm font-semibold uppercase tracking-wide text-muted-foreground">{labels.contact}</h3>
82
- <ul className="space-y-2 text-sm text-muted-foreground">
83
- {config.footer?.contact?.phone && <li>{config.footer.contact.phone}</li>}
84
- {config.footer?.contact?.email && <li>{config.footer.contact.email}</li>}
85
- {config.footer?.contact?.address && <li>{config.footer.contact.address}</li>}
86
- {config.footer?.social?.map((s) => (
87
- <li key={s.href}>
88
- <a href={s.href} target="_blank" rel="noreferrer" className="transition-opacity hover:opacity-70">
89
- {s.label}
90
- </a>
91
- </li>
92
- ))}
93
- </ul>
94
- </div>
95
- </div>
96
- <div className="border-t">
97
- <div className="mx-auto flex max-w-7xl flex-col items-center gap-3 px-4 py-5 text-xs text-muted-foreground sm:flex-row sm:justify-between sm:px-6">
98
- <nav className="flex flex-wrap items-center justify-center gap-x-5 gap-y-2">
99
- <Link to="/privacy" className="transition-colors hover:text-foreground">{labels.privacy}</Link>
100
- <Link to="/terms" className="transition-colors hover:text-foreground">{labels.terms}</Link>
101
- <Link to="/refunds" className="transition-colors hover:text-foreground">{labels.returns}</Link>
102
- </nav>
103
- <p className="text-center">
104
- {config.footer?.credit ?? <>© {config.name} — powered by Fayz</>}
105
- </p>
106
- </div>
107
- </div>
108
- </footer>
109
- )
110
- }