@salla.sa/twilight-theme-engine 1.0.73 → 1.0.74
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-G2HK5QB3.js → AddToCartForm-H2PRWRO7.js} +8 -6
- package/dist/AddToCartForm-H2PRWRO7.js.map +1 -0
- package/dist/{BlogAuthorPage-BU2LVISS.js → BlogAuthorPage-QDGBWGGT.js} +22 -22
- package/dist/{BlogAuthorPage-BU2LVISS.js.map → BlogAuthorPage-QDGBWGGT.js.map} +1 -1
- package/dist/{BlogCategoryPage-UR4MPDLE.js → BlogCategoryPage-BK4OL6T4.js} +22 -22
- package/dist/{BlogCategoryPage-UR4MPDLE.js.map → BlogCategoryPage-BK4OL6T4.js.map} +1 -1
- package/dist/{BlogPage-E2XZGFOP.js → BlogPage-5LLIKUOQ.js} +20 -20
- package/dist/{BlogPage-E2XZGFOP.js.map → BlogPage-5LLIKUOQ.js.map} +1 -1
- package/dist/{BlogSinglePage-ZK2K6WEU.js → BlogSinglePage-3BDXSFTY.js} +20 -20
- package/dist/{BlogSinglePage-ZK2K6WEU.js.map → BlogSinglePage-3BDXSFTY.js.map} +1 -1
- package/dist/{BlogTagPage-5N4VTPDN.js → BlogTagPage-S77JPNEZ.js} +22 -22
- package/dist/{BlogTagPage-5N4VTPDN.js.map → BlogTagPage-S77JPNEZ.js.map} +1 -1
- package/dist/{BrandsPage-XE7RYGXA.js → BrandsPage-2TJALMEG.js} +21 -21
- package/dist/{BrandsPage-XE7RYGXA.js.map → BrandsPage-2TJALMEG.js.map} +1 -1
- package/dist/{Breadcrumb-NX6BUSOA.js → Breadcrumb-SXC43X3D.js} +20 -20
- package/dist/{Breadcrumb-NX6BUSOA.js.map → Breadcrumb-SXC43X3D.js.map} +1 -1
- package/dist/{CartItem-SO34G6GZ.js → CartItem-R6BYAM4O.js} +20 -20
- package/dist/{CartItem-SO34G6GZ.js.map → CartItem-R6BYAM4O.js.map} +1 -1
- package/dist/{CartSummary-SDTY2CR2.js → CartSummary-YQ2RMHID.js} +20 -20
- package/dist/{CartSummary-SDTY2CR2.js.map → CartSummary-YQ2RMHID.js.map} +1 -1
- package/dist/{Copyright-C426OB5D.js → Copyright-5VLQICDY.js} +3 -3
- package/dist/{Copyright-C426OB5D.js.map → Copyright-5VLQICDY.js.map} +1 -1
- package/dist/{CustomerLayout-UXX5KJWR.js → CustomerLayout-DUT7BEKW.js} +20 -20
- package/dist/{CustomerLayout-UXX5KJWR.js.map → CustomerLayout-DUT7BEKW.js.map} +1 -1
- package/dist/{Footer-M5QEXJ4Z.js → Footer-J2KXYFB3.js} +20 -20
- package/dist/{Footer-M5QEXJ4Z.js.map → Footer-J2KXYFB3.js.map} +1 -1
- package/dist/{Header-CUJ4SYDF.js → Header-GZQINLEQ.js} +7 -7
- package/dist/{Header-CUJ4SYDF.js.map → Header-GZQINLEQ.js.map} +1 -1
- package/dist/{LoyaltyPage-UMQ2ZWA6.js → LoyaltyPage-IXLUF6MF.js} +20 -20
- package/dist/{LoyaltyPage-UMQ2ZWA6.js.map → LoyaltyPage-IXLUF6MF.js.map} +1 -1
- package/dist/{LoyaltyPointsPage-5YHEQSLT.js → LoyaltyPointsPage-RDNXI5VY.js} +3 -3
- package/dist/{LoyaltyPointsPage-5YHEQSLT.js.map → LoyaltyPointsPage-RDNXI5VY.js.map} +1 -1
- package/dist/{MainMenu-OFQDXUGW.js → MainMenu-KNJDJFJX.js} +7 -7
- package/dist/{MainMenu-OFQDXUGW.js.map → MainMenu-KNJDJFJX.js.map} +1 -1
- package/dist/{MasterLayout-TSHKSJ7U.js → MasterLayout-MFL2NYPF.js} +20 -20
- package/dist/{MasterLayout-TSHKSJ7U.js.map → MasterLayout-MFL2NYPF.js.map} +1 -1
- package/dist/{MobileMenu-7EKUQ4MU.js → MobileMenu-RXLYUAWL.js} +21 -21
- package/dist/{MobileMenu-7EKUQ4MU.js.map → MobileMenu-RXLYUAWL.js.map} +1 -1
- package/dist/{NotificationsPage-TBDOI7YB.js → NotificationsPage-QSF7S2PD.js} +20 -20
- package/dist/{NotificationsPage-TBDOI7YB.js.map → NotificationsPage-QSF7S2PD.js.map} +1 -1
- package/dist/{OrderSinglePage-7A37FKJE.js → OrderSinglePage-CWBHU2C6.js} +28 -23
- package/dist/OrderSinglePage-CWBHU2C6.js.map +1 -0
- package/dist/{OrdersPage-NJ3JH6SG.js → OrdersPage-L76IEAXR.js} +20 -20
- package/dist/{OrdersPage-NJ3JH6SG.js.map → OrdersPage-L76IEAXR.js.map} +1 -1
- package/dist/{PageSingle-UKA2U3E5.js → PageSingle-BUAZBPIQ.js} +6 -6
- package/dist/{PageSingle-UKA2U3E5.js.map → PageSingle-BUAZBPIQ.js.map} +1 -1
- package/dist/{ProductDetails-XDNE62ZZ.js → ProductDetails-MPNSWRTQ.js} +15 -7
- package/dist/ProductDetails-MPNSWRTQ.js.map +1 -0
- package/dist/{ProfilePage-WPJYGKYR.js → ProfilePage-I72265CD.js} +20 -20
- package/dist/{ProfilePage-WPJYGKYR.js.map → ProfilePage-I72265CD.js.map} +1 -1
- package/dist/ReviewsPage-M5GNHNZG.js +18 -0
- package/dist/ReviewsPage-M5GNHNZG.js.map +1 -0
- package/dist/{SeoCartWidget-G7NAANUN.js → SeoCartWidget-KV3T3BO7.js} +20 -20
- package/dist/{SeoCartWidget-G7NAANUN.js.map → SeoCartWidget-KV3T3BO7.js.map} +1 -1
- package/dist/{SettingsPage-X7GPCBJL.js → SettingsPage-3F5HZNXX.js} +20 -20
- package/dist/{SettingsPage-X7GPCBJL.js.map → SettingsPage-3F5HZNXX.js.map} +1 -1
- package/dist/{StoreClosedNotification-NKRYCLKX.js → StoreClosedNotification-65QIOIAM.js} +21 -21
- package/dist/{StoreClosedNotification-NKRYCLKX.js.map → StoreClosedNotification-65QIOIAM.js.map} +1 -1
- package/dist/{TestimonialsPage-JTUWHKPU.js → TestimonialsPage-5U7PH4TT.js} +6 -6
- package/dist/{TestimonialsPage-JTUWHKPU.js.map → TestimonialsPage-5U7PH4TT.js.map} +1 -1
- package/dist/{ThankYouPage-MCMBGHO2.js → ThankYouPage-HFUTJCRT.js} +20 -20
- package/dist/{ThankYouPage-MCMBGHO2.js.map → ThankYouPage-HFUTJCRT.js.map} +1 -1
- package/dist/{WalletPage-JJI6WPNT.js → WalletPage-KURO6WSP.js} +21 -21
- package/dist/{WalletPage-JJI6WPNT.js.map → WalletPage-KURO6WSP.js.map} +1 -1
- package/dist/{WishlistPage-HAOYS7NV.js → WishlistPage-RLUK4JRD.js} +22 -22
- package/dist/{WishlistPage-HAOYS7NV.js.map → WishlistPage-RLUK4JRD.js.map} +1 -1
- package/dist/api/apps.js +4 -4
- package/dist/api/blog.js +6 -6
- package/dist/api/brands.js +6 -6
- package/dist/api/cart.d.ts +1 -1
- package/dist/api/cart.d.ts.map +1 -1
- package/dist/api/cart.js +6 -6
- package/dist/api/category.js +6 -6
- package/dist/api/client.d.ts +6 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +3 -3
- package/dist/api/home.js +4 -4
- package/dist/api/loyalty.js +6 -6
- package/dist/api/menu.js +4 -4
- package/dist/api/notification.js +4 -4
- package/dist/api/order.js +6 -6
- package/dist/api/page.js +6 -6
- package/dist/api/product.d.ts +20 -0
- package/dist/api/product.d.ts.map +1 -1
- package/dist/api/product.js +6 -6
- package/dist/api/profile.js +3 -3
- package/dist/api/store.d.ts +3 -1
- package/dist/api/store.d.ts.map +1 -1
- package/dist/api/store.js +4 -4
- package/dist/api/translations.js +4 -4
- package/dist/api/user.js +4 -4
- package/dist/api/wallet.js +4 -4
- package/dist/api/wishlist.js +7 -7
- package/dist/{chunk-3EE62REP.js → chunk-2OYXPNCE.js} +3 -3
- package/dist/{chunk-3EE62REP.js.map → chunk-2OYXPNCE.js.map} +1 -1
- package/dist/{chunk-YLSG4MEK.js → chunk-2ZQKAGSZ.js} +4 -4
- package/dist/{chunk-YLSG4MEK.js.map → chunk-2ZQKAGSZ.js.map} +1 -1
- package/dist/{chunk-RO6KBURF.js → chunk-3EBAXWBJ.js} +7 -6
- package/dist/chunk-3EBAXWBJ.js.map +1 -0
- package/dist/{chunk-KOMV5SEF.js → chunk-3EHECJ7M.js} +7 -6
- package/dist/chunk-3EHECJ7M.js.map +1 -0
- package/dist/{chunk-VFYT2VWC.js → chunk-3QT7JMAD.js} +13 -4
- package/dist/chunk-3QT7JMAD.js.map +1 -0
- package/dist/{chunk-OYP5CGHU.js → chunk-3TJKB3WR.js} +3 -3
- package/dist/{chunk-OYP5CGHU.js.map → chunk-3TJKB3WR.js.map} +1 -1
- package/dist/{chunk-WSXRUOI2.js → chunk-4VWWIA4M.js} +4 -4
- package/dist/{chunk-WSXRUOI2.js.map → chunk-4VWWIA4M.js.map} +1 -1
- package/dist/{chunk-DIVEHHMD.js → chunk-4YVGMXG7.js} +3 -3
- package/dist/{chunk-DIVEHHMD.js.map → chunk-4YVGMXG7.js.map} +1 -1
- package/dist/{chunk-5AFTFN72.js → chunk-5NUDOT33.js} +3 -3
- package/dist/{chunk-5AFTFN72.js.map → chunk-5NUDOT33.js.map} +1 -1
- package/dist/{chunk-IXUY5RMV.js → chunk-6I4LWF5Y.js} +3 -3
- package/dist/{chunk-IXUY5RMV.js.map → chunk-6I4LWF5Y.js.map} +1 -1
- package/dist/{chunk-JZ7BOB4G.js → chunk-6KVB2WHE.js} +4 -4
- package/dist/{chunk-JZ7BOB4G.js.map → chunk-6KVB2WHE.js.map} +1 -1
- package/dist/{chunk-BVSJPBJ6.js → chunk-6WI7R2BD.js} +14 -3
- package/dist/chunk-6WI7R2BD.js.map +1 -0
- package/dist/{chunk-CMD3ARR2.js → chunk-BLWLKRKH.js} +59 -28
- package/dist/chunk-BLWLKRKH.js.map +1 -0
- package/dist/{chunk-J427UFSZ.js → chunk-CJDAZQV6.js} +6 -6
- package/dist/{chunk-J427UFSZ.js.map → chunk-CJDAZQV6.js.map} +1 -1
- package/dist/{chunk-OGVUFMLX.js → chunk-D2T6246Q.js} +3 -3
- package/dist/{chunk-OGVUFMLX.js.map → chunk-D2T6246Q.js.map} +1 -1
- package/dist/chunk-E5O5ICIY.js +40 -0
- package/dist/chunk-E5O5ICIY.js.map +1 -0
- package/dist/{chunk-RSVAPXXI.js → chunk-E7EBWXCA.js} +23 -15
- package/dist/chunk-E7EBWXCA.js.map +1 -0
- package/dist/{chunk-L3X2H2RP.js → chunk-FIFNYC7B.js} +7 -7
- package/dist/{chunk-L3X2H2RP.js.map → chunk-FIFNYC7B.js.map} +1 -1
- package/dist/{chunk-WLDDKFSZ.js → chunk-FVDUTMH6.js} +4 -4
- package/dist/{chunk-WLDDKFSZ.js.map → chunk-FVDUTMH6.js.map} +1 -1
- package/dist/{chunk-L5K7VBOH.js → chunk-GFSTJ2PF.js} +3 -3
- package/dist/{chunk-L5K7VBOH.js.map → chunk-GFSTJ2PF.js.map} +1 -1
- package/dist/{chunk-HFISEQPK.js → chunk-IDY6OEXA.js} +8 -8
- package/dist/{chunk-HFISEQPK.js.map → chunk-IDY6OEXA.js.map} +1 -1
- package/dist/{chunk-EXBH6RGD.js → chunk-IK57LAIA.js} +19 -5
- package/dist/chunk-IK57LAIA.js.map +1 -0
- package/dist/{chunk-B5FDWE4U.js → chunk-JAPH535M.js} +4 -4
- package/dist/{chunk-B5FDWE4U.js.map → chunk-JAPH535M.js.map} +1 -1
- package/dist/{chunk-3IHFA2X5.js → chunk-JEG5WPNT.js} +3 -3
- package/dist/{chunk-3IHFA2X5.js.map → chunk-JEG5WPNT.js.map} +1 -1
- package/dist/{chunk-54XX3YPP.js → chunk-JHCLU3PS.js} +8 -8
- package/dist/{chunk-54XX3YPP.js.map → chunk-JHCLU3PS.js.map} +1 -1
- package/dist/{chunk-U53LIN2F.js → chunk-JNZLH2OR.js} +58 -9
- package/dist/chunk-JNZLH2OR.js.map +1 -0
- package/dist/{chunk-3CYIB6BL.js → chunk-KO3HG5GQ.js} +3 -3
- package/dist/{chunk-3CYIB6BL.js.map → chunk-KO3HG5GQ.js.map} +1 -1
- package/dist/{chunk-MISI3T6V.js → chunk-M6BXZTRK.js} +3 -3
- package/dist/{chunk-MISI3T6V.js.map → chunk-M6BXZTRK.js.map} +1 -1
- package/dist/{chunk-WYW7USLQ.js → chunk-MEMB7JYJ.js} +4 -4
- package/dist/{chunk-WYW7USLQ.js.map → chunk-MEMB7JYJ.js.map} +1 -1
- package/dist/{chunk-SDIQHTDG.js → chunk-OKNJFS44.js} +4 -4
- package/dist/{chunk-SDIQHTDG.js.map → chunk-OKNJFS44.js.map} +1 -1
- package/dist/{chunk-3YAR2SXQ.js → chunk-OQA2MKZA.js} +30 -17
- package/dist/chunk-OQA2MKZA.js.map +1 -0
- package/dist/{chunk-ZGHRSRDO.js → chunk-OUW6WESU.js} +3 -2
- package/dist/chunk-OUW6WESU.js.map +1 -0
- package/dist/{chunk-YKFGUVF7.js → chunk-P2YAPWMS.js} +5 -4
- package/dist/chunk-P2YAPWMS.js.map +1 -0
- package/dist/{chunk-QVJDYSCT.js → chunk-P4GOLSA2.js} +3 -3
- package/dist/{chunk-QVJDYSCT.js.map → chunk-P4GOLSA2.js.map} +1 -1
- package/dist/{chunk-5DPR7GWH.js → chunk-PNM4NP4U.js} +3 -3
- package/dist/{chunk-5DPR7GWH.js.map → chunk-PNM4NP4U.js.map} +1 -1
- package/dist/{chunk-52ETYODY.js → chunk-R72Q5Z6M.js} +4 -4
- package/dist/{chunk-52ETYODY.js.map → chunk-R72Q5Z6M.js.map} +1 -1
- package/dist/{chunk-HBTIZWT2.js → chunk-RYSJOCHI.js} +3 -3
- package/dist/{chunk-HBTIZWT2.js.map → chunk-RYSJOCHI.js.map} +1 -1
- package/dist/{chunk-XVNXXF67.js → chunk-TWVTIAMO.js} +3 -3
- package/dist/{chunk-XVNXXF67.js.map → chunk-TWVTIAMO.js.map} +1 -1
- package/dist/{chunk-2ALN2BPM.js → chunk-VYCNB6VN.js} +3 -3
- package/dist/{chunk-2ALN2BPM.js.map → chunk-VYCNB6VN.js.map} +1 -1
- package/dist/chunk-WG47KLHH.js +14 -0
- package/dist/{chunk-4LVBS3VI.js.map → chunk-WG47KLHH.js.map} +1 -1
- package/dist/{chunk-L2QUP6J3.js → chunk-WHGOO4A2.js} +6 -6
- package/dist/{chunk-L2QUP6J3.js.map → chunk-WHGOO4A2.js.map} +1 -1
- package/dist/{chunk-25FWAL3O.js → chunk-WS3WQ3OL.js} +4 -4
- package/dist/{chunk-25FWAL3O.js.map → chunk-WS3WQ3OL.js.map} +1 -1
- package/dist/{chunk-UAY6LTWB.js → chunk-XN7TVPAU.js} +4 -4
- package/dist/{chunk-UAY6LTWB.js.map → chunk-XN7TVPAU.js.map} +1 -1
- package/dist/{chunk-LPQFTXBB.js → chunk-Y5OGXJLH.js} +10 -3
- package/dist/chunk-Y5OGXJLH.js.map +1 -0
- package/dist/{chunk-R5MZV6KW.js → chunk-YUGZDWD6.js} +4 -4
- package/dist/{chunk-R5MZV6KW.js.map → chunk-YUGZDWD6.js.map} +1 -1
- package/dist/components/cart/index.js +1 -1
- package/dist/components/common/index.js +1 -1
- package/dist/components/drawer/index.js +18 -18
- package/dist/components/home/ReorderProducts.d.ts +7 -0
- package/dist/components/home/ReorderProducts.d.ts.map +1 -0
- package/dist/components/home/SquarePhotos.d.ts +2 -1
- package/dist/components/home/SquarePhotos.d.ts.map +1 -1
- package/dist/components/home/index.d.ts +2 -0
- package/dist/components/home/index.d.ts.map +1 -1
- package/dist/components/home/index.js +22 -22
- package/dist/components/home/reorder-hooks.d.ts +6 -0
- package/dist/components/home/reorder-hooks.d.ts.map +1 -0
- package/dist/components/layout/index.js +1 -1
- package/dist/components/product/AddToCartForm.d.ts.map +1 -1
- package/dist/components/product/ProductDetails.d.ts.map +1 -1
- package/dist/components/product/index.js +19 -19
- package/dist/components/snippets/AppsSnippets.d.ts +2 -0
- package/dist/components/snippets/AppsSnippets.d.ts.map +1 -1
- package/dist/components/store/index.js +20 -20
- package/dist/components/toast/index.js +4 -4
- package/dist/document-class-5FTU6EZE.js +25 -0
- package/dist/{document-class-DOQDO2DN.js.map → document-class-5FTU6EZE.js.map} +1 -1
- package/dist/hooks/index.js +18 -18
- package/dist/hooks/useComments.js +3 -3
- package/dist/hooks/useCoupon.d.ts +0 -41
- package/dist/hooks/useCoupon.d.ts.map +1 -1
- package/dist/hooks/useCoupon.js +3 -1
- package/dist/hooks/useGtm.js +18 -18
- package/dist/hooks/useMoney.js +18 -18
- package/dist/hooks/useProduct.js +3 -3
- package/dist/hooks/useStore.js +18 -18
- package/dist/hooks/useUser.js +5 -5
- package/dist/hooks/useWishlist.d.ts.map +1 -1
- package/dist/hooks/useWishlist.js +4 -1
- package/dist/index.js +18 -18
- package/dist/native-app/index.js +3 -3
- package/dist/navigation-CDITJYUW.js +13 -0
- package/dist/{navigation-P3GZOWUU.js.map → navigation-CDITJYUW.js.map} +1 -1
- package/dist/{navigation-TA3I3XEC.js → navigation-WCGV6RUK.js} +5 -5
- package/dist/{navigation-TA3I3XEC.js.map → navigation-WCGV6RUK.js.map} +1 -1
- package/dist/{not-found-6B6QSJYA.js → not-found-EL2XQE5D.js} +59 -33
- package/dist/not-found-EL2XQE5D.js.map +1 -0
- package/dist/providers/index.js +18 -18
- package/dist/providers/twilight-init.d.ts.map +1 -1
- package/dist/router/route-ids.d.ts +1 -0
- package/dist/router/route-ids.d.ts.map +1 -1
- package/dist/routes/account/orders/single/OrderHeader.d.ts.map +1 -1
- package/dist/routes/account/orders.js +7 -7
- package/dist/routes/account.js +16 -16
- package/dist/routes/blog.js +11 -11
- package/dist/routes/brands.js +7 -7
- package/dist/routes/cart.js +26 -26
- package/dist/routes/home/HomePage.d.ts.map +1 -1
- package/dist/routes/home.js +23 -23
- package/dist/routes/index.d.ts +1 -1
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +4 -4
- package/dist/routes/loyalty.js +8 -8
- package/dist/routes/page.js +7 -7
- package/dist/routes/product/index.d.ts.map +1 -1
- package/dist/routes/product-listing/ProductListPage.d.ts.map +1 -1
- package/dist/routes/product-listing/loader.d.ts.map +1 -1
- package/dist/routes/product-listing/types.d.ts +1 -1
- package/dist/routes/product-listing/types.d.ts.map +1 -1
- package/dist/routes/product-listing.js +204 -183
- package/dist/routes/product-listing.js.map +1 -1
- package/dist/routes/product-short-link.d.ts +9 -5
- package/dist/routes/product-short-link.d.ts.map +1 -1
- package/dist/routes/product.js +23 -23
- package/dist/routes/product.js.map +1 -1
- package/dist/routes/seo-redirects.js +4 -4
- package/dist/routes/testimonials/ReviewsPage.d.ts +3 -0
- package/dist/routes/testimonials/ReviewsPage.d.ts.map +1 -0
- package/dist/routes/testimonials/index.d.ts +15 -3
- package/dist/routes/testimonials/index.d.ts.map +1 -1
- package/dist/routes/testimonials/loader.d.ts +3 -1
- package/dist/routes/testimonials/loader.d.ts.map +1 -1
- package/dist/routes/testimonials/types.d.ts +3 -0
- package/dist/routes/testimonials/types.d.ts.map +1 -1
- package/dist/routes/testimonials.js +38 -3
- package/dist/routes/testimonials.js.map +1 -1
- package/dist/routes/thank-you.js +7 -7
- package/dist/skeleton.js +23 -23
- package/dist/tanstack/document-class.d.ts.map +1 -1
- package/dist/tanstack/router.d.ts.map +1 -1
- package/dist/tanstack.js +16 -16
- package/dist/types/index.d.ts +3 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/salla-sdk.d.ts +4 -0
- package/dist/types/salla-sdk.d.ts.map +1 -1
- package/dist/utils/cookies.d.ts +5 -0
- package/dist/utils/cookies.d.ts.map +1 -1
- package/dist/utils/index.js +5 -4
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/sdk-events.d.ts +6 -0
- package/dist/utils/sdk-events.d.ts.map +1 -1
- package/dist/vite/adapters/tanstack.adapter.d.ts.map +1 -1
- package/dist/vite/index.js +60 -1
- package/dist/vite/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/AddToCartForm-G2HK5QB3.js.map +0 -1
- package/dist/OrderSinglePage-7A37FKJE.js.map +0 -1
- package/dist/ProductDetails-XDNE62ZZ.js.map +0 -1
- package/dist/chunk-3YAR2SXQ.js.map +0 -1
- package/dist/chunk-4LVBS3VI.js +0 -14
- package/dist/chunk-5ZR2HKZ7.js +0 -14
- package/dist/chunk-5ZR2HKZ7.js.map +0 -1
- package/dist/chunk-BVSJPBJ6.js.map +0 -1
- package/dist/chunk-CMD3ARR2.js.map +0 -1
- package/dist/chunk-EXBH6RGD.js.map +0 -1
- package/dist/chunk-KOMV5SEF.js.map +0 -1
- package/dist/chunk-LPQFTXBB.js.map +0 -1
- package/dist/chunk-RO6KBURF.js.map +0 -1
- package/dist/chunk-RSVAPXXI.js.map +0 -1
- package/dist/chunk-U53LIN2F.js.map +0 -1
- package/dist/chunk-VFYT2VWC.js.map +0 -1
- package/dist/chunk-YKFGUVF7.js.map +0 -1
- package/dist/chunk-ZGHRSRDO.js.map +0 -1
- package/dist/document-class-DOQDO2DN.js +0 -25
- package/dist/navigation-P3GZOWUU.js +0 -13
- package/dist/not-found-6B6QSJYA.js.map +0 -1
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/product/AddToCartForm.tsx"],"names":["SallaProductOptions"],"mappings":"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","file":"AddToCartForm-G2HK5QB3.js","sourcesContent":["import { SallaAddProductButton } from '@salla.sa/twilight-components-react/add-product-button';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { SallaCountDown } from '@salla.sa/twilight-components-react/count-down';\nimport { SallaFileUpload } from '@salla.sa/twilight-components-react/file-upload';\nimport { SallaGifting } from '@salla.sa/twilight-components-react/gifting';\nimport { SallaMultipleBundleProduct } from '@salla.sa/twilight-components-react/multiple-bundle-product';\n// Use the eager (non-deferred) Core export: product options are an essential form\n// control, and the deferred wrapper's visibility-triggered hydration races with the\n// gallery's image layout shift and gets stuck on the skeleton, so options never appear.\nimport { SallaProductOptionsCore as SallaProductOptions } from '@salla.sa/twilight-components-react/product-options';\nimport { SallaProductSizeGuide } from '@salla.sa/twilight-components-react/product-size-guide';\nimport { SallaQuantityInput } from '@salla.sa/twilight-components-react/quantity-input';\nimport { useHostAttributes } from '@salla.sa/twilight-theme-engine/hooks/useHostAttributes';\nimport { useTranslation } from '@salla.sa/twilight-theme-engine/i18n';\nimport type { ReactNode } from 'react';\nimport { useCallback, useEffect, useState } from 'react';\nimport type { Product } from '../../types';\nimport { CurrencySymbol } from '../common';\n\ninterface AddToCartFormProps {\n product: Product;\n stickyAddToCart?: boolean;\n giftingIntro?: string;\n formStartSlot?: ReactNode;\n formEndSlot?: ReactNode;\n}\n\nconst handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n // Native event, like Twig's onsubmit: the SDK spins its submitter's salla-button until the add settles.\n window.salla?.form.onSubmit('cart.addItem', e.nativeEvent);\n};\n\nconst handleChange = (e: React.FormEvent<HTMLFormElement>) => {\n const form = e.currentTarget;\n // Not reportValidity(): it focuses and scrolls to the first empty required option mid-edit.\n const isComplete = Array.from(form.elements).every(\n (el) => !(el as HTMLInputElement).willValidate || (el as HTMLInputElement).validity.valid\n );\n if (isComplete) {\n window.salla?.product?.getPrice(new FormData(form));\n }\n};\n\nexport function AddToCartForm({\n product,\n stickyAddToCart,\n giftingIntro,\n formStartSlot,\n formEndSlot,\n}: AddToCartFormProps) {\n const { t } = useTranslation();\n const [activeCollapse, setActiveCollapse] = useState<string | null>(null);\n\n // stable ref: an inline arrow re-runs on every render and resets the user's selection\n const optionsRef = useCallback(\n (el: { setOptionsData?: (data: never[]) => void } | null) =>\n void el?.setOptionsData?.(product.options as never[]),\n [product.options]\n );\n\n // salla-product-options reads its `options` prop only in its constructor (no\n // @Watch), and on first load that constructor runs before sdk.init has set\n // page.id — so its getDetails(page.id) fallback fetches nothing and the options\n // never reflect. Seed page.id (=== product.id) and wait for the SDK to be ready\n // before mounting the element so its fallback resolves on first load too.\n const [optionsReady, setOptionsReady] = useState(false);\n useEffect(() => {\n const salla = window.salla;\n if (!salla) return;\n let alive = true;\n salla.config?.set?.('page.id', product.id);\n Promise.resolve(salla.onReady?.()).finally(() => {\n if (alive) setOptionsReady(true);\n });\n return () => {\n alive = false;\n };\n }, [product.id]);\n\n const handleCollapseToggle = useCallback((id: string) => {\n setActiveCollapse((current) => (current === id ? null : id));\n }, []);\n\n const hasPreorder = product.has_preorder_campaign && product.preorder;\n const hasWeightOrSizeGuide = product.weight || product.has_size_guide;\n const hasAttachments = product.can_add_note || product.can_upload_file;\n const amount =\n typeof product.base_currency_price === 'object'\n ? product.base_currency_price.amount\n : product.base_currency_price;\n\n const quantityRef = useHostAttributes({\n max: product.max_quantity,\n value: 1,\n name: 'quantity',\n });\n const addButtonRef = useHostAttributes({\n amount,\n 'loader-position': 'end',\n type: 'submit',\n width: 'wide',\n 'required-shipping': product.is_require_shipping,\n 'is-subscribed': product.notify_availability?.subscribed,\n });\n\n return (\n <form\n className=\"form product-form\"\n encType=\"multipart/form-data\"\n method=\"post\"\n onSubmit={handleSubmit}\n onChange={handleChange}\n >\n <input type=\"hidden\" name=\"id\" value={product.id} />\n\n {formStartSlot}\n\n {optionsReady && product.options && product.options.length > 0 && (\n <SallaProductOptions\n key={product.id}\n // constructor-only options parse: push data via ref on client remount\n ref={optionsRef}\n options={JSON.stringify(product.options)}\n productId={product.id}\n />\n )}\n\n {product.has_bundle_products && (\n <SallaMultipleBundleProduct bundleSections={JSON.stringify(product)} />\n )}\n\n {hasWeightOrSizeGuide && (\n <section className=\"bg-white p-5 rounded-md mb-5\">\n {product.weight && (\n <div\n className={`center-between ${product.has_size_guide ? 'pb-5 mb-5 border-b-[1px]' : ''}`}\n >\n <b className=\"form-label rtl:space-x-reverse space-x-1\">\n <i className=\"sicon-luggage-cart\"></i>\n <span>{t('pages.products.weight', 'Weight')}</span>\n </b>\n <span className=\"product-weight text-sm\">{product.weight}</span>\n </div>\n )}\n {product.has_size_guide && (\n <>\n <div className=\"center-between\">\n <b className=\"form-label rtl:space-x-reverse space-x-1\">\n <i className=\"sicon-pencil-ruler\"></i>\n <span>{t('pages.products.size_guides', 'Size Guides')}</span>\n </b>\n <SallaButton\n shape=\"link\"\n color=\"primary\"\n className=\"!p-0 text-sm with-arrow\"\n onClick={() =>\n window.salla?.event?.dispatch('size-guide::open', String(product.id))\n }\n >\n {t('pages.products.show_size_guides', 'Show Size Guides')}\n <i className=\"sicon-keyboard_arrow_left\"></i>\n </SallaButton>\n </div>\n <SallaProductSizeGuide />\n </>\n )}\n </section>\n )}\n\n {hasAttachments && (\n <section className=\"bg-white p-5 rounded-md mb-5\">\n <div className=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start\">\n <div className=\"form-label\">\n <b className=\"block\">{t('pages.products.attachments', 'Attachments')}</b>\n </div>\n <div className=\"mt-1 sm:mt-0 sm:col-span-2 text-end\">\n <div className=\"flex rtl:space-x-reverse space-x-3\">\n {product.can_add_note && (\n <button\n type=\"button\"\n onClick={() => handleCollapseToggle(`note_${product.id}`)}\n className={`btn-tab btn--collapse ${activeCollapse === `note_${product.id}` ? 'is-opened' : 'is-closed'}`}\n >\n <i className=\"font-medium sicon-chat-conversation-alt rtl:ml-1.5 ltr:mr-1.5\"></i>\n <span className=\"fix-align\">{t('pages.products.add_note', 'Add Note')}</span>\n </button>\n )}\n {product.can_upload_file && (\n <button\n type=\"button\"\n onClick={() => handleCollapseToggle(`file_${product.id}`)}\n className={`btn-tab btn--collapse ${activeCollapse === `file_${product.id}` ? 'is-opened' : 'is-closed'}`}\n >\n <i className=\"font-medium sicon-paperclip rtl:ml-1.5 ltr:mr-1.5\"></i>\n <span className=\"fix-align\">{t('pages.products.add_file', 'Add File')}</span>\n </button>\n )}\n </div>\n\n {product.can_add_note && (\n <div\n className={`collapse-content ${activeCollapse === `note_${product.id}` ? 'is-opened' : 'is-closed'}`}\n >\n <div className=\"pt-4\">\n <textarea\n className=\"animated animatedfadeInDown fadeInDown form-input h-16 bg-gray-50 block\"\n placeholder={t('pages.products.notes_placeholder', 'Add your notes here...')}\n name=\"notes\"\n cols={30}\n rows={10}\n defaultValue={product.notes}\n ></textarea>\n </div>\n </div>\n )}\n\n {product.can_upload_file && (\n <div\n className={`collapse-content ${activeCollapse === `file_${product.id}` ? 'is-opened' : 'is-closed'}`}\n >\n <div className=\"pt-4 px-1\">\n <SallaFileUpload\n accept=\"image/png, image/jpeg, image/jpg, image/gif, video/*, application/pdf\"\n className=\"product-option-uploader\"\n >\n <div className=\"product-option-uploader-placholder\">\n <span className=\"product-option-uploader-placholder-icon\">\n <i className=\"sicon-camera\"></i>\n </span>\n <p className=\"profile-filepond-placholder-text\">\n {t('common.uploader.drag_and_drop', 'Drag and drop files here')}\n </p>\n <span className=\"filepond--label-action\">\n {t('common.uploader.browse', 'Browse')}\n </span>\n </div>\n </SallaFileUpload>\n </div>\n </div>\n )}\n </div>\n </div>\n </section>\n )}\n\n {formEndSlot}\n\n <section className=\"flex bg-white p-5 sm:pb-0 rounded-md rounded-b-none\">\n <div className=\"center-between w-full\">\n <div className=\"form-label\">\n <b className=\"block\">{t('pages.products.price', 'Price')}</b>\n </div>\n\n <div\n className={`flex whitespace-nowrap price-wrapper gap-4 items-center ${product.is_out_of_stock ? 'hidden' : ''}`}\n >\n <div\n className={`price_is_on_sale space-x-2 rtl:space-x-reverse whitespace-nowrap ${product.is_on_sale ? '' : 'hidden'}`}\n >\n <span className=\"total-price text-red-800 font-bold text-xl inline-block\">\n {product.sale_price} <CurrencySymbol currency={product.currency} />\n </span>\n <span className=\"before-price text-gray-500 line-through\">\n {product.regular_price} <CurrencySymbol currency={product.currency} />\n </span>\n </div>\n <div\n className={`starting-or-normal-price gap-4 ${product.is_on_sale ? 'hidden' : 'flex'}`}\n >\n {product.starting_price && (\n <span className=\"starting-price-title\">\n {t('pages.products.starting_price', 'Starting from')}\n </span>\n )}\n <span className=\"total-price font-bold text-xl inline-block\">\n {String(product.starting_price ?? product.price)}{' '}\n <CurrencySymbol currency={product.currency} />\n </span>\n </div>\n </div>\n\n <div\n className={`out-of-stock min-h-7 leading-7 text-base text-red-600 !opacity-50 font-bold ${product.is_out_of_stock ? 'scale-pulse' : 'hidden'}`}\n >\n {t('pages.products.out_of_stock', 'Out of Stock')}\n </div>\n </div>\n </section>\n\n {hasPreorder ? (\n <section className=\"mt-5 p-5\">\n <SallaCountDown preOrder={JSON.stringify(product.preorder)} boxed labeled />\n </section>\n ) : null}\n\n <section className=\"sticky-product-bar bg-white p-5 rounded-md rounded-b-none\">\n {product.is_hidden_quantity || product.type === 'booking' ? (\n <input\n type=\"hidden\"\n value=\"1\"\n name=\"quantity\"\n aria-label={t('pages.products.quantity', 'Quantity')}\n />\n ) : (\n <div className=\"sticky-product-bar__quantity center-between mb-5\">\n <span className=\"form-label font-bold\">{t('pages.products.quantity', 'Quantity')}</span>\n <SallaQuantityInput\n ref={quantityRef}\n max={product.max_quantity ?? undefined}\n value={1}\n name=\"quantity\"\n aria-label={t('pages.products.quantity', 'Quantity')}\n className=\"border-gray-200 flex justify-end\"\n />\n </div>\n )}\n\n <SallaAddProductButton\n ref={addButtonRef}\n {...(product.can_quick_buy ? { quickBuy: true } : {})}\n {...(stickyAddToCart ? { supportStickyBar: true } : {})}\n {...(product.is_require_shipping ? { requiredShipping: true } : {})}\n {...(hasPreorder ? { hasPreOrder: true } : {})}\n amount={amount}\n className=\"mt-5 w-full sticky-product-bar__btn\"\n productStatus={product.status}\n productType={product.type}\n productId={product.id}\n loaderPosition=\"end\"\n type=\"submit\"\n width=\"wide\"\n {...(product.notify_availability\n ? {\n ...(product.notify_availability.subscribed ? { isSubscribed: true } : {}),\n channels: product.notify_availability.channels.join(','),\n ...(product.notify_availability.subscribed_options\n ? {\n subscribedOptions: JSON.stringify(\n product.notify_availability.subscribed_options\n ),\n }\n : {}),\n ...(product.notify_availability.options ? { notifyOptionsAvailability: true } : {}),\n }\n : {})}\n >\n {product.add_to_cart_label}\n </SallaAddProductButton>\n </section>\n\n {product.giftable && (\n <SallaGifting\n className=\"mt-5\"\n widgetSubtitle={giftingIntro}\n productId={Number(product.id)}\n {...(product.is_require_shipping ? { physicalProducts: true } : {})}\n />\n )}\n </form>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/routes/account/orders/single/OrderHeader.tsx","../src/routes/account/orders/single/OrderItemRow.tsx","../src/routes/account/orders/single/OrderActions.tsx","../src/routes/account/orders/single/OrderSections.tsx","../src/routes/account/orders/OrderSinglePage.tsx"],"names":["order","jsx","jsxs","SallaButton","Fragment"],"mappings":"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","file":"OrderSinglePage-7A37FKJE.js","sourcesContent":["import { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { useDate, useNumber } from '../../../../hooks';\nimport { useTranslation } from '../../../../providers/I18nProvider';\nimport type { Order, TwigOrder } from './types';\n\nconst PRINT_WINDOW = 'toolbar=yes, scrollbars=yes, resizable=yes, width=900, height=700';\n\nfunction OrderStatus({ order, paymentExpired }: { order: Order; paymentExpired: boolean }) {\n const { t } = useTranslation();\n if (paymentExpired) {\n return <span className=\"text-red-500\">{t('pages.orders.pending_payment_expired')}</span>;\n }\n return (\n <span\n className=\"text-primary inline-flex items-center rtl:space-x-reverse space-x-1\"\n style={{ color: order.status.color }}\n >\n <i className={`mt-1 ${order.status.icon}`}></i>\n <span> {order.status.name}</span>\n </span>\n );\n}\n\n/** The date / status / links / print row at the top of the order page. */\nexport function OrderHeader({\n order,\n links,\n paymentExpired,\n}: {\n order: Order;\n links: TwigOrder['links'];\n paymentExpired: boolean;\n}) {\n const { t, direction } = useTranslation();\n const { format: formatDate } = useDate();\n const { format: formatNumber } = useNumber();\n\n return (\n <table className=\"min-w-full rounded-md overflow-hidden\">\n <tbody>\n <tr className=\"bg-white overflow-hidden flex md:table-row flex-row md:flex-row flex-wrap md:flex-no-wrap py-1.5 md:py-0\">\n <td\n data-testid=\"store-order-status\"\n className=\"single-order-header-item w-full md:w-auto px-3 md:px-6 py-2 md:py-4 md:h-20 whitespace-nowrap text-sm \"\n >\n <div className=\"rtl:ml-2 ltr:mr-2 font-normal text-gray-400\">\n {t('pages.orders.date')}\n </div>\n <b>{formatNumber(formatDate(order.created_at.date))}</b>\n </td>\n\n <td className=\"single-order-header-item flex justify-between items-center w-full md:w-auto px-3 md:px-6 py-2 md:py-4 md:h-20 whitespace-nowrap text-sm \">\n <OrderStatus order={order} paymentExpired={paymentExpired} />\n\n <div className=\"flex items-center justify-between\">\n {order.type === 'quote' && (\n <span className=\"text-red-500 ml-4\">\n {t('pages.orders.your_order_is_under_review')}\n </span>\n )}\n\n {!!links?.length && (\n <div className=\"flex space-x-2 rtl:space-x-reverse text-start flex-none px-2\">\n {links.map((link) => (\n <a\n key={link.url}\n href={link.url}\n className=\"text-primary-reverse bg-primary px-4 py-2 rounded\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {link.label}{' '}\n <i\n className={\n direction === 'rtl' ? 'sicon-arrow-up-left' : 'sicon-arrow-up-right'\n }\n ></i>\n </a>\n ))}\n </div>\n )}\n {order.urls.receipt && (\n <SallaButton\n fill=\"outline\"\n size=\"small\"\n onClick={() => window.open(order.urls.receipt, '_blank', PRINT_WINDOW)}\n >\n <i className=\"sicon-printer2 v-align\"></i> {t('pages.orders.print')}\n </SallaButton>\n )}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import { createElement } from 'react';\nimport { SallaOrderDetails } from '@salla.sa/twilight-components-react/order-details';\nimport { useDate, useNumber } from '../../../../hooks';\nimport { useTranslation } from '../../../../providers/I18nProvider';\nimport type { FormatMoney, OrderItem, TwigItem } from './types';\n\nfunction ItemAttachments({ item }: { item: OrderItem }) {\n const { t } = useTranslation();\n if (!item.attachments?.length) return null;\n return (\n <div className=\"flow-root rounded-md px-4 border border-gray-200\">\n <dl className=\"text-sm text-dark divide-y divide-border-color\">\n {item.attachments.map((attachment) => (\n <div\n key={`${attachment.type}:${attachment.url}`}\n className=\"py-3.5 md:flex items-center justify-between\"\n >\n <dt className=\"mb-2 md:mb-0\">{t('pages.products.attachments')}</dt>\n <dd\n className={`font-medium ${attachment.type === 'image' ? 'text-gray-900' : 'text-xs'}`}\n >\n {attachment.type === 'image' ? (\n <div className=\"flex rtl:space-x-reverse space-x-2.5\">\n <a href={attachment.url} target=\"_blank\" rel=\"noreferrer\">\n <img\n className=\"h-7 w-7 object-cover rounded-md\"\n src={attachment.url}\n alt={item.name}\n />\n </a>\n </div>\n ) : (\n <a href={attachment.url}>{t('pages.orders.file_url')}</a>\n )}\n </dd>\n </div>\n ))}\n </dl>\n </div>\n );\n}\n\n/** A date-only day (`2026-09-20`) as that calendar day wherever it is formatted, not UTC midnight. */\nfunction calendarDay(day: unknown): Date | string {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(String(day));\n return match ? new Date(+match[1], +match[2] - 1, +match[3]) : String(day);\n}\n\n/** Twig's booking block: the location and each reservation's day and time. */\nfunction ItemReservations({ item, productType }: { item: OrderItem; productType?: string }) {\n const { t } = useTranslation();\n const { format: formatDate } = useDate();\n const { format: formatNumber, useArabicNumerals } = useNumber();\n const reservations = item.product_reservations ?? [];\n if (productType !== 'booking' || !reservations.length) return null;\n const time = (value: unknown) =>\n useArabicNumerals\n ? formatNumber(String(value)).replace(/PM/g, 'م').replace(/AM/g, 'ص')\n : String(value);\n\n return (\n <>\n {item.booking_location && (\n <ul className=\"font-medium text-xs text-gray-600\">\n <li className=\"py-1 flex justify-between items-baseline\">\n <span className=\"mt-5 mb-3.5 text-sm font-bold\">{t('common.elements.location')}</span>\n <span className=\"text-unicode\">{item.booking_location}</span>\n </li>\n </ul>\n )}\n <h2 className=\"mt-5 mb-3.5 text-sm font-bold\">\n {reservations.length > 1 ? t('pages.cart.reservations') : t('pages.cart.item_options')}\n </h2>\n <div className=\"rounded-md p-4 border border-gray-200 mb-2\">\n <ul className=\"font-medium text-xs text-gray-600\">\n {reservations.map((reservation) => (\n <li key={`${reservation.day}:${reservation.from}`} className=\"py-1\">\n <span className=\"text-unicode\">\n {formatNumber(formatDate(calendarDay(reservation.day)))}\n {reservation.from_timestamp\n ? ` (${time(reservation.from)} - ${time(reservation.to)})`\n : ''}\n </span>\n </li>\n ))}\n </ul>\n </div>\n </>\n );\n}\n\nfunction ItemSummary({\n item,\n twigItem,\n money,\n currency,\n}: {\n item: OrderItem;\n twigItem?: TwigItem;\n money: FormatMoney;\n currency: string;\n}) {\n const { t } = useTranslation();\n const product = twigItem?.product;\n const image = product?.image?.url || item.image || item.thumbnail;\n const price = item.amounts.amount ?? { amount: 0, currency };\n const priceText = money(price.amount, price.currency);\n const total = item.amounts.total ?? { amount: 0, currency };\n\n return (\n <div className=\"mb-5 last:mb-0\">\n {product ? (\n <div className=\"flex rtl:space-x-reverse space-x-5 mb-4\">\n <a href={product.url} className=\"shrink-0\">\n <img\n src={image || '/images/placeholder.png'}\n alt={item.name}\n className={`w-18 h-14 object-${image ? 'cover' : 'contain'} rounded-md`}\n />\n </a>\n <div>\n <a\n href={product.url}\n className=\"block leading-5 mb-1.5 md:text-base font-semibold transition-colors text-gray-500 hover:text-primary\"\n >\n {item.name}\n </a>\n <b>{priceText}</b>\n </div>\n </div>\n ) : (\n <div className=\"w-full flex justify-between text-sm py-2.5\">\n <span className=\"w-40 inline-block font-normal\">{item.name}</span>\n <b>{priceText}</b>\n </div>\n )}\n\n <div className=\"w-full flex justify-between text-sm py-2.5\">\n <span className=\"w-40 inline-block font-normal\">{t('pages.products.quantity')}</span>\n <b>{item.quantity}</b>\n </div>\n <div className=\"flex justify-between text-sm py-2.5\">\n <span className=\" w-40 inline-block font-normal\">{t('pages.products.price')}</span>\n <b>{priceText}</b>\n </div>\n <div className=\"flex justify-between text-sm py-2.5\">\n <span className=\"w-40 inline-block font-normal\">{t('pages.orders.total')}</span>\n <b>{money(total.amount, total.currency)}</b>\n </div>\n </div>\n );\n}\n\n/** One item of the order page (the body of `{% for item in package.items %}`). */\nexport function OrderItemRow({\n item,\n twigItem,\n money,\n currency,\n}: {\n item: OrderItem;\n twigItem?: TwigItem;\n money: FormatMoney;\n currency: string;\n}) {\n const { t } = useTranslation();\n const productId = twigItem?.product?.id;\n\n return (\n <div\n data-testid={`store-order-item-${item.id}`}\n data-order-item-id={item.id}\n data-order-item-product-id={productId}\n className=\"order-item bg-white p-5 border-b border-gray-100 first:rounded-t-md last:rounded-b-md last:border-none\"\n >\n <ItemSummary item={item} twigItem={twigItem} money={money} currency={currency} />\n\n {item.availability_date && (\n <div className=\"flex gap-2 text-sm py-2.5 text-blue-500\">\n <i className=\"sicon-info\"></i>\n <span>\n {t('pages.products.expected_to_be')}:{' '}\n <b>{String(item.availability_date).slice(0, 10)}</b>\n </span>\n </div>\n )}\n\n <ItemReservations item={item} productType={twigItem?.product?.type ?? item.product?.type} />\n\n <SallaOrderDetails orderDetails={JSON.stringify(twigItem ?? item)} />\n\n {item.note && (\n <p className=\"mt-3 text-sm text-gray-500\">\n <span>{t('common.elements.note')} : </span>\n {item.note}\n </p>\n )}\n\n <ItemAttachments item={item} />\n\n {/* No React wrapper yet; Twilight upgrades it (adds `hydrated`) before React hydrates. */}\n {productId &&\n createElement('salla-review-order-item', {\n 'product-id': productId,\n suppressHydrationWarning: true,\n })}\n </div>\n );\n}\n","import { useState } from 'react';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { SallaModal } from '@salla.sa/twilight-components-react/modal';\nimport { useIsClient, useUser } from '../../../../hooks';\nimport { useAsyncFn } from '../../../../hooks/useAsyncFn';\nimport { useTranslation } from '../../../../providers/I18nProvider';\nimport { useLocation, useNavigate } from '../../../../providers/NavigationProvider';\nimport type { Order } from './types';\n\nfunction ConfirmModal({\n visible,\n onVisibleChange,\n title,\n subTitle,\n iconStyle,\n confirmColor,\n onConfirm,\n busy,\n}: {\n visible: boolean;\n onVisibleChange: (visible: boolean) => void;\n title: string;\n subTitle: string;\n iconStyle: 'success' | 'error';\n confirmColor?: 'danger';\n onConfirm: () => void;\n busy: boolean;\n}) {\n const { t } = useTranslation();\n // The modal wrapper renders only in the browser, so mount after hydration to match the server.\n const isClient = useIsClient();\n if (!isClient) return null;\n return (\n <SallaModal\n width=\"sm\"\n visible={visible}\n onModalVisibilityChanged={(e) => onVisibleChange(Boolean(e.detail))}\n {...{ 'modal-title': title }}\n subTitle={subTitle}\n iconStyle={iconStyle}\n >\n <div slot=\"footer\" className=\"grid grid-cols-2 gap-3\">\n <SallaButton\n width=\"wide\"\n color={confirmColor}\n className=\"w-full cursor-pointer\"\n onClick={onConfirm}\n disabled={busy}\n >\n {t('common.elements.ok')}\n </SallaButton>\n <SallaButton\n className=\"w-full\"\n fill=\"outline\"\n color=\"light\"\n onClick={() => onVisibleChange(false)}\n disabled={busy}\n >\n {t('common.elements.cancel')}\n </SallaButton>\n </div>\n </SallaModal>\n );\n}\n\nfunction PaymentOrReorder({\n order,\n paymentExpired,\n canReorder,\n onReorder,\n busy,\n}: {\n order: Order;\n paymentExpired: boolean;\n canReorder: boolean;\n onReorder: () => void;\n busy: boolean;\n}) {\n const { t } = useTranslation();\n if (order.actions.payable) {\n return paymentExpired || !order.urls.checkout ? (\n <span className=\"text-red-500\">{t('pages.orders.pending_payment_expired')}</span>\n ) : (\n <SallaButton width=\"wide\" href={order.urls.checkout}>\n <i className=\"sicon sicon-wallet rtl:ml-2 ltr:mr-2\"></i>\n <span>{t('pages.orders.finish_payment')}</span>\n </SallaButton>\n );\n }\n if (!canReorder) return null;\n return (\n <>\n <div className=\"text-sm\">\n <h3 className=\"font-bold text-lg leading-none mb-1\">{t('pages.orders.reorder')}</h3>\n <p className=\"text-gray-500\">{t('pages.orders.reorder_description')}</p>\n </div>\n <SallaButton\n data-testid=\"store-order-reorder-btn\"\n shape=\"link\"\n onClick={onReorder}\n disabled={busy}\n >\n <i className=\"sicon sicon-rotate rtl:ml-2 ltr:mr-2\"></i>\n <span>{t('pages.orders.reorder')}</span>\n </SallaButton>\n </>\n );\n}\n\n/** The \"Reorder & Cancel\" card, its pending-payment state and the two confirmations. */\nexport function OrderActions({ order, paymentExpired }: { order: Order; paymentExpired: boolean }) {\n const { t } = useTranslation();\n // Token-based, so the server and the first client render agree (the user query loads later).\n const { isLoggedIn } = useUser();\n const navigate = useNavigate();\n const location = useLocation();\n const [showReorder, setShowReorder] = useState(false);\n const [showCancel, setShowCancel] = useState(false);\n const { reorderable, cancellable, payable } = order.actions;\n const canReorder = isLoggedIn && reorderable;\n\n const [reorderState, handleReorder] = useAsyncFn(async () => {\n await window.salla?.order.createCartFromOrder(Number(order.id));\n setShowReorder(false);\n navigate('/cart');\n }, [navigate, order.id]);\n\n const [cancelState, handleCancel] = useAsyncFn(async () => {\n await window.salla?.order.cancel(Number(order.id));\n setShowCancel(false);\n navigate(location.pathname, { replace: true });\n }, [navigate, order.id, location.pathname]);\n\n if (!reorderable && !cancellable && !payable) return null;\n\n return (\n <>\n <div className=\"bg-white rounded-md p-5 divide-y divide-border-color space-y-4\">\n {(reorderable || payable) && (\n <div className={payable ? 'flex-center' : 'center-between'}>\n <PaymentOrReorder\n order={order}\n paymentExpired={paymentExpired}\n canReorder={!!canReorder}\n onReorder={() => setShowReorder(true)}\n busy={reorderState.loading}\n />\n </div>\n )}\n\n {cancellable && (\n <div className=\"center-between pt-4\">\n <div className=\"text-sm\">\n <h3 className=\"font-bold text-lg leading-none mb-1\">{t('pages.orders.cancel')}</h3>\n <p className=\"text-gray-500\">{t('pages.order.order_cancelation_desc')}</p>\n </div>\n <SallaButton\n data-testid=\"store-order-cancel-btn\"\n shape=\"link\"\n color=\"danger\"\n onClick={() => setShowCancel(true)}\n disabled={cancelState.loading}\n >\n <i className=\"sicon sicon-cancel-circle rtl:ml-2 ltr:mr-2\"></i>\n <span>{t('pages.orders.cancel')}</span>\n </SallaButton>\n </div>\n )}\n </div>\n\n {/* Always mounted: salla-modal moves itself under <body> and opens from `visible`. */}\n {canReorder && (\n <ConfirmModal\n visible={showReorder}\n onVisibleChange={setShowReorder}\n title={t('pages.orders.reorder')}\n subTitle={t('pages.orders.reorder_confirmation')}\n iconStyle=\"success\"\n onConfirm={handleReorder}\n busy={reorderState.loading}\n />\n )}\n {cancellable && (\n <ConfirmModal\n visible={showCancel}\n onVisibleChange={setShowCancel}\n title={t('common.elements.warning')}\n subTitle={t('pages.orders.cancel_confirmation')}\n iconStyle=\"error\"\n confirmColor=\"danger\"\n onConfirm={handleCancel}\n busy={cancelState.loading}\n />\n )}\n </>\n );\n}\n","import { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { SallaRatingStars } from '@salla.sa/twilight-components-react/rating-stars';\nimport { useTranslation } from '../../../../providers/I18nProvider';\nimport { useQuery } from '@tanstack/react-query';\nimport { order as orderApi } from '../../../../api/order';\nimport type { FormatMoney, Order, TwigOrder, TwigRating } from './types';\n\nfunction RatingAction({\n disabled,\n endedKey,\n color,\n fill,\n icon,\n onClick,\n}: {\n disabled: boolean;\n endedKey: string;\n color: 'dark' | 'danger';\n fill: 'outline';\n icon: string;\n onClick: () => void;\n}) {\n const { t } = useTranslation();\n return (\n <div className=\"tooltip-toggle tooltip-toggle--hover icon-trigger mobile-shifted\">\n {disabled && (\n <div className=\"tooltip-content shadow-md rounded\">\n <small> {t(endedKey)}.</small>\n </div>\n )}\n <SallaButton\n loaderPosition=\"center\"\n disabled={disabled}\n shape=\"icon\"\n fill={fill}\n color={color}\n size=\"medium\"\n onClick={disabled ? undefined : onClick}\n >\n <i className={`${icon} text-xl`}></i>\n </SallaButton>\n </div>\n );\n}\n\n/** A store or shipping rating the customer left, with its edit / delete buttons. */\nexport function RatingSection({\n title,\n rating,\n type,\n allowUpdate,\n}: {\n title: string;\n rating: TwigRating;\n type: 'store' | 'shipping';\n allowUpdate: boolean;\n}) {\n const dispatch = (event: string, payload: Record<string, unknown>) =>\n window.salla?.event?.dispatch(event, payload);\n const locked = !rating.can_update;\n\n return (\n <section className=\"flex justify-between items-start bg-white p-5 rounded-md\">\n <div>\n <h2 className=\"text-lg font-bold mb-5\">{title}</h2>\n <p className=\"mb-2\">{rating.content}</p>\n <SallaRatingStars withLabel value={rating.stars} />\n </div>\n <div className=\"rating-actions\">\n {allowUpdate && (\n <>\n <RatingAction\n disabled={locked}\n endedKey=\"pages.order.edit_period_ended\"\n color=\"dark\"\n fill=\"outline\"\n icon=\"sicon-format-border-color\"\n onClick={() => dispatch('rating::edit', { type, feedback_id: String(rating.id) })}\n />\n <RatingAction\n disabled={locked}\n endedKey=\"pages.order.delete_period_ended\"\n color=\"danger\"\n fill=\"outline\"\n icon=\"sicon-trash-2\"\n onClick={() => dispatch('rating::delete', { feedback_id: String(rating.id) })}\n />\n </>\n )}\n </div>\n </section>\n );\n}\n\ninterface Shipment {\n id?: number;\n name?: string;\n logo?: string;\n number?: string;\n tracking?: string | null;\n}\n\nfunction ShippingRow({ shipment }: { shipment: Shipment }) {\n const { t } = useTranslation();\n // Twig treats the string \"0\" as empty.\n const hasNumber = !!shipment.number && shipment.number !== '0';\n\n return (\n <div className=\"flex flex-col md:flex-row justify-between md:items-center bg-white px-5 py-3 border-b border-gray-100 rounded-t-md text-sm space-y-4 md:space-y-0\">\n <div className=\"flex items-center space-x-2 rtl:space-x-reverse\">\n {shipment.logo && (\n <img src={shipment.logo} className=\"max-w-16 max-h-8\" alt={shipment.name} />\n )}\n <span>{shipment.name}</span>\n </div>\n <div className=\"flex space-x-5 rtl:space-x-reverse\">\n {hasNumber && (\n <span>\n {t('pages.orders.shipment_no')}: <span className=\"font-bold\">{shipment.number}</span>\n </span>\n )}\n {shipment.tracking && (\n <a\n className=\"font-bold text-primary hover:opacity-80 flex items-center\"\n href={shipment.tracking}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n <span className=\"sicon-shipping rtl:ml-1 ltr:mr-1\"></span>\n {t('pages.orders.tracking_url')}\n </a>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * The shipping company rows above the items (Twig's per-package titles). The order carries only\n * its first shipment, so the rest come from the shipments endpoint.\n */\nexport function ShippingHeader({ twig, order }: { twig: TwigOrder; order: Order }) {\n const { data } = useQuery({\n ...orderApi.queries.shipments(String(order.id)),\n enabled: order.features.shippable && !twig.is_pickable,\n });\n if (twig.is_pickable) return null;\n\n const shipments: Shipment[] = data?.length\n ? data.map((shipment) => ({ ...shipment, tracking: shipment.tracking_url }))\n : twig.shipping\n ? [{ ...twig.shipping, tracking: twig.shipping.tracing_link }]\n : [];\n\n return (\n <>\n {shipments.map((shipment) => (\n <ShippingRow key={shipment.id ?? shipment.name} shipment={shipment} />\n ))}\n </>\n );\n}\n\n/** An option's price as a number: the API sends a number, `{ amount }` or an empty array. */\nconst optionPrice = (price: unknown): number =>\n typeof price === 'number' ? price : ((price as { amount?: number } | null)?.amount ?? 0);\n\n/** The order-level options table (`order.options`). */\nexport function OrderOptionsTable({\n options,\n money,\n currency,\n}: {\n options: NonNullable<TwigOrder['options']>;\n money: FormatMoney;\n currency: string;\n}) {\n const { t } = useTranslation();\n return (\n <div className=\"bg-white p-5 rounded-md\">\n <h2 className=\"mb-3.5 text-sm font-bold\">{t('pages.checkout.cart_options_title')}</h2>\n <table className=\"table-fixed w-full border border-gray-200\">\n <thead>\n <tr className=\"border-b border-gray-200\">\n <th scope=\"col\" className=\"p-3 text-start text-sm\">\n {t('pages.order.option_name')}\n </th>\n <th scope=\"col\" className=\"p-3 text-sm\">\n {t('pages.order.option_content')}\n </th>\n <th scope=\"col\" className=\"p-3 rtl:text-left ltr:text-right text-sm\">\n {t('pages.products.price')}\n </th>\n </tr>\n </thead>\n <tbody>\n {options.flatMap((option) =>\n (option.options ?? []).map((value) => (\n <tr\n key={`${value.name}:${value.value}`}\n className=\"border-b last:border-b-0 border-gray-200\"\n >\n <td className=\"text-sm p-3\">{value.name} :</td>\n <td className=\"text-center p-3 font-medium text-xs\">{value.value}</td>\n <td className=\"rtl:text-start ltr:text-end p-3 font-medium text-xs\">\n <strong>{money(optionPrice(value.price), currency)}</strong>\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n","import { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { SallaRatingModal } from '@salla.sa/twilight-components-react/rating-modal';\nimport { SallaEditOrderButton } from '@salla.sa/twilight-components-react/edit-order-button';\nimport { SallaOrderBranch } from '@salla.sa/twilight-components-react/order-branch';\nimport { SallaOrderTotalsCard } from '@salla.sa/twilight-components-react/order-totals-card';\nimport { HookSlot, usePageConfig } from '../../../hooks';\nimport { useMoney } from '../../../hooks/useMoney';\nimport { useTranslation } from '../../../providers/I18nProvider';\nimport { useTwilight } from '../../../providers/twilight-context';\nimport type { OrderSinglePageProps } from '../types';\nimport { OrderHeader } from './single/OrderHeader';\nimport { OrderItemRow } from './single/OrderItemRow';\nimport { OrderActions } from './single/OrderActions';\nimport { OrderOptionsTable, RatingSection, ShippingHeader } from './single/OrderSections';\nimport type { TwigOrder } from './single/types';\n\n/** Twig's `inner_title` extras: the gift tag and the edit-order button. */\nfunction TitleRow({ order }: { order: OrderSinglePageProps['order'] }) {\n const { t } = useTranslation();\n return (\n <div className=\"flex justify-between items-center\">\n {order.type === 'buy_as_gift' || order.source?.type === 'buy_as_gift' ? (\n <span className=\"inline-block text-primary\">\n <i className=\"sicon-gift-sharing\"></i> {t('pages.orders.gift_tag')}\n </span>\n ) : (\n <span />\n )}\n <div className=\"flex items-center gap-3 flex-wrap\">\n <SallaEditOrderButton data-testid=\"store-order-edit-btn\" orderId={String(order.id)} />\n </div>\n </div>\n );\n}\n\nfunction RefundMessage({ message }: { message?: string }) {\n if (!message) return null;\n return (\n <div className=\"min-w-full rounded-md overflow-hidden\">\n <div className=\"bg-white flex items-center gap-1 rounded-md px-3 py-5 md:px-5\">\n <i className=\"sicon-refund h-6 w-6\"></i>\n <p className=\"font-medium text-base\" dangerouslySetInnerHTML={{ __html: message }} />\n </div>\n </div>\n );\n}\n\nfunction RatingNotices({ twig }: { twig: TwigOrder }) {\n const { t } = useTranslation();\n const { store } = useTwilight();\n const settings = store?.settings?.rating;\n const rated = !!twig.rating && !Array.isArray(twig.rating);\n\n return (\n <>\n {settings?.allow_update && rated && (\n <div className=\"flex items-start gap-2 bg-blue-50 border border-blue-200 text-blue-500 px-2 py-3 rounded-md text-sm\">\n <i className=\"sicon-info\"></i>\n <p>\n {t('pages.order.can_edit_or_delete_your_review_within')} {settings.update_period}{' '}\n {t('pages.order.days_since_added')}.\n </p>\n </div>\n )}\n {twig.can_rate && (\n <div className=\"rating-header gradient-bg center-between\">\n <div>\n <h2 className=\"font-bold mb-1\">{t('pages.order.order_rating_title')}</h2>\n <p className=\"text-sm\">{t('pages.order.order_rating_message')}</p>\n </div>\n <SallaButton\n data-testid=\"store-order-rate-btn\"\n color=\"light\"\n className=\"btn--rounded-full !text-primary\"\n onClick={() => window.salla?.event?.dispatch('rating::open')}\n >\n {t('pages.rating.rate')}\n </SallaButton>\n </div>\n )}\n </>\n );\n}\n\nfunction OrderRatings({ twig }: { twig: TwigOrder }) {\n const { t } = useTranslation();\n const { store } = useTwilight();\n const allowUpdate = !!store?.settings?.rating?.allow_update;\n const rating = Array.isArray(twig.rating) ? undefined : twig.rating;\n\n return (\n <>\n {rating?.store?.stars ? (\n <RatingSection\n title={t('pages.rating.rate_the_store')}\n rating={rating.store}\n type=\"store\"\n allowUpdate={allowUpdate}\n />\n ) : null}\n {rating?.shipping?.stars ? (\n <RatingSection\n title={t('pages.rating.rate_shipping')}\n rating={rating.shipping}\n type=\"shipping\"\n allowUpdate={allowUpdate}\n />\n ) : null}\n </>\n );\n}\n\n/**\n * The order page as the Twig storefront renders it (Raed's `pages/customer/orders/single.twig`).\n * The markup and the Twilight components read the order in Twig's shape (`componentsOrder`);\n * `order` supplies what that shape lacks and Twig computed on the server: the actions and the\n * receipt and payment URLs.\n */\nexport function OrderSinglePage({ order, page, componentsOrder }: OrderSinglePageProps) {\n // The order components read the order id from `salla.config.page.id`, which the router\n // only sets on client-side navigations — seed it so a direct load works too.\n usePageConfig(page);\n const { store } = useTwilight();\n const { format } = useMoney();\n const twig = (componentsOrder ?? { items: [] }) as unknown as TwigOrder;\n const paymentExpired =\n order.actions.payable && (order.payment?.pending_payment_ends_at ?? 0) === 0;\n const money = (amount: number, currency?: string) => format(amount, { currency });\n\n return (\n <div className=\"space-y-4\">\n <TitleRow order={order} />\n\n <HookSlot name=\"customer:orders.single.details.start\" />\n\n <OrderHeader order={order} links={twig.links} paymentExpired={paymentExpired} />\n\n {twig.is_pickable && <SallaOrderBranch data-testid=\"store-order-branch\" stackCards />}\n\n <RefundMessage message={order.refund_message} />\n\n <RatingNotices twig={twig} />\n\n <div className=\"overflow-hidden space-y-5\">\n <div className=\"shipping-orders\">\n <ShippingHeader twig={twig} order={order} />\n {order.items.map((item, index) => (\n <OrderItemRow\n key={item.id}\n item={item}\n twigItem={twig.items[index]}\n money={money}\n currency={order.currency}\n />\n ))}\n </div>\n\n {!!twig.options?.length && (\n <OrderOptionsTable options={twig.options} money={money} currency={order.currency} />\n )}\n </div>\n\n {componentsOrder && (\n <SallaOrderTotalsCard\n data-testid=\"store-order-totals\"\n order={JSON.stringify(componentsOrder)}\n />\n )}\n\n <OrderActions order={order} paymentExpired={paymentExpired} />\n\n <OrderRatings twig={twig} />\n\n <HookSlot name=\"customer:orders.single.details.end\" />\n\n {(twig.can_rate || store?.settings?.rating?.allow_update) && (\n <SallaRatingModal data-testid=\"store-order-rating-modal\" />\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/product/ProductDetails.tsx"],"names":["Fragment"],"mappings":"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","file":"ProductDetails-XDNE62ZZ.js","sourcesContent":["import { Fragment, useState } from 'react';\nimport { HookSlot } from '../../hooks/HookSlot';\nimport { HookName } from '../../types/hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { CurrencySymbol, Link, Image } from '../common';\nimport { SallaRatingStars } from '@salla.sa/twilight-components-react/rating-stars';\nimport { SallaSocialShare } from '@salla.sa/twilight-components-react/social-share';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { SallaInstallment } from '@salla.sa/twilight-components-react/installment';\nimport { SallaMetadata } from '@salla.sa/twilight-components-react/metadata';\nimport { formatSallaPlural } from '../../utils/salla-plural';\nimport type { Product } from '../../types';\n\ninterface ProductDetailsProps {\n product: Product;\n showTags?: boolean;\n}\n\nexport function ProductDetails({ product, showTags = true }: ProductDetailsProps) {\n const { t } = useTranslation();\n\n // Context for all product hooks - contains product data\n const productHookContext = { product };\n\n return (\n <>\n <HookSlot name={HookName.PRODUCT_DESCRIPTION_START} context={productHookContext} />\n\n {product.brand?.name && (\n <div className=\"product-brand mb-5 w-12\">\n <Link className=\"brand-logo\" to={product.brand.url || '#'} title={product.brand.name}>\n <Image\n className=\"max-h-full object-contain\"\n src={product.brand.logo}\n title={product.brand.name}\n alt={product.brand.name}\n aspectRatio=\"1/1\"\n />\n </Link>\n </div>\n )}\n\n <h1 className=\"text-xl md:text-2xl leading-10 font-bold mb-6 text-gray-800\">\n {product.name}\n </h1>\n\n {product.subtitle && (\n <h2 className=\"product-entry__sub-title text-sm text-gray-500 leading-6 mb-2.5\">\n {product.subtitle}\n </h2>\n )}\n\n {product.rating && (\n <SallaRatingStars value={product.rating.stars} reviews={product.rating.count} />\n )}\n\n {product.is_taxable && (\n <small className=\"color-grey\">{t('pages.products.tax_included', 'VAT Inclusive')}</small>\n )}\n\n <ProductPrice product={product} />\n\n <ProductDescription product={product} />\n\n {!!product.tags?.length && showTags && (\n <div className=\"mb-3\">\n {product.tags.map((tag, index) => (\n <Fragment key={tag.name}>\n <Link\n to={tag.url}\n className=\"rtl:ml-2 ltr:mr-2 inline-flex text-gray-500 hover:text-primary underline text-sm mb-1\"\n >\n {tag.name}\n </Link>\n {index < product.tags!.length - 1 && ','}\n </Fragment>\n ))}\n </div>\n )}\n\n <div className=\"flex rtl:space-x-reverse space-x-3\">\n <SallaSocialShare className=\"inline-flex mb-5\" aria-label=\"social share\" />\n\n <SallaButton\n className=\"btn--wishlist animated hidden sm:inline-flex\"\n data-id={product.id}\n onClick={() => window.salla?.wishlist.toggle(product.id)}\n shape=\"icon\"\n fill=\"outline\"\n color=\"light\"\n ariaLabel=\"add to wishlist\"\n >\n <i className=\"sicon-heart\"></i>\n </SallaButton>\n </div>\n\n <ProductQuantityInfo product={product} />\n\n {product.sku && (\n <div className=\"mb-4 flex justify-between sm:grid sm:grid-cols-3 bg-white rounded-md px-4 py-2\">\n <div className=\"flex items-center\">\n <i className=\"sicon-barcode mx-1\"></i>\n {t('pages.products.sku', 'SKU')}\n </div>\n <div className=\"text-unicode\">{product.sku}</div>\n </div>\n )}\n\n {product.barcode && (\n <div className=\"mb-4 flex justify-between sm:grid sm:grid-cols-3 bg-white rounded-md px-4 py-2\">\n <div className=\"flex items-center\">\n <i className=\"sicon-barcode mx-1\"></i>\n {t('pages.products.barcode')}\n </div>\n <div className=\"text-unicode\">{product.barcode}</div>\n </div>\n )}\n\n {product.show_availability && (\n <section className=\"bg-white p-5 rounded-md mb-5 last:mb-0\">\n <div className=\"center-between\">\n <label className=\"flex items-center text-base\">\n <span className=\"sicon-location rtl:ml-1 ltr:mr-1\"></span>\n <span className=\"inline-block\">\n {t('pages.products.availability', 'Availability')}\n </span>\n </label>\n <div className=\"mt-1 sm:mt-0 sm:col-span-2 text-end\">\n <div className=\"flex rtl:space-x-reverse space-x-3\">\n <a\n href=\"#!\"\n onClick={() =>\n window.salla?.event?.dispatch('scopes::open', {\n mode: 'availability',\n product_id: String(product.id),\n })\n }\n className=\"group text-primary flex items-center justify-center\"\n >\n <span>{t('pages.products.select_branch', 'Select Branch')}</span>\n <span className=\"sicon-keyboard_arrow_left mr-2 transition-all group-hover:-translate-x-1\"></span>\n </a>\n </div>\n </div>\n </div>\n </section>\n )}\n\n <HookSlot name={HookName.PRODUCT_DESCRIPTION} context={productHookContext} />\n\n <SallaInstallment\n price={String(\n typeof product.base_currency_price === 'object'\n ? product.base_currency_price.amount\n : product.base_currency_price\n )}\n />\n\n {product.has_metadata && <SallaMetadata />}\n </>\n );\n}\n\nfunction ProductPrice({ product }: { product: Product }) {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex whitespace-nowrap gap-4 items-center\">\n <div\n className={`${product.is_on_sale ? '' : 'hidden'} space-x-2 rtl:space-x-reverse whitespace-nowrap`}\n >\n <p className=\"text-red-800 font-bold text-xl inline-block\">\n {product.sale_price} <CurrencySymbol currency={product.currency} />\n </p>\n <span className=\"text-gray-500 line-through\">\n {product.regular_price} <CurrencySymbol currency={product.currency} />\n </span>\n </div>\n <div className={`gap-4 ${product.is_on_sale ? 'hidden' : 'flex'}`}>\n {product.starting_price && (\n <span>{t('pages.products.starting_price', 'Starting from')}</span>\n )}\n <p className=\"font-bold text-xl inline-block\">\n {product.starting_price ?? product.price} <CurrencySymbol currency={product.currency} />\n </p>\n </div>\n </div>\n );\n}\n\nfunction ProductDescription({ product }: { product: Product }) {\n const { t } = useTranslation();\n const [isExpanded, setIsExpanded] = useState(false);\n\n if (!product.description) return null;\n\n const description = product.description.replace(/ /g, '\\n');\n\n if (product.has_read_more) {\n return (\n <div className=\"product__description p-2 px-5 sm:p-1 leading-7 mb-3\">\n <article\n className=\"article article--main relative leading-8 overflow-hidden transition-all duration-300 py-4\"\n id=\"more-content\"\n style={{ maxHeight: isExpanded ? 'none' : '5.25rem' }}\n dangerouslySetInnerHTML={{ __html: description }}\n />\n <button\n type=\"button\"\n id=\"btn-show-more\"\n className={`link--primary inline-block mt-2 cursor-pointer bg-transparent border-0 p-0 ${isExpanded ? 'is-expanded' : ''}`}\n onClick={() => setIsExpanded(true)}\n >\n {t('pages.products.read_more', 'Read more')}\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"product__description p-2 px-5 sm:p-1 leading-7 mb-3\">\n <article className=\"article--main pb-1\" dangerouslySetInnerHTML={{ __html: description }} />\n </div>\n );\n}\n\nfunction ProductQuantityInfo({ product }: { product: Product }) {\n const { t } = useTranslation();\n if (product.sold_quantity == null && !product.can_show_remained_quantity) {\n return null;\n }\n\n return (\n <div className=\"bg-white py-2.5 mb-5 rounded-md inline-flex text-sm\">\n {(product.sold_quantity ?? 0) > 0 && (\n <div className=\"px-4 !text-red-800\">\n <i className=\"sicon-fire rtl:ml-1.5 ltr:mr-1.5\"></i> {t('pages.products.sold', 'Sold')}{' '}\n {/* Salla ships `sold_times` in Laravel plural format; resolve it for the count. */}\n <span>{formatSallaPlural(t('pages.products.sold_times'), product.sold_quantity!)}</span>\n </div>\n )}\n {product.can_show_remained_quantity && (\n <div className=\"px-4 rtl:even:border-r ltr:even:border-l even:border-gray-200\">\n <i className=\"!text-red-800 sicon-box-bankers rtl:ml-1.5 ltr:mr-1.5\"></i>\n {t('pages.products.remained', 'Remained')}: {product.quantity}\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tanstack/search.ts","../src/routes/root/beforeLoad.ts","../src/routes/root/head.ts","../src/tanstack/store-base.ts","../src/tanstack/router.tsx","../src/tanstack/document-class.ts"],"names":["store","createTanStackRouter"],"mappings":"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","file":"chunk-3YAR2SXQ.js","sourcesContent":["import { defaultStringifySearch } from '@tanstack/react-router';\n\nconst isList = ([key, value]: [string, unknown]) => key.endsWith('[]') && Array.isArray(value);\n\n/** The router's query serialiser, writing `[]` keys back as repeated keys, as `<salla-filters>` does. */\nexport function stringifySearch(search: Record<string, unknown>): string {\n const entries = Object.entries(search);\n const lists = entries.filter(isList) as [string, unknown[]][];\n if (!lists.length) return defaultStringifySearch(search);\n\n const rest = defaultStringifySearch(\n Object.fromEntries(entries.filter((entry) => !isList(entry)))\n );\n const repeated = lists.flatMap(([key, values]) =>\n values.map(\n (value) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(typeof value === 'string' ? value : JSON.stringify(value))}`\n )\n );\n return `${rest || '?'}${rest ? '&' : ''}${repeated.join('&')}`;\n}\n","import type { QueryClient } from '@tanstack/react-query';\nimport { redirect } from '@tanstack/react-router';\nimport { createIsomorphicFn } from '@tanstack/react-start';\nimport { getCookie } from '@tanstack/react-start/server';\nimport type { StoreContext } from '../../api/store';\nimport { store as storeApi } from '../../api/store';\nimport { apps, type AppSnippet, type AppSettings } from '../../api/apps';\nimport { translations } from '../../api/translations';\nimport { FALLBACK_LOCALE, getLanguageInfo } from '../../providers/locale-constants';\nimport { createI18nInstance } from '../../providers/i18n-factory';\nimport type { TwilightLocation } from '../../twilight/context';\nimport { getTwilightContext, updateTwilightContext } from '../../twilight/context';\nimport {\n AUTH_TOKEN_COOKIE_NAME,\n extractTokenFromCookies,\n syncScopeCookie,\n} from '../../utils/cookies';\nimport { syncSdkLocale, syncSdkThemeVersion } from '../../utils/sdk-helpers';\nimport { SettingsError } from '../../utils/errors';\nimport { resolveStoreBaseRedirect } from '../../utils/store-identity';\n\n// Reads the `token` cookie from the incoming request on the SERVER. twilightMiddleware\n// extracts the same cookie into a custom ALS, but that ALS does NOT propagate to the\n// route's beforeLoad / React SSR render (they run in a different async scope), so the\n// token must be read again here from the framework's own request context. On the client\n// this is a no-op (the cookie is read from document.cookie below instead). The server\n// import is stripped from the client bundle by createIsomorphicFn.\nconst readServerCookieToken = createIsomorphicFn()\n .server((): string | null => {\n try {\n return getCookie(AUTH_TOKEN_COOKIE_NAME) ?? null;\n } catch {\n return null;\n }\n })\n .client((): string | null => null);\n\nexport interface BeforeLoadResult {\n settings: StoreContext;\n locale: string;\n dir: 'ltr' | 'rtl';\n authToken: string | null;\n /** Installed apps' snippets, threaded through the beforeLoad context (and recovered on the\n * client via ensureTwilightContextFromMatches) so AppsSnippets can render CDN tags in SSR. */\n appsSnippets?: AppSnippet[];\n /** Per-app public `app.*` buckets, threaded the same way so rootHead can install the\n * `Salla.appScope` factory inline in the SSR head. */\n appsSettings?: AppSettings;\n}\n\n/**\n * The platform's copy for `locale`, with this merchant's own wording over it.\n *\n * Returns the platform's copy untouched — and makes no request — unless the\n * settings say this language has overrides. That gate is the whole reason this\n * is affordable: the object 404s for most stores, uncached, on the critical\n * path of an SSR render.\n *\n * The entry is found by ISO code rather than by index or key. The API sends\n * `languages` as an object keyed by **upper-case** ISO, and `storeApi` converts\n * it to an array on the way through (`languagesToArray`), so neither the\n * upper-case key nor a position is available here — and matching case-sensitively\n * on `code` would be a lookup that misses silently, leaving the flag absent and\n * the feature simply never running.\n *\n * Nothing about this is fatal. A failed override read leaves the platform's\n * copy in place, which is a storefront in the words Salla ships rather than a\n * storefront that did not render.\n */\nasync function withMerchantTranslations(\n queryClient: QueryClient,\n settings: StoreContext,\n locale: string,\n common: Awaited<ReturnType<typeof translations.get>>\n): Promise<Awaited<ReturnType<typeof translations.get>>> {\n const wanted = locale.toLowerCase();\n const language = settings.languages?.find(\n (entry) => (entry.iso_code ?? entry.code)?.toLowerCase() === wanted\n );\n const storeId = settings.store?.id;\n\n if (!language?.has_custom_translations || !storeId) return common;\n\n try {\n const overrides = await queryClient.ensureQueryData(\n translations.queries.byStore(storeId, locale)\n );\n\n return translations.merge(common, overrides, locale);\n } catch (error) {\n console.warn('[salla] merchant translations could not be read; using the platform copy', error);\n return common;\n }\n}\n\nexport async function rootBeforeLoad(ctx: {\n params: Record<string, string>;\n location: TwilightLocation;\n context: {\n queryClient: QueryClient;\n setLocation?: (location: Partial<TwilightLocation>) => void;\n };\n serverContext?: {\n authToken?: string | null;\n };\n}): Promise<BeforeLoadResult> {\n const locale = ctx.params.locale || FALLBACK_LOCALE;\n const { dir } = getLanguageInfo(locale);\n\n if (ctx.context.setLocation) {\n ctx.context.setLocation(ctx.location);\n }\n\n // Set locale in context before any API calls so interceptor uses correct locale\n updateTwilightContext({ locale });\n\n // Re-assert the locale on the Salla SDK on every navigation. The SDK's axios\n // accept-language header drifts off the route locale (navigator.language default,\n // account-language override on profile fetch — see syncSdkLocale), which makes\n // SDK API calls (e.g. the cart's salla.api.cart.details) return wrong-locale data.\n syncSdkLocale(locale);\n\n // Mirror the SDK's selected branch into the `scope` cookie. The SDK persists the\n // selection in localStorage ONLY, so the server — which can only see cookies —\n // would otherwise compute scope=null for every visitor who picked a branch, and\n // the dehydrated settings query (keyed on the scope) would never match on the\n // client. No-op on the server and while the SDK storage API is still hydrating.\n syncScopeCookie();\n\n const [settingsResult, translationsResult, snippetsResult, appSettingsResult] = await Promise.all(\n [\n ctx.context.queryClient.ensureQueryData(storeApi.queries.settings()),\n ctx.context.queryClient.ensureQueryData(translations.queries.byLocale(locale)),\n // Snippets → SSR CDN <script> tags (AppsSnippets.ssrCdnScripts). Non-fatal + logged:\n // on failure AppsSnippets falls back to its own client-side query for the same data,\n // so the tags render a paint later instead of being lost for the page load.\n ctx.context.queryClient.ensureQueryData(apps.queries.snippets()).catch((error): undefined => {\n console.warn('[salla] apps/snippets prefetch failed; rendering no CDN snippet tags', error);\n return undefined;\n }),\n // Buckets → rootHead installs `Salla.appScope` inline in the SSR head (before any snippet\n // onReady runs). Non-fatal + logged: the head installs the factory either way, and the\n // client query seeds the buckets into that install once it resolves.\n ctx.context.queryClient.ensureQueryData(apps.queries.settings()).catch((error): undefined => {\n console.warn(\n '[salla] apps/snippets/settings prefetch failed; appScope buckets unseeded',\n error\n );\n return undefined;\n }),\n ]\n );\n\n if (!settingsResult) {\n throw new SettingsError('Failed to load store settings. Make sure VITE_STORE_DOMAIN is set.');\n }\n\n // Settings answered for another market name another theme version; the SDK only\n // read its `s-version-id` at init — see syncSdkThemeVersion.\n syncSdkThemeVersion(settingsResult.headers);\n\n // On a host where the store is the root of every URL, a page has one address:\n // `/<username>/…`. A request that found its store some other way (`?storeId=`,\n // the preview cookie, `VITE_STORE_DOMAIN`) is sent there now that the settings\n // say what the username is. A full load rather than a client navigation, because\n // the router handling this request was built without that root.\n const storeBaseHref = resolveStoreBaseRedirect(settingsResult.store?.username, ctx.location.href);\n if (storeBaseHref) {\n throw redirect({ href: storeBaseHref, reloadDocument: true, replace: true });\n }\n\n // The merchant's own wording, laid over the platform's — but only when the\n // settings say this language has any.\n //\n // Sequenced after the `Promise.all` on purpose: the object is keyed by\n // `settings.store.id`, which the settings query is what produces, so this\n // cannot join the batch above. The cost of a second round trip is why it is\n // gated rather than always fetched — see `api/translations.ts` for the two\n // corrections that shape led to.\n const messages = await withMerchantTranslations(\n ctx.context.queryClient,\n settingsResult,\n locale,\n translationsResult\n );\n\n // Create i18n instance with loaded translations\n const i18n = createI18nInstance(locale, messages ?? undefined);\n\n // Resolve authToken with fallback chain:\n // 1. SSR context (from middleware extracting cookies on server)\n // 2. The twilight context token. On the SERVER this is the token twilightMiddleware\n // extracted from the `token` cookie into the request ALS — reading it here is\n // essential, otherwise this loader's updateTwilightContext() below would\n // overwrite the middleware's token with null and every SSR render (e.g. the\n // account hub) would be unauthenticated. On the CLIENT it's the clientStore\n // token from hydration or a previous navigation.\n // 3. The `token` cookie read directly — client fallback when clientStore is empty\n // and salla.storage hasn't hydrated yet.\n // 4. Salla SDK storage (salla.storage.get('token'))\n let existingToken: string | null = null;\n try {\n existingToken = getTwilightContext().authToken;\n } catch {\n // No request context (e.g. server call outside the middleware ALS) — fall through.\n existingToken = null;\n }\n const cookieToken =\n typeof document !== 'undefined'\n ? extractTokenFromCookies(document.cookie, AUTH_TOKEN_COOKIE_NAME)\n : null;\n const sallaToken =\n typeof window !== 'undefined' && typeof window.salla?.storage?.get === 'function'\n ? (window.salla.storage.get(AUTH_TOKEN_COOKIE_NAME) as string | null)\n : null;\n const serverCookieToken = readServerCookieToken();\n const authToken =\n ctx.serverContext?.authToken ??\n serverCookieToken ??\n existingToken ??\n cookieToken ??\n sallaToken ??\n null;\n\n updateTwilightContext({\n queryClient: ctx.context.queryClient,\n settings: settingsResult,\n locale,\n location: ctx.location,\n i18n,\n authToken,\n appsSnippets: snippetsResult,\n appsSettings: appSettingsResult,\n });\n\n return {\n settings: settingsResult,\n locale,\n dir,\n authToken,\n appsSnippets: snippetsResult,\n appsSettings: appSettingsResult,\n };\n}\n","import type { HeadDescriptor, HeadResult } from '../../utils/head';\nimport { mergeHead, resolveHead } from '../../utils/head';\nimport { buildBaseHead } from '../../utils/baseHead';\nimport { FALLBACK_LOCALE } from '../../providers/locale-constants';\nimport { getTwilightContext } from '../../twilight/context';\nimport type { TwilightContextMatch } from '../../twilight/ensure-context';\nimport { ensureTwilightContextFromMatches } from '../../twilight/ensure-context';\nimport type { StoreContext } from '../../api/store';\nimport type { AppSnippet } from '../../api/apps';\nimport { SettingsError } from '../../utils/errors';\nimport { renderAppScopeInstallScript } from '../../utils/app-scope';\nimport { renderThemeHookSlotsScript } from '../../utils/theme-hook-slots';\nimport { escapeForInlineScript } from '../../utils/inline-script';\nimport { readEnv, renderRuntimeEnvScript } from '../../utils/runtime-env';\n\nconst SALLA_ICONS_CSS_URL = 'https://cdn.assets.salla.network/static/fonts/sallaicons.css?v=2.0.5';\nconst LIT_VERSION = '3.3.3';\nconst LIT_CDN_BASE = `https://cdn.assets.salla.network/static/lit/${LIT_VERSION}`;\n\n/** Bare-specifier map for the lit build the engine's `<salla-*>` web components resolve against. */\nconst LIT_IMPORTS: Record<string, string> = {\n lit: `${LIT_CDN_BASE}/lit.js`,\n 'lit/': `${LIT_CDN_BASE}/`,\n 'lit-html': `${LIT_CDN_BASE}/lit-html/lit-html.js`,\n 'lit-html/': `${LIT_CDN_BASE}/lit-html/`,\n 'lit-element': `${LIT_CDN_BASE}/lit-element/lit-element.js`,\n 'lit-element/': `${LIT_CDN_BASE}/lit-element/`,\n '@lit/reactive-element': `${LIT_CDN_BASE}/reactive-element/reactive-element.js`,\n '@lit/reactive-element/': `${LIT_CDN_BASE}/reactive-element/`,\n};\n\nconst TWILIGHT_RELEASE_CDN = 'https://cdn.salla.network/js/twilight';\nconst TWILIGHT_DEV_CDN = 'https://cdn.assets.salla.network/dev/@salla.sa/twilight';\n// The oldest Twilight release this engine works with. Raise it whenever the engine\n// starts relying on something newer; the reason lives in that commit. Today's floor:\n// components ship their own CSS, which themes no longer compile (SallaApp/twilight#2107).\nconst MIN_TWILIGHT_VERSION = '2.14.538';\n// Last resort when no override and no platform pin, and the substitute for a pin below the floor.\nconst DEFAULT_TWILIGHT_VERSION = '2.14.584';\nconst releaseUrl = (version: string): string =>\n `${TWILIGHT_RELEASE_CDN}/${version}/twilight.esm.js`;\n// The head is built more than once per request (early hints, then the page); say it once.\nconst warnedPins = new Set<string>();\n\n/** `x.y.z` release pins only; dev shas and other strings are loaded as given. */\nfunction belowMinimum(version: string): boolean {\n return (\n /^\\d+\\.\\d+\\.\\d+$/.test(version) &&\n version.localeCompare(MIN_TWILIGHT_VERSION, undefined, { numeric: true }) < 0\n );\n}\n\n/** The `x.y.z` release segment of a release-CDN `.../twilight.esm.js` URL, if present. */\nfunction releaseVersionInUrl(url: string): string | null {\n const match = url.match(/\\/(\\d+\\.\\d+\\.\\d+)\\/twilight\\.esm\\.js(?:[?#]|$)/);\n return match ? match[1] : null;\n}\n\n/**\n * `VITE_TWILIGHT_URL`/`VITE_TWILIGHT_VERSION` outrank everything below, including\n * `theme.twilight.version`'s own `belowMinimum` guard — a stale override wins\n * silently otherwise (TD-16375: a scaffold-time pin outlived the engine raising\n * MIN_TWILIGHT_VERSION, so every new theme rendered without component CSS and\n * nothing said why). Only a dev-mode nudge, not a swap: an env override is a\n * deliberate choice, so unlike the settings-pin path below this never substitutes\n * the engine default underneath the developer.\n */\nfunction warnIfOverrideBelowMinimum(source: string, version: string): void {\n // Worker logs in production should stay quiet -- this is a developer-directed nudge,\n // not a user-facing or production-monitored signal. import.meta.env.DEV is a static\n // false in production builds, so this branch (and the console.warn below) is\n // tree-shaken out entirely, same as DevSettingsWidget / dev-settings-store.ts.\n if (!import.meta.env.DEV) return;\n if (!belowMinimum(version)) return;\n const key = `${source}:${version}`;\n if (warnedPins.has(key)) return;\n warnedPins.add(key);\n console.warn(\n `[twilight] ${source}=${version} is below the engine minimum ${MIN_TWILIGHT_VERSION} — components may load without their CSS (SallaApp/twilight#2107). Unset it or bump it to ${MIN_TWILIGHT_VERSION}+.`\n );\n}\n\n/**\n * Which twilight.esm.js the storefront loads, in priority order:\n * 1. `VITE_TWILIGHT_URL` — full local/deployment override.\n * 2. `VITE_TWILIGHT_VERSION` — dev-CDN build override.\n * 3. `theme.twilight.version` from the settings endpoint — the platform-pinned\n * release used when no environment override is configured.\n * 4. The engine's default release, also used when the pin is below the engine minimum.\n */\nexport function resolveTwilightSdkUrl(settings?: StoreContext): string {\n const urlOverride = readEnv('VITE_TWILIGHT_URL');\n if (urlOverride) {\n const version = releaseVersionInUrl(urlOverride);\n if (version) warnIfOverrideBelowMinimum('VITE_TWILIGHT_URL', version);\n return urlOverride;\n }\n\n const versionOverride = readEnv('VITE_TWILIGHT_VERSION');\n if (versionOverride) {\n warnIfOverrideBelowMinimum('VITE_TWILIGHT_VERSION', versionOverride);\n return `${TWILIGHT_DEV_CDN}/${versionOverride}/twilight.esm.js`;\n }\n\n const pinnedVersion = settings?.theme?.twilight?.version;\n if (pinnedVersion && belowMinimum(pinnedVersion)) {\n if (!warnedPins.has(pinnedVersion)) {\n warnedPins.add(pinnedVersion);\n console.warn(\n `[twilight] theme.twilight.version ${pinnedVersion} is below the engine minimum ${MIN_TWILIGHT_VERSION}; loading ${DEFAULT_TWILIGHT_VERSION} instead`\n );\n }\n return releaseUrl(DEFAULT_TWILIGHT_VERSION);\n }\n if (pinnedVersion) return releaseUrl(pinnedVersion);\n\n return releaseUrl(DEFAULT_TWILIGHT_VERSION);\n}\n\nconst MEDIA_SWAP_SCRIPT = `\n(function(){var e=function(t){var l=document.getElementById(t);if(l){if(l.sheet||\"all\"===l.media)l.media=\"all\";else l.onload=function(){this.media=\"all\"}}};e(\"salla-theme-font\");e(\"salla-icons-css\")})();\n`.trim();\n\nconst LOADING_CSS = `\n.loading-overlay{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:#fff;z-index:9999}\n.loading-spinner{animation:spin 1s linear infinite;border-radius:9999px;height:3rem;width:3rem;border-bottom:2px solid var(--color-primary,#000)}\n@keyframes spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}\nhtml,body{margin:0;padding:0;height:100%}\n`.trim();\n\nconst SALLA_INIT_SCRIPT = `\nwindow.salla = window.Salla = window.Salla || window.salla || {};\nwindow.Salla.onReady = window.Salla.onReady || function(callback) {\n return new Promise(function(resolve) {\n if (window.Salla.status === 'ready') {\n var config = window.salla && window.salla.config && window.salla.config.all();\n resolve(callback ? callback(config) : config);\n } else {\n window.addEventListener('twilight::initiated', function(event) {\n resolve(callback ? callback(event.detail) : event.detail);\n }, { once: true });\n }\n });\n};\n`.trim();\n\n/**\n * Distinct snippet-host origins to `preconnect` (warm DNS/TCP/TLS during parse). From the real\n * URLs (dev/prod-correct), deduped and capped at 4. No `crossOrigin`: snippets are no-cors fetches.\n */\nexport function snippetPreconnectOrigins(snippets: readonly AppSnippet[] | undefined): string[] {\n if (!snippets?.length) return [];\n const origins = new Set<string>();\n for (const app of snippets) {\n if (app.status !== 'enabled') continue;\n for (const s of app.snippets) {\n if (!s.url) continue;\n try {\n origins.add(new URL(s.url).origin);\n } catch {\n /* skip a malformed snippet url rather than breaking the head */\n }\n if (origins.size >= 4) return [...origins];\n }\n }\n return [...origins];\n}\n\nexport function rootHead(ctx: {\n params: Record<string, string>;\n matches?: readonly TwilightContextMatch[];\n}): HeadResult {\n // Re-run on the client during hydration, where the twilight module store may\n // still be empty. Recover it from the resolved match context so the head is\n // built from real settings instead of falling through to 'Store Unavailable'.\n ensureTwilightContextFromMatches(ctx.matches);\n\n let settings: StoreContext | undefined;\n try {\n settings = getTwilightContext().settings;\n } catch (e) {\n if (e instanceof SettingsError) {\n return resolveHead({\n title: 'Store Unavailable',\n });\n }\n throw e;\n }\n const locale = ctx.params.locale || FALLBACK_LOCALE;\n const parts = deriveHeadParts(settings);\n\n return resolveHead(\n mergeHead(buildBaseHead(settings, locale), {\n meta: buildRootMeta(parts),\n links: buildRootLinks(parts),\n styles: buildRootStyles(parts),\n importMap: [{ imports: LIT_IMPORTS }],\n scripts: buildRootScripts(parts),\n })\n );\n}\n\n/** Everything the root head's tag builders read, derived once from the store settings. */\ninterface RootHeadParts {\n store: StoreContext['store'] | undefined;\n favicon?: string;\n primaryColor?: string;\n fontUrl?: string;\n fontUrlWithDisplay?: string;\n isGoogleFont?: boolean;\n fontFamilyName?: string;\n customJs?: string;\n customCss?: string;\n isCustomCssUrl?: boolean;\n isCustomJsUrl?: boolean;\n twilightSdkUrl: string;\n snippetPreconnects: Array<{ rel: 'preconnect'; href: string }>;\n appScopeInstallScript: string;\n themeHookSlotsScript: string | null;\n runtimeEnvScript: string | null;\n}\n\n/** Google Fonts only honours `display=swap` as a query param; other hosts get the @font-face\n * override instead (see buildRootStyles). */\nfunction deriveFontParts(theme?: StoreContext['theme']) {\n const font = theme?.font;\n const fontUrl = font?.url || font?.path;\n const isGoogleFont = fontUrl?.includes('fonts.googleapis.com');\n const needsDisplay = Boolean(isGoogleFont && fontUrl && !fontUrl.includes('display='));\n const separator = fontUrl?.includes('?') ? '&' : '?';\n\n return {\n fontUrl,\n isGoogleFont,\n fontFamilyName: font?.family_name,\n fontUrlWithDisplay: needsDisplay ? `${fontUrl}${separator}display=swap` : fontUrl,\n };\n}\n\n/** Theme customization JS/CSS, each either a URL to load or an inline blob to embed. */\nfunction deriveCustomizationParts(theme?: StoreContext['theme']) {\n const customization = theme?.customization;\n const customJs = customization?.js?.trim();\n const customCss = customization?.css?.trim();\n const isUrl = (value?: string): boolean =>\n Boolean(value?.startsWith('http') || value?.startsWith('//'));\n\n return {\n customJs,\n customCss,\n isCustomCssUrl: isUrl(customCss),\n isCustomJsUrl: isUrl(customJs),\n };\n}\n\nfunction deriveHeadParts(settings?: StoreContext): RootHeadParts {\n const store = settings?.store;\n\n return {\n store,\n favicon: store?.icon,\n primaryColor: settings?.theme?.color?.primary,\n ...deriveFontParts(settings?.theme),\n ...deriveCustomizationParts(settings?.theme),\n twilightSdkUrl: resolveTwilightSdkUrl(settings),\n // Warm the connection to the snippet host(s) during head parse, so the body's deferred\n // `<script src>` snippet tags fetch off an already-open socket instead of DNS+TCP+TLS.\n snippetPreconnects: snippetPreconnectOrigins(getTwilightContext().appsSnippets).map((href) => ({\n rel: 'preconnect' as const,\n href,\n })),\n // Install `Salla.appScope` inline at parse time, before the SDK is ready — else a snippet's\n // onReady callback calls it too early and throws. Always emitted, even when the settings\n // prefetch failed: the CDN snippet tags ship regardless (they come from the *snippets*\n // endpoint), so the factory has to exist for them. `installAppScope` then seeds the real\n // buckets into this install once the client query resolves.\n appScopeInstallScript: renderAppScopeInstallScript(\n getTwilightContext().appsSettings ?? { apps: {} }\n ),\n // Whitelist the theme's own hook slots at parse time too, for the same reason: apps register\n // their `onReady` callbacks from parser-inserted snippet tags, long before React hydrates.\n themeHookSlotsScript: renderThemeHookSlotsScript(),\n // Env this render resolved (worker `vars` live in server-only `process.env`), handed to the\n // client so it doesn't silently fall back to the production defaults. Re-rendered on the\n // client during hydration, where it resolves to the same values or to nothing.\n runtimeEnvScript: renderRuntimeEnvScript(),\n };\n}\n\nfunction buildRootMeta(p: RootHeadParts): NonNullable<HeadDescriptor['meta']> {\n return [\n { name: 'robots', content: 'index, follow' },\n { name: 'msapplication-TileColor', content: '#ffffff' },\n ...(p.favicon ? [{ name: 'msapplication-TileImage', content: p.favicon }] : []),\n ...(p.primaryColor\n ? [\n { name: 'theme-color', content: p.primaryColor },\n { name: 'msapplication-navbutton-color', content: p.primaryColor },\n { name: 'apple-mobile-web-app-status-bar-style', content: p.primaryColor },\n ]\n : []),\n ];\n}\n\nfunction buildRootLinks(p: RootHeadParts): NonNullable<HeadDescriptor['links']> {\n return [\n { rel: 'preconnect', href: 'https://api.salla.dev' },\n { rel: 'preconnect', href: 'https://cdn.salla.sa' },\n { rel: 'preconnect', href: 'https://cdn.assets.salla.network', crossOrigin: 'anonymous' },\n // Warm the installed apps' CDN snippet host(s) — see snippetPreconnectOrigins.\n ...p.snippetPreconnects,\n ...(p.fontUrl\n ? [\n {\n rel: 'preconnect' as const,\n href: 'https://fonts.gstatic.com',\n crossOrigin: 'anonymous' as const,\n },\n ]\n : []),\n { rel: 'modulepreload', href: p.twilightSdkUrl },\n ...(p.fontUrlWithDisplay\n ? [\n {\n id: 'salla-theme-font',\n rel: 'stylesheet',\n href: p.fontUrlWithDisplay,\n media: 'print',\n },\n ]\n : []),\n ...(p.fontUrlWithDisplay && !p.isGoogleFont && p.fontFamilyName\n ? [\n {\n id: 'salla-font-display-override',\n rel: 'preload',\n as: 'style',\n href: p.fontUrlWithDisplay,\n },\n ]\n : []),\n ...(p.favicon ? [{ rel: 'icon', href: p.favicon }] : []),\n ...(p.favicon\n ? [{ id: 'salla-apple-icon', rel: 'apple-touch-icon-precomposed', href: p.favicon }]\n : []),\n ...(p.isCustomCssUrl && p.customCss\n ? [{ id: 'salla-custom-css', rel: 'stylesheet', href: p.customCss }]\n : []),\n {\n id: 'salla-icons-css',\n rel: 'stylesheet',\n href: SALLA_ICONS_CSS_URL,\n media: 'print',\n },\n // {\n // id: 'intl-tel-input-css',\n // rel: 'stylesheet',\n // href: 'https://cdn.jsdelivr.net/npm/intl-tel-input@26.8.0/build/css/intlTelInput.css',\n // },\n ...(p.isCustomJsUrl && p.customJs\n ? [{ id: 'salla-custom-js-preload', rel: 'preload', as: 'script', href: p.customJs }]\n : []),\n ];\n}\n\n// Hoistable (href + precedence): the web components insert their own <style> near the top of\n// <head> before hydration, which a positionally hydrated <style> would be matched against.\nconst hoisted = (id: string, children: string) => ({\n id,\n href: id,\n precedence: 'default',\n children,\n});\n\nfunction buildRootStyles(p: RootHeadParts): NonNullable<HeadDescriptor['styles']> {\n return [\n hoisted('twilight-loading', LOADING_CSS),\n ...(!p.isGoogleFont && p.fontFamilyName\n ? [\n hoisted(\n 'salla-font-display-swap',\n `@font-face{font-family:\"${p.fontFamilyName}\";font-display:swap;src:local(\"${p.fontFamilyName}\")}`\n ),\n ]\n : []),\n ...(!p.isCustomCssUrl && p.customCss ? [hoisted('salla-custom-css', p.customCss)] : []),\n ];\n}\n\nfunction buildRootScripts(p: RootHeadParts): NonNullable<HeadDescriptor['scripts']> {\n return [\n // First: the API base / store identifier this render used, so the hydrated client\n // resolves the same ones (worker `vars` never reach the browser bundle on their own).\n ...(p.runtimeEnvScript ? [{ id: 'salla-runtime-env', children: p.runtimeEnvScript }] : []),\n { id: 'twilight-init', children: SALLA_INIT_SCRIPT },\n // After twilight-init (which defines window.Salla) and before the SDK module, so the\n // appScope factory exists ahead of any snippet's onReady callback firing.\n { id: 'salla-app-scope', children: p.appScopeInstallScript },\n // Arms the hook-slot whitelist push here, so its `twilight::initiated` listener is\n // registered before any app snippet's — listeners fire in registration order.\n ...(p.themeHookSlotsScript\n ? [{ id: 'salla-theme-hook-slots', children: p.themeHookSlotsScript }]\n : []),\n { id: 'salla-async-css', children: MEDIA_SWAP_SCRIPT },\n { id: 'salla-sdk', type: 'module', src: p.twilightSdkUrl },\n ...(p.store?.settings?.ticketing_system_enabled\n ? [\n {\n id: 'salla-ticketing-script',\n src: 'https://cdn.assets.salla.network/latest/@salla.sa/ui-store-ticketing-system/ticketing-system.es.js',\n type: 'module',\n },\n ]\n : []),\n ...(p.customJs ? [buildCustomJsScript(p.customJs, Boolean(p.isCustomJsUrl))] : []),\n ];\n}\n\n/** A URL customization is loaded after SDK init; an inline one is wrapped so a syntax/runtime\n * error in partner JS warns instead of taking the page down. */\nfunction buildCustomJsScript(customJs: string, isUrl: boolean) {\n return {\n id: 'salla-custom-js',\n children: isUrl\n ? `window.addEventListener('twilight::initiated',function(){var s=document.createElement('script');s.src=${escapeForInlineScript(JSON.stringify(customJs))};s.async=true;document.head.appendChild(s)},{once:true});`\n : `try { ${customJs} } catch(e) { console.warn(\"[ThemeCustomization] Custom JS error:\", e); }`,\n };\n}\n","/**\n * @fileoverview The store segment, carried by the router instead of the route tree.\n *\n * TanStack Router rewrites every location it reads and every one it writes:\n * `input` runs before a URL is matched, and `output` before an href is rendered,\n * pushed to history or sent as a redirect's `Location`. So on a host where the\n * store is the root, the route tree stays `/{-$locale}/cart` and\n * `<Link to=\"/cart\">` renders `/mtgr-alaatr-2/cart` by itself.\n *\n * Why not the router's `basepath`: TanStack Start overwrites it from the build on\n * both sides (`router.update({ basepath })` per request on the server, and in\n * `hydrateStart` on the client). `rewrite` is a separate option that the router\n * composes with that basepath, so it survives. Server functions are dispatched on\n * the raw URL before the router runs, and assets are root-absolute, so neither\n * moves. See `docs/store-base-path.md`.\n */\nimport type { LocationRewrite } from '@tanstack/react-router';\nimport { prefixStoreBase, stripStoreBase } from '../utils/store-base';\n\n/** A rewrite that serves the application from `/<base>`. */\nexport function storeBaseRewrite(base: string): LocationRewrite {\n return {\n input: ({ url }) => {\n url.pathname = stripStoreBase(url.pathname, base);\n return url;\n },\n output: ({ url }) => {\n url.pathname = prefixStoreBase(url.pathname, base);\n return url;\n },\n };\n}\n","import type { ReactNode } from 'react';\nimport { lazy, Suspense } from 'react';\nimport {\n createRouter as createTanStackRouter,\n createRootRouteWithContext,\n} from '@tanstack/react-router';\nimport type { RouterHistory } from '@tanstack/react-router';\nimport { QueryClient } from '@tanstack/react-query';\nimport { shouldDehydrateQuery } from '../api/product';\nimport { PageSkeleton } from '@salla.sa/twilight-components-react/skeletons';\nimport { setHeadAdapter } from '../utils/head';\nimport { tanstackHeadAdapter } from './head';\nimport { stringifySearch } from './search';\nimport { updateTwilightContext, type TwilightLocation } from '../twilight/context';\nimport { dispatchRouteChanged } from '../utils/sdk-events';\nimport { rootBeforeLoad, type BeforeLoadResult } from '../routes/root/beforeLoad';\nimport { rootHead } from '../routes/root/head';\nimport { setupRouterSsrQueryIntegration } from '@tanstack/react-router-ssr-query';\nimport type { AnyRouter } from '@tanstack/react-router';\nimport { RouteId, type RouteIdType } from '../router/route-ids';\nimport { UnauthorizedError, NotFoundError, RedirectError } from '../providers/NavigationProvider';\nimport { ErrorPage } from '../components/common/ErrorPage';\nimport type { StoreContext } from '../api/store';\nimport type { AppSnippet, AppSettings } from '../api/apps';\nimport { createI18nInstance } from '../providers/i18n-factory';\nimport { messagesForLocale } from '../api/messages';\nimport { resolveStoreBase } from '../utils/store-identity';\nimport { storeBaseRewrite } from './store-base';\n\n/**\n * Initial router context passed from createRouter to beforeLoad.\n */\nexport interface RouterInitialContext {\n queryClient: QueryClient;\n setLocation: (_location: Partial<TwilightLocation>) => void;\n}\n\n/**\n * TanStack Router ID Mapping\n *\n * Maps TanStack's auto-generated path-based route IDs to semantic RouteId constants.\n * This mapping is TanStack-specific because different frameworks generate route IDs differently:\n *\n * - TanStack: Uses file path as ID (e.g., '/{-$locale}/cart')\n * - Next.js: Uses file path without locale (e.g., '/cart')\n *\n * The mapping enables hooks like useIsHome(), useIsProduct() to work consistently\n * across frameworks while each framework has its own ID generation strategy.\n */\nexport const TANSTACK_ROUTE_ID_MAP: Record<string, RouteIdType> = {\n '/{-$locale}/': RouteId.INDEX,\n '/{-$locale}/cart': RouteId.CART,\n '/{-$locale}/search': RouteId.SEARCH,\n\n '/{-$locale}/latest-products': RouteId.PRODUCT_INDEX_LATEST,\n '/{-$locale}/most-sales-products': RouteId.PRODUCT_INDEX_SALES,\n '/{-$locale}/offers': RouteId.PRODUCT_INDEX_OFFERS,\n\n '/{-$locale}/$slug/c{$id}': RouteId.PRODUCT_INDEX,\n '/{-$locale}/$slug/p{$id}': RouteId.PRODUCT_SINGLE,\n '/{-$locale}/$slug/brand-{$id}': RouteId.BRANDS_SINGLE,\n '/{-$locale}/$slug/tag-{$id}': RouteId.PRODUCT_INDEX_TAG,\n '/{-$locale}/$slug/page-{$id}': RouteId.PAGE_SINGLE,\n\n '/{-$locale}/blog': RouteId.BLOG_INDEX,\n '/{-$locale}/blog/$slug/a-{$id}': RouteId.BLOG_SINGLE,\n '/{-$locale}/blog/$slug/c-{$id}': RouteId.BLOG_INDEX_CATEGORY,\n '/{-$locale}/blog/$slug/tag-{$id}': RouteId.BLOG_INDEX_TAG,\n '/{-$locale}/blog/author/$id': RouteId.BLOG_INDEX_AUTHOR,\n\n '/{-$locale}/brands': RouteId.BRANDS_INDEX,\n '/{-$locale}/brands/$id': RouteId.BRANDS_SINGLE,\n '/{-$locale}/tags/$id': RouteId.PRODUCT_INDEX_TAG,\n\n '/{-$locale}/profile': RouteId.CUSTOMER_PROFILE,\n '/{-$locale}/wishlist': RouteId.CUSTOMER_WISHLIST,\n '/{-$locale}/wallet': RouteId.CUSTOMER_WALLET,\n '/{-$locale}/notifications': RouteId.CUSTOMER_NOTIFICATIONS,\n '/{-$locale}/settings': RouteId.CUSTOMER_SETTINGS,\n '/{-$locale}/orders': RouteId.CUSTOMER_ORDERS_INDEX,\n '/{-$locale}/order/$id': RouteId.CUSTOMER_ORDERS_SINGLE,\n '/{-$locale}/pending-orders': RouteId.CUSTOMER_ORDERS_INDEX_PENDING,\n '/{-$locale}/account/pending_orders': RouteId.CUSTOMER_ORDERS_INDEX_PENDING,\n '/{-$locale}/account/rating': RouteId.CUSTOMER_ORDERS_INDEX,\n\n '/{-$locale}/logout': RouteId.LOGOUT,\n '/{-$locale}/loyalty': RouteId.LOYALTY,\n '/{-$locale}/loyalty_points': RouteId.CUSTOMER_LOYALTY_POINTS,\n '/{-$locale}/testimonials': RouteId.TESTIMONIALS,\n '/{-$locale}/thankyou/$orderId': RouteId.THANK_YOU,\n};\n\n/**\n * Resolves a TanStack route ID to a semantic RouteId constant.\n * Falls back to the original ID if no mapping exists.\n * @internal Exported for testing\n */\nexport function resolveRouteId(tanstackId: string): string {\n return TANSTACK_ROUTE_ID_MAP[tanstackId] ?? tanstackId;\n}\n\n// Lazy load NotFoundPage for code splitting\nconst LazyNotFoundPage = lazy(() =>\n import('../routes/not-found').then((m) => ({ default: m.NotFoundPage }))\n);\n\n/**\n * Error component shown when the root route fails to load.\n * This renders a minimal HTML page with error details.\n */\nfunction StoreUnavailablePage() {\n return (\n <>\n <div\n style={{\n position: 'fixed',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: '#f9fafb',\n }}\n >\n <div style={{ textAlign: 'center', padding: '2rem' }}>\n <h1 style={{ fontSize: '1.5rem', marginBottom: '0.5rem' }}>\n Store is temporarily unavailable\n </h1>\n <p style={{ color: '#6b7280' }}>\n We're having trouble loading the store. Please try again in a moment.\n </p>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n style={{\n marginTop: '1rem',\n padding: '0.75rem 1.5rem',\n fontSize: '1rem',\n border: 'none',\n borderRadius: '0.5rem',\n background: '#111827',\n color: '#fff',\n cursor: 'pointer',\n }}\n >\n Retry\n </button>\n </div>\n </div>\n </>\n );\n}\n\nfunction RootErrorComponent({ error: _error }: { error: Error }) {\n return (\n <html lang=\"ar\" dir=\"rtl\">\n <head>\n <meta charSet=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Store Unavailable</title>\n </head>\n <body style={{ margin: 0, fontFamily: 'sans-serif' }}>\n <StoreUnavailablePage />\n </body>\n </html>\n );\n}\n\n/**\n * Creates the root route pre-configured with RouterInitialContext.\n * beforeLoad will fetch settings/translations, loader returns serializable data.\n *\n * @example\n * ```ts\n * export const Route = createTwilightRootRoute()({ shellComponent });\n * ```\n */\nexport function createTwilightRootRoute() {\n const factory = createRootRouteWithContext<RouterInitialContext>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TanStack Router factory expects `any` for spread options\n return (options: any) =>\n factory({\n beforeLoad: rootBeforeLoad,\n head: rootHead,\n errorComponent: RootErrorComponent,\n ...options,\n });\n}\n\n/**\n * Default error component for route-level errors.\n */\nexport function DefaultErrorComponent({ error }: { error: unknown }) {\n if (error instanceof RedirectError) {\n return null;\n }\n\n if (error instanceof NotFoundError) {\n return <ErrorPage code={404} message={error.message} />;\n }\n\n if (error instanceof UnauthorizedError) {\n return <ErrorPage code={401} message={error.message} showAction={false} />;\n }\n\n const message =\n error instanceof Error\n ? error.message\n : error &&\n typeof error === 'object' &&\n 'message' in error &&\n typeof error.message === 'string'\n ? error.message\n : undefined;\n\n if (error && typeof error === 'object' && 'response' in error) {\n return <ErrorPage code={400} message={message} />;\n }\n\n return <ErrorPage code={500} message={message} />;\n}\n\n/**\n * SSR integration for Twilight context — mirrors TanStack Query's\n * `setupRouterSsrQueryIntegration` pattern.\n *\n * On the **server**: wraps `router.options.dehydrate` to include twilight\n * context data (settings, locale, location, authToken) alongside the router state.\n *\n * On the **client**: wraps `router.options.hydrate` to populate the module-level\n * store from the root match's `__beforeLoadContext` BEFORE head functions re-run.\n * TanStack's `hydrate()` calls `router.options.hydrate()` at line 114 of\n * `ssr-client.ts`, right before it re-evaluates head functions (line 120+).\n * By populating the store here, `getTwilightContext().settings` is available\n * to `rootHead()` and all child head functions during client hydration.\n */\nfunction setupTwilightSsrIntegration(router: AnyRouter, queryClient: QueryClient): void {\n if (typeof window === 'undefined') {\n // Server: also populate twilightCtx from root match context on dehydrate\n return;\n }\n\n // Client: hook into router.options.hydrate to populate the module store\n // from the root match's __beforeLoadContext (set by rootBeforeLoad on the server)\n const ogHydrate = router.options.hydrate;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n router.options.hydrate = async (dehydratedData: any) => {\n await ogHydrate?.(dehydratedData);\n hydrateTwilightContext(router, queryClient);\n };\n}\n\nfunction warnHydrationBail(reason: string): void {\n // Silent failure here is what blanks the storefront: every head function that\n // runs next reads `getTwilightContext().settings`, which throws when the store\n // is empty. `ensureTwilightContextFromMatches` recovers at the point of use,\n // but the bail still signals a regression worth seeing in dev.\n if (import.meta.env?.DEV) {\n console.warn(`[Twilight] Could not hydrate twilight context: ${reason}`);\n }\n}\n\nfunction hydrateTwilightContext(router: AnyRouter, queryClient: QueryClient): void {\n const rootMatch = router.state?.matches?.[0];\n if (!rootMatch) {\n warnHydrationBail('no root match in router state');\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const beforeLoadCtx = (rootMatch as any).__beforeLoadContext as BeforeLoadResult | undefined;\n const matchCtx = rootMatch.context as Record<string, unknown> | undefined;\n\n const settings = (beforeLoadCtx?.settings ?? matchCtx?.settings) as StoreContext | undefined;\n const locale = (beforeLoadCtx?.locale ?? matchCtx?.locale) as string | undefined;\n const authToken = (beforeLoadCtx?.authToken ?? matchCtx?.authToken) as string | null;\n // Recover snippets here too: this is the primary hydration pass and populates settings, so the\n // best-effort ensureTwilightContextFromMatches fallback then short-circuits — if we skipped\n // appsSnippets here it would never reach the client store, and AppsSnippets' SSR-rendered CDN\n // tags would mismatch on hydration.\n const appsSnippets =\n beforeLoadCtx?.appsSnippets ?? (matchCtx?.appsSnippets as AppSnippet[] | undefined);\n // Recover appScope buckets too (like appsSnippets): this primary pass populates settings, so the\n // ensure-context fallback short-circuits — keep the client store in parity for head/install.\n const appsSettings =\n beforeLoadCtx?.appsSettings ?? (matchCtx?.appsSettings as AppSettings | undefined);\n\n if (!settings || !locale) {\n warnHydrationBail(\n `root match carried no ${!settings ? 'settings' : 'locale'} (beforeLoadContext and context both empty)`\n );\n return;\n }\n\n // Composed by the shared helper rather than read straight off one key.\n // There are two entries now — the platform's copy and this merchant's — and\n // reading only the first is how the server rendered the merchant's wording\n // and hydration replaced it with Salla's (Greptile's P1 on #366).\n const i18n = createI18nInstance(locale, messagesForLocale(queryClient, locale));\n\n const location = router.state?.location\n ? {\n href: router.state.location.href,\n pathname: router.state.location.pathname,\n search: router.state.location.search as Record<string, unknown>,\n searchStr: router.state.location.searchStr,\n state: router.state.location.state as unknown as Record<string, unknown>,\n hash: router.state.location.hash,\n }\n : undefined;\n\n const matches = router.state?.matches;\n const page = matches?.reduceRight(\n (found, m) => found ?? ((m as any).loaderData?.page ? (m as any).loaderData.page : null),\n null as any\n );\n\n // Resolve routeId on the initial load too — `onResolved` only fires on later\n // navigations, so without this the store keeps the empty default until the\n // first SPA navigation (breaks useRouteId/useIsHome on first paint/refresh).\n const leafMatch = matches?.[matches.length - 1];\n const routeId = leafMatch?.routeId ? resolveRouteId(leafMatch.routeId as string) : undefined;\n\n updateTwilightContext({\n queryClient,\n settings,\n locale,\n i18n,\n authToken,\n location,\n page,\n routeId,\n appsSnippets,\n appsSettings,\n });\n}\n\n/** Publishes the deepest match's loader `page` to the twilight context and `salla.config`. */\nfunction syncPageFromMatches(router: AnyRouter): void {\n const matches = router.state?.matches;\n if (!matches) return;\n const page = matches.reduceRight(\n (found, m) => found ?? ((m as any).loaderData?.page ? (m as any).loaderData.page : null),\n null as any\n );\n if (!page) return;\n updateTwilightContext({ page });\n const sdkPage = {\n ...page,\n url: page.url ?? router.state.location.pathname + router.state.location.searchStr,\n };\n const push = () => window.salla?.config?.set?.('page', sdkPage);\n // The SDK script can run after hydration; it must have the page before it is ready.\n if (window.salla?.config?.set) push();\n else window.addEventListener('salla::created', push, { once: true });\n}\n\n/**\n * Options for creating the TanStack Router instance.\n */\nexport interface CreateRouterOptions {\n defaultPendingComponent?: (() => ReactNode) | false;\n defaultPendingMs?: number;\n defaultPendingMinMs?: number;\n defaultStaleTime?: number;\n history?: RouterHistory;\n}\n\n/**\n * Creates and configures the TanStack Router instance for the Twilight theme.\n *\n * This router is pre-configured with:\n * - Route tree generated by the TanStack Router plugin\n * - Intent-based preload for better performance\n * - Scroll restoration for better UX\n * - Locale-aware default NotFoundPage (redirects `/cart` → `/ar/cart`)\n * - Trailing slash normalization for consistent URL handling\n * - Page skeleton shown during route transitions (via `defaultPendingComponent`)\n * - SSR query integration for Cloudflare compatibility\n *\n * @param routeTree - The generated route tree from the consuming project\n * @param options - Optional overrides for pending component behavior\n * @returns Configured TanStack Router instance\n */\nexport function createRouter(routeTree: any, options?: CreateRouterOptions) {\n setHeadAdapter(tanstackHeadAdapter);\n\n const {\n defaultPendingComponent: pendingOpt,\n defaultPendingMs = 100,\n defaultPendingMinMs = 200,\n defaultStaleTime = Infinity,\n history,\n } = options ?? {};\n\n const pendingComponent =\n pendingOpt === false ? undefined : (pendingOpt ?? (() => <PageSkeleton />));\n\n const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 60_000,\n gcTime: 5 * 60_000,\n retry: 1,\n refetchOnWindowFocus: false,\n },\n mutations: {\n retry: 0,\n },\n dehydrate: {\n shouldDehydrateQuery,\n },\n },\n });\n\n // Store queryClient in the holder for access by loaders via getTwilightContext()\n updateTwilightContext({ queryClient });\n\n // On a host that serves many stores, the store is the first segment of every\n // URL. The router carries it instead of the route tree: it is stripped before\n // matching and added to every href the router builds. Decided per request on\n // the server, and taken from what SSR published in the browser.\n const storeBase = resolveStoreBase();\n\n const router = createTanStackRouter({\n routeTree,\n ...(history ? { history } : {}),\n ...(storeBase ? { rewrite: storeBaseRewrite(storeBase) } : {}),\n context: {\n queryClient,\n setLocation: (location: Partial<TwilightLocation>) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n updateTwilightContext({ location } as any);\n },\n },\n defaultPreload: 'intent',\n scrollRestoration: true,\n scrollRestorationBehavior: 'instant',\n trailingSlash: 'never',\n stringifySearch,\n defaultStaleTime,\n defaultNotFoundComponent: () => (\n <Suspense fallback={<PageSkeleton />}>\n <LazyNotFoundPage />\n </Suspense>\n ),\n defaultPendingComponent: pendingComponent,\n defaultPendingMs,\n defaultPendingMinMs,\n defaultErrorComponent: DefaultErrorComponent,\n });\n\n // Setup SSR query integration (native, with incremental streaming)\n setupRouterSsrQueryIntegration({ router, queryClient });\n\n // Setup Twilight SSR integration — populates the module store from\n // dehydrated match context BEFORE head functions re-run on the client.\n // This mirrors how setupRouterSsrQueryIntegration hydrates QueryClient.\n setupTwilightSsrIntegration(router, queryClient);\n\n // Subscribe to navigation events to sync location and routeId\n function syncNavigationState() {\n const state = router?.state;\n if (!state?.location) return;\n\n const loc = state.location;\n updateTwilightContext({\n location: {\n href: loc.href,\n pathname: loc.pathname,\n search: loc.search as Record<string, unknown>,\n searchStr: loc.searchStr,\n state: loc.state as unknown as Record<string, unknown>,\n hash: loc.hash,\n },\n });\n\n const matches = state.matches;\n const leafMatch = matches[matches.length - 1];\n if (leafMatch?.routeId) {\n const semanticId = resolveRouteId(leafMatch.routeId as string);\n updateTwilightContext({ routeId: semanticId });\n }\n\n const rootMatch = state.matches[0];\n if (rootMatch?.context) {\n const ctx = rootMatch.context as BeforeLoadResult;\n if (ctx?.settings) {\n updateTwilightContext({ settings: ctx.settings, locale: ctx.locale });\n }\n }\n }\n\n // Extract page from matches as soon as loaders complete (before components mount),\n // so useTwilightInit's useEffect sees page data when it calls sdk.init().\n router.subscribe('onLoad', () => syncPageFromMatches(router));\n // A direct load resolves through hydration, which emits no onLoad; its first render does emit onRendered.\n router.subscribe('onRendered', () => syncPageFromMatches(router));\n\n // Sync location, routeId, and settings after navigation fully resolves\n router.subscribe('onResolved', () => {\n syncNavigationState();\n dispatchRouteChanged();\n });\n\n return router;\n}\n\ndeclare module '@tanstack/react-router' {\n interface Register {\n router: ReturnType<typeof createRouter>;\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Required by TanStack Router module augmentation pattern\n interface RouterContext extends RouterInitialContext {}\n}\n","import { useRouterState } from '@tanstack/react-router';\nimport {\n mergeElementAttrs,\n toReactProps,\n type DocumentElementDescriptor,\n} from '../utils/document-class';\nimport { useDocumentClass } from '../hooks/useDocumentClass';\nimport { updateTwilightContext } from '../twilight/context';\nimport { resolveRouteId } from './router';\n\n// ============================================================================\n// Route → body class map (mirrors PHP Route2Class::generateClassString)\n// Keyed by TanStack Router route ID (the path passed to createFileRoute).\n// null = intentionally classless (e.g. root layout routes).\n// ============================================================================\n\nconst ROUTE_CLASS_MAP: Record<string, string | null> = {\n '/{-$locale}/': 'index',\n '/{-$locale}/cart': 'cart',\n '/{-$locale}/$slug/c{$id}': 'product-index',\n '/{-$locale}/offers': 'product-index-offers',\n '/{-$locale}/latest-products': 'product-index-latest',\n '/{-$locale}/most-sales-products': 'product-index-sales',\n '/{-$locale}/search': 'product-index-search',\n '/{-$locale}/$slug/tag-{$id}': 'product-index-tag',\n '/{-$locale}/tags/$id': 'product-index-tag',\n '/{-$locale}/$slug/p{$id}': 'product-single',\n '/{-$locale}/$slug/page-{$id}': 'page-single',\n '/{-$locale}/page/$slug': 'page-single',\n '/{-$locale}/p/$slug': 'page-single',\n '/{-$locale}/thankyou/$orderId': 'thank-you',\n '/{-$locale}/orders': 'customer-orders-index',\n '/{-$locale}/pending-orders': 'customer-orders-index-pending', // redirect to /account/orders?status=pending\n '/{-$locale}/account/pending_orders': 'customer-orders-index-pending',\n '/{-$locale}/account/rating': 'customer-orders-index', // redirect to /account/orders\n '/{-$locale}/order/$id': 'customer-orders-single',\n '/{-$locale}/profile': 'customer-profile',\n '/{-$locale}/wallet': 'customer-wallet',\n '/{-$locale}/wishlist': 'customer-wishlist',\n '/{-$locale}/notifications': 'customer-notifications',\n '/{-$locale}/testimonials': 'testimonials',\n '/{-$locale}/brands': 'brands-index',\n '/{-$locale}/brands/$id': 'brands-single',\n '/{-$locale}/$slug/brand-{$id}': 'brands-single',\n '/{-$locale}/blog': 'blog-index',\n '/{-$locale}/blog/$slug/a-{$id}': 'blog-single',\n '/{-$locale}/blog/$slug/c-{$id}': 'blog-index-category',\n '/{-$locale}/blog/$slug/tag-{$id}': 'blog-index-tag',\n '/{-$locale}/blog/author/$id': 'blog-index-author',\n '/{-$locale}/loyalty': 'loyalty',\n '/{-$locale}/loyalty_points': 'customer-loyalty-points',\n};\n\n// ============================================================================\n// RouteDocumentSync — resolves body class from active route ID at runtime.\n// ============================================================================\n\n/**\n * Applies the per-route body class by looking up the deepest active route ID\n * in the built-in route→class map.\n *\n * For custom routes not in the built-in map, use `useDocumentClass` directly\n * inside your route component.\n *\n * Note: This will throw if rendered outside a TanStack Router context.\n * Use TanStackDocumentSync for safe usage inside TwilightProvider.\n */\nexport function RouteDocumentSync(): null {\n const matches = useRouterState({ select: (s) => s.matches });\n\n let routeClass: string | null = null;\n for (let i = matches.length - 1; i >= 0; i--) {\n const id = matches[i].routeId;\n if (id in ROUTE_CLASS_MAP) {\n routeClass = ROUTE_CLASS_MAP[id];\n break;\n }\n }\n\n useDocumentClass(routeClass ? { body: { class: routeClass } } : {});\n return null;\n}\n\n/**\n * Safe version of RouteDocumentSync for use in TwilightProvider.\n * Handles being rendered outside a TanStack Router context gracefully.\n * Uses a wrapper component pattern to conditionally render hooks.\n */\nexport function TanStackDocumentSync(): null {\n const matches = useRouterState({ select: (s) => s.matches }) || [];\n\n // On the server routeId is never synced (onResolved is client-only), so useIsHome()\n // etc. disagree with the client and cause hydration mismatches. Sync it here — this\n // renders before the layout. Client already has it from onResolved.\n if (typeof window === 'undefined') {\n const leaf = matches[matches.length - 1];\n if (leaf?.routeId) {\n updateTwilightContext({ routeId: resolveRouteId(leaf.routeId as string) });\n }\n }\n\n let routeClass: string | null = null;\n for (let i = matches.length - 1; i >= 0; i--) {\n const id = matches[i].routeId;\n if (id in ROUTE_CLASS_MAP) {\n routeClass = ROUTE_CLASS_MAP[id];\n break;\n }\n }\n\n useDocumentClass(routeClass ? { body: { class: routeClass } } : {});\n return null;\n}\n\n// ============================================================================\n// Type augmentation — extend TanStack Router's staticData type\n// ============================================================================\n\ndeclare module '@tanstack/react-router' {\n interface StaticDataRouteOption {\n documentAttrs?: DocumentElementDescriptor;\n }\n}\n\nexport interface TanstackRouteStaticData {\n documentAttrs?: DocumentElementDescriptor;\n}\n\n// ============================================================================\n// useTanstackDocumentAttrs — for TanStack Start SSR root layouts\n// ============================================================================\n\n/**\n * Read and merge `<body>` / `<html>` attributes from all currently active\n * route matches (via `staticData.documentAttrs`).\n *\n * Returns React-ready prop objects ready to spread onto `<html>` and `<body>`.\n */\nexport function useTanstackDocumentAttrs(): {\n bodyAttrs: Record<string, string>;\n htmlAttrs: Record<string, string>;\n} {\n const matches = useRouterState({ select: (s) => s.matches });\n\n const bodyDescriptors = matches.map(\n (m) => (m.staticData as TanstackRouteStaticData | undefined)?.documentAttrs?.body ?? {}\n );\n const htmlDescriptors = matches.map(\n (m) => (m.staticData as TanstackRouteStaticData | undefined)?.documentAttrs?.html ?? {}\n );\n\n return {\n bodyAttrs: toReactProps(mergeElementAttrs(bodyDescriptors)),\n htmlAttrs: toReactProps(mergeElementAttrs(htmlDescriptors)),\n };\n}\n\n/**\n * Pure adapter: converts a `DocumentElementDescriptor` to React-ready props.\n */\nexport function tanstackDocumentAdapter(descriptor: DocumentElementDescriptor): {\n bodyAttrs: Record<string, string>;\n htmlAttrs: Record<string, string>;\n} {\n return {\n bodyAttrs: toReactProps(mergeElementAttrs([descriptor.body ?? {}])),\n htmlAttrs: toReactProps(mergeElementAttrs([descriptor.html ?? {}])),\n };\n}\n"]}
|
package/dist/chunk-4LVBS3VI.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { lazy } from 'react';
|
|
2
|
-
|
|
3
|
-
// src/components/cart/lazy.ts
|
|
4
|
-
var LazyCartItem = lazy(() => import('./CartItem-SO34G6GZ.js').then((m) => ({ default: m.CartItem })));
|
|
5
|
-
var LazyCartSummary = lazy(
|
|
6
|
-
() => import('./CartSummary-SDTY2CR2.js').then((m) => ({ default: m.CartSummary }))
|
|
7
|
-
);
|
|
8
|
-
var LazySeoCartWidget = lazy(
|
|
9
|
-
() => import('./SeoCartWidget-G7NAANUN.js').then((m) => ({ default: m.SeoCartWidget }))
|
|
10
|
-
);
|
|
11
|
-
|
|
12
|
-
export { LazyCartItem, LazyCartSummary, LazySeoCartWidget };
|
|
13
|
-
//# sourceMappingURL=chunk-4LVBS3VI.js.map
|
|
14
|
-
//# sourceMappingURL=chunk-4LVBS3VI.js.map
|
package/dist/chunk-5ZR2HKZ7.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { getTwilightContext } from './chunk-N2S25NXP.js';
|
|
2
|
-
|
|
3
|
-
// src/utils/sdk-events.ts
|
|
4
|
-
function dispatchRouteChanged() {
|
|
5
|
-
if (typeof window === "undefined") return;
|
|
6
|
-
const salla = window.salla;
|
|
7
|
-
if (!salla?.event?.dispatch) return;
|
|
8
|
-
const ctx = getTwilightContext();
|
|
9
|
-
salla.event.dispatch("route::changed", ctx.page ?? {});
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export { dispatchRouteChanged };
|
|
13
|
-
//# sourceMappingURL=chunk-5ZR2HKZ7.js.map
|
|
14
|
-
//# sourceMappingURL=chunk-5ZR2HKZ7.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/sdk-events.ts"],"names":[],"mappings":";;;AA0BO,SAAS,oBAAA,GAA6B;AAC3C,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,EAAA,IAAI,CAAC,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU;AAE7B,EAAA,MAAM,MAAM,kBAAA,EAAmB;AAC/B,EAAA,KAAA,CAAM,MAAM,QAAA,CAAS,gBAAA,EAAkB,GAAA,CAAI,IAAA,IAAQ,EAAE,CAAA;AACvD","file":"chunk-5ZR2HKZ7.js","sourcesContent":["import { getTwilightContext } from '../twilight/context';\nimport type { PageContext } from '../twilight/context';\n\n/**\n * Payload dispatched via `salla.event.dispatch('route::changed', payload)`\n * after each client-side navigation completes.\n *\n * The page config fields are spread at root level. When the matched route\n * has no page data (e.g., 404, error boundary), an empty object is dispatched.\n *\n * @example\n * ```ts\n * salla.event.on('route::changed', (page: RouteChangedEvent) => {\n * console.log(page.slug, page.title, page.id);\n * });\n * ```\n */\nexport type RouteChangedEvent = PageContext;\n\n/**\n * Dispatch the `route::changed` Salla SDK event with the current page config.\n *\n * Framework-agnostic — reads from the twilight context store which is\n * populated by whichever framework adapter is active (TanStack, Next.js, etc.).\n * Each adapter should call this after navigation resolves.\n */\nexport function dispatchRouteChanged(): void {\n if (typeof window === 'undefined') return;\n\n const salla = window.salla;\n if (!salla?.event?.dispatch) return;\n\n const ctx = getTwilightContext();\n salla.event.dispatch('route::changed', ctx.page ?? {});\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useCoupon.ts"],"names":[],"mappings":";;;AAqEO,SAAS,SAAA,GAA6B;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,CAAC,UAAA,EAAY,OAAO,CAAA,GAAI,UAAA,CAAW,OAAO,IAAA,KAAiB;AAC/D,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAC9D,IAAA,MAAM,OAAO,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AAC9C,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,CAAC,WAAA,EAAa,QAAQ,CAAA,GAAI,WAAW,YAAY;AACrD,IAAA,MAAM,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,YAAA,EAAa;AACtC,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA,EAAS,UAAA,CAAW,OAAA,IAAW,WAAA,CAAY,OAAA;AAAA,IAC3C,KAAA,EAAA,CAAQ,UAAA,CAAW,KAAA,IAAS,WAAA,CAAY,QAAQ,OAAA,IAAW,IAAA;AAAA,IAC3D,OAAO,OAAO,IAAA,KAAS,EAAI,MAAM,OAAA,CAAQ,IAAI,CAAA,YAA0B,KAAA,CAAA;AAAA,IACvE,MAAA,EAAQ,YAAY,EAAI,MAAM,UAAS,YAA0B,KAAA;AAAA,GACnE;AACF","file":"chunk-BVSJPBJ6.js","sourcesContent":["/**\n * useCoupon - Hook for managing coupon functionality in cart\n *\n * @example\n * ```tsx\n * function CouponInput() {\n * const { value, apply, remove, error, loading } = useCoupon();\n *\n * return (\n * <div>\n * <input placeholder=\"Enter coupon\" />\n * <button onClick={() => apply(code)}>Apply</button>\n * {error && <span>{error}</span>}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState } from 'react';\nimport { useAsyncFn } from './useAsyncFn';\nimport type { UseApply } from './types';\n\n/**\n * UseCouponResult - Return type for useCoupon hook\n */\nexport type UseCouponResult = UseApply<string>;\n\n/**\n * useCoupon - Hook for managing cart coupons\n *\n * Handles applying and removing coupons from the cart using the\n * Salla SDK. Returns state for loading, errors, and the current\n * coupon value.\n *\n * @returns Coupon management object with apply and remove functions\n *\n * @example\n * ```tsx\n * function CouponInput() {\n * const { value, apply, remove, error, loading } = useCoupon();\n *\n * const [code, setCode] = useState('');\n *\n * return (\n * <div>\n * {value ? (\n * <>\n * <span>Coupon applied: {value}</span>\n * <button onClick={remove}>Remove</button>\n * </>\n * ) : (\n * <div>\n * <input\n * placeholder=\"Enter coupon code\"\n * value={code}\n * onChange={(e) => setCode(e.target.value)}\n * />\n * <button onClick={() => apply(code)} disabled={loading}>\n * Apply\n * </button>\n * </div>\n * )}\n * {error && <span className=\"error\">{error}</span>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useCoupon(): UseCouponResult {\n const [value, setValue] = useState<string | null>(null);\n\n const [applyState, applyFn] = useAsyncFn(async (code: string) => {\n if (!code.trim()) throw new Error('Please enter a coupon code');\n await window.salla?.cart.addCoupon(code.trim());\n setValue(code.trim());\n }, []);\n\n const [removeState, removeFn] = useAsyncFn(async () => {\n await window.salla?.cart.deleteCoupon();\n setValue(null);\n }, []);\n\n return {\n value,\n loading: applyState.loading || removeState.loading,\n error: (applyState.error ?? removeState.error)?.message ?? null,\n apply: async (code) => !(((await applyFn(code)) as unknown) instanceof Error),\n remove: async () => !(((await removeFn()) as unknown) instanceof Error),\n };\n}\n"]}
|