@salla.sa/twilight-theme-engine 1.0.0-beta.4
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.
- package/README.md +165 -0
- package/dist/AddToCartForm-HOWNKCKX.js +304 -0
- package/dist/AddToCartForm-HOWNKCKX.js.map +1 -0
- package/dist/BlogAuthorPage-W3BZIJHJ.js +101 -0
- package/dist/BlogAuthorPage-W3BZIJHJ.js.map +1 -0
- package/dist/BlogCategoryPage-AIAJ5JBR.js +101 -0
- package/dist/BlogCategoryPage-AIAJ5JBR.js.map +1 -0
- package/dist/BlogPage-4BYF2EQW.js +190 -0
- package/dist/BlogPage-4BYF2EQW.js.map +1 -0
- package/dist/BlogSinglePage-AMNAUMWW.js +187 -0
- package/dist/BlogSinglePage-AMNAUMWW.js.map +1 -0
- package/dist/BlogTagPage-ELG2H5N5.js +101 -0
- package/dist/BlogTagPage-ELG2H5N5.js.map +1 -0
- package/dist/BrandsPage-ZSO3PYAV.js +127 -0
- package/dist/BrandsPage-ZSO3PYAV.js.map +1 -0
- package/dist/Breadcrumb-N32QFMVK.js +152 -0
- package/dist/Breadcrumb-N32QFMVK.js.map +1 -0
- package/dist/CartItem-SGTGOTEC.js +171 -0
- package/dist/CartItem-SGTGOTEC.js.map +1 -0
- package/dist/CartSummary-OKDGVSX2.js +236 -0
- package/dist/CartSummary-OKDGVSX2.js.map +1 -0
- package/dist/Copyright-F3HLYXFJ.js +9 -0
- package/dist/Copyright-F3HLYXFJ.js.map +1 -0
- package/dist/CurrencySymbol-TARAYUOT.js +11 -0
- package/dist/CurrencySymbol-TARAYUOT.js.map +1 -0
- package/dist/CustomerLayout-LB4E2LHT.js +68 -0
- package/dist/CustomerLayout-LB4E2LHT.js.map +1 -0
- package/dist/ErrorPage-TK4U3ENF.js +6 -0
- package/dist/ErrorPage-TK4U3ENF.js.map +1 -0
- package/dist/Footer-UVCSKTW3.js +39 -0
- package/dist/Footer-UVCSKTW3.js.map +1 -0
- package/dist/GoogleTag-4LHWC365.js +52 -0
- package/dist/GoogleTag-4LHWC365.js.map +1 -0
- package/dist/Header-BF6SPZJC.js +15 -0
- package/dist/Header-BF6SPZJC.js.map +1 -0
- package/dist/ImageModal-WLJM3WIE.js +41 -0
- package/dist/ImageModal-WLJM3WIE.js.map +1 -0
- package/dist/LoyaltyPage-X4PHPUFC.js +188 -0
- package/dist/LoyaltyPage-X4PHPUFC.js.map +1 -0
- package/dist/MainMenu-R3EWTNNC.js +91 -0
- package/dist/MainMenu-R3EWTNNC.js.map +1 -0
- package/dist/MasterLayout-5JLM7IMW.js +39 -0
- package/dist/MasterLayout-5JLM7IMW.js.map +1 -0
- package/dist/MobileMenu-QXESUQXC.js +175 -0
- package/dist/MobileMenu-QXESUQXC.js.map +1 -0
- package/dist/NoContent-PBGESHBJ.js +21 -0
- package/dist/NoContent-PBGESHBJ.js.map +1 -0
- package/dist/NotificationsPage-V6UIPDJD.js +84 -0
- package/dist/NotificationsPage-V6UIPDJD.js.map +1 -0
- package/dist/OrderSinglePage-ZMEKPLE3.js +441 -0
- package/dist/OrderSinglePage-ZMEKPLE3.js.map +1 -0
- package/dist/OrdersPage-EAATVPYK.js +184 -0
- package/dist/OrdersPage-EAATVPYK.js.map +1 -0
- package/dist/PageSingle-Y6ARZ5LS.js +28 -0
- package/dist/PageSingle-Y6ARZ5LS.js.map +1 -0
- package/dist/PreOrderNotification-ZVTGNV7K.js +23 -0
- package/dist/PreOrderNotification-ZVTGNV7K.js.map +1 -0
- package/dist/PriceQuoteButton-RAAPL4N4.js +26 -0
- package/dist/PriceQuoteButton-RAAPL4N4.js.map +1 -0
- package/dist/ProductDetails-KTY4ZSFM.js +194 -0
- package/dist/ProductDetails-KTY4ZSFM.js.map +1 -0
- package/dist/ProfilePage-6SK34MDJ.js +64 -0
- package/dist/ProfilePage-6SK34MDJ.js.map +1 -0
- package/dist/RenderWhenVisible-TR7G2KUC.js +50 -0
- package/dist/RenderWhenVisible-TR7G2KUC.js.map +1 -0
- package/dist/SeoCartWidget-XF4GEJK7.js +109 -0
- package/dist/SeoCartWidget-XF4GEJK7.js.map +1 -0
- package/dist/SettingsPage-DPYARBPO.js +51 -0
- package/dist/SettingsPage-DPYARBPO.js.map +1 -0
- package/dist/SiftSnippet-X74S5KDO.js +29 -0
- package/dist/SiftSnippet-X74S5KDO.js.map +1 -0
- package/dist/StoreClosedNotification-KSB2GPEZ.js +91 -0
- package/dist/StoreClosedNotification-KSB2GPEZ.js.map +1 -0
- package/dist/Testimonials-MZCVP66E.js +26 -0
- package/dist/Testimonials-MZCVP66E.js.map +1 -0
- package/dist/TestimonialsPage-4OFS5Z4V.js +77 -0
- package/dist/TestimonialsPage-4OFS5Z4V.js.map +1 -0
- package/dist/ThankYouPage-C7PA3RJP.js +236 -0
- package/dist/ThankYouPage-C7PA3RJP.js.map +1 -0
- package/dist/TwilightBundles-5F2H75VV.js +46 -0
- package/dist/TwilightBundles-5F2H75VV.js.map +1 -0
- package/dist/WalletPage-66XGZKO7.js +189 -0
- package/dist/WalletPage-66XGZKO7.js.map +1 -0
- package/dist/WidgetHead-FXEPCB23.js +7 -0
- package/dist/WidgetHead-FXEPCB23.js.map +1 -0
- package/dist/WishlistPage-7ZZYHBSZ.js +144 -0
- package/dist/WishlistPage-7ZZYHBSZ.js.map +1 -0
- package/dist/ambient/salla-components.d.ts +312 -0
- package/dist/ambient/virtual-modules.d.ts +22 -0
- package/dist/api/apps.d.ts +28 -0
- package/dist/api/apps.d.ts.map +1 -0
- package/dist/api/apps.js +26 -0
- package/dist/api/apps.js.map +1 -0
- package/dist/api/blog.d.ts +61 -0
- package/dist/api/blog.d.ts.map +1 -0
- package/dist/api/brands.d.ts +25 -0
- package/dist/api/brands.d.ts.map +1 -0
- package/dist/api/brands.js +40 -0
- package/dist/api/brands.js.map +1 -0
- package/dist/api/cart.d.ts +21 -0
- package/dist/api/cart.d.ts.map +1 -0
- package/dist/api/cart.js +40 -0
- package/dist/api/cart.js.map +1 -0
- package/dist/api/category.d.ts +31 -0
- package/dist/api/category.d.ts.map +1 -0
- package/dist/api/category.js +40 -0
- package/dist/api/category.js.map +1 -0
- package/dist/api/client.d.ts +17 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +7 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/home.d.ts +15 -0
- package/dist/api/home.d.ts.map +1 -0
- package/dist/api/home.js +8 -0
- package/dist/api/home.js.map +1 -0
- package/dist/api/loyalty.d.ts +25 -0
- package/dist/api/loyalty.d.ts.map +1 -0
- package/dist/api/loyalty.js +40 -0
- package/dist/api/loyalty.js.map +1 -0
- package/dist/api/menu.d.ts +16 -0
- package/dist/api/menu.d.ts.map +1 -0
- package/dist/api/menu.js +8 -0
- package/dist/api/menu.js.map +1 -0
- package/dist/api/notification.d.ts +26 -0
- package/dist/api/notification.d.ts.map +1 -0
- package/dist/api/order.d.ts +74 -0
- package/dist/api/order.d.ts.map +1 -0
- package/dist/api/order.js +40 -0
- package/dist/api/order.js.map +1 -0
- package/dist/api/page.d.ts +16 -0
- package/dist/api/page.d.ts.map +1 -0
- package/dist/api/page.js +40 -0
- package/dist/api/page.js.map +1 -0
- package/dist/api/product.d.ts +80 -0
- package/dist/api/product.d.ts.map +1 -0
- package/dist/api/product.js +40 -0
- package/dist/api/product.js.map +1 -0
- package/dist/api/profile.d.ts +9 -0
- package/dist/api/profile.d.ts.map +1 -0
- package/dist/api/profile.js +23 -0
- package/dist/api/profile.js.map +1 -0
- package/dist/api/store.d.ts +46 -0
- package/dist/api/store.d.ts.map +1 -0
- package/dist/api/store.js +8 -0
- package/dist/api/store.js.map +1 -0
- package/dist/api/translations.d.ts +15 -0
- package/dist/api/translations.d.ts.map +1 -0
- package/dist/api/translations.js +8 -0
- package/dist/api/translations.js.map +1 -0
- package/dist/api/types.d.ts +54 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +3 -0
- package/dist/api/types.js.map +1 -0
- package/dist/api/user.d.ts +15 -0
- package/dist/api/user.d.ts.map +1 -0
- package/dist/api/user.js +8 -0
- package/dist/api/user.js.map +1 -0
- package/dist/api/wallet.d.ts +30 -0
- package/dist/api/wallet.d.ts.map +1 -0
- package/dist/api/wishlist.d.ts +25 -0
- package/dist/api/wishlist.d.ts.map +1 -0
- package/dist/chunk-25SSLQAJ.js +67 -0
- package/dist/chunk-25SSLQAJ.js.map +1 -0
- package/dist/chunk-2FU6CVSB.js +18 -0
- package/dist/chunk-2FU6CVSB.js.map +1 -0
- package/dist/chunk-2KF5JJU6.js +169 -0
- package/dist/chunk-2KF5JJU6.js.map +1 -0
- package/dist/chunk-2TB2LTL2.js +103 -0
- package/dist/chunk-2TB2LTL2.js.map +1 -0
- package/dist/chunk-3DCZJDDK.js +10 -0
- package/dist/chunk-3DCZJDDK.js.map +1 -0
- package/dist/chunk-3UHSMGPY.js +145 -0
- package/dist/chunk-3UHSMGPY.js.map +1 -0
- package/dist/chunk-4EQEYRZ7.js +65 -0
- package/dist/chunk-4EQEYRZ7.js.map +1 -0
- package/dist/chunk-562ZMVI3.js +592 -0
- package/dist/chunk-562ZMVI3.js.map +1 -0
- package/dist/chunk-5Q6PFLDN.js +20 -0
- package/dist/chunk-5Q6PFLDN.js.map +1 -0
- package/dist/chunk-6B6VCCMC.js +28 -0
- package/dist/chunk-6B6VCCMC.js.map +1 -0
- package/dist/chunk-6BZ5TKEV.js +44 -0
- package/dist/chunk-6BZ5TKEV.js.map +1 -0
- package/dist/chunk-6NBBXERE.js +24 -0
- package/dist/chunk-6NBBXERE.js.map +1 -0
- package/dist/chunk-6Q5BFHFA.js +88 -0
- package/dist/chunk-6Q5BFHFA.js.map +1 -0
- package/dist/chunk-6YX4RS55.js +33 -0
- package/dist/chunk-6YX4RS55.js.map +1 -0
- package/dist/chunk-7LP7D75V.js +14 -0
- package/dist/chunk-7LP7D75V.js.map +1 -0
- package/dist/chunk-A5ZRUAMT.js +16 -0
- package/dist/chunk-A5ZRUAMT.js.map +1 -0
- package/dist/chunk-B3EFOE57.js +32 -0
- package/dist/chunk-B3EFOE57.js.map +1 -0
- package/dist/chunk-BT6HEEAP.js +31 -0
- package/dist/chunk-BT6HEEAP.js.map +1 -0
- package/dist/chunk-BVSJPBJ6.js +26 -0
- package/dist/chunk-BVSJPBJ6.js.map +1 -0
- package/dist/chunk-BWFBVXT3.js +13 -0
- package/dist/chunk-BWFBVXT3.js.map +1 -0
- package/dist/chunk-CW625T2E.js +62 -0
- package/dist/chunk-CW625T2E.js.map +1 -0
- package/dist/chunk-DFMO5KBU.js +67 -0
- package/dist/chunk-DFMO5KBU.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +10 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-EQ5ZGAVR.js +89 -0
- package/dist/chunk-EQ5ZGAVR.js.map +1 -0
- package/dist/chunk-FBFPH5BB.js +34 -0
- package/dist/chunk-FBFPH5BB.js.map +1 -0
- package/dist/chunk-G7ALL4BC.js +52 -0
- package/dist/chunk-G7ALL4BC.js.map +1 -0
- package/dist/chunk-GBWCXUPD.js +99 -0
- package/dist/chunk-GBWCXUPD.js.map +1 -0
- package/dist/chunk-GLM3RPCP.js +1167 -0
- package/dist/chunk-GLM3RPCP.js.map +1 -0
- package/dist/chunk-GN34LCTG.js +92 -0
- package/dist/chunk-GN34LCTG.js.map +1 -0
- package/dist/chunk-GO34DE35.js +247 -0
- package/dist/chunk-GO34DE35.js.map +1 -0
- package/dist/chunk-HOSHJBPS.js +52 -0
- package/dist/chunk-HOSHJBPS.js.map +1 -0
- package/dist/chunk-I5Z4NJBB.js +17 -0
- package/dist/chunk-I5Z4NJBB.js.map +1 -0
- package/dist/chunk-J37AYLWL.js +66 -0
- package/dist/chunk-J37AYLWL.js.map +1 -0
- package/dist/chunk-KCKHA75V.js +19 -0
- package/dist/chunk-KCKHA75V.js.map +1 -0
- package/dist/chunk-KIPZQN3Y.js +158 -0
- package/dist/chunk-KIPZQN3Y.js.map +1 -0
- package/dist/chunk-LBUMC5PB.js +34 -0
- package/dist/chunk-LBUMC5PB.js.map +1 -0
- package/dist/chunk-LSDIFHXZ.js +80 -0
- package/dist/chunk-LSDIFHXZ.js.map +1 -0
- package/dist/chunk-M6ICEIWY.js +25 -0
- package/dist/chunk-M6ICEIWY.js.map +1 -0
- package/dist/chunk-MTONGOJD.js +42 -0
- package/dist/chunk-MTONGOJD.js.map +1 -0
- package/dist/chunk-MXQCE3KA.js +173 -0
- package/dist/chunk-MXQCE3KA.js.map +1 -0
- package/dist/chunk-N5RSKJP4.js +65 -0
- package/dist/chunk-N5RSKJP4.js.map +1 -0
- package/dist/chunk-N7CCSGZF.js +3 -0
- package/dist/chunk-N7CCSGZF.js.map +1 -0
- package/dist/chunk-NBHI5X36.js +27 -0
- package/dist/chunk-NBHI5X36.js.map +1 -0
- package/dist/chunk-NSX6XPDU.js +673 -0
- package/dist/chunk-NSX6XPDU.js.map +1 -0
- package/dist/chunk-O2UOV5RK.js +32 -0
- package/dist/chunk-O2UOV5RK.js.map +1 -0
- package/dist/chunk-OZTGUF7K.js +66 -0
- package/dist/chunk-OZTGUF7K.js.map +1 -0
- package/dist/chunk-Q3VACSSR.js +21 -0
- package/dist/chunk-Q3VACSSR.js.map +1 -0
- package/dist/chunk-QTDGM2SO.js +123 -0
- package/dist/chunk-QTDGM2SO.js.map +1 -0
- package/dist/chunk-QYL5OHAV.js +70 -0
- package/dist/chunk-QYL5OHAV.js.map +1 -0
- package/dist/chunk-RH32IGQD.js +372 -0
- package/dist/chunk-RH32IGQD.js.map +1 -0
- package/dist/chunk-RUHSV4Z6.js +12 -0
- package/dist/chunk-RUHSV4Z6.js.map +1 -0
- package/dist/chunk-RYBA3JDM.js +33 -0
- package/dist/chunk-RYBA3JDM.js.map +1 -0
- package/dist/chunk-SBIXBX6J.js +29 -0
- package/dist/chunk-SBIXBX6J.js.map +1 -0
- package/dist/chunk-SSRNIBVV.js +75 -0
- package/dist/chunk-SSRNIBVV.js.map +1 -0
- package/dist/chunk-SVZOWI7E.js +51 -0
- package/dist/chunk-SVZOWI7E.js.map +1 -0
- package/dist/chunk-SYHTMNYF.js +89 -0
- package/dist/chunk-SYHTMNYF.js.map +1 -0
- package/dist/chunk-T72DAX7R.js +65 -0
- package/dist/chunk-T72DAX7R.js.map +1 -0
- package/dist/chunk-TCSNNCRH.js +23 -0
- package/dist/chunk-TCSNNCRH.js.map +1 -0
- package/dist/chunk-TQLEQSXE.js +48 -0
- package/dist/chunk-TQLEQSXE.js.map +1 -0
- package/dist/chunk-TRUQDEMI.js +14 -0
- package/dist/chunk-TRUQDEMI.js.map +1 -0
- package/dist/chunk-TZ3E5BN4.js +91 -0
- package/dist/chunk-TZ3E5BN4.js.map +1 -0
- package/dist/chunk-TZ4YD5CU.js +16 -0
- package/dist/chunk-TZ4YD5CU.js.map +1 -0
- package/dist/chunk-U7HAK5U7.js +105 -0
- package/dist/chunk-U7HAK5U7.js.map +1 -0
- package/dist/chunk-UE3BUFZI.js +16 -0
- package/dist/chunk-UE3BUFZI.js.map +1 -0
- package/dist/chunk-UIX3W2PN.js +56 -0
- package/dist/chunk-UIX3W2PN.js.map +1 -0
- package/dist/chunk-VVRYP6IL.js +61 -0
- package/dist/chunk-VVRYP6IL.js.map +1 -0
- package/dist/chunk-VVZNW5CB.js +49 -0
- package/dist/chunk-VVZNW5CB.js.map +1 -0
- package/dist/chunk-XHGF75TM.js +133 -0
- package/dist/chunk-XHGF75TM.js.map +1 -0
- package/dist/chunk-XUI3TRXF.js +26 -0
- package/dist/chunk-XUI3TRXF.js.map +1 -0
- package/dist/chunk-YCYTBRYB.js +30 -0
- package/dist/chunk-YCYTBRYB.js.map +1 -0
- package/dist/chunk-YMVLYYLU.js +25 -0
- package/dist/chunk-YMVLYYLU.js.map +1 -0
- package/dist/chunk-Z653O7MX.js +10 -0
- package/dist/chunk-Z653O7MX.js.map +1 -0
- package/dist/chunk-ZCH7W7DZ.js +30 -0
- package/dist/chunk-ZCH7W7DZ.js.map +1 -0
- package/dist/components/Component.d.ts +8 -0
- package/dist/components/Component.d.ts.map +1 -0
- package/dist/components/ComponentRegistry.d.ts +19 -0
- package/dist/components/ComponentRegistry.d.ts.map +1 -0
- package/dist/components/cart/CartItem.d.ts +8 -0
- package/dist/components/cart/CartItem.d.ts.map +1 -0
- package/dist/components/cart/CartSummary.d.ts +12 -0
- package/dist/components/cart/CartSummary.d.ts.map +1 -0
- package/dist/components/cart/PreOrderNotification.d.ts +2 -0
- package/dist/components/cart/PreOrderNotification.d.ts.map +1 -0
- package/dist/components/cart/PriceQuoteButton.d.ts +2 -0
- package/dist/components/cart/PriceQuoteButton.d.ts.map +1 -0
- package/dist/components/cart/SeoCartWidget.d.ts +34 -0
- package/dist/components/cart/SeoCartWidget.d.ts.map +1 -0
- package/dist/components/cart/index.d.ts +4 -0
- package/dist/components/cart/index.d.ts.map +1 -0
- package/dist/components/cart/index.js +4 -0
- package/dist/components/cart/index.js.map +1 -0
- package/dist/components/cart/lazy.d.ts +8 -0
- package/dist/components/cart/lazy.d.ts.map +1 -0
- package/dist/components/collapse/Collapse.d.ts +51 -0
- package/dist/components/collapse/Collapse.d.ts.map +1 -0
- package/dist/components/collapse/index.d.ts +36 -0
- package/dist/components/collapse/index.d.ts.map +1 -0
- package/dist/components/collapse/index.js +44 -0
- package/dist/components/collapse/index.js.map +1 -0
- package/dist/components/common/Breadcrumb.d.ts +7 -0
- package/dist/components/common/Breadcrumb.d.ts.map +1 -0
- package/dist/components/common/BreadcrumbJsonLd.d.ts +8 -0
- package/dist/components/common/BreadcrumbJsonLd.d.ts.map +1 -0
- package/dist/components/common/BreadcrumbTrail.d.ts +8 -0
- package/dist/components/common/BreadcrumbTrail.d.ts.map +1 -0
- package/dist/components/common/CurrencySymbol.d.ts +8 -0
- package/dist/components/common/CurrencySymbol.d.ts.map +1 -0
- package/dist/components/common/DeferredData.d.ts +20 -0
- package/dist/components/common/DeferredData.d.ts.map +1 -0
- package/dist/components/common/ErrorPage.d.ts +18 -0
- package/dist/components/common/ErrorPage.d.ts.map +1 -0
- package/dist/components/common/Image.d.ts +28 -0
- package/dist/components/common/Image.d.ts.map +1 -0
- package/dist/components/common/Link.d.ts +21 -0
- package/dist/components/common/Link.d.ts.map +1 -0
- package/dist/components/common/Link.types.d.ts +82 -0
- package/dist/components/common/Link.types.d.ts.map +1 -0
- package/dist/components/common/NoContent.d.ts +9 -0
- package/dist/components/common/NoContent.d.ts.map +1 -0
- package/dist/components/common/RenderWhenVisible.d.ts +23 -0
- package/dist/components/common/RenderWhenVisible.d.ts.map +1 -0
- package/dist/components/common/index.d.ts +11 -0
- package/dist/components/common/index.d.ts.map +1 -0
- package/dist/components/common/index.js +6 -0
- package/dist/components/common/index.js.map +1 -0
- package/dist/components/common/lazy.d.ts +13 -0
- package/dist/components/common/lazy.d.ts.map +1 -0
- package/dist/components/common/types.d.ts +7 -0
- package/dist/components/common/types.d.ts.map +1 -0
- package/dist/components/defineComponent.d.ts +11 -0
- package/dist/components/defineComponent.d.ts.map +1 -0
- package/dist/components/drawer/Drawer.d.ts +53 -0
- package/dist/components/drawer/Drawer.d.ts.map +1 -0
- package/dist/components/drawer/index.d.ts +32 -0
- package/dist/components/drawer/index.d.ts.map +1 -0
- package/dist/components/drawer/index.js +40 -0
- package/dist/components/drawer/index.js.map +1 -0
- package/dist/components/dropdown/Dropdown.d.ts +63 -0
- package/dist/components/dropdown/Dropdown.d.ts.map +1 -0
- package/dist/components/dropdown/index.d.ts +34 -0
- package/dist/components/dropdown/index.d.ts.map +1 -0
- package/dist/components/dropdown/index.js +67 -0
- package/dist/components/dropdown/index.js.map +1 -0
- package/dist/components/home/BundleComponent.d.ts +9 -0
- package/dist/components/home/BundleComponent.d.ts.map +1 -0
- package/dist/components/home/ComponentErrorBoundary.d.ts +22 -0
- package/dist/components/home/ComponentErrorBoundary.d.ts.map +1 -0
- package/dist/components/home/FeaturedProductsStyle1.d.ts +26 -0
- package/dist/components/home/FeaturedProductsStyle1.d.ts.map +1 -0
- package/dist/components/home/FeaturedProductsStyle2.d.ts +25 -0
- package/dist/components/home/FeaturedProductsStyle2.d.ts.map +1 -0
- package/dist/components/home/FeaturedProductsStyle3.d.ts +20 -0
- package/dist/components/home/FeaturedProductsStyle3.d.ts.map +1 -0
- package/dist/components/home/FixedBanner.d.ts +16 -0
- package/dist/components/home/FixedBanner.d.ts.map +1 -0
- package/dist/components/home/FixedProducts.d.ts +18 -0
- package/dist/components/home/FixedProducts.d.ts.map +1 -0
- package/dist/components/home/HomePageRenderer.d.ts +37 -0
- package/dist/components/home/HomePageRenderer.d.ts.map +1 -0
- package/dist/components/home/ParallaxBackground.d.ts +17 -0
- package/dist/components/home/ParallaxBackground.d.ts.map +1 -0
- package/dist/components/home/PhotosSlider.d.ts +16 -0
- package/dist/components/home/PhotosSlider.d.ts.map +1 -0
- package/dist/components/home/ProductsSlider.d.ts +25 -0
- package/dist/components/home/ProductsSlider.d.ts.map +1 -0
- package/dist/components/home/SquarePhotos.d.ts +21 -0
- package/dist/components/home/SquarePhotos.d.ts.map +1 -0
- package/dist/components/home/StoreFeatures.d.ts +9 -0
- package/dist/components/home/StoreFeatures.d.ts.map +1 -0
- package/dist/components/home/Testimonials.d.ts +15 -0
- package/dist/components/home/Testimonials.d.ts.map +1 -0
- package/dist/components/home/Youtube.d.ts +9 -0
- package/dist/components/home/Youtube.d.ts.map +1 -0
- package/dist/components/home/index.d.ts +9 -0
- package/dist/components/home/index.d.ts.map +1 -0
- package/dist/components/home/index.js +43 -0
- package/dist/components/home/index.js.map +1 -0
- package/dist/components/home/lazy.d.ts +14 -0
- package/dist/components/home/lazy.d.ts.map +1 -0
- package/dist/components/home/register.d.ts +4 -0
- package/dist/components/home/register.d.ts.map +1 -0
- package/dist/components/home/types.d.ts +6 -0
- package/dist/components/home/types.d.ts.map +1 -0
- package/dist/components/layout/Copyright.d.ts +8 -0
- package/dist/components/layout/Copyright.d.ts.map +1 -0
- package/dist/components/layout/CustomerLayout.d.ts +8 -0
- package/dist/components/layout/CustomerLayout.d.ts.map +1 -0
- package/dist/components/layout/Footer.d.ts +2 -0
- package/dist/components/layout/Footer.d.ts.map +1 -0
- package/dist/components/layout/Header.d.ts +7 -0
- package/dist/components/layout/Header.d.ts.map +1 -0
- package/dist/components/layout/MasterLayout.d.ts +3 -0
- package/dist/components/layout/MasterLayout.d.ts.map +1 -0
- package/dist/components/layout/WidgetHead.d.ts +21 -0
- package/dist/components/layout/WidgetHead.d.ts.map +1 -0
- package/dist/components/layout/index.d.ts +5 -0
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/layout/index.js +25 -0
- package/dist/components/layout/index.js.map +1 -0
- package/dist/components/layout/lazy.d.ts +11 -0
- package/dist/components/layout/lazy.d.ts.map +1 -0
- package/dist/components/layout/types.d.ts +10 -0
- package/dist/components/layout/types.d.ts.map +1 -0
- package/dist/components/modal/ImageModal.d.ts +37 -0
- package/dist/components/modal/ImageModal.d.ts.map +1 -0
- package/dist/components/modal/Modal.d.ts +78 -0
- package/dist/components/modal/Modal.d.ts.map +1 -0
- package/dist/components/modal/index.d.ts +30 -0
- package/dist/components/modal/index.d.ts.map +1 -0
- package/dist/components/modal/index.js +5 -0
- package/dist/components/modal/index.js.map +1 -0
- package/dist/components/modal/lazy.d.ts +7 -0
- package/dist/components/modal/lazy.d.ts.map +1 -0
- package/dist/components/navigation/MainMenu.d.ts +2 -0
- package/dist/components/navigation/MainMenu.d.ts.map +1 -0
- package/dist/components/navigation/MobileMenu.d.ts +6 -0
- package/dist/components/navigation/MobileMenu.d.ts.map +1 -0
- package/dist/components/navigation/index.d.ts +3 -0
- package/dist/components/navigation/index.d.ts.map +1 -0
- package/dist/components/navigation/lazy.d.ts +7 -0
- package/dist/components/navigation/lazy.d.ts.map +1 -0
- package/dist/components/product/AddToCartForm.d.ts +12 -0
- package/dist/components/product/AddToCartForm.d.ts.map +1 -0
- package/dist/components/product/ProductCard.d.ts +16 -0
- package/dist/components/product/ProductCard.d.ts.map +1 -0
- package/dist/components/product/ProductDetails.d.ts +8 -0
- package/dist/components/product/ProductDetails.d.ts.map +1 -0
- package/dist/components/product/ProductGallery.d.ts +7 -0
- package/dist/components/product/ProductGallery.d.ts.map +1 -0
- package/dist/components/product/index.d.ts +8 -0
- package/dist/components/product/index.d.ts.map +1 -0
- package/dist/components/product/index.js +41 -0
- package/dist/components/product/index.js.map +1 -0
- package/dist/components/product/lazy.d.ts +3 -0
- package/dist/components/product/lazy.d.ts.map +1 -0
- package/dist/components/store/StoreClosedNotification.d.ts +17 -0
- package/dist/components/store/StoreClosedNotification.d.ts.map +1 -0
- package/dist/components/store/index.d.ts +3 -0
- package/dist/components/store/index.d.ts.map +1 -0
- package/dist/components/store/lazy.d.ts +3 -0
- package/dist/components/store/lazy.d.ts.map +1 -0
- package/dist/components/toast/Toaster.d.ts +8 -0
- package/dist/components/toast/Toaster.d.ts.map +1 -0
- package/dist/components/toast/index.d.ts +4 -0
- package/dist/components/toast/index.d.ts.map +1 -0
- package/dist/components/toast/index.js +5 -0
- package/dist/components/toast/index.js.map +1 -0
- package/dist/components/toast/types.d.ts +27 -0
- package/dist/components/toast/types.d.ts.map +1 -0
- package/dist/components/toast/useToast.d.ts +5 -0
- package/dist/components/toast/useToast.d.ts.map +1 -0
- package/dist/components/tracking/GoogleTag.d.ts +13 -0
- package/dist/components/tracking/GoogleTag.d.ts.map +1 -0
- package/dist/components/tracking/SiftSnippet.d.ts +16 -0
- package/dist/components/tracking/SiftSnippet.d.ts.map +1 -0
- package/dist/components/tracking/TwilightBundles.d.ts +11 -0
- package/dist/components/tracking/TwilightBundles.d.ts.map +1 -0
- package/dist/components/tracking/index.d.ts +5 -0
- package/dist/components/tracking/index.d.ts.map +1 -0
- package/dist/components/tracking/lazy.d.ts +5 -0
- package/dist/components/tracking/lazy.d.ts.map +1 -0
- package/dist/components/useComponent.d.ts +4 -0
- package/dist/components/useComponent.d.ts.map +1 -0
- package/dist/contexts/CartContext.d.ts +34 -0
- package/dist/contexts/CartContext.d.ts.map +1 -0
- package/dist/contexts/ProductContext.d.ts +34 -0
- package/dist/contexts/ProductContext.d.ts.map +1 -0
- package/dist/contexts/index.d.ts +3 -0
- package/dist/contexts/index.d.ts.map +1 -0
- package/dist/document-class-PLK3HUM6.js +21 -0
- package/dist/document-class-PLK3HUM6.js.map +1 -0
- package/dist/dom/document.d.ts +26 -0
- package/dist/dom/document.d.ts.map +1 -0
- package/dist/dom/index.d.ts +24 -0
- package/dist/dom/index.d.ts.map +1 -0
- package/dist/dom.d.ts +1 -0
- package/dist/dom.js +18 -0
- package/dist/dom.js.map +1 -0
- package/dist/eslint/index.d.ts +17 -0
- package/dist/eslint/index.d.ts.map +1 -0
- package/dist/eslint/index.js +86 -0
- package/dist/eslint/index.js.map +1 -0
- package/dist/hooks/HookRegistry.d.ts +47 -0
- package/dist/hooks/HookRegistry.d.ts.map +1 -0
- package/dist/hooks/HookRegistry.js +4 -0
- package/dist/hooks/HookRegistry.js.map +1 -0
- package/dist/hooks/HookSlot.d.ts +96 -0
- package/dist/hooks/HookSlot.d.ts.map +1 -0
- package/dist/hooks/HookSlot.js +6 -0
- package/dist/hooks/HookSlot.js.map +1 -0
- package/dist/hooks/index.d.ts +27 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +39 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/registerDefaultHooks.d.ts +18 -0
- package/dist/hooks/registerDefaultHooks.d.ts.map +1 -0
- package/dist/hooks/types.d.ts +100 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/useAsset.d.ts +26 -0
- package/dist/hooks/useAsset.d.ts.map +1 -0
- package/dist/hooks/useAsset.js +5 -0
- package/dist/hooks/useAsset.js.map +1 -0
- package/dist/hooks/useAsyncFn.d.ts +68 -0
- package/dist/hooks/useAsyncFn.d.ts.map +1 -0
- package/dist/hooks/useAsyncFn.js +4 -0
- package/dist/hooks/useAsyncFn.js.map +1 -0
- package/dist/hooks/useBlogLike.d.ts +7 -0
- package/dist/hooks/useBlogLike.d.ts.map +1 -0
- package/dist/hooks/useBlogLike.js +7 -0
- package/dist/hooks/useBlogLike.js.map +1 -0
- package/dist/hooks/useBreadcrumbs.d.ts +3 -0
- package/dist/hooks/useBreadcrumbs.d.ts.map +1 -0
- package/dist/hooks/useComments.d.ts +36 -0
- package/dist/hooks/useComments.d.ts.map +1 -0
- package/dist/hooks/useComments.js +4 -0
- package/dist/hooks/useComments.js.map +1 -0
- package/dist/hooks/useCoupon.d.ts +66 -0
- package/dist/hooks/useCoupon.d.ts.map +1 -0
- package/dist/hooks/useCoupon.js +5 -0
- package/dist/hooks/useCoupon.js.map +1 -0
- package/dist/hooks/useDate.d.ts +24 -0
- package/dist/hooks/useDate.d.ts.map +1 -0
- package/dist/hooks/useDocumentClass.d.ts +42 -0
- package/dist/hooks/useDocumentClass.d.ts.map +1 -0
- package/dist/hooks/useDocumentClass.js +5 -0
- package/dist/hooks/useDocumentClass.js.map +1 -0
- package/dist/hooks/useGtm.d.ts +38 -0
- package/dist/hooks/useGtm.d.ts.map +1 -0
- package/dist/hooks/useHook.d.ts +24 -0
- package/dist/hooks/useHook.d.ts.map +1 -0
- package/dist/hooks/useHook.js +5 -0
- package/dist/hooks/useHook.js.map +1 -0
- package/dist/hooks/useIsClient.d.ts +7 -0
- package/dist/hooks/useIsClient.d.ts.map +1 -0
- package/dist/hooks/useMoney.d.ts +26 -0
- package/dist/hooks/useMoney.d.ts.map +1 -0
- package/dist/hooks/useMoney.js +39 -0
- package/dist/hooks/useMoney.js.map +1 -0
- package/dist/hooks/useNumber.d.ts +24 -0
- package/dist/hooks/useNumber.d.ts.map +1 -0
- package/dist/hooks/useOpeningHours.d.ts +28 -0
- package/dist/hooks/useOpeningHours.d.ts.map +1 -0
- package/dist/hooks/usePageConfig.d.ts +44 -0
- package/dist/hooks/usePageConfig.d.ts.map +1 -0
- package/dist/hooks/useProduct.d.ts +47 -0
- package/dist/hooks/useProduct.d.ts.map +1 -0
- package/dist/hooks/useProduct.js +4 -0
- package/dist/hooks/useProduct.js.map +1 -0
- package/dist/hooks/useStore.d.ts +36 -0
- package/dist/hooks/useStore.d.ts.map +1 -0
- package/dist/hooks/useStore.js +39 -0
- package/dist/hooks/useStore.js.map +1 -0
- package/dist/hooks/useTheme.d.ts +41 -0
- package/dist/hooks/useTheme.d.ts.map +1 -0
- package/dist/hooks/useTheme.js +5 -0
- package/dist/hooks/useTheme.js.map +1 -0
- package/dist/hooks/useUser.d.ts +8 -0
- package/dist/hooks/useUser.d.ts.map +1 -0
- package/dist/hooks/useUser.js +9 -0
- package/dist/hooks/useUser.js.map +1 -0
- package/dist/hooks/useWishlist.d.ts +5 -0
- package/dist/hooks/useWishlist.d.ts.map +1 -0
- package/dist/hooks/useWishlist.js +5 -0
- package/dist/hooks/useWishlist.js.map +1 -0
- package/dist/i18n.d.ts +1 -0
- package/dist/i18n.js +5 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +83 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/analytics/gtm.d.ts +38 -0
- package/dist/lib/analytics/gtm.d.ts.map +1 -0
- package/dist/lib/services/index.d.ts +1 -0
- package/dist/lib/services/index.d.ts.map +1 -0
- package/dist/navigation-N4H65RUN.js +17 -0
- package/dist/navigation-N4H65RUN.js.map +1 -0
- package/dist/navigation-YCYHW4MK.js +10 -0
- package/dist/navigation-YCYHW4MK.js.map +1 -0
- package/dist/nextjs/document-class.d.ts +92 -0
- package/dist/nextjs/document-class.d.ts.map +1 -0
- package/dist/nextjs/head.d.ts +36 -0
- package/dist/nextjs/head.d.ts.map +1 -0
- package/dist/nextjs/index.d.ts +29 -0
- package/dist/nextjs/index.d.ts.map +1 -0
- package/dist/nextjs/link.d.ts +14 -0
- package/dist/nextjs/link.d.ts.map +1 -0
- package/dist/nextjs/navigation.d.ts +9 -0
- package/dist/nextjs/navigation.d.ts.map +1 -0
- package/dist/nextjs/router.d.ts +15 -0
- package/dist/nextjs/router.d.ts.map +1 -0
- package/dist/nextjs.d.ts +1 -0
- package/dist/nextjs.js +22 -0
- package/dist/nextjs.js.map +1 -0
- package/dist/not-found-BJ3VK5VJ.js +69 -0
- package/dist/not-found-BJ3VK5VJ.js.map +1 -0
- package/dist/providers/DocumentClassProvider.d.ts +56 -0
- package/dist/providers/DocumentClassProvider.d.ts.map +1 -0
- package/dist/providers/DocumentSyncRegistry.d.ts +20 -0
- package/dist/providers/DocumentSyncRegistry.d.ts.map +1 -0
- package/dist/providers/LinkProvider.d.ts +34 -0
- package/dist/providers/LinkProvider.d.ts.map +1 -0
- package/dist/providers/NavigationProvider.d.ts +223 -0
- package/dist/providers/NavigationProvider.d.ts.map +1 -0
- package/dist/providers/TwilightProvider.d.ts +7 -0
- package/dist/providers/TwilightProvider.d.ts.map +1 -0
- package/dist/providers/i18n-factory.d.ts +17 -0
- package/dist/providers/i18n-factory.d.ts.map +1 -0
- package/dist/providers/i18n.d.ts +31 -0
- package/dist/providers/i18n.d.ts.map +1 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/locale-constants.d.ts +17 -0
- package/dist/providers/locale-constants.d.ts.map +1 -0
- package/dist/providers/salla-sdk.types.d.ts +352 -0
- package/dist/providers/salla-sdk.types.d.ts.map +1 -0
- package/dist/providers/twilight-context.d.ts +4 -0
- package/dist/providers/twilight-context.d.ts.map +1 -0
- package/dist/providers/twilight-init.d.ts +24 -0
- package/dist/providers/twilight-init.d.ts.map +1 -0
- package/dist/providers/twilight-theme.d.ts +9 -0
- package/dist/providers/twilight-theme.d.ts.map +1 -0
- package/dist/providers/twilight.types.d.ts +95 -0
- package/dist/providers/twilight.types.d.ts.map +1 -0
- package/dist/router/context.d.ts +3 -0
- package/dist/router/context.d.ts.map +1 -0
- package/dist/router/index.d.ts +4 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/route-ids.d.ts +37 -0
- package/dist/router/route-ids.d.ts.map +1 -0
- package/dist/routes/account/index.d.ts +8 -0
- package/dist/routes/account/index.d.ts.map +1 -0
- package/dist/routes/account/notifications/NotificationsPage.d.ts +3 -0
- package/dist/routes/account/notifications/NotificationsPage.d.ts.map +1 -0
- package/dist/routes/account/notifications/index.d.ts +17 -0
- package/dist/routes/account/notifications/index.d.ts.map +1 -0
- package/dist/routes/account/notifications/loader.d.ts +5 -0
- package/dist/routes/account/notifications/loader.d.ts.map +1 -0
- package/dist/routes/account/notifications/types.d.ts +17 -0
- package/dist/routes/account/notifications/types.d.ts.map +1 -0
- package/dist/routes/account/orders/OrderSinglePage.d.ts +3 -0
- package/dist/routes/account/orders/OrderSinglePage.d.ts.map +1 -0
- package/dist/routes/account/orders/OrdersPage.d.ts +3 -0
- package/dist/routes/account/orders/OrdersPage.d.ts.map +1 -0
- package/dist/routes/account/orders/index.d.ts +35 -0
- package/dist/routes/account/orders/index.d.ts.map +1 -0
- package/dist/routes/account/orders/loader.d.ts +11 -0
- package/dist/routes/account/orders/loader.d.ts.map +1 -0
- package/dist/routes/account/orders/types.d.ts +22 -0
- package/dist/routes/account/orders/types.d.ts.map +1 -0
- package/dist/routes/account/orders.d.ts +1 -0
- package/dist/routes/account/orders.js +42 -0
- package/dist/routes/account/orders.js.map +1 -0
- package/dist/routes/account/profile/ProfilePage.d.ts +3 -0
- package/dist/routes/account/profile/ProfilePage.d.ts.map +1 -0
- package/dist/routes/account/profile/index.d.ts +17 -0
- package/dist/routes/account/profile/index.d.ts.map +1 -0
- package/dist/routes/account/profile/loader.d.ts +5 -0
- package/dist/routes/account/profile/loader.d.ts.map +1 -0
- package/dist/routes/account/profile/types.d.ts +5 -0
- package/dist/routes/account/profile/types.d.ts.map +1 -0
- package/dist/routes/account/settings/SettingsPage.d.ts +3 -0
- package/dist/routes/account/settings/SettingsPage.d.ts.map +1 -0
- package/dist/routes/account/settings/index.d.ts +17 -0
- package/dist/routes/account/settings/index.d.ts.map +1 -0
- package/dist/routes/account/settings/loader.d.ts +5 -0
- package/dist/routes/account/settings/loader.d.ts.map +1 -0
- package/dist/routes/account/settings/types.d.ts +5 -0
- package/dist/routes/account/settings/types.d.ts.map +1 -0
- package/dist/routes/account/types.d.ts +300 -0
- package/dist/routes/account/types.d.ts.map +1 -0
- package/dist/routes/account/wallet/WalletPage.d.ts +3 -0
- package/dist/routes/account/wallet/WalletPage.d.ts.map +1 -0
- package/dist/routes/account/wallet/index.d.ts +16 -0
- package/dist/routes/account/wallet/index.d.ts.map +1 -0
- package/dist/routes/account/wallet/loader.d.ts +4 -0
- package/dist/routes/account/wallet/loader.d.ts.map +1 -0
- package/dist/routes/account/wallet/types.d.ts +11 -0
- package/dist/routes/account/wallet/types.d.ts.map +1 -0
- package/dist/routes/account/wishlist/WishlistPage.d.ts +3 -0
- package/dist/routes/account/wishlist/WishlistPage.d.ts.map +1 -0
- package/dist/routes/account/wishlist/index.d.ts +16 -0
- package/dist/routes/account/wishlist/index.d.ts.map +1 -0
- package/dist/routes/account/wishlist/loader.d.ts +4 -0
- package/dist/routes/account/wishlist/loader.d.ts.map +1 -0
- package/dist/routes/account/wishlist/types.d.ts +9 -0
- package/dist/routes/account/wishlist/types.d.ts.map +1 -0
- package/dist/routes/account.d.ts +1 -0
- package/dist/routes/account.js +253 -0
- package/dist/routes/account.js.map +1 -0
- package/dist/routes/blog/BlogAuthorPage.d.ts +3 -0
- package/dist/routes/blog/BlogAuthorPage.d.ts.map +1 -0
- package/dist/routes/blog/BlogCategoryPage.d.ts +3 -0
- package/dist/routes/blog/BlogCategoryPage.d.ts.map +1 -0
- package/dist/routes/blog/BlogPage.d.ts +3 -0
- package/dist/routes/blog/BlogPage.d.ts.map +1 -0
- package/dist/routes/blog/BlogSinglePage.d.ts +3 -0
- package/dist/routes/blog/BlogSinglePage.d.ts.map +1 -0
- package/dist/routes/blog/BlogTagPage.d.ts +3 -0
- package/dist/routes/blog/BlogTagPage.d.ts.map +1 -0
- package/dist/routes/blog/components.d.ts +14 -0
- package/dist/routes/blog/components.d.ts.map +1 -0
- package/dist/routes/blog/index.d.ts +76 -0
- package/dist/routes/blog/index.d.ts.map +1 -0
- package/dist/routes/blog/loader.d.ts +16 -0
- package/dist/routes/blog/loader.d.ts.map +1 -0
- package/dist/routes/blog/types.d.ts +92 -0
- package/dist/routes/blog/types.d.ts.map +1 -0
- package/dist/routes/blog.d.ts +1 -0
- package/dist/routes/blog.js +303 -0
- package/dist/routes/blog.js.map +1 -0
- package/dist/routes/brands/BrandsPage.d.ts +5 -0
- package/dist/routes/brands/BrandsPage.d.ts.map +1 -0
- package/dist/routes/brands/index.d.ts +20 -0
- package/dist/routes/brands/index.d.ts.map +1 -0
- package/dist/routes/brands/loader.d.ts +3 -0
- package/dist/routes/brands/loader.d.ts.map +1 -0
- package/dist/routes/brands/types.d.ts +32 -0
- package/dist/routes/brands/types.d.ts.map +1 -0
- package/dist/routes/brands.d.ts +1 -0
- package/dist/routes/brands.js +92 -0
- package/dist/routes/brands.js.map +1 -0
- package/dist/routes/cart/CartPage.d.ts +3 -0
- package/dist/routes/cart/CartPage.d.ts.map +1 -0
- package/dist/routes/cart/index.d.ts +20 -0
- package/dist/routes/cart/index.d.ts.map +1 -0
- package/dist/routes/cart/loader.d.ts +8 -0
- package/dist/routes/cart/loader.d.ts.map +1 -0
- package/dist/routes/cart/types.d.ts +6 -0
- package/dist/routes/cart/types.d.ts.map +1 -0
- package/dist/routes/cart.d.ts +1 -0
- package/dist/routes/cart.js +168 -0
- package/dist/routes/cart.js.map +1 -0
- package/dist/routes/home/HomePage.d.ts +5 -0
- package/dist/routes/home/HomePage.d.ts.map +1 -0
- package/dist/routes/home/index.d.ts +22 -0
- package/dist/routes/home/index.d.ts.map +1 -0
- package/dist/routes/home/loader.d.ts +12 -0
- package/dist/routes/home/loader.d.ts.map +1 -0
- package/dist/routes/home/types.d.ts +10 -0
- package/dist/routes/home/types.d.ts.map +1 -0
- package/dist/routes/home.d.ts +1 -0
- package/dist/routes/home.js +46 -0
- package/dist/routes/home.js.map +1 -0
- package/dist/routes/index.d.ts +20 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +40 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/lazy.d.ts +23 -0
- package/dist/routes/lazy.d.ts.map +1 -0
- package/dist/routes/loyalty/LoyaltyPage.d.ts +3 -0
- package/dist/routes/loyalty/LoyaltyPage.d.ts.map +1 -0
- package/dist/routes/loyalty/index.d.ts +19 -0
- package/dist/routes/loyalty/index.d.ts.map +1 -0
- package/dist/routes/loyalty/loader.d.ts +3 -0
- package/dist/routes/loyalty/loader.d.ts.map +1 -0
- package/dist/routes/loyalty/types.d.ts +96 -0
- package/dist/routes/loyalty/types.d.ts.map +1 -0
- package/dist/routes/loyalty.d.ts +1 -0
- package/dist/routes/loyalty.js +73 -0
- package/dist/routes/loyalty.js.map +1 -0
- package/dist/routes/not-found.d.ts +15 -0
- package/dist/routes/not-found.d.ts.map +1 -0
- package/dist/routes/page/PageSingle.d.ts +3 -0
- package/dist/routes/page/PageSingle.d.ts.map +1 -0
- package/dist/routes/page/index.d.ts +21 -0
- package/dist/routes/page/index.d.ts.map +1 -0
- package/dist/routes/page/loader.d.ts +6 -0
- package/dist/routes/page/loader.d.ts.map +1 -0
- package/dist/routes/page/types.d.ts +32 -0
- package/dist/routes/page/types.d.ts.map +1 -0
- package/dist/routes/page.d.ts +1 -0
- package/dist/routes/page.js +97 -0
- package/dist/routes/page.js.map +1 -0
- package/dist/routes/product/ProductPage.d.ts +3 -0
- package/dist/routes/product/ProductPage.d.ts.map +1 -0
- package/dist/routes/product/index.d.ts +21 -0
- package/dist/routes/product/index.d.ts.map +1 -0
- package/dist/routes/product/loader.d.ts +6 -0
- package/dist/routes/product/loader.d.ts.map +1 -0
- package/dist/routes/product/types.d.ts +6 -0
- package/dist/routes/product/types.d.ts.map +1 -0
- package/dist/routes/product-listing/ProductListPage.d.ts +13 -0
- package/dist/routes/product-listing/ProductListPage.d.ts.map +1 -0
- package/dist/routes/product-listing/index.d.ts +16 -0
- package/dist/routes/product-listing/index.d.ts.map +1 -0
- package/dist/routes/product-listing/loader.d.ts +3 -0
- package/dist/routes/product-listing/loader.d.ts.map +1 -0
- package/dist/routes/product-listing/types.d.ts +71 -0
- package/dist/routes/product-listing/types.d.ts.map +1 -0
- package/dist/routes/product-listing.d.ts +1 -0
- package/dist/routes/product-listing.js +516 -0
- package/dist/routes/product-listing.js.map +1 -0
- package/dist/routes/product.d.ts +1 -0
- package/dist/routes/product.js +225 -0
- package/dist/routes/product.js.map +1 -0
- package/dist/routes/root/beforeLoad.d.ts +21 -0
- package/dist/routes/root/beforeLoad.d.ts.map +1 -0
- package/dist/routes/root/head.d.ts +5 -0
- package/dist/routes/root/head.d.ts.map +1 -0
- package/dist/routes/root/index.d.ts +3 -0
- package/dist/routes/root/index.d.ts.map +1 -0
- package/dist/routes/seo-redirects.d.ts +19 -0
- package/dist/routes/seo-redirects.d.ts.map +1 -0
- package/dist/routes/seo-redirects.js +40 -0
- package/dist/routes/seo-redirects.js.map +1 -0
- package/dist/routes/testimonials/TestimonialsPage.d.ts +3 -0
- package/dist/routes/testimonials/TestimonialsPage.d.ts.map +1 -0
- package/dist/routes/testimonials/index.d.ts +19 -0
- package/dist/routes/testimonials/index.d.ts.map +1 -0
- package/dist/routes/testimonials/loader.d.ts +5 -0
- package/dist/routes/testimonials/loader.d.ts.map +1 -0
- package/dist/routes/testimonials/types.d.ts +5 -0
- package/dist/routes/testimonials/types.d.ts.map +1 -0
- package/dist/routes/testimonials.d.ts +1 -0
- package/dist/routes/testimonials.js +49 -0
- package/dist/routes/testimonials.js.map +1 -0
- package/dist/routes/thank-you/ThankYouPage.d.ts +3 -0
- package/dist/routes/thank-you/ThankYouPage.d.ts.map +1 -0
- package/dist/routes/thank-you/index.d.ts +20 -0
- package/dist/routes/thank-you/index.d.ts.map +1 -0
- package/dist/routes/thank-you/loader.d.ts +5 -0
- package/dist/routes/thank-you/loader.d.ts.map +1 -0
- package/dist/routes/thank-you/types.d.ts +14 -0
- package/dist/routes/thank-you/types.d.ts.map +1 -0
- package/dist/routes/thank-you.d.ts +1 -0
- package/dist/routes/thank-you.js +95 -0
- package/dist/routes/thank-you.js.map +1 -0
- package/dist/routes/types.d.ts +36 -0
- package/dist/routes/types.d.ts.map +1 -0
- package/dist/sentry/client.d.ts +6 -0
- package/dist/sentry/client.d.ts.map +1 -0
- package/dist/sentry/client.js +17 -0
- package/dist/sentry/client.js.map +1 -0
- package/dist/sentry/server.d.ts +10 -0
- package/dist/sentry/server.d.ts.map +1 -0
- package/dist/sentry/server.js +16 -0
- package/dist/sentry/server.js.map +1 -0
- package/dist/skeleton.d.ts +4 -0
- package/dist/skeleton.d.ts.map +1 -0
- package/dist/skeleton.js +47 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/tanstack/document-class.d.ts +44 -0
- package/dist/tanstack/document-class.d.ts.map +1 -0
- package/dist/tanstack/head.d.ts +24 -0
- package/dist/tanstack/head.d.ts.map +1 -0
- package/dist/tanstack/index.d.ts +28 -0
- package/dist/tanstack/index.d.ts.map +1 -0
- package/dist/tanstack/link.d.ts +18 -0
- package/dist/tanstack/link.d.ts.map +1 -0
- package/dist/tanstack/middleware/earlyHints.d.ts +3 -0
- package/dist/tanstack/middleware/earlyHints.d.ts.map +1 -0
- package/dist/tanstack/middleware/twilight.d.ts +7 -0
- package/dist/tanstack/middleware/twilight.d.ts.map +1 -0
- package/dist/tanstack/navigation.d.ts +13 -0
- package/dist/tanstack/navigation.d.ts.map +1 -0
- package/dist/tanstack/router.d.ts +85 -0
- package/dist/tanstack/router.d.ts.map +1 -0
- package/dist/tanstack/templates/account-layout.d.ts +8 -0
- package/dist/tanstack/templates/account-layout.d.ts.map +1 -0
- package/dist/tanstack/templates/index.d.ts +4 -0
- package/dist/tanstack/templates/index.d.ts.map +1 -0
- package/dist/tanstack/templates/locale-wrapper.d.ts +15 -0
- package/dist/tanstack/templates/locale-wrapper.d.ts.map +1 -0
- package/dist/tanstack/templates/redirect.d.ts +6 -0
- package/dist/tanstack/templates/redirect.d.ts.map +1 -0
- package/dist/tanstack.d.ts +1 -0
- package/dist/tanstack.js +137 -0
- package/dist/tanstack.js.map +1 -0
- package/dist/twilight/context.d.ts +46 -0
- package/dist/twilight/context.d.ts.map +1 -0
- package/dist/twilight/index.d.ts +3 -0
- package/dist/twilight/index.d.ts.map +1 -0
- package/dist/types/hooks.d.ts +58 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/index.d.ts +724 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/apply-theme.d.ts +3 -0
- package/dist/utils/apply-theme.d.ts.map +1 -0
- package/dist/utils/asset.d.ts +27 -0
- package/dist/utils/asset.d.ts.map +1 -0
- package/dist/utils/baseHead.d.ts +23 -0
- package/dist/utils/baseHead.d.ts.map +1 -0
- package/dist/utils/baseHead.js +5 -0
- package/dist/utils/baseHead.js.map +1 -0
- package/dist/utils/breadcrumb.d.ts +5 -0
- package/dist/utils/breadcrumb.d.ts.map +1 -0
- package/dist/utils/cdn-image.d.ts +5 -0
- package/dist/utils/cdn-image.d.ts.map +1 -0
- package/dist/utils/color.d.ts +34 -0
- package/dist/utils/color.d.ts.map +1 -0
- package/dist/utils/cookies.d.ts +16 -0
- package/dist/utils/cookies.d.ts.map +1 -0
- package/dist/utils/device.d.ts +19 -0
- package/dist/utils/device.d.ts.map +1 -0
- package/dist/utils/document-class.d.ts +67 -0
- package/dist/utils/document-class.d.ts.map +1 -0
- package/dist/utils/errors.d.ts +4 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/head.d.ts +100 -0
- package/dist/utils/head.d.ts.map +1 -0
- package/dist/utils/head.js +4 -0
- package/dist/utils/head.js.map +1 -0
- package/dist/utils/index.d.ts +22 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +15 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/number.d.ts +21 -0
- package/dist/utils/number.d.ts.map +1 -0
- package/dist/utils/salla-plural.d.ts +14 -0
- package/dist/utils/salla-plural.d.ts.map +1 -0
- package/dist/utils/sanitize.d.ts +2 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sdk-events.d.ts +25 -0
- package/dist/utils/sdk-events.d.ts.map +1 -0
- package/dist/utils/sdk-helpers.d.ts +30 -0
- package/dist/utils/sdk-helpers.d.ts.map +1 -0
- package/dist/utils/sort-options.d.ts +8 -0
- package/dist/utils/sort-options.d.ts.map +1 -0
- package/dist/vite/adapters/index.d.ts +18 -0
- package/dist/vite/adapters/index.d.ts.map +1 -0
- package/dist/vite/adapters/nextjs.adapter.d.ts +12 -0
- package/dist/vite/adapters/nextjs.adapter.d.ts.map +1 -0
- package/dist/vite/adapters/tanstack.adapter.d.ts +71 -0
- package/dist/vite/adapters/tanstack.adapter.d.ts.map +1 -0
- package/dist/vite/index.d.ts +6 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +2193 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/plugins/best-practices/best-practices.plugin.d.ts +4 -0
- package/dist/vite/plugins/best-practices/best-practices.plugin.d.ts.map +1 -0
- package/dist/vite/plugins/best-practices/hooks-registry.d.ts +27 -0
- package/dist/vite/plugins/best-practices/hooks-registry.d.ts.map +1 -0
- package/dist/vite/plugins/best-practices/reporter.d.ts +4 -0
- package/dist/vite/plugins/best-practices/reporter.d.ts.map +1 -0
- package/dist/vite/plugins/best-practices/rules/index.d.ts +4 -0
- package/dist/vite/plugins/best-practices/rules/index.d.ts.map +1 -0
- package/dist/vite/plugins/best-practices/rules/no-deep-component-import.d.ts +3 -0
- package/dist/vite/plugins/best-practices/rules/no-deep-component-import.d.ts.map +1 -0
- package/dist/vite/plugins/best-practices/rules/no-direct-product-card-import.d.ts +3 -0
- package/dist/vite/plugins/best-practices/rules/no-direct-product-card-import.d.ts.map +1 -0
- package/dist/vite/plugins/best-practices/rules/no-img-without-dimensions.d.ts +3 -0
- package/dist/vite/plugins/best-practices/rules/no-img-without-dimensions.d.ts.map +1 -0
- package/dist/vite/plugins/best-practices/rules/no-manual-dom.d.ts +3 -0
- package/dist/vite/plugins/best-practices/rules/no-manual-dom.d.ts.map +1 -0
- package/dist/vite/plugins/best-practices/rules/no-window-location-reload.d.ts +3 -0
- package/dist/vite/plugins/best-practices/rules/no-window-location-reload.d.ts.map +1 -0
- package/dist/vite/plugins/best-practices/rules/require-page-hooks.d.ts +16 -0
- package/dist/vite/plugins/best-practices/rules/require-page-hooks.d.ts.map +1 -0
- package/dist/vite/plugins/best-practices/types.d.ts +34 -0
- package/dist/vite/plugins/best-practices/types.d.ts.map +1 -0
- package/dist/vite/plugins/package-aliases.plugin.d.ts +3 -0
- package/dist/vite/plugins/package-aliases.plugin.d.ts.map +1 -0
- package/dist/vite/plugins/salla-hydration.plugin.d.ts +12 -0
- package/dist/vite/plugins/salla-hydration.plugin.d.ts.map +1 -0
- package/dist/vite/plugins/theme-translations.plugin.d.ts +20 -0
- package/dist/vite/plugins/theme-translations.plugin.d.ts.map +1 -0
- package/dist/vite/twilight-react.d.ts +22 -0
- package/dist/vite/twilight-react.d.ts.map +1 -0
- package/dist/vite/types.d.ts +110 -0
- package/dist/vite/types.d.ts.map +1 -0
- package/package.json +474 -0
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import { registry } from './chunk-G7ALL4BC.js';
|
|
2
|
+
import { useMoney, useNumber } from './chunk-GLM3RPCP.js';
|
|
3
|
+
import { useAsset } from './chunk-Z653O7MX.js';
|
|
4
|
+
import { useWishlist } from './chunk-GBWCXUPD.js';
|
|
5
|
+
import { useTranslation } from './chunk-VVRYP6IL.js';
|
|
6
|
+
import { Image } from './chunk-2KF5JJU6.js';
|
|
7
|
+
import { LazyImageModal } from './chunk-3DCZJDDK.js';
|
|
8
|
+
import { useTwilight } from './chunk-BWFBVXT3.js';
|
|
9
|
+
import { lazy, memo, useCallback, useMemo, useState, useEffect, Suspense } from 'react';
|
|
10
|
+
import { SallaAddProductButton } from '@salla.sa/twilight-components-react/add-product-button';
|
|
11
|
+
import { SallaButton } from '@salla.sa/twilight-components-react/button';
|
|
12
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
13
|
+
import { SallaSlider } from '@salla.sa/twilight-components-react/slider';
|
|
14
|
+
|
|
15
|
+
var LazyProductDetails = lazy(
|
|
16
|
+
() => import('./ProductDetails-KTY4ZSFM.js').then((m) => ({ default: m.ProductDetails }))
|
|
17
|
+
);
|
|
18
|
+
var LazyAddToCartForm = lazy(
|
|
19
|
+
() => import('./AddToCartForm-HOWNKCKX.js').then((m) => ({ default: m.AddToCartForm }))
|
|
20
|
+
);
|
|
21
|
+
var PRODUCT_CARD_KEY = "product:card";
|
|
22
|
+
var ProductCardContent = memo(function ProductCardContent2({
|
|
23
|
+
product,
|
|
24
|
+
layout = "vertical",
|
|
25
|
+
className = "",
|
|
26
|
+
withShadow = false,
|
|
27
|
+
withQuantity = false,
|
|
28
|
+
withoutAddButton = false,
|
|
29
|
+
index = 0,
|
|
30
|
+
imagePriority = false
|
|
31
|
+
}) {
|
|
32
|
+
const { format } = useMoney();
|
|
33
|
+
const { t } = useTranslation();
|
|
34
|
+
const { store } = useTwilight();
|
|
35
|
+
const wishlist = useWishlist();
|
|
36
|
+
const { isPlaceholder } = useAsset();
|
|
37
|
+
const { format: formatNumber } = useNumber();
|
|
38
|
+
const isVertical = layout === "vertical";
|
|
39
|
+
const isHorizontal = layout === "horizontal";
|
|
40
|
+
const isFullImage = layout === "fullImage";
|
|
41
|
+
const isMinimal = layout === "minimal";
|
|
42
|
+
const isSpecial = layout === "special";
|
|
43
|
+
const productInWishlist = wishlist.has(product.id);
|
|
44
|
+
const handleWishlistToggle = useCallback(() => {
|
|
45
|
+
wishlist.toggle(product.id);
|
|
46
|
+
}, [wishlist, product.id]);
|
|
47
|
+
const fitImageHeight = store?.settings?.product?.fit_type;
|
|
48
|
+
const getProductBadge = () => {
|
|
49
|
+
if (product?.preorder?.label && typeof product.preorder.label === "string") {
|
|
50
|
+
return /* @__PURE__ */ jsx("div", { className: "s-product-card-promotion-title", children: product.preorder.label });
|
|
51
|
+
}
|
|
52
|
+
if (product.promotion_title) {
|
|
53
|
+
return /* @__PURE__ */ jsx("div", { className: "s-product-card-promotion-title", children: product.promotion_title });
|
|
54
|
+
}
|
|
55
|
+
if (withQuantity && product?.quantity) {
|
|
56
|
+
const formattedQty = formatNumber(product.quantity);
|
|
57
|
+
return /* @__PURE__ */ jsxs("div", { className: "s-product-card-quantity", children: [
|
|
58
|
+
t("pages.products.remained", "Remained"),
|
|
59
|
+
" ",
|
|
60
|
+
formattedQty
|
|
61
|
+
] });
|
|
62
|
+
}
|
|
63
|
+
if (withQuantity && product?.is_out_of_stock) {
|
|
64
|
+
return /* @__PURE__ */ jsx("div", { className: "s-product-card-out-badge", children: t("pages.products.out_of_stock", "Out of Stock") });
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
};
|
|
68
|
+
const getProductPrice = () => {
|
|
69
|
+
if (product.is_on_sale && product.sale_price) {
|
|
70
|
+
return /* @__PURE__ */ jsxs("div", { className: "s-product-card-sale-price", children: [
|
|
71
|
+
/* @__PURE__ */ jsx("h4", { children: format(product.sale_price) }),
|
|
72
|
+
product.regular_price && /* @__PURE__ */ jsx("span", { children: format(product.regular_price) })
|
|
73
|
+
] });
|
|
74
|
+
}
|
|
75
|
+
if (product.starting_price) {
|
|
76
|
+
return /* @__PURE__ */ jsxs("div", { className: "s-product-card-starting-price", children: [
|
|
77
|
+
/* @__PURE__ */ jsx("p", { children: t("pages.products.starting_price", "Starting from") }),
|
|
78
|
+
/* @__PURE__ */ jsx("h4", { children: format(product.starting_price) })
|
|
79
|
+
] });
|
|
80
|
+
}
|
|
81
|
+
return /* @__PURE__ */ jsx("h4", { className: "s-product-card-price", children: format(product.price) });
|
|
82
|
+
};
|
|
83
|
+
const cardClassName = [
|
|
84
|
+
"s-product-card",
|
|
85
|
+
"s-product-card-entry",
|
|
86
|
+
isVertical ? "s-product-card-vertical" : "",
|
|
87
|
+
isHorizontal ? "s-product-card-horizontal" : "",
|
|
88
|
+
fitImageHeight && isVertical ? `s-product-card-fit-height` : "",
|
|
89
|
+
isSpecial ? "s-product-card-special" : "",
|
|
90
|
+
isFullImage ? "s-product-card-full-image" : "",
|
|
91
|
+
isMinimal ? "s-product-card-minimal" : "",
|
|
92
|
+
product?.donation ? "s-product-card-donation" : "",
|
|
93
|
+
withShadow ? "s-product-card-shadow" : "",
|
|
94
|
+
product?.is_out_of_stock ? "s-product-card-out-of-stock" : "",
|
|
95
|
+
className
|
|
96
|
+
].filter(Boolean).join(" ");
|
|
97
|
+
const isProductPlaceholder = isPlaceholder(product.image?.url);
|
|
98
|
+
const imageFitClass = isProductPlaceholder ? "contain" : fitImageHeight || "cover";
|
|
99
|
+
return /* @__PURE__ */ jsxs(
|
|
100
|
+
"div",
|
|
101
|
+
{
|
|
102
|
+
id: `product-card-${product.id}`,
|
|
103
|
+
className: cardClassName,
|
|
104
|
+
"data-product-id": product.id,
|
|
105
|
+
style: {
|
|
106
|
+
animationDelay: `${index * 100}ms`
|
|
107
|
+
},
|
|
108
|
+
children: [
|
|
109
|
+
/* @__PURE__ */ jsxs("div", { className: isFullImage ? "s-product-card-image-full" : "s-product-card-image", children: [
|
|
110
|
+
/* @__PURE__ */ jsxs("a", { href: product.url, "aria-label": product.image?.alt || product.name, children: [
|
|
111
|
+
/* @__PURE__ */ jsx(
|
|
112
|
+
Image,
|
|
113
|
+
{
|
|
114
|
+
className: `s-product-card-image-${imageFitClass}`,
|
|
115
|
+
src: product.image?.url,
|
|
116
|
+
alt: product.image?.alt ?? product.name,
|
|
117
|
+
width: 300,
|
|
118
|
+
height: 300,
|
|
119
|
+
aspectRatio: "1/1",
|
|
120
|
+
priority: imagePriority
|
|
121
|
+
}
|
|
122
|
+
),
|
|
123
|
+
!isFullImage && !isMinimal && getProductBadge()
|
|
124
|
+
] }),
|
|
125
|
+
isFullImage && /* @__PURE__ */ jsx("a", { href: product.url, "aria-label": product.name, className: "s-product-card-overlay" }),
|
|
126
|
+
!isHorizontal && !isFullImage && /* @__PURE__ */ jsx(
|
|
127
|
+
SallaButton,
|
|
128
|
+
{
|
|
129
|
+
shape: "icon",
|
|
130
|
+
fill: "outline",
|
|
131
|
+
color: "light",
|
|
132
|
+
ariaLabel: t("pages.wishlist.toggle", "Add or remove to wishlist"),
|
|
133
|
+
className: `s-product-card-wishlist-btn animated ${productInWishlist ? "s-product-card-wishlist-added pulse-anime" : "not-added un-favorited"}`,
|
|
134
|
+
onClick: handleWishlistToggle,
|
|
135
|
+
"data-id": product.id,
|
|
136
|
+
children: /* @__PURE__ */ jsx("i", { className: "sicon-heart" })
|
|
137
|
+
}
|
|
138
|
+
)
|
|
139
|
+
] }),
|
|
140
|
+
/* @__PURE__ */ jsxs("div", { className: "s-product-card-content", children: [
|
|
141
|
+
isSpecial && product?.quantity && /* @__PURE__ */ jsxs("div", { className: "s-product-card-content-pie", children: [
|
|
142
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
143
|
+
/* @__PURE__ */ jsx("b", { children: formatNumber(product.quantity) }),
|
|
144
|
+
t("pages.products.remained", "Remained")
|
|
145
|
+
] }),
|
|
146
|
+
/* @__PURE__ */ jsxs(
|
|
147
|
+
"svg",
|
|
148
|
+
{
|
|
149
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
150
|
+
viewBox: "-2 -1 36 34",
|
|
151
|
+
className: "s-product-card-content-pie-svg",
|
|
152
|
+
children: [
|
|
153
|
+
/* @__PURE__ */ jsx("circle", { cx: "16", cy: "16", r: "15.9155", className: "s-product-card-content-pie-svg-base" }),
|
|
154
|
+
/* @__PURE__ */ jsx("circle", { cx: "16", cy: "16", r: "15.9155", className: "s-product-card-content-pie-svg-bar" })
|
|
155
|
+
]
|
|
156
|
+
}
|
|
157
|
+
)
|
|
158
|
+
] }),
|
|
159
|
+
/* @__PURE__ */ jsxs(
|
|
160
|
+
"div",
|
|
161
|
+
{
|
|
162
|
+
className: `s-product-card-content-main ${isSpecial ? "s-product-card-content-extra-padding" : ""}`,
|
|
163
|
+
children: [
|
|
164
|
+
/* @__PURE__ */ jsx("h3", { className: "s-product-card-content-title", children: /* @__PURE__ */ jsx("a", { href: product.url, children: product.name }) }),
|
|
165
|
+
product.subtitle && !isMinimal && /* @__PURE__ */ jsx("p", { className: "s-product-card-content-subtitle opacity-80", children: product.subtitle })
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
),
|
|
169
|
+
/* @__PURE__ */ jsxs(
|
|
170
|
+
"div",
|
|
171
|
+
{
|
|
172
|
+
className: `s-product-card-content-sub ${isSpecial ? "s-product-card-content-extra-padding" : ""}`,
|
|
173
|
+
children: [
|
|
174
|
+
!product?.donation?.can_donate && getProductPrice(),
|
|
175
|
+
product.rating?.stars && /* @__PURE__ */ jsxs("div", { className: "s-product-card-rating", children: [
|
|
176
|
+
/* @__PURE__ */ jsx("i", { className: "sicon-star2 before:text-orange-300" }),
|
|
177
|
+
/* @__PURE__ */ jsx("span", { children: product.rating.stars })
|
|
178
|
+
] })
|
|
179
|
+
]
|
|
180
|
+
}
|
|
181
|
+
),
|
|
182
|
+
!withoutAddButton && /* @__PURE__ */ jsxs("div", { className: "s-product-card-content-footer gap-2", children: [
|
|
183
|
+
/* @__PURE__ */ jsx(
|
|
184
|
+
SallaAddProductButton,
|
|
185
|
+
{
|
|
186
|
+
fill: "outline",
|
|
187
|
+
width: "wide",
|
|
188
|
+
productId: product.id,
|
|
189
|
+
productStatus: product.status,
|
|
190
|
+
productType: product.type,
|
|
191
|
+
hasPreOrder: product.has_preorder_campaign
|
|
192
|
+
}
|
|
193
|
+
),
|
|
194
|
+
(isHorizontal || isFullImage) && /* @__PURE__ */ jsx(
|
|
195
|
+
SallaButton,
|
|
196
|
+
{
|
|
197
|
+
shape: "icon",
|
|
198
|
+
fill: "outline",
|
|
199
|
+
color: "light",
|
|
200
|
+
ariaLabel: t("pages.wishlist.toggle", "Add or remove to wishlist"),
|
|
201
|
+
className: `s-product-card-wishlist-btn animated ${productInWishlist ? "s-product-card-wishlist-added pulse-anime" : "not-added un-favorited"}`,
|
|
202
|
+
onClick: handleWishlistToggle,
|
|
203
|
+
"data-id": product.id,
|
|
204
|
+
children: /* @__PURE__ */ jsx("i", { className: "sicon-heart" })
|
|
205
|
+
}
|
|
206
|
+
)
|
|
207
|
+
] })
|
|
208
|
+
] })
|
|
209
|
+
]
|
|
210
|
+
}
|
|
211
|
+
);
|
|
212
|
+
});
|
|
213
|
+
var ProductCard = memo(function ProductCard2(props) {
|
|
214
|
+
const Component = useMemo(() => {
|
|
215
|
+
const hasOverride = registry.getOriginal(PRODUCT_CARD_KEY) !== null;
|
|
216
|
+
if (hasOverride) {
|
|
217
|
+
return registry.resolve(PRODUCT_CARD_KEY);
|
|
218
|
+
}
|
|
219
|
+
return null;
|
|
220
|
+
}, []);
|
|
221
|
+
if (Component) {
|
|
222
|
+
return /* @__PURE__ */ jsx(Component, { ...props });
|
|
223
|
+
}
|
|
224
|
+
return /* @__PURE__ */ jsx(ProductCardContent, { ...props });
|
|
225
|
+
});
|
|
226
|
+
function ProductGallery({ product }) {
|
|
227
|
+
const { t } = useTranslation();
|
|
228
|
+
const { theme } = useTwilight();
|
|
229
|
+
const sliderId = `details-slider-${product.id}`;
|
|
230
|
+
const objectFit = theme.settings.slider_background_size ?? "cover";
|
|
231
|
+
const [preview, setPreview] = useState(null);
|
|
232
|
+
useEffect(() => {
|
|
233
|
+
const raf = requestAnimationFrame(() => {
|
|
234
|
+
const el = document.getElementById(sliderId);
|
|
235
|
+
if (!el?.parentElement) return;
|
|
236
|
+
const { parentElement, nextSibling } = el;
|
|
237
|
+
parentElement.removeChild(el);
|
|
238
|
+
parentElement.insertBefore(el, nextSibling);
|
|
239
|
+
});
|
|
240
|
+
return () => cancelAnimationFrame(raf);
|
|
241
|
+
}, [product.id, sliderId]);
|
|
242
|
+
const images = product.images && product.images.length > 0 ? product.images : product.image?.url ? [product.image] : [];
|
|
243
|
+
const hasManyImages = images.length > 1;
|
|
244
|
+
return /* @__PURE__ */ jsxs("div", { className: "sidebar md:sticky top-24 w-full md:!w-2/4 rtl:ml-8 ltr:mr-8 pb-8 md:pb-16 overflow-hidden shrink-0", children: [
|
|
245
|
+
/* @__PURE__ */ jsxs(
|
|
246
|
+
SallaSlider,
|
|
247
|
+
{
|
|
248
|
+
id: sliderId,
|
|
249
|
+
className: "details-slider rounded-md image-slider",
|
|
250
|
+
type: "thumbs",
|
|
251
|
+
loop: false,
|
|
252
|
+
autoHeight: true,
|
|
253
|
+
listenToThumbnailsOption: true,
|
|
254
|
+
showThumbsControls: false,
|
|
255
|
+
sliderConfig: { watchOverflow: true, autoHeight: true },
|
|
256
|
+
children: [
|
|
257
|
+
product.promotion_title && /* @__PURE__ */ jsx("div", { className: "promotion-title", children: product.promotion_title }),
|
|
258
|
+
product.calories && /* @__PURE__ */ jsxs("div", { className: "absolute z-[2] top-4 rtl:left-4 ltr:right-4 bg-white shadow-sm flex flex-col justify-center items-center rounded-full w-20 h-20 md:w-24 md:h-24", children: [
|
|
259
|
+
/* @__PURE__ */ jsx("span", { className: "text-red-500 text-xl leading-none font-bold", children: product.calories }),
|
|
260
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-gray-500", children: t("pages.products.calories", "Calories") })
|
|
261
|
+
] }),
|
|
262
|
+
/* @__PURE__ */ jsx("div", { slot: "items", children: images.map((image, index) => /* @__PURE__ */ jsx(
|
|
263
|
+
ImageSlide,
|
|
264
|
+
{
|
|
265
|
+
image,
|
|
266
|
+
product,
|
|
267
|
+
index,
|
|
268
|
+
objectFit,
|
|
269
|
+
onPreview: setPreview
|
|
270
|
+
},
|
|
271
|
+
image.id ?? index
|
|
272
|
+
)) }),
|
|
273
|
+
hasManyImages && /* @__PURE__ */ jsx("div", { slot: "thumbs", children: images.map((image, index) => /* @__PURE__ */ jsx(ThumbSlide, { image, index }, image.id ?? index)) })
|
|
274
|
+
]
|
|
275
|
+
}
|
|
276
|
+
),
|
|
277
|
+
/* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(
|
|
278
|
+
LazyImageModal,
|
|
279
|
+
{
|
|
280
|
+
isOpen: !!preview,
|
|
281
|
+
onClose: () => setPreview(null),
|
|
282
|
+
src: preview?.src ?? "",
|
|
283
|
+
alt: preview?.alt
|
|
284
|
+
}
|
|
285
|
+
) })
|
|
286
|
+
] });
|
|
287
|
+
}
|
|
288
|
+
function ImageSlide({
|
|
289
|
+
image,
|
|
290
|
+
product,
|
|
291
|
+
index,
|
|
292
|
+
objectFit,
|
|
293
|
+
onPreview
|
|
294
|
+
}) {
|
|
295
|
+
const [loaded, setLoaded] = useState(false);
|
|
296
|
+
const isVideo = Boolean(image.video_url);
|
|
297
|
+
if (image.three_d_image_url) {
|
|
298
|
+
return /* @__PURE__ */ jsx(
|
|
299
|
+
"model-viewer",
|
|
300
|
+
{
|
|
301
|
+
style: { minHeight: "500px" },
|
|
302
|
+
className: "swiper-slide model-entry w-full h-full",
|
|
303
|
+
loading: "lazy",
|
|
304
|
+
"camera-controls": true,
|
|
305
|
+
"touch-action": "pan-y",
|
|
306
|
+
"auto-rotate": true,
|
|
307
|
+
poster: image.url || void 0,
|
|
308
|
+
src: image.three_d_image_url,
|
|
309
|
+
"shadow-intensity": "1",
|
|
310
|
+
alt: image.alt
|
|
311
|
+
}
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
return /* @__PURE__ */ jsx(
|
|
315
|
+
"a",
|
|
316
|
+
{
|
|
317
|
+
"data-fslightbox": `product_${product.id}`,
|
|
318
|
+
"data-img-id": image.id,
|
|
319
|
+
"data-slid-index": index,
|
|
320
|
+
...image.video_url ? { "data-video-src": image.video_url } : {},
|
|
321
|
+
"data-caption": image.alt,
|
|
322
|
+
"data-infinite": "false",
|
|
323
|
+
"data-type": image.video_url ? "youtube" : "image",
|
|
324
|
+
href: image.video_url || image.url,
|
|
325
|
+
...isVideo ? { target: "_blank", rel: "noopener noreferrer" } : {},
|
|
326
|
+
onClick: (event) => {
|
|
327
|
+
if (isVideo || !image.url) return;
|
|
328
|
+
event.preventDefault();
|
|
329
|
+
onPreview({ src: image.url, alt: image.alt || product.name });
|
|
330
|
+
},
|
|
331
|
+
"aria-label": product.name,
|
|
332
|
+
className: `swiper-slide magnify-wrapper homeslider__slide ${image.video_url ? "video-entry" : ""}`,
|
|
333
|
+
children: /* @__PURE__ */ jsx("div", { className: `w-full ${loaded ? "" : "aspect-square bg-gray-100 animate-pulse"}`, children: /* @__PURE__ */ jsx(
|
|
334
|
+
Image,
|
|
335
|
+
{
|
|
336
|
+
id: String(image.id),
|
|
337
|
+
src: image.url,
|
|
338
|
+
alt: image.alt || product.name,
|
|
339
|
+
className: `h-full w-full object-${objectFit}`,
|
|
340
|
+
aspectRatio: "1/1",
|
|
341
|
+
priority: index === 0,
|
|
342
|
+
noWrapper: true,
|
|
343
|
+
onLoad: () => setLoaded(true)
|
|
344
|
+
}
|
|
345
|
+
) })
|
|
346
|
+
}
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
function ThumbSlide({ image, index }) {
|
|
350
|
+
return /* @__PURE__ */ jsx(
|
|
351
|
+
"div",
|
|
352
|
+
{
|
|
353
|
+
className: `slide--one-fourth ${image.video_url ? "video-entry" : ""} ${image.three_d_image_url ? "model-entry" : ""}`,
|
|
354
|
+
"data-caption": image.alt,
|
|
355
|
+
children: /* @__PURE__ */ jsx(
|
|
356
|
+
Image,
|
|
357
|
+
{
|
|
358
|
+
src: image.url,
|
|
359
|
+
alt: image.alt || "",
|
|
360
|
+
className: "object-cover w-full h-full bg-gray-100 rounded-md overflow-hidden",
|
|
361
|
+
title: image.alt,
|
|
362
|
+
priority: index < 5,
|
|
363
|
+
noWrapper: true
|
|
364
|
+
}
|
|
365
|
+
)
|
|
366
|
+
}
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
export { LazyAddToCartForm, LazyProductDetails, ProductCard, ProductGallery };
|
|
371
|
+
//# sourceMappingURL=chunk-RH32IGQD.js.map
|
|
372
|
+
//# sourceMappingURL=chunk-RH32IGQD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/product/lazy.ts","../src/components/product/ProductCard.tsx","../src/components/product/ProductGallery.tsx"],"names":["ProductCardContent","ProductCard","jsxs","jsx"],"mappings":"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","file":"chunk-RH32IGQD.js","sourcesContent":["import { lazy } from 'react';\n\nexport const LazyProductDetails = lazy(() =>\n import('./ProductDetails').then((m) => ({ default: m.ProductDetails }))\n);\n\nexport const LazyAddToCartForm = lazy(() =>\n import('./AddToCartForm').then((m) => ({ default: m.AddToCartForm }))\n);\n","import { memo, useCallback, useMemo } from 'react';\nimport { SallaAddProductButton } from '@salla.sa/twilight-components-react/add-product-button';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { useMoney } from '../../hooks/useMoney';\nimport { useTranslation } from '../../providers/i18n';\nimport { useTwilight } from '../../providers/TwilightProvider';\nimport { useWishlist } from '../../hooks/useWishlist';\nimport { useAsset } from '../../hooks/useAsset';\nimport { useNumber } from '../../hooks/useNumber';\nimport { registry } from '../ComponentRegistry';\nimport { Image } from '../common';\nimport type { Product } from '../../types';\n\nconst PRODUCT_CARD_KEY = 'product:card';\n\n/** Product card layout variants - mutually exclusive */\nexport type ProductCardLayout = 'vertical' | 'horizontal' | 'fullImage' | 'minimal' | 'special';\n\nexport interface ProductCardProps {\n product: Product;\n layout?: ProductCardLayout;\n className?: string;\n withShadow?: boolean;\n withQuantity?: boolean;\n withoutAddButton?: boolean;\n index?: number;\n imagePriority?: boolean;\n}\n\n/**\n * ProductCard - Displays a product in various layouts\n *\n * Layouts:\n * - vertical: Default card with image top, content bottom\n * - horizontal: Side-by-side image and content\n * - fullImage: Full bleed image with overlay content\n * - minimal: Compact version with reduced info\n * - special: Featured card with quantity pie chart\n *\n * Features:\n * - Native lazy loading for images\n * - Product badges (promotion, preorder, quantity, out of stock)\n * - Wishlist toggle button\n * - Price display (sale, starting, regular)\n * - Rating display\n * - Add to cart button via SallaAddProductButton (handles labels internally)\n */\nconst ProductCardContent = memo(function ProductCardContent({\n product,\n layout = 'vertical',\n className = '',\n withShadow = false,\n withQuantity = false,\n withoutAddButton = false,\n index = 0,\n imagePriority = false,\n}: ProductCardProps) {\n const { format } = useMoney();\n const { t } = useTranslation();\n const { store } = useTwilight();\n const wishlist = useWishlist();\n const { isPlaceholder } = useAsset();\n const { format: formatNumber } = useNumber();\n\n // Layout flags\n const isVertical = layout === 'vertical';\n const isHorizontal = layout === 'horizontal';\n const isFullImage = layout === 'fullImage';\n const isMinimal = layout === 'minimal';\n const isSpecial = layout === 'special';\n\n // Wishlist status\n const productInWishlist = wishlist.has(product.id);\n const handleWishlistToggle = useCallback(() => {\n wishlist.toggle(product.id);\n }, [wishlist, product.id]);\n\n // Get image fit type from store settings\n const fitImageHeight = store?.settings?.product?.fit_type;\n\n // Product badge component\n const getProductBadge = () => {\n if (product?.preorder?.label && typeof product.preorder.label === 'string') {\n return <div className=\"s-product-card-promotion-title\">{product.preorder.label}</div>;\n }\n if (product.promotion_title) {\n return <div className=\"s-product-card-promotion-title\">{product.promotion_title}</div>;\n }\n if (withQuantity && product?.quantity) {\n const formattedQty = formatNumber(product.quantity);\n return (\n <div className=\"s-product-card-quantity\">\n {t('pages.products.remained', 'Remained')} {formattedQty}\n </div>\n );\n }\n if (withQuantity && product?.is_out_of_stock) {\n return (\n <div className=\"s-product-card-out-badge\">\n {t('pages.products.out_of_stock', 'Out of Stock')}\n </div>\n );\n }\n return null;\n };\n\n // Price display component\n const getProductPrice = () => {\n if (product.is_on_sale && product.sale_price) {\n return (\n <div className=\"s-product-card-sale-price\">\n <h4>{format(product.sale_price)}</h4>\n {product.regular_price && <span>{format(product.regular_price)}</span>}\n </div>\n );\n }\n if (product.starting_price) {\n return (\n <div className=\"s-product-card-starting-price\">\n <p>{t('pages.products.starting_price', 'Starting from')}</p>\n <h4>{format(product.starting_price)}</h4>\n </div>\n );\n }\n return <h4 className=\"s-product-card-price\">{format(product.price)}</h4>;\n };\n\n // Build card class names\n const cardClassName = [\n 's-product-card',\n 's-product-card-entry',\n isVertical ? 's-product-card-vertical' : '',\n isHorizontal ? 's-product-card-horizontal' : '',\n fitImageHeight && isVertical ? `s-product-card-fit-height` : '',\n isSpecial ? 's-product-card-special' : '',\n isFullImage ? 's-product-card-full-image' : '',\n isMinimal ? 's-product-card-minimal' : '',\n product?.donation ? 's-product-card-donation' : '',\n withShadow ? 's-product-card-shadow' : '',\n product?.is_out_of_stock ? 's-product-card-out-of-stock' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // Image fit class\n const isProductPlaceholder = isPlaceholder(product.image?.url);\n const imageFitClass = isProductPlaceholder ? 'contain' : fitImageHeight || 'cover';\n\n return (\n <div\n id={`product-card-${product.id}`}\n className={cardClassName}\n data-product-id={product.id}\n style={{\n animationDelay: `${index * 100}ms`,\n }}\n >\n <div className={isFullImage ? 's-product-card-image-full' : 's-product-card-image'}>\n <a href={product.url} aria-label={product.image?.alt || product.name}>\n <Image\n className={`s-product-card-image-${imageFitClass}`}\n src={product.image?.url}\n alt={product.image?.alt ?? product.name}\n width={300}\n height={300}\n aspectRatio=\"1/1\"\n priority={imagePriority}\n />\n {!isFullImage && !isMinimal && getProductBadge()}\n </a>\n {isFullImage && (\n <a href={product.url} aria-label={product.name} className=\"s-product-card-overlay\" />\n )}\n {!isHorizontal && !isFullImage && (\n <SallaButton\n shape=\"icon\"\n fill=\"outline\"\n color=\"light\"\n ariaLabel={t('pages.wishlist.toggle', 'Add or remove to wishlist')}\n className={`s-product-card-wishlist-btn animated ${productInWishlist ? 's-product-card-wishlist-added pulse-anime' : 'not-added un-favorited'}`}\n onClick={handleWishlistToggle}\n data-id={product.id}\n >\n <i className=\"sicon-heart\" />\n </SallaButton>\n )}\n </div>\n <div className=\"s-product-card-content\">\n {/* Special card: quantity pie */}\n {isSpecial && product?.quantity && (\n <div className=\"s-product-card-content-pie\">\n <span>\n <b>{formatNumber(product.quantity)}</b>\n {t('pages.products.remained', 'Remained')}\n </span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"-2 -1 36 34\"\n className=\"s-product-card-content-pie-svg\"\n >\n <circle cx=\"16\" cy=\"16\" r=\"15.9155\" className=\"s-product-card-content-pie-svg-base\" />\n <circle cx=\"16\" cy=\"16\" r=\"15.9155\" className=\"s-product-card-content-pie-svg-bar\" />\n </svg>\n </div>\n )}\n\n <div\n className={`s-product-card-content-main ${isSpecial ? 's-product-card-content-extra-padding' : ''}`}\n >\n <h3 className=\"s-product-card-content-title\">\n <a href={product.url}>{product.name}</a>\n </h3>\n {product.subtitle && !isMinimal && (\n <p className=\"s-product-card-content-subtitle opacity-80\">{product.subtitle}</p>\n )}\n </div>\n\n <div\n className={`s-product-card-content-sub ${isSpecial ? 's-product-card-content-extra-padding' : ''}`}\n >\n {!product?.donation?.can_donate && getProductPrice()}\n {product.rating?.stars && (\n <div className=\"s-product-card-rating\">\n <i className=\"sicon-star2 before:text-orange-300\" />\n <span>{product.rating.stars}</span>\n </div>\n )}\n </div>\n\n {!withoutAddButton && (\n <div className=\"s-product-card-content-footer gap-2\">\n <SallaAddProductButton\n fill=\"outline\"\n width=\"wide\"\n productId={product.id}\n productStatus={product.status}\n productType={product.type}\n hasPreOrder={product.has_preorder_campaign}\n />\n {(isHorizontal || isFullImage) && (\n <SallaButton\n shape=\"icon\"\n fill=\"outline\"\n color=\"light\"\n ariaLabel={t('pages.wishlist.toggle', 'Add or remove to wishlist')}\n className={`s-product-card-wishlist-btn animated ${productInWishlist ? 's-product-card-wishlist-added pulse-anime' : 'not-added un-favorited'}`}\n onClick={handleWishlistToggle}\n data-id={product.id}\n >\n <i className=\"sicon-heart\" />\n </SallaButton>\n )}\n </div>\n )}\n </div>\n </div>\n );\n});\n\nexport const ProductCard = memo(function ProductCard(props: ProductCardProps) {\n const Component = useMemo(() => {\n const hasOverride = registry.getOriginal<ProductCardProps>(PRODUCT_CARD_KEY) !== null;\n if (hasOverride) {\n return registry.resolve<ProductCardProps>(PRODUCT_CARD_KEY);\n }\n return null;\n }, []);\n\n if (Component) {\n return <Component {...props} />;\n }\n\n return <ProductCardContent {...props} />;\n});\n\nexport default ProductCard;\n","import { Suspense, useEffect, useState } from 'react';\nimport { useTranslation } from '../../providers/i18n';\nimport { useTwilight } from '../../providers';\nimport { SallaSlider } from '@salla.sa/twilight-components-react/slider';\nimport { Image } from '../common/Image';\nimport { ImageModal } from '../modal';\nimport type { Product, ProductImage } from '../../types';\n\ninterface ProductGalleryProps {\n product: Product;\n}\n\ntype ImagePreview = { src: string; alt: string };\n\nexport function ProductGallery({ product }: ProductGalleryProps) {\n const { t } = useTranslation();\n const { theme } = useTwilight();\n const sliderId = `details-slider-${product.id}`;\n const objectFit = theme.settings.slider_background_size ?? 'cover';\n\n // Clicking an image opens an in-app lightbox instead of navigating to the CDN URL.\n const [preview, setPreview] = useState<ImagePreview | null>(null);\n\n useEffect(() => {\n const raf = requestAnimationFrame(() => {\n const el = document.getElementById(sliderId);\n if (!el?.parentElement) return;\n const { parentElement, nextSibling } = el;\n parentElement.removeChild(el);\n parentElement.insertBefore(el, nextSibling);\n });\n return () => cancelAnimationFrame(raf);\n }, [product.id, sliderId]);\n\n // The product-details API only returns `image` (singular).\n // Fall back so the main image always renders even without the full gallery array.\n const images: ProductImage[] =\n product.images && product.images.length > 0\n ? product.images\n : product.image?.url\n ? [product.image]\n : [];\n\n const hasManyImages = images.length > 1;\n\n return (\n <div className=\"sidebar md:sticky top-24 w-full md:!w-2/4 rtl:ml-8 ltr:mr-8 pb-8 md:pb-16 overflow-hidden shrink-0\">\n <SallaSlider\n id={sliderId}\n className=\"details-slider rounded-md image-slider\"\n type=\"thumbs\"\n loop={false}\n autoHeight\n listenToThumbnailsOption\n showThumbsControls={false}\n sliderConfig={{ watchOverflow: true, autoHeight: true }}\n >\n {product.promotion_title && (\n <div className=\"promotion-title\">{product.promotion_title}</div>\n )}\n\n {product.calories && (\n <div className=\"absolute z-[2] top-4 rtl:left-4 ltr:right-4 bg-white shadow-sm flex flex-col justify-center items-center rounded-full w-20 h-20 md:w-24 md:h-24\">\n <span className=\"text-red-500 text-xl leading-none font-bold\">{product.calories}</span>\n <span className=\"text-xs text-gray-500\">\n {t('pages.products.calories', 'Calories')}\n </span>\n </div>\n )}\n\n <div slot=\"items\">\n {images.map((image, index) => (\n <ImageSlide\n key={image.id ?? index}\n image={image}\n product={product}\n index={index}\n objectFit={objectFit}\n onPreview={setPreview}\n />\n ))}\n </div>\n\n {hasManyImages && (\n <div slot=\"thumbs\">\n {images.map((image, index) => (\n <ThumbSlide key={image.id ?? index} image={image} index={index} />\n ))}\n </div>\n )}\n </SallaSlider>\n\n <Suspense fallback={null}>\n <ImageModal\n isOpen={!!preview}\n onClose={() => setPreview(null)}\n src={preview?.src ?? ''}\n alt={preview?.alt}\n />\n </Suspense>\n </div>\n );\n}\n\nfunction ImageSlide({\n image,\n product,\n index,\n objectFit,\n onPreview,\n}: {\n image: ProductImage;\n product: Product;\n index: number;\n objectFit: 'cover' | 'contain';\n onPreview: (preview: ImagePreview) => void;\n}) {\n const [loaded, setLoaded] = useState(false);\n const isVideo = Boolean(image.video_url);\n\n if (image.three_d_image_url) {\n return (\n <model-viewer\n style={{ minHeight: '500px' }}\n className=\"swiper-slide model-entry w-full h-full\"\n loading=\"lazy\"\n camera-controls\n touch-action=\"pan-y\"\n auto-rotate\n poster={image.url || undefined}\n src={image.three_d_image_url}\n shadow-intensity=\"1\"\n alt={image.alt}\n ></model-viewer>\n );\n }\n\n return (\n <a\n data-fslightbox={`product_${product.id}`}\n data-img-id={image.id}\n data-slid-index={index}\n {...(image.video_url ? { 'data-video-src': image.video_url } : {})}\n data-caption={image.alt}\n data-infinite=\"false\"\n data-type={image.video_url ? 'youtube' : 'image'}\n href={image.video_url || image.url}\n // FsLightbox isn't loaded in this React theme, so the bare href would leave the SPA.\n // Open images in an in-app lightbox; let videos open in a new tab.\n {...(isVideo ? { target: '_blank', rel: 'noopener noreferrer' } : {})}\n onClick={(event) => {\n if (isVideo || !image.url) return;\n event.preventDefault();\n onPreview({ src: image.url, alt: image.alt || product.name });\n }}\n aria-label={product.name}\n className={`swiper-slide magnify-wrapper homeslider__slide ${image.video_url ? 'video-entry' : ''}`}\n >\n <div className={`w-full ${loaded ? '' : 'aspect-square bg-gray-100 animate-pulse'}`}>\n <Image\n id={String(image.id)}\n src={image.url}\n alt={image.alt || product.name}\n className={`h-full w-full object-${objectFit}`}\n aspectRatio=\"1/1\"\n priority={index === 0}\n noWrapper\n onLoad={() => setLoaded(true)}\n />\n </div>\n </a>\n );\n}\n\nfunction ThumbSlide({ image, index }: { image: ProductImage; index: number }) {\n return (\n <div\n className={`slide--one-fourth ${image.video_url ? 'video-entry' : ''} ${image.three_d_image_url ? 'model-entry' : ''}`}\n data-caption={image.alt}\n >\n <Image\n src={image.url}\n alt={image.alt || ''}\n className=\"object-cover w-full h-full bg-gray-100 rounded-md overflow-hidden\"\n title={image.alt}\n priority={index < 5}\n noWrapper\n />\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// src/utils/sanitize.ts
|
|
2
|
+
var UNSAFE_TAGS = /<(script|iframe|object|embed|form|input|textarea|select|button|link|meta|base)\b[^>]*>/gi;
|
|
3
|
+
var CLOSING_UNSAFE_TAGS = /<\/(script|iframe|object|embed|form|input|textarea|select|button|link|meta|base)>/gi;
|
|
4
|
+
var EVENT_HANDLERS = /\s+on\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]*)/gi;
|
|
5
|
+
var JS_PROTOCOL = /href\s*=\s*(?:"javascript:[^"]*"|'javascript:[^']*')/gi;
|
|
6
|
+
function stripUnsafeHtml(html) {
|
|
7
|
+
return html.replace(UNSAFE_TAGS, "").replace(CLOSING_UNSAFE_TAGS, "").replace(EVENT_HANDLERS, "").replace(JS_PROTOCOL, "");
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export { stripUnsafeHtml };
|
|
11
|
+
//# sourceMappingURL=chunk-RUHSV4Z6.js.map
|
|
12
|
+
//# sourceMappingURL=chunk-RUHSV4Z6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/sanitize.ts"],"names":[],"mappings":";AAAA,IAAM,WAAA,GACJ,0FAAA;AACF,IAAM,mBAAA,GACJ,qFAAA;AACF,IAAM,cAAA,GAAiB,8CAAA;AACvB,IAAM,WAAA,GAAc,wDAAA;AAEb,SAAS,gBAAgB,IAAA,EAAsB;AACpD,EAAA,OAAO,IAAA,CACJ,OAAA,CAAQ,WAAA,EAAa,EAAE,EACvB,OAAA,CAAQ,mBAAA,EAAqB,EAAE,CAAA,CAC/B,QAAQ,cAAA,EAAgB,EAAE,CAAA,CAC1B,OAAA,CAAQ,aAAa,EAAE,CAAA;AAC5B","file":"chunk-RUHSV4Z6.js","sourcesContent":["const UNSAFE_TAGS =\n /<(script|iframe|object|embed|form|input|textarea|select|button|link|meta|base)\\b[^>]*>/gi;\nconst CLOSING_UNSAFE_TAGS =\n /<\\/(script|iframe|object|embed|form|input|textarea|select|button|link|meta|base)>/gi;\nconst EVENT_HANDLERS = /\\s+on\\w+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]*)/gi;\nconst JS_PROTOCOL = /href\\s*=\\s*(?:\"javascript:[^\"]*\"|'javascript:[^']*')/gi;\n\nexport function stripUnsafeHtml(html: string): string {\n return html\n .replace(UNSAFE_TAGS, '')\n .replace(CLOSING_UNSAFE_TAGS, '')\n .replace(EVENT_HANDLERS, '')\n .replace(JS_PROTOCOL, '');\n}\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { HookSlot } from './chunk-25SSLQAJ.js';
|
|
2
|
+
import { useTwilight } from './chunk-BWFBVXT3.js';
|
|
3
|
+
import { useEffect } from 'react';
|
|
4
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
function pushEqualHeightConfig(settings) {
|
|
7
|
+
const isEnabled = settings["products::card.equal-height.enabled"];
|
|
8
|
+
if (isEnabled === void 0 || isEnabled === null) return;
|
|
9
|
+
window.dataLayer = window.dataLayer ?? [];
|
|
10
|
+
window.dataLayer.push({
|
|
11
|
+
equalHeight: {
|
|
12
|
+
isEnabled: Boolean(isEnabled),
|
|
13
|
+
max: Number(settings["products::card.equal-height.max-pixel"] ?? 300),
|
|
14
|
+
classType: String(settings["products::card.equal-height.type"] ?? "min")
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
function WidgetHead() {
|
|
19
|
+
const { store } = useTwilight();
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
const settings = store.settings ?? {};
|
|
22
|
+
pushEqualHeightConfig(settings);
|
|
23
|
+
}, [store.id, store.settings]);
|
|
24
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
25
|
+
/* @__PURE__ */ jsx(HookSlot, { name: "head:start", ssr: true }),
|
|
26
|
+
/* @__PURE__ */ jsx(HookSlot, { name: "head", ssr: true }),
|
|
27
|
+
/* @__PURE__ */ jsx(HookSlot, { name: "head:end", ssr: true })
|
|
28
|
+
] });
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { WidgetHead, pushEqualHeightConfig };
|
|
32
|
+
//# sourceMappingURL=chunk-RYBA3JDM.js.map
|
|
33
|
+
//# sourceMappingURL=chunk-RYBA3JDM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/layout/WidgetHead.tsx"],"names":[],"mappings":";;;;;AAUO,SAAS,sBAAsB,QAAA,EAAyC;AAC7E,EAAA,MAAM,SAAA,GAAY,SAAS,qCAAqC,CAAA;AAChE,EAAA,IAAI,SAAA,KAAc,MAAA,IAAa,SAAA,KAAc,IAAA,EAAM;AAEnD,EAAA,MAAA,CAAO,SAAA,GAAY,MAAA,CAAO,SAAA,IAAa,EAAC;AACxC,EAAA,MAAA,CAAO,UAAU,IAAA,CAAK;AAAA,IACpB,WAAA,EAAa;AAAA,MACX,SAAA,EAAW,QAAQ,SAAS,CAAA;AAAA,MAC5B,GAAA,EAAK,MAAA,CAAO,QAAA,CAAS,uCAAuC,KAAK,GAAG,CAAA;AAAA,MACpE,SAAA,EAAW,MAAA,CAAO,QAAA,CAAS,kCAAkC,KAAK,KAAK;AAAA;AACzE,GACD,CAAA;AACH;AAcO,SAAS,UAAA,GAAa;AAC3B,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,WAAA,EAAY;AAG9B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,QAAA,GAAY,KAAA,CAAM,QAAA,IAAmD,EAAC;AAC5E,IAAA,qBAAA,CAAsB,QAAQ,CAAA;AAAA,EAChC,GAAG,CAAC,KAAA,CAAM,EAAA,EAAI,KAAA,CAAM,QAAQ,CAAC,CAAA;AAE7B,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,YAAA,EAAa,GAAA,EAAG,IAAA,EAAC,CAAA;AAAA,oBAChC,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,MAAA,EAAO,KAAG,IAAA,EAAC,CAAA;AAAA,oBAC1B,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,UAAA,EAAW,KAAG,IAAA,EAAC;AAAA,GAAA,EAChC,CAAA;AAEJ","file":"chunk-RYBA3JDM.js","sourcesContent":["import { useEffect } from 'react';\nimport { useTwilight } from '../../providers/twilight-context';\nimport { HookSlot } from '../../hooks/HookSlot';\n\n/**\n * Pushes the equal-height product card configuration to the GTM dataLayer.\n * Mirrors PHP `HeadWidget::run()` -> `GoogleTagManager::set('equalHeight', ...)`.\n *\n * @param settings - Flat settings map from the store (keyed by dot-path strings).\n */\nexport function pushEqualHeightConfig(settings: Record<string, unknown>): void {\n const isEnabled = settings['products::card.equal-height.enabled'];\n if (isEnabled === undefined || isEnabled === null) return;\n\n window.dataLayer = window.dataLayer ?? [];\n window.dataLayer.push({\n equalHeight: {\n isEnabled: Boolean(isEnabled),\n max: Number(settings['products::card.equal-height.max-pixel'] ?? 300),\n classType: String(settings['products::card.equal-height.type'] ?? 'min'),\n },\n });\n}\n\n/**\n * WidgetHead - Client-side head infrastructure widget.\n *\n * Handles runtime-only head operations that cannot be done in SSR head():\n * - Pushes `equalHeight` config to GTM dataLayer (requires window).\n * - Exposes `head:start`, `head`, and `head:end` HookSlots for theme customisation.\n *\n * Static head elements (favicon, msapplication tiles, theme colors, hreflang, custom CSS/JS)\n * are handled in __root.tsx head() function.\n *\n * Renders no visible UI.\n */\nexport function WidgetHead() {\n const { store } = useTwilight();\n\n // ── equalHeight → GTM dataLayer ───────────────────────────────────────────\n useEffect(() => {\n const settings = (store.settings as unknown as Record<string, unknown>) ?? {};\n pushEqualHeightConfig(settings);\n }, [store.id, store.settings]);\n\n return (\n <>\n <HookSlot name=\"head:start\" ssr />\n <HookSlot name=\"head\" ssr />\n <HookSlot name=\"head:end\" ssr />\n </>\n );\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { orThrow } from './chunk-GO34DE35.js';
|
|
2
|
+
import { api } from './chunk-2TB2LTL2.js';
|
|
3
|
+
import { queryOptions } from '@tanstack/react-query';
|
|
4
|
+
|
|
5
|
+
var brand = {
|
|
6
|
+
list: async () => {
|
|
7
|
+
const { data } = await api.get("brands").json();
|
|
8
|
+
return data ?? {};
|
|
9
|
+
},
|
|
10
|
+
find: async (id) => {
|
|
11
|
+
const { data } = await api.get(`brands/${id}`).json();
|
|
12
|
+
return data;
|
|
13
|
+
},
|
|
14
|
+
findOrThrow: (id) => orThrow(brand.find(id)),
|
|
15
|
+
queries: {
|
|
16
|
+
list: () => queryOptions({
|
|
17
|
+
queryKey: ["brands", "list"],
|
|
18
|
+
queryFn: () => brand.list()
|
|
19
|
+
}),
|
|
20
|
+
detail: (id) => queryOptions({
|
|
21
|
+
queryKey: ["brands", "detail", id],
|
|
22
|
+
queryFn: () => brand.find(id)
|
|
23
|
+
})
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { brand };
|
|
28
|
+
//# sourceMappingURL=chunk-SBIXBX6J.js.map
|
|
29
|
+
//# sourceMappingURL=chunk-SBIXBX6J.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api/brands.ts"],"names":[],"mappings":";;;;AAKO,IAAM,KAAA,GAAQ;AAAA,EACnB,MAAM,YAAkC;AACtC,IAAA,MAAM,EAAE,MAAK,GAAI,MAAM,IAAI,GAAA,CAAI,QAAQ,EAAE,IAAA,EAA4B;AACrE,IAAA,OAAO,QAAQ,EAAC;AAAA,EAClB,CAAA;AAAA,EAEA,IAAA,EAAM,OAAO,EAAA,KAA+B;AAC1C,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,OAAA,EAAU,EAAE,CAAA,CAAE,CAAA,CAAE,IAAA,EAAsB;AACrE,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,aAAa,CAAC,EAAA,KAA+B,QAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EAEnE,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,MACJ,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA,MAC3B,OAAA,EAAS,MAAM,KAAA,CAAM,IAAA;AAAK,KAC3B,CAAA;AAAA,IACH,MAAA,EAAQ,CAAC,EAAA,KACP,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,QAAA,EAAU,QAAA,EAAU,EAAE,CAAA;AAAA,MACjC,OAAA,EAAS,MAAM,KAAA,CAAM,IAAA,CAAK,EAAE;AAAA,KAC7B;AAAA;AAEP","file":"chunk-SBIXBX6J.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport type { Brand, BrandsGroup } from '../routes/brands/types';\nimport { orThrow } from '../providers';\n\nexport const brand = {\n list: async (): Promise<BrandsGroup> => {\n const { data } = await api.get('brands').json<{ data: BrandsGroup }>();\n return data ?? {};\n },\n\n find: async (id: string): Promise<Brand> => {\n const { data } = await api.get(`brands/${id}`).json<{ data: Brand }>();\n return data;\n },\n\n findOrThrow: (id: string): Promise<Brand> => orThrow(brand.find(id)),\n\n queries: {\n list: () =>\n queryOptions({\n queryKey: ['brands', 'list'],\n queryFn: () => brand.list(),\n }),\n detail: (id: string) =>\n queryOptions({\n queryKey: ['brands', 'detail', id],\n queryFn: () => brand.find(id),\n }),\n },\n};\n"]}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { useState, useRef, useEffect, useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
// src/hooks/useProduct.ts
|
|
4
|
+
function useProduct(initialProduct) {
|
|
5
|
+
const [product, setProduct] = useState(initialProduct);
|
|
6
|
+
const initialProductRef = useRef(initialProduct);
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
initialProductRef.current = initialProduct;
|
|
9
|
+
});
|
|
10
|
+
const reload = useCallback(async () => {
|
|
11
|
+
const salla = window.salla;
|
|
12
|
+
if (!salla?.api?.product?.getDetails) return;
|
|
13
|
+
try {
|
|
14
|
+
const response = await salla.api.product.getDetails(String(product.id), [
|
|
15
|
+
"images",
|
|
16
|
+
"category"
|
|
17
|
+
]);
|
|
18
|
+
if (response?.success && response.data) {
|
|
19
|
+
setProduct(response.data);
|
|
20
|
+
}
|
|
21
|
+
} catch {
|
|
22
|
+
}
|
|
23
|
+
}, [product.id]);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
setProduct(initialProductRef.current);
|
|
26
|
+
}, [initialProduct.id]);
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
const salla = window.salla;
|
|
29
|
+
if (!salla?.event?.on) return;
|
|
30
|
+
salla.event.on("product:options.updated", reload);
|
|
31
|
+
return () => {
|
|
32
|
+
salla.event?.off?.("product:options.updated", reload);
|
|
33
|
+
};
|
|
34
|
+
}, [reload]);
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
const salla = window.salla;
|
|
37
|
+
if (!salla?.product?.event?.onPriceUpdated) return;
|
|
38
|
+
const handlePriceUpdated = (res) => {
|
|
39
|
+
const data = res.data;
|
|
40
|
+
if (!data) return;
|
|
41
|
+
setProduct((prev) => ({
|
|
42
|
+
...prev,
|
|
43
|
+
price: data.price ?? prev.price,
|
|
44
|
+
sale_price: data.sale_price ?? prev.sale_price,
|
|
45
|
+
regular_price: data.regular_price ?? prev.regular_price,
|
|
46
|
+
is_on_sale: data.has_sale_price ?? prev.is_on_sale,
|
|
47
|
+
weight: data.weight ?? prev.weight,
|
|
48
|
+
is_out_of_stock: false
|
|
49
|
+
}));
|
|
50
|
+
};
|
|
51
|
+
salla.product.event.onPriceUpdated(handlePriceUpdated);
|
|
52
|
+
return () => {
|
|
53
|
+
salla.event?.off?.(
|
|
54
|
+
"product::price.updated",
|
|
55
|
+
handlePriceUpdated
|
|
56
|
+
);
|
|
57
|
+
};
|
|
58
|
+
}, []);
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
const salla = window.salla;
|
|
61
|
+
if (!salla?.event?.on) return;
|
|
62
|
+
const handlePriceFailed = () => {
|
|
63
|
+
setProduct((prev) => ({ ...prev, is_out_of_stock: true }));
|
|
64
|
+
};
|
|
65
|
+
salla.event.on("product::price.updated.failed", handlePriceFailed);
|
|
66
|
+
return () => {
|
|
67
|
+
salla.event?.off?.("product::price.updated.failed", handlePriceFailed);
|
|
68
|
+
};
|
|
69
|
+
}, []);
|
|
70
|
+
return { product, reload };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { useProduct };
|
|
74
|
+
//# sourceMappingURL=chunk-SSRNIBVV.js.map
|
|
75
|
+
//# sourceMappingURL=chunk-SSRNIBVV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useProduct.ts"],"names":[],"mappings":"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","file":"chunk-SSRNIBVV.js","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { Product } from '../types';\n\n/**\n * UseProductResult - Return type for useProduct hook\n */\nexport interface UseProductResult {\n /** Current product state (updates on option changes) */\n product: Product;\n /** Reload product data from API */\n reload: () => Promise<void>;\n}\n\n/**\n * useProduct - Hook for managing product state with live updates\n *\n * Provides reactive product data with automatic updates for price, stock,\n * and variant changes. Handles manual reloads (e.g., after add-to-cart)\n * and subscribes to Salla SDK events for real-time price updates.\n *\n * Stock status is reflected in `product.is_out_of_stock` which updates\n * when price calculations succeed or fail (e.g., unavailable option combinations).\n *\n * @param initialProduct - The initial product object (typically from loader/SSR)\n *\n * @returns Object with product and reload function\n *\n * @example\n * ```tsx\n * function ProductDetails({ product }) {\n * const { product: updatedProduct, reload } = useProduct(product);\n *\n * const handleAddToCart = async () => {\n * await addToCart(updatedProduct.id);\n * await reload(); // Refresh product state after cart update\n * };\n *\n * return (\n * <div>\n * <h1>{updatedProduct.name}</h1>\n * <p>Price: {formatMoney(updatedProduct.price)}</p>\n * {updatedProduct.is_out_of_stock && <p>Currently out of stock</p>}\n * <button onClick={handleAddToCart}>Add to Cart</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useProduct(initialProduct: Product): UseProductResult {\n const [product, setProduct] = useState<Product>(initialProduct);\n\n // Always keep a ref to the latest initialProduct so the re-seed effect below\n // can read it without adding the full object to the dependency array.\n const initialProductRef = useRef<Product>(initialProduct);\n useEffect(() => {\n initialProductRef.current = initialProduct;\n });\n\n const reload = useCallback(async () => {\n const salla = window.salla;\n if (!salla?.api?.product?.getDetails) return;\n try {\n const response = await salla.api.product.getDetails(String(product.id), [\n 'images',\n 'category',\n ]);\n if (response?.success && response.data) {\n setProduct(response.data as Product);\n }\n } catch {\n // silently ignore network errors during reload\n }\n }, [product.id]);\n\n // Re-seed state when the loader navigates to a different product.\n // We read from the ref (not the prop directly) so the dep array only declares\n // the actual trigger — the id — without needing an eslint-disable comment.\n useEffect(() => {\n setProduct(initialProductRef.current);\n }, [initialProduct.id]);\n\n // Subscribe to Salla option-change events so price/stock stays in sync\n useEffect(() => {\n const salla = window.salla;\n if (!salla?.event?.on) return;\n\n salla.event.on('product:options.updated', reload);\n return () => {\n salla.event?.off?.('product:options.updated', reload);\n };\n }, [reload]);\n\n // Subscribe to price update events (matches product.js registerEvents)\n useEffect(() => {\n const salla = window.salla;\n if (!salla?.product?.event?.onPriceUpdated) return;\n\n const handlePriceUpdated = (res: { data?: Record<string, unknown> }) => {\n const data = res.data;\n if (!data) return;\n\n setProduct((prev) => ({\n ...prev,\n price: (data.price as number) ?? prev.price,\n sale_price: (data.sale_price as number) ?? prev.sale_price,\n regular_price: (data.regular_price as number) ?? prev.regular_price,\n is_on_sale: (data.has_sale_price as boolean) ?? prev.is_on_sale,\n weight: (data.weight as string) ?? prev.weight,\n is_out_of_stock: false,\n }));\n };\n\n salla.product.event.onPriceUpdated(handlePriceUpdated);\n return () => {\n salla.event?.off?.(\n 'product::price.updated',\n handlePriceUpdated as (...args: unknown[]) => void\n );\n };\n }, []);\n\n // Subscribe to price update failed events (matches product.js)\n useEffect(() => {\n const salla = window.salla;\n if (!salla?.event?.on) return;\n\n const handlePriceFailed = () => {\n setProduct((prev) => ({ ...prev, is_out_of_stock: true }));\n };\n\n salla.event.on('product::price.updated.failed', handlePriceFailed);\n return () => {\n salla.event?.off?.('product::price.updated.failed', handlePriceFailed);\n };\n }, []);\n\n return { product, reload };\n}\n"]}
|