@salla.sa/twilight-theme-engine 1.0.94 → 1.0.96
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/dist/{AddToCartForm-MASXVJOI.js → AddToCartForm-DASRXMY7.js} +3 -3
- package/dist/{AddToCartForm-MASXVJOI.js.map → AddToCartForm-DASRXMY7.js.map} +1 -1
- package/dist/{BlogAuthorPage-KRT7MRTC.js → BlogAuthorPage-WFZGYSUB.js} +26 -24
- package/dist/BlogAuthorPage-WFZGYSUB.js.map +1 -0
- package/dist/{BlogCategoryPage-OP3ETAMT.js → BlogCategoryPage-23PFOVVP.js} +26 -24
- package/dist/BlogCategoryPage-23PFOVVP.js.map +1 -0
- package/dist/{BlogPage-RGAQVUDI.js → BlogPage-4RFI56TW.js} +24 -22
- package/dist/BlogPage-4RFI56TW.js.map +1 -0
- package/dist/{BlogSinglePage-VG4UXBTL.js → BlogSinglePage-KMGBQUG5.js} +24 -22
- package/dist/BlogSinglePage-KMGBQUG5.js.map +1 -0
- package/dist/{BlogTagPage-G4IVHJD5.js → BlogTagPage-ZPQJKPBO.js} +26 -24
- package/dist/BlogTagPage-ZPQJKPBO.js.map +1 -0
- package/dist/{BrandsPage-2JMPPOOU.js → BrandsPage-FIHOZYMB.js} +25 -23
- package/dist/BrandsPage-FIHOZYMB.js.map +1 -0
- package/dist/{Breadcrumb-I3ZOGG2Y.js → Breadcrumb-2IXFQL6L.js} +24 -22
- package/dist/Breadcrumb-2IXFQL6L.js.map +1 -0
- package/dist/{CartItem-YTPYETW6.js → CartItem-GRFH5BED.js} +24 -22
- package/dist/CartItem-GRFH5BED.js.map +1 -0
- package/dist/{CartSummary-DND7BO26.js → CartSummary-IOCZJL26.js} +24 -22
- package/dist/CartSummary-IOCZJL26.js.map +1 -0
- package/dist/{Copyright-RWML3BQV.js → Copyright-MDKYCKML.js} +3 -3
- package/dist/{Copyright-RWML3BQV.js.map → Copyright-MDKYCKML.js.map} +1 -1
- package/dist/{CustomerLayout-HCYVBODI.js → CustomerLayout-4737YCAK.js} +24 -22
- package/dist/CustomerLayout-4737YCAK.js.map +1 -0
- package/dist/{Footer-3GEKWEQD.js → Footer-2F652QDB.js} +4 -4
- package/dist/{Footer-3GEKWEQD.js.map → Footer-2F652QDB.js.map} +1 -1
- package/dist/Header-4OATF4LX.js +22 -0
- package/dist/{Header-QG4UO3MF.js.map → Header-4OATF4LX.js.map} +1 -1
- package/dist/{LoyaltyPage-ZMFYQMQY.js → LoyaltyPage-POFUTIPB.js} +24 -22
- package/dist/LoyaltyPage-POFUTIPB.js.map +1 -0
- package/dist/{LoyaltyPointsPage-5PB6IFLY.js → LoyaltyPointsPage-L4S4NZA2.js} +8 -7
- package/dist/LoyaltyPointsPage-L4S4NZA2.js.map +1 -0
- package/dist/{MainMenu-SAUMNMBF.js → MainMenu-ROGX37TG.js} +7 -6
- package/dist/MainMenu-ROGX37TG.js.map +1 -0
- package/dist/{MasterLayout-TY223YR7.js → MasterLayout-PGL5YU2B.js} +24 -22
- package/dist/{MasterLayout-TY223YR7.js.map → MasterLayout-PGL5YU2B.js.map} +1 -1
- package/dist/{MobileMenu-2WOWOFQB.js → MobileMenu-VGXWJHEF.js} +25 -23
- package/dist/MobileMenu-VGXWJHEF.js.map +1 -0
- package/dist/{NotificationsPage-6FX4SOZU.js → NotificationsPage-PZAEKKJO.js} +24 -22
- package/dist/NotificationsPage-PZAEKKJO.js.map +1 -0
- package/dist/{OrderSinglePage-RUMSJIFD.js → OrderSinglePage-KTKLXTUX.js} +25 -23
- package/dist/OrderSinglePage-KTKLXTUX.js.map +1 -0
- package/dist/{OrdersPage-B4Q4QIEM.js → OrdersPage-BY6LYV5M.js} +24 -22
- package/dist/OrdersPage-BY6LYV5M.js.map +1 -0
- package/dist/{PageSingle-F4TDNKUM.js → PageSingle-CJRT3HJZ.js} +6 -5
- package/dist/PageSingle-CJRT3HJZ.js.map +1 -0
- package/dist/{ProductDetails-BNVVUDBH.js → ProductDetails-O2VJVIZC.js} +7 -6
- package/dist/ProductDetails-O2VJVIZC.js.map +1 -0
- package/dist/{ProfilePage-OJSAXSC2.js → ProfilePage-TB7PBODI.js} +24 -22
- package/dist/ProfilePage-TB7PBODI.js.map +1 -0
- package/dist/{RenderWhenVisible-F44J5MMG.js → RenderWhenVisible-KWAXEJOJ.js} +8 -5
- package/dist/RenderWhenVisible-KWAXEJOJ.js.map +1 -0
- package/dist/{ReviewsPage-3IJKJKTY.js → ReviewsPage-5KGCKLFR.js} +3 -3
- package/dist/{ReviewsPage-3IJKJKTY.js.map → ReviewsPage-5KGCKLFR.js.map} +1 -1
- package/dist/{SeoCartWidget-4PN2DW54.js → SeoCartWidget-6BU7WCTP.js} +24 -22
- package/dist/SeoCartWidget-6BU7WCTP.js.map +1 -0
- package/dist/{SettingsPage-BCRNV4GU.js → SettingsPage-G55AM2KS.js} +24 -22
- package/dist/SettingsPage-G55AM2KS.js.map +1 -0
- package/dist/{StoreClosedNotification-IRUTRLIH.js → StoreClosedNotification-C3BBFGAA.js} +25 -23
- package/dist/{StoreClosedNotification-IRUTRLIH.js.map → StoreClosedNotification-C3BBFGAA.js.map} +1 -1
- package/dist/{TestimonialsPage-YU4PLOLR.js → TestimonialsPage-EA4PSO7E.js} +6 -5
- package/dist/TestimonialsPage-EA4PSO7E.js.map +1 -0
- package/dist/{ThankYouPage-MUDELEIQ.js → ThankYouPage-R2OEK7ZZ.js} +24 -22
- package/dist/ThankYouPage-R2OEK7ZZ.js.map +1 -0
- package/dist/{WalletPage-2I4KTR5E.js → WalletPage-MEWHIHUE.js} +25 -23
- package/dist/WalletPage-MEWHIHUE.js.map +1 -0
- package/dist/{WishlistPage-7AYL3RUD.js → WishlistPage-YFKG7CXU.js} +26 -24
- package/dist/WishlistPage-YFKG7CXU.js.map +1 -0
- package/dist/ambient/virtual-modules.d.ts +43 -1
- package/dist/api/advertisement.js +4 -3
- package/dist/api/apps.js +4 -3
- package/dist/api/blog.js +6 -5
- package/dist/api/brands.js +6 -5
- package/dist/api/cart.js +6 -5
- package/dist/api/category.js +6 -5
- package/dist/api/client.js +3 -2
- package/dist/api/home.js +4 -3
- package/dist/api/loyalty.js +6 -5
- package/dist/api/menu.js +4 -3
- package/dist/api/notification.js +4 -3
- package/dist/api/order.js +6 -5
- package/dist/api/page.js +6 -5
- package/dist/api/product.js +6 -5
- package/dist/api/profile.js +3 -2
- package/dist/api/profile.js.map +1 -1
- package/dist/api/store.js +4 -3
- package/dist/api/translations.js +4 -3
- package/dist/api/user.js +4 -3
- package/dist/api/wallet.js +4 -3
- package/dist/api/wishlist.js +7 -6
- package/dist/{chunk-LA7KZ2XY.js → chunk-2D5TFSVG.js} +8 -8
- package/dist/{chunk-LA7KZ2XY.js.map → chunk-2D5TFSVG.js.map} +1 -1
- package/dist/{chunk-HQAFPDJK.js → chunk-2FDLEB5J.js} +3 -3
- package/dist/{chunk-HQAFPDJK.js.map → chunk-2FDLEB5J.js.map} +1 -1
- package/dist/chunk-2FKZAAV7.js +90 -0
- package/dist/chunk-2FKZAAV7.js.map +1 -0
- package/dist/{chunk-YDFOJBEY.js → chunk-3GW3VFR6.js} +3 -3
- package/dist/{chunk-YDFOJBEY.js.map → chunk-3GW3VFR6.js.map} +1 -1
- package/dist/{chunk-CEYT3JER.js → chunk-56T47K7P.js} +4 -4
- package/dist/{chunk-CEYT3JER.js.map → chunk-56T47K7P.js.map} +1 -1
- package/dist/{chunk-LPQ5FUMJ.js → chunk-5SDCUGYR.js} +4 -4
- package/dist/{chunk-LPQ5FUMJ.js.map → chunk-5SDCUGYR.js.map} +1 -1
- package/dist/{chunk-QGOPTVV5.js → chunk-6EQ7G3SZ.js} +4 -3
- package/dist/chunk-6EQ7G3SZ.js.map +1 -0
- package/dist/{chunk-H7CVJFTK.js → chunk-6RHU4TEF.js} +7 -7
- package/dist/{chunk-H7CVJFTK.js.map → chunk-6RHU4TEF.js.map} +1 -1
- package/dist/{chunk-FZYR4BA2.js → chunk-7WTUA4WY.js} +3 -3
- package/dist/{chunk-FZYR4BA2.js.map → chunk-7WTUA4WY.js.map} +1 -1
- package/dist/{chunk-3PXONLUK.js → chunk-BH7YNCYB.js} +3 -3
- package/dist/{chunk-3PXONLUK.js.map → chunk-BH7YNCYB.js.map} +1 -1
- package/dist/{chunk-DBW7XXNE.js → chunk-BPL5H33B.js} +4 -4
- package/dist/{chunk-DBW7XXNE.js.map → chunk-BPL5H33B.js.map} +1 -1
- package/dist/{chunk-66K5P5ZX.js → chunk-CNUBL24W.js} +3 -3
- package/dist/{chunk-66K5P5ZX.js.map → chunk-CNUBL24W.js.map} +1 -1
- package/dist/chunk-COJH52VR.js +443 -0
- package/dist/chunk-COJH52VR.js.map +1 -0
- package/dist/{chunk-6OOTDFC7.js → chunk-D56TVNOG.js} +3 -3
- package/dist/{chunk-6OOTDFC7.js.map → chunk-D56TVNOG.js.map} +1 -1
- package/dist/{chunk-Y7XVWQXG.js → chunk-DNPQ2JBM.js} +4 -4
- package/dist/{chunk-Y7XVWQXG.js.map → chunk-DNPQ2JBM.js.map} +1 -1
- package/dist/{chunk-JJARU7YP.js → chunk-EWLVLDRP.js} +3 -3
- package/dist/{chunk-JJARU7YP.js.map → chunk-EWLVLDRP.js.map} +1 -1
- package/dist/{chunk-Y357MBJI.js → chunk-FNHZEBA5.js} +9 -8
- package/dist/chunk-FNHZEBA5.js.map +1 -0
- package/dist/{chunk-HSWRYXC7.js → chunk-FO4WVGUQ.js} +3 -88
- package/dist/chunk-FO4WVGUQ.js.map +1 -0
- package/dist/{chunk-BNI6SKFL.js → chunk-G3UTLICK.js} +4 -4
- package/dist/{chunk-BNI6SKFL.js.map → chunk-G3UTLICK.js.map} +1 -1
- package/dist/{chunk-C4RXPVDF.js → chunk-GMXI6V2D.js} +6 -5
- package/dist/chunk-GMXI6V2D.js.map +1 -0
- package/dist/{chunk-RKQH63G2.js → chunk-GXHJXZBG.js} +4 -4
- package/dist/{chunk-RKQH63G2.js.map → chunk-GXHJXZBG.js.map} +1 -1
- package/dist/{chunk-43D2CG4F.js → chunk-IBSQO6LW.js} +4 -4
- package/dist/{chunk-43D2CG4F.js.map → chunk-IBSQO6LW.js.map} +1 -1
- package/dist/{chunk-ZVZGLEZ6.js → chunk-IU4KTCS3.js} +3 -3
- package/dist/{chunk-ZVZGLEZ6.js.map → chunk-IU4KTCS3.js.map} +1 -1
- package/dist/{chunk-ZFNLX3F7.js → chunk-J3G4ZD76.js} +13 -12
- package/dist/chunk-J3G4ZD76.js.map +1 -0
- package/dist/{chunk-ENJ3CM5M.js → chunk-J5X4LXNM.js} +3 -3
- package/dist/{chunk-ENJ3CM5M.js.map → chunk-J5X4LXNM.js.map} +1 -1
- package/dist/{chunk-TJF6YZ5I.js → chunk-JKBLG344.js} +8 -7
- package/dist/chunk-JKBLG344.js.map +1 -0
- package/dist/{chunk-RPDMNNRW.js → chunk-JVIPOD6M.js} +20 -19
- package/dist/chunk-JVIPOD6M.js.map +1 -0
- package/dist/{chunk-4WAUITU2.js → chunk-KNIGLCRV.js} +3 -3
- package/dist/{chunk-4WAUITU2.js.map → chunk-KNIGLCRV.js.map} +1 -1
- package/dist/{chunk-OMKLPCBA.js → chunk-KQW6I5CD.js} +4 -4
- package/dist/{chunk-OMKLPCBA.js.map → chunk-KQW6I5CD.js.map} +1 -1
- package/dist/{chunk-HR3QJ3LW.js → chunk-LXNS6CMT.js} +4 -4
- package/dist/{chunk-HR3QJ3LW.js.map → chunk-LXNS6CMT.js.map} +1 -1
- package/dist/chunk-MGDCJQ5P.js +14 -0
- package/dist/{chunk-KZM7HXJ3.js.map → chunk-MGDCJQ5P.js.map} +1 -1
- package/dist/chunk-N45X7D55.js +63 -0
- package/dist/chunk-N45X7D55.js.map +1 -0
- package/dist/{chunk-OH2L4U2C.js → chunk-NZRJOAA7.js} +3 -3
- package/dist/{chunk-OH2L4U2C.js.map → chunk-NZRJOAA7.js.map} +1 -1
- package/dist/{chunk-TEOVJ6WU.js → chunk-O7B5JL6H.js} +4 -4
- package/dist/{chunk-TEOVJ6WU.js.map → chunk-O7B5JL6H.js.map} +1 -1
- package/dist/{chunk-UURVAJ42.js → chunk-OZP2FID7.js} +4 -4
- package/dist/{chunk-UURVAJ42.js.map → chunk-OZP2FID7.js.map} +1 -1
- package/dist/{chunk-HCA2TE4G.js → chunk-PGUKRWOY.js} +5 -5
- package/dist/{chunk-HCA2TE4G.js.map → chunk-PGUKRWOY.js.map} +1 -1
- package/dist/{chunk-3MIFT4VQ.js → chunk-Q62YEBIA.js} +4 -4
- package/dist/{chunk-3MIFT4VQ.js.map → chunk-Q62YEBIA.js.map} +1 -1
- package/dist/{chunk-6DMNJPLW.js → chunk-QS4EDTEX.js} +3 -3
- package/dist/{chunk-6DMNJPLW.js.map → chunk-QS4EDTEX.js.map} +1 -1
- package/dist/{chunk-SAGXF3MU.js → chunk-QZEQOVA5.js} +3 -3
- package/dist/{chunk-SAGXF3MU.js.map → chunk-QZEQOVA5.js.map} +1 -1
- package/dist/{chunk-JTOVO3ZU.js → chunk-RWBTMHLR.js} +5 -5
- package/dist/{chunk-JTOVO3ZU.js.map → chunk-RWBTMHLR.js.map} +1 -1
- package/dist/{chunk-DV6SJHL5.js → chunk-S34G5DL4.js} +4 -4
- package/dist/{chunk-DV6SJHL5.js.map → chunk-S34G5DL4.js.map} +1 -1
- package/dist/{chunk-MKVCFBVF.js → chunk-TIPR4JUO.js} +4 -4
- package/dist/{chunk-MKVCFBVF.js.map → chunk-TIPR4JUO.js.map} +1 -1
- package/dist/{chunk-WHJZP3QJ.js → chunk-ULMSO2XZ.js} +7 -7
- package/dist/{chunk-WHJZP3QJ.js.map → chunk-ULMSO2XZ.js.map} +1 -1
- package/dist/{chunk-IVBOLREE.js → chunk-VWVCSD3N.js} +3 -3
- package/dist/{chunk-IVBOLREE.js.map → chunk-VWVCSD3N.js.map} +1 -1
- package/dist/{chunk-5G7NYNX6.js → chunk-W2LNKEBF.js} +3 -3
- package/dist/{chunk-5G7NYNX6.js.map → chunk-W2LNKEBF.js.map} +1 -1
- package/dist/{chunk-AV6AAVNU.js → chunk-XGNML7XM.js} +7 -7
- package/dist/{chunk-AV6AAVNU.js.map → chunk-XGNML7XM.js.map} +1 -1
- package/dist/{chunk-46NBPXAI.js → chunk-XT6CLGF5.js} +3 -3
- package/dist/{chunk-46NBPXAI.js.map → chunk-XT6CLGF5.js.map} +1 -1
- package/dist/{chunk-SFZ7IIWL.js → chunk-ZEGNYJOR.js} +4 -4
- package/dist/{chunk-SFZ7IIWL.js.map → chunk-ZEGNYJOR.js.map} +1 -1
- package/dist/{chunk-OM26SAHA.js → chunk-ZPVLBXDY.js} +4 -4
- package/dist/{chunk-OM26SAHA.js.map → chunk-ZPVLBXDY.js.map} +1 -1
- package/dist/components/cart/index.js +1 -1
- package/dist/components/common/RenderWhenVisible.d.ts +3 -1
- package/dist/components/common/RenderWhenVisible.d.ts.map +1 -1
- package/dist/components/common/index.js +1 -1
- package/dist/components/common/lazy.d.ts +1 -1
- package/dist/components/common/lazy.d.ts.map +1 -1
- package/dist/components/drawer/index.js +22 -20
- package/dist/components/home/HomePageRenderer.d.ts.map +1 -1
- package/dist/components/home/index.js +26 -24
- package/dist/components/layout/index.js +6 -5
- package/dist/components/product/index.js +23 -21
- package/dist/components/store/index.js +24 -22
- package/dist/components/store/index.js.map +1 -1
- package/dist/components/toast/index.js +4 -3
- package/dist/components/toast/index.js.map +1 -1
- package/dist/components/tracking/index.js +1 -1
- package/dist/dev/DevSettingsWidget.d.ts +6 -7
- package/dist/dev/DevSettingsWidget.d.ts.map +1 -1
- package/dist/dev/dev-settings-store.d.ts +89 -46
- package/dist/dev/dev-settings-store.d.ts.map +1 -1
- package/dist/dev/editor/AddElementDrawer.d.ts +17 -0
- package/dist/dev/editor/AddElementDrawer.d.ts.map +1 -0
- package/dist/dev/editor/BuilderPanel.d.ts +23 -0
- package/dist/dev/editor/BuilderPanel.d.ts.map +1 -0
- package/dist/dev/editor/SettingsPanel.d.ts +9 -0
- package/dist/dev/editor/SettingsPanel.d.ts.map +1 -0
- package/dist/dev/editor/ThemeEditor.d.ts +20 -0
- package/dist/dev/editor/ThemeEditor.d.ts.map +1 -0
- package/dist/dev/editor/catalog.d.ts +10 -0
- package/dist/dev/editor/catalog.d.ts.map +1 -0
- package/dist/dev/editor/fields.d.ts +18 -0
- package/dist/dev/editor/fields.d.ts.map +1 -0
- package/dist/dev/editor/i18n.d.ts +72 -0
- package/dist/dev/editor/i18n.d.ts.map +1 -0
- package/dist/dev/editor/icons.d.ts +21 -0
- package/dist/dev/editor/icons.d.ts.map +1 -0
- package/dist/dev/editor/index.d.ts +8 -0
- package/dist/dev/editor/index.d.ts.map +1 -0
- package/dist/dev/editor/index.js +2059 -0
- package/dist/dev/editor/index.js.map +1 -0
- package/dist/dev/editor/lookup.d.ts +22 -0
- package/dist/dev/editor/lookup.d.ts.map +1 -0
- package/dist/dev/editor/mount.d.ts +4 -0
- package/dist/dev/editor/mount.d.ts.map +1 -0
- package/dist/dev/editor/paths.d.ts +44 -0
- package/dist/dev/editor/paths.d.ts.map +1 -0
- package/dist/dev/editor/pickers.d.ts +12 -0
- package/dist/dev/editor/pickers.d.ts.map +1 -0
- package/dist/dev/editor/styles.d.ts +8 -0
- package/dist/dev/editor/styles.d.ts.map +1 -0
- package/dist/dev/index.d.ts +1 -1
- package/dist/dev/index.d.ts.map +1 -1
- package/dist/dev/index.js +35 -309
- package/dist/dev/index.js.map +1 -1
- package/dist/dev/schema-types.d.ts +124 -4
- package/dist/dev/schema-types.d.ts.map +1 -1
- package/dist/dev/store-lookup.d.ts +13 -0
- package/dist/dev/store-lookup.d.ts.map +1 -0
- package/dist/document-class-2RROXH4K.js +29 -0
- package/dist/{document-class-AJGI7GKJ.js.map → document-class-2RROXH4K.js.map} +1 -1
- package/dist/hooks/index.js +22 -20
- package/dist/hooks/useComments.js +3 -2
- package/dist/hooks/useGtm.js +22 -20
- package/dist/hooks/useMoney.js +22 -20
- package/dist/hooks/useProduct.js +3 -2
- package/dist/hooks/useStore.js +22 -20
- package/dist/hooks/useUser.js +5 -4
- package/dist/hooks/useWishlist.js +3 -2
- package/dist/index.js +22 -20
- package/dist/index.js.map +1 -1
- package/dist/native-app/index.js +3 -2
- package/dist/{navigation-KTFJWOWI.js → navigation-JB2CJXBF.js} +7 -6
- package/dist/navigation-JB2CJXBF.js.map +1 -0
- package/dist/navigation-KTMLD4VB.js +14 -0
- package/dist/{navigation-BARZWXJZ.js.map → navigation-KTMLD4VB.js.map} +1 -1
- package/dist/{not-found-NK6ZFJ7H.js → not-found-ZM6VIELR.js} +25 -23
- package/dist/not-found-ZM6VIELR.js.map +1 -0
- package/dist/providers/index.js +22 -20
- package/dist/routes/account/orders.js +7 -6
- package/dist/routes/account.js +16 -15
- package/dist/routes/account.js.map +1 -1
- package/dist/routes/blog.js +11 -10
- package/dist/routes/blog.js.map +1 -1
- package/dist/routes/brands.js +7 -6
- package/dist/routes/brands.js.map +1 -1
- package/dist/routes/cart.js +30 -28
- package/dist/routes/cart.js.map +1 -1
- package/dist/routes/home/HomePage.d.ts.map +1 -1
- package/dist/routes/home.js +27 -25
- package/dist/routes/index.js +6 -5
- package/dist/routes/loyalty.js +8 -7
- package/dist/routes/loyalty.js.map +1 -1
- package/dist/routes/page.js +7 -6
- package/dist/routes/page.js.map +1 -1
- package/dist/routes/product-listing/index.d.ts +27 -0
- package/dist/routes/product-listing/index.d.ts.map +1 -1
- package/dist/routes/product-listing.js +52 -27
- package/dist/routes/product-listing.js.map +1 -1
- package/dist/routes/product.js +26 -24
- package/dist/routes/product.js.map +1 -1
- package/dist/routes/seo-redirects.js +6 -5
- package/dist/routes/testimonials.js +2 -2
- package/dist/routes/thank-you.js +7 -6
- package/dist/routes/thank-you.js.map +1 -1
- package/dist/skeleton.js +27 -25
- package/dist/store-lookup-T4TK7CKA.js +114 -0
- package/dist/store-lookup-T4TK7CKA.js.map +1 -0
- package/dist/tanstack.js +17 -16
- package/dist/tanstack.js.map +1 -1
- package/dist/utils/index.js +6 -5
- package/dist/utils/index.js.map +1 -1
- package/dist/vite/adapters/tanstack.adapter.d.ts.map +1 -1
- package/dist/vite/index.js +424 -47
- package/dist/vite/index.js.map +1 -1
- package/dist/vite/plugins/twilight-schema.d.ts +7 -2
- package/dist/vite/plugins/twilight-schema.d.ts.map +1 -1
- package/dist/vite/plugins/twilight-schema.plugin.d.ts +26 -0
- package/dist/vite/plugins/twilight-schema.plugin.d.ts.map +1 -1
- package/package.json +5 -1
- package/tailwind/components/common/RenderWhenVisible.tsx.txt +9 -2
- package/tailwind/components/home/HomePageRenderer.tsx.txt +2 -0
- package/tailwind/routes/home/HomePage.tsx.txt +7 -6
- package/tailwind/routes/product-listing/index.tsx.txt +42 -0
- package/dist/BlogAuthorPage-KRT7MRTC.js.map +0 -1
- package/dist/BlogCategoryPage-OP3ETAMT.js.map +0 -1
- package/dist/BlogPage-RGAQVUDI.js.map +0 -1
- package/dist/BlogSinglePage-VG4UXBTL.js.map +0 -1
- package/dist/BlogTagPage-G4IVHJD5.js.map +0 -1
- package/dist/BrandsPage-2JMPPOOU.js.map +0 -1
- package/dist/Breadcrumb-I3ZOGG2Y.js.map +0 -1
- package/dist/CartItem-YTPYETW6.js.map +0 -1
- package/dist/CartSummary-DND7BO26.js.map +0 -1
- package/dist/CustomerLayout-HCYVBODI.js.map +0 -1
- package/dist/Header-QG4UO3MF.js +0 -21
- package/dist/LoyaltyPage-ZMFYQMQY.js.map +0 -1
- package/dist/LoyaltyPointsPage-5PB6IFLY.js.map +0 -1
- package/dist/MainMenu-SAUMNMBF.js.map +0 -1
- package/dist/MobileMenu-2WOWOFQB.js.map +0 -1
- package/dist/NotificationsPage-6FX4SOZU.js.map +0 -1
- package/dist/OrderSinglePage-RUMSJIFD.js.map +0 -1
- package/dist/OrdersPage-B4Q4QIEM.js.map +0 -1
- package/dist/PageSingle-F4TDNKUM.js.map +0 -1
- package/dist/ProductDetails-BNVVUDBH.js.map +0 -1
- package/dist/ProfilePage-OJSAXSC2.js.map +0 -1
- package/dist/RenderWhenVisible-F44J5MMG.js.map +0 -1
- package/dist/SeoCartWidget-4PN2DW54.js.map +0 -1
- package/dist/SettingsPage-BCRNV4GU.js.map +0 -1
- package/dist/TestimonialsPage-YU4PLOLR.js.map +0 -1
- package/dist/ThankYouPage-MUDELEIQ.js.map +0 -1
- package/dist/WalletPage-2I4KTR5E.js.map +0 -1
- package/dist/WishlistPage-7AYL3RUD.js.map +0 -1
- package/dist/chunk-2JV6WZ6O.js +0 -136
- package/dist/chunk-2JV6WZ6O.js.map +0 -1
- package/dist/chunk-C4RXPVDF.js.map +0 -1
- package/dist/chunk-HSWRYXC7.js.map +0 -1
- package/dist/chunk-KZM7HXJ3.js +0 -14
- package/dist/chunk-QGOPTVV5.js.map +0 -1
- package/dist/chunk-RPDMNNRW.js.map +0 -1
- package/dist/chunk-TJF6YZ5I.js.map +0 -1
- package/dist/chunk-Y357MBJI.js.map +0 -1
- package/dist/chunk-ZFNLX3F7.js.map +0 -1
- package/dist/document-class-AJGI7GKJ.js +0 -28
- package/dist/navigation-BARZWXJZ.js +0 -13
- package/dist/navigation-KTFJWOWI.js.map +0 -1
- package/dist/not-found-NK6ZFJ7H.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/apply-theme.ts","../src/providers/twilight-theme.ts","../src/utils/engine-version.ts","../src/providers/twilight-init.ts","../src/providers/native-safe-area.ts","../src/providers/native-spa-webview.ts","../src/providers/navigation-setups.ts","../src/providers/DocumentSyncRegistry.ts","../src/hooks/useDate.ts","../src/hooks/useNumber.ts","../src/utils/number.ts","../src/hooks/useMoney.tsx","../src/hooks/useGtm.ts","../src/hooks/useOpeningHours.ts","../src/hooks/usePageConfig.ts","../src/utils/breadcrumb.ts","../src/hooks/useBreadcrumbs.ts","../src/utils/fast-checkout.ts","../src/hooks/registerDefaultHooks.tsx","../src/components/layout/MasterLayout.tsx","../src/components/snippets/AppsSnippets.tsx","../src/components/snippets/SallaSdkScripts.tsx","../src/providers/TwilightProvider.tsx","../src/hooks/useStore.ts"],"names":["color","useEffect","lazy","ARABIC_NUMERALS","useCallback","useMemo","useState","jsx","id","jsxs","Fragment","Suspense","getSalla","React"],"mappings":"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","file":"chunk-JVIPOD6M.js","sourcesContent":["import type { Theme } from '../types';\nimport { color as makeColor } from './color';\n\nexport function themeCssVars(theme: Theme): [string, string][] {\n const vars: [string, string][] = [];\n\n const fontName = theme.font?.name;\n if (fontName) {\n // Quoted: an unquoted name such as `Baloo Bhaijaan 2` is not a valid family,\n // which drops the whole `font-family` declaration back to the browser default.\n const family = (suffix = '') => JSON.stringify(`${fontName}${suffix}`);\n vars.push(\n ['--font-main', family()],\n ['--font-light', family()],\n ['--font-regular', family()],\n ['--font-medium', family('-Medium')],\n ['--font-bold', family('-Bold')]\n );\n }\n\n const { color } = theme;\n if (color) {\n vars.push(['--color-text', '#222222']);\n\n if (color.primary) {\n const c = makeColor(color.primary);\n vars.push(\n ['--color-primary', color.primary],\n ['--color-primary-dark', c.darken(0.15)],\n ['--color-primary-light', c.lighten(0.15)],\n ['--color-title', color.primary],\n ['--color-secondary', color.primary]\n );\n }\n\n if (color.reverse_text) {\n vars.push(\n ['--color-primary-reverse', color.reverse_text],\n ['--color-text-reverse', color.reverse_text],\n ['--color-reverse-text', color.reverse_text]\n );\n }\n\n if (color.reverse_primary) {\n vars.push(['--color-reverse-primary', color.reverse_primary]);\n }\n }\n\n vars.push(['--page-height', '100%']);\n return vars;\n}\n\n// What the previous applyTheme set, so a theme without a font or colour (another\n// market's, after a scope change) does not keep the previous one's values.\nlet applied = new Set<string>();\n\nexport function applyTheme(theme: Theme): void {\n if (typeof document === 'undefined') return;\n\n const root = document.documentElement;\n const vars = themeCssVars(theme);\n const next = new Set(vars.map(([prop]) => prop));\n for (const prop of applied) {\n if (!next.has(prop)) root.style.removeProperty(prop);\n }\n for (const [prop, val] of vars) {\n root.style.setProperty(prop, val);\n }\n applied = next;\n}\n","import { createElement, useEffect, type ReactElement } from 'react';\nimport { applyTheme, themeCssVars } from '../utils/apply-theme';\nimport { escapeForInlineScript } from '../utils/inline-script';\nimport { useDocumentClass } from '../hooks/useDocumentClass';\nimport type { Theme } from '../types';\n\nexport function fontToClass(name: string | undefined): string | null {\n if (!name) return null;\n const slug = name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return slug ? `font-${slug}` : null;\n}\n\nexport function themeBodyClasses(\n theme: Theme,\n direction: 'rtl' | 'ltr',\n isMobileWebview: boolean\n): string[] {\n return [\n theme.name ? `salla-${theme.name}` : null,\n `color-mode-${theme.color?.is_dark ? 'dark' : 'light'}`,\n direction,\n theme.mode === 'preview' ? 'preview-mode' : null,\n fontToClass(theme.font?.name),\n isMobileWebview ? 'mobile-webview' : null,\n theme.settings?.footer_is_dark ? 'footer-is-dark' : 'footer-is-light',\n theme.settings?.topnav_is_dark ? 'topnav-is-dark' : null,\n theme.settings?.sticky_add_to_cart ? 'is-sticky-product-bar' : null,\n ].filter(Boolean) as string[];\n}\n\n/** Applies the theme's variables and body classes as the body starts parsing, ahead of hydration. */\nexport function themeSyncScript(vars: [string, string][], bodyClasses: string[]): string {\n const json = (value: unknown) => escapeForInlineScript(JSON.stringify(value));\n return (\n `(function(d){var s=d.documentElement.style;${json(vars)}.forEach(function(v){s.setProperty(v[0],v[1])});` +\n `d.body.classList.add.apply(d.body.classList,${json(bodyClasses)})})(document);`\n );\n}\n\nexport function ThemeDocumentSync({\n theme,\n locale,\n direction,\n isMobileWebview,\n}: {\n theme: Theme;\n locale: string;\n direction: 'rtl' | 'ltr';\n isMobileWebview: boolean;\n}): ReactElement {\n const bodyClasses = themeBodyClasses(theme, direction, isMobileWebview);\n\n useDocumentClass({\n html: { lang: locale, dir: direction },\n body: { class: bodyClasses },\n });\n\n useEffect(() => {\n applyTheme(theme);\n }, [theme]);\n\n // React 19 renders script children verbatim; themeSyncScript escapes `<`, so the tag can't close early.\n return createElement(\n 'script',\n { id: 'salla-theme-sync', suppressHydrationWarning: true },\n themeSyncScript(themeCssVars(theme), bodyClasses)\n );\n}\n","/**\n * The engine's own build version, injected by tsup `define` when dist is\n * built. Falls back to 'dev' when the source runs unbundled (vitest, direct\n * src imports in the monorepo).\n *\n * Exposed at runtime as `salla.versions.engine` by `useTwilightInit` so a\n * storefront can always be asked which engine build rendered it.\n */\nexport const ENGINE_VERSION: string =\n typeof __TWILIGHT_ENGINE_VERSION__ !== 'undefined' ? __TWILIGHT_ENGINE_VERSION__ : 'dev';\n","import {\n type Dispatch,\n type SetStateAction,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { SallaCurrency, SallaSDK } from '../types/salla-sdk';\nimport { getActiveCurrency } from '../api/client';\nimport { useDevSettingsOverrides } from '../dev/dev-settings-store';\nimport { getTwilightContext } from '../twilight/context';\nimport type { Store, Theme } from '../types';\nimport { syncScopeCookie } from '../utils/cookies';\nimport { ENGINE_VERSION } from '../utils/engine-version';\nimport { type StoreContext, syncSdkLocale, whenSallaLoaded } from '../utils/sdk-helpers';\nimport { getLanguageInfo } from './locale-constants';\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction getSalla(): SallaSDK | undefined {\n if (typeof window === 'undefined') return undefined;\n return window.salla;\n}\n\n// The SDK's own guest currency default (init-user.js); its cookie.get drops that default.\nconst SDK_GUEST_CURRENCY = 'SAR';\n\n// The SDK starts in `user.language_code` and loads only that language's messages, so it is the\n// page's: `s-lang` and the stored user can name another, and an `/en` page then drew its salla-*\n// components in Arabic, or as raw keys. They answer only when the page names no language.\nfunction userLanguage(sdk: SallaSDK, locale: string, stored?: unknown) {\n return locale || (sdk.cookie?.get?.('s-lang') ?? stored);\n}\n\n// The SDK resolves these itself (init-user.js), but its cookie.get drops the stored fallback.\nfunction withCookieLocale(sdk: SallaSDK, stored: Record<string, unknown>, locale: string) {\n return {\n ...stored,\n language_code: userLanguage(sdk, locale, stored.language_code),\n currency_code: sdk.cookie?.get?.('s-curr') ?? stored.currency_code ?? SDK_GUEST_CURRENCY,\n };\n}\n\n// The API derives currency/country/geo from the SSR worker's IP, so only IP-free guest fields are seeded.\nfunction withSettingsUser(sdk: SallaSDK, settings: StoreContext | undefined, locale: string) {\n if (!settings) return settings;\n const { user: guest, ...rest } = settings;\n const stored = sdk.storage?.get?.('user') as Record<string, unknown> | null | undefined;\n if (stored) return { ...rest, user: withCookieLocale(sdk, stored, locale) };\n const {\n currency_code: _currency,\n country_code: _country,\n default_geo_location: _geo,\n ...visitor\n } = guest ?? { type: 'guest' };\n return {\n ...rest,\n user: {\n ...visitor,\n language_code: userLanguage(sdk, locale, visitor.language_code),\n currency_code: sdk.cookie?.get?.('s-curr') ?? SDK_GUEST_CURRENCY,\n },\n };\n}\n\n// Twig layouts set it; without it the SDK's product cards request `<theme assets>/undefined`.\nconst PLACEHOLDER_IMAGE = 'https://cdn.salla.network/images/placeholder.png';\n\nfunction withPlaceholder<T extends Pick<StoreContext, 'theme'>>(settings: T): T {\n const theme = settings.theme;\n if (!theme || theme.settings?.placeholder) return settings;\n return {\n ...settings,\n theme: { ...theme, settings: { ...theme.settings, placeholder: PLACEHOLDER_IMAGE } },\n };\n}\n\n// The SDK ignores `window.translations` and reuses only its own cache, else it downloads every locale.\nfunction seedSdkTranslations(sdk: SallaSDK, settings: StoreContext | undefined, locale: string) {\n const localeKey = `${locale}.trans`;\n const messages = window.translations?.[localeKey];\n const hash = settings?.theme?.translations_hash ?? settings?.store?.id;\n if (!messages || !Object.keys(messages).length || !hash) return;\n try {\n const cached = sdk.storage.get(`s_translations.${hash}`) as Record<string, unknown> | null;\n if (cached?.[localeKey]) return;\n sdk.storage.set('s_translations', { [hash]: { [localeKey]: messages } });\n } catch {\n // Storage full, disabled or missing: the SDK downloads its own copy, as before.\n }\n}\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\nexport interface UseTwilightInitOptions {\n debug: boolean;\n initialData?: StoreContext | Record<string, unknown>;\n onReady?: (data: { store: Store; theme: Theme }) => void;\n onError?: (error: Error) => void;\n initialLocale: string;\n}\n\nexport interface UseTwilightInitReturn {\n isReady: boolean;\n storeData: Store;\n setStoreData: Dispatch<SetStateAction<Store>>;\n themeData: Theme;\n currency: SallaCurrency | null;\n isMobileWebview: boolean;\n}\n\n// Each SDK init() mounts another copy of its auto widgets (loyalty banners...), so run it once.\nconst initializedSdks = new WeakSet<object>();\nconst EMPTY_STORE = {} as Store;\n\nexport function useTwilightInit({\n debug: _debug,\n initialData,\n onReady,\n onError: _onError,\n initialLocale,\n}: UseTwilightInitOptions): UseTwilightInitReturn {\n const isBrowser = typeof window !== 'undefined';\n const initialLanguage = getLanguageInfo(initialLocale);\n const settingsData = initialData as StoreContext | undefined;\n\n const [isReady, setReady] = useState<boolean>(() => !!settingsData);\n // Settings answered for another market (a scope switch) carry another store scope\n // and theme version; follow them instead of the first page load's. A theme's\n // `_setStore` patch applies on top of the settings it was written against only.\n const settingsStore = (settingsData?.store as Store | undefined) ?? EMPTY_STORE;\n const [storePatch, setStorePatch] = useState<{ base: Store; patch: Partial<Store> } | null>(null);\n const patch = storePatch?.base === settingsStore ? storePatch.patch : null;\n const storeData = useMemo<Store>(\n () => (patch ? { ...settingsStore, ...patch } : settingsStore),\n [settingsStore, patch]\n );\n const setStoreData = useCallback<Dispatch<SetStateAction<Store>>>(\n (action) =>\n setStorePatch((prev) => {\n const prevPatch = prev?.base === settingsStore ? prev.patch : null;\n return {\n base: settingsStore,\n patch: typeof action === 'function' ? action({ ...settingsStore, ...prevPatch }) : action,\n };\n }),\n [settingsStore]\n );\n const settingsTheme = settingsData?.theme as Partial<Theme> | undefined;\n const baseTheme = useMemo<Theme>(() => {\n if (settingsTheme) {\n return {\n ...settingsTheme,\n is_rtl: settingsTheme.is_rtl ?? initialLanguage.dir === 'rtl',\n } as Theme;\n }\n return { is_rtl: initialLanguage.dir === 'rtl' } as Theme;\n }, [settingsTheme, initialLanguage.dir]);\n\n // Dev-mode only: overlay the settings the DevSettingsWidget has enabled onto\n // the real theme so the storefront renders with them live. `import.meta.env.DEV`\n // is statically false in production builds, so this whole branch (and the\n // overrides hook's effect) is dead-code-eliminated from the shipped bundle.\n const devOverrides = useDevSettingsOverrides();\n const themeData = useMemo<Theme>(() => {\n if (import.meta.env.DEV && devOverrides.enabled) {\n const overrides = devOverrides.settings;\n if (overrides && Object.keys(overrides).length > 0) {\n return {\n ...baseTheme,\n settings: { ...(baseTheme.settings ?? {}), ...overrides } as Theme['settings'],\n };\n }\n }\n return baseTheme;\n }, [baseTheme, devOverrides]);\n const [currency] = useState<SallaCurrency | null>(() => {\n const code = getActiveCurrency();\n const active = code ? settingsData?.currencies?.[code] : undefined;\n return active ? { code: active.code, name: active.name, symbol: active.symbol } : null;\n });\n const [isMobileWebview] = useState<boolean>(false); // todo :: add a flage in the store data for mobile\n\n useEffect(() => {\n if (!isBrowser || !themeData) return;\n const sdk = getSalla();\n sdk?.config?.set?.('theme.is_rtl', themeData.is_rtl ?? false);\n window.enable_more_menu = String(themeData.settings?.enable_more_menu ?? true);\n }, [themeData, isBrowser]);\n\n useEffect(() => {\n // Not `if (!sdk) return`: `window.salla` is the head script's stub until the SDK\n // has loaded, and on a cold load hydration runs this first. Returning then left\n // the storefront with an SDK nobody ever initialised — `salla.status` stuck on\n // 'loading', no store config, no cart. Wait for it instead.\n return whenSallaLoaded((sdk) => {\n // Expose which engine build rendered this storefront (salla.versions.engine)\n // for debugging and support tooling. Merged, not assigned, so other Salla\n // packages can register their own versions on the same object.\n const sdkWithVersions = sdk as SallaSDK & { versions?: Record<string, string> };\n sdkWithVersions.versions = { ...sdkWithVersions.versions, engine: ENGINE_VERSION };\n\n if (initialLocale) {\n // Sync UI translations + the SDK's axios accept-language header to the route locale.\n // The header set may be a no-op now if the SDK isn't fully ready; it's re-asserted\n // after onReady below, and on every navigation in rootBeforeLoad.\n syncSdkLocale(initialLocale);\n }\n\n if (typeof sdk.init !== 'function') return;\n\n const ctx = getTwilightContext();\n const pageCtx = ctx.page;\n const userData = withSettingsUser(sdk, settingsData, initialLocale);\n const baseData = userData && withPlaceholder(userData);\n const initData = pageCtx\n ? {\n ...baseData,\n page: {\n ...pageCtx,\n url: pageCtx.url ?? ctx.location.pathname + ctx.location.searchStr,\n },\n }\n : baseData;\n\n if (!initializedSdks.has(sdk)) {\n initializedSdks.add(sdk);\n seedSdkTranslations(sdk, settingsData, initialLocale);\n sdk.init(initData);\n }\n\n const initSdk = async () => {\n try {\n await sdk.onReady();\n } catch {\n // sdk.onReady() may fail during partial initialization\n }\n\n // The SDK loads async; the sync above may have run against a not-yet-ready SDK.\n // Now that it's ready, re-assert so the very first SDK API calls use the route locale.\n syncSdkLocale(initialLocale);\n\n // Mirror the selected branch into the `scope` cookie so the NEXT SSR request keys\n // its settings query on the same scope the client does. rootBeforeLoad also calls\n // this, but only from a client-side navigation: on the initial load TanStack\n // restores the root match's __beforeLoadContext instead of re-running beforeLoad,\n // so a visitor who never navigates would otherwise never write the cookie. Here is\n // the earliest point salla.storage is guaranteed populated.\n syncScopeCookie();\n\n setReady(true);\n document.dispatchEvent(new CustomEvent('theme::ready'));\n\n onReady?.({\n store: storeData,\n theme: themeData,\n });\n };\n\n initSdk();\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Intentional: SDK init runs once per locale change only\n }, [initialLocale]);\n\n return {\n isReady,\n storeData,\n setStoreData,\n themeData,\n currency,\n isMobileWebview,\n };\n}\n","import { useEffect } from 'react';\nimport { isNativeApp } from '../native-app';\nimport { onSallaEvent, whenSallaReady } from '../utils/sdk-helpers';\n\nconst SAFE_AREA_EVENT = 'mobile::ui.safearea';\nconst CSS_VARS = { top: '--app-safe-area-top', bottom: '--app-safe-area-bottom' } as const;\n\n/**\n * Writes the native app's insets (status bar, home indicator) to `--app-safe-area-top` and\n * `--app-safe-area-bottom` on `<html>`, for a theme's CSS to read. The values come from the\n * `mobile::ui.safearea` payload, so a re-emit updates them live. Nothing is registered\n * outside the app (`isNativeApp()`): there the variables stay unset and a\n * consumer falls back to `0px`. The app is recognised once the SDK is ready, not just\n * loaded: one that identifies itself through its config has not said so before `init`.\n *\n * `TwilightProvider` calls this rather than the navigation setup, which loads lazily and\n * would attach later than a theme's own root-level listener did.\n */\nexport function useNativeSafeArea(): void {\n useEffect(() => {\n let off: (() => void) | undefined;\n const cancel = whenSallaReady(() => {\n if (isNativeApp()) off = onSallaEvent(SAFE_AREA_EVENT, applySafeArea);\n });\n return () => {\n cancel();\n off?.();\n };\n }, []);\n}\n\ntype SafeAreaPayload = { value?: unknown; top?: unknown; bottom?: unknown };\n\n/**\n * `{ top, bottom }` in pixels, as numbers or numeric strings (`{\"top\":\"62\",\"bottom\":\"8\"}`);\n * the legacy payload is the top inset alone, as `{ value }`. Also read when the app sends\n * the whole bridge envelope, `{ event, details: { top, bottom } }`.\n */\nfunction applySafeArea(data?: unknown): void {\n const raw = data as (SafeAreaPayload & { details?: SafeAreaPayload }) | undefined;\n const payload = raw?.details && typeof raw.details === 'object' ? raw.details : raw;\n for (const side of ['top', 'bottom'] as const) {\n const px = Number(side === 'top' ? (payload?.top ?? payload?.value) : payload?.bottom);\n if (Number.isFinite(px)) {\n document.documentElement.style.setProperty(CSS_VARS[side], `${px}px`);\n }\n }\n}\n","import { useEffect } from 'react';\nimport { isNativeApp } from '../native-app';\nimport { getSallaSDK, whenSallaReady } from '../utils/sdk-helpers';\n\n/** The SDK's opt-in for an SPA storefront inside the Salla app (`salla.mobile.isSpaWebview()`). */\nconst SPA_WEBVIEW_FLAG = 'theme.is_spa_webview';\n\n/**\n * Inside the Salla app, tells the SDK this storefront is the app's SPA shell\n * (`theme.is_spa_webview`). The SDK and Salla's components keep their native\n * hand-offs behind that flag, so with it set:\n * - `salla.cart.submit()` (every checkout button) opens the app's checkout\n * (`mobile::checkout.open`) instead of loading the checkout page in the webview;\n * - `<salla-scopes>` opens the app's branch sheet (`mobile::scope.open`).\n *\n * A value the app or the store config already gives (even `false`) is kept.\n * Nothing happens outside the app.\n */\nexport function useNativeSpaWebview(): void {\n useEffect(\n () =>\n whenSallaReady(() => {\n if (!isNativeApp()) return;\n const config = getSallaSDK()?.config;\n if (config && config.get(SPA_WEBVIEW_FLAG) == null) config.set(SPA_WEBVIEW_FLAG, true);\n }),\n []\n );\n}\n","import { lazy, type LazyExoticComponent, type FC, type ReactNode } from 'react';\n\nexport const navigationSetups: Record<string, LazyExoticComponent<FC<{ children: ReactNode }>>> = {\n tanstack: lazy(() =>\n import('../tanstack/navigation').then((m) => ({ default: m.NavigationSetup }))\n ),\n nextjs: lazy(() => import('../nextjs/navigation').then((m) => ({ default: m.NavigationSetup }))),\n};\n","import { lazy, type FC, type LazyExoticComponent } from 'react';\n\n/**\n * Registry for framework-specific document sync components.\n * Each framework (tanstack, nextjs, etc.) can register its own sync component.\n * Used by TwilightProvider to automatically apply route-based body classes.\n *\n * @example Adding a new framework\n * ```ts\n * import { registerDocumentSync } from '@salla.sa/twilight-theme-engine';\n *\n * registerDocumentSync('my-framework', lazy(() => import('./my-document-sync')));\n * ```\n */\nexport const routeDocumentSyncs: Record<string, LazyExoticComponent<FC>> = {\n tanstack: lazy(() =>\n import('../tanstack/document-class').then((m) => ({\n default: m.TanStackDocumentSync,\n }))\n ),\n // Add other frameworks here:\n // nextjs: lazy(() => import('../nextjs/document-sync').then(m => ({ default: m.NextjsDocumentSync }))),\n};\n\n/**\n * Register a framework-specific document sync component.\n * Convenience function for adding new frameworks to the registry.\n */\nexport function registerDocumentSync(framework: string, component: LazyExoticComponent<FC>): void {\n routeDocumentSyncs[framework] = component;\n}\n","import { useTranslation } from '../providers/I18nProvider';\n\ntype DateFormat = 'full' | 'long' | 'medium' | 'short' | 'time';\n\nexport type DateInput =\n | string\n | number\n | Date\n | { date: string; timezone_type: number; timezone: string }\n | undefined;\n\nfunction normalizeDate(input: DateInput): Date {\n if (!input) return new Date();\n if (input instanceof Date) return input;\n if (typeof input === 'number') return new Date(input);\n if (typeof input === 'object' && 'date' in input) return new Date(input.date);\n return new Date(input);\n}\n\nexport interface UseDateResult {\n format: (date: DateInput, formatType?: DateFormat) => string;\n ago: (date: DateInput) => string;\n now: Date;\n}\n\n/**\n * useDate - Hook for formatting dates\n *\n * @example\n * const { format, ago, now } = useDate();\n * format('2024-03-15') // 'March 15, 2024'\n * format('2024-03-15', 'full') // 'Friday, March 15, 2024'\n * ago(Date.now() - 3600000) // '1 hour ago'\n * now // current Date object\n */\nexport function useDate(): UseDateResult {\n const { locale } = useTranslation();\n\n const format = (date: DateInput, formatType: DateFormat = 'medium'): string => {\n const dateObj = normalizeDate(date);\n\n const formatOptionsMap: Record<DateFormat, Intl.DateTimeFormatOptions> = {\n full: { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' },\n long: { year: 'numeric', month: 'long', day: 'numeric' },\n medium: { year: 'numeric', month: 'long', day: 'numeric' },\n short: { year: 'numeric', month: 'short', day: 'numeric' },\n time: { hour: '2-digit', minute: '2-digit' },\n };\n\n try {\n return new Intl.DateTimeFormat(locale, formatOptionsMap[formatType]).format(dateObj);\n } catch {\n return dateObj.toLocaleDateString(locale);\n }\n };\n\n const ago = (date: DateInput): string => {\n const dateObj = normalizeDate(date);\n const diffInSeconds = Math.floor((Date.now() - dateObj.getTime()) / 1000);\n\n const units: Array<{ unit: Intl.RelativeTimeFormatUnit; threshold: number; divisor: number }> =\n [\n { unit: 'year', threshold: 31536000, divisor: 31536000 },\n { unit: 'month', threshold: 2592000, divisor: 2592000 },\n { unit: 'week', threshold: 604800, divisor: 604800 },\n { unit: 'day', threshold: 86400, divisor: 86400 },\n { unit: 'hour', threshold: 3600, divisor: 3600 },\n { unit: 'minute', threshold: 60, divisor: 60 },\n { unit: 'second', threshold: 1, divisor: 1 },\n ];\n\n for (const { unit, threshold, divisor } of units) {\n if (diffInSeconds >= threshold) {\n const value = Math.floor(diffInSeconds / divisor);\n try {\n return new Intl.RelativeTimeFormat(locale, { numeric: 'auto', style: 'long' }).format(\n -value,\n unit\n );\n } catch {\n return new Intl.RelativeTimeFormat('en', { numeric: 'auto' }).format(-value, unit);\n }\n }\n }\n\n return locale.startsWith('ar') ? 'الآن' : 'just now';\n };\n\n return { format, ago, now: new Date() };\n}\n","import { useTwilight } from '../providers/TwilightProvider';\n\nconst ARABIC_NUMERALS = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];\n\nconst toArabic = (input: number | string): string => {\n const str = String(input);\n return str.replace(/[0-9]/g, (d) => ARABIC_NUMERALS[parseInt(d)]);\n};\n\n/**\n * UseNumberResult - Return type for useNumber hook\n */\nexport interface UseNumberResult {\n /** Format number with store settings */\n format: (number: number | string) => string;\n /** Convert to Arabic numerals */\n toArabic: (input: number | string) => string;\n /** Whether Arabic numerals are enabled */\n useArabicNumerals: boolean;\n}\n\n/**\n * useNumber - Hook for number formatting\n *\n * @returns Object with number formatting utilities\n *\n * @example\n * const { format, toArabic, useArabicNumerals } = useNumber();\n * format(1234) // '١٢٣٤' if arabic numbers enabled, else '1234'\n * toArabic(1234) // '١٢٣٤'\n * useArabicNumerals // boolean from store settings\n */\nexport function useNumber(): UseNumberResult {\n const { store } = useTwilight();\n const useArabicNumerals = store?.settings?.arabic_numbers_enabled ?? false;\n\n const format = (number: number | string): string => {\n return useArabicNumerals ? toArabic(number) : String(number);\n };\n\n return {\n /** Format number with store settings */\n format,\n /** Convert to Arabic numerals */\n toArabic,\n /** Whether Arabic numerals are enabled */\n useArabicNumerals,\n };\n}\n","/**\n * Number formatting utilities\n *\n * For React components, use useNumber hook instead.\n */\n\nconst ARABIC_NUMERALS = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];\n\n/**\n * Convert Western Arabic numerals (0-9) to Arabic-Indic numerals (٠-٩)\n *\n * @example\n * toArabicNumerals('123') // '١٢٣'\n */\nexport function toArabicNumerals(input: number | string): string {\n const str = String(input);\n return str.replace(/[0-9]/g, (d) => ARABIC_NUMERALS[parseInt(d)]);\n}\n\n/**\n * Format number with optional Arabic numerals\n *\n * @example\n * formatNumber(1234, true) // '١٢٣٤'\n * formatNumber(1234, false) // '1234'\n */\nexport function formatNumber(number: number | string, useArabic: boolean): string {\n return useArabic ? toArabicNumerals(number) : String(number);\n}\n","import { useTwilight } from '../providers/TwilightProvider';\nimport { toArabicNumerals } from '../utils/number';\nimport React from 'react';\n\nconst SAR_SYMBOLS = ['SAR', 'ر.س'];\n\n/**\n * Parse a money string to a number.\n *\n * Locale-agnostic by design: normalises both Western (`,.`) and\n * Arabic-Indic (`٬`, `٫`) separators using fixed rules. Do NOT add\n * locale-dependent separator logic here — if per-locale rules are\n * ever needed, refactor back into the hook body where `locale`\n * is available.\n */\nconst parse = (moneyString: string): number => {\n const cleaned = moneyString.replace(/[^\\d.,٬٫]/g, '');\n const normalized = cleaned.replace(/٬/g, '').replace(/٫/g, '.');\n const parts = normalized.split(/[.,]/);\n if (parts.length > 2) {\n return parseFloat(`${parts.slice(0, -1).join('')}.${parts[parts.length - 1]}`);\n }\n return parseFloat(normalized.replace(/,/g, ''));\n};\n\n/**\n * Check if a value is a valid monetary amount.\n *\n * Locale-agnostic: accepts numbers and numeric strings only.\n */\nconst isValid = (value: unknown): boolean => {\n if (typeof value === 'number' && !isNaN(value) && isFinite(value)) return true;\n if (typeof value === 'string') {\n const parsed = parseFloat(value);\n return !isNaN(parsed) && isFinite(parsed);\n }\n return false;\n};\n\n/**\n * UseMoneyResult - Return type for useMoney hook\n */\nexport interface UseMoneyResult {\n /** Format amount with currency */\n format: (\n amount: number | string | undefined,\n options?: { currency?: string; locale?: string; type?: 'product' | 'general' }\n ) => React.ReactNode;\n /** Parse money string to number */\n parse: (moneyString: string) => number;\n /** Check if value is valid monetary amount */\n isValid: (value: unknown) => boolean;\n}\n\n/**\n * useMoney - Hook for formatting monetary values, matching Twilight's `salla.money`\n *\n * @example\n * const { format, parse, isValid } = useMoney();\n * // Render price (SAR shows the icon when the store enables it):\n * <span>{format(100)}</span> // '100' with <i className=\"sicon-sar\" />\n */\nexport function useMoney(): UseMoneyResult {\n const { store, settings, currency: active } = useTwilight();\n const useArabicNumerals = store?.settings?.arabic_numbers_enabled ?? false;\n const useSarSymbol = store?.settings?.use_sar_symbol ?? false;\n\n const format = (\n amount: number | string | undefined,\n options?: { currency?: string; locale?: string; type?: 'product' | 'general' }\n ): React.ReactNode => {\n const currency = options?.currency ?? active?.code ?? 'SAR';\n const type = options?.type ?? 'product';\n\n if (amount == null || amount === '') {\n const showDash = type === 'product' ? store?.settings?.product?.show_price_as_dash : false;\n return showDash ? '-' : '';\n }\n\n if (typeof amount === 'string' && amount === '-') return amount;\n if (isNaN(typeof amount === 'string' ? parseFloat(amount) : amount)) return String(amount);\n\n // Printed as given, like salla.money: \"10.50\" keeps its zero.\n const number = useArabicNumerals ? toArabicNumerals(amount).replace('.', '٫') : String(amount);\n const symbol = settings?.currencies?.[currency]?.symbol ?? currency;\n\n if (useSarSymbol && SAR_SYMBOLS.includes(symbol)) {\n return (\n <>\n {number} <i className=\"sicon-sar\" />\n </>\n );\n }\n return `${number} ${symbol}`;\n };\n\n return { format, parse, isValid };\n}\n","import { useCallback } from 'react';\nimport type { Product, Cart, CartItem } from '../types';\nimport { useTwilight } from '../providers/TwilightProvider';\nimport { useUser } from './useUser';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UseGtmResult {\n /** Check if GTM is enabled */\n enabled: boolean;\n /** Raw push to dataLayer */\n push: (data: Record<string, unknown>) => void;\n /** Track page view */\n viewPage: (pageType: string) => void;\n /** Track product detail view */\n detail: (product: Product) => void;\n /** Track product impressions (listing) */\n impressions: (products: Product[], list?: string) => void;\n /** Track product click */\n click: (product: Product, list?: string, position?: number) => void;\n /** Track add to cart */\n add: (product: Product, quantity?: number) => void;\n /** Track remove from cart */\n remove: (item: CartItem) => void;\n /** Track checkout */\n checkout: (cart: Cart, step?: number) => void;\n /** Track purchase */\n purchase: (orderId: string | number, cart: Cart) => void;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Generate unique event ID */\nfunction eventId(prefix: string): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/** Convert Product to GTM format */\nfunction toProduct(product: Product, overrides?: Record<string, unknown>): Record<string, unknown> {\n return {\n id: product.id,\n name: product.name,\n price: product.sale_price,\n brand: product.brand?.name,\n category: product.category?.name,\n quantity: 1,\n ...overrides,\n };\n}\n\n/** Get currency from product or fallback */\nfunction getCurrency(product?: Product, fallback = 'SAR'): string {\n return product?.currency ?? fallback;\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * useGtm - Google Tag Manager hook for tracking events\n *\n * @example\n * ```tsx\n * function ProductPage({ product }) {\n * const gtm = useGtm();\n *\n * useEffect(() => { gtm.detail(product); }, [product.id]);\n * return <button onClick={() => gtm.add(product)}>Add to Cart</button>;\n * }\n * ```\n */\nexport function useGtm(): UseGtmResult {\n const { store } = useTwilight();\n const { data: user } = useUser();\n\n const gtmIds = store.settings?.keys?.gtm;\n const enabled = !!(gtmIds && gtmIds.length > 0);\n const currency = user?.preferences?.currency_code ?? 'SAR';\n\n const push = useCallback(\n (data: Record<string, unknown>) => {\n if (!enabled) return;\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(data);\n },\n [enabled]\n );\n\n const viewPage = useCallback((pageType: string) => push({ event: 'viewPage', pageType }), [push]);\n\n const detail = useCallback(\n (product: Product) =>\n push({\n event: 'detail',\n ecommerce: {\n currencyCode: getCurrency(product, currency),\n event_id: eventId('detail'),\n detail: { products: [toProduct(product)] },\n },\n }),\n [push, currency]\n );\n\n const impressions = useCallback(\n (products: Product[], list?: string) => {\n if (products.length === 0) return;\n push({\n event: 'impressions',\n ecommerce: {\n currencyCode: getCurrency(products[0], currency),\n event_id: eventId('impressions'),\n impressions: {\n products: products.map((p, i) => toProduct(p, { position: i + 1, list })),\n },\n },\n });\n },\n [push, currency]\n );\n\n const click = useCallback(\n (product: Product, list?: string, position?: number) =>\n push({\n event: 'click',\n ecommerce: {\n currencyCode: getCurrency(product, currency),\n event_id: eventId('click'),\n click: {\n actionField: { list },\n products: [toProduct(product, { position, list })],\n },\n },\n }),\n [push, currency]\n );\n\n const add = useCallback(\n (product: Product, quantity = 1) =>\n push({\n event: 'addToCart',\n ecommerce: {\n currencyCode: getCurrency(product, currency),\n event_id: eventId('addToCart'),\n add: { products: [toProduct(product, { quantity })] },\n },\n }),\n [push, currency]\n );\n\n const remove = useCallback(\n (item: CartItem) =>\n push({\n event: 'removeFromCart',\n ecommerce: {\n currencyCode: currency,\n event_id: eventId('removeFromCart'),\n remove: {\n products: [\n {\n id: item.product_id,\n name: item.product_name,\n price: typeof item.price === 'number' ? item.price : item.price.amount,\n quantity: item.quantity,\n },\n ],\n },\n },\n }),\n [push, currency]\n );\n\n const checkout = useCallback(\n (cart: Cart, step = 1) =>\n push({\n event: 'checkout',\n ecommerce: {\n currencyCode: currency,\n event_id: eventId('checkout'),\n checkout: {\n actionField: { step, id: cart.id },\n products: cart.items.map((item) => ({\n id: item.product_id,\n name: item.product_name,\n price: typeof item.price === 'number' ? item.price : item.price.amount,\n quantity: item.quantity,\n })),\n },\n },\n }),\n [push, currency]\n );\n\n const purchase = useCallback(\n (orderId: string | number, cart: Cart) =>\n push({\n event: 'purchase',\n ecommerce: {\n currencyCode: currency,\n event_id: eventId('purchase'),\n purchase: {\n actionField: {\n id: orderId,\n revenue: cart.total,\n tax: cart.tax_amount,\n coupon: cart.coupon,\n },\n products: cart.items.map((item) => ({\n id: item.product_id,\n name: item.product_name,\n price: typeof item.price === 'number' ? item.price : item.price.amount,\n quantity: item.quantity,\n })),\n },\n },\n }),\n [push, currency]\n );\n\n return { enabled, push, viewPage, detail, impressions, click, add, remove, checkout, purchase };\n}\n","import { useMemo } from 'react';\nimport { useTranslation } from '../providers/I18nProvider';\nimport type { OpeningHoursSettings } from '../types';\n\ntype DayOfWeek = 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday';\n\nconst DAYS: DayOfWeek[] = [\n 'monday',\n 'tuesday',\n 'wednesday',\n 'thursday',\n 'friday',\n 'saturday',\n 'sunday',\n];\n\nconst DAY_NAMES: Record<string, string> = {\n monday: 'common.days.monday',\n tuesday: 'common.days.tuesday',\n wednesday: 'common.days.wednesday',\n thursday: 'common.days.thursday',\n friday: 'common.days.friday',\n saturday: 'common.days.saturday',\n sunday: 'common.days.sunday',\n};\n\nconst TIME_NAMES: Record<string, string> = {\n AM: 'common.time.am',\n PM: 'common.time.pm',\n};\n\ninterface ParsedTimeRange {\n start: number; // minutes from midnight\n end: number; // minutes from midnight\n}\n\ninterface DaySchedule {\n ranges: ParsedTimeRange[];\n}\n\nexport interface UseOpeningHoursResult {\n /** Whether the store is currently open */\n isOpen: boolean;\n /** Whether opening hours feature is enabled and configured */\n isEnabled: boolean;\n /** Next opening time as Date object, null if currently open or not configured */\n nextOpen: Date | null;\n /** Formatted next opening time string, empty if currently open or not configured */\n nextOpenFormatted: string;\n}\n\n/**\n * Parse a time string like \"09:00\" or \"9:00 AM\" to minutes from midnight.\n */\nfunction parseTime(timeStr: string): number {\n const cleaned = timeStr.trim().toLowerCase();\n const match = cleaned.match(/^(\\d{1,2}):(\\d{2})(?:\\s*(am|pm))?$/);\n\n if (!match) {\n return 0;\n }\n\n let hours = parseInt(match[1], 10);\n const minutes = parseInt(match[2], 10);\n const meridiem = match[3];\n\n if (meridiem === 'pm' && hours < 12) {\n hours += 12;\n } else if (meridiem === 'am' && hours === 12) {\n hours = 0;\n }\n\n return hours * 60 + minutes;\n}\n\n/**\n * Parse opening hours ranges for a day.\n * Input format: [\"09:00-12:00\", \"13:00-18:00\"] or [\"09:00 AM - 12:00 PM\"]\n */\nfunction parseRanges(ranges: string[]): ParsedTimeRange[] {\n return ranges\n .map((range) => {\n const parts = range.split('-').map((s) => s.trim());\n if (parts.length !== 2) return null;\n\n const start = parseTime(parts[0]);\n const end = parseTime(parts[1]);\n\n return { start, end };\n })\n .filter((r): r is ParsedTimeRange => r !== null && r.start < r.end);\n}\n\n/**\n * Convert day index (0 = Monday) to day name.\n */\nfunction indexToDay(index: number): DayOfWeek {\n return DAYS[index % 7];\n}\n\n/**\n * Get the day index for a date (0 = Monday, 6 = Sunday).\n */\nfunction getDayIndex(date: Date): number {\n const jsDay = date.getDay(); // 0 = Sunday, 1 = Monday, etc.\n return jsDay === 0 ? 6 : jsDay - 1; // Convert to 0 = Monday\n}\n\n/**\n * Get current time in minutes from midnight.\n */\nfunction getTimeInMinutes(date: Date): number {\n return date.getHours() * 60 + date.getMinutes();\n}\n\n/**\n * Check if the given time falls within any of the ranges.\n */\nfunction isInRanges(time: number, ranges: ParsedTimeRange[]): boolean {\n return ranges.some((range) => time >= range.start && time < range.end);\n}\n\n/**\n * Find the next time range that starts after the given time.\n */\nfunction findNextRange(time: number, ranges: ParsedTimeRange[]): ParsedTimeRange | null {\n const sorted = [...ranges].sort((a, b) => a.start - b.start);\n return sorted.find((range) => range.start > time) ?? null;\n}\n\n/**\n * useOpeningHours - Hook for checking store opening status and next open time.\n *\n * @param settings - Opening hours settings from the store\n * @returns Opening status information\n *\n * @example\n * ```tsx\n * const { isOpen, nextOpenFormatted } = useOpeningHours(store.settings.opening_hours);\n *\n * if (!isOpen) {\n * return <div>Store closed. Opens at {nextOpenFormatted}</div>;\n * }\n * ```\n */\nexport function useOpeningHours(settings?: OpeningHoursSettings): UseOpeningHoursResult {\n const { t } = useTranslation();\n\n return useMemo(() => {\n if (!settings?.enabled || !settings?.hours) {\n return {\n isOpen: true, // Assume open if not configured\n isEnabled: false,\n nextOpen: null,\n nextOpenFormatted: '',\n };\n }\n\n const hours = settings.hours;\n const now = new Date();\n const currentDayIndex = getDayIndex(now);\n const currentTime = getTimeInMinutes(now);\n\n // Build schedule for all days\n const schedule: Record<DayOfWeek, DaySchedule> = {} as Record<DayOfWeek, DaySchedule>;\n for (const day of DAYS) {\n const dayRanges = hours[day];\n schedule[day] = {\n ranges: dayRanges ? parseRanges(dayRanges) : [],\n };\n }\n\n // Check if currently open\n const todaySchedule = schedule[indexToDay(currentDayIndex)];\n if (isInRanges(currentTime, todaySchedule.ranges)) {\n return {\n isOpen: true,\n isEnabled: true,\n nextOpen: null,\n nextOpenFormatted: '',\n };\n }\n\n // Find next open time\n // Check remaining ranges today\n const nextRangeToday = findNextRange(currentTime, todaySchedule.ranges);\n if (nextRangeToday) {\n const nextOpen = new Date(now);\n nextOpen.setHours(Math.floor(nextRangeToday.start / 60), nextRangeToday.start % 60, 0, 0);\n\n return {\n isOpen: false,\n isEnabled: true,\n nextOpen,\n nextOpenFormatted: formatNextOpen(nextOpen, t),\n };\n }\n\n // Check subsequent days (up to 7 days ahead)\n for (let i = 1; i <= 7; i++) {\n const nextDayIndex = (currentDayIndex + i) % 7;\n const nextDayName = indexToDay(nextDayIndex);\n const nextDaySchedule = schedule[nextDayName];\n\n if (nextDaySchedule.ranges.length > 0) {\n // Get the first range of that day\n const firstRange = [...nextDaySchedule.ranges].sort((a, b) => a.start - b.start)[0];\n\n const nextOpen = new Date(now);\n nextOpen.setDate(nextOpen.getDate() + i);\n nextOpen.setHours(Math.floor(firstRange.start / 60), firstRange.start % 60, 0, 0);\n\n return {\n isOpen: false,\n isEnabled: true,\n nextOpen,\n nextOpenFormatted: formatNextOpen(nextOpen, t),\n };\n }\n }\n\n // No opening hours found in the next week - assume open\n return {\n isOpen: true,\n isEnabled: true,\n nextOpen: null,\n nextOpenFormatted: '',\n };\n }, [settings, t]);\n}\n\n/**\n * Format the next open time similar to the PHP widget.\n * Output: \"Sunday 09:00 AM\" (translated)\n */\nfunction formatNextOpen(date: Date, t: (key: string) => string): string {\n const dayName = t(DAY_NAMES[indexToDay(getDayIndex(date))]);\n const hours = date.getHours();\n const minutes = date.getMinutes().toString().padStart(2, '0');\n const isPM = hours >= 12;\n const displayHours = hours > 12 ? hours - 12 : hours === 0 ? 12 : hours;\n const meridiem = t(TIME_NAMES[isPM ? 'PM' : 'AM']);\n\n return `${dayName} ${displayHours}:${minutes} ${meridiem}`;\n}\n","import { useEffect, useRef } from 'react';\nimport { whenSallaLoaded } from '../utils/sdk-helpers';\n\n/**\n * Page config data structure for salla.config.set('page', ...)\n */\nexport interface PageConfigData {\n slug: string;\n id?: string | number;\n title: string;\n /** Optional - defaults to current location pathname + search */\n url?: string;\n parent?: { id: string | number; name: string; url: string } | null;\n}\n\n/**\n * usePageConfig - Centralized hook for setting salla.config.page\n *\n * Replaces scattered salla?.config?.set('page', ...) calls across multiple pages.\n * Handles optional salla object safely.\n * Automatically uses current URL from router context if url not provided.\n *\n * @param pageData - Page configuration data to set\n *\n * @example\n * ```tsx\n * // URL is auto-detected from router context\n * usePageConfig({\n * slug: 'product.index',\n * id: categoryId,\n * title: category.name,\n * });\n *\n * // With explicit URL override\n * usePageConfig({\n * slug: 'product.index',\n * id: categoryId,\n * title: category.name,\n * url: '/custom-url',\n * });\n * ```\n */\nexport function usePageConfig(pageData: PageConfigData): void {\n const pageDataRef = useRef(pageData);\n pageDataRef.current = pageData;\n\n useEffect(\n () =>\n whenSallaLoaded((salla) => {\n if (!salla.config?.set) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('[usePageConfig] salla.config.set not available. Page config not set.');\n }\n return;\n }\n\n const current = pageDataRef.current;\n // A page can render without loader page data (tests, custom mounts) — nothing to seed.\n if (!current) return;\n const url = current.url ?? window.location.pathname + window.location.search;\n\n salla.config.set('page', {\n ...current,\n url,\n });\n }),\n []\n );\n}\n","import type { Breadcrumb } from '../types';\n\nconst BREADCRUMB_REFERRER_KEY = 'breadcrumb-referrer';\n\nexport function getBreadcrumbReferrer(): Breadcrumb | null {\n try {\n const raw = sessionStorage.getItem(BREADCRUMB_REFERRER_KEY);\n if (!raw) return null;\n const { name, url } = JSON.parse(raw);\n return typeof name === 'string' && typeof url === 'string' ? { name, url } : null;\n } catch {\n return null;\n }\n}\n\nexport function setBreadcrumbReferrer(breadcrumb: Breadcrumb): void {\n try {\n sessionStorage.setItem(BREADCRUMB_REFERRER_KEY, JSON.stringify(breadcrumb));\n } catch {\n // sessionStorage unavailable (private browsing quota, etc.)\n }\n}\n","import { useMemo, useEffect, useState } from 'react';\nimport { useLocation, useIsHome } from '../providers/NavigationProvider';\nimport { useTranslation } from '../providers/I18nProvider';\nimport { getBreadcrumbReferrer, setBreadcrumbReferrer } from '../utils/breadcrumb';\nimport type { Breadcrumb, Page } from '../types';\n\nexport function useBreadcrumbs(page?: Page | null): Breadcrumb[] {\n const location = useLocation();\n const isHome = useIsHome();\n const { t } = useTranslation();\n\n const [referrerCrumb, setReferrerCrumb] = useState<Breadcrumb | null>(null);\n\n useEffect(() => {\n if (page?.slug === 'product.single') {\n const ref = getBreadcrumbReferrer();\n if (ref) setReferrerCrumb(ref);\n return;\n }\n\n setReferrerCrumb(null);\n\n if (!isHome && page) {\n setBreadcrumbReferrer({ name: page.title, url: location.pathname + location.searchStr });\n }\n }, [page, isHome, location.pathname, location.searchStr]);\n\n return useMemo(() => {\n if (!page) return [];\n\n if (page.breadcrumbs?.length) {\n if (page.slug === 'product.single' && referrerCrumb) {\n const last = page.breadcrumbs.at(-1);\n return last ? [page.breadcrumbs[0], referrerCrumb, last] : page.breadcrumbs;\n }\n return page.breadcrumbs;\n }\n\n if (isHome) return [];\n\n const home: Breadcrumb = { name: t('common.titles.home'), url: '/' };\n return [home, { name: page.title, url: location.pathname }];\n }, [isHome, location.pathname, page, t, referrerCrumb]);\n}\n","/**\n * `salla-add-product-button` renders its quick-buy widget only when an element with this id exists\n * at render time. The body:end default hook keeps a src-less marker with this id in the DOM on every\n * page; the widget code itself is loaded by `fastCheckoutScript()` (eager from the product route\n * head, on idle elsewhere) and deduped by src, not by id.\n */\nexport const FAST_CHECKOUT_SCRIPT_ID = 'fast-checkout-js';\nexport const FAST_CHECKOUT_SCRIPT_URL =\n 'https://cdn.assets.salla.network/mini-checkout/widget/widget.esm.js?v=0.0.9';\n\nexport const fastCheckoutScript = () => ({ type: 'module', src: FAST_CHECKOUT_SCRIPT_URL });\n\n/**\n * Appends the widget script unless one with the same src is already in the document. On a product\n * page's first load TanStack has removed its own head tag by the time this runs, so a second tag can\n * land; that is harmless, the module map serves the same URL without refetching or re-evaluating.\n */\nexport function injectFastCheckoutScript(): void {\n if (document.querySelector(`script[src=\"${FAST_CHECKOUT_SCRIPT_URL}\"]`)) return;\n const s = document.createElement('script');\n Object.assign(s, fastCheckoutScript());\n document.head.appendChild(s);\n}\n","/**\n * Auto-registered default hooks for tracking/notification components.\n *\n * This module is imported automatically by hooks/index.ts to register\n * default handlers for body:start and body:end hooks.\n *\n * All handlers check conditions at render time via twilight context,\n * so they work without any setup from theme-custom.\n */\n\nimport React, { lazy, Suspense, useEffect } from 'react';\nimport { hookRegistry } from './HookRegistry';\nimport { HookName } from '../types/hooks';\nimport type { HookContext } from './HookSlot';\nimport { useUser } from './useUser';\nimport { FAST_CHECKOUT_SCRIPT_ID, injectFastCheckoutScript } from '../utils/fast-checkout';\n\n// Lazy load tracking/notification components from theme-engine\nconst GoogleTagBody = lazy(() =>\n import('../components/tracking/GoogleTag').then((m) => ({ default: m.GoogleTagBody }))\n);\n\nconst TwilightBundles = lazy(() =>\n import('../components/tracking/TwilightBundles').then((m) => ({ default: m.TwilightBundles }))\n);\n\nconst LazySiftSnippet = lazy(() =>\n import('../components/tracking/SiftSnippet').then((m) => ({ default: m.SiftSnippet }))\n);\n\nconst LazyStoreClosedNotification = lazy(() =>\n import('../components/store/StoreClosedNotification').then((m) => ({\n default: m.StoreClosedNotification,\n }))\n);\n\n// Lazy load cart widget components\nconst LazyPriceQuoteButton = lazy(() =>\n import('../components/cart/PriceQuoteButton').then((m) => ({ default: m.PriceQuoteButton }))\n);\n\nconst LazyPreOrderNotification = lazy(() =>\n import('../components/cart/PreOrderNotification').then((m) => ({\n default: m.PreOrderNotification,\n }))\n);\n\n/**\n * GTM handler - renders GoogleTagBody if store has GTM keys configured.\n */\nfunction gtmHandler({ twilight }: HookContext): React.ReactNode {\n if (!twilight?.store?.settings?.keys?.gtm?.length) {\n return null;\n }\n\n return (\n <Suspense fallback={null}>\n <GoogleTagBody gtmIds={twilight.store.settings.keys.gtm} />\n </Suspense>\n );\n}\n\n/**\n * Sift handler - renders SiftSnippet if store has sift key configured.\n */\nfunction useSiftHandler({ twilight }: HookContext): React.ReactNode {\n const { data: user } = useUser();\n\n if (!twilight?.store?.settings?.keys?.sift) {\n return null;\n }\n\n const customerId = user?.type === 'user' && user.id ? String(user.id) : '';\n\n return (\n <Suspense fallback={null}>\n <LazySiftSnippet beaconKey={twilight.store.settings.keys.sift} customerId={customerId} />\n </Suspense>\n );\n}\n\n/**\n * Store closed notification handler - renders if opening hours feature is enabled.\n */\nfunction storeClosedHandler({ twilight }: HookContext): React.ReactNode {\n if (!twilight?.store?.settings?.opening_hours?.enabled) {\n return null;\n }\n\n return (\n <Suspense fallback={null}>\n <LazyStoreClosedNotification />\n </Suspense>\n );\n}\n\n/**\n * Quick-buy widget presence + lazy loader. `salla-add-product-button` only checks that\n * `#fast-checkout-js` exists when it renders, so a src-less marker with that id is kept in the\n * body on every page: it survives hydration (TanStack drops head scripts after hydrating) and is\n * there before any app or custom JS renders a quick-buy button. An early `<salla-mini-checkout-widget>`\n * simply upgrades once the code lands. The code is loaded eagerly by the product route head and,\n * elsewhere, appended once the page is idle so it stays off the critical chain.\n */\nfunction FastCheckoutTag(): React.JSX.Element {\n useEffect(() => {\n if (typeof window.requestIdleCallback === 'function') {\n const id = window.requestIdleCallback(injectFastCheckoutScript);\n return () => window.cancelIdleCallback(id);\n }\n const id = window.setTimeout(injectFastCheckoutScript, 2000);\n return () => window.clearTimeout(id);\n }, []);\n return <script id={FAST_CHECKOUT_SCRIPT_ID} type=\"module\" />;\n}\n\n/**\n * Fast checkout handler - keeps the quick-buy marker in the DOM and lazily loads the widget when\n * quick purchase (`store.settings.buy_now`) is on.\n */\nfunction fastCheckoutHandler({ twilight }: HookContext): React.ReactNode {\n if (!twilight?.store?.settings?.buy_now) {\n return null;\n }\n\n return <FastCheckoutTag />;\n}\n\n/**\n * Twilight bundles handler - always renders (core tracking).\n */\nfunction bundlesHandler(): React.ReactNode {\n return (\n <Suspense fallback={null}>\n <TwilightBundles />\n </Suspense>\n );\n}\n\n/**\n * Price quote handler - renders if price-quote feature is enabled.\n * Twig: PriceQuoteWidget - checks feature('price-quote')->isAccessibleForCustomers()\n */\nfunction priceQuoteHandler({ twilight }: HookContext): React.ReactNode {\n // TODO: support price_quote in store settings API response\n if (!twilight?.store?.settings?.features?.price_quote) {\n return null;\n }\n\n return (\n <Suspense fallback={null}>\n <LazyPriceQuoteButton />\n </Suspense>\n );\n}\n\n/**\n * Pre-order notification handler - renders if cart has items with active pre-order campaigns.\n * Twig: PreOrderNotificationWidget - checks cart items for getHasActivePreorderCampaign()\n */\nfunction preOrderNotificationHandler({ twilight, cartItems }: HookContext): React.ReactNode {\n if (!twilight?.store?.settings?.features?.['pre-order-campaigns']) {\n return null;\n }\n\n const items = cartItems as\n Array<{ has_pre_order_campaign?: boolean; parent_id?: unknown }> | undefined;\n const hasPreOrder = items?.some((item) => !item.parent_id && item.has_pre_order_campaign);\n\n if (!hasPreOrder) {\n return null;\n }\n\n return (\n <Suspense fallback={null}>\n <LazyPreOrderNotification />\n </Suspense>\n );\n}\n\n/**\n * Register all default hooks from theme-engine.\n * Called automatically on module import.\n *\n * Note: theme-custom can register additional handlers like AddProductToast.\n */\nfunction registerDefaultHooks(): void {\n // Body start hooks (tracking, notifications)\n hookRegistry.register(HookName.BODY_START, gtmHandler, 100);\n hookRegistry.register(HookName.BODY_START, useSiftHandler, 90);\n hookRegistry.register(HookName.BODY_START, storeClosedHandler, 80);\n\n // Body end hooks (bundles)\n hookRegistry.register(HookName.BODY_END, bundlesHandler, 100);\n hookRegistry.register(HookName.BODY_END, fastCheckoutHandler, 90);\n\n // Cart hooks\n hookRegistry.register('cart:submit.start', priceQuoteHandler, 100);\n hookRegistry.register('cart:items.start', preOrderNotificationHandler, 100);\n}\n\n// Auto-register on module load\nregisterDefaultHooks();\n\nexport { registerDefaultHooks };\n","import { lazy, Suspense } from 'react';\nimport { Header } from './Header';\nimport { Footer } from './Footer';\nimport type { LayoutProps } from '../../types';\nimport { useTwilight } from '../../providers/twilight-context';\nimport { useUser } from '../../hooks';\n\nconst SallaLoginModal = lazy(() =>\n import('@salla.sa/twilight-components-react/login-modal').then((m) => ({\n default: m.SallaLoginModal,\n }))\n);\nconst SallaScopes = lazy(() =>\n import('@salla.sa/twilight-components-react/scopes').then((m) => ({\n default: m.SallaScopes,\n }))\n);\nconst SallaOfferModal = lazy(() =>\n import('@salla.sa/twilight-components-react/offer-modal').then((m) => ({\n default: m.SallaOfferModal,\n }))\n);\n\nexport function MasterLayout({ children }: LayoutProps) {\n const { store } = useTwilight();\n const { isLoggedIn } = useUser();\n\n return (\n <>\n <div className=\"app-inner flex flex-col min-h-full\">\n <Header />\n <main id=\"main-content\" role=\"main\" className=\"flex-1\">\n {children}\n </main>\n <Footer />\n </div>\n\n <Suspense>\n <SallaOfferModal />\n </Suspense>\n\n {!isLoggedIn && (\n <Suspense>\n <SallaLoginModal\n isEmailAllowed={store?.settings?.auth?.email_allowed}\n isMobileAllowed={store?.settings?.auth?.mobile_allowed}\n suppressHydrationWarning\n />\n </Suspense>\n )}\n\n {store?.scope && (\n <Suspense>\n <SallaScopes\n selection={store?.scope?.display_as === 'popup' ? 'mandatory' : 'optional'}\n suppressHydrationWarning\n />\n </Suspense>\n )}\n </>\n );\n}\n","import { useEffect, useMemo } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { apps, type AppSnippetRow } from '../../api/apps';\nimport { installAppScope } from '../../utils/app-scope';\nimport { applyThemeHookSlots } from '../../utils/theme-hook-slots';\nimport { getTwilightContext } from '../../twilight/context';\n\n/** How long to wait on the SDK / settings before injecting anyway. */\nconst READY_TIMEOUT_MS = 2500;\n\n// Module-level so StrictMode double-effects and remounts can't inject twice per page load.\nlet injected = false;\n\n/** A snippet plus its app's scope id — the key that resolves its config bucket. */\ntype OwnedSnippet = AppSnippetRow & { appScopeId: string };\n\n/**\n * Appends raw snippet HTML to `target`, recreating each `<script>` — innerHTML-parsed\n * scripts are flagged \"already started\" and never run.\n */\nexport function injectHtml(html: string, target: HTMLElement) {\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n tpl.content.querySelectorAll('script').forEach((inert) => {\n // importmap scripts can't be added post-init; the engine already injects its own.\n if (inert.type === 'importmap') {\n inert.remove();\n return;\n }\n const script = document.createElement('script');\n for (const attr of Array.from(inert.attributes)) {\n script.setAttribute(attr.name, attr.value);\n }\n script.text = inert.text;\n inert.replaceWith(script);\n });\n target.appendChild(tpl.content);\n}\n\n/**\n * Replaces `{{customer.x}}` placeholders with SDK config `user.*` values. Non-`customer.`\n * params are left untouched, matching the classic themes.\n */\nexport function resolveCustomerParams(content: string, params?: string[]): string {\n if (!params?.length) return content;\n for (const param of params) {\n if (!param.startsWith('customer.')) continue;\n const value = String(window.salla?.config?.get(param.replace(/^customer\\./, 'user.')) ?? '');\n // Tolerate inner whitespace (`{{ customer.email }}`); function replacement keeps `value`\n // literal so a `$&` in customer data isn't expanded.\n const escaped = param.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const placeholder = new RegExp(`\\\\{\\\\{\\\\s*${escaped}\\\\s*\\\\}\\\\}`, 'g');\n content = content.replace(placeholder, () => value);\n }\n return content;\n}\n\n/** Resolves after `ms`, so a promise that may never settle can't block injection. */\nconst timeout = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * `onReady` hangs forever if the SDK never initializes; race a timeout so a broken SDK\n * degrades to unsubstituted placeholders instead of dropping every snippet.\n */\nconst waitForSdk = (): Promise<unknown> => {\n const ready = window.salla?.onReady();\n return ready ? Promise.race([ready, timeout(READY_TIMEOUT_MS)]) : Promise.resolve();\n};\n\n/** Holds the snippets' onReady callbacks until all are injected, as on Twig, where they parse before ready. */\nexport function withDeferredOnReady(inject: () => void): void {\n const sdk = window.salla;\n const onReady = sdk?.onReady;\n if (!sdk || typeof onReady !== 'function') return inject();\n\n const queued: Array<() => void> = [];\n sdk.onReady = (callback) =>\n new Promise<void>((resolve, reject) => {\n queued.push(() => onReady.call(sdk, callback).then(resolve, reject));\n });\n try {\n inject();\n } finally {\n sdk.onReady = onReady;\n }\n queued.forEach((run) => run());\n}\n\n/**\n * Whitelists hook slots, installs the config sandbox, then injects the inline snippets.\n * Runs once per page load, after the SDK is ready.\n */\nfunction mountSnippets(\n owned: OwnedSnippet[],\n clientSnippets: OwnedSnippet[],\n buckets: Record<string, Record<string, unknown>>\n): void {\n // Backstop for the inline head copy (see renderThemeHookSlotsScript) — that one runs at\n // parse time, ahead of the snippet scripts; this only covers a head that didn't render.\n applyThemeHookSlots();\n\n // Install before any snippet resolves config. The inline SSR-head install normally got there\n // first (with these buckets, or with none when its prefetch failed), so this either installs\n // the factory or seeds the buckets into it. Pass the complete map once.\n installAppScope({ apps: buckets });\n\n // Flag every CDN scope with a missing bucket (SSR-rendered ones included).\n const unresolved = new Set<string>();\n for (const s of owned) {\n if (s.url && !(s.appScopeId in buckets)) unresolved.add(s.appScopeId);\n }\n\n withDeferredOnReady(() => {\n for (const snippet of clientSnippets) {\n // Honour `place`: a head-placed snippet is often a <meta>/<link>/<style> (site\n // verification, canonical, preload) that crawlers only read inside <head>.\n const target = snippet.place?.includes('head') ? document.head : document.body;\n try {\n injectHtml(resolveCustomerParams(snippet.content, snippet.customer_parameters), target);\n } catch (error) {\n console.error(`[salla] failed to inject snippet for app ${snippet.appScopeId}`, error);\n }\n }\n });\n\n if (unresolved.size) {\n // One line per page, not per snippet; expected during settings-endpoint rollout.\n console.warn(\n `[salla] app settings missing for ${unresolved.size} app(s); their snippets ran without app.* config`,\n [...unresolved]\n );\n }\n}\n\n/** A CDN snippet reduced to what its SSR `<script>` tag needs. */\ninterface SsrCdnScript {\n key: string;\n url: string;\n snippetId?: number;\n appScopeId: string;\n}\n\n/**\n * Mounts installed apps' snippets once per page load:\n * - **CDN** — rendered as SSR `<script>` tags in <body> (see return), so they exist on first\n * paint. `place` doesn't apply: they're deferred scripts, which run in order either way.\n * - **inline** — injected client-side in the effect, into `place`'s target (head or body).\n */\nexport function AppsSnippets() {\n // From twilight context, not useQuery: React Query isn't dehydrated here, so useQuery has no\n // SSR data — but the CDN <script> tags must render server-side.\n const ssrSnippets = getTwilightContext().appsSnippets;\n\n // Client fallback for when the SSR prefetch failed or timed out (it fails open, non-fatal).\n // Without it a single blip on `apps/snippets` would drop every installed app's snippets for\n // the whole page load — no CDN tags, no inline scripts, no hook slots. Retries here because\n // the query's own `retry: 0` exists only to bound the SSR wait.\n const { data: fallbackSnippets } = useQuery({\n ...apps.queries.snippets(),\n enabled: !ssrSnippets,\n retry: 2,\n });\n const data = ssrSnippets ?? fallbackSnippets;\n\n const { data: settings, isSuccess, isError } = useQuery({ ...apps.queries.settings(), retry: 2 });\n\n // Fail open: inject once settings settle either way, so snippets that never read `app.*`\n // aren't dropped when the bucket is empty.\n const settingsSettled = isSuccess || isError;\n\n // Each enabled app's snippets, tagged with its scope id (the encoded `id`). Older payloads\n // lacking `id` get a deterministic per-app fallback sharing one empty bucket.\n const owned = useMemo<OwnedSnippet[]>(\n () =>\n (data ?? [])\n .filter((app) => app.status === 'enabled')\n .flatMap((app) =>\n app.snippets.map((s) => ({ ...s, appScopeId: app.id ?? `unresolved-${app.app_id}` }))\n ),\n [data]\n );\n\n // Every CDN snippet → a real `<script>` tag in the SSR body (rendered below).\n const ssrCdnScripts = useMemo<SsrCdnScript[]>(\n () =>\n owned\n .filter((s) => s.url)\n .map((s, i) => ({\n key: `${s.appScopeId}:${s.id ?? i}`,\n url: s.url as string,\n snippetId: s.id,\n appScopeId: s.appScopeId,\n })),\n [owned]\n );\n\n useEffect(() => {\n if (injected || !data || !settingsSettled) return;\n injected = true;\n\n // Client-injected: inline snippets only. Every CDN snippet is SSR-rendered (below).\n const clientSnippets = owned.filter((s) => !s.url);\n\n // Always wait for the SDK: a snippet body calls the global `salla`/`Salla` (config, hooks,\n // event bus) whether or not it declares customer parameters, and those are only populated\n // after init. The wait is timeout-raced, so a broken SDK still can't strand injection.\n void waitForSdk().then(() => mountSnippets(owned, clientSnippets, settings?.apps ?? {}));\n }, [data, owned, settings, settingsSettled]);\n\n // CDN snippets as classic `defer` scripts: non-blocking, in-order, kept in <body> (React hoists\n // only `async` to <head>), and still exposing `document.currentScript` for the wrapper.\n return (\n <>\n {ssrCdnScripts.map((s) => (\n <script\n key={s.key}\n src={s.url}\n defer\n data-scope-id={s.appScopeId}\n data-snippet-id={s.snippetId != null ? String(s.snippetId) : ''}\n />\n ))}\n </>\n );\n}\n","import type { StoreContext } from '../../api/store';\nimport { resolveTwilightSdkUrl, TICKETING_SCRIPT_URL } from '../../routes/root/head';\n\n/** SDK modules at the end of <body>, ahead of the snippets: same run order as from <head>, later download. */\nexport function SallaSdkScripts({ settings }: { settings?: StoreContext }) {\n return (\n <>\n <script id=\"salla-sdk\" type=\"module\" src={resolveTwilightSdkUrl(settings)} />\n {settings?.store?.settings?.ticketing_system_enabled && (\n <script id=\"salla-ticketing-script\" type=\"module\" src={TICKETING_SCRIPT_URL} />\n )}\n </>\n );\n}\n","import React, { useMemo, Suspense, useState, useEffect, useSyncExternalStore } from 'react';\nimport { WidgetHead } from '../components/layout/WidgetHead';\nimport { HookSlot } from '../hooks/HookSlot';\nimport { HookName } from '../types/hooks';\nimport { DocumentClassProvider } from './DocumentClassProvider';\nimport { TwilightContext } from './twilight-context';\nimport { ThemeDocumentSync } from './twilight-theme';\nimport { useTwilightInit } from './twilight-init';\nimport { useNativeSafeArea } from './native-safe-area';\nimport { useNativeSpaWebview } from './native-spa-webview';\nimport { I18nProvider, FALLBACK_LOCALE } from './I18nProvider';\nimport { NavigationInterceptor } from './NavigationProvider';\nimport { navigationSetups } from './navigation-setups';\nimport { routeDocumentSyncs } from './DocumentSyncRegistry';\nimport { MasterLayout } from '../components/layout/MasterLayout';\nimport { Toaster } from '../components/toast/Toaster';\nimport { AppsSnippets } from '../components/snippets/AppsSnippets';\nimport { SallaSdkScripts } from '../components/snippets/SallaSdkScripts';\nimport {\n getTwilightContext,\n hasTwilightSettings,\n subscribeTwilight,\n updateTwilightContext,\n} from '../twilight/context';\nimport { AUTH_TOKEN_COOKIE_NAME, clearAuthTokenCookie, rememberDevStoreId } from '../utils/cookies';\nimport { whenSallaLoaded } from '../utils/sdk-helpers';\nimport type {\n TwilightContextValue,\n TwilightConfig,\n TwilightProviderProps,\n TwilightLog,\n} from '../types/twilight';\nimport type { StoreContext } from '../api/store';\n\nconst getSalla = () => (typeof window !== 'undefined' ? window.salla : undefined);\n\nconst TWILIGHT_LOG_STYLES = {\n header:\n 'background: linear-gradient(90deg, #7c3aed, #6366f1); color: white; padding: 4px 8px; border-radius: 4px; font-weight: bold;',\n error:\n 'background: #dc2626; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;',\n warn: 'background: #f59e0b; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;',\n info: 'background: #3b82f6; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;',\n label: 'color: #7c3aed; font-weight: bold;',\n value: 'color: inherit;',\n};\n\nexport { useTwilight } from './twilight-context';\nexport type { TwilightProviderProps };\n\nfunction currentSettings(): StoreContext | undefined {\n return hasTwilightSettings() ? getTwilightContext().settings : undefined;\n}\n\nexport function TwilightProvider({\n children,\n debug = false,\n skeleton,\n translations: themeTranslations,\n onReady,\n onError,\n client = { framework: 'tanstack', interceptLinks: true },\n toast = true,\n toastMobilePosition = 'bottom-center',\n addToCartToast = true,\n routeClass = true,\n layout: LayoutComponent = MasterLayout,\n}: TwilightProviderProps): React.ReactElement {\n const ctx = getTwilightContext();\n const initialLocale = ctx.locale || FALLBACK_LOCALE;\n // Subscribed, not read once: a market switch re-runs the root loader with another\n // scope and the router publishes the new settings here, and the theme version they\n // name has its own colours and settings.\n const initialData = useSyncExternalStore(subscribeTwilight, currentSettings, currentSettings);\n\n // Auth token state for React re-renders on login/logout\n const [authToken, setAuthToken] = useState<string | null>(() => {\n if (typeof window !== 'undefined') {\n return ctx.authToken ?? window.localStorage.getItem(AUTH_TOKEN_COOKIE_NAME);\n }\n return null;\n });\n\n useNativeSafeArea();\n useNativeSpaWebview();\n\n // SDK auth event listeners, bound when the SDK arrives — on a cold load, after this runs.\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n let unbind: (() => void) | undefined;\n const cancel = whenSallaLoaded((sdk) => {\n // Symmetric counterpart to handleTokenInvalid's clear below. path=/ + Lax so the\n // cookie is sent on the native webview's top-level navigation to /account/orders,\n // letting twilightMiddleware authenticate the SSR render — the SDK only stores the\n // token in localStorage, which the server can't read.\n const writeAuthCookie = (token: string) => {\n document.cookie = `${AUTH_TOKEN_COOKIE_NAME}=${token}; path=/; max-age=${60 * 60 * 24 * 30}; SameSite=Lax; Secure`;\n };\n\n const clearAuthCookie = clearAuthTokenCookie;\n\n // The SDK only refreshes `user.type` on a full page load, but our auth flows update\n // the UI without one — SDK components read it directly (e.g. salla-login-modal's\n // render bails for 'user' and never creates its inner modal), so keep it in sync.\n const setSdkUserType = (type: 'user' | 'guest') => {\n sdk.config?.set?.('user.type', type);\n };\n\n const handleLogin = () => {\n const newToken = sdk.storage.get(AUTH_TOKEN_COOKIE_NAME) as string | null;\n // logged.in can fire before the token is stored (iframe mirror) — don't clobber\n if (!newToken) return;\n setAuthToken(newToken);\n updateTwilightContext({ authToken: newToken });\n setSdkUserType('user');\n };\n\n // Fires on a fresh token fetch (login / web-session refresh — the native app flow).\n // Mirror the token into a cookie so SSR loads of authenticated pages are authenticated.\n const handleTokenFetched = (token: unknown) => {\n if (typeof token !== 'string' || !token) return;\n setAuthToken(token);\n updateTwilightContext({ authToken: token });\n writeAuthCookie(token);\n setSdkUserType('user');\n };\n\n const handleLogout = () => {\n const wasLoggedIn = Boolean(getTwilightContext().authToken);\n setAuthToken(null);\n updateTwilightContext({ authToken: null });\n setSdkUserType('guest');\n // Clear the SSR cookie too, otherwise a logged-out user's next full-page load\n // would still send a stale token to the server.\n try {\n clearAuthCookie();\n } catch {\n // Cookie removal may fail in restricted environments\n }\n // SDK logout redirects via location.href only after an accounts-iframe roundtrip\n // that can hang forever (iOS webview). If its redirect hasn't unloaded the page\n // by then, reload so SSR re-renders as guest. Guarded to logged-in users so the\n // SDK's force_logout guest flow can't reload-loop.\n if (wasLoggedIn) {\n window.setTimeout(() => window.location.reload(), 3500);\n }\n };\n\n const handleTokenInvalid = () => {\n setAuthToken(null);\n updateTwilightContext({ authToken: null });\n setSdkUserType('guest');\n try {\n window.localStorage.removeItem(AUTH_TOKEN_COOKIE_NAME);\n sdk.storage.remove?.(AUTH_TOKEN_COOKIE_NAME);\n clearAuthCookie();\n } catch {\n // Storage/cookie removal may fail in restricted environments\n }\n };\n\n const listeners: Array<[string, (...args: unknown[]) => void]> = [\n ['auth::logged.in', handleLogin],\n ['auth::logged.out', handleLogout],\n ['auth::token.invalid', handleTokenInvalid],\n ['auth::token.fetched', handleTokenFetched],\n // fires on every token path, and BEFORE logged.in in the login-iframe flow\n ['api::token.injected', handleTokenFetched],\n ];\n listeners.forEach(([name, listener]) => sdk.event.on(name, listener));\n unbind = () => listeners.forEach(([name, listener]) => sdk.event.off(name, listener));\n });\n\n return () => {\n cancel();\n unbind?.();\n };\n }, []);\n\n const { isReady, storeData, setStoreData, themeData, currency, isMobileWebview } =\n useTwilightInit({\n debug,\n initialData,\n onReady,\n onError,\n initialLocale,\n });\n\n const storeId = storeData?.id;\n useEffect(() => rememberDevStoreId(storeId), [storeId]);\n\n const config = useMemo<TwilightConfig>(() => ({ debug }), [debug]);\n\n const log = useMemo<TwilightLog>(\n () => ({\n groupCollapsed: (title) =>\n console.groupCollapsed(`%c ⚡ Twilight: ${title} `, TWILIGHT_LOG_STYLES.header),\n group: (title) => console.group(`%c${title}`, TWILIGHT_LOG_STYLES.label),\n groupEnd: () => console.groupEnd(),\n error: (label, value) =>\n console.log(`%c[${label}]%c`, TWILIGHT_LOG_STYLES.error, TWILIGHT_LOG_STYLES.value, value),\n warn: (label, value) =>\n console.log(`%c[${label}]%c`, TWILIGHT_LOG_STYLES.warn, TWILIGHT_LOG_STYLES.value, value),\n info: (label, value) =>\n console.log(`%c[${label}]%c`, TWILIGHT_LOG_STYLES.info, TWILIGHT_LOG_STYLES.value, value),\n label: (label, value) =>\n console.log(`%c[${label}]%c`, TWILIGHT_LOG_STYLES.label, TWILIGHT_LOG_STYLES.value, value),\n dir: (label, value) => {\n console.log(`%c${label}`, TWILIGHT_LOG_STYLES.label);\n console.dir(value);\n },\n trace: (label, trace) => {\n console.log(`%c${label}`, TWILIGHT_LOG_STYLES.label);\n console.error(trace);\n },\n }),\n []\n );\n\n const contextValue = useMemo<TwilightContextValue>(\n () => ({\n isReady,\n store: storeData,\n _setStore: setStoreData,\n theme: themeData,\n currency,\n config,\n log,\n get salla() {\n return getSalla();\n },\n get settings() {\n return getTwilightContext().settings;\n },\n get locale() {\n return getTwilightContext().locale;\n },\n get routeId() {\n return getTwilightContext().routeId;\n },\n get location() {\n return getTwilightContext().location;\n },\n get authToken() {\n return authToken;\n },\n get i18n() {\n return getTwilightContext().i18n;\n },\n get dir() {\n return getTwilightContext().dir;\n },\n get extras() {\n return getTwilightContext().extras;\n },\n }),\n [isReady, storeData, setStoreData, themeData, currency, config, log, authToken]\n );\n\n const framework = client !== false ? (client?.framework ?? 'tanstack') : null;\n const LazyNavSetup = framework ? navigationSetups[framework] : null;\n const LazyDocumentSync = routeClass && framework ? routeDocumentSyncs[framework] : null;\n const interceptLinks = client !== false && (client?.interceptLinks ?? true);\n\n const documentSyncElement = useMemo(\n () => (LazyDocumentSync ? React.createElement(LazyDocumentSync) : null),\n [LazyDocumentSync]\n );\n\n const readyShell = useMemo(() => {\n if (!isReady) return null;\n return {\n LayoutComponent,\n LazyNavSetup,\n toast,\n toastMobilePosition,\n addToCartToast,\n interceptLinks,\n };\n }, [\n isReady,\n LazyNavSetup,\n LayoutComponent,\n toast,\n toastMobilePosition,\n addToCartToast,\n interceptLinks,\n ]);\n\n const readyContent = useMemo(() => {\n if (!readyShell) return null;\n\n const inner = readyShell.LayoutComponent ? (\n <readyShell.LayoutComponent>{children}</readyShell.LayoutComponent>\n ) : (\n children\n );\n\n const wrapped = (\n <>\n <WidgetHead />\n <HookSlot name={HookName.BODY_START} />\n <Suspense fallback={null}>\n {readyShell.toast && (\n <Toaster\n mobilePosition={readyShell.toastMobilePosition}\n addToCartToast={readyShell.addToCartToast}\n />\n )}\n {readyShell.interceptLinks && <NavigationInterceptor />}\n </Suspense>\n {inner}\n {/* The SDK, then installed apps' snippets (which need it), last so neither downloads ahead of the page. */}\n <SallaSdkScripts settings={initialData} />\n <AppsSnippets />\n <HookSlot name={HookName.BODY_END} />\n </>\n );\n\n if (readyShell.LazyNavSetup) {\n return React.createElement(readyShell.LazyNavSetup, null, wrapped);\n }\n return wrapped;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [readyShell]);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const i18nInstance = useMemo(() => getTwilightContext().i18n, [initialLocale]);\n\n return (\n <DocumentClassProvider>\n <TwilightContext.Provider value={contextValue}>\n <I18nProvider i18nInstance={i18nInstance} themeTranslations={themeTranslations}>\n <ThemeDocumentSync\n theme={themeData}\n locale={initialLocale}\n direction={getTwilightContext().dir}\n isMobileWebview={isMobileWebview}\n />\n {documentSyncElement}\n {!isReady && (\n <div className=\"loading-overlay\">{skeleton || <div className=\"loading-spinner\" />}</div>\n )}\n {readyContent}\n </I18nProvider>\n </TwilightContext.Provider>\n </DocumentClassProvider>\n );\n}\n\nexport default TwilightProvider;\n","import { useCallback } from 'react';\nimport { useTwilight } from '../providers/TwilightProvider';\nimport type { Store } from '../types';\n\n/**\n * UseStoreResult - Return type for useStore hook\n *\n * Extends the Store interface with a refresh method to re-fetch\n * the latest store configuration from the Salla SDK.\n */\nexport interface UseStoreResult extends Store {\n refresh: () => Promise<void>;\n}\n\n/**\n * useStore - Hook for accessing and managing store state\n *\n * Provides access to the store configuration and metadata from the\n * Twilight provider. Includes a refresh method to update the store\n * state with the latest data from the Salla SDK.\n *\n * @returns Store object with refresh() method to reload store data\n *\n * @example\n * ```tsx\n * function StoreInfo() {\n * const { name, currency, refresh } = useStore();\n *\n * return (\n * <div>\n * <h1>{name}</h1>\n * <button onClick={refresh}>Refresh store data</button>\n * <p>Current currency: {currency}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useStore(): UseStoreResult {\n const { store, _setStore, salla } = useTwilight();\n\n const refresh = useCallback(async () => {\n if (!salla) return;\n try {\n const data = salla.config.all();\n if (data?.store && typeof data.store === 'object') {\n _setStore((prev) => ({ ...prev, ...(data.store as Partial<Store>) }));\n }\n } catch {\n // Silently ignore errors - store remains unchanged\n }\n }, [salla, _setStore]);\n\n return { ...store, refresh };\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useTranslation } from './chunk-TYNZ5B2B.js';
|
|
2
2
|
import { useAsyncFn } from './chunk-6BZ5TKEV.js';
|
|
3
|
-
import { whenSallaLoaded, onSallaEvent } from './chunk-
|
|
3
|
+
import { whenSallaLoaded, onSallaEvent } from './chunk-2FKZAAV7.js';
|
|
4
4
|
import { useSyncExternalStore, useCallback } from 'react';
|
|
5
5
|
|
|
6
6
|
var WISHLIST_STORAGE_KEY = "salla::wishlist";
|
|
@@ -126,5 +126,5 @@ function resetWishlistStore() {
|
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
export { resetWishlistStore, useWishlist };
|
|
129
|
-
//# sourceMappingURL=chunk-
|
|
130
|
-
//# sourceMappingURL=chunk-
|
|
129
|
+
//# sourceMappingURL=chunk-KNIGLCRV.js.map
|
|
130
|
+
//# sourceMappingURL=chunk-KNIGLCRV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useWishlist.ts"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useWishlist.ts"],"names":[],"mappings":"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","file":"chunk-KNIGLCRV.js","sourcesContent":["import { useCallback, useSyncExternalStore } from 'react';\nimport { useAsyncFn } from './useAsyncFn';\nimport { useTranslation } from '../providers/I18nProvider';\nimport { onSallaEvent, whenSallaLoaded } from '../utils/sdk-helpers';\nimport type { UseToggleWithItems } from './types';\n\nexport type UseWishlistResult = UseToggleWithItems<number>;\n\n/**\n * useWishlist - Hook for managing wishlist functionality\n *\n * Provides wishlist product management with local storage persistence\n * and Salla SDK integration. Syncs with the SDK's wishlist state and\n * listens for events to maintain real-time consistency.\n *\n * Uses a module-level singleton store so SDK event listeners are\n * registered ONCE globally — not per-component. All hook instances\n * share the same state via `useSyncExternalStore`.\n *\n * @returns Wishlist state and management functions\n *\n * @example\n * ```tsx\n * function WishlistButton({ productId }) {\n * const { has, toggle, loading } = useWishlist();\n *\n * return (\n * <button\n * onClick={() => toggle(productId)}\n * disabled={loading}\n * className={has(productId) ? 'liked' : ''}\n * >\n * ❤️\n * </button>\n * );\n * }\n * ```\n */\n\nconst WISHLIST_STORAGE_KEY = 'salla::wishlist';\n\nlet ids: number[] = [];\nconst listeners = new Set<() => void>();\nlet subscribed = false;\n\nfunction emitChange() {\n for (const listener of listeners) listener();\n}\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\nfunction getSnapshot(): number[] {\n return ids;\n}\n\nconst getServerSnapshot = (): number[] => [];\n\nfunction persistIds() {\n try {\n localStorage.setItem(WISHLIST_STORAGE_KEY, JSON.stringify(ids));\n } catch {\n /* ignore storage errors */\n }\n}\n\nfunction initFromStorage() {\n try {\n // `storage` is missing while `window.salla` is still the head script's stub.\n const sdkWishlist = window.salla?.storage?.get(WISHLIST_STORAGE_KEY, []);\n const stored = localStorage.getItem(WISHLIST_STORAGE_KEY);\n const parsed = stored ? JSON.parse(stored) : [];\n ids = Array.isArray(sdkWishlist) && sdkWishlist.length > 0 ? sdkWishlist : parsed;\n } catch {\n /* ignore storage errors */\n }\n}\n\nfunction reloadFromStorage() {\n initFromStorage();\n emitChange();\n}\n\nfunction ensureSubscribed() {\n if (subscribed || typeof window === 'undefined') return;\n subscribed = true;\n initFromStorage();\n\n // On a cold load hydration runs before the SDK has loaded.\n whenSallaLoaded((salla) => {\n reloadFromStorage();\n if (!salla.wishlist?.event) return;\n\n salla.wishlist.event.onAdded((_event: unknown, id: number) => {\n if (ids.includes(id)) return;\n ids = [...ids, id];\n persistIds();\n emitChange();\n });\n\n salla.wishlist.event.onRemoved((_response: unknown, id: number) => {\n ids = ids.filter((itemId) => itemId !== id);\n persistIds();\n emitChange();\n });\n });\n\n // The SDK fills its storage with the customer's saved wishlist after init.\n onSallaEvent('wishlist::storage.synced', reloadFromStorage);\n}\n\n/**\n * useAsyncFn resolves with whatever the SDK rejected with, and callers detect\n * failure via `instanceof Error`. Normalize non-Error rejections so they are\n * never mistaken for success.\n */\nfunction toError(reason: unknown, fallback: string): Error {\n if (reason instanceof Error) return reason;\n if (typeof reason === 'string') return new Error(reason);\n const message = (reason as { message?: unknown } | null)?.message;\n return new Error(typeof message === 'string' ? message : fallback);\n}\n\nexport function useWishlist(): UseWishlistResult {\n ensureSubscribed();\n const storedIds = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n const { t } = useTranslation();\n const failed = t('common.errors.error_occurred', 'Something went wrong');\n\n const [addState, addFn] = useAsyncFn(\n async (productId: number) => {\n const salla = window.salla;\n try {\n await salla?.wishlist.add(productId);\n } catch (reason) {\n throw toError(reason, failed);\n }\n if (!ids.includes(productId)) {\n ids = [...ids, productId];\n persistIds();\n emitChange();\n }\n },\n [failed]\n );\n\n const [removeState, removeFn] = useAsyncFn(\n async (productId: number) => {\n const salla = window.salla;\n try {\n await salla?.wishlist.remove(productId);\n } catch (reason) {\n throw toError(reason, failed);\n }\n ids = ids.filter((id) => id !== productId);\n persistIds();\n emitChange();\n },\n [failed]\n );\n\n const has = useCallback((productId: number) => storedIds.includes(productId), [storedIds]);\n\n const add = async (productId: number): Promise<boolean> =>\n !(((await addFn(productId)) as unknown) instanceof Error);\n\n const remove = async (productId: number): Promise<boolean> =>\n !(((await removeFn(productId)) as unknown) instanceof Error);\n\n const toggle = useCallback(\n (productId: number) => (has(productId) ? remove(productId) : add(productId)),\n [has, addFn, removeFn]\n );\n\n return {\n ids: storedIds,\n count: storedIds.length,\n has,\n add,\n remove,\n toggle,\n loading: addState.loading || removeState.loading,\n error: (addState.error ?? removeState.error)?.message ?? null,\n };\n}\n\nexport function resetWishlistStore() {\n ids = [];\n listeners.clear();\n subscribed = false;\n}\n"]}
|
|
@@ -4,13 +4,13 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
|
4
4
|
export { BlogSkeleton, BreadcrumbSkeleton, CustomerLayoutSkeleton, CustomerPageSkeleton, PageSkeleton, ProductCardSkeleton, ProductDetailSkeleton, ProductGridSkeleton, SkeletonPulse } from '@salla.sa/twilight-components-react';
|
|
5
5
|
|
|
6
6
|
var LazyBreadcrumb = lazy(
|
|
7
|
-
() => import('./Breadcrumb-
|
|
7
|
+
() => import('./Breadcrumb-2IXFQL6L.js').then((m) => ({ default: m.Breadcrumb }))
|
|
8
8
|
);
|
|
9
9
|
var LazyNoContent = lazy(
|
|
10
10
|
() => import('./NoContent-63TMCPGY.js').then((m) => ({ default: m.NoContent }))
|
|
11
11
|
);
|
|
12
12
|
var LazyRenderWhenVisible = lazy(
|
|
13
|
-
() => import('./RenderWhenVisible-
|
|
13
|
+
() => import('./RenderWhenVisible-KWAXEJOJ.js').then((m) => ({ default: m.RenderWhenVisible }))
|
|
14
14
|
);
|
|
15
15
|
var LazyCurrencySymbol = lazy(
|
|
16
16
|
() => import('./CurrencySymbol-TARAYUOT.js').then((m) => ({ default: m.CurrencySymbol }))
|
|
@@ -153,5 +153,5 @@ function DeferredData({ promise, fallback, children }) {
|
|
|
153
153
|
}
|
|
154
154
|
|
|
155
155
|
export { DeferredData, Image, LazyBreadcrumb, LazyCurrencySymbol, LazyErrorPage, LazyNoContent, LazyRenderWhenVisible, resolveDeferred };
|
|
156
|
-
//# sourceMappingURL=chunk-
|
|
157
|
-
//# sourceMappingURL=chunk-
|
|
156
|
+
//# sourceMappingURL=chunk-KQW6I5CD.js.map
|
|
157
|
+
//# sourceMappingURL=chunk-KQW6I5CD.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/common/lazy.ts","../src/components/common/Image.tsx","../src/components/common/DeferredData.tsx"],"names":["Image","memo","DeferredRenderer","jsx"],"mappings":"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","file":"chunk-OMKLPCBA.js","sourcesContent":["import { lazy } from 'react';\n\n/**\n * Lazy-loaded common components\n * Use these for code-splitting non-critical components\n *\n * NOTE: Skeleton components are sourced from @salla.sa/twilight-components-react\n * because they must render instantly during route transitions.\n */\nexport const LazyBreadcrumb = lazy(() =>\n import('./Breadcrumb').then((m) => ({ default: m.Breadcrumb }))\n);\n\nexport const LazyNoContent = lazy(() =>\n import('./NoContent').then((m) => ({ default: m.NoContent }))\n);\n\nexport const LazyRenderWhenVisible = lazy(() =>\n import('./RenderWhenVisible').then((m) => ({ default: m.RenderWhenVisible }))\n);\n\nexport const LazyCurrencySymbol = lazy(() =>\n import('./CurrencySymbol').then((m) => ({ default: m.CurrencySymbol }))\n);\n\nexport const LazyErrorPage = lazy(() =>\n import('./ErrorPage').then((m) => ({ default: m.ErrorPage }))\n);\n","import { memo } from 'react';\nimport { getCdnImageSrcSet, getCdnImageUrl } from '../../utils/cdn-image';\n\nexport interface ImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n /** Image source URL */\n src?: string;\n /** Alt text for accessibility */\n alt: string;\n /** Whether this image is above the fold / LCP candidate */\n priority?: boolean;\n /** Aspect ratio for CLS prevention (e.g. \"16/9\", \"1/1\", \"4/3\") */\n aspectRatio?: string;\n /** Object fit mode */\n objectFit?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';\n /** Mobile image source for <picture> element */\n mobileSrc?: string;\n /** Mobile breakpoint for <source> media query (default: 768px) */\n mobileBreakpoint?: number;\n /** Skip the wrapper div */\n noWrapper?: boolean;\n /**\n * CDN widths for a density `srcset`. Pass `sizes` so the browser picks a\n * candidate close to the displayed CSS size.\n */\n srcSetWidths?: readonly number[];\n}\n\n/**\n * Optimized Image component with native browser lazy loading.\n *\n * - Uses `loading=\"lazy\"` + `decoding=\"async\"` by default for below-the-fold images.\n * - Uses `loading=\"eager\"` + `fetchPriority=\"high\"` for priority (above-the-fold / LCP) images.\n * - Supports responsive `<picture>` with mobile source.\n * - Provides `aspectRatio` for CLS prevention.\n * - When `srcSetWidths` + `sizes` are set, emits a sized CDN `srcset`.\n */\nexport const Image = memo(function Image({\n src,\n alt,\n priority = false,\n aspectRatio,\n objectFit = 'cover',\n mobileSrc,\n mobileBreakpoint = 768,\n noWrapper = false,\n className = '',\n style,\n width,\n height,\n sizes,\n srcSet: srcSetProp,\n srcSetWidths,\n ...rest\n}: ImageProps) {\n if (!src) return null;\n\n const generatedSrcSet =\n srcSetProp || (srcSetWidths?.length ? getCdnImageSrcSet(src, srcSetWidths) : undefined);\n const generatedMobileSrcSet =\n srcSetWidths?.length && mobileSrc ? getCdnImageSrcSet(mobileSrc, srcSetWidths) : undefined;\n const cdnWidth = srcSetWidths?.length\n ? width != null && srcSetWidths.includes(Number(width))\n ? Number(width)\n : srcSetWidths[0]\n : width;\n // Width-only CDN URLs so `src` matches a srcset candidate for preload.\n const cdnOptions = generatedSrcSet ? { width: cdnWidth } : { width: cdnWidth, height };\n\n const optimizedSrc = getCdnImageUrl(src, cdnOptions);\n const optimizedMobileSrc = getCdnImageUrl(mobileSrc, cdnOptions);\n\n const objectFitClass = `object-${objectFit}`;\n const imgClasses = [className, objectFitClass].filter(Boolean).join(' ');\n\n const loadingProps: React.ImgHTMLAttributes<HTMLImageElement> = priority\n ? { loading: 'eager' as const, fetchPriority: 'high' as const, decoding: 'sync' as const }\n : { loading: 'lazy' as const, decoding: 'async' as const };\n\n const hasWrapper = !noWrapper && !!aspectRatio;\n\n const img = (\n <img\n src={optimizedSrc}\n alt={alt}\n className={imgClasses}\n width={width}\n height={height}\n sizes={sizes}\n srcSet={generatedSrcSet}\n // With a wrapper, `style` goes to the wrapper; otherwise it must land on the <img>.\n style={hasWrapper ? undefined : style}\n {...loadingProps}\n {...rest}\n />\n );\n\n const imgElement = optimizedMobileSrc ? (\n <picture>\n <source\n media={`(max-width: ${mobileBreakpoint}px)`}\n srcSet={generatedMobileSrcSet || optimizedMobileSrc}\n sizes={generatedMobileSrcSet ? sizes : undefined}\n />\n {img}\n </picture>\n ) : (\n img\n );\n\n if (!hasWrapper) {\n return imgElement;\n }\n\n return (\n <div className=\"relative overflow-hidden\" style={{ aspectRatio, ...style }}>\n {imgElement}\n </div>\n );\n});\n","import { Suspense, memo, use, type ReactNode } from 'react';\n\nexport interface DeferredDataProps<T> {\n promise: Promise<T> | T;\n fallback: ReactNode;\n children: (data: T) => ReactNode;\n}\n\nconst DEFERRED_KEY = Symbol.for('twilight.deferred');\n\ninterface DeferredState<T> {\n status: 'pending' | 'success' | 'error';\n value?: T;\n error?: unknown;\n}\n\nexport interface DeferredPromise<T> extends Promise<T> {\n [DEFERRED_KEY]?: DeferredState<T>;\n}\n\nconst seenPromises = typeof WeakSet !== 'undefined' ? new WeakSet() : null;\n\nfunction defer<T>(promise: Promise<T>): DeferredPromise<T> {\n const existing = (promise as DeferredPromise<T>)[DEFERRED_KEY];\n if (existing) return promise as DeferredPromise<T>;\n\n const state: DeferredState<T> = { status: 'pending' };\n\n const deferred = promise as DeferredPromise<T>;\n deferred[DEFERRED_KEY] = state;\n\n promise.then(\n (value) => {\n state.status = 'success';\n state.value = value;\n },\n (error) => {\n state.status = 'error';\n state.error = error;\n }\n );\n\n return deferred;\n}\n\nconst DeferredRenderer = memo(function DeferredRenderer<T>({\n promise,\n children,\n}: {\n promise: DeferredPromise<T>;\n children: (data: T) => ReactNode;\n}) {\n const state = promise[DEFERRED_KEY];\n\n if (state?.status === 'success') {\n return children(state.value!);\n }\n\n if (state?.status === 'error') {\n throw state.error;\n }\n\n const data = use(promise);\n return children(data);\n}) as <T>(props: { promise: DeferredPromise<T>; children: (data: T) => ReactNode }) => ReactNode;\n\nfunction DeferredFallback<T>({\n promise,\n fallback,\n children,\n}: {\n promise: DeferredPromise<T>;\n fallback: ReactNode;\n children: (data: T) => ReactNode;\n}) {\n const state = promise[DEFERRED_KEY];\n if (state?.status === 'success') {\n return children(state.value!);\n }\n return <>{fallback}</>;\n}\n\nexport function resolveDeferred<T>(\n promiseOrValue: Promise<T> | T | undefined\n): T | Promise<T> | undefined {\n if (promiseOrValue == null || !(promiseOrValue instanceof Promise)) return promiseOrValue;\n const deferred = defer(promiseOrValue);\n const state = deferred[DEFERRED_KEY];\n if (state?.status === 'success') return state.value as T;\n return promiseOrValue;\n}\n\nexport function DeferredData<T>({ promise, fallback, children }: DeferredDataProps<T>) {\n if (!(promise instanceof Promise)) {\n return children(promise);\n }\n\n if (seenPromises && promise instanceof Promise) seenPromises.add(promise);\n\n const deferred = defer(promise);\n const state = deferred[DEFERRED_KEY];\n\n if (state?.status === 'success') {\n return children(state.value!);\n }\n\n if (state?.status === 'error') {\n throw state.error;\n }\n\n return (\n <Suspense\n fallback={\n <DeferredFallback promise={deferred} fallback={fallback}>\n {children}\n </DeferredFallback>\n }\n >\n <DeferredRenderer promise={deferred}>{children}</DeferredRenderer>\n </Suspense>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/common/lazy.ts","../src/components/common/Image.tsx","../src/components/common/DeferredData.tsx"],"names":["Image","memo","DeferredRenderer","jsx"],"mappings":"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","file":"chunk-KQW6I5CD.js","sourcesContent":["import { lazy } from 'react';\n\n/**\n * Lazy-loaded common components\n * Use these for code-splitting non-critical components\n *\n * NOTE: Skeleton components are sourced from @salla.sa/twilight-components-react\n * because they must render instantly during route transitions.\n */\nexport const LazyBreadcrumb = lazy(() =>\n import('./Breadcrumb').then((m) => ({ default: m.Breadcrumb }))\n);\n\nexport const LazyNoContent = lazy(() =>\n import('./NoContent').then((m) => ({ default: m.NoContent }))\n);\n\nexport const LazyRenderWhenVisible = lazy(() =>\n import('./RenderWhenVisible').then((m) => ({ default: m.RenderWhenVisible }))\n);\n\nexport const LazyCurrencySymbol = lazy(() =>\n import('./CurrencySymbol').then((m) => ({ default: m.CurrencySymbol }))\n);\n\nexport const LazyErrorPage = lazy(() =>\n import('./ErrorPage').then((m) => ({ default: m.ErrorPage }))\n);\n","import { memo } from 'react';\nimport { getCdnImageSrcSet, getCdnImageUrl } from '../../utils/cdn-image';\n\nexport interface ImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n /** Image source URL */\n src?: string;\n /** Alt text for accessibility */\n alt: string;\n /** Whether this image is above the fold / LCP candidate */\n priority?: boolean;\n /** Aspect ratio for CLS prevention (e.g. \"16/9\", \"1/1\", \"4/3\") */\n aspectRatio?: string;\n /** Object fit mode */\n objectFit?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';\n /** Mobile image source for <picture> element */\n mobileSrc?: string;\n /** Mobile breakpoint for <source> media query (default: 768px) */\n mobileBreakpoint?: number;\n /** Skip the wrapper div */\n noWrapper?: boolean;\n /**\n * CDN widths for a density `srcset`. Pass `sizes` so the browser picks a\n * candidate close to the displayed CSS size.\n */\n srcSetWidths?: readonly number[];\n}\n\n/**\n * Optimized Image component with native browser lazy loading.\n *\n * - Uses `loading=\"lazy\"` + `decoding=\"async\"` by default for below-the-fold images.\n * - Uses `loading=\"eager\"` + `fetchPriority=\"high\"` for priority (above-the-fold / LCP) images.\n * - Supports responsive `<picture>` with mobile source.\n * - Provides `aspectRatio` for CLS prevention.\n * - When `srcSetWidths` + `sizes` are set, emits a sized CDN `srcset`.\n */\nexport const Image = memo(function Image({\n src,\n alt,\n priority = false,\n aspectRatio,\n objectFit = 'cover',\n mobileSrc,\n mobileBreakpoint = 768,\n noWrapper = false,\n className = '',\n style,\n width,\n height,\n sizes,\n srcSet: srcSetProp,\n srcSetWidths,\n ...rest\n}: ImageProps) {\n if (!src) return null;\n\n const generatedSrcSet =\n srcSetProp || (srcSetWidths?.length ? getCdnImageSrcSet(src, srcSetWidths) : undefined);\n const generatedMobileSrcSet =\n srcSetWidths?.length && mobileSrc ? getCdnImageSrcSet(mobileSrc, srcSetWidths) : undefined;\n const cdnWidth = srcSetWidths?.length\n ? width != null && srcSetWidths.includes(Number(width))\n ? Number(width)\n : srcSetWidths[0]\n : width;\n // Width-only CDN URLs so `src` matches a srcset candidate for preload.\n const cdnOptions = generatedSrcSet ? { width: cdnWidth } : { width: cdnWidth, height };\n\n const optimizedSrc = getCdnImageUrl(src, cdnOptions);\n const optimizedMobileSrc = getCdnImageUrl(mobileSrc, cdnOptions);\n\n const objectFitClass = `object-${objectFit}`;\n const imgClasses = [className, objectFitClass].filter(Boolean).join(' ');\n\n const loadingProps: React.ImgHTMLAttributes<HTMLImageElement> = priority\n ? { loading: 'eager' as const, fetchPriority: 'high' as const, decoding: 'sync' as const }\n : { loading: 'lazy' as const, decoding: 'async' as const };\n\n const hasWrapper = !noWrapper && !!aspectRatio;\n\n const img = (\n <img\n src={optimizedSrc}\n alt={alt}\n className={imgClasses}\n width={width}\n height={height}\n sizes={sizes}\n srcSet={generatedSrcSet}\n // With a wrapper, `style` goes to the wrapper; otherwise it must land on the <img>.\n style={hasWrapper ? undefined : style}\n {...loadingProps}\n {...rest}\n />\n );\n\n const imgElement = optimizedMobileSrc ? (\n <picture>\n <source\n media={`(max-width: ${mobileBreakpoint}px)`}\n srcSet={generatedMobileSrcSet || optimizedMobileSrc}\n sizes={generatedMobileSrcSet ? sizes : undefined}\n />\n {img}\n </picture>\n ) : (\n img\n );\n\n if (!hasWrapper) {\n return imgElement;\n }\n\n return (\n <div className=\"relative overflow-hidden\" style={{ aspectRatio, ...style }}>\n {imgElement}\n </div>\n );\n});\n","import { Suspense, memo, use, type ReactNode } from 'react';\n\nexport interface DeferredDataProps<T> {\n promise: Promise<T> | T;\n fallback: ReactNode;\n children: (data: T) => ReactNode;\n}\n\nconst DEFERRED_KEY = Symbol.for('twilight.deferred');\n\ninterface DeferredState<T> {\n status: 'pending' | 'success' | 'error';\n value?: T;\n error?: unknown;\n}\n\nexport interface DeferredPromise<T> extends Promise<T> {\n [DEFERRED_KEY]?: DeferredState<T>;\n}\n\nconst seenPromises = typeof WeakSet !== 'undefined' ? new WeakSet() : null;\n\nfunction defer<T>(promise: Promise<T>): DeferredPromise<T> {\n const existing = (promise as DeferredPromise<T>)[DEFERRED_KEY];\n if (existing) return promise as DeferredPromise<T>;\n\n const state: DeferredState<T> = { status: 'pending' };\n\n const deferred = promise as DeferredPromise<T>;\n deferred[DEFERRED_KEY] = state;\n\n promise.then(\n (value) => {\n state.status = 'success';\n state.value = value;\n },\n (error) => {\n state.status = 'error';\n state.error = error;\n }\n );\n\n return deferred;\n}\n\nconst DeferredRenderer = memo(function DeferredRenderer<T>({\n promise,\n children,\n}: {\n promise: DeferredPromise<T>;\n children: (data: T) => ReactNode;\n}) {\n const state = promise[DEFERRED_KEY];\n\n if (state?.status === 'success') {\n return children(state.value!);\n }\n\n if (state?.status === 'error') {\n throw state.error;\n }\n\n const data = use(promise);\n return children(data);\n}) as <T>(props: { promise: DeferredPromise<T>; children: (data: T) => ReactNode }) => ReactNode;\n\nfunction DeferredFallback<T>({\n promise,\n fallback,\n children,\n}: {\n promise: DeferredPromise<T>;\n fallback: ReactNode;\n children: (data: T) => ReactNode;\n}) {\n const state = promise[DEFERRED_KEY];\n if (state?.status === 'success') {\n return children(state.value!);\n }\n return <>{fallback}</>;\n}\n\nexport function resolveDeferred<T>(\n promiseOrValue: Promise<T> | T | undefined\n): T | Promise<T> | undefined {\n if (promiseOrValue == null || !(promiseOrValue instanceof Promise)) return promiseOrValue;\n const deferred = defer(promiseOrValue);\n const state = deferred[DEFERRED_KEY];\n if (state?.status === 'success') return state.value as T;\n return promiseOrValue;\n}\n\nexport function DeferredData<T>({ promise, fallback, children }: DeferredDataProps<T>) {\n if (!(promise instanceof Promise)) {\n return children(promise);\n }\n\n if (seenPromises && promise instanceof Promise) seenPromises.add(promise);\n\n const deferred = defer(promise);\n const state = deferred[DEFERRED_KEY];\n\n if (state?.status === 'success') {\n return children(state.value!);\n }\n\n if (state?.status === 'error') {\n throw state.error;\n }\n\n return (\n <Suspense\n fallback={\n <DeferredFallback promise={deferred} fallback={fallback}>\n {children}\n </DeferredFallback>\n }\n >\n <DeferredRenderer promise={deferred}>{children}</DeferredRenderer>\n </Suspense>\n );\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { useOpeningHours } from './chunk-
|
|
2
|
-
import { useIsProduct } from './chunk-
|
|
1
|
+
import { useOpeningHours } from './chunk-JVIPOD6M.js';
|
|
2
|
+
import { useIsProduct } from './chunk-RWBTMHLR.js';
|
|
3
3
|
import { useTranslation } from './chunk-TYNZ5B2B.js';
|
|
4
4
|
import { useTwilight } from './chunk-DF6FBKDN.js';
|
|
5
5
|
import { useState } from 'react';
|
|
@@ -54,5 +54,5 @@ function StoreClosedNotification(_props) {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
export { StoreClosedNotification };
|
|
57
|
-
//# sourceMappingURL=chunk-
|
|
58
|
-
//# sourceMappingURL=chunk-
|
|
57
|
+
//# sourceMappingURL=chunk-LXNS6CMT.js.map
|
|
58
|
+
//# sourceMappingURL=chunk-LXNS6CMT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/store/StoreClosedNotification.tsx"],"names":[],"mappings":";;;;;;;AAsBO,SAAS,wBAAwB,MAAA,EAAsC;AAC5E,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,WAAA,EAAY;AAC9B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,EAAE,QAAQ,SAAA,EAAW,iBAAA,KAAsB,eAAA,CAAgB,KAAA,CAAM,UAAU,aAAa,CAAA;AAC9F,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAGhD,EAAA,MAAM,gBAAgB,YAAA,EAAa;AAGnC,EAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,aAAa,MAAA,IAAU,SAAA,IAAa,CAAC,iBAAA,EAAmB;AAC7E,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAwB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,cAAA;AAAA,MACV,EAAA,EAAG,2BAAA;AAAA,MACH,aAAA,EAAY,2BAAA;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,eAAA,EAAiB,SAAA;AAAA,QACjB,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS,WAAA;AAAA,QACT,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,QAAA,EAAU;AAAA,OACZ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,GAAA;AAAA,YACL,EAAA,EAAG,cAAA;AAAA,YACH,OAAA,EAAS,WAAA;AAAA,YACT,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,MAAM,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,cAAA,EAAgB,MAAA,EAAO;AAAA,YAE/E,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,cAAA,EAAe;AAAA;AAAA,SAC9B;AAAA,wBACA,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,CAAA,EAAE,EACjD,QAAA,EAAA,CAAA,CAAE,2BAAA,EAA6B;AAAA,UAC9B,YAAA,EAAc,qPAAkD,iBAAiB,CAAA,CAAA,CAAA;AAAA,UACjF,QAAA,EAAU;AAAA,SACX,CAAA,EACH;AAAA;AAAA;AAAA,GACF;AAEJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/store/StoreClosedNotification.tsx"],"names":[],"mappings":";;;;;;;AAsBO,SAAS,wBAAwB,MAAA,EAAsC;AAC5E,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,WAAA,EAAY;AAC9B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,EAAE,QAAQ,SAAA,EAAW,iBAAA,KAAsB,eAAA,CAAgB,KAAA,CAAM,UAAU,aAAa,CAAA;AAC9F,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAGhD,EAAA,MAAM,gBAAgB,YAAA,EAAa;AAGnC,EAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,aAAa,MAAA,IAAU,SAAA,IAAa,CAAC,iBAAA,EAAmB;AAC7E,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAwB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,cAAA;AAAA,MACV,EAAA,EAAG,2BAAA;AAAA,MACH,aAAA,EAAY,2BAAA;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,eAAA,EAAiB,SAAA;AAAA,QACjB,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS,WAAA;AAAA,QACT,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,QAAA,EAAU;AAAA,OACZ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,GAAA;AAAA,YACL,EAAA,EAAG,cAAA;AAAA,YACH,OAAA,EAAS,WAAA;AAAA,YACT,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,MAAM,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,cAAA,EAAgB,MAAA,EAAO;AAAA,YAE/E,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,cAAA,EAAe;AAAA;AAAA,SAC9B;AAAA,wBACA,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,CAAA,EAAE,EACjD,QAAA,EAAA,CAAA,CAAE,2BAAA,EAA6B;AAAA,UAC9B,YAAA,EAAc,qPAAkD,iBAAiB,CAAA,CAAA,CAAA;AAAA,UACjF,QAAA,EAAU;AAAA,SACX,CAAA,EACH;AAAA;AAAA;AAAA,GACF;AAEJ","file":"chunk-LXNS6CMT.js","sourcesContent":["import { useState } from 'react';\nimport { useIsProduct } from '../../providers/NavigationProvider';\nimport { useTwilight } from '../../providers/TwilightProvider';\nimport { useOpeningHours } from '../../hooks/useOpeningHours';\nimport { useTranslation } from '../../providers/I18nProvider';\n\nexport interface StoreClosedNotificationProps {\n /** Whether to show the notification (defaults to true when store is closed on product page) */\n show?: boolean;\n}\n\n/**\n * StoreClosedNotification - Shows a notification bar when the store is closed.\n *\n * Mirrors PHP ReceivingOrdersTimesWidget:\n * - Only shows on product pages\n * - Only shows when store is closed for receiving orders\n * - Displays when the store will open next\n * - Has a close button to dismiss\n *\n * Injected via hook registry at body:start.\n */\nexport function StoreClosedNotification(_props: StoreClosedNotificationProps) {\n const { store } = useTwilight();\n const { t } = useTranslation();\n const { isOpen, isEnabled, nextOpenFormatted } = useOpeningHours(store.settings?.opening_hours);\n const [dismissed, setDismissed] = useState(false);\n\n // Check if we're on a product page\n const isProductPage = useIsProduct();\n\n // Conditions: product page, opening hours enabled, store closed, not dismissed\n if (!isProductPage || !isEnabled || isOpen || dismissed || !nextOpenFormatted) {\n return null;\n }\n\n const handleClose = (e: React.MouseEvent) => {\n e.preventDefault();\n setDismissed(true);\n };\n\n return (\n <div\n className=\"store-notify\"\n id=\"store-closed-notification\"\n data-testid=\"store-closed-notification\"\n style={{\n backgroundColor: '#d63031',\n color: '#fff',\n padding: '10px 15px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n }}\n >\n <a\n href=\"#\"\n id=\"notify-close\"\n onClick={handleClose}\n style={{ position: 'absolute', left: 15, color: '#fff', textDecoration: 'none' }}\n >\n <i className=\"sicon-cancel\" />\n </a>\n <p style={{ margin: 0, textAlign: 'center', flex: 1 }}>\n {t('store.closed_notification', {\n defaultValue: `المتجر حاليا مغلق لاستقبال الطلبات وسيتم فتحه (${nextOpenFormatted})`,\n nextOpen: nextOpenFormatted,\n })}\n </p>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { lazy } from 'react';
|
|
2
|
+
|
|
3
|
+
// src/components/cart/lazy.ts
|
|
4
|
+
var LazyCartItem = lazy(() => import('./CartItem-GRFH5BED.js').then((m) => ({ default: m.CartItem })));
|
|
5
|
+
var LazyCartSummary = lazy(
|
|
6
|
+
() => import('./CartSummary-IOCZJL26.js').then((m) => ({ default: m.CartSummary }))
|
|
7
|
+
);
|
|
8
|
+
var LazySeoCartWidget = lazy(
|
|
9
|
+
() => import('./SeoCartWidget-6BU7WCTP.js').then((m) => ({ default: m.SeoCartWidget }))
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
export { LazyCartItem, LazyCartSummary, LazySeoCartWidget };
|
|
13
|
+
//# sourceMappingURL=chunk-MGDCJQ5P.js.map
|
|
14
|
+
//# sourceMappingURL=chunk-MGDCJQ5P.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/cart/lazy.ts"],"names":[],"mappings":";;;AAMO,IAAM,YAAA,GAAe,IAAA,CAAK,MAAM,OAAO,wBAAY,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,QAAA,GAAW,CAAC;AAE3F,IAAM,eAAA,GAAkB,IAAA;AAAA,EAAK,MAClC,OAAO,2BAAe,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,WAAA,EAAY,CAAE;AAClE;AAEO,IAAM,iBAAA,GAAoB,IAAA;AAAA,EAAK,MACpC,OAAO,6BAAiB,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,aAAA,EAAc,CAAE;AACtE","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/cart/lazy.ts"],"names":[],"mappings":";;;AAMO,IAAM,YAAA,GAAe,IAAA,CAAK,MAAM,OAAO,wBAAY,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,QAAA,GAAW,CAAC;AAE3F,IAAM,eAAA,GAAkB,IAAA;AAAA,EAAK,MAClC,OAAO,2BAAe,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,WAAA,EAAY,CAAE;AAClE;AAEO,IAAM,iBAAA,GAAoB,IAAA;AAAA,EAAK,MACpC,OAAO,6BAAiB,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,aAAA,EAAc,CAAE;AACtE","file":"chunk-MGDCJQ5P.js","sourcesContent":["import { lazy } from 'react';\n\n/**\n * Lazy-loaded cart components\n * Use these for code-splitting cart sections\n */\nexport const LazyCartItem = lazy(() => import('./CartItem').then((m) => ({ default: m.CartItem })));\n\nexport const LazyCartSummary = lazy(() =>\n import('./CartSummary').then((m) => ({ default: m.CartSummary }))\n);\n\nexport const LazySeoCartWidget = lazy(() =>\n import('./SeoCartWidget').then((m) => ({ default: m.SeoCartWidget }))\n);\n"]}
|