@salla.sa/twilight-theme-engine 1.0.101 → 1.0.103
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-ZUQDN5PU.js → AddToCartForm-O7UZDX6G.js} +3 -3
- package/dist/{AddToCartForm-ZUQDN5PU.js.map → AddToCartForm-O7UZDX6G.js.map} +1 -1
- package/dist/{BlogAuthorPage-6REYBEA4.js → BlogAuthorPage-JLU2JWPT.js} +28 -28
- package/dist/{BlogAuthorPage-6REYBEA4.js.map → BlogAuthorPage-JLU2JWPT.js.map} +1 -1
- package/dist/{BlogCategoryPage-ZQLL4DTZ.js → BlogCategoryPage-FTZPLNTL.js} +28 -28
- package/dist/{BlogCategoryPage-ZQLL4DTZ.js.map → BlogCategoryPage-FTZPLNTL.js.map} +1 -1
- package/dist/{BlogPage-Q6K7VYJ4.js → BlogPage-JBVPGHR5.js} +26 -26
- package/dist/{BlogPage-Q6K7VYJ4.js.map → BlogPage-JBVPGHR5.js.map} +1 -1
- package/dist/{BlogSinglePage-T2ZCRQS7.js → BlogSinglePage-V3KQ5HIW.js} +26 -26
- package/dist/{BlogSinglePage-T2ZCRQS7.js.map → BlogSinglePage-V3KQ5HIW.js.map} +1 -1
- package/dist/{BlogTagPage-QAQ5BZZB.js → BlogTagPage-NTYO6TB4.js} +28 -28
- package/dist/{BlogTagPage-QAQ5BZZB.js.map → BlogTagPage-NTYO6TB4.js.map} +1 -1
- package/dist/{BrandsPage-KR2MC5TK.js → BrandsPage-5OSSOWDP.js} +27 -27
- package/dist/{BrandsPage-KR2MC5TK.js.map → BrandsPage-5OSSOWDP.js.map} +1 -1
- package/dist/{Breadcrumb-6S5OVQFO.js → Breadcrumb-GJI3N76F.js} +26 -26
- package/dist/{Breadcrumb-6S5OVQFO.js.map → Breadcrumb-GJI3N76F.js.map} +1 -1
- package/dist/{CartItem-UWXMIP5P.js → CartItem-KO34MYXT.js} +26 -26
- package/dist/{CartItem-UWXMIP5P.js.map → CartItem-KO34MYXT.js.map} +1 -1
- package/dist/{CartSummary-3TNNLC5A.js → CartSummary-NPFAJI7C.js} +26 -26
- package/dist/{CartSummary-3TNNLC5A.js.map → CartSummary-NPFAJI7C.js.map} +1 -1
- package/dist/{Copyright-QHX2TXLI.js → Copyright-VEJV2YTR.js} +3 -3
- package/dist/{Copyright-QHX2TXLI.js.map → Copyright-VEJV2YTR.js.map} +1 -1
- package/dist/{CustomerLayout-2KDONRD4.js → CustomerLayout-L374ZRWY.js} +26 -26
- package/dist/{CustomerLayout-2KDONRD4.js.map → CustomerLayout-L374ZRWY.js.map} +1 -1
- package/dist/{Footer-PJH36KWX.js → Footer-D4YSIM25.js} +4 -4
- package/dist/{Footer-PJH36KWX.js.map → Footer-D4YSIM25.js.map} +1 -1
- package/dist/Header-CXJ3TFHO.js +22 -0
- package/dist/{Header-TTFVFD7G.js.map → Header-CXJ3TFHO.js.map} +1 -1
- package/dist/{LoyaltyPage-GWXNY4NP.js → LoyaltyPage-BTKKAZYT.js} +26 -26
- package/dist/{LoyaltyPage-GWXNY4NP.js.map → LoyaltyPage-BTKKAZYT.js.map} +1 -1
- package/dist/{LoyaltyPointsPage-YBR3ZAZE.js → LoyaltyPointsPage-CBVSWLR6.js} +9 -9
- package/dist/{LoyaltyPointsPage-YBR3ZAZE.js.map → LoyaltyPointsPage-CBVSWLR6.js.map} +1 -1
- package/dist/{MainMenu-FKTMQHEM.js → MainMenu-KCVTEZRG.js} +8 -8
- package/dist/{MainMenu-FKTMQHEM.js.map → MainMenu-KCVTEZRG.js.map} +1 -1
- package/dist/MasterLayout-K6IGPKCD.js +53 -0
- package/dist/{MasterLayout-GQHDA63O.js.map → MasterLayout-K6IGPKCD.js.map} +1 -1
- package/dist/{MobileMenu-KTQAO2DE.js → MobileMenu-KDKARTM5.js} +27 -27
- package/dist/{MobileMenu-KTQAO2DE.js.map → MobileMenu-KDKARTM5.js.map} +1 -1
- package/dist/{NotificationsPage-IC6XXM4W.js → NotificationsPage-A3NZEO52.js} +26 -26
- package/dist/{NotificationsPage-IC6XXM4W.js.map → NotificationsPage-A3NZEO52.js.map} +1 -1
- package/dist/{OrderSinglePage-U2DRGLI4.js → OrderSinglePage-APA3LCWT.js} +27 -27
- package/dist/{OrderSinglePage-U2DRGLI4.js.map → OrderSinglePage-APA3LCWT.js.map} +1 -1
- package/dist/{OrdersPage-MOFIK76Y.js → OrdersPage-N4S2SKXD.js} +26 -26
- package/dist/{OrdersPage-MOFIK76Y.js.map → OrdersPage-N4S2SKXD.js.map} +1 -1
- package/dist/{PageSingle-YS2ALWZZ.js → PageSingle-ED3IQQLS.js} +7 -7
- package/dist/{PageSingle-YS2ALWZZ.js.map → PageSingle-ED3IQQLS.js.map} +1 -1
- package/dist/{ProductDetails-FMY3HST5.js → ProductDetails-MN3GXUXK.js} +8 -8
- package/dist/{ProductDetails-FMY3HST5.js.map → ProductDetails-MN3GXUXK.js.map} +1 -1
- package/dist/{ProfilePage-L6EZE5OV.js → ProfilePage-QQ2GN7RO.js} +26 -26
- package/dist/{ProfilePage-L6EZE5OV.js.map → ProfilePage-QQ2GN7RO.js.map} +1 -1
- package/dist/{ReviewsPage-UXWXPPDM.js → ReviewsPage-YHO2CNZP.js} +3 -3
- package/dist/{ReviewsPage-UXWXPPDM.js.map → ReviewsPage-YHO2CNZP.js.map} +1 -1
- package/dist/{SeoCartWidget-WDZVLEHH.js → SeoCartWidget-DWJT2WXI.js} +26 -26
- package/dist/{SeoCartWidget-WDZVLEHH.js.map → SeoCartWidget-DWJT2WXI.js.map} +1 -1
- package/dist/{SettingsPage-LFYR42O4.js → SettingsPage-BRCNPSRN.js} +26 -26
- package/dist/{SettingsPage-LFYR42O4.js.map → SettingsPage-BRCNPSRN.js.map} +1 -1
- package/dist/StoreClosedNotification-2CIG5LX6.js +54 -0
- package/dist/{StoreClosedNotification-Y6QRDSG6.js.map → StoreClosedNotification-2CIG5LX6.js.map} +1 -1
- package/dist/{TestimonialsPage-3NTMQL2K.js → TestimonialsPage-DDLTHBMM.js} +7 -7
- package/dist/{TestimonialsPage-3NTMQL2K.js.map → TestimonialsPage-DDLTHBMM.js.map} +1 -1
- package/dist/{ThankYouPage-H2LECFWC.js → ThankYouPage-YN6PC4GT.js} +26 -26
- package/dist/{ThankYouPage-H2LECFWC.js.map → ThankYouPage-YN6PC4GT.js.map} +1 -1
- package/dist/{WalletPage-3IDRHX7S.js → WalletPage-YVJYIL52.js} +27 -27
- package/dist/{WalletPage-3IDRHX7S.js.map → WalletPage-YVJYIL52.js.map} +1 -1
- package/dist/{WishlistPage-JYDHC3PQ.js → WishlistPage-PD3SHN27.js} +28 -28
- package/dist/{WishlistPage-JYDHC3PQ.js.map → WishlistPage-PD3SHN27.js.map} +1 -1
- package/dist/api/advertisement.js +5 -5
- package/dist/api/apps.js +5 -5
- package/dist/api/blog.js +7 -7
- package/dist/api/brands.js +7 -7
- package/dist/api/cart.js +7 -7
- package/dist/api/category.js +7 -7
- package/dist/api/client.js +4 -4
- package/dist/api/home.js +5 -5
- package/dist/api/loyalty.js +7 -7
- package/dist/api/menu.js +5 -5
- package/dist/api/notification.js +5 -5
- package/dist/api/order.js +7 -7
- package/dist/api/page.js +7 -7
- package/dist/api/product.js +7 -7
- package/dist/api/profile.js +4 -4
- package/dist/api/store.js +5 -5
- package/dist/api/translations.js +5 -5
- package/dist/api/user.js +5 -5
- package/dist/api/wallet.js +5 -5
- package/dist/api/wishlist.js +8 -8
- package/dist/{chunk-IBSQO6LW.js → chunk-224CL4SD.js} +4 -4
- package/dist/{chunk-IBSQO6LW.js.map → chunk-224CL4SD.js.map} +1 -1
- package/dist/{chunk-TIPR4JUO.js → chunk-3W746XYR.js} +5 -5
- package/dist/{chunk-TIPR4JUO.js.map → chunk-3W746XYR.js.map} +1 -1
- package/dist/{chunk-EV64HPL2.js → chunk-44FMRCHW.js} +3 -3
- package/dist/{chunk-EV64HPL2.js.map → chunk-44FMRCHW.js.map} +1 -1
- package/dist/{chunk-PSR6GPA7.js → chunk-46EXP3AL.js} +8 -8
- package/dist/{chunk-PSR6GPA7.js.map → chunk-46EXP3AL.js.map} +1 -1
- package/dist/{chunk-BH7YNCYB.js → chunk-46JZXQRS.js} +3 -3
- package/dist/{chunk-BH7YNCYB.js.map → chunk-46JZXQRS.js.map} +1 -1
- package/dist/{chunk-N2A72R2I.js → chunk-6EBVVCNI.js} +4 -4
- package/dist/{chunk-N2A72R2I.js.map → chunk-6EBVVCNI.js.map} +1 -1
- package/dist/{chunk-S34G5DL4.js → chunk-6LRTCW27.js} +4 -4
- package/dist/{chunk-S34G5DL4.js.map → chunk-6LRTCW27.js.map} +1 -1
- package/dist/{chunk-QS4EDTEX.js → chunk-6TWQZEPF.js} +4 -4
- package/dist/{chunk-QS4EDTEX.js.map → chunk-6TWQZEPF.js.map} +1 -1
- package/dist/{chunk-QZEQOVA5.js → chunk-6YWW5Y22.js} +3 -3
- package/dist/{chunk-QZEQOVA5.js.map → chunk-6YWW5Y22.js.map} +1 -1
- package/dist/{chunk-O7B5JL6H.js → chunk-7OB2DG2K.js} +4 -4
- package/dist/{chunk-O7B5JL6H.js.map → chunk-7OB2DG2K.js.map} +1 -1
- package/dist/{chunk-DKGJPF2X.js → chunk-7RL4DG54.js} +3 -3
- package/dist/{chunk-DKGJPF2X.js.map → chunk-7RL4DG54.js.map} +1 -1
- package/dist/{chunk-BPL5H33B.js → chunk-7YH3A5BT.js} +5 -5
- package/dist/{chunk-BPL5H33B.js.map → chunk-7YH3A5BT.js.map} +1 -1
- package/dist/{chunk-6FKV2CD3.js → chunk-AVPU5C5V.js} +4 -4
- package/dist/{chunk-6FKV2CD3.js.map → chunk-AVPU5C5V.js.map} +1 -1
- package/dist/{chunk-XHSRSZBR.js → chunk-BXOQ663B.js} +6 -6
- package/dist/{chunk-XHSRSZBR.js.map → chunk-BXOQ663B.js.map} +1 -1
- package/dist/{chunk-D56TVNOG.js → chunk-C7RM335V.js} +3 -3
- package/dist/{chunk-D56TVNOG.js.map → chunk-C7RM335V.js.map} +1 -1
- package/dist/chunk-CXONF653.js +14 -0
- package/dist/{chunk-JMLNYY5Q.js.map → chunk-CXONF653.js.map} +1 -1
- package/dist/{chunk-PGUKRWOY.js → chunk-FV6PNN6N.js} +5 -5
- package/dist/{chunk-PGUKRWOY.js.map → chunk-FV6PNN6N.js.map} +1 -1
- package/dist/{chunk-ENJIX7HX.js → chunk-GLWSJZJZ.js} +5 -5
- package/dist/{chunk-ENJIX7HX.js.map → chunk-GLWSJZJZ.js.map} +1 -1
- package/dist/{chunk-FO4WVGUQ.js → chunk-GNLCPK6N.js} +35 -9
- package/dist/chunk-GNLCPK6N.js.map +1 -0
- package/dist/{chunk-RWBTMHLR.js → chunk-GT2L5IJ4.js} +6 -6
- package/dist/{chunk-RWBTMHLR.js.map → chunk-GT2L5IJ4.js.map} +1 -1
- package/dist/{chunk-N2S25NXP.js → chunk-H3PJJKAQ.js} +16 -3
- package/dist/chunk-H3PJJKAQ.js.map +1 -0
- package/dist/{chunk-W2LNKEBF.js → chunk-HIAHDZI5.js} +3 -3
- package/dist/{chunk-W2LNKEBF.js.map → chunk-HIAHDZI5.js.map} +1 -1
- package/dist/{chunk-7WTUA4WY.js → chunk-HKSDEFQV.js} +3 -3
- package/dist/{chunk-7WTUA4WY.js.map → chunk-HKSDEFQV.js.map} +1 -1
- package/dist/{chunk-Q62YEBIA.js → chunk-IGD4G3SP.js} +4 -4
- package/dist/{chunk-Q62YEBIA.js.map → chunk-IGD4G3SP.js.map} +1 -1
- package/dist/{chunk-GXHJXZBG.js → chunk-IOUOF5KK.js} +4 -4
- package/dist/{chunk-GXHJXZBG.js.map → chunk-IOUOF5KK.js.map} +1 -1
- package/dist/{chunk-ENLKXUCJ.js → chunk-IYD3EN22.js} +7 -7
- package/dist/{chunk-ENLKXUCJ.js.map → chunk-IYD3EN22.js.map} +1 -1
- package/dist/{chunk-G3UTLICK.js → chunk-JDLXT6VI.js} +5 -5
- package/dist/{chunk-G3UTLICK.js.map → chunk-JDLXT6VI.js.map} +1 -1
- package/dist/{chunk-XT6CLGF5.js → chunk-JUUKZRE5.js} +3 -3
- package/dist/{chunk-XT6CLGF5.js.map → chunk-JUUKZRE5.js.map} +1 -1
- package/dist/{chunk-ZEGNYJOR.js → chunk-JZDJO2CK.js} +6 -6
- package/dist/{chunk-ZEGNYJOR.js.map → chunk-JZDJO2CK.js.map} +1 -1
- package/dist/{chunk-XGA7SPWP.js → chunk-L4AWMQPQ.js} +8 -8
- package/dist/{chunk-XGA7SPWP.js.map → chunk-L4AWMQPQ.js.map} +1 -1
- package/dist/{chunk-KNIGLCRV.js → chunk-OOCN4RFV.js} +3 -3
- package/dist/{chunk-KNIGLCRV.js.map → chunk-OOCN4RFV.js.map} +1 -1
- package/dist/{chunk-N45X7D55.js → chunk-OXMUPNMH.js} +2 -2
- package/dist/chunk-OXMUPNMH.js.map +1 -0
- package/dist/{chunk-RV54D2D7.js → chunk-P4XV656A.js} +3 -3
- package/dist/{chunk-RV54D2D7.js.map → chunk-P4XV656A.js.map} +1 -1
- package/dist/{chunk-IU4KTCS3.js → chunk-PENQTLAN.js} +3 -3
- package/dist/{chunk-IU4KTCS3.js.map → chunk-PENQTLAN.js.map} +1 -1
- package/dist/{chunk-CNUBL24W.js → chunk-PXHFHHTW.js} +4 -4
- package/dist/{chunk-CNUBL24W.js.map → chunk-PXHFHHTW.js.map} +1 -1
- package/dist/{chunk-GMXI6V2D.js → chunk-QTH6GGUH.js} +14 -8
- package/dist/chunk-QTH6GGUH.js.map +1 -0
- package/dist/{chunk-56T47K7P.js → chunk-RI5PSI34.js} +5 -5
- package/dist/{chunk-56T47K7P.js.map → chunk-RI5PSI34.js.map} +1 -1
- package/dist/{chunk-5SDCUGYR.js → chunk-RJTIP2L3.js} +4 -4
- package/dist/{chunk-5SDCUGYR.js.map → chunk-RJTIP2L3.js.map} +1 -1
- package/dist/{chunk-VCFNYY3V.js → chunk-RPVHCIR4.js} +4 -4
- package/dist/{chunk-VCFNYY3V.js.map → chunk-RPVHCIR4.js.map} +1 -1
- package/dist/{chunk-JANISEUE.js → chunk-TMN53ONR.js} +7 -7
- package/dist/{chunk-JANISEUE.js.map → chunk-TMN53ONR.js.map} +1 -1
- package/dist/{chunk-OZP2FID7.js → chunk-TSAIM4XM.js} +4 -4
- package/dist/{chunk-OZP2FID7.js.map → chunk-TSAIM4XM.js.map} +1 -1
- package/dist/{chunk-Q2755VB2.js → chunk-U73QOIGZ.js} +8 -8
- package/dist/{chunk-Q2755VB2.js.map → chunk-U73QOIGZ.js.map} +1 -1
- package/dist/{chunk-OU66LX2C.js → chunk-UIXEKYTM.js} +21 -21
- package/dist/{chunk-OU66LX2C.js.map → chunk-UIXEKYTM.js.map} +1 -1
- package/dist/{chunk-2FDLEB5J.js → chunk-UY57T42N.js} +3 -3
- package/dist/{chunk-2FDLEB5J.js.map → chunk-UY57T42N.js.map} +1 -1
- package/dist/{chunk-TJNBUVUA.js → chunk-V7EPED4G.js} +19 -19
- package/dist/chunk-V7EPED4G.js.map +1 -0
- package/dist/{chunk-2FKZAAV7.js → chunk-VEWF3NFM.js} +3 -3
- package/dist/{chunk-2FKZAAV7.js.map → chunk-VEWF3NFM.js.map} +1 -1
- package/dist/{chunk-EWLVLDRP.js → chunk-VPGOT3JO.js} +3 -3
- package/dist/{chunk-EWLVLDRP.js.map → chunk-VPGOT3JO.js.map} +1 -1
- package/dist/{chunk-J5X4LXNM.js → chunk-XMO7HDZZ.js} +3 -3
- package/dist/{chunk-J5X4LXNM.js.map → chunk-XMO7HDZZ.js.map} +1 -1
- package/dist/{chunk-DNPQ2JBM.js → chunk-Y6J6NYNK.js} +4 -4
- package/dist/{chunk-DNPQ2JBM.js.map → chunk-Y6J6NYNK.js.map} +1 -1
- package/dist/{chunk-NZRJOAA7.js → chunk-YXI2ZCXD.js} +4 -4
- package/dist/{chunk-NZRJOAA7.js.map → chunk-YXI2ZCXD.js.map} +1 -1
- package/dist/{chunk-VWVCSD3N.js → chunk-ZMCFSOYF.js} +4 -4
- package/dist/{chunk-VWVCSD3N.js.map → chunk-ZMCFSOYF.js.map} +1 -1
- package/dist/{chunk-6EQ7G3SZ.js → chunk-ZPX4LBQZ.js} +5 -5
- package/dist/{chunk-6EQ7G3SZ.js.map → chunk-ZPX4LBQZ.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 +24 -24
- package/dist/components/home/index.js +28 -28
- package/dist/components/layout/index.js +7 -7
- package/dist/components/product/index.js +25 -25
- package/dist/components/store/index.js +26 -26
- package/dist/components/toast/index.js +5 -5
- package/dist/dev/editor/index.js +4 -4
- package/dist/dev/editor/index.js.map +1 -1
- package/dist/dev/editor/pickers.d.ts +1 -1
- package/dist/dev/editor/pickers.d.ts.map +1 -1
- package/dist/dev/index.js +4 -4
- package/dist/dev/schema-types.d.ts +1 -1
- package/dist/dev/schema-types.d.ts.map +1 -1
- package/dist/document-class-JQ7ZZJAT.js +29 -0
- package/dist/{document-class-F75JZPRM.js.map → document-class-JQ7ZZJAT.js.map} +1 -1
- package/dist/hooks/index.js +24 -24
- package/dist/hooks/useComments.js +4 -4
- package/dist/hooks/useGtm.js +24 -24
- package/dist/hooks/useMoney.js +24 -24
- package/dist/hooks/useProduct.js +4 -4
- package/dist/hooks/useStore.js +24 -24
- package/dist/hooks/useUser.js +6 -6
- package/dist/hooks/useWishlist.js +4 -4
- package/dist/index.js +24 -24
- package/dist/native-app/index.js +4 -4
- package/dist/{navigation-JB2CJXBF.js → navigation-GQA6OA42.js} +8 -8
- package/dist/{navigation-JB2CJXBF.js.map → navigation-GQA6OA42.js.map} +1 -1
- package/dist/navigation-RO3T4FDQ.js +14 -0
- package/dist/{navigation-KTMLD4VB.js.map → navigation-RO3T4FDQ.js.map} +1 -1
- package/dist/{not-found-O4BCTCSH.js → not-found-MTU2BM73.js} +27 -27
- package/dist/{not-found-O4BCTCSH.js.map → not-found-MTU2BM73.js.map} +1 -1
- package/dist/providers/index.js +24 -24
- package/dist/routes/account/orders.js +8 -8
- package/dist/routes/account.js +17 -17
- package/dist/routes/blog.js +12 -12
- package/dist/routes/brands.js +8 -8
- package/dist/routes/cart.js +32 -32
- package/dist/routes/home.js +29 -29
- package/dist/routes/index.js +7 -7
- package/dist/routes/loyalty.js +9 -9
- package/dist/routes/page.js +8 -8
- package/dist/routes/product-listing.js +30 -30
- package/dist/routes/product.js +28 -28
- package/dist/routes/seo-redirects.js +7 -7
- package/dist/routes/testimonials.js +3 -3
- package/dist/routes/thank-you.js +8 -8
- package/dist/skeleton.js +29 -29
- package/dist/{store-lookup-T4TK7CKA.js → store-lookup-C4DMFSBT.js} +13 -13
- package/dist/{store-lookup-T4TK7CKA.js.map → store-lookup-C4DMFSBT.js.map} +1 -1
- package/dist/tanstack/middleware/twilight.d.ts.map +1 -1
- package/dist/tanstack/navigation.d.ts.map +1 -1
- package/dist/tanstack/router.d.ts.map +1 -1
- package/dist/tanstack/store-base.d.ts +5 -2
- package/dist/tanstack/store-base.d.ts.map +1 -1
- package/dist/tanstack.js +27 -22
- package/dist/tanstack.js.map +1 -1
- package/dist/twilight/context.d.ts +7 -0
- package/dist/twilight/context.d.ts.map +1 -1
- package/dist/utils/cookies.d.ts +32 -0
- package/dist/utils/cookies.d.ts.map +1 -1
- package/dist/utils/index.js +6 -6
- package/dist/utils/runtime-env.d.ts +7 -0
- package/dist/utils/runtime-env.d.ts.map +1 -1
- package/dist/utils/store-base.d.ts +12 -2
- package/dist/utils/store-base.d.ts.map +1 -1
- package/dist/utils/store-identity.d.ts +9 -0
- package/dist/utils/store-identity.d.ts.map +1 -1
- package/dist/vite/index.js +11 -5
- package/dist/vite/index.js.map +1 -1
- package/dist/vite/plugins/twilight-schema.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/Header-TTFVFD7G.js +0 -22
- package/dist/MasterLayout-GQHDA63O.js +0 -53
- package/dist/StoreClosedNotification-Y6QRDSG6.js +0 -54
- package/dist/chunk-FO4WVGUQ.js.map +0 -1
- package/dist/chunk-GMXI6V2D.js.map +0 -1
- package/dist/chunk-JMLNYY5Q.js +0 -14
- package/dist/chunk-N2S25NXP.js.map +0 -1
- package/dist/chunk-N45X7D55.js.map +0 -1
- package/dist/chunk-TJNBUVUA.js.map +0 -1
- package/dist/document-class-F75JZPRM.js +0 -29
- package/dist/navigation-KTMLD4VB.js +0 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/product/lazy.ts","../src/components/product/ProductCard.tsx","../src/components/product/ProductGallery.tsx"],"names":["ProductCardContent","ProductCard","jsxs","jsx","useMemo"],"mappings":";;;;;;;;;;;;;;;;AAEO,IAAM,kBAAA,GAAqB,IAAA;AAAA,EAAK,MACrC,OAAO,8BAAkB,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,cAAA,EAAe,CAAE;AACxE;AAEO,IAAM,iBAAA,GAAoB,IAAA;AAAA,EAAK,MACpC,OAAO,6BAAiB,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,aAAA,EAAc,CAAE;AACtE;ACMA,IAAM,gBAAA,GAAmB,cAAA;AAEzB,IAAM,2BAAA,GAA8B,CAAC,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAEvD,IAAM,mBAAA,GAAsB,+BAAA;AAE5B,IAAM,wBAAA,GAA2B,iCAAA;AAoCjC,IAAM,kBAAA,GAAqB,IAAA,CAAK,SAASA,mBAAAA,CAAmB;AAAA,EAC1D,OAAA;AAAA,EACA,MAAA,GAAS,UAAA;AAAA,EACT,SAAA,GAAY,EAAA;AAAA,EACZ,UAAA,GAAa,KAAA;AAAA,EACb,YAAA,GAAe,KAAA;AAAA,EACf,gBAAA,GAAmB,KAAA;AAAA,EACnB,KAAA,GAAQ,CAAA;AAAA,EACR,aAAA,GAAgB,KAAA;AAAA,EAChB;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,QAAA,EAAS;AAC5B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,WAAA,EAAY;AACrC,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,EAAE,aAAA,EAAc,GAAI,QAAA,EAAS;AACnC,EAAA,MAAM,EAAE,MAAA,EAAQ,YAAA,EAAa,GAAI,SAAA,EAAU;AAI3C,EAAA,MAAM,YAAA,GAAe,KAAA,EAAO,QAAA,EAAU,6BAAA,KAAkC,KAAA;AACxE,EAAA,MAAM,eAAA,GACJ,YAAA,IACA,OAAA,CAAQ,eAAA,IACR,OAAA,CAAQ,IAAA,KAAS,UAAA,IACjB,OAAA,CAAQ,IAAA,KAAS,mBAAA,GACb,gBAAA,GACA,OAAA,CAAQ,MAAA;AAEd,EAAA,MAAM,eAAe,iBAAA,CAAkB,EAAE,MAAM,SAAA,EAAW,KAAA,EAAO,QAAQ,CAAA;AAGzE,EAAA,MAAM,aAAa,MAAA,KAAW,UAAA;AAC9B,EAAA,MAAM,eAAe,MAAA,KAAW,YAAA;AAChC,EAAA,MAAM,cAAc,MAAA,KAAW,WAAA;AAC/B,EAAA,MAAM,YAAY,MAAA,KAAW,SAAA;AAC7B,EAAA,MAAM,YAAY,MAAA,KAAW,SAAA;AAG7B,EAAA,MAAM,oBAAoB,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAC,CAAA;AACzD,EAAA,MAAM,oBAAA,GAAuB,YAAY,MAAM;AAC7C,IAAA,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAC,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,QAAA,EAAU,OAAA,CAAQ,EAAE,CAAC,CAAA;AAGzB,EAAA,MAAM,cAAA,GAAiB,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,QAAA;AAGjD,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI,SAAS,QAAA,EAAU,KAAA,IAAS,OAAO,OAAA,CAAQ,QAAA,CAAS,UAAU,QAAA,EAAU;AAC1E,MAAA,2BAAQ,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAkC,QAAA,EAAA,OAAA,CAAQ,SAAS,KAAA,EAAM,CAAA;AAAA,IACjF;AACA,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAkC,kBAAQ,eAAA,EAAgB,CAAA;AAAA,IAClF;AACA,IAAA,IAAI,YAAA,IAAgB,SAAS,QAAA,EAAU;AACrC,MAAA,MAAM,YAAA,GAAe,YAAA,CAAa,OAAA,CAAQ,QAAQ,CAAA;AAClD,MAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,2BAA2B,UAAU,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE;AAAA,OAAA,EAC9C,CAAA;AAAA,IAEJ;AACA,IAAA,IAAI,YAAA,IAAgB,SAAS,eAAA,EAAiB;AAC5C,MAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAU,4BACZ,QAAA,EAAA,CAAA,CAAE,6BAAA,EAA+B,cAAc,CAAA,EAClD,CAAA;AAAA,IAEJ;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAGA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,UAAA,EAAY;AAC5C,MAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAE,CAAA;AAAA,QAC/B,QAAQ,aAAA,oBAAiB,GAAA,CAAC,UAAM,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAE;AAAA,OAAA,EACjE,CAAA;AAAA,IAEJ;AACA,IAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,MAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,CAAA,CAAE,+BAAA,EAAiC,eAAe,CAAA,EAAE,CAAA;AAAA,wBACxD,GAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAE;AAAA,OAAA,EACtC,CAAA;AAAA,IAEJ;AACA,IAAA,2BAAQ,IAAA,EAAA,EAAG,SAAA,EAAU,wBAAwB,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAE,CAAA;AAAA,EACrE,CAAA;AAGA,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,gBAAA;AAAA,IACA,sBAAA;AAAA,IACA,aAAa,yBAAA,GAA4B,EAAA;AAAA,IACzC,eAAe,2BAAA,GAA8B,EAAA;AAAA,IAC7C,cAAA,IAAkB,aAAa,CAAA,yBAAA,CAAA,GAA8B,EAAA;AAAA,IAC7D,YAAY,wBAAA,GAA2B,EAAA;AAAA,IACvC,cAAc,2BAAA,GAA8B,EAAA;AAAA,IAC5C,YAAY,wBAAA,GAA2B,EAAA;AAAA,IACvC,OAAA,EAAS,WAAW,yBAAA,GAA4B,EAAA;AAAA,IAChD,aAAa,uBAAA,GAA0B,EAAA;AAAA,IACvC,OAAA,EAAS,kBAAkB,6BAAA,GAAgC,EAAA;AAAA,IAC3D;AAAA,GACF,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAGX,EAAA,MAAM,oBAAA,GAAuB,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAC7D,EAAA,MAAM,aAAA,GAAgB,oBAAA,GAAuB,SAAA,GAAY,cAAA,IAAkB,OAAA;AAE3E,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,CAAA,aAAA,EAAgB,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,MAC9B,SAAA,EAAW,aAAA;AAAA,MACX,mBAAiB,OAAA,CAAQ,EAAA;AAAA,MACzB,KAAA,EAAO;AAAA,QACL,cAAA,EAAgB,CAAA,EAAG,KAAA,GAAQ,GAAG,CAAA,EAAA;AAAA,OAChC;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,WAAA,GAAc,2BAAA,GAA8B,sBAAA,EAC1D,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,GAAA,EAAA,EAAE,MAAM,OAAA,CAAQ,GAAA,EAAK,cAAY,OAAA,CAAQ,KAAA,EAAO,GAAA,IAAO,OAAA,CAAQ,IAAA,EAC9D,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,wBAAwB,aAAa,CAAA,CAAA;AAAA,gBAChD,GAAA,EAAK,QAAQ,KAAA,EAAO,GAAA;AAAA,gBACpB,GAAA,EAAK,OAAA,CAAQ,KAAA,EAAO,GAAA,IAAO,OAAA,CAAQ,IAAA;AAAA,gBACnC,KAAA,EAAO,GAAA;AAAA,gBACP,MAAA,EAAQ,GAAA;AAAA,gBACR,KAAA,EACE,KAAA,KAAU,WAAA,IAAe,SAAA,GAAY,wBAAA,GAA2B,mBAAA,CAAA;AAAA,gBAElE,YAAA,EAAc,2BAAA;AAAA,gBACd,WAAA,EAAY,KAAA;AAAA,gBACZ,QAAA,EAAU;AAAA;AAAA,aACZ;AAAA,YACC,CAAC,WAAA,IAAe,CAAC,SAAA,IAAa,eAAA;AAAgB,WAAA,EACjD,CAAA;AAAA,UACC,WAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,OAAA,CAAQ,KAAK,YAAA,EAAY,OAAA,CAAQ,IAAA,EAAM,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,UAEpF,CAAC,YAAA,IAAgB,CAAC,WAAA,oBACjB,GAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAK,SAAA;AAAA,cACL,KAAA,EAAM,OAAA;AAAA,cACN,SAAA,EAAW,CAAA,CAAE,uBAAA,EAAyB,2BAA2B,CAAA;AAAA,cACjE,SAAA,EAAW,CAAA,qCAAA,EAAwC,iBAAA,GAAoB,2CAAA,GAA8C,wBAAwB,CAAA,CAAA;AAAA,cAC7I,OAAA,EAAS,oBAAA;AAAA,cACT,WAAS,OAAA,CAAQ,EAAA;AAAA,cAEjB,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,aAAA,EAAc;AAAA;AAAA;AAC7B,SAAA,EAEJ,CAAA;AAAA,wBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAEZ,QAAA,EAAA;AAAA,UAAA,SAAA,IAAa,OAAA,EAAS,QAAA,oBACrB,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4BAAA,EACb,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,YAAA,CAAa,OAAA,CAAQ,QAAQ,CAAA,EAAE,CAAA;AAAA,cAClC,CAAA,CAAE,2BAA2B,UAAU;AAAA,aAAA,EAC1C,CAAA;AAAA,4BACA,IAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,4BAAA;AAAA,gBACN,OAAA,EAAQ,aAAA;AAAA,gBACR,SAAA,EAAU,gCAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,QAAA,EAAA,EAAO,IAAG,IAAA,EAAK,EAAA,EAAG,MAAK,CAAA,EAAE,SAAA,EAAU,WAAU,qCAAA,EAAsC,CAAA;AAAA,kCACpF,GAAA,CAAC,YAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,SAAA,EAAU,SAAA,EAAU,oCAAA,EAAqC;AAAA;AAAA;AAAA;AACrF,WAAA,EACF,CAAA;AAAA,0BAGF,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,CAAA,4BAAA,EAA+B,SAAA,GAAY,sCAAA,GAAyC,EAAE,CAAA,CAAA;AAAA,cAEjG,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8BAAA,EACZ,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,MAAM,OAAA,CAAQ,GAAA,EAAM,QAAA,EAAA,OAAA,CAAQ,IAAA,EAAK,CAAA,EACtC,CAAA;AAAA,gBACC,OAAA,CAAQ,YAAY,CAAC,SAAA,wBACnB,GAAA,EAAA,EAAE,SAAA,EAAU,4CAAA,EAA8C,QAAA,EAAA,OAAA,CAAQ,QAAA,EAAS;AAAA;AAAA;AAAA,WAEhF;AAAA,0BAEA,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,CAAA,2BAAA,EAA8B,SAAA,GAAY,sCAAA,GAAyC,EAAE,CAAA,CAAA;AAAA,cAE/F,QAAA,EAAA;AAAA,gBAAA,CAAC,OAAA,EAAS,QAAA,EAAU,UAAA,IAAc,eAAA,EAAgB;AAAA,gBAClD,QAAQ,MAAA,EAAQ,KAAA,oBACf,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EACb,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,GAAA,EAAA,EAAE,WAAU,6BAAA,EAA8B,CAAA;AAAA,kCAC3C,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAM;AAAA,iBAAA,EAC9B;AAAA;AAAA;AAAA,WAEJ;AAAA,UAEC,CAAC,gBAAA,oBACA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qCAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,qBAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,YAAA;AAAA,gBACL,IAAA,EAAK,SAAA;AAAA,gBACL,KAAA,EAAM,MAAA;AAAA,gBACN,WAAW,OAAA,CAAQ,EAAA;AAAA,gBACnB,aAAA,EAAe,eAAA;AAAA,gBACf,aAAa,OAAA,CAAQ,IAAA;AAAA,gBACrB,aAAa,OAAA,CAAQ;AAAA;AAAA,aACvB;AAAA,YAAA,CACE,gBAAgB,WAAA,qBAChB,GAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,MAAA;AAAA,gBACN,IAAA,EAAK,SAAA;AAAA,gBACL,KAAA,EAAM,OAAA;AAAA,gBACN,SAAA,EAAW,CAAA,CAAE,uBAAA,EAAyB,2BAA2B,CAAA;AAAA,gBACjE,SAAA,EAAW,CAAA,qCAAA,EAAwC,iBAAA,GAAoB,2CAAA,GAA8C,wBAAwB,CAAA,CAAA;AAAA,gBAC7I,OAAA,EAAS,oBAAA;AAAA,gBACT,WAAS,OAAA,CAAQ,EAAA;AAAA,gBAEjB,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,aAAA,EAAc;AAAA;AAAA;AAC7B,WAAA,EAEJ;AAAA,SAAA,EAEJ;AAAA;AAAA;AAAA,GACF;AAEJ,CAAC,CAAA;AAEM,IAAM,WAAA,GAAc,IAAA,CAAK,SAASC,YAAAA,CAAY,KAAA,EAAyB;AAC5E,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAM;AAC9B,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,WAAA,CAA8B,gBAAgB,CAAA,KAAM,IAAA;AACjF,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,QAAA,CAAS,QAA0B,gBAAgB,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAO,GAAA,CAAC,SAAA,EAAA,EAAW,GAAG,KAAA,EAAO,CAAA;AAAA,EAC/B;AAEA,EAAA,uBAAO,GAAA,CAAC,kBAAA,EAAA,EAAoB,GAAG,KAAA,EAAO,CAAA;AACxC,CAAC;ACpSD,IAAM,mBAAA,GAAsB,iBAAA;AAc5B,SAAS,mBAAmB,MAAA,EAAwC;AAClE,EAAA,OAAO,MAAA,CAAO,OAAA,CAAsB,CAAC,KAAA,KAAU;AAC7C,IAAA,IAAI,KAAA,CAAM,iBAAA,EAAmB,OAAO,CAAC,EAAE,KAAK,KAAA,CAAM,iBAAA,EAAmB,IAAA,EAAM,UAAA,EAAY,CAAA;AACvF,IAAA,IAAI,KAAA,CAAM,SAAA,EAAW,OAAO,CAAC,EAAE,KAAK,KAAA,CAAM,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,CAAA;AACpE,IAAA,OAAO,KAAA,CAAM,GAAA,GAAM,CAAC,EAAE,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,CAAA,GAAI,EAAC;AAAA,EAC5D,CAAC,CAAA;AACH;AAEA,SAAS,qBAAA,CAAsB,EAAE,OAAA,EAAQ,EAAwB;AAC/D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,WAAA,EAAY;AAC9B,EAAA,MAAM,QAAA,GAAW,CAAA,eAAA,EAAkB,OAAA,CAAQ,EAAE,CAAA,CAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,QAAA,CAAS,sBAAA,IAA0B,OAAA;AAG3D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAA8B,IAAI,CAAA;AAEhE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,GAAA,GAAM,sBAAsB,MAAM;AACtC,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,cAAA,CAAe,QAAQ,CAAA;AAC3C,MAAA,IAAI,CAAC,IAAI,aAAA,EAAe;AACxB,MAAA,MAAM,EAAE,aAAA,EAAe,WAAA,EAAY,GAAI,EAAA;AACvC,MAAA,aAAA,CAAc,YAAY,EAAE,CAAA;AAC5B,MAAA,aAAA,CAAc,YAAA,CAAa,IAAI,WAAW,CAAA;AAAA,IAC5C,CAAC,CAAA;AACD,IAAA,OAAO,MAAM,qBAAqB,GAAG,CAAA;AAAA,EACvC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAIb,EAAA,MAAM,SACJ,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,GACtC,OAAA,CAAQ,MAAA,GACR,OAAA,CAAQ,OAAO,GAAA,GACb,CAAC,OAAA,CAAQ,KAAK,IACd,EAAC;AAET,EAAA,MAAM,aAAA,GAAgB,OAAO,MAAA,GAAS,CAAA;AACtC,EAAA,MAAM,iBAAA,GAAoB,CAAC,QAAA,KAA2B;AACpD,IAAA,IAAI,CAAC,WAAA,EAAY,EAAG,OAAO,KAAA;AAC3B,IAAA,IAAI,OAAO,KAAA,EAAO,MAAA,EAAQ,cAAc,MAAA,EAAQ,QAAQ,GAAG,OAAO,IAAA;AAClE,IAAA,MAAA,CAAO,KAAA,EAAO,MAAM,QAAA,CAAS,sBAAA,EAAwB,EAAE,MAAA,EAAQ,kBAAA,CAAmB,MAAM,CAAA,EAAG,CAAA;AAC3F,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oGAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,QAAA;AAAA,QACJ,SAAA,EAAU,wCAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,UAAA,EAAU,IAAA;AAAA,QACV,wBAAA,EAAwB,IAAA;AAAA,QACxB,kBAAA,EAAoB,KAAA;AAAA,QACpB,YAAA,EAAc,EAAE,aAAA,EAAe,IAAA,EAAM,YAAY,IAAA,EAAK;AAAA,QAErD,QAAA,EAAA;AAAA,UAAA,OAAA,CAAQ,mCACPC,GAAAA,CAAC,SAAI,SAAA,EAAU,iBAAA,EAAmB,kBAAQ,eAAA,EAAgB,CAAA;AAAA,UAG3D,QAAQ,QAAA,oBACPD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iJAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EAA+C,kBAAQ,QAAA,EAAS,CAAA;AAAA,4BAChFA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBACb,QAAA,EAAA,CAAA,CAAE,yBAAA,EAA2B,UAAU,CAAA,EAC1C;AAAA,WAAA,EACF,CAAA;AAAA,0BAGFA,GAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,OAAA,EACP,iBAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBAClBA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cAEC,KAAA;AAAA,cACA,OAAA;AAAA,cACA,KAAA;AAAA,cACA,SAAA;AAAA,cACA,SAAA,EAAW,UAAA;AAAA,cACX,YAAA,EAAc;AAAA,aAAA;AAAA,YANT,MAAM,EAAA,IAAM,KAAA,CAAM,iBAAA,IAAqB,KAAA,CAAM,aAAa,KAAA,CAAM;AAAA,WAQxE,CAAA,EACH,CAAA;AAAA,UAEC,aAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,QAAA,EACP,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBAClBA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cAEC,KAAA;AAAA,cACA;AAAA,aAAA;AAAA,YAFK,MAAM,EAAA,IAAM,KAAA,CAAM,iBAAA,IAAqB,KAAA,CAAM,aAAa,KAAA,CAAM;AAAA,WAIxE,CAAA,EACH;AAAA;AAAA;AAAA,KAEJ;AAAA,oBAEAA,GAAAA,CAAC,QAAA,EAAA,EAAS,QAAA,EAAU,MAClB,QAAA,kBAAAA,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,CAAC,CAAC,OAAA;AAAA,QACV,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,QAC9B,GAAA,EAAK,SAAS,GAAA,IAAO,EAAA;AAAA,QACrB,KAAK,OAAA,EAAS;AAAA;AAAA,KAChB,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,MAAM,SAAA,GAAYC,QAAQ,MAAM;AAC9B,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,CAA6B,mBAAmB,CAAA;AAG1E,IAAA,OAAO,QAAA,KAAa,iBAAiB,IAAA,GAAO,QAAA;AAAA,EAC9C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAOD,GAAAA,CAAC,SAAA,EAAA,EAAW,GAAG,KAAA,EAAO,CAAA;AAAA,EAC/B;AAEA,EAAA,uBAAOA,GAAAA,CAAC,qBAAA,EAAA,EAAuB,GAAG,KAAA,EAAO,CAAA;AAC3C;AAEA,SAAS,UAAA,CAAW;AAAA,EAClB,KAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,SAAS,CAAA;AAEvC,EAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,IAAA;AAAA;AAAA,sBAEEA,GAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,EAAE,SAAA,EAAW,OAAA,EAAQ;AAAA,UAC5B,SAAA,EAAU,wCAAA;AAAA,UACV,OAAA,EAAQ,MAAA;AAAA,UACR,iBAAA,EAAe,IAAA;AAAA,UACf,cAAA,EAAa,OAAA;AAAA,UACb,aAAA,EAAW,IAAA;AAAA,UACX,MAAA,EAAQ,MAAM,GAAA,IAAO,MAAA;AAAA,UACrB,KAAK,KAAA,CAAM,iBAAA;AAAA,UACX,kBAAA,EAAiB,GAAA;AAAA,UACjB,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK;AAAA;AAAA;AAClC;AAAA,EAEL;AAEA,EAAA,uBACEA,GAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,iBAAA,EAAiB,CAAA,QAAA,EAAW,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,MACtC,eAAa,KAAA,CAAM,EAAA;AAAA,MACnB,iBAAA,EAAiB,KAAA;AAAA,MAChB,GAAI,MAAM,SAAA,GAAY,EAAE,kBAAkB,KAAA,CAAM,SAAA,KAAc,EAAC;AAAA,MAChE,gBAAc,KAAA,CAAM,GAAA;AAAA,MACpB,eAAA,EAAc,OAAA;AAAA,MACd,WAAA,EAAW,KAAA,CAAM,SAAA,GAAY,SAAA,GAAY,OAAA;AAAA,MACzC,IAAA,EAAM,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,GAAA;AAAA,MAG9B,GAAI,UAAU,EAAE,MAAA,EAAQ,UAAU,GAAA,EAAK,qBAAA,KAA0B,EAAC;AAAA,MACnE,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,QAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AACvB,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,OAAA,IAAW,CAAC,KAAA,CAAM,GAAA,EAAK;AAC3B,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,SAAA,CAAU,EAAE,KAAK,KAAA,CAAM,GAAA,EAAK,KAAK,KAAA,CAAM,GAAA,IAAO,OAAA,CAAQ,IAAA,EAAM,CAAA;AAAA,MAC9D,CAAA;AAAA,MACA,cAAY,OAAA,CAAQ,IAAA;AAAA,MACpB,SAAA,EAAW,CAAA,+CAAA,EAAkD,KAAA,CAAM,SAAA,GAAY,gBAAgB,EAAE,CAAA,CAAA;AAAA,MAEjG,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAU,MAAA,GAAS,EAAA,GAAK,yCAAyC,CAAA,CAAA,EAC/E,QAAA,kBAAAA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAI,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AAAA,UACnB,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,GAAA,EAAK,KAAA,CAAM,GAAA,IAAO,OAAA,CAAQ,IAAA;AAAA,UAC1B,SAAA,EAAW,wBAAwB,SAAS,CAAA,CAAA;AAAA,UAC5C,WAAA,EAAY,KAAA;AAAA,UACZ,UAAU,KAAA,KAAU,CAAA;AAAA,UACpB,SAAA,EAAS,IAAA;AAAA,UACT,MAAA,EAAQ,MAAM,SAAA,CAAU,IAAI;AAAA;AAAA,OAC9B,EACF;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,KAAA,EAAM,EAA2C;AAC5E,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,kBAAA,EAAqB,KAAA,CAAM,SAAA,GAAY,aAAA,GAAgB,EAAE,CAAA,CAAA,EAAI,KAAA,CAAM,iBAAA,GAAoB,aAAA,GAAgB,EAAE,CAAA,CAAA;AAAA,MACpH,gBAAc,KAAA,CAAM,GAAA;AAAA,MAEpB,QAAA,kBAAAA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,GAAA,EAAK,MAAM,GAAA,IAAO,EAAA;AAAA,UAClB,SAAA,EAAU,mEAAA;AAAA,UACV,OAAO,KAAA,CAAM,GAAA;AAAA,UACb,UAAU,KAAA,GAAQ,CAAA;AAAA,UAClB,SAAA,EAAS;AAAA;AAAA;AACX;AAAA,GACF;AAEJ","file":"chunk-PSR6GPA7.js","sourcesContent":["import { lazy } from 'react';\n\nexport const LazyProductDetails = lazy(() =>\n import('./ProductDetails').then((m) => ({ default: m.ProductDetails }))\n);\n\nexport const LazyAddToCartForm = lazy(() =>\n import('./AddToCartForm').then((m) => ({ default: m.AddToCartForm }))\n);\n","import { memo, useCallback, useMemo } from 'react';\nimport { SallaAddProductButton } from '@salla.sa/twilight-components-react/add-product-button';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { useHostAttributes } from '@salla.sa/twilight-theme-engine/hooks/useHostAttributes';\nimport { useMoney } from '../../hooks/useMoney';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useTwilight } from '../../providers/TwilightProvider';\nimport { useWishlist } from '../../hooks/useWishlist';\nimport { useAsset } from '../../hooks/useAsset';\nimport { useNumber } from '../../hooks/useNumber';\nimport { registry } from '../ComponentRegistry';\nimport { Image } from '../common';\nimport type { Product } from '../../types';\n\nconst PRODUCT_CARD_KEY = 'product:card';\n\nconst PRODUCT_IMAGE_SRCSET_WIDTHS = [150, 300, 450, 600] as const;\n/** Matches `.s-products-list-vertical-cards`: 2-col below 768px, 4-col above. */\nconst PRODUCT_IMAGE_SIZES = '(min-width: 768px) 25vw, 50vw';\n/** fullImage / minimal slots in FeaturedProductsStyle3 (`lg:grid-cols-2`). */\nconst PRODUCT_WIDE_IMAGE_SIZES = '(min-width: 1024px) 50vw, 100vw';\n\n/** Product card layout variants - mutually exclusive */\nexport type ProductCardLayout = 'vertical' | 'horizontal' | 'fullImage' | 'minimal' | 'special';\n\nexport interface ProductCardProps {\n product: Product;\n layout?: ProductCardLayout;\n className?: string;\n withShadow?: boolean;\n withQuantity?: boolean;\n withoutAddButton?: boolean;\n index?: number;\n imagePriority?: boolean;\n /** Overrides the layout-based image `sizes` hint. */\n sizes?: string;\n}\n\n/**\n * ProductCard - Displays a product in various layouts\n *\n * Layouts:\n * - vertical: Default card with image top, content bottom\n * - horizontal: Side-by-side image and content\n * - fullImage: Full bleed image with overlay content\n * - minimal: Compact version with reduced info\n * - special: Featured card with quantity pie chart\n *\n * Features:\n * - Native lazy loading for images\n * - Product badges (promotion, preorder, quantity, out of stock)\n * - Wishlist toggle button\n * - Price display (sale, starting, regular)\n * - Rating display\n * - Add to cart button via SallaAddProductButton (handles labels internally)\n */\nconst ProductCardContent = memo(function ProductCardContent({\n product,\n layout = 'vertical',\n className = '',\n withShadow = false,\n withQuantity = false,\n withoutAddButton = false,\n index = 0,\n imagePriority = false,\n sizes,\n}: ProductCardProps) {\n const { format } = useMoney();\n const { t } = useTranslation();\n const { store, theme } = useTwilight();\n const wishlist = useWishlist();\n const { isPlaceholder } = useAsset();\n const { format: formatNumber } = useNumber();\n\n // Out-of-stock cards offer \"notify me when available\" instead of a dead button, unless\n // the merchant switched `notify_when_available_in_card` off (Twig theme-raed parity).\n const notifyInCard = theme?.settings?.notify_when_available_in_card !== false;\n const addButtonStatus =\n notifyInCard &&\n product.is_out_of_stock &&\n product.type !== 'donating' &&\n product.type !== 'financial_support'\n ? 'out-and-notify'\n : product.status;\n\n const addButtonRef = useHostAttributes({ fill: 'outline', width: 'wide' });\n\n // Layout flags\n const isVertical = layout === 'vertical';\n const isHorizontal = layout === 'horizontal';\n const isFullImage = layout === 'fullImage';\n const isMinimal = layout === 'minimal';\n const isSpecial = layout === 'special';\n\n // Wishlist status\n const productInWishlist = wishlist.has(Number(product.id));\n const handleWishlistToggle = useCallback(() => {\n wishlist.toggle(Number(product.id));\n }, [wishlist, product.id]);\n\n // Get image fit type from store settings\n const fitImageHeight = store?.settings?.product?.fit_type;\n\n // Product badge component\n const getProductBadge = () => {\n if (product?.preorder?.label && typeof product.preorder.label === 'string') {\n return <div className=\"s-product-card-promotion-title\">{product.preorder.label}</div>;\n }\n if (product.promotion_title) {\n return <div className=\"s-product-card-promotion-title\">{product.promotion_title}</div>;\n }\n if (withQuantity && product?.quantity) {\n const formattedQty = formatNumber(product.quantity);\n return (\n <div className=\"s-product-card-quantity\">\n {t('pages.products.remained', 'Remained')} {formattedQty}\n </div>\n );\n }\n if (withQuantity && product?.is_out_of_stock) {\n return (\n <div className=\"s-product-card-out-badge\">\n {t('pages.products.out_of_stock', 'Out of Stock')}\n </div>\n );\n }\n return null;\n };\n\n // Price display component\n const getProductPrice = () => {\n if (product.is_on_sale && product.sale_price) {\n return (\n <div className=\"s-product-card-sale-price\">\n <h4>{format(product.sale_price)}</h4>\n {product.regular_price && <span>{format(product.regular_price)}</span>}\n </div>\n );\n }\n if (product.starting_price) {\n return (\n <div className=\"s-product-card-starting-price\">\n <p>{t('pages.products.starting_price', 'Starting from')}</p>\n <h4>{format(product.starting_price)}</h4>\n </div>\n );\n }\n return <h4 className=\"s-product-card-price\">{format(product.price)}</h4>;\n };\n\n // Build card class names\n const cardClassName = [\n 's-product-card',\n 's-product-card-entry',\n isVertical ? 's-product-card-vertical' : '',\n isHorizontal ? 's-product-card-horizontal' : '',\n fitImageHeight && isVertical ? `s-product-card-fit-height` : '',\n isSpecial ? 's-product-card-special' : '',\n isFullImage ? 's-product-card-full-image' : '',\n isMinimal ? 's-product-card-minimal' : '',\n product?.donation ? 's-product-card-donation' : '',\n withShadow ? 's-product-card-shadow' : '',\n product?.is_out_of_stock ? 's-product-card-out-of-stock' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // Image fit class\n const isProductPlaceholder = isPlaceholder(product.image?.url);\n const imageFitClass = isProductPlaceholder ? 'contain' : fitImageHeight || 'cover';\n\n return (\n <div\n id={`product-card-${product.id}`}\n className={cardClassName}\n data-product-id={product.id}\n style={{\n animationDelay: `${index * 100}ms`,\n }}\n >\n <div className={isFullImage ? 's-product-card-image-full' : 's-product-card-image'}>\n <a href={product.url} aria-label={product.image?.alt || product.name}>\n <Image\n className={`s-product-card-image-${imageFitClass}`}\n src={product.image?.url}\n alt={product.image?.alt ?? product.name}\n width={300}\n height={300}\n sizes={\n sizes ?? (isFullImage || isMinimal ? PRODUCT_WIDE_IMAGE_SIZES : PRODUCT_IMAGE_SIZES)\n }\n srcSetWidths={PRODUCT_IMAGE_SRCSET_WIDTHS}\n aspectRatio=\"1/1\"\n priority={imagePriority}\n />\n {!isFullImage && !isMinimal && getProductBadge()}\n </a>\n {isFullImage && (\n <a href={product.url} aria-label={product.name} className=\"s-product-card-overlay\" />\n )}\n {!isHorizontal && !isFullImage && (\n <SallaButton\n shape=\"icon\"\n fill=\"outline\"\n color=\"light\"\n ariaLabel={t('pages.wishlist.toggle', 'Add or remove to wishlist')}\n className={`s-product-card-wishlist-btn animated ${productInWishlist ? 's-product-card-wishlist-added pulse-anime' : 'not-added un-favorited'}`}\n onClick={handleWishlistToggle}\n data-id={product.id}\n >\n <i className=\"sicon-heart\" />\n </SallaButton>\n )}\n </div>\n <div className=\"s-product-card-content\">\n {/* Special card: quantity pie */}\n {isSpecial && product?.quantity && (\n <div className=\"s-product-card-content-pie\">\n <span>\n <b>{formatNumber(product.quantity)}</b>\n {t('pages.products.remained', 'Remained')}\n </span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"-2 -1 36 34\"\n className=\"s-product-card-content-pie-svg\"\n >\n <circle cx=\"16\" cy=\"16\" r=\"15.9155\" className=\"s-product-card-content-pie-svg-base\" />\n <circle cx=\"16\" cy=\"16\" r=\"15.9155\" className=\"s-product-card-content-pie-svg-bar\" />\n </svg>\n </div>\n )}\n\n <div\n className={`s-product-card-content-main ${isSpecial ? 's-product-card-content-extra-padding' : ''}`}\n >\n <h3 className=\"s-product-card-content-title\">\n <a href={product.url}>{product.name}</a>\n </h3>\n {product.subtitle && !isMinimal && (\n <p className=\"s-product-card-content-subtitle opacity-80\">{product.subtitle}</p>\n )}\n </div>\n\n <div\n className={`s-product-card-content-sub ${isSpecial ? 's-product-card-content-extra-padding' : ''}`}\n >\n {!product?.donation?.can_donate && getProductPrice()}\n {product.rating?.stars && (\n <div className=\"s-product-card-rating\">\n <i className=\"sicon-star2 text-orange-300\" />\n <span>{product.rating.stars}</span>\n </div>\n )}\n </div>\n\n {!withoutAddButton && (\n <div className=\"s-product-card-content-footer gap-2\">\n <SallaAddProductButton\n ref={addButtonRef}\n fill=\"outline\"\n width=\"wide\"\n productId={product.id}\n productStatus={addButtonStatus}\n productType={product.type}\n hasPreOrder={product.has_preorder_campaign}\n />\n {(isHorizontal || isFullImage) && (\n <SallaButton\n shape=\"icon\"\n fill=\"outline\"\n color=\"light\"\n ariaLabel={t('pages.wishlist.toggle', 'Add or remove to wishlist')}\n className={`s-product-card-wishlist-btn animated ${productInWishlist ? 's-product-card-wishlist-added pulse-anime' : 'not-added un-favorited'}`}\n onClick={handleWishlistToggle}\n data-id={product.id}\n >\n <i className=\"sicon-heart\" />\n </SallaButton>\n )}\n </div>\n )}\n </div>\n </div>\n );\n});\n\nexport const ProductCard = memo(function ProductCard(props: ProductCardProps) {\n const Component = useMemo(() => {\n const hasOverride = registry.getOriginal<ProductCardProps>(PRODUCT_CARD_KEY) !== null;\n if (hasOverride) {\n return registry.resolve<ProductCardProps>(PRODUCT_CARD_KEY);\n }\n return null;\n }, []);\n\n if (Component) {\n return <Component {...props} />;\n }\n\n return <ProductCardContent {...props} />;\n});\n\nexport default ProductCard;\n","import { SallaSlider } from '@salla.sa/twilight-components-react/slider';\nimport { Suspense, useEffect, useMemo, useState } from 'react';\nimport { registry } from '../ComponentRegistry';\nimport { useTwilight } from '../../providers/TwilightProvider';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport type { Product, ProductImage } from '../../types';\nimport { Image } from '../common/Image';\nimport { ImageModal } from '../modal';\nimport { isNativeApp } from '../../native-app';\n\nconst PRODUCT_GALLERY_KEY = 'product:gallery';\n\nexport interface ProductGalleryProps {\n product: Product;\n}\n\ntype ImagePreview = { src: string; alt: string };\ntype GalleryMedia = { url: string; type: 'image' | 'video' | '3d-image' };\n\n/**\n * The engine's own `mobile::gallery.open` payload from before `salla.mobile.openGallery`: a video's\n * link and a 3D model's file go in `url`, with no ids. Sent when the SDK has no `openGallery`\n * (Twilight before 2.14.569) or declines inside the app, so those stores keep the gallery they had.\n */\nfunction legacyGalleryMedia(images: ProductImage[]): GalleryMedia[] {\n return images.flatMap<GalleryMedia>((image) => {\n if (image.three_d_image_url) return [{ url: image.three_d_image_url, type: '3d-image' }];\n if (image.video_url) return [{ url: image.video_url, type: 'video' }];\n return image.url ? [{ url: image.url, type: 'image' }] : [];\n });\n}\n\nfunction ProductGalleryContent({ product }: ProductGalleryProps) {\n const { t } = useTranslation();\n const { theme } = useTwilight();\n const sliderId = `details-slider-${product.id}`;\n const objectFit = theme.settings.slider_background_size ?? 'cover';\n\n // Clicking an image opens an in-app lightbox instead of navigating to the CDN URL.\n const [preview, setPreview] = useState<ImagePreview | null>(null);\n\n useEffect(() => {\n const raf = requestAnimationFrame(() => {\n const el = document.getElementById(sliderId);\n if (!el?.parentElement) return;\n const { parentElement, nextSibling } = el;\n parentElement.removeChild(el);\n parentElement.insertBefore(el, nextSibling);\n });\n return () => cancelAnimationFrame(raf);\n }, [sliderId]);\n\n // The product-details API only returns `image` (singular).\n // Fall back so the main image always renders even without the full gallery array.\n const images: ProductImage[] =\n product.images && product.images.length > 0\n ? product.images\n : product.image?.url\n ? [product.image]\n : [];\n\n const hasManyImages = images.length > 1;\n const openNativeGallery = (selected: ProductImage) => {\n if (!isNativeApp()) return false;\n if (window.salla?.mobile?.openGallery?.(images, selected)) return true;\n window.salla?.event.dispatch('mobile::gallery.open', { images: legacyGalleryMedia(images) });\n return true;\n };\n\n return (\n <div className=\"sidebar md:sticky top-24 w-full md:!w-2/4 rtl:ml-8 ltr:mr-8 pb-8 md:pb-16 overflow-hidden shrink-0\">\n <SallaSlider\n id={sliderId}\n className=\"details-slider rounded-md image-slider\"\n type=\"thumbs\"\n loop={false}\n autoHeight\n listenToThumbnailsOption\n showThumbsControls={false}\n sliderConfig={{ watchOverflow: true, autoHeight: true }}\n >\n {product.promotion_title && (\n <div className=\"promotion-title\">{product.promotion_title}</div>\n )}\n\n {product.calories && (\n <div className=\"absolute z-[2] top-4 rtl:left-4 ltr:right-4 bg-white shadow-sm flex flex-col justify-center items-center rounded-full w-20 h-20 md:w-24 md:h-24\">\n <span className=\"text-red-500 text-xl leading-none font-bold\">{product.calories}</span>\n <span className=\"text-xs text-gray-500\">\n {t('pages.products.calories', 'Calories')}\n </span>\n </div>\n )}\n\n <div slot=\"items\">\n {images.map((image, index) => (\n <ImageSlide\n key={image.id ?? image.three_d_image_url ?? image.video_url ?? image.url}\n image={image}\n product={product}\n index={index}\n objectFit={objectFit}\n onPreview={setPreview}\n onNativeOpen={openNativeGallery}\n />\n ))}\n </div>\n\n {hasManyImages && (\n <div slot=\"thumbs\">\n {images.map((image, index) => (\n <ThumbSlide\n key={image.id ?? image.three_d_image_url ?? image.video_url ?? image.url}\n image={image}\n index={index}\n />\n ))}\n </div>\n )}\n </SallaSlider>\n\n <Suspense fallback={null}>\n <ImageModal\n isOpen={!!preview}\n onClose={() => setPreview(null)}\n src={preview?.src ?? ''}\n alt={preview?.alt}\n />\n </Suspense>\n </div>\n );\n}\n\nexport function ProductGallery(props: ProductGalleryProps) {\n const Component = useMemo(() => {\n const resolved = registry.resolve<ProductGalleryProps>(PRODUCT_GALLERY_KEY);\n // A theme that seeds the key with this component (register + override) would\n // otherwise recurse into itself when it has not actually overridden anything.\n return resolved === ProductGallery ? null : resolved;\n }, []);\n\n if (Component) {\n return <Component {...props} />;\n }\n\n return <ProductGalleryContent {...props} />;\n}\n\nfunction ImageSlide({\n image,\n product,\n index,\n objectFit,\n onPreview,\n onNativeOpen,\n}: {\n image: ProductImage;\n product: Product;\n index: number;\n objectFit: 'cover' | 'contain';\n onPreview: (preview: ImagePreview) => void;\n onNativeOpen: (image: ProductImage) => boolean;\n}) {\n const [loaded, setLoaded] = useState(false);\n const isVideo = Boolean(image.video_url);\n\n if (image.three_d_image_url) {\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: model-viewer is an interactive web component.\n <model-viewer\n style={{ minHeight: '500px' }}\n className=\"swiper-slide model-entry w-full h-full\"\n loading=\"lazy\"\n camera-controls\n touch-action=\"pan-y\"\n auto-rotate\n poster={image.url || undefined}\n src={image.three_d_image_url}\n shadow-intensity=\"1\"\n alt={image.alt}\n onClick={() => onNativeOpen(image)}\n ></model-viewer>\n );\n }\n\n return (\n <a\n data-fslightbox={`product_${product.id}`}\n data-img-id={image.id}\n data-slid-index={index}\n {...(image.video_url ? { 'data-video-src': image.video_url } : {})}\n data-caption={image.alt}\n data-infinite=\"false\"\n data-type={image.video_url ? 'youtube' : 'image'}\n href={image.video_url || image.url}\n // FsLightbox isn't loaded in this React theme, so the bare href would leave the SPA.\n // Open images in an in-app lightbox; let videos open in a new tab.\n {...(isVideo ? { target: '_blank', rel: 'noopener noreferrer' } : {})}\n onClick={(event) => {\n if (onNativeOpen(image)) {\n event.preventDefault();\n return;\n }\n if (isVideo || !image.url) return;\n event.preventDefault();\n onPreview({ src: image.url, alt: image.alt || product.name });\n }}\n aria-label={product.name}\n className={`swiper-slide magnify-wrapper homeslider__slide ${image.video_url ? 'video-entry' : ''}`}\n >\n <div className={`w-full ${loaded ? '' : 'aspect-square bg-gray-100 animate-pulse'}`}>\n <Image\n id={String(image.id)}\n src={image.url}\n alt={image.alt || product.name}\n className={`h-full w-full object-${objectFit}`}\n aspectRatio=\"1/1\"\n priority={index === 0}\n noWrapper\n onLoad={() => setLoaded(true)}\n />\n </div>\n </a>\n );\n}\n\nfunction ThumbSlide({ image, index }: { image: ProductImage; index: number }) {\n return (\n <div\n className={`slide--one-fourth ${image.video_url ? 'video-entry' : ''} ${image.three_d_image_url ? 'model-entry' : ''}`}\n data-caption={image.alt}\n >\n <Image\n src={image.url}\n alt={image.alt || ''}\n className=\"object-cover w-full h-full bg-gray-100 rounded-md overflow-hidden\"\n title={image.alt}\n priority={index < 5}\n noWrapper\n />\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/product/lazy.ts","../src/components/product/ProductCard.tsx","../src/components/product/ProductGallery.tsx"],"names":["ProductCardContent","ProductCard","jsxs","jsx","useMemo"],"mappings":"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","file":"chunk-46EXP3AL.js","sourcesContent":["import { lazy } from 'react';\n\nexport const LazyProductDetails = lazy(() =>\n import('./ProductDetails').then((m) => ({ default: m.ProductDetails }))\n);\n\nexport const LazyAddToCartForm = lazy(() =>\n import('./AddToCartForm').then((m) => ({ default: m.AddToCartForm }))\n);\n","import { memo, useCallback, useMemo } from 'react';\nimport { SallaAddProductButton } from '@salla.sa/twilight-components-react/add-product-button';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { useHostAttributes } from '@salla.sa/twilight-theme-engine/hooks/useHostAttributes';\nimport { useMoney } from '../../hooks/useMoney';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useTwilight } from '../../providers/TwilightProvider';\nimport { useWishlist } from '../../hooks/useWishlist';\nimport { useAsset } from '../../hooks/useAsset';\nimport { useNumber } from '../../hooks/useNumber';\nimport { registry } from '../ComponentRegistry';\nimport { Image } from '../common';\nimport type { Product } from '../../types';\n\nconst PRODUCT_CARD_KEY = 'product:card';\n\nconst PRODUCT_IMAGE_SRCSET_WIDTHS = [150, 300, 450, 600] as const;\n/** Matches `.s-products-list-vertical-cards`: 2-col below 768px, 4-col above. */\nconst PRODUCT_IMAGE_SIZES = '(min-width: 768px) 25vw, 50vw';\n/** fullImage / minimal slots in FeaturedProductsStyle3 (`lg:grid-cols-2`). */\nconst PRODUCT_WIDE_IMAGE_SIZES = '(min-width: 1024px) 50vw, 100vw';\n\n/** Product card layout variants - mutually exclusive */\nexport type ProductCardLayout = 'vertical' | 'horizontal' | 'fullImage' | 'minimal' | 'special';\n\nexport interface ProductCardProps {\n product: Product;\n layout?: ProductCardLayout;\n className?: string;\n withShadow?: boolean;\n withQuantity?: boolean;\n withoutAddButton?: boolean;\n index?: number;\n imagePriority?: boolean;\n /** Overrides the layout-based image `sizes` hint. */\n sizes?: string;\n}\n\n/**\n * ProductCard - Displays a product in various layouts\n *\n * Layouts:\n * - vertical: Default card with image top, content bottom\n * - horizontal: Side-by-side image and content\n * - fullImage: Full bleed image with overlay content\n * - minimal: Compact version with reduced info\n * - special: Featured card with quantity pie chart\n *\n * Features:\n * - Native lazy loading for images\n * - Product badges (promotion, preorder, quantity, out of stock)\n * - Wishlist toggle button\n * - Price display (sale, starting, regular)\n * - Rating display\n * - Add to cart button via SallaAddProductButton (handles labels internally)\n */\nconst ProductCardContent = memo(function ProductCardContent({\n product,\n layout = 'vertical',\n className = '',\n withShadow = false,\n withQuantity = false,\n withoutAddButton = false,\n index = 0,\n imagePriority = false,\n sizes,\n}: ProductCardProps) {\n const { format } = useMoney();\n const { t } = useTranslation();\n const { store, theme } = useTwilight();\n const wishlist = useWishlist();\n const { isPlaceholder } = useAsset();\n const { format: formatNumber } = useNumber();\n\n // Out-of-stock cards offer \"notify me when available\" instead of a dead button, unless\n // the merchant switched `notify_when_available_in_card` off (Twig theme-raed parity).\n const notifyInCard = theme?.settings?.notify_when_available_in_card !== false;\n const addButtonStatus =\n notifyInCard &&\n product.is_out_of_stock &&\n product.type !== 'donating' &&\n product.type !== 'financial_support'\n ? 'out-and-notify'\n : product.status;\n\n const addButtonRef = useHostAttributes({ fill: 'outline', width: 'wide' });\n\n // Layout flags\n const isVertical = layout === 'vertical';\n const isHorizontal = layout === 'horizontal';\n const isFullImage = layout === 'fullImage';\n const isMinimal = layout === 'minimal';\n const isSpecial = layout === 'special';\n\n // Wishlist status\n const productInWishlist = wishlist.has(Number(product.id));\n const handleWishlistToggle = useCallback(() => {\n wishlist.toggle(Number(product.id));\n }, [wishlist, product.id]);\n\n // Get image fit type from store settings\n const fitImageHeight = store?.settings?.product?.fit_type;\n\n // Product badge component\n const getProductBadge = () => {\n if (product?.preorder?.label && typeof product.preorder.label === 'string') {\n return <div className=\"s-product-card-promotion-title\">{product.preorder.label}</div>;\n }\n if (product.promotion_title) {\n return <div className=\"s-product-card-promotion-title\">{product.promotion_title}</div>;\n }\n if (withQuantity && product?.quantity) {\n const formattedQty = formatNumber(product.quantity);\n return (\n <div className=\"s-product-card-quantity\">\n {t('pages.products.remained', 'Remained')} {formattedQty}\n </div>\n );\n }\n if (withQuantity && product?.is_out_of_stock) {\n return (\n <div className=\"s-product-card-out-badge\">\n {t('pages.products.out_of_stock', 'Out of Stock')}\n </div>\n );\n }\n return null;\n };\n\n // Price display component\n const getProductPrice = () => {\n if (product.is_on_sale && product.sale_price) {\n return (\n <div className=\"s-product-card-sale-price\">\n <h4>{format(product.sale_price)}</h4>\n {product.regular_price && <span>{format(product.regular_price)}</span>}\n </div>\n );\n }\n if (product.starting_price) {\n return (\n <div className=\"s-product-card-starting-price\">\n <p>{t('pages.products.starting_price', 'Starting from')}</p>\n <h4>{format(product.starting_price)}</h4>\n </div>\n );\n }\n return <h4 className=\"s-product-card-price\">{format(product.price)}</h4>;\n };\n\n // Build card class names\n const cardClassName = [\n 's-product-card',\n 's-product-card-entry',\n isVertical ? 's-product-card-vertical' : '',\n isHorizontal ? 's-product-card-horizontal' : '',\n fitImageHeight && isVertical ? `s-product-card-fit-height` : '',\n isSpecial ? 's-product-card-special' : '',\n isFullImage ? 's-product-card-full-image' : '',\n isMinimal ? 's-product-card-minimal' : '',\n product?.donation ? 's-product-card-donation' : '',\n withShadow ? 's-product-card-shadow' : '',\n product?.is_out_of_stock ? 's-product-card-out-of-stock' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // Image fit class\n const isProductPlaceholder = isPlaceholder(product.image?.url);\n const imageFitClass = isProductPlaceholder ? 'contain' : fitImageHeight || 'cover';\n\n return (\n <div\n id={`product-card-${product.id}`}\n className={cardClassName}\n data-product-id={product.id}\n style={{\n animationDelay: `${index * 100}ms`,\n }}\n >\n <div className={isFullImage ? 's-product-card-image-full' : 's-product-card-image'}>\n <a href={product.url} aria-label={product.image?.alt || product.name}>\n <Image\n className={`s-product-card-image-${imageFitClass}`}\n src={product.image?.url}\n alt={product.image?.alt ?? product.name}\n width={300}\n height={300}\n sizes={\n sizes ?? (isFullImage || isMinimal ? PRODUCT_WIDE_IMAGE_SIZES : PRODUCT_IMAGE_SIZES)\n }\n srcSetWidths={PRODUCT_IMAGE_SRCSET_WIDTHS}\n aspectRatio=\"1/1\"\n priority={imagePriority}\n />\n {!isFullImage && !isMinimal && getProductBadge()}\n </a>\n {isFullImage && (\n <a href={product.url} aria-label={product.name} className=\"s-product-card-overlay\" />\n )}\n {!isHorizontal && !isFullImage && (\n <SallaButton\n shape=\"icon\"\n fill=\"outline\"\n color=\"light\"\n ariaLabel={t('pages.wishlist.toggle', 'Add or remove to wishlist')}\n className={`s-product-card-wishlist-btn animated ${productInWishlist ? 's-product-card-wishlist-added pulse-anime' : 'not-added un-favorited'}`}\n onClick={handleWishlistToggle}\n data-id={product.id}\n >\n <i className=\"sicon-heart\" />\n </SallaButton>\n )}\n </div>\n <div className=\"s-product-card-content\">\n {/* Special card: quantity pie */}\n {isSpecial && product?.quantity && (\n <div className=\"s-product-card-content-pie\">\n <span>\n <b>{formatNumber(product.quantity)}</b>\n {t('pages.products.remained', 'Remained')}\n </span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"-2 -1 36 34\"\n className=\"s-product-card-content-pie-svg\"\n >\n <circle cx=\"16\" cy=\"16\" r=\"15.9155\" className=\"s-product-card-content-pie-svg-base\" />\n <circle cx=\"16\" cy=\"16\" r=\"15.9155\" className=\"s-product-card-content-pie-svg-bar\" />\n </svg>\n </div>\n )}\n\n <div\n className={`s-product-card-content-main ${isSpecial ? 's-product-card-content-extra-padding' : ''}`}\n >\n <h3 className=\"s-product-card-content-title\">\n <a href={product.url}>{product.name}</a>\n </h3>\n {product.subtitle && !isMinimal && (\n <p className=\"s-product-card-content-subtitle opacity-80\">{product.subtitle}</p>\n )}\n </div>\n\n <div\n className={`s-product-card-content-sub ${isSpecial ? 's-product-card-content-extra-padding' : ''}`}\n >\n {!product?.donation?.can_donate && getProductPrice()}\n {product.rating?.stars && (\n <div className=\"s-product-card-rating\">\n <i className=\"sicon-star2 text-orange-300\" />\n <span>{product.rating.stars}</span>\n </div>\n )}\n </div>\n\n {!withoutAddButton && (\n <div className=\"s-product-card-content-footer gap-2\">\n <SallaAddProductButton\n ref={addButtonRef}\n fill=\"outline\"\n width=\"wide\"\n productId={product.id}\n productStatus={addButtonStatus}\n productType={product.type}\n hasPreOrder={product.has_preorder_campaign}\n />\n {(isHorizontal || isFullImage) && (\n <SallaButton\n shape=\"icon\"\n fill=\"outline\"\n color=\"light\"\n ariaLabel={t('pages.wishlist.toggle', 'Add or remove to wishlist')}\n className={`s-product-card-wishlist-btn animated ${productInWishlist ? 's-product-card-wishlist-added pulse-anime' : 'not-added un-favorited'}`}\n onClick={handleWishlistToggle}\n data-id={product.id}\n >\n <i className=\"sicon-heart\" />\n </SallaButton>\n )}\n </div>\n )}\n </div>\n </div>\n );\n});\n\nexport const ProductCard = memo(function ProductCard(props: ProductCardProps) {\n const Component = useMemo(() => {\n const hasOverride = registry.getOriginal<ProductCardProps>(PRODUCT_CARD_KEY) !== null;\n if (hasOverride) {\n return registry.resolve<ProductCardProps>(PRODUCT_CARD_KEY);\n }\n return null;\n }, []);\n\n if (Component) {\n return <Component {...props} />;\n }\n\n return <ProductCardContent {...props} />;\n});\n\nexport default ProductCard;\n","import { SallaSlider } from '@salla.sa/twilight-components-react/slider';\nimport { Suspense, useEffect, useMemo, useState } from 'react';\nimport { registry } from '../ComponentRegistry';\nimport { useTwilight } from '../../providers/TwilightProvider';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport type { Product, ProductImage } from '../../types';\nimport { Image } from '../common/Image';\nimport { ImageModal } from '../modal';\nimport { isNativeApp } from '../../native-app';\n\nconst PRODUCT_GALLERY_KEY = 'product:gallery';\n\nexport interface ProductGalleryProps {\n product: Product;\n}\n\ntype ImagePreview = { src: string; alt: string };\ntype GalleryMedia = { url: string; type: 'image' | 'video' | '3d-image' };\n\n/**\n * The engine's own `mobile::gallery.open` payload from before `salla.mobile.openGallery`: a video's\n * link and a 3D model's file go in `url`, with no ids. Sent when the SDK has no `openGallery`\n * (Twilight before 2.14.569) or declines inside the app, so those stores keep the gallery they had.\n */\nfunction legacyGalleryMedia(images: ProductImage[]): GalleryMedia[] {\n return images.flatMap<GalleryMedia>((image) => {\n if (image.three_d_image_url) return [{ url: image.three_d_image_url, type: '3d-image' }];\n if (image.video_url) return [{ url: image.video_url, type: 'video' }];\n return image.url ? [{ url: image.url, type: 'image' }] : [];\n });\n}\n\nfunction ProductGalleryContent({ product }: ProductGalleryProps) {\n const { t } = useTranslation();\n const { theme } = useTwilight();\n const sliderId = `details-slider-${product.id}`;\n const objectFit = theme.settings.slider_background_size ?? 'cover';\n\n // Clicking an image opens an in-app lightbox instead of navigating to the CDN URL.\n const [preview, setPreview] = useState<ImagePreview | null>(null);\n\n useEffect(() => {\n const raf = requestAnimationFrame(() => {\n const el = document.getElementById(sliderId);\n if (!el?.parentElement) return;\n const { parentElement, nextSibling } = el;\n parentElement.removeChild(el);\n parentElement.insertBefore(el, nextSibling);\n });\n return () => cancelAnimationFrame(raf);\n }, [sliderId]);\n\n // The product-details API only returns `image` (singular).\n // Fall back so the main image always renders even without the full gallery array.\n const images: ProductImage[] =\n product.images && product.images.length > 0\n ? product.images\n : product.image?.url\n ? [product.image]\n : [];\n\n const hasManyImages = images.length > 1;\n const openNativeGallery = (selected: ProductImage) => {\n if (!isNativeApp()) return false;\n if (window.salla?.mobile?.openGallery?.(images, selected)) return true;\n window.salla?.event.dispatch('mobile::gallery.open', { images: legacyGalleryMedia(images) });\n return true;\n };\n\n return (\n <div className=\"sidebar md:sticky top-24 w-full md:!w-2/4 rtl:ml-8 ltr:mr-8 pb-8 md:pb-16 overflow-hidden shrink-0\">\n <SallaSlider\n id={sliderId}\n className=\"details-slider rounded-md image-slider\"\n type=\"thumbs\"\n loop={false}\n autoHeight\n listenToThumbnailsOption\n showThumbsControls={false}\n sliderConfig={{ watchOverflow: true, autoHeight: true }}\n >\n {product.promotion_title && (\n <div className=\"promotion-title\">{product.promotion_title}</div>\n )}\n\n {product.calories && (\n <div className=\"absolute z-[2] top-4 rtl:left-4 ltr:right-4 bg-white shadow-sm flex flex-col justify-center items-center rounded-full w-20 h-20 md:w-24 md:h-24\">\n <span className=\"text-red-500 text-xl leading-none font-bold\">{product.calories}</span>\n <span className=\"text-xs text-gray-500\">\n {t('pages.products.calories', 'Calories')}\n </span>\n </div>\n )}\n\n <div slot=\"items\">\n {images.map((image, index) => (\n <ImageSlide\n key={image.id ?? image.three_d_image_url ?? image.video_url ?? image.url}\n image={image}\n product={product}\n index={index}\n objectFit={objectFit}\n onPreview={setPreview}\n onNativeOpen={openNativeGallery}\n />\n ))}\n </div>\n\n {hasManyImages && (\n <div slot=\"thumbs\">\n {images.map((image, index) => (\n <ThumbSlide\n key={image.id ?? image.three_d_image_url ?? image.video_url ?? image.url}\n image={image}\n index={index}\n />\n ))}\n </div>\n )}\n </SallaSlider>\n\n <Suspense fallback={null}>\n <ImageModal\n isOpen={!!preview}\n onClose={() => setPreview(null)}\n src={preview?.src ?? ''}\n alt={preview?.alt}\n />\n </Suspense>\n </div>\n );\n}\n\nexport function ProductGallery(props: ProductGalleryProps) {\n const Component = useMemo(() => {\n const resolved = registry.resolve<ProductGalleryProps>(PRODUCT_GALLERY_KEY);\n // A theme that seeds the key with this component (register + override) would\n // otherwise recurse into itself when it has not actually overridden anything.\n return resolved === ProductGallery ? null : resolved;\n }, []);\n\n if (Component) {\n return <Component {...props} />;\n }\n\n return <ProductGalleryContent {...props} />;\n}\n\nfunction ImageSlide({\n image,\n product,\n index,\n objectFit,\n onPreview,\n onNativeOpen,\n}: {\n image: ProductImage;\n product: Product;\n index: number;\n objectFit: 'cover' | 'contain';\n onPreview: (preview: ImagePreview) => void;\n onNativeOpen: (image: ProductImage) => boolean;\n}) {\n const [loaded, setLoaded] = useState(false);\n const isVideo = Boolean(image.video_url);\n\n if (image.three_d_image_url) {\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: model-viewer is an interactive web component.\n <model-viewer\n style={{ minHeight: '500px' }}\n className=\"swiper-slide model-entry w-full h-full\"\n loading=\"lazy\"\n camera-controls\n touch-action=\"pan-y\"\n auto-rotate\n poster={image.url || undefined}\n src={image.three_d_image_url}\n shadow-intensity=\"1\"\n alt={image.alt}\n onClick={() => onNativeOpen(image)}\n ></model-viewer>\n );\n }\n\n return (\n <a\n data-fslightbox={`product_${product.id}`}\n data-img-id={image.id}\n data-slid-index={index}\n {...(image.video_url ? { 'data-video-src': image.video_url } : {})}\n data-caption={image.alt}\n data-infinite=\"false\"\n data-type={image.video_url ? 'youtube' : 'image'}\n href={image.video_url || image.url}\n // FsLightbox isn't loaded in this React theme, so the bare href would leave the SPA.\n // Open images in an in-app lightbox; let videos open in a new tab.\n {...(isVideo ? { target: '_blank', rel: 'noopener noreferrer' } : {})}\n onClick={(event) => {\n if (onNativeOpen(image)) {\n event.preventDefault();\n return;\n }\n if (isVideo || !image.url) return;\n event.preventDefault();\n onPreview({ src: image.url, alt: image.alt || product.name });\n }}\n aria-label={product.name}\n className={`swiper-slide magnify-wrapper homeslider__slide ${image.video_url ? 'video-entry' : ''}`}\n >\n <div className={`w-full ${loaded ? '' : 'aspect-square bg-gray-100 animate-pulse'}`}>\n <Image\n id={String(image.id)}\n src={image.url}\n alt={image.alt || product.name}\n className={`h-full w-full object-${objectFit}`}\n aspectRatio=\"1/1\"\n priority={index === 0}\n noWrapper\n onLoad={() => setLoaded(true)}\n />\n </div>\n </a>\n );\n}\n\nfunction ThumbSlide({ image, index }: { image: ProductImage; index: number }) {\n return (\n <div\n className={`slide--one-fourth ${image.video_url ? 'video-entry' : ''} ${image.three_d_image_url ? 'model-entry' : ''}`}\n data-caption={image.alt}\n >\n <Image\n src={image.url}\n alt={image.alt || ''}\n className=\"object-cover w-full h-full bg-gray-100 rounded-md overflow-hidden\"\n title={image.alt}\n priority={index < 5}\n noWrapper\n />\n </div>\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isNativeApp } from './chunk-
|
|
1
|
+
import { isNativeApp } from './chunk-VPGOT3JO.js';
|
|
2
2
|
import { useTwilight } from './chunk-DF6FBKDN.js';
|
|
3
3
|
import { useRef, useState, useEffect } from 'react';
|
|
4
4
|
import { toast, Toaster as Toaster$1 } from 'sonner';
|
|
@@ -137,5 +137,5 @@ function Toaster({
|
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
export { Toaster };
|
|
140
|
-
//# sourceMappingURL=chunk-
|
|
141
|
-
//# sourceMappingURL=chunk-
|
|
140
|
+
//# sourceMappingURL=chunk-46JZXQRS.js.map
|
|
141
|
+
//# sourceMappingURL=chunk-46JZXQRS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/toast/Toaster.tsx"],"names":["SonnerToaster"],"mappings":"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","file":"chunk-BH7YNCYB.js","sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { Toaster as SonnerToaster, toast } from 'sonner';\nimport { useTwilight } from '../../providers/twilight-context';\nimport { isNativeApp } from '../../native-app';\nimport type { ToastPosition } from './types';\n\nconst toastClassNames = {\n toast: 'group bg-white border-2 rounded-xl shadow-2xl p-4 font-primary',\n title: 'text-base font-bold',\n description: 'text-sm mt-1 text-gray-600',\n actionButton: 'bg-primary text-white px-3 py-1 rounded',\n cancelButton: 'bg-gray-100 px-3 py-1 rounded',\n success: 'border-green-500 [&_svg]:text-green-500 [&_aside]:text-green-700',\n error: 'border-red-500 [&_svg]:text-red-500 [&_aside]:text-red-700',\n warning: 'border-yellow-500 [&_svg]:text-yellow-500 [&_aside]:text-yellow-700',\n info: 'border-blue-500 [&_svg]:text-blue-500 [&_aside]:text-blue-700',\n loading: 'border-gray-400',\n};\n\ntype RawMessage = string | { title?: string; text?: string; icon?: string };\ntype ToastVariant = 'success' | 'error' | 'warning' | 'info';\n\nconst MOBILE_BREAKPOINT = 768;\nconst NATIVE_ALERT_EVENT = 'ui::alert';\n\nfunction dispatchNativeAlert(type: ToastVariant, message: string, title?: string) {\n const salla = window.salla;\n if (!isNativeApp() || !salla?.event?.dispatch) return false;\n\n salla.event.dispatch(NATIVE_ALERT_EVENT, {\n type,\n message,\n ...(title ? { title } : {}),\n });\n return true;\n}\n\nexport function Toaster({\n mobilePosition = 'bottom-center',\n addToCartToast = true,\n}: {\n mobilePosition?: ToastPosition;\n /** Show the default add-to-cart toast. Themes whose cart badge is the feedback can turn it off. */\n addToCartToast?: boolean;\n}) {\n const { theme } = useTwilight();\n const themeRef = useRef(theme);\n themeRef.current = theme;\n const flashShownRef = useRef(false);\n\n const isRtl = theme.is_rtl;\n const desktopPosition: ToastPosition = isRtl ? 'top-left' : 'top-right';\n\n const [position, setPosition] = useState<ToastPosition>(() => {\n if (typeof window === 'undefined') return desktopPosition;\n return window.innerWidth < MOBILE_BREAKPOINT ? mobilePosition : desktopPosition;\n });\n\n useEffect(() => {\n const handleResize = () => {\n setPosition(window.innerWidth < MOBILE_BREAKPOINT ? mobilePosition : desktopPosition);\n };\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [desktopPosition, mobilePosition]);\n\n useEffect(() => {\n const salla = window.salla;\n if (!salla) return;\n let active = true;\n\n const handleNotify = (message: RawMessage, type: string, data?: unknown) => {\n const eventData = data as { data?: { googleTags?: { event?: string } } } | undefined;\n const shouldSuppressAddToCartToast =\n (!addToCartToast || themeRef.current.settings?.enable_add_product_toast) &&\n eventData?.data?.googleTags?.event === 'addToCart';\n let title: string;\n let toastType: ToastVariant;\n\n if (typeof message === 'object' && message !== null) {\n title = message.title || message.text || '';\n toastType = (message.icon || type || 'info') as ToastVariant;\n } else {\n title = message;\n toastType = (type || 'info') as ToastVariant;\n }\n\n // Suppress the default addToCart toast when the theme opted out (addToCartToast=false)\n // or renders its own rich toast (enable_add_product_toast) so they don't double up.\n if (shouldSuppressAddToCartToast) {\n return;\n }\n\n if (dispatchNativeAlert(toastType, title)) {\n return;\n }\n\n if (toastType === 'success') {\n toast.success(title, { duration: 3000 });\n } else if (toastType === 'error') {\n toast.error(title, { duration: 3000 });\n } else if (toastType === 'warning') {\n toast.warning(title, { duration: 3000 });\n } else {\n toast.info(title, { duration: 3000 });\n }\n };\n\n // Before the SDK loads `salla` is the head stub, and the SDK's default notifier is alert().\n void (async () => {\n try {\n await salla.onReady?.();\n } catch {\n // onReady() may fail during partial initialization; the toast still beats alert().\n }\n if (active) salla.notify?.setNotifier?.(handleNotify);\n })();\n return () => {\n active = false;\n salla.notify?.setNotifier?.(() => {});\n };\n }, [addToCartToast]);\n\n useEffect(() => {\n if (flashShownRef.current || typeof window === 'undefined') return;\n\n const params = new URLSearchParams(window.location.search);\n const successMsg = params.get('success');\n const dangerMsg = params.get('danger');\n\n if (!successMsg && !dangerMsg) return;\n\n flashShownRef.current = true;\n\n const message = successMsg || dangerMsg || '';\n const toastType = dangerMsg ? 'error' : 'success';\n\n const url = new URL(window.location.href);\n url.searchParams.delete('success');\n url.searchParams.delete('danger');\n window.history.replaceState({}, '', url.toString());\n\n const timer = setTimeout(() => {\n if (dispatchNativeAlert(toastType, message)) return;\n\n if (toastType === 'success') {\n toast.success(message, { duration: 3000 });\n } else {\n toast.error(message, { duration: 3000 });\n }\n }, 100);\n\n return () => clearTimeout(timer);\n }, []);\n\n return (\n <SonnerToaster\n position={position}\n // Keep sonner's default gaps (24px desktop / 16px mobile) but clear the\n // native status bar inset (--app-safe-area-top, set by useSafeAreaInset)\n // so top-positioned toasts aren't covered in the app webview.\n offset={{ top: 'calc(var(--app-safe-area-top, 0px) + 24px)' }}\n mobileOffset={{ top: 'calc(var(--app-safe-area-top, 0px) + 16px)' }}\n toastOptions={{\n classNames: toastClassNames,\n style: {\n fontFamily: 'var(--font-main, inherit)',\n },\n }}\n style={{\n fontFamily: 'var(--font-main, inherit)',\n }}\n />\n );\n}\n\nexport type { ToasterProps } from 'sonner';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/toast/Toaster.tsx"],"names":["SonnerToaster"],"mappings":"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","file":"chunk-46JZXQRS.js","sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { Toaster as SonnerToaster, toast } from 'sonner';\nimport { useTwilight } from '../../providers/twilight-context';\nimport { isNativeApp } from '../../native-app';\nimport type { ToastPosition } from './types';\n\nconst toastClassNames = {\n toast: 'group bg-white border-2 rounded-xl shadow-2xl p-4 font-primary',\n title: 'text-base font-bold',\n description: 'text-sm mt-1 text-gray-600',\n actionButton: 'bg-primary text-white px-3 py-1 rounded',\n cancelButton: 'bg-gray-100 px-3 py-1 rounded',\n success: 'border-green-500 [&_svg]:text-green-500 [&_aside]:text-green-700',\n error: 'border-red-500 [&_svg]:text-red-500 [&_aside]:text-red-700',\n warning: 'border-yellow-500 [&_svg]:text-yellow-500 [&_aside]:text-yellow-700',\n info: 'border-blue-500 [&_svg]:text-blue-500 [&_aside]:text-blue-700',\n loading: 'border-gray-400',\n};\n\ntype RawMessage = string | { title?: string; text?: string; icon?: string };\ntype ToastVariant = 'success' | 'error' | 'warning' | 'info';\n\nconst MOBILE_BREAKPOINT = 768;\nconst NATIVE_ALERT_EVENT = 'ui::alert';\n\nfunction dispatchNativeAlert(type: ToastVariant, message: string, title?: string) {\n const salla = window.salla;\n if (!isNativeApp() || !salla?.event?.dispatch) return false;\n\n salla.event.dispatch(NATIVE_ALERT_EVENT, {\n type,\n message,\n ...(title ? { title } : {}),\n });\n return true;\n}\n\nexport function Toaster({\n mobilePosition = 'bottom-center',\n addToCartToast = true,\n}: {\n mobilePosition?: ToastPosition;\n /** Show the default add-to-cart toast. Themes whose cart badge is the feedback can turn it off. */\n addToCartToast?: boolean;\n}) {\n const { theme } = useTwilight();\n const themeRef = useRef(theme);\n themeRef.current = theme;\n const flashShownRef = useRef(false);\n\n const isRtl = theme.is_rtl;\n const desktopPosition: ToastPosition = isRtl ? 'top-left' : 'top-right';\n\n const [position, setPosition] = useState<ToastPosition>(() => {\n if (typeof window === 'undefined') return desktopPosition;\n return window.innerWidth < MOBILE_BREAKPOINT ? mobilePosition : desktopPosition;\n });\n\n useEffect(() => {\n const handleResize = () => {\n setPosition(window.innerWidth < MOBILE_BREAKPOINT ? mobilePosition : desktopPosition);\n };\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [desktopPosition, mobilePosition]);\n\n useEffect(() => {\n const salla = window.salla;\n if (!salla) return;\n let active = true;\n\n const handleNotify = (message: RawMessage, type: string, data?: unknown) => {\n const eventData = data as { data?: { googleTags?: { event?: string } } } | undefined;\n const shouldSuppressAddToCartToast =\n (!addToCartToast || themeRef.current.settings?.enable_add_product_toast) &&\n eventData?.data?.googleTags?.event === 'addToCart';\n let title: string;\n let toastType: ToastVariant;\n\n if (typeof message === 'object' && message !== null) {\n title = message.title || message.text || '';\n toastType = (message.icon || type || 'info') as ToastVariant;\n } else {\n title = message;\n toastType = (type || 'info') as ToastVariant;\n }\n\n // Suppress the default addToCart toast when the theme opted out (addToCartToast=false)\n // or renders its own rich toast (enable_add_product_toast) so they don't double up.\n if (shouldSuppressAddToCartToast) {\n return;\n }\n\n if (dispatchNativeAlert(toastType, title)) {\n return;\n }\n\n if (toastType === 'success') {\n toast.success(title, { duration: 3000 });\n } else if (toastType === 'error') {\n toast.error(title, { duration: 3000 });\n } else if (toastType === 'warning') {\n toast.warning(title, { duration: 3000 });\n } else {\n toast.info(title, { duration: 3000 });\n }\n };\n\n // Before the SDK loads `salla` is the head stub, and the SDK's default notifier is alert().\n void (async () => {\n try {\n await salla.onReady?.();\n } catch {\n // onReady() may fail during partial initialization; the toast still beats alert().\n }\n if (active) salla.notify?.setNotifier?.(handleNotify);\n })();\n return () => {\n active = false;\n salla.notify?.setNotifier?.(() => {});\n };\n }, [addToCartToast]);\n\n useEffect(() => {\n if (flashShownRef.current || typeof window === 'undefined') return;\n\n const params = new URLSearchParams(window.location.search);\n const successMsg = params.get('success');\n const dangerMsg = params.get('danger');\n\n if (!successMsg && !dangerMsg) return;\n\n flashShownRef.current = true;\n\n const message = successMsg || dangerMsg || '';\n const toastType = dangerMsg ? 'error' : 'success';\n\n const url = new URL(window.location.href);\n url.searchParams.delete('success');\n url.searchParams.delete('danger');\n window.history.replaceState({}, '', url.toString());\n\n const timer = setTimeout(() => {\n if (dispatchNativeAlert(toastType, message)) return;\n\n if (toastType === 'success') {\n toast.success(message, { duration: 3000 });\n } else {\n toast.error(message, { duration: 3000 });\n }\n }, 100);\n\n return () => clearTimeout(timer);\n }, []);\n\n return (\n <SonnerToaster\n position={position}\n // Keep sonner's default gaps (24px desktop / 16px mobile) but clear the\n // native status bar inset (--app-safe-area-top, set by useSafeAreaInset)\n // so top-positioned toasts aren't covered in the app webview.\n offset={{ top: 'calc(var(--app-safe-area-top, 0px) + 24px)' }}\n mobileOffset={{ top: 'calc(var(--app-safe-area-top, 0px) + 16px)' }}\n toastOptions={{\n classNames: toastClassNames,\n style: {\n fontFamily: 'var(--font-main, inherit)',\n },\n }}\n style={{\n fontFamily: 'var(--font-main, inherit)',\n }}\n />\n );\n}\n\nexport type { ToasterProps } from 'sonner';\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ensureTwilightContextFromMatches } from './chunk-
|
|
1
|
+
import { ensureTwilightContextFromMatches } from './chunk-P4XV656A.js';
|
|
2
2
|
import { storePageUrl } from './chunk-4SZZPXM2.js';
|
|
3
|
-
import { getTwilightContext, SettingsError } from './chunk-
|
|
3
|
+
import { getTwilightContext, SettingsError } from './chunk-H3PJJKAQ.js';
|
|
4
4
|
|
|
5
5
|
// src/tanstack/head.ts
|
|
6
6
|
function normalizeOgImages(images) {
|
|
@@ -125,5 +125,5 @@ function withHead(route, extend) {
|
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
export { tanstackHeadAdapter, withHead };
|
|
128
|
-
//# sourceMappingURL=chunk-
|
|
129
|
-
//# sourceMappingURL=chunk-
|
|
128
|
+
//# sourceMappingURL=chunk-6EBVVCNI.js.map
|
|
129
|
+
//# sourceMappingURL=chunk-6EBVVCNI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tanstack/head.ts"],"names":[],"mappings":"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","file":"chunk-N2A72R2I.js","sourcesContent":["import type { HeadDescriptor, OpenGraphImage } from '../utils/head';\nimport type { TwilightContext } from '../twilight/context';\nimport { getTwilightContext } from '../twilight/context';\nimport type { TwilightContextMatch } from '../twilight/ensure-context';\nimport { ensureTwilightContextFromMatches } from '../twilight/ensure-context';\nimport { SettingsError } from '../utils/errors';\nimport { storePageUrl } from '../utils/baseHead';\n\ntype OgImagesInput = string | OpenGraphImage | Array<string | OpenGraphImage> | undefined;\n\nfunction normalizeOgImages(images: OgImagesInput): OpenGraphImage[] {\n if (!images) return [];\n const arr = Array.isArray(images) ? images : [images];\n return arr.map((img) => (typeof img === 'string' ? { url: img } : img));\n}\n\n/** Merchant descriptions are rich-text HTML; description meta tags take plain text. */\nfunction plainText(html: string): string {\n return html\n .replace(/<br\\s*\\/?>|<\\/(?:p|div|li|h[1-6])>/gi, ' ')\n .replace(/<[^>]*>/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nexport function tanstackHeadAdapter(descriptor: HeadDescriptor) {\n const meta: Array<Record<string, unknown>> = [];\n const links: Array<Record<string, unknown>> = [];\n const scripts: Array<Record<string, unknown>> = [];\n const styles: Record<string, unknown>[] = [];\n\n if (descriptor.title) meta.push({ title: descriptor.title });\n if (descriptor.description)\n meta.push({ name: 'description', content: plainText(descriptor.description) });\n\n if (descriptor.keywords) {\n const kw = Array.isArray(descriptor.keywords)\n ? descriptor.keywords.join(', ')\n : descriptor.keywords;\n meta.push({ name: 'keywords', content: kw });\n }\n\n if (descriptor.robots) meta.push({ name: 'robots', content: descriptor.robots });\n\n // Open Graph\n const og = descriptor.openGraph;\n if (og) {\n if (og.siteName) meta.push({ property: 'og:site_name', content: og.siteName });\n if (og.type) meta.push({ property: 'og:type', content: og.type });\n if (og.title) meta.push({ property: 'og:title', content: og.title });\n if (og.description)\n meta.push({ property: 'og:description', content: plainText(og.description) });\n if (og.url) meta.push({ property: 'og:url', content: og.url });\n if (og.locale) meta.push({ property: 'og:locale', content: og.locale });\n for (const alt of og.alternateLocale ?? []) {\n meta.push({ property: 'og:locale:alternate', content: alt });\n }\n for (const img of normalizeOgImages(og.images)) {\n meta.push({ property: 'og:image', content: img.url });\n if (img.width != null) meta.push({ property: 'og:image:width', content: String(img.width) });\n if (img.height != null)\n meta.push({ property: 'og:image:height', content: String(img.height) });\n if (img.alt) meta.push({ property: 'og:image:alt', content: img.alt });\n }\n if (og.publishedTime)\n meta.push({ property: 'article:published_time', content: og.publishedTime });\n if (og.modifiedTime) meta.push({ property: 'article:modified_time', content: og.modifiedTime });\n }\n\n // Twitter Card\n const tw = descriptor.twitter;\n if (tw) {\n if (tw.card) meta.push({ name: 'twitter:card', content: tw.card });\n if (tw.title) meta.push({ name: 'twitter:title', content: tw.title });\n if (tw.description)\n meta.push({ name: 'twitter:description', content: plainText(tw.description) });\n if (tw.site) meta.push({ name: 'twitter:site', content: tw.site });\n if (tw.creator) meta.push({ name: 'twitter:creator', content: tw.creator });\n if (tw.url) meta.push({ name: 'twitter:url', content: tw.url });\n const twImages = tw.images ? (Array.isArray(tw.images) ? tw.images : [tw.images]) : [];\n for (const img of twImages) {\n meta.push({ name: 'twitter:image', content: img });\n }\n }\n\n // Canonical\n if (descriptor.canonical) links.push({ rel: 'canonical', href: descriptor.canonical });\n\n // hreflang alternates (React requires camelCase: hrefLang)\n for (const alt of descriptor.alternateLanguages ?? []) {\n links.push({ rel: 'alternate', hrefLang: alt.hreflang, href: alt.href });\n }\n\n // JSON-LD\n if (descriptor.jsonLd) {\n scripts.push({ type: 'application/ld+json', children: JSON.stringify(descriptor.jsonLd) });\n }\n\n // Escape hatches\n for (const m of descriptor.meta ?? []) {\n const { httpEquiv, ...rest } = m as typeof m & { httpEquiv?: string };\n meta.push(httpEquiv ? { httpEquiv, ...rest } : rest);\n }\n for (const l of descriptor.links ?? []) links.push(l);\n for (const s of descriptor.styles ?? []) styles.push(s as unknown as Record<string, unknown>);\n\n // Import maps must be emitted before module scripts that rely on bare specifiers.\n for (const im of descriptor.importMap ?? []) {\n scripts.push({ type: 'importmap', children: JSON.stringify(im) });\n }\n for (const s of descriptor.scripts ?? []) scripts.push(s);\n\n return { meta, links, styles, scripts };\n}\n\n// ============================================================================\n// withHead - Simplified head callback wrapper for TanStack Router\n// ============================================================================\n\n/** Twig's page title format: \"<page title> - <store meta title or store name>\". */\nfunction appendStoreTitle(\n descriptor: HeadDescriptor,\n settings: TwilightContext['settings']\n): HeadDescriptor {\n const store = settings?.store;\n const storeTitle = store?.meta?.title || store?.name;\n const pageTitle = descriptor.title;\n if (!pageTitle || !storeTitle || descriptor.appendStoreTitle === false) return descriptor;\n if (pageTitle === storeTitle) return descriptor;\n\n const title = `${pageTitle} - ${storeTitle}`;\n // Share titles follow the page title too, unless the route set its own.\n const shareTitle = (current?: string) => (!current || current === pageTitle ? title : current);\n return {\n ...descriptor,\n title,\n openGraph: { ...descriptor.openGraph, title: shareTitle(descriptor.openGraph?.title) },\n twitter: { ...descriptor.twitter, title: shareTitle(descriptor.twitter?.title) },\n };\n}\n\n/**\n * Twig's page URL for a page that names none: its own path on the store's domain, without the\n * query, as the canonical and the og:url and twitter:url share cards read.\n */\nfunction withPageUrl(descriptor: HeadDescriptor, ctx: TwilightContext): HeadDescriptor {\n const pathname = ctx.location?.pathname;\n const canonical =\n descriptor.canonical ?? (pathname ? storePageUrl(ctx.settings, pathname) : undefined);\n if (!canonical) return descriptor;\n return {\n ...descriptor,\n canonical,\n openGraph: { ...descriptor.openGraph, url: descriptor.openGraph?.url ?? canonical },\n twitter: { ...descriptor.twitter, url: descriptor.twitter?.url ?? canonical },\n };\n}\n\n/**\n * Minimal shape we need from TanStack Router's AssetFnContextOptions.\n * `loaderData` feeds the route's own head function; `matches` is the recovery\n * source for store settings when the twilight module store is not populated yet\n * (see `ensureTwilightContextFromMatches`).\n */\ntype HeadContext = {\n loaderData?: unknown;\n matches?: readonly TwilightContextMatch[];\n};\n\n/**\n * Wraps a route module's head function for TanStack Router.\n *\n * @example\n * ```typescript\n * head: withHead(Offers)\n * head: withHead(Product, (result) => ({ ...result, robots: 'noindex, follow' }))\n * ```\n */\nexport function withHead<T>(\n route: { head: (ctx: TwilightContext, data: T) => HeadDescriptor },\n extend?: (result: HeadDescriptor, _ctx: TwilightContext, data: T) => HeadDescriptor\n): (_ctx: Record<string, unknown>) => Record<string, unknown> {\n return (ctx: HeadContext) => {\n const loaderData = ctx.loaderData;\n\n if (!loaderData) return {};\n\n // TanStack re-runs every matched route's head() during client hydration,\n // where the twilight module store can still be empty. Recover it from the\n // match context TanStack has already resolved before giving up.\n ensureTwilightContextFromMatches(ctx.matches);\n\n try {\n const context = getTwilightContext();\n const result = route.head(context, loaderData as T);\n const extended = extend ? extend(result, context, loaderData as T) : result;\n const finalResult = withPageUrl(appendStoreTitle(extended, context.settings), context);\n\n return tanstackHeadAdapter(finalResult);\n } catch (error) {\n // A head function must never throw: TanStack surfaces the throw as a\n // hydration error, React then discards the server-rendered tree and the\n // storefront renders blank. Dropping this route's head tags degrades\n // gracefully — the server-rendered ones stay in the document.\n if (error instanceof SettingsError) return {};\n throw error;\n }\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/tanstack/head.ts"],"names":[],"mappings":"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","file":"chunk-6EBVVCNI.js","sourcesContent":["import type { HeadDescriptor, OpenGraphImage } from '../utils/head';\nimport type { TwilightContext } from '../twilight/context';\nimport { getTwilightContext } from '../twilight/context';\nimport type { TwilightContextMatch } from '../twilight/ensure-context';\nimport { ensureTwilightContextFromMatches } from '../twilight/ensure-context';\nimport { SettingsError } from '../utils/errors';\nimport { storePageUrl } from '../utils/baseHead';\n\ntype OgImagesInput = string | OpenGraphImage | Array<string | OpenGraphImage> | undefined;\n\nfunction normalizeOgImages(images: OgImagesInput): OpenGraphImage[] {\n if (!images) return [];\n const arr = Array.isArray(images) ? images : [images];\n return arr.map((img) => (typeof img === 'string' ? { url: img } : img));\n}\n\n/** Merchant descriptions are rich-text HTML; description meta tags take plain text. */\nfunction plainText(html: string): string {\n return html\n .replace(/<br\\s*\\/?>|<\\/(?:p|div|li|h[1-6])>/gi, ' ')\n .replace(/<[^>]*>/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nexport function tanstackHeadAdapter(descriptor: HeadDescriptor) {\n const meta: Array<Record<string, unknown>> = [];\n const links: Array<Record<string, unknown>> = [];\n const scripts: Array<Record<string, unknown>> = [];\n const styles: Record<string, unknown>[] = [];\n\n if (descriptor.title) meta.push({ title: descriptor.title });\n if (descriptor.description)\n meta.push({ name: 'description', content: plainText(descriptor.description) });\n\n if (descriptor.keywords) {\n const kw = Array.isArray(descriptor.keywords)\n ? descriptor.keywords.join(', ')\n : descriptor.keywords;\n meta.push({ name: 'keywords', content: kw });\n }\n\n if (descriptor.robots) meta.push({ name: 'robots', content: descriptor.robots });\n\n // Open Graph\n const og = descriptor.openGraph;\n if (og) {\n if (og.siteName) meta.push({ property: 'og:site_name', content: og.siteName });\n if (og.type) meta.push({ property: 'og:type', content: og.type });\n if (og.title) meta.push({ property: 'og:title', content: og.title });\n if (og.description)\n meta.push({ property: 'og:description', content: plainText(og.description) });\n if (og.url) meta.push({ property: 'og:url', content: og.url });\n if (og.locale) meta.push({ property: 'og:locale', content: og.locale });\n for (const alt of og.alternateLocale ?? []) {\n meta.push({ property: 'og:locale:alternate', content: alt });\n }\n for (const img of normalizeOgImages(og.images)) {\n meta.push({ property: 'og:image', content: img.url });\n if (img.width != null) meta.push({ property: 'og:image:width', content: String(img.width) });\n if (img.height != null)\n meta.push({ property: 'og:image:height', content: String(img.height) });\n if (img.alt) meta.push({ property: 'og:image:alt', content: img.alt });\n }\n if (og.publishedTime)\n meta.push({ property: 'article:published_time', content: og.publishedTime });\n if (og.modifiedTime) meta.push({ property: 'article:modified_time', content: og.modifiedTime });\n }\n\n // Twitter Card\n const tw = descriptor.twitter;\n if (tw) {\n if (tw.card) meta.push({ name: 'twitter:card', content: tw.card });\n if (tw.title) meta.push({ name: 'twitter:title', content: tw.title });\n if (tw.description)\n meta.push({ name: 'twitter:description', content: plainText(tw.description) });\n if (tw.site) meta.push({ name: 'twitter:site', content: tw.site });\n if (tw.creator) meta.push({ name: 'twitter:creator', content: tw.creator });\n if (tw.url) meta.push({ name: 'twitter:url', content: tw.url });\n const twImages = tw.images ? (Array.isArray(tw.images) ? tw.images : [tw.images]) : [];\n for (const img of twImages) {\n meta.push({ name: 'twitter:image', content: img });\n }\n }\n\n // Canonical\n if (descriptor.canonical) links.push({ rel: 'canonical', href: descriptor.canonical });\n\n // hreflang alternates (React requires camelCase: hrefLang)\n for (const alt of descriptor.alternateLanguages ?? []) {\n links.push({ rel: 'alternate', hrefLang: alt.hreflang, href: alt.href });\n }\n\n // JSON-LD\n if (descriptor.jsonLd) {\n scripts.push({ type: 'application/ld+json', children: JSON.stringify(descriptor.jsonLd) });\n }\n\n // Escape hatches\n for (const m of descriptor.meta ?? []) {\n const { httpEquiv, ...rest } = m as typeof m & { httpEquiv?: string };\n meta.push(httpEquiv ? { httpEquiv, ...rest } : rest);\n }\n for (const l of descriptor.links ?? []) links.push(l);\n for (const s of descriptor.styles ?? []) styles.push(s as unknown as Record<string, unknown>);\n\n // Import maps must be emitted before module scripts that rely on bare specifiers.\n for (const im of descriptor.importMap ?? []) {\n scripts.push({ type: 'importmap', children: JSON.stringify(im) });\n }\n for (const s of descriptor.scripts ?? []) scripts.push(s);\n\n return { meta, links, styles, scripts };\n}\n\n// ============================================================================\n// withHead - Simplified head callback wrapper for TanStack Router\n// ============================================================================\n\n/** Twig's page title format: \"<page title> - <store meta title or store name>\". */\nfunction appendStoreTitle(\n descriptor: HeadDescriptor,\n settings: TwilightContext['settings']\n): HeadDescriptor {\n const store = settings?.store;\n const storeTitle = store?.meta?.title || store?.name;\n const pageTitle = descriptor.title;\n if (!pageTitle || !storeTitle || descriptor.appendStoreTitle === false) return descriptor;\n if (pageTitle === storeTitle) return descriptor;\n\n const title = `${pageTitle} - ${storeTitle}`;\n // Share titles follow the page title too, unless the route set its own.\n const shareTitle = (current?: string) => (!current || current === pageTitle ? title : current);\n return {\n ...descriptor,\n title,\n openGraph: { ...descriptor.openGraph, title: shareTitle(descriptor.openGraph?.title) },\n twitter: { ...descriptor.twitter, title: shareTitle(descriptor.twitter?.title) },\n };\n}\n\n/**\n * Twig's page URL for a page that names none: its own path on the store's domain, without the\n * query, as the canonical and the og:url and twitter:url share cards read.\n */\nfunction withPageUrl(descriptor: HeadDescriptor, ctx: TwilightContext): HeadDescriptor {\n const pathname = ctx.location?.pathname;\n const canonical =\n descriptor.canonical ?? (pathname ? storePageUrl(ctx.settings, pathname) : undefined);\n if (!canonical) return descriptor;\n return {\n ...descriptor,\n canonical,\n openGraph: { ...descriptor.openGraph, url: descriptor.openGraph?.url ?? canonical },\n twitter: { ...descriptor.twitter, url: descriptor.twitter?.url ?? canonical },\n };\n}\n\n/**\n * Minimal shape we need from TanStack Router's AssetFnContextOptions.\n * `loaderData` feeds the route's own head function; `matches` is the recovery\n * source for store settings when the twilight module store is not populated yet\n * (see `ensureTwilightContextFromMatches`).\n */\ntype HeadContext = {\n loaderData?: unknown;\n matches?: readonly TwilightContextMatch[];\n};\n\n/**\n * Wraps a route module's head function for TanStack Router.\n *\n * @example\n * ```typescript\n * head: withHead(Offers)\n * head: withHead(Product, (result) => ({ ...result, robots: 'noindex, follow' }))\n * ```\n */\nexport function withHead<T>(\n route: { head: (ctx: TwilightContext, data: T) => HeadDescriptor },\n extend?: (result: HeadDescriptor, _ctx: TwilightContext, data: T) => HeadDescriptor\n): (_ctx: Record<string, unknown>) => Record<string, unknown> {\n return (ctx: HeadContext) => {\n const loaderData = ctx.loaderData;\n\n if (!loaderData) return {};\n\n // TanStack re-runs every matched route's head() during client hydration,\n // where the twilight module store can still be empty. Recover it from the\n // match context TanStack has already resolved before giving up.\n ensureTwilightContextFromMatches(ctx.matches);\n\n try {\n const context = getTwilightContext();\n const result = route.head(context, loaderData as T);\n const extended = extend ? extend(result, context, loaderData as T) : result;\n const finalResult = withPageUrl(appendStoreTitle(extended, context.settings), context);\n\n return tanstackHeadAdapter(finalResult);\n } catch (error) {\n // A head function must never throw: TanStack surfaces the throw as a\n // hydration error, React then discards the server-rendered tree and the\n // storefront renders blank. Dropping this route's head tags degrades\n // gracefully — the server-rendered ones stay in the document.\n if (error instanceof SettingsError) return {};\n throw error;\n }\n };\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { orThrow } from './chunk-
|
|
2
|
-
import { api } from './chunk-
|
|
1
|
+
import { orThrow } from './chunk-GT2L5IJ4.js';
|
|
2
|
+
import { api } from './chunk-ZPX4LBQZ.js';
|
|
3
3
|
import { queryOptions } from '@tanstack/react-query';
|
|
4
4
|
|
|
5
5
|
var blog = {
|
|
@@ -63,5 +63,5 @@ var blog = {
|
|
|
63
63
|
};
|
|
64
64
|
|
|
65
65
|
export { blog };
|
|
66
|
-
//# sourceMappingURL=chunk-
|
|
67
|
-
//# sourceMappingURL=chunk-
|
|
66
|
+
//# sourceMappingURL=chunk-6LRTCW27.js.map
|
|
67
|
+
//# sourceMappingURL=chunk-6LRTCW27.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/blog.ts"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/api/blog.ts"],"names":[],"mappings":"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","file":"chunk-6LRTCW27.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport type { Options as KyOptions } from 'ky';\nimport { api } from './client';\nimport type { Pagination } from './types';\nimport type {\n ArticleSummary,\n ArticleDetail,\n BlogAuthor,\n BlogCategory,\n BlogTag,\n BlogOverview,\n} from '../routes/blog/types';\nimport { orThrow } from '../providers/NavigationProvider';\n\nexport interface BlogArticlesListParams {\n category?: string;\n author?: string;\n tag?: string;\n page?: number;\n cursor?: string | null;\n signal?: AbortSignal;\n}\n\nexport interface BlogArticlesListResponse {\n data: ArticleSummary[];\n categories?: BlogCategory[];\n category: BlogCategory;\n author: BlogAuthor;\n tag: BlogTag;\n cursor: Pagination;\n}\n\nexport interface BlogGetResponse {\n data: {\n categories: BlogCategory[] | null;\n slides: ArticleSummary[] | null;\n articles: ArticleSummary[] | null;\n popular: ArticleSummary[] | null;\n };\n}\n\nexport const blog = {\n get: async (signal?: AbortSignal): Promise<BlogOverview> => {\n const options: Record<string, unknown> = {};\n if (signal) options.signal = signal;\n\n const response = await api.get('blog', options as KyOptions).json<BlogGetResponse>();\n\n return {\n categories: response.data.categories ?? [],\n slides: response.data.slides ?? [],\n articles: response.data.articles ?? [],\n popular: response.data.popular ?? [],\n };\n },\n\n articles: {\n list: async (params?: BlogArticlesListParams): Promise<BlogArticlesListResponse> => {\n const { category, author, tag, page, cursor, signal } = params ?? {};\n\n const searchParams = new URLSearchParams();\n if (page !== undefined) searchParams.set('page', String(page));\n if (cursor) searchParams.set('cursor', cursor);\n if (category) searchParams.set('category', category);\n if (author) searchParams.set('author', author);\n if (tag) searchParams.set('tag', tag);\n\n const options: Record<string, unknown> = {};\n if (signal) options.signal = signal;\n\n const response = await api\n .get(`blog/articles?${searchParams.toString()}`, options as KyOptions)\n .json<{\n data: ArticleSummary[] | null;\n categories?: BlogCategory[] | null;\n category: BlogCategory;\n author: BlogAuthor;\n tag: BlogTag;\n cursor: Pagination;\n }>();\n\n return {\n data: response.data ?? [],\n categories: response.categories ?? undefined,\n category: response.category,\n author: response.author,\n tag: response.tag,\n cursor: response.cursor,\n };\n },\n\n find: async (id: string, signal?: AbortSignal): Promise<ArticleDetail> => {\n const options: Record<string, unknown> = {};\n if (signal) options.signal = signal;\n\n const response = await api\n .get(`blog/articles/${id}`, options as KyOptions)\n .json<{ data: ArticleDetail | null }>();\n\n if (!response.data) {\n throw new Error(`Article ${id} not found`);\n }\n\n return response.data;\n },\n\n findOrThrow: (id: string, signal?: AbortSignal): Promise<ArticleDetail> =>\n orThrow(blog.articles.find(id, signal)),\n },\n\n queries: {\n overview: () =>\n queryOptions({\n queryKey: ['blog', 'overview'],\n queryFn: ({ signal }) => blog.get(signal),\n }),\n articles: (params?: Omit<BlogArticlesListParams, 'signal'>) =>\n queryOptions({\n queryKey: ['blog', 'articles', params],\n queryFn: ({ signal }) => blog.articles.list({ ...params, signal }),\n }),\n article: (id: string) =>\n queryOptions({\n queryKey: ['blog', 'article', id],\n queryFn: ({ signal }) => blog.articles.find(id, signal),\n }),\n },\n};\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { api } from './chunk-
|
|
2
|
-
import { getTwilightContext } from './chunk-
|
|
1
|
+
import { api } from './chunk-ZPX4LBQZ.js';
|
|
2
|
+
import { getTwilightContext } from './chunk-H3PJJKAQ.js';
|
|
3
3
|
import { queryOptions } from '@tanstack/react-query';
|
|
4
4
|
|
|
5
5
|
var menu = {
|
|
@@ -23,5 +23,5 @@ var menu = {
|
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
export { menu };
|
|
26
|
-
//# sourceMappingURL=chunk-
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
26
|
+
//# sourceMappingURL=chunk-6TWQZEPF.js.map
|
|
27
|
+
//# sourceMappingURL=chunk-6TWQZEPF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/menu.ts"],"names":[],"mappings":";;;;AAKO,IAAM,IAAA,GAAO;AAAA,EAClB,QAAQ,YAAiC;AACvC,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,kBAAA,EAAmB;AACtC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAE,CAAA,CAAE,IAAA,EAA2B;AACzF,IAAA,OAAO,QAAQ,EAAC;AAAA,EAClB,CAAA;AAAA,EAEA,QAAQ,YAAiC;AACvC,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,kBAAA,EAAmB;AACtC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAE,CAAA,CAAE,IAAA,EAA2B;AACzF,IAAA,OAAO,QAAQ,EAAC;AAAA,EAClB,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,MACN,YAAA,CAAa;AAAA,MACX,UAAU,CAAC,OAAA,EAAS,QAAA,EAAU,kBAAA,GAAqB,MAAM,CAAA;AAAA,MACzD,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAO;AAAA,MAC3B,SAAA,EAAW,IAAI,EAAA,GAAK;AAAA,KACrB;AAAA;AAEP","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/api/menu.ts"],"names":[],"mappings":";;;;AAKO,IAAM,IAAA,GAAO;AAAA,EAClB,QAAQ,YAAiC;AACvC,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,kBAAA,EAAmB;AACtC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAE,CAAA,CAAE,IAAA,EAA2B;AACzF,IAAA,OAAO,QAAQ,EAAC;AAAA,EAClB,CAAA;AAAA,EAEA,QAAQ,YAAiC;AACvC,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,kBAAA,EAAmB;AACtC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAE,CAAA,CAAE,IAAA,EAA2B;AACzF,IAAA,OAAO,QAAQ,EAAC;AAAA,EAClB,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,MACN,YAAA,CAAa;AAAA,MACX,UAAU,CAAC,OAAA,EAAS,QAAA,EAAU,kBAAA,GAAqB,MAAM,CAAA;AAAA,MACzD,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAO;AAAA,MAC3B,SAAA,EAAW,IAAI,EAAA,GAAK;AAAA,KACrB;AAAA;AAEP","file":"chunk-6TWQZEPF.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport { getTwilightContext } from '../twilight/context';\nimport type { MenuItem } from '../types';\n\nexport const menu = {\n header: async (): Promise<MenuItem[]> => {\n const { locale } = getTwilightContext();\n const { data } = await api.get(`menus/header?lang=${locale}`).json<{ data: MenuItem[] }>();\n return data || [];\n },\n\n footer: async (): Promise<MenuItem[]> => {\n const { locale } = getTwilightContext();\n const { data } = await api.get(`menus/footer?lang=${locale}`).json<{ data: MenuItem[] }>();\n return data || [];\n },\n\n queries: {\n header: () =>\n queryOptions({\n queryKey: ['menus', 'header', getTwilightContext().locale],\n queryFn: () => menu.header(),\n staleTime: 5 * 60 * 1000,\n }),\n },\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { onSallaEvent } from './chunk-
|
|
1
|
+
import { onSallaEvent } from './chunk-VEWF3NFM.js';
|
|
2
2
|
import { useState, useCallback, useEffect } from 'react';
|
|
3
3
|
|
|
4
4
|
function useComments() {
|
|
@@ -16,5 +16,5 @@ function useComments() {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
export { useComments };
|
|
19
|
-
//# sourceMappingURL=chunk-
|
|
20
|
-
//# sourceMappingURL=chunk-
|
|
19
|
+
//# sourceMappingURL=chunk-6YWW5Y22.js.map
|
|
20
|
+
//# sourceMappingURL=chunk-6YWW5Y22.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useComments.ts"],"names":[],"mappings":";;;AAuCO,SAAS,WAAA,GAAiC;AAC/C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,CAAC,CAAA;AAEhD,EAAA,MAAM,OAAA,GAAU,YAAY,MAAM;AAChC,IAAA,cAAA,CAAe,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,qBAAqB,MAAM;AAC/B,MAAA,cAAA,CAAe,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAAA,IACnC,CAAA;AAEA,IAAA,OAAO,YAAA,CAAa,kBAAkB,kBAAkB,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,aAAa,OAAA,EAAQ;AAChC","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useComments.ts"],"names":[],"mappings":";;;AAuCO,SAAS,WAAA,GAAiC;AAC/C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,CAAC,CAAA;AAEhD,EAAA,MAAM,OAAA,GAAU,YAAY,MAAM;AAChC,IAAA,cAAA,CAAe,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,qBAAqB,MAAM;AAC/B,MAAA,cAAA,CAAe,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAAA,IACnC,CAAA;AAEA,IAAA,OAAO,YAAA,CAAa,kBAAkB,kBAAkB,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,aAAa,OAAA,EAAQ;AAChC","file":"chunk-6YWW5Y22.js","sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport { onSallaEvent } from '../utils/sdk-helpers';\n\n/**\n * UseCommentsResult - Return type for useComments hook\n *\n * @property commentsKey - Key to pass to salla-comments component for re-render\n * @property refresh - Function to manually trigger a comments refresh\n */\nexport interface UseCommentsResult {\n commentsKey: number;\n refresh: () => void;\n}\n\n/**\n * useComments - Hook for managing salla-comments web component re-renders\n *\n * Listens to the Salla SDK's comment added events and automatically\n * increments a re-render key for the salla-comments component. This\n * eliminates the need for full page reloads when comments are added.\n *\n * @returns Object with comments key for component re-rendering and manual refresh function\n *\n * @example\n * ```tsx\n * function ProductPage({ product }) {\n * const { commentsKey } = useComments();\n *\n * return (\n * <salla-comments\n * key={commentsKey}\n * item-id={product.id}\n * type=\"product\"\n * />\n * );\n * }\n * ```\n */\n\nexport function useComments(): UseCommentsResult {\n const [commentsKey, setCommentsKey] = useState(0);\n\n const refresh = useCallback(() => {\n setCommentsKey((prev) => prev + 1);\n }, []);\n\n useEffect(() => {\n const handleCommentAdded = () => {\n setCommentsKey((prev) => prev + 1);\n };\n\n return onSallaEvent('comment::added', handleCommentAdded);\n }, []);\n\n return { commentsKey, refresh };\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { orThrow, orUnauthorized } from './chunk-
|
|
2
|
-
import { api } from './chunk-
|
|
1
|
+
import { orThrow, orUnauthorized } from './chunk-GT2L5IJ4.js';
|
|
2
|
+
import { api } from './chunk-ZPX4LBQZ.js';
|
|
3
3
|
import { queryOptions } from '@tanstack/react-query';
|
|
4
4
|
|
|
5
5
|
var order = {
|
|
@@ -78,5 +78,5 @@ var order = {
|
|
|
78
78
|
};
|
|
79
79
|
|
|
80
80
|
export { order };
|
|
81
|
-
//# sourceMappingURL=chunk-
|
|
82
|
-
//# sourceMappingURL=chunk-
|
|
81
|
+
//# sourceMappingURL=chunk-7OB2DG2K.js.map
|
|
82
|
+
//# sourceMappingURL=chunk-7OB2DG2K.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/order.ts"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/api/order.ts"],"names":[],"mappings":"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","file":"chunk-7OB2DG2K.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport type {\n Order,\n OrderListItem,\n OrderShipmentItem,\n OrderRatingItem,\n} from '../routes/account/types';\nimport type { Pagination } from './types';\nimport { orThrow, orUnauthorized } from '../providers/NavigationProvider';\n\nexport interface OrderDetailResponse {\n order: Order;\n}\n\n/**\n * The order in the shape the Twilight web components read (`salla-order-details`,\n * `salla-order-totals-card`) and the Twig themes render: the API answers `orders/{id}` this\n * way when the request does not say it comes from a React theme (`s-theme-type`).\n */\nexport interface TwilightOrder {\n items: Array<{\n name: string;\n quantity: number;\n product?: { id: number; url?: string; type?: string; image?: { url?: string } };\n options?: unknown[];\n }>;\n [key: string]: unknown;\n}\n\nexport interface CheckoutThankYouData {\n thank_you_title?: string;\n messages?: string[];\n share_message?: string;\n short_share_message?: string;\n}\n\nexport interface OrdersListResponse {\n data: OrderListItem[];\n cursor?: Pagination;\n}\n\nexport interface OrdersListParams {\n page?: number;\n cursor?: string | null;\n status?: string;\n feedback_status?: string;\n /** When set, the list payload includes each order's `items[]` (`with_items=1`). */\n with_items?: boolean | number;\n signal?: AbortSignal;\n}\n\nexport const order = {\n list: async (params?: OrdersListParams): Promise<OrdersListResponse> => {\n const {\n page,\n cursor,\n status,\n feedback_status: feedbackStatus,\n with_items: withItems,\n signal,\n } = params ?? {};\n\n const searchParams = new URLSearchParams();\n if (page !== undefined) searchParams.set('page', String(page));\n if (cursor) searchParams.set('cursor', cursor);\n if (status) searchParams.set('status', status);\n if (feedbackStatus) searchParams.set('feedback_status', feedbackStatus);\n if (withItems) searchParams.set('with_items', '1');\n\n const options: Record<string, unknown> = {};\n if (signal) options.signal = signal;\n\n const response = await api\n .get(`orders?${searchParams.toString()}`, options as any)\n .json<{ data: OrderListItem[] | null; cursor?: Pagination }>();\n\n return {\n data: response.data ?? [],\n cursor: response.cursor,\n };\n },\n\n find: async (id: string): Promise<OrderDetailResponse> => {\n const response = await api.get(`orders/${id}`).json<{ data: Order }>();\n\n return { order: response.data };\n },\n\n findForComponents: async (id: string): Promise<TwilightOrder> => {\n const response = await api\n .get(`orders/${id}`, {\n hooks: {\n // Runs after the client's own hook, which marks every request as from a React theme.\n beforeRequest: [({ request }) => request.headers.delete('s-theme-type')],\n },\n })\n .json<{ data: TwilightOrder }>();\n return response.data;\n },\n\n shipments: async (orderId: string): Promise<OrderShipmentItem[]> => {\n const response = await api\n .get(`orders/${orderId}/shipments`)\n .json<{ data: OrderShipmentItem[] }>();\n return response.data ?? [];\n },\n\n ratings: async (orderId: string): Promise<OrderRatingItem[]> => {\n const response = await api.get(`orders/${orderId}/ratings`).json<{ data: OrderRatingItem[] }>();\n return response.data ?? [];\n },\n\n findOrThrow: (id: string): Promise<OrderDetailResponse> =>\n orThrow(orUnauthorized(order.find(id))),\n\n thankYou: async (orderId: string): Promise<CheckoutThankYouData> => {\n const { data } = await api\n .get(`checkout/thank-you/${orderId}`)\n .json<{ data: CheckoutThankYouData }>();\n return data;\n },\n\n thankYouOrThrow: (orderId: string): Promise<CheckoutThankYouData> =>\n orThrow(order.thankYou(orderId)),\n\n queries: {\n list: (params?: Omit<OrdersListParams, 'signal'>) =>\n queryOptions({\n queryKey: ['orders', 'list', params],\n queryFn: ({ signal }) => order.list({ ...params, signal }),\n }),\n find: (id: string) =>\n queryOptions({\n queryKey: ['orders', 'detail', id],\n queryFn: () => order.find(id),\n }),\n shipments: (orderId: string) =>\n queryOptions({\n queryKey: ['orders', 'shipments', orderId],\n queryFn: () => order.shipments(orderId),\n }),\n ratings: (orderId: string) =>\n queryOptions({\n queryKey: ['orders', 'ratings', orderId],\n queryFn: () => order.ratings(orderId),\n }),\n thankYou: (orderId: string) =>\n queryOptions({\n queryKey: ['orders', 'thankYou', orderId],\n queryFn: () => order.thankYou(orderId),\n }),\n },\n};\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { HookSlot, useIsClient } from './chunk-5XDPAKF5.js';
|
|
2
2
|
import { useTranslation } from './chunk-TYNZ5B2B.js';
|
|
3
|
-
import { Image } from './chunk-
|
|
3
|
+
import { Image } from './chunk-44FMRCHW.js';
|
|
4
4
|
import { Link } from './chunk-AXW67SY7.js';
|
|
5
5
|
import { LazyImageModal } from './chunk-7V5HOZW4.js';
|
|
6
6
|
import { useTwilight } from './chunk-DF6FBKDN.js';
|
|
@@ -278,5 +278,5 @@ function Footer({ inSheet = false } = {}) {
|
|
|
278
278
|
}
|
|
279
279
|
|
|
280
280
|
export { Footer };
|
|
281
|
-
//# sourceMappingURL=chunk-
|
|
282
|
-
//# sourceMappingURL=chunk-
|
|
281
|
+
//# sourceMappingURL=chunk-7RL4DG54.js.map
|
|
282
|
+
//# sourceMappingURL=chunk-7RL4DG54.js.map
|