@salla.sa/twilight-theme-engine 1.0.144 → 1.0.146
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-LWT2QINY.js → AddToCartForm-ZZMT3ZRO.js} +3 -3
- package/dist/{AddToCartForm-LWT2QINY.js.map → AddToCartForm-ZZMT3ZRO.js.map} +1 -1
- package/dist/{BlogAuthorPage-52C2OHXW.js → BlogAuthorPage-LVRGWFOC.js} +27 -27
- package/dist/{BlogAuthorPage-52C2OHXW.js.map → BlogAuthorPage-LVRGWFOC.js.map} +1 -1
- package/dist/{BlogCategoryPage-LBLIAN6Q.js → BlogCategoryPage-CONL6QSN.js} +27 -27
- package/dist/{BlogCategoryPage-LBLIAN6Q.js.map → BlogCategoryPage-CONL6QSN.js.map} +1 -1
- package/dist/{BlogPage-U56CLHI4.js → BlogPage-6ZA474IU.js} +25 -25
- package/dist/{BlogPage-U56CLHI4.js.map → BlogPage-6ZA474IU.js.map} +1 -1
- package/dist/{BlogSinglePage-NQJDYUFB.js → BlogSinglePage-W7WYKP7W.js} +25 -25
- package/dist/{BlogSinglePage-NQJDYUFB.js.map → BlogSinglePage-W7WYKP7W.js.map} +1 -1
- package/dist/{BlogTagPage-XP3XGVCO.js → BlogTagPage-G5JX7FSN.js} +27 -27
- package/dist/{BlogTagPage-XP3XGVCO.js.map → BlogTagPage-G5JX7FSN.js.map} +1 -1
- package/dist/{BrandsPage-22AET7DW.js → BrandsPage-TB5NDSGL.js} +26 -26
- package/dist/{BrandsPage-22AET7DW.js.map → BrandsPage-TB5NDSGL.js.map} +1 -1
- package/dist/{Breadcrumb-YTYXSTKO.js → Breadcrumb-EVZDJG7H.js} +25 -25
- package/dist/{Breadcrumb-YTYXSTKO.js.map → Breadcrumb-EVZDJG7H.js.map} +1 -1
- package/dist/{CartItem-UTU4GLDN.js → CartItem-D2LJIFGL.js} +25 -25
- package/dist/{CartItem-UTU4GLDN.js.map → CartItem-D2LJIFGL.js.map} +1 -1
- package/dist/{CartSummary-4UGWZ3B3.js → CartSummary-V4HYUEPB.js} +25 -25
- package/dist/{CartSummary-4UGWZ3B3.js.map → CartSummary-V4HYUEPB.js.map} +1 -1
- package/dist/{Copyright-B2GYPZBZ.js → Copyright-JLIFLENS.js} +3 -3
- package/dist/{Copyright-B2GYPZBZ.js.map → Copyright-JLIFLENS.js.map} +1 -1
- package/dist/{CustomerLayout-I4XFBCOH.js → CustomerLayout-JSIYPWY4.js} +25 -25
- package/dist/{CustomerLayout-I4XFBCOH.js.map → CustomerLayout-JSIYPWY4.js.map} +1 -1
- package/dist/{Footer-OWOF2AGC.js → Footer-BNIVXKRM.js} +4 -4
- package/dist/{Footer-OWOF2AGC.js.map → Footer-BNIVXKRM.js.map} +1 -1
- package/dist/{Header-KDJL4YRP.js → Header-DI3OK5TC.js} +11 -11
- package/dist/{Header-KDJL4YRP.js.map → Header-DI3OK5TC.js.map} +1 -1
- package/dist/{LatestProducts-YBFHXG5V.js → LatestProducts-PEIN355E.js} +27 -27
- package/dist/{LatestProducts-YBFHXG5V.js.map → LatestProducts-PEIN355E.js.map} +1 -1
- package/dist/{LoyaltyPage-GFWTFQA7.js → LoyaltyPage-GV6WMYVE.js} +25 -25
- package/dist/{LoyaltyPage-GFWTFQA7.js.map → LoyaltyPage-GV6WMYVE.js.map} +1 -1
- package/dist/{LoyaltyPointsPage-WJDZL6G4.js → LoyaltyPointsPage-QNOVSCKB.js} +8 -8
- package/dist/{LoyaltyPointsPage-WJDZL6G4.js.map → LoyaltyPointsPage-QNOVSCKB.js.map} +1 -1
- package/dist/{MainMenu-AWSLHAEE.js → MainMenu-IN5HUX3U.js} +7 -7
- package/dist/{MainMenu-AWSLHAEE.js.map → MainMenu-IN5HUX3U.js.map} +1 -1
- package/dist/{MasterLayout-ZMHHLGYL.js → MasterLayout-GHAXKYOR.js} +25 -25
- package/dist/{MasterLayout-ZMHHLGYL.js.map → MasterLayout-GHAXKYOR.js.map} +1 -1
- package/dist/{MobileMenu-56MF2EAS.js → MobileMenu-XU45EZMG.js} +26 -26
- package/dist/{MobileMenu-56MF2EAS.js.map → MobileMenu-XU45EZMG.js.map} +1 -1
- package/dist/{NotificationsPage-7QC66446.js → NotificationsPage-AMY7TARF.js} +25 -25
- package/dist/{NotificationsPage-7QC66446.js.map → NotificationsPage-AMY7TARF.js.map} +1 -1
- package/dist/{OrderSinglePage-WXJHUJ6C.js → OrderSinglePage-L2E6YH3Z.js} +26 -26
- package/dist/{OrderSinglePage-WXJHUJ6C.js.map → OrderSinglePage-L2E6YH3Z.js.map} +1 -1
- package/dist/{OrdersPage-ZNM4YGXR.js → OrdersPage-76ORWMJY.js} +25 -25
- package/dist/{OrdersPage-ZNM4YGXR.js.map → OrdersPage-76ORWMJY.js.map} +1 -1
- package/dist/{PageSingle-NQZM6O5A.js → PageSingle-D7I6EHBF.js} +6 -6
- package/dist/{PageSingle-NQZM6O5A.js.map → PageSingle-D7I6EHBF.js.map} +1 -1
- package/dist/{ProductDetails-N4KYBKBG.js → ProductDetails-BZVRXSCD.js} +7 -7
- package/dist/{ProductDetails-N4KYBKBG.js.map → ProductDetails-BZVRXSCD.js.map} +1 -1
- package/dist/{ProfilePage-XOGVATHX.js → ProfilePage-65NYRBON.js} +25 -25
- package/dist/{ProfilePage-XOGVATHX.js.map → ProfilePage-65NYRBON.js.map} +1 -1
- package/dist/{ReviewsPage-WOLLCLAY.js → ReviewsPage-C7NSCMBE.js} +3 -3
- package/dist/{ReviewsPage-WOLLCLAY.js.map → ReviewsPage-C7NSCMBE.js.map} +1 -1
- package/dist/{SeoCartWidget-EVJOTXPO.js → SeoCartWidget-GK3KC2M3.js} +25 -25
- package/dist/{SeoCartWidget-EVJOTXPO.js.map → SeoCartWidget-GK3KC2M3.js.map} +1 -1
- package/dist/{SettingsPage-LYDZFUF3.js → SettingsPage-7VGJBA5K.js} +25 -25
- package/dist/{SettingsPage-LYDZFUF3.js.map → SettingsPage-7VGJBA5K.js.map} +1 -1
- package/dist/{StoreClosedNotification-62SFSGRH.js → StoreClosedNotification-44JN2FZV.js} +26 -26
- package/dist/{StoreClosedNotification-62SFSGRH.js.map → StoreClosedNotification-44JN2FZV.js.map} +1 -1
- package/dist/{TestimonialsPage-WPZBQQO2.js → TestimonialsPage-KGCGTUJQ.js} +6 -6
- package/dist/{TestimonialsPage-WPZBQQO2.js.map → TestimonialsPage-KGCGTUJQ.js.map} +1 -1
- package/dist/{ThankYouPage-44VMBXGI.js → ThankYouPage-XWB4X236.js} +25 -25
- package/dist/{ThankYouPage-44VMBXGI.js.map → ThankYouPage-XWB4X236.js.map} +1 -1
- package/dist/{WalletPage-YVSIECSM.js → WalletPage-J3CX6MLS.js} +26 -26
- package/dist/{WalletPage-YVSIECSM.js.map → WalletPage-J3CX6MLS.js.map} +1 -1
- package/dist/{WebMcpTools-VA2A62E3.js → WebMcpTools-3MV53OMT.js} +9 -9
- package/dist/{WebMcpTools-VA2A62E3.js.map → WebMcpTools-3MV53OMT.js.map} +1 -1
- package/dist/{WishlistPage-IGWDG4HC.js → WishlistPage-HHX3OVOF.js} +27 -27
- package/dist/{WishlistPage-IGWDG4HC.js.map → WishlistPage-HHX3OVOF.js.map} +1 -1
- package/dist/api/advertisement.js +4 -4
- package/dist/api/apps.js +4 -4
- package/dist/api/blog.js +6 -6
- package/dist/api/brands.js +6 -6
- package/dist/api/cart.js +6 -6
- package/dist/api/category.js +6 -6
- package/dist/api/client.js +3 -3
- package/dist/api/home.js +4 -4
- package/dist/api/loyalty.js +6 -6
- package/dist/api/menu.js +4 -4
- package/dist/api/notification.js +4 -4
- package/dist/api/order.js +6 -6
- package/dist/api/page.js +6 -6
- package/dist/api/product.js +6 -6
- package/dist/api/profile.js +3 -3
- package/dist/api/store.js +5 -5
- package/dist/api/translations.js +4 -4
- package/dist/api/user.js +4 -4
- package/dist/api/wallet.js +4 -4
- package/dist/api/wishlist.js +7 -7
- package/dist/{chunk-G3NCSKQ3.js → chunk-2DUN6DZK.js} +5 -5
- package/dist/{chunk-G3NCSKQ3.js.map → chunk-2DUN6DZK.js.map} +1 -1
- package/dist/{chunk-S4KV6QGP.js → chunk-3G4YCXOR.js} +27 -20
- package/dist/chunk-3G4YCXOR.js.map +1 -0
- package/dist/{chunk-IVZNTLAA.js → chunk-3O6BB7SI.js} +3 -3
- package/dist/{chunk-IVZNTLAA.js.map → chunk-3O6BB7SI.js.map} +1 -1
- package/dist/{chunk-5XWGYFZ2.js → chunk-3QOALQQJ.js} +4 -4
- package/dist/{chunk-5XWGYFZ2.js.map → chunk-3QOALQQJ.js.map} +1 -1
- package/dist/{chunk-7IQFONJR.js → chunk-5EN3XZ32.js} +3 -3
- package/dist/{chunk-7IQFONJR.js.map → chunk-5EN3XZ32.js.map} +1 -1
- package/dist/{chunk-N6ZE6HUX.js → chunk-5V4W3GBI.js} +5 -5
- package/dist/{chunk-N6ZE6HUX.js.map → chunk-5V4W3GBI.js.map} +1 -1
- package/dist/{chunk-3E3ABCPC.js → chunk-6TFM3UTF.js} +3 -3
- package/dist/{chunk-3E3ABCPC.js.map → chunk-6TFM3UTF.js.map} +1 -1
- package/dist/{chunk-WATFGHFK.js → chunk-7PPNAVBF.js} +4 -4
- package/dist/{chunk-WATFGHFK.js.map → chunk-7PPNAVBF.js.map} +1 -1
- package/dist/{chunk-GCXFTIHV.js → chunk-7ZTSYUCJ.js} +4 -4
- package/dist/{chunk-GCXFTIHV.js.map → chunk-7ZTSYUCJ.js.map} +1 -1
- package/dist/{chunk-BBQATCYN.js → chunk-A4Y5BVJN.js} +3 -3
- package/dist/{chunk-BBQATCYN.js.map → chunk-A4Y5BVJN.js.map} +1 -1
- package/dist/{chunk-IAM44RPN.js → chunk-AECYX56P.js} +4 -4
- package/dist/{chunk-IAM44RPN.js.map → chunk-AECYX56P.js.map} +1 -1
- package/dist/{chunk-AT6YLLT4.js → chunk-B36NISD2.js} +4 -4
- package/dist/{chunk-AT6YLLT4.js.map → chunk-B36NISD2.js.map} +1 -1
- package/dist/{chunk-BXMU3ARO.js → chunk-BEYWTFOR.js} +4 -4
- package/dist/{chunk-BXMU3ARO.js.map → chunk-BEYWTFOR.js.map} +1 -1
- package/dist/{chunk-AXTVBTO4.js → chunk-BKSVKSAW.js} +22 -22
- package/dist/{chunk-AXTVBTO4.js.map → chunk-BKSVKSAW.js.map} +1 -1
- package/dist/{chunk-KVBWIXXG.js → chunk-C5P2C2NR.js} +3 -3
- package/dist/{chunk-KVBWIXXG.js.map → chunk-C5P2C2NR.js.map} +1 -1
- package/dist/{chunk-PYUTATUY.js → chunk-C6PNF2OT.js} +3 -3
- package/dist/{chunk-PYUTATUY.js.map → chunk-C6PNF2OT.js.map} +1 -1
- package/dist/{chunk-VNEMV6IC.js → chunk-CFG6PGUZ.js} +4 -4
- package/dist/{chunk-VNEMV6IC.js.map → chunk-CFG6PGUZ.js.map} +1 -1
- package/dist/{chunk-GN7V2QHO.js → chunk-DHKZCR6U.js} +6 -6
- package/dist/{chunk-GN7V2QHO.js.map → chunk-DHKZCR6U.js.map} +1 -1
- package/dist/{chunk-WU5Z4JGX.js → chunk-DMGSEY7F.js} +3 -3
- package/dist/{chunk-WU5Z4JGX.js.map → chunk-DMGSEY7F.js.map} +1 -1
- package/dist/{chunk-VV7MDVGS.js → chunk-EF3PLLLA.js} +8 -8
- package/dist/{chunk-VV7MDVGS.js.map → chunk-EF3PLLLA.js.map} +1 -1
- package/dist/{chunk-WQPG22DY.js → chunk-EGI7F57E.js} +3 -3
- package/dist/{chunk-WQPG22DY.js.map → chunk-EGI7F57E.js.map} +1 -1
- package/dist/{chunk-W6KPVZZR.js → chunk-F7S2QA3D.js} +7 -7
- package/dist/{chunk-W6KPVZZR.js.map → chunk-F7S2QA3D.js.map} +1 -1
- package/dist/{chunk-P3WHN7JA.js → chunk-FTH3XLIN.js} +3 -3
- package/dist/{chunk-P3WHN7JA.js.map → chunk-FTH3XLIN.js.map} +1 -1
- package/dist/{chunk-CRO7DXS3.js → chunk-FXW6H6J3.js} +3 -3
- package/dist/{chunk-CRO7DXS3.js.map → chunk-FXW6H6J3.js.map} +1 -1
- package/dist/{chunk-TF6HFXTW.js → chunk-H7LRGY7U.js} +3 -3
- package/dist/{chunk-TF6HFXTW.js.map → chunk-H7LRGY7U.js.map} +1 -1
- package/dist/{chunk-RWAOBMAK.js → chunk-HZWTDQVJ.js} +6 -6
- package/dist/{chunk-RWAOBMAK.js.map → chunk-HZWTDQVJ.js.map} +1 -1
- package/dist/{chunk-HOJ5E2PG.js → chunk-IHOUADLX.js} +3 -3
- package/dist/{chunk-HOJ5E2PG.js.map → chunk-IHOUADLX.js.map} +1 -1
- package/dist/{chunk-GUODUINX.js → chunk-JOHFXU4C.js} +5 -5
- package/dist/{chunk-GUODUINX.js.map → chunk-JOHFXU4C.js.map} +1 -1
- package/dist/{chunk-MZ4LTJQD.js → chunk-K4YRFOFA.js} +7 -7
- package/dist/{chunk-MZ4LTJQD.js.map → chunk-K4YRFOFA.js.map} +1 -1
- package/dist/{chunk-LFHYQ6AN.js → chunk-M5WTY3EH.js} +3 -3
- package/dist/{chunk-LFHYQ6AN.js.map → chunk-M5WTY3EH.js.map} +1 -1
- package/dist/{chunk-RYGEIQWO.js → chunk-MGG4XAJ5.js} +3 -3
- package/dist/{chunk-RYGEIQWO.js.map → chunk-MGG4XAJ5.js.map} +1 -1
- package/dist/{chunk-O7OFWC34.js → chunk-O6RZ6AWT.js} +4 -4
- package/dist/{chunk-O7OFWC34.js.map → chunk-O6RZ6AWT.js.map} +1 -1
- package/dist/{chunk-LVUH4FOB.js → chunk-PBT52UWY.js} +5 -5
- package/dist/{chunk-LVUH4FOB.js.map → chunk-PBT52UWY.js.map} +1 -1
- package/dist/{chunk-C6WYORKW.js → chunk-PCYZMJUC.js} +3 -3
- package/dist/{chunk-C6WYORKW.js.map → chunk-PCYZMJUC.js.map} +1 -1
- package/dist/{chunk-ODP2N7CD.js → chunk-QBVXQHVJ.js} +4 -4
- package/dist/{chunk-ODP2N7CD.js.map → chunk-QBVXQHVJ.js.map} +1 -1
- package/dist/{chunk-MWYKP7CI.js → chunk-QMWP2ZP6.js} +3 -3
- package/dist/{chunk-MWYKP7CI.js.map → chunk-QMWP2ZP6.js.map} +1 -1
- package/dist/{chunk-LNTLWEYI.js → chunk-QXWCIK6D.js} +4 -4
- package/dist/{chunk-LNTLWEYI.js.map → chunk-QXWCIK6D.js.map} +1 -1
- package/dist/{chunk-5UWRPWK2.js → chunk-R7VWIXFX.js} +3 -3
- package/dist/{chunk-5UWRPWK2.js.map → chunk-R7VWIXFX.js.map} +1 -1
- package/dist/{chunk-Q7E4TNN7.js → chunk-SLBO4SEE.js} +3 -3
- package/dist/{chunk-Q7E4TNN7.js.map → chunk-SLBO4SEE.js.map} +1 -1
- package/dist/{chunk-FXVII733.js → chunk-T2752RH7.js} +27 -3
- package/dist/chunk-T2752RH7.js.map +1 -0
- package/dist/{chunk-4L5RHZHJ.js → chunk-T2O2IQJQ.js} +4 -4
- package/dist/{chunk-4L5RHZHJ.js.map → chunk-T2O2IQJQ.js.map} +1 -1
- package/dist/{chunk-YVQXIZY7.js → chunk-TQQN5AE2.js} +6 -6
- package/dist/{chunk-YVQXIZY7.js.map → chunk-TQQN5AE2.js.map} +1 -1
- package/dist/{chunk-3KTDODC5.js → chunk-VDY3VY7S.js} +3 -3
- package/dist/{chunk-3KTDODC5.js.map → chunk-VDY3VY7S.js.map} +1 -1
- package/dist/{chunk-2ZR562TA.js → chunk-VEVFVWF3.js} +5 -5
- package/dist/{chunk-2ZR562TA.js.map → chunk-VEVFVWF3.js.map} +1 -1
- package/dist/{chunk-W5LVGFHX.js → chunk-VNHYMLGK.js} +6 -6
- package/dist/{chunk-W5LVGFHX.js.map → chunk-VNHYMLGK.js.map} +1 -1
- package/dist/{chunk-MDU7ERR3.js → chunk-VQO4TTPE.js} +4 -4
- package/dist/{chunk-MDU7ERR3.js.map → chunk-VQO4TTPE.js.map} +1 -1
- package/dist/{chunk-JYPIPQ3V.js → chunk-X6WDFQYL.js} +3 -3
- package/dist/{chunk-JYPIPQ3V.js.map → chunk-X6WDFQYL.js.map} +1 -1
- package/dist/{chunk-NHA4SBKG.js → chunk-XMRNYUQY.js} +3 -3
- package/dist/{chunk-NHA4SBKG.js.map → chunk-XMRNYUQY.js.map} +1 -1
- package/dist/{chunk-6JH4QYKT.js → chunk-YDRURQ2W.js} +4 -4
- package/dist/{chunk-6JH4QYKT.js.map → chunk-YDRURQ2W.js.map} +1 -1
- package/dist/{chunk-AD4QPYNG.js → chunk-YEBA44IV.js} +4 -4
- package/dist/{chunk-AD4QPYNG.js.map → chunk-YEBA44IV.js.map} +1 -1
- package/dist/{chunk-V46O3Z7J.js → chunk-Z4EQHB26.js} +5 -5
- package/dist/{chunk-V46O3Z7J.js.map → chunk-Z4EQHB26.js.map} +1 -1
- package/dist/{chunk-TAVF4E7T.js → chunk-ZSEECSDV.js} +8 -8
- package/dist/{chunk-TAVF4E7T.js.map → chunk-ZSEECSDV.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 +23 -23
- package/dist/components/home/index.js +28 -28
- package/dist/components/layout/index.js +6 -6
- package/dist/components/product/index.js +25 -25
- package/dist/components/store/index.js +24 -24
- package/dist/components/toast/index.js +4 -4
- package/dist/dev/editor/index.js +2 -2
- package/dist/dev/index.js +2 -2
- package/dist/document-class-SWL4NCC6.js +32 -0
- package/dist/{document-class-TRLFCQHJ.js.map → document-class-SWL4NCC6.js.map} +1 -1
- package/dist/hooks/index.js +23 -23
- package/dist/hooks/useComments.js +3 -3
- package/dist/hooks/useGtm.js +23 -23
- package/dist/hooks/useMoney.js +23 -23
- package/dist/hooks/useProduct.js +3 -3
- package/dist/hooks/useStore.js +23 -23
- package/dist/hooks/useUser.js +5 -5
- package/dist/hooks/useWishlist.js +3 -3
- package/dist/index.js +23 -23
- package/dist/native-app/index.js +3 -3
- package/dist/{navigation-HWFEKUG6.js → navigation-7V4CSVG5.js} +8 -8
- package/dist/{navigation-HWFEKUG6.js.map → navigation-7V4CSVG5.js.map} +1 -1
- package/dist/{navigation-E75N4EU3.js → navigation-VMR4V27L.js} +7 -7
- package/dist/{navigation-E75N4EU3.js.map → navigation-VMR4V27L.js.map} +1 -1
- package/dist/{not-found-7SZU5K7G.js → not-found-S33EUV2Q.js} +26 -26
- package/dist/{not-found-7SZU5K7G.js.map → not-found-S33EUV2Q.js.map} +1 -1
- package/dist/providers/index.js +23 -23
- package/dist/routes/account/orders.js +8 -8
- package/dist/routes/account.js +17 -17
- package/dist/routes/blog/loader.d.ts.map +1 -1
- package/dist/routes/blog.js +27 -19
- package/dist/routes/blog.js.map +1 -1
- 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 +6 -6
- 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/root/beforeLoad.d.ts.map +1 -1
- package/dist/routes/seo-redirects.js +6 -6
- package/dist/routes/testimonials.js +4 -4
- package/dist/routes/thank-you.js +8 -8
- package/dist/skeleton.js +29 -29
- package/dist/{store-lookup-LGYGZ4PU.js → store-lookup-D5C2LNXK.js} +11 -11
- package/dist/{store-lookup-LGYGZ4PU.js.map → store-lookup-D5C2LNXK.js.map} +1 -1
- package/dist/tanstack.js +19 -19
- package/dist/types/index.d.ts +5 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/baseHead.js +2 -2
- package/dist/utils/index.js +6 -6
- package/dist/utils/store-base.d.ts +30 -0
- package/dist/utils/store-base.d.ts.map +1 -1
- package/dist/utils/store-identity.d.ts +8 -0
- package/dist/utils/store-identity.d.ts.map +1 -1
- package/dist/vite/index.js +3 -3
- package/package.json +1 -1
- package/tailwind/routes/blog/loader.ts.txt +26 -8
- package/tailwind/routes/root/beforeLoad.ts.txt +27 -9
- package/dist/chunk-FXVII733.js.map +0 -1
- package/dist/chunk-S4KV6QGP.js.map +0 -1
- package/dist/document-class-TRLFCQHJ.js +0 -32
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/webmcp/page-navigation.ts","../src/webmcp/input.ts","../src/webmcp/results.ts","../src/webmcp/schema.ts","../src/webmcp/cart-tools.ts","../src/webmcp/catalog-tools.ts","../src/webmcp/page-tools.ts","../src/webmcp/tools.ts","../src/webmcp/registerWebMcpTools.ts","../src/webmcp/salla-deps.ts","../src/webmcp/useWebMcpTools.ts","../src/webmcp/WebMcpTools.tsx"],"names":["product"],"mappings":"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","file":"WebMcpTools-VA2A62E3.js","sourcesContent":["import { defaultNavigate, resolveRelativePath } from '../providers/NavigationProvider';\nimport { getTwilightContext, hasTwilightSettings } from '../twilight/context';\nimport { storePageUrl } from '../utils/baseHead';\n\ntype Navigate = (to: string) => void;\n\nconst isAbsolute = (to: string): boolean => /^[a-z][a-z\\d+.-]*:/i.test(to);\n\nfunction currentSettings() {\n return hasTwilightSettings() ? getTwilightContext().settings : undefined;\n}\n\n/**\n * Make `navigate` safe to call with either a store-relative path (`/cart`) or the\n * absolute URL the API gives a product (`https://shop.example/ar/oud/p7`).\n *\n * - The TanStack router's navigate takes the router's own paths and would append an\n * absolute URL to the current page (`/ar/cart/https:/shop…`). A same-store URL is\n * turned into its store-relative path, as the engine's link interception does; one\n * that cannot be (another origin) loads as a normal page.\n * - The default navigate (`client={false}`, the Next.js adapter) assigns\n * `window.location`, where `/cart` is the host's cart: on a shared host that is\n * another store's page, because stores live under their username. A path becomes\n * the store's own address; an absolute URL is already one.\n */\nexport function withStoreAddress(navigate: Navigate): Navigate {\n const usesWindowLocation = navigate === defaultNavigate;\n\n return (to) => {\n const settings = currentSettings();\n\n if (usesWindowLocation) {\n return navigate(isAbsolute(to) ? to : (storePageUrl(settings, to) ?? to));\n }\n if (!isAbsolute(to)) return navigate(to);\n\n const store = settings?.store;\n const path = store?.url ? resolveRelativePath(to, store.url, store.username) : null;\n return path ? navigate(path) : defaultNavigate(to);\n };\n}\n","/**\n * Input parsing for the tools. The JSON schema is only a hint to the model, so\n * every handler re-checks here and returns a message the agent can correct from.\n */\n\nexport type Parsed<T> = { ok: true; value: T } | { ok: false; error: string };\n\nconst ok = <T>(value: T): Parsed<T> => ({ ok: true, value });\nconst fail = (error: string): Parsed<never> => ({ ok: false, error });\n\n/** A positive whole number from a number or numeric string. */\nexport function parsePositiveInt(raw: unknown, field: string): Parsed<number> {\n const value = typeof raw === 'string' && raw.trim() !== '' ? Number(raw) : raw;\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 1) {\n return fail(`\"${field}\" must be a positive whole number.`);\n }\n return ok(value);\n}\n\nexport function parseQuantity(raw: unknown): Parsed<number> {\n return raw === undefined ? ok(1) : parsePositiveInt(raw, 'quantity');\n}\n\nexport function parseId(raw: unknown, field: string): Parsed<string> {\n const value = typeof raw === 'number' ? String(raw) : raw;\n if (typeof value !== 'string' || value.trim() === '') {\n return fail(`\"${field}\" is required. Get it from get-cart.`);\n }\n return ok(value.trim());\n}\n\nexport function parseKeyword(raw: unknown): Parsed<string> {\n if (typeof raw !== 'string' || raw.trim() === '') {\n return fail('\"keyword\" is required: the words to search the catalog for.');\n }\n return ok(raw.trim());\n}\n\nexport const SEARCH_LIMIT_DEFAULT = 5;\nexport const SEARCH_LIMIT_MAX = 10;\n\nexport function parseLimit(raw: unknown): number {\n if (typeof raw !== 'number' || !Number.isFinite(raw)) return SEARCH_LIMIT_DEFAULT;\n return Math.min(SEARCH_LIMIT_MAX, Math.max(1, Math.trunc(raw)));\n}\n","import type { WebMcpToolResult } from './types';\n\n/** A successful result: the payload as JSON text, which is what agents read best. */\nexport function jsonResult(payload: unknown): WebMcpToolResult {\n return { content: [{ type: 'text', text: JSON.stringify(payload) }] };\n}\n\n/** A failed result with a message the agent can act on. Handlers never throw. */\nexport function errorResult(message: string): WebMcpToolResult {\n return { content: [{ type: 'text', text: message }], isError: true };\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error && error.message ? error.message : 'Unknown error';\n}\n\n/** Run `action`, turning anything it throws into an error result. */\nexport async function guarded(\n label: string,\n action: () => Promise<WebMcpToolResult>\n): Promise<WebMcpToolResult> {\n try {\n return await action();\n } catch (error) {\n return errorResult(`${label} failed: ${errorMessage(error)}`);\n }\n}\n","/** JSON Schema pieces shared by several tools. */\n\nexport const PRODUCT_ID_SCHEMA = {\n type: 'number',\n description: 'Product id, from search-products.',\n} as const;\n\nexport const ITEM_ID_SCHEMA = {\n type: 'string',\n description: 'Cart line id (the \"id\" of an item in get-cart), not the product id.',\n} as const;\n\nexport const QUANTITY_SCHEMA = {\n type: 'number',\n description: 'Whole number of units. Defaults to 1.',\n} as const;\n","import { parseId, parsePositiveInt, parseQuantity } from './input';\nimport { errorResult, guarded, jsonResult } from './results';\nimport { ITEM_ID_SCHEMA, PRODUCT_ID_SCHEMA, QUANTITY_SCHEMA } from './schema';\nimport type { WebMcpDeps, WebMcpTool } from './types';\n\nfunction getCartTool(deps: WebMcpDeps): WebMcpTool {\n return {\n name: 'get-cart',\n description:\n \"Read the shopper's current cart: items (with the line ids needed to change them), count and total. The cart is null when it is empty.\",\n inputSchema: { type: 'object', properties: {} },\n execute: () =>\n guarded('Reading the cart', async () => jsonResult({ cart: await deps.getCart() })),\n };\n}\n\nfunction addToCartTool(deps: WebMcpDeps): WebMcpTool {\n return {\n name: 'add-to-cart',\n description:\n \"Add a product to the shopper's cart and return the updated cart. Only works for products with no required options; for those, use open-page to send the shopper to the product page. Does not check out.\",\n inputSchema: {\n type: 'object',\n properties: { productId: PRODUCT_ID_SCHEMA, quantity: QUANTITY_SCHEMA },\n required: ['productId'],\n },\n execute: (input) =>\n guarded('Adding to the cart', async () => {\n const id = parsePositiveInt(input.productId, 'productId');\n if (!id.ok) return errorResult(id.error);\n const quantity = parseQuantity(input.quantity);\n if (!quantity.ok) return errorResult(quantity.error);\n\n const product = await deps.getProduct(id.value);\n if (!product.inStock) {\n return errorResult(`\"${product.name}\" is out of stock or unavailable.`);\n }\n if (product.needsProductPage === true) {\n return errorResult(\n `\"${product.name}\" needs choices made first (options, a variant, an amount…). Use open-page with page \"product\" and productId ${product.id} (${product.url}) so the shopper can pick them.`\n );\n }\n return jsonResult({ cart: await deps.addToCart(id.value, quantity.value) });\n }),\n };\n}\n\nfunction updateCartItemTool(deps: WebMcpDeps): WebMcpTool {\n return {\n name: 'update-cart-item',\n description:\n 'Change the quantity of a line already in the cart (use get-cart for the line id). Returns the updated cart.',\n inputSchema: {\n type: 'object',\n properties: {\n itemId: ITEM_ID_SCHEMA,\n quantity: { ...QUANTITY_SCHEMA, description: 'New quantity.' },\n },\n required: ['itemId', 'quantity'],\n },\n execute: (input) =>\n guarded('Updating the cart', async () => {\n const itemId = parseId(input.itemId, 'itemId');\n if (!itemId.ok) return errorResult(itemId.error);\n const quantity = parsePositiveInt(input.quantity, 'quantity');\n if (!quantity.ok) return errorResult(quantity.error);\n return jsonResult({ cart: await deps.updateCartItem(itemId.value, quantity.value) });\n }),\n };\n}\n\nfunction removeCartItemTool(deps: WebMcpDeps): WebMcpTool {\n return {\n name: 'remove-cart-item',\n description:\n 'Remove a line from the cart (use get-cart for the line id). Returns the updated cart.',\n inputSchema: {\n type: 'object',\n properties: { itemId: ITEM_ID_SCHEMA },\n required: ['itemId'],\n },\n execute: (input) =>\n guarded('Removing from the cart', async () => {\n const itemId = parseId(input.itemId, 'itemId');\n if (!itemId.ok) return errorResult(itemId.error);\n return jsonResult({ cart: await deps.removeCartItem(itemId.value) });\n }),\n };\n}\n\nexport function createCartTools(deps: WebMcpDeps): WebMcpTool[] {\n return [\n getCartTool(deps),\n addToCartTool(deps),\n updateCartItemTool(deps),\n removeCartItemTool(deps),\n ];\n}\n","import { parseKeyword, parseLimit, parsePositiveInt, SEARCH_LIMIT_MAX } from './input';\nimport { errorResult, guarded, jsonResult } from './results';\nimport { PRODUCT_ID_SCHEMA } from './schema';\nimport type { WebMcpDeps, WebMcpTool } from './types';\n\nfunction searchProductsTool(deps: WebMcpDeps): WebMcpTool {\n return {\n name: 'search-products',\n description:\n \"Search this store's catalog by keyword. Returns up to a few matching products with id, name, price, stock and page URL. Use it to find a product before reading details or adding it to the cart.\",\n inputSchema: {\n type: 'object',\n properties: {\n keyword: { type: 'string', description: 'Words to search for, e.g. \"oud perfume\".' },\n limit: {\n type: 'number',\n description: `How many products to return (1-${SEARCH_LIMIT_MAX}). Defaults to 5.`,\n },\n },\n required: ['keyword'],\n },\n execute: (input) =>\n guarded('Product search', async () => {\n const keyword = parseKeyword(input.keyword);\n if (!keyword.ok) return errorResult(keyword.error);\n const products = await deps.searchProducts(keyword.value, parseLimit(input.limit));\n return jsonResult({ products });\n }),\n };\n}\n\nfunction getProductTool(deps: WebMcpDeps): WebMcpTool {\n return {\n name: 'get-product',\n description:\n 'Get one product by id: price, sale state, stock, and whether the shopper must pick options (size, color…) on the product page first.',\n inputSchema: {\n type: 'object',\n properties: { productId: PRODUCT_ID_SCHEMA },\n required: ['productId'],\n },\n execute: (input) =>\n guarded('Loading the product', async () => {\n const id = parsePositiveInt(input.productId, 'productId');\n if (!id.ok) return errorResult(id.error);\n return jsonResult({ product: await deps.getProduct(id.value) });\n }),\n };\n}\n\nexport function createCatalogTools(deps: WebMcpDeps): WebMcpTool[] {\n return [searchProductsTool(deps), getProductTool(deps)];\n}\n","import { parsePositiveInt } from './input';\nimport { errorResult, guarded, jsonResult } from './results';\nimport { PRODUCT_ID_SCHEMA } from './schema';\nimport type { WebMcpDeps, WebMcpTool } from './types';\n\nfunction openPageTool(deps: WebMcpDeps): WebMcpTool {\n return {\n name: 'open-page',\n description:\n 'Navigate the shopper\\'s visible page to the cart, the home page, or a product page. Use \"cart\" to let the shopper review and check out themselves; checkout is never done by a tool.',\n inputSchema: {\n type: 'object',\n properties: {\n page: { type: 'string', enum: ['cart', 'home', 'product'] },\n productId: { ...PRODUCT_ID_SCHEMA, description: 'Required when page is \"product\".' },\n },\n required: ['page'],\n },\n execute: (input) =>\n guarded('Opening the page', async () => {\n if (input.page === 'cart') {\n deps.openPage('/cart');\n return jsonResult({ opened: 'cart' });\n }\n if (input.page === 'home') {\n deps.openPage('/');\n return jsonResult({ opened: 'home' });\n }\n if (input.page === 'product') {\n const id = parsePositiveInt(input.productId, 'productId');\n if (!id.ok) return errorResult(id.error);\n const product = await deps.getProduct(id.value);\n deps.openPage(product.url);\n return jsonResult({ opened: product.url });\n }\n return errorResult('\"page\" must be one of: cart, home, product.');\n }),\n };\n}\n\nexport function createPageTools(deps: WebMcpDeps): WebMcpTool[] {\n return [openPageTool(deps)];\n}\n","import { createCartTools } from './cart-tools';\nimport { createCatalogTools } from './catalog-tools';\nimport { createPageTools } from './page-tools';\nimport type { WebMcpDeps, WebMcpTool } from './types';\n\n/**\n * The storefront tools. Deliberately small — every tool costs the agent context\n * (see the spec's \"tool budget\") — and none of them places an order or pays: the\n * shopper finishes checkout on the page.\n */\nexport function createWebMcpTools(deps: WebMcpDeps): WebMcpTool[] {\n return [...createCatalogTools(deps), ...createCartTools(deps), ...createPageTools(deps)];\n}\n","import { getModelContext } from './model-context';\nimport { createWebMcpTools } from './tools';\nimport type { WebMcpDeps } from './types';\n\nconst NOT_ALLOWED = 'NotAllowedError';\n\nfunction reportRegistrationFailure(toolName: string, error: unknown): void {\n // The page's Permissions-Policy (or an iframe without `allow`) can switch tools\n // off. That is a choice, not a fault, so it stays quiet.\n if (error instanceof DOMException && error.name === NOT_ALLOWED) return;\n console.warn('[twilight] WebMCP could not register tool:', toolName, error);\n}\n\n/**\n * Register the storefront tools with the browser's WebMCP, if it has one.\n *\n * A no-op everywhere else. Returns a dispose that unregisters every tool (they\n * share one `AbortSignal`, which is how the spec unregisters a tool).\n */\nexport function registerWebMcpTools(deps: WebMcpDeps): () => void {\n const modelContext = getModelContext();\n if (!modelContext) return () => {};\n\n const controller = new AbortController();\n for (const tool of createWebMcpTools(deps)) {\n try {\n Promise.resolve(modelContext.registerTool(tool, { signal: controller.signal })).catch(\n (error: unknown) => reportRegistrationFailure(tool.name, error)\n );\n } catch (error) {\n reportRegistrationFailure(tool.name, error);\n }\n }\n return () => controller.abort();\n}\n","import { product as productApi } from '../api/product';\nimport type { Money, Product } from '../types';\nimport type { SallaCartDetailsData, SallaSDK } from '../types/salla-sdk';\nimport { whenSallaReady } from '../utils/sdk-helpers';\nimport type { WebMcpCartSummary, WebMcpDeps, WebMcpProductSummary } from './types';\n\n/** How long a tool waits for the Salla SDK before telling the agent to retry. */\nconst SDK_WAIT_MS = 8_000;\n\n/** Product types a plain \"add one\" call can buy; the rest need input from the shopper. */\nconst SIMPLE_TYPES: ReadonlySet<string> = new Set(['product', 'digital']);\n\nfunction sdkReady(): Promise<SallaSDK> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n cancel();\n reject(new Error('The store is not ready yet. Try again in a moment.'));\n }, SDK_WAIT_MS);\n const cancel = whenSallaReady((sdk) => {\n clearTimeout(timer);\n resolve(sdk);\n });\n });\n}\n\n/** Prices arrive as numbers, `{ amount }` objects or formatted text (\"1,200.50 SAR\"). */\nfunction toAmount(value: unknown): number {\n if (typeof value === 'number') return value;\n if (value && typeof value === 'object' && 'amount' in value) {\n return toAmount((value as Money).amount);\n }\n if (typeof value === 'string') {\n const parsed = Number.parseFloat(value.replace(/,/g, '').replace(/[^\\d.-]/g, ''));\n return Number.isFinite(parsed) ? parsed : 0;\n }\n return 0;\n}\n\n/**\n * Whether the product needs choices made on its page. A details response lists the\n * options and variants, so it can say no; a list response does not, so it can only\n * say yes (a non-plain type, or `has_options`) and otherwise leaves the answer open.\n */\nfunction needsProductPage(p: Product, detailed: boolean): boolean | undefined {\n if (!SIMPLE_TYPES.has(p.type)) return true;\n if ((p.options ?? []).some((option) => option.required)) return true;\n if ((p.skus ?? []).length > 0) return true;\n if (detailed) return false;\n return p.has_options === true ? true : undefined;\n}\n\nfunction toProductSummary(p: Product, detailed: boolean): WebMcpProductSummary {\n const onSale = p.is_on_sale === true;\n const needs = needsProductPage(p, detailed);\n\n return {\n id: Number(p.id),\n name: p.name,\n url: p.url,\n price: toAmount(onSale && p.sale_price ? p.sale_price : p.price),\n ...(onSale ? { regularPrice: toAmount(p.regular_price) } : {}),\n currency: p.currency,\n onSale,\n inStock: p.status !== 'out' && p.status !== 'out-and-notify' && p.is_available !== false,\n ...(needs === undefined ? {} : { needsProductPage: needs }),\n };\n}\n\nfunction toCartSummary(cart: SallaCartDetailsData, currency: string): WebMcpCartSummary {\n return {\n id: cart.id,\n count: cart.count,\n total: toAmount(cart.total),\n currency,\n coupon: cart.coupon ?? null,\n items: (cart.items ?? []).map((item) => ({\n id: String(item.id),\n productId: item.product_id,\n name: item.product_name,\n quantity: item.quantity,\n total: toAmount(item.total),\n })),\n };\n}\n\nasync function readCart(sdk: SallaSDK): Promise<WebMcpCartSummary | null> {\n const cartId = await sdk.cart.api.getCurrentCartId();\n if (!cartId) return null;\n const response = await sdk.api.cart.details(cartId, ['items']);\n // A cart already turned into an order answers with a redirect and no `cart`.\n const cart = response?.data?.cart;\n return cart ? toCartSummary(cart, sdk.config.currency()?.code ?? '') : null;\n}\n\n/**\n * The real tool dependencies: the engine's product API for the catalog, and the\n * Salla SDK for the cart. Cart changes go through `salla.cart.*`, the same calls\n * the UI buttons use, so the cart badge, drawer and toasts update as they would\n * for a click — the shopper and the agent share one visible cart.\n */\nexport function createSallaWebMcpDeps(navigate: (to: string) => void): WebMcpDeps {\n const mutateThenRead = async (\n change: (sdk: SallaSDK) => Promise<unknown>\n ): Promise<WebMcpCartSummary | null> => {\n const sdk = await sdkReady();\n await change(sdk);\n return readCart(sdk);\n };\n\n return {\n searchProducts: async (keyword, limit) => {\n const { items } = await productApi.list({ source: 'search', keyword, perPage: limit });\n return items.map((item) => toProductSummary(item, false));\n },\n getProduct: async (productId) =>\n toProductSummary(await productApi.find(String(productId)), true),\n getCart: async () => readCart(await sdkReady()),\n addToCart: (productId, quantity) =>\n mutateThenRead((sdk) => sdk.cart.addItem({ id: productId, quantity })),\n updateCartItem: (itemId, quantity) =>\n mutateThenRead((sdk) => sdk.cart.updateItem({ id: itemId, quantity })),\n removeCartItem: (itemId) => mutateThenRead((sdk) => sdk.cart.deleteItem(itemId)),\n openPage: navigate,\n };\n}\n","import { useEffect, useRef } from 'react';\nimport { useNavigate } from '../providers/NavigationProvider';\nimport { withStoreAddress } from './page-navigation';\nimport { registerWebMcpTools } from './registerWebMcpTools';\nimport { createSallaWebMcpDeps } from './salla-deps';\n\n/**\n * Expose the storefront to in-browser AI agents through WebMCP for as long as the\n * calling component is mounted. Does nothing where the browser has no WebMCP.\n *\n * `navigate` is read through a ref so a router that hands out a new function on\n * each render does not unregister and re-register every tool (the spec warns\n * that each change churns the agent's tool list).\n */\nexport function useWebMcpTools(): void {\n const navigate = useNavigate();\n const navigateRef = useRef(navigate);\n useEffect(() => {\n navigateRef.current = navigate;\n }, [navigate]);\n\n useEffect(\n () =>\n registerWebMcpTools(createSallaWebMcpDeps((to) => withStoreAddress(navigateRef.current)(to))),\n []\n );\n}\n","import { useWebMcpTools } from './useWebMcpTools';\n\n/**\n * Mounts the WebMCP storefront tools. Renders nothing; a component rather than a\n * call in `TwilightProvider` because it needs the router's `navigate`, which only\n * exists below the provider's navigation setup. Loaded lazily — no shopper needs\n * it to see the page.\n */\nexport default function WebMcpTools(): null {\n useWebMcpTools();\n return null;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/webmcp/page-navigation.ts","../src/webmcp/input.ts","../src/webmcp/results.ts","../src/webmcp/schema.ts","../src/webmcp/cart-tools.ts","../src/webmcp/catalog-tools.ts","../src/webmcp/page-tools.ts","../src/webmcp/tools.ts","../src/webmcp/registerWebMcpTools.ts","../src/webmcp/salla-deps.ts","../src/webmcp/useWebMcpTools.ts","../src/webmcp/WebMcpTools.tsx"],"names":["product"],"mappings":"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","file":"WebMcpTools-3MV53OMT.js","sourcesContent":["import { defaultNavigate, resolveRelativePath } from '../providers/NavigationProvider';\nimport { getTwilightContext, hasTwilightSettings } from '../twilight/context';\nimport { storePageUrl } from '../utils/baseHead';\n\ntype Navigate = (to: string) => void;\n\nconst isAbsolute = (to: string): boolean => /^[a-z][a-z\\d+.-]*:/i.test(to);\n\nfunction currentSettings() {\n return hasTwilightSettings() ? getTwilightContext().settings : undefined;\n}\n\n/**\n * Make `navigate` safe to call with either a store-relative path (`/cart`) or the\n * absolute URL the API gives a product (`https://shop.example/ar/oud/p7`).\n *\n * - The TanStack router's navigate takes the router's own paths and would append an\n * absolute URL to the current page (`/ar/cart/https:/shop…`). A same-store URL is\n * turned into its store-relative path, as the engine's link interception does; one\n * that cannot be (another origin) loads as a normal page.\n * - The default navigate (`client={false}`, the Next.js adapter) assigns\n * `window.location`, where `/cart` is the host's cart: on a shared host that is\n * another store's page, because stores live under their username. A path becomes\n * the store's own address; an absolute URL is already one.\n */\nexport function withStoreAddress(navigate: Navigate): Navigate {\n const usesWindowLocation = navigate === defaultNavigate;\n\n return (to) => {\n const settings = currentSettings();\n\n if (usesWindowLocation) {\n return navigate(isAbsolute(to) ? to : (storePageUrl(settings, to) ?? to));\n }\n if (!isAbsolute(to)) return navigate(to);\n\n const store = settings?.store;\n const path = store?.url ? resolveRelativePath(to, store.url, store.username) : null;\n return path ? navigate(path) : defaultNavigate(to);\n };\n}\n","/**\n * Input parsing for the tools. The JSON schema is only a hint to the model, so\n * every handler re-checks here and returns a message the agent can correct from.\n */\n\nexport type Parsed<T> = { ok: true; value: T } | { ok: false; error: string };\n\nconst ok = <T>(value: T): Parsed<T> => ({ ok: true, value });\nconst fail = (error: string): Parsed<never> => ({ ok: false, error });\n\n/** A positive whole number from a number or numeric string. */\nexport function parsePositiveInt(raw: unknown, field: string): Parsed<number> {\n const value = typeof raw === 'string' && raw.trim() !== '' ? Number(raw) : raw;\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 1) {\n return fail(`\"${field}\" must be a positive whole number.`);\n }\n return ok(value);\n}\n\nexport function parseQuantity(raw: unknown): Parsed<number> {\n return raw === undefined ? ok(1) : parsePositiveInt(raw, 'quantity');\n}\n\nexport function parseId(raw: unknown, field: string): Parsed<string> {\n const value = typeof raw === 'number' ? String(raw) : raw;\n if (typeof value !== 'string' || value.trim() === '') {\n return fail(`\"${field}\" is required. Get it from get-cart.`);\n }\n return ok(value.trim());\n}\n\nexport function parseKeyword(raw: unknown): Parsed<string> {\n if (typeof raw !== 'string' || raw.trim() === '') {\n return fail('\"keyword\" is required: the words to search the catalog for.');\n }\n return ok(raw.trim());\n}\n\nexport const SEARCH_LIMIT_DEFAULT = 5;\nexport const SEARCH_LIMIT_MAX = 10;\n\nexport function parseLimit(raw: unknown): number {\n if (typeof raw !== 'number' || !Number.isFinite(raw)) return SEARCH_LIMIT_DEFAULT;\n return Math.min(SEARCH_LIMIT_MAX, Math.max(1, Math.trunc(raw)));\n}\n","import type { WebMcpToolResult } from './types';\n\n/** A successful result: the payload as JSON text, which is what agents read best. */\nexport function jsonResult(payload: unknown): WebMcpToolResult {\n return { content: [{ type: 'text', text: JSON.stringify(payload) }] };\n}\n\n/** A failed result with a message the agent can act on. Handlers never throw. */\nexport function errorResult(message: string): WebMcpToolResult {\n return { content: [{ type: 'text', text: message }], isError: true };\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error && error.message ? error.message : 'Unknown error';\n}\n\n/** Run `action`, turning anything it throws into an error result. */\nexport async function guarded(\n label: string,\n action: () => Promise<WebMcpToolResult>\n): Promise<WebMcpToolResult> {\n try {\n return await action();\n } catch (error) {\n return errorResult(`${label} failed: ${errorMessage(error)}`);\n }\n}\n","/** JSON Schema pieces shared by several tools. */\n\nexport const PRODUCT_ID_SCHEMA = {\n type: 'number',\n description: 'Product id, from search-products.',\n} as const;\n\nexport const ITEM_ID_SCHEMA = {\n type: 'string',\n description: 'Cart line id (the \"id\" of an item in get-cart), not the product id.',\n} as const;\n\nexport const QUANTITY_SCHEMA = {\n type: 'number',\n description: 'Whole number of units. Defaults to 1.',\n} as const;\n","import { parseId, parsePositiveInt, parseQuantity } from './input';\nimport { errorResult, guarded, jsonResult } from './results';\nimport { ITEM_ID_SCHEMA, PRODUCT_ID_SCHEMA, QUANTITY_SCHEMA } from './schema';\nimport type { WebMcpDeps, WebMcpTool } from './types';\n\nfunction getCartTool(deps: WebMcpDeps): WebMcpTool {\n return {\n name: 'get-cart',\n description:\n \"Read the shopper's current cart: items (with the line ids needed to change them), count and total. The cart is null when it is empty.\",\n inputSchema: { type: 'object', properties: {} },\n execute: () =>\n guarded('Reading the cart', async () => jsonResult({ cart: await deps.getCart() })),\n };\n}\n\nfunction addToCartTool(deps: WebMcpDeps): WebMcpTool {\n return {\n name: 'add-to-cart',\n description:\n \"Add a product to the shopper's cart and return the updated cart. Only works for products with no required options; for those, use open-page to send the shopper to the product page. Does not check out.\",\n inputSchema: {\n type: 'object',\n properties: { productId: PRODUCT_ID_SCHEMA, quantity: QUANTITY_SCHEMA },\n required: ['productId'],\n },\n execute: (input) =>\n guarded('Adding to the cart', async () => {\n const id = parsePositiveInt(input.productId, 'productId');\n if (!id.ok) return errorResult(id.error);\n const quantity = parseQuantity(input.quantity);\n if (!quantity.ok) return errorResult(quantity.error);\n\n const product = await deps.getProduct(id.value);\n if (!product.inStock) {\n return errorResult(`\"${product.name}\" is out of stock or unavailable.`);\n }\n if (product.needsProductPage === true) {\n return errorResult(\n `\"${product.name}\" needs choices made first (options, a variant, an amount…). Use open-page with page \"product\" and productId ${product.id} (${product.url}) so the shopper can pick them.`\n );\n }\n return jsonResult({ cart: await deps.addToCart(id.value, quantity.value) });\n }),\n };\n}\n\nfunction updateCartItemTool(deps: WebMcpDeps): WebMcpTool {\n return {\n name: 'update-cart-item',\n description:\n 'Change the quantity of a line already in the cart (use get-cart for the line id). Returns the updated cart.',\n inputSchema: {\n type: 'object',\n properties: {\n itemId: ITEM_ID_SCHEMA,\n quantity: { ...QUANTITY_SCHEMA, description: 'New quantity.' },\n },\n required: ['itemId', 'quantity'],\n },\n execute: (input) =>\n guarded('Updating the cart', async () => {\n const itemId = parseId(input.itemId, 'itemId');\n if (!itemId.ok) return errorResult(itemId.error);\n const quantity = parsePositiveInt(input.quantity, 'quantity');\n if (!quantity.ok) return errorResult(quantity.error);\n return jsonResult({ cart: await deps.updateCartItem(itemId.value, quantity.value) });\n }),\n };\n}\n\nfunction removeCartItemTool(deps: WebMcpDeps): WebMcpTool {\n return {\n name: 'remove-cart-item',\n description:\n 'Remove a line from the cart (use get-cart for the line id). Returns the updated cart.',\n inputSchema: {\n type: 'object',\n properties: { itemId: ITEM_ID_SCHEMA },\n required: ['itemId'],\n },\n execute: (input) =>\n guarded('Removing from the cart', async () => {\n const itemId = parseId(input.itemId, 'itemId');\n if (!itemId.ok) return errorResult(itemId.error);\n return jsonResult({ cart: await deps.removeCartItem(itemId.value) });\n }),\n };\n}\n\nexport function createCartTools(deps: WebMcpDeps): WebMcpTool[] {\n return [\n getCartTool(deps),\n addToCartTool(deps),\n updateCartItemTool(deps),\n removeCartItemTool(deps),\n ];\n}\n","import { parseKeyword, parseLimit, parsePositiveInt, SEARCH_LIMIT_MAX } from './input';\nimport { errorResult, guarded, jsonResult } from './results';\nimport { PRODUCT_ID_SCHEMA } from './schema';\nimport type { WebMcpDeps, WebMcpTool } from './types';\n\nfunction searchProductsTool(deps: WebMcpDeps): WebMcpTool {\n return {\n name: 'search-products',\n description:\n \"Search this store's catalog by keyword. Returns up to a few matching products with id, name, price, stock and page URL. Use it to find a product before reading details or adding it to the cart.\",\n inputSchema: {\n type: 'object',\n properties: {\n keyword: { type: 'string', description: 'Words to search for, e.g. \"oud perfume\".' },\n limit: {\n type: 'number',\n description: `How many products to return (1-${SEARCH_LIMIT_MAX}). Defaults to 5.`,\n },\n },\n required: ['keyword'],\n },\n execute: (input) =>\n guarded('Product search', async () => {\n const keyword = parseKeyword(input.keyword);\n if (!keyword.ok) return errorResult(keyword.error);\n const products = await deps.searchProducts(keyword.value, parseLimit(input.limit));\n return jsonResult({ products });\n }),\n };\n}\n\nfunction getProductTool(deps: WebMcpDeps): WebMcpTool {\n return {\n name: 'get-product',\n description:\n 'Get one product by id: price, sale state, stock, and whether the shopper must pick options (size, color…) on the product page first.',\n inputSchema: {\n type: 'object',\n properties: { productId: PRODUCT_ID_SCHEMA },\n required: ['productId'],\n },\n execute: (input) =>\n guarded('Loading the product', async () => {\n const id = parsePositiveInt(input.productId, 'productId');\n if (!id.ok) return errorResult(id.error);\n return jsonResult({ product: await deps.getProduct(id.value) });\n }),\n };\n}\n\nexport function createCatalogTools(deps: WebMcpDeps): WebMcpTool[] {\n return [searchProductsTool(deps), getProductTool(deps)];\n}\n","import { parsePositiveInt } from './input';\nimport { errorResult, guarded, jsonResult } from './results';\nimport { PRODUCT_ID_SCHEMA } from './schema';\nimport type { WebMcpDeps, WebMcpTool } from './types';\n\nfunction openPageTool(deps: WebMcpDeps): WebMcpTool {\n return {\n name: 'open-page',\n description:\n 'Navigate the shopper\\'s visible page to the cart, the home page, or a product page. Use \"cart\" to let the shopper review and check out themselves; checkout is never done by a tool.',\n inputSchema: {\n type: 'object',\n properties: {\n page: { type: 'string', enum: ['cart', 'home', 'product'] },\n productId: { ...PRODUCT_ID_SCHEMA, description: 'Required when page is \"product\".' },\n },\n required: ['page'],\n },\n execute: (input) =>\n guarded('Opening the page', async () => {\n if (input.page === 'cart') {\n deps.openPage('/cart');\n return jsonResult({ opened: 'cart' });\n }\n if (input.page === 'home') {\n deps.openPage('/');\n return jsonResult({ opened: 'home' });\n }\n if (input.page === 'product') {\n const id = parsePositiveInt(input.productId, 'productId');\n if (!id.ok) return errorResult(id.error);\n const product = await deps.getProduct(id.value);\n deps.openPage(product.url);\n return jsonResult({ opened: product.url });\n }\n return errorResult('\"page\" must be one of: cart, home, product.');\n }),\n };\n}\n\nexport function createPageTools(deps: WebMcpDeps): WebMcpTool[] {\n return [openPageTool(deps)];\n}\n","import { createCartTools } from './cart-tools';\nimport { createCatalogTools } from './catalog-tools';\nimport { createPageTools } from './page-tools';\nimport type { WebMcpDeps, WebMcpTool } from './types';\n\n/**\n * The storefront tools. Deliberately small — every tool costs the agent context\n * (see the spec's \"tool budget\") — and none of them places an order or pays: the\n * shopper finishes checkout on the page.\n */\nexport function createWebMcpTools(deps: WebMcpDeps): WebMcpTool[] {\n return [...createCatalogTools(deps), ...createCartTools(deps), ...createPageTools(deps)];\n}\n","import { getModelContext } from './model-context';\nimport { createWebMcpTools } from './tools';\nimport type { WebMcpDeps } from './types';\n\nconst NOT_ALLOWED = 'NotAllowedError';\n\nfunction reportRegistrationFailure(toolName: string, error: unknown): void {\n // The page's Permissions-Policy (or an iframe without `allow`) can switch tools\n // off. That is a choice, not a fault, so it stays quiet.\n if (error instanceof DOMException && error.name === NOT_ALLOWED) return;\n console.warn('[twilight] WebMCP could not register tool:', toolName, error);\n}\n\n/**\n * Register the storefront tools with the browser's WebMCP, if it has one.\n *\n * A no-op everywhere else. Returns a dispose that unregisters every tool (they\n * share one `AbortSignal`, which is how the spec unregisters a tool).\n */\nexport function registerWebMcpTools(deps: WebMcpDeps): () => void {\n const modelContext = getModelContext();\n if (!modelContext) return () => {};\n\n const controller = new AbortController();\n for (const tool of createWebMcpTools(deps)) {\n try {\n Promise.resolve(modelContext.registerTool(tool, { signal: controller.signal })).catch(\n (error: unknown) => reportRegistrationFailure(tool.name, error)\n );\n } catch (error) {\n reportRegistrationFailure(tool.name, error);\n }\n }\n return () => controller.abort();\n}\n","import { product as productApi } from '../api/product';\nimport type { Money, Product } from '../types';\nimport type { SallaCartDetailsData, SallaSDK } from '../types/salla-sdk';\nimport { whenSallaReady } from '../utils/sdk-helpers';\nimport type { WebMcpCartSummary, WebMcpDeps, WebMcpProductSummary } from './types';\n\n/** How long a tool waits for the Salla SDK before telling the agent to retry. */\nconst SDK_WAIT_MS = 8_000;\n\n/** Product types a plain \"add one\" call can buy; the rest need input from the shopper. */\nconst SIMPLE_TYPES: ReadonlySet<string> = new Set(['product', 'digital']);\n\nfunction sdkReady(): Promise<SallaSDK> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n cancel();\n reject(new Error('The store is not ready yet. Try again in a moment.'));\n }, SDK_WAIT_MS);\n const cancel = whenSallaReady((sdk) => {\n clearTimeout(timer);\n resolve(sdk);\n });\n });\n}\n\n/** Prices arrive as numbers, `{ amount }` objects or formatted text (\"1,200.50 SAR\"). */\nfunction toAmount(value: unknown): number {\n if (typeof value === 'number') return value;\n if (value && typeof value === 'object' && 'amount' in value) {\n return toAmount((value as Money).amount);\n }\n if (typeof value === 'string') {\n const parsed = Number.parseFloat(value.replace(/,/g, '').replace(/[^\\d.-]/g, ''));\n return Number.isFinite(parsed) ? parsed : 0;\n }\n return 0;\n}\n\n/**\n * Whether the product needs choices made on its page. A details response lists the\n * options and variants, so it can say no; a list response does not, so it can only\n * say yes (a non-plain type, or `has_options`) and otherwise leaves the answer open.\n */\nfunction needsProductPage(p: Product, detailed: boolean): boolean | undefined {\n if (!SIMPLE_TYPES.has(p.type)) return true;\n if ((p.options ?? []).some((option) => option.required)) return true;\n if ((p.skus ?? []).length > 0) return true;\n if (detailed) return false;\n return p.has_options === true ? true : undefined;\n}\n\nfunction toProductSummary(p: Product, detailed: boolean): WebMcpProductSummary {\n const onSale = p.is_on_sale === true;\n const needs = needsProductPage(p, detailed);\n\n return {\n id: Number(p.id),\n name: p.name,\n url: p.url,\n price: toAmount(onSale && p.sale_price ? p.sale_price : p.price),\n ...(onSale ? { regularPrice: toAmount(p.regular_price) } : {}),\n currency: p.currency,\n onSale,\n inStock: p.status !== 'out' && p.status !== 'out-and-notify' && p.is_available !== false,\n ...(needs === undefined ? {} : { needsProductPage: needs }),\n };\n}\n\nfunction toCartSummary(cart: SallaCartDetailsData, currency: string): WebMcpCartSummary {\n return {\n id: cart.id,\n count: cart.count,\n total: toAmount(cart.total),\n currency,\n coupon: cart.coupon ?? null,\n items: (cart.items ?? []).map((item) => ({\n id: String(item.id),\n productId: item.product_id,\n name: item.product_name,\n quantity: item.quantity,\n total: toAmount(item.total),\n })),\n };\n}\n\nasync function readCart(sdk: SallaSDK): Promise<WebMcpCartSummary | null> {\n const cartId = await sdk.cart.api.getCurrentCartId();\n if (!cartId) return null;\n const response = await sdk.api.cart.details(cartId, ['items']);\n // A cart already turned into an order answers with a redirect and no `cart`.\n const cart = response?.data?.cart;\n return cart ? toCartSummary(cart, sdk.config.currency()?.code ?? '') : null;\n}\n\n/**\n * The real tool dependencies: the engine's product API for the catalog, and the\n * Salla SDK for the cart. Cart changes go through `salla.cart.*`, the same calls\n * the UI buttons use, so the cart badge, drawer and toasts update as they would\n * for a click — the shopper and the agent share one visible cart.\n */\nexport function createSallaWebMcpDeps(navigate: (to: string) => void): WebMcpDeps {\n const mutateThenRead = async (\n change: (sdk: SallaSDK) => Promise<unknown>\n ): Promise<WebMcpCartSummary | null> => {\n const sdk = await sdkReady();\n await change(sdk);\n return readCart(sdk);\n };\n\n return {\n searchProducts: async (keyword, limit) => {\n const { items } = await productApi.list({ source: 'search', keyword, perPage: limit });\n return items.map((item) => toProductSummary(item, false));\n },\n getProduct: async (productId) =>\n toProductSummary(await productApi.find(String(productId)), true),\n getCart: async () => readCart(await sdkReady()),\n addToCart: (productId, quantity) =>\n mutateThenRead((sdk) => sdk.cart.addItem({ id: productId, quantity })),\n updateCartItem: (itemId, quantity) =>\n mutateThenRead((sdk) => sdk.cart.updateItem({ id: itemId, quantity })),\n removeCartItem: (itemId) => mutateThenRead((sdk) => sdk.cart.deleteItem(itemId)),\n openPage: navigate,\n };\n}\n","import { useEffect, useRef } from 'react';\nimport { useNavigate } from '../providers/NavigationProvider';\nimport { withStoreAddress } from './page-navigation';\nimport { registerWebMcpTools } from './registerWebMcpTools';\nimport { createSallaWebMcpDeps } from './salla-deps';\n\n/**\n * Expose the storefront to in-browser AI agents through WebMCP for as long as the\n * calling component is mounted. Does nothing where the browser has no WebMCP.\n *\n * `navigate` is read through a ref so a router that hands out a new function on\n * each render does not unregister and re-register every tool (the spec warns\n * that each change churns the agent's tool list).\n */\nexport function useWebMcpTools(): void {\n const navigate = useNavigate();\n const navigateRef = useRef(navigate);\n useEffect(() => {\n navigateRef.current = navigate;\n }, [navigate]);\n\n useEffect(\n () =>\n registerWebMcpTools(createSallaWebMcpDeps((to) => withStoreAddress(navigateRef.current)(to))),\n []\n );\n}\n","import { useWebMcpTools } from './useWebMcpTools';\n\n/**\n * Mounts the WebMCP storefront tools. Renders nothing; a component rather than a\n * call in `TwilightProvider` because it needs the router's `navigate`, which only\n * exists below the provider's navigation setup. Loaded lazily — no shopper needs\n * it to see the page.\n */\nexport default function WebMcpTools(): null {\n useWebMcpTools();\n return null;\n}\n"]}
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
import { wishlist } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import { useMoney } from './chunk-
|
|
1
|
+
import { wishlist } from './chunk-VQO4TTPE.js';
|
|
2
|
+
import './chunk-7PPNAVBF.js';
|
|
3
|
+
import { useMoney } from './chunk-BKSVKSAW.js';
|
|
4
4
|
import './chunk-Q77J3D2W.js';
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
5
|
+
import './chunk-F7S2QA3D.js';
|
|
6
|
+
import './chunk-PCYZMJUC.js';
|
|
7
|
+
import './chunk-5V4W3GBI.js';
|
|
8
8
|
import './chunk-X55R4VVK.js';
|
|
9
9
|
import './chunk-YL6X3ZMG.js';
|
|
10
|
-
import './chunk-
|
|
10
|
+
import './chunk-YEBA44IV.js';
|
|
11
11
|
import './chunk-OXMUPNMH.js';
|
|
12
|
-
import './chunk-
|
|
12
|
+
import './chunk-5EN3XZ32.js';
|
|
13
13
|
import './chunk-VVZNW5CB.js';
|
|
14
|
-
import './chunk-
|
|
14
|
+
import './chunk-EGI7F57E.js';
|
|
15
15
|
import './chunk-GD26FI4J.js';
|
|
16
|
-
import './chunk-
|
|
17
|
-
import './chunk-
|
|
18
|
-
import { useLocation } from './chunk-
|
|
16
|
+
import './chunk-SLBO4SEE.js';
|
|
17
|
+
import './chunk-MGG4XAJ5.js';
|
|
18
|
+
import { useLocation } from './chunk-VEVFVWF3.js';
|
|
19
19
|
import './chunk-OUW6WESU.js';
|
|
20
|
-
import './chunk-
|
|
20
|
+
import './chunk-IHOUADLX.js';
|
|
21
21
|
import './chunk-HI5V5X3S.js';
|
|
22
|
-
import './chunk-
|
|
23
|
-
import './chunk-
|
|
22
|
+
import './chunk-3O6BB7SI.js';
|
|
23
|
+
import './chunk-A4Y5BVJN.js';
|
|
24
24
|
import './chunk-MVT5AF2A.js';
|
|
25
25
|
import './chunk-Z653O7MX.js';
|
|
26
26
|
import './chunk-ZCH7W7DZ.js';
|
|
27
|
-
import './chunk-
|
|
27
|
+
import './chunk-H7LRGY7U.js';
|
|
28
28
|
import './chunk-JWXJPJBO.js';
|
|
29
29
|
import './chunk-CW625T2E.js';
|
|
30
30
|
import './chunk-7V36I5GT.js';
|
|
31
31
|
import './chunk-6WI7R2BD.js';
|
|
32
|
-
import { useWishlist } from './chunk-
|
|
32
|
+
import { useWishlist } from './chunk-M5WTY3EH.js';
|
|
33
33
|
import './chunk-OAMIDZKW.js';
|
|
34
|
-
import './chunk-
|
|
34
|
+
import './chunk-YDRURQ2W.js';
|
|
35
35
|
import './chunk-OQIIJRAS.js';
|
|
36
36
|
import './chunk-V2ZDTY6H.js';
|
|
37
|
-
import './chunk-
|
|
37
|
+
import './chunk-VDY3VY7S.js';
|
|
38
38
|
import { HookSlot } from './chunk-5XDPAKF5.js';
|
|
39
39
|
import './chunk-GCPEMNSU.js';
|
|
40
|
-
import './chunk-
|
|
40
|
+
import './chunk-2DUN6DZK.js';
|
|
41
41
|
import './chunk-Z5M4YYWT.js';
|
|
42
42
|
import { useTranslation } from './chunk-TYNZ5B2B.js';
|
|
43
|
-
import { LazyNoContent, Image } from './chunk-
|
|
43
|
+
import { LazyNoContent, Image } from './chunk-FTH3XLIN.js';
|
|
44
44
|
import './chunk-AXW67SY7.js';
|
|
45
45
|
import './chunk-BYMOPN2S.js';
|
|
46
46
|
import './chunk-SKLEJJ6M.js';
|
|
@@ -48,10 +48,10 @@ import './chunk-6BZ5TKEV.js';
|
|
|
48
48
|
import './chunk-FZKRSGLP.js';
|
|
49
49
|
import './chunk-KYMWEUN2.js';
|
|
50
50
|
import './chunk-YA6ABQB7.js';
|
|
51
|
-
import './chunk-
|
|
52
|
-
import './chunk-
|
|
53
|
-
import { onSallaEvent } from './chunk-
|
|
54
|
-
import './chunk-
|
|
51
|
+
import './chunk-QMWP2ZP6.js';
|
|
52
|
+
import './chunk-6TFM3UTF.js';
|
|
53
|
+
import { onSallaEvent } from './chunk-XMRNYUQY.js';
|
|
54
|
+
import './chunk-T2752RH7.js';
|
|
55
55
|
import './chunk-6K34BCUP.js';
|
|
56
56
|
import './chunk-T72DAX7R.js';
|
|
57
57
|
import './chunk-DF6FBKDN.js';
|
|
@@ -502,5 +502,5 @@ function WishlistPage(props) {
|
|
|
502
502
|
}
|
|
503
503
|
|
|
504
504
|
export { WishlistPage };
|
|
505
|
-
//# sourceMappingURL=WishlistPage-
|
|
506
|
-
//# sourceMappingURL=WishlistPage-
|
|
505
|
+
//# sourceMappingURL=WishlistPage-HHX3OVOF.js.map
|
|
506
|
+
//# sourceMappingURL=WishlistPage-HHX3OVOF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/routes/account/wishlist/WishlistShare.tsx","../src/routes/account/wishlist/WishlistPage.tsx"],"names":["SallaSocialShare","useEffect","jsxs","jsx","SallaButton","useRef","useState","useCallback","items"],"mappings":"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","file":"WishlistPage-IGWDG4HC.js","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\n// The eager (non-deferred) export: the share dialog is opened imperatively through a ref, and the\n// deferred wrapper doesn't attach it until it has hydrated — a click before that would do nothing.\nimport { SallaSocialShareCore as SallaSocialShare } from '@salla.sa/twilight-components-react/social-share';\nimport { useTranslation } from '../../../providers/I18nProvider';\n\ntype ShareResponse = { data?: { url?: string }; url?: string } | undefined;\ntype SocialShareElement = HTMLElement & {\n url?: string;\n refresh?: () => Promise<void>;\n open?: () => Promise<void>;\n close?: () => Promise<void>;\n};\n\n/**\n * Share state for the wishlist page: the \"Share\" dropdown (share the whole list / share\n * specific items), the selection used by \"specific items\", and the share request itself.\n * Mirrors what the SDK's `<salla-wishlist-actions>` does, but drives the page's own React\n * list — that component needs a sibling `<salla-products-list>`, which this page doesn't render.\n */\nexport function useWishlistShare() {\n const [menuOpen, setMenuOpen] = useState(false);\n const [selecting, setSelecting] = useState(false);\n const [selectedIds, setSelectedIds] = useState<number[]>([]);\n const [sharing, setSharing] = useState(false);\n const [shareUrl, setShareUrl] = useState('');\n /** Ids of every product currently rendered (later cursor pages included), for \"select all\". */\n const loadedIdsRef = useRef<number[]>([]);\n const socialShareRef = useRef<SocialShareElement | null>(null);\n\n const share = useCallback(async (ids: number[], selectAll: boolean) => {\n if (!window.salla?.wishlist?.share) return;\n setSharing(true);\n try {\n const response = (await window.salla.wishlist.share(ids, selectAll)) as ShareResponse;\n const url = response?.data?.url || response?.url || '';\n if (!url) return;\n setShareUrl(url);\n const element = socialShareRef.current;\n if (element) {\n element.url = url;\n await element.refresh?.();\n await element.open?.();\n }\n } catch {\n // The SDK reports a failed share itself (notification); nothing to recover here.\n } finally {\n setSharing(false);\n }\n }, []);\n\n const shareAll = useCallback(() => {\n setMenuOpen(false);\n void share([], true);\n }, [share]);\n\n const shareSelected = useCallback(() => {\n if (selectedIds.length) void share(selectedIds, false);\n }, [share, selectedIds]);\n\n const startSelecting = useCallback(() => {\n setMenuOpen(false);\n setSelecting(true);\n }, []);\n\n const cancelSelecting = useCallback(() => {\n setSelecting(false);\n setSelectedIds([]);\n setShareUrl('');\n void socialShareRef.current?.close?.();\n }, []);\n\n const toggleSelected = useCallback((id: number) => {\n setShareUrl('');\n setSelectedIds((current) =>\n current.includes(id) ? current.filter((existing) => existing !== id) : [...current, id]\n );\n }, []);\n\n const selectedIdsRef = useRef(selectedIds);\n useEffect(() => {\n selectedIdsRef.current = selectedIds;\n }, [selectedIds]);\n\n const deselect = useCallback((id: number) => {\n if (!selectedIdsRef.current.includes(id)) return;\n // A link built for the old selection would still offer the removed product.\n setShareUrl('');\n const element = socialShareRef.current;\n if (element) {\n element.url = undefined;\n void element.close?.();\n }\n setSelectedIds((current) => current.filter((existing) => existing !== id));\n }, []);\n\n const toggleAll = useCallback(() => {\n setShareUrl('');\n setSelectedIds((current) =>\n current.length && current.length === loadedIdsRef.current.length\n ? []\n : [...loadedIdsRef.current]\n );\n }, []);\n\n return {\n menuOpen,\n setMenuOpen,\n selecting,\n selectedIds,\n sharing,\n shareUrl,\n loadedIdsRef,\n socialShareRef,\n shareAll,\n shareSelected,\n startSelecting,\n cancelSelecting,\n toggleSelected,\n toggleAll,\n deselect,\n };\n}\n\nexport type WishlistShareState = ReturnType<typeof useWishlistShare>;\n\n/** The bar above the wishlist: the \"Share\" dropdown, or — while picking products — the selection controls. */\nexport function WishlistShareBar({\n state,\n hasProducts,\n}: {\n state: WishlistShareState;\n hasProducts: boolean;\n}) {\n const { t } = useTranslation();\n const rootRef = useRef<HTMLDivElement>(null);\n const { menuOpen, setMenuOpen } = state;\n\n // Close the dropdown on an outside click or Escape.\n useEffect(() => {\n if (!menuOpen) return;\n const onPointerDown = (event: MouseEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setMenuOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setMenuOpen(false);\n };\n document.addEventListener('mousedown', onPointerDown);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('mousedown', onPointerDown);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [menuOpen, setMenuOpen]);\n\n const selectedCount = state.selectedIds.length;\n const allSelected = selectedCount > 0 && selectedCount === state.loadedIdsRef.current.length;\n\n return (\n <div ref={rootRef} className=\"s-wishlist-actions\">\n <div className=\"s-wishlist-actions-bar flex items-center justify-end gap-3 mb-3\">\n {state.selecting ? (\n <div className=\"s-wishlist-actions-selection flex items-center gap-3\">\n <label className=\"s-wishlist-actions-select-all inline-flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={allSelected}\n ref={(input) => {\n if (input) input.indeterminate = selectedCount > 0 && !allSelected;\n }}\n onChange={state.toggleAll}\n />\n {t('pages.wishlist.select_all', 'Select all')}\n </label>\n <SallaButton\n color=\"primary\"\n disabled={selectedCount === 0 || state.sharing}\n onClick={state.shareSelected}\n >\n {t('pages.wishlist.share', 'Share')}\n {selectedCount > 0 ? ` (${selectedCount})` : ''}\n </SallaButton>\n <SallaButton fill=\"outline\" color=\"light\" onClick={state.cancelSelecting}>\n {t('common.elements.cancel', 'Cancel')}\n </SallaButton>\n </div>\n ) : (\n <div className=\"s-wishlist-actions-dropdown relative\">\n <SallaButton\n color=\"primary\"\n fill=\"outline\"\n disabled={!hasProducts || state.sharing}\n aria-haspopup=\"true\"\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen(!menuOpen)}\n >\n <span className=\"flex items-center justify-center gap-2\">\n <i className=\"sicon-share-alt\" aria-hidden=\"true\" />\n {t('pages.wishlist.share', 'Share')}\n <i className=\"sicon-keyboard_arrow_down\" aria-hidden=\"true\" />\n </span>\n </SallaButton>\n {menuOpen && (\n <ul\n role=\"menu\"\n className=\"s-wishlist-actions-menu absolute z-10 mt-2 min-w-48 rounded-md bg-white py-2 shadow-default rtl:right-0 ltr:left-0\"\n >\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"s-wishlist-actions-item block w-full px-4 py-2 text-start text-sm text-gray-700 hover:bg-gray-50\"\n onClick={state.shareAll}\n >\n {t('pages.wishlist.share_all', 'Share the list')}\n </button>\n </li>\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"s-wishlist-actions-item block w-full px-4 py-2 text-start text-sm text-gray-700 hover:bg-gray-50\"\n onClick={state.startSelecting}\n >\n {t('pages.wishlist.share_specific', 'Share specific items')}\n </button>\n </li>\n </ul>\n )}\n </div>\n )}\n </div>\n {/* Same setup as the SDK's <salla-wishlist-actions>: the centered modal variant, opened by the\n dropdown rather than by the component's own round share button, so the default\n `widget` slot (that button) is replaced by an empty anchor. */}\n <SallaSocialShare\n ref={state.socialShareRef as never}\n url={state.shareUrl || undefined}\n mode=\"modal\"\n modalTitle={t('pages.wishlist.share_list_title', 'Share wishlist')}\n className=\"s-wishlist-actions-social\"\n >\n <span slot=\"widget\" className=\"s-wishlist-actions-social-anchor\" aria-hidden=\"true\" />\n </SallaSocialShare>\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type CSSProperties } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { ItemsList } from '@salla.sa/twilight-components-react';\nimport { SallaAddProductButton } from '@salla.sa/twilight-components-react/add-product-button';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { wishlist } from '../../../api/wishlist';\nimport type { Product } from '../../../types';\nimport { HookSlot, useWishlist, useMoney } from '../../../hooks';\nimport { useTranslation } from '../../../providers/I18nProvider';\nimport type { WishlistPageProps } from './types';\nimport { WishlistShareBar, useWishlistShare } from './WishlistShare';\nimport { NoContent, Image } from '../../../components/common';\nimport { useLocation } from '../../../providers/NavigationProvider';\nimport { onSallaEvent } from '../../../utils/sdk-helpers';\n\ninterface WishlistCardSelection {\n /** \"Share specific items\" mode: the card shows a checkbox and toggles on click. */\n selecting: boolean;\n selected: boolean;\n onToggle: (id: number) => void;\n}\n\n// The loaded component copies host attributes (not properties) onto its inner salla-button.\nconst setAddButtonAttributes = (el: HTMLElement | null) => {\n el?.setAttribute('loader-position', 'center');\n el?.setAttribute('fill', 'outline');\n};\n\nconst REMOVING_MS = 300;\n\nconst REMOVING_STYLE: CSSProperties = {\n opacity: 0,\n transform: 'scale(0.95)',\n transition: `opacity ${REMOVING_MS}ms ease-in-out, transform ${REMOVING_MS}ms ease-in-out`,\n};\n\nfunction WishlistCard({\n product: prod,\n selection,\n removing,\n onRemoved,\n}: {\n product: Product;\n selection?: WishlistCardSelection;\n /** Fades the card out, then calls `onRemoved` once the fade ends. */\n removing?: boolean;\n onRemoved?: (id: number) => void;\n}) {\n const { remove } = useWishlist();\n const { format } = useMoney();\n\n // Drops the card even when `transitionend` never fires (hidden tab, overridden styles).\n useEffect(() => {\n if (!removing) return;\n const timer = setTimeout(() => onRemoved?.(Number(prod.id)), REMOVING_MS + 50);\n return () => clearTimeout(timer);\n }, [removing, onRemoved, prod.id]);\n\n const handleRemove = () => {\n if (prod.id) {\n remove(Number(prod.id));\n }\n };\n\n const displayPrice = prod.sale_price ?? prod.price;\n const regularPrice = prod.regular_price;\n\n return (\n <div\n id={`wishlist-product-${prod.id}`}\n className={`product-entry product-entry--wishlist${selection?.selected ? ' is-selected' : ''}`}\n style={removing ? REMOVING_STYLE : undefined}\n onTransitionEnd={(event) => {\n if (removing && event.target === event.currentTarget && event.propertyName === 'opacity') {\n onRemoved?.(Number(prod.id));\n }\n }}\n >\n {selection?.selecting && (\n <input\n type=\"checkbox\"\n className=\"s-wishlist-select shrink-0 rtl:ml-4 ltr:mr-4\"\n aria-label={prod.name}\n checked={selection.selected}\n onChange={() => selection.onToggle(Number(prod.id))}\n />\n )}\n <div className=\"flex items-center mb-4 sm:mb-0\">\n <a href={prod.url} className=\"product-entry__image\">\n <Image\n className=\"object-cover w-full h-full\"\n src={prod.image?.url}\n alt={prod.image?.alt ?? prod.name}\n aspectRatio=\"1/1\"\n />\n </a>\n <div className=\"flex-1 rtl:pr-5 ltr:pl-5\">\n <h3 className=\"text-sm text-gray-800 leading-6 mb-1.5 rtl:pl-5 ltr:pr-5 rtl:md:pl-8 ltr:md:pr-8 line-clamp-1\">\n <a href={prod.url}>{prod.name}</a>\n </h3>\n <div className=\"w-full center-between\">\n {prod.is_on_sale && regularPrice ? (\n <div className=\"space-x-1 rtl:space-x-reverse\">\n <h4 className=\"inline-block text-sm font-bold text-red-400\">\n {format(displayPrice)}\n </h4>\n <span className=\"text-sm text-gray-500 line-through\">{format(regularPrice)}</span>\n </div>\n ) : (\n <h4 className=\"text-sm font-bold\">{format(displayPrice)}</h4>\n )}\n </div>\n </div>\n </div>\n <div className=\"flex items-center space-x-4 rtl:space-x-reverse\">\n <SallaAddProductButton\n ref={setAddButtonAttributes}\n productStatus={prod.status}\n productId={prod.id}\n productType={prod.type}\n fill=\"outline\"\n className=\"flex-grow w-full sm:grow-0 md:w-40\"\n />\n <SallaButton\n loaderPosition=\"center\"\n shape=\"icon\"\n size=\"small\"\n color=\"danger\"\n className=\"btn--delete\"\n onClick={handleRemove}\n >\n <i className=\"sicon-cancel\" />\n </SallaButton>\n </div>\n </div>\n );\n}\n\n/** The loaded wishlist pages, reloaded from the server once every loaded card is removed (like Twig). */\nfunction useWishlistItems(\n { query, products, pagination }: WishlistPageProps,\n onRemoved: (id: number) => void\n) {\n const queryClient = useQueryClient();\n // Track the next page to load (starts at page 2 since page 1 is SSR)\n const nextPageRef = useRef(query.page + 1);\n const [removedIds, setRemovedIds] = useState<ReadonlySet<number>>(() => new Set());\n const [removingIds, setRemovingIds] = useState<ReadonlySet<number>>(() => new Set());\n const [reloaded, setReloaded] = useState<{\n items: Product[];\n next: string | null;\n generation: number;\n } | null>(null);\n const loadedRef = useRef({\n ids: products.map((prod) => Number(prod.id)),\n hasMore: !!pagination?.next,\n });\n\n // A `?page=` navigation keeps this instance, so drop what the previous page removed or reloaded.\n const [loadedProducts, setLoadedProducts] = useState(products);\n if (loadedProducts !== products) {\n setLoadedProducts(products);\n setRemovedIds(new Set());\n setRemovingIds(new Set());\n setReloaded(null);\n }\n\n useEffect(() => {\n nextPageRef.current = query.page + 1;\n loadedRef.current = {\n ids: products.map((prod) => Number(prod.id)),\n hasMore: !!pagination?.next,\n };\n }, [products, query.page, pagination?.next]);\n\n useEffect(() => {\n const handleRemoved = (_response: unknown, id: unknown) => {\n const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n (reduceMotion ? setRemovedIds : setRemovingIds)((current) =>\n new Set(current).add(Number(id))\n );\n onRemoved(Number(id));\n };\n\n return onSallaEvent('wishlist::removed', handleRemoved);\n }, [onRemoved]);\n\n useEffect(() => {\n const { ids, hasMore } = loadedRef.current;\n if (!ids.length || !ids.every((id) => removedIds.has(id))) return;\n\n const reset = (items: Product[], next: string | null) => {\n nextPageRef.current = query.page + 1;\n loadedRef.current = { ids: items.map((prod) => Number(prod.id)), hasMore: !!next };\n setRemovedIds(new Set());\n setRemovingIds(new Set());\n setReloaded((current) => ({ items, next, generation: (current?.generation ?? 0) + 1 }));\n };\n\n if (!hasMore) {\n reset([], null);\n return;\n }\n\n let cancelled = false;\n queryClient\n .fetchQuery({ ...wishlist.queries.list({ page: query.page }), staleTime: 0 })\n .then((result) => {\n if (!cancelled) reset(result.items, result.next);\n })\n // A failed reload keeps the list as it is; later pages still load on scroll.\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [removedIds, query.page, products, queryClient]);\n\n const loader = async () => {\n const pageToLoad = nextPageRef.current;\n const result = await wishlist.list({ page: pageToLoad });\n\n nextPageRef.current = pageToLoad + 1;\n loadedRef.current = {\n ids: [...loadedRef.current.ids, ...result.items.map((prod) => Number(prod.id))],\n hasMore: !!result.next,\n };\n\n return {\n items: result.items,\n next: result.next,\n };\n };\n\n const finishRemoving = useCallback((id: number) => {\n setRemovedIds((current) => (current.has(id) ? current : new Set(current).add(id)));\n }, []);\n\n return {\n items: reloaded ? reloaded.items : products,\n next: reloaded ? reloaded.next : pagination?.next,\n generation: reloaded?.generation ?? 0,\n removedIds,\n removingIds,\n finishRemoving,\n loader,\n };\n}\n\nexport function WishlistPage(props: WishlistPageProps) {\n const { t } = useTranslation();\n const { pathname, searchStr } = useLocation();\n const shareState = useWishlistShare();\n const selectedIdSet = useMemo(() => new Set(shareState.selectedIds), [shareState.selectedIds]);\n const { items, next, generation, removedIds, removingIds, finishRemoving, loader } =\n useWishlistItems(props, shareState.deselect);\n const hasRemaining = items.some((prod) => !removedIds.has(Number(prod.id)));\n\n return (\n <div className=\"space-y-5\" id=\"wishlist\">\n {/* The SDK unconditionally auto-renders its own `<salla-wishlist-actions>` into this\n slot on every `customer.wishlist` page (tools/twilight's init-static-sections.js),\n but that widget only works alongside a sibling `<salla-products-list>` web\n component -- this page renders its products via the React-native `ItemsList`\n instead, so the SDK's widget never finds one and sits permanently disabled.\n `WishlistShareBar` below is this page's own, fully working replacement for the\n exact same \"Share\" feature. The slot itself stays (removing it would also drop\n whatever themes/apps register here via the hook registry, not just this widget);\n `#wishlist > salla-wishlist-actions` (user-pages.scss) hides just the dead\n SDK widget, which the SDK always inserts as this element's first child. */}\n <HookSlot name=\"customer:wishlist.items.start\" />\n <WishlistShareBar state={shareState} hasProducts={hasRemaining || !!next} />\n <ItemsList<Product>\n key={generation}\n items={items}\n loader={loader}\n mode={next ? 'infinite' : 'static'}\n pageUrl={pathname + searchStr}\n className=\"s-products-list\"\n itemsClassName=\"s-products-list-wrapper s-products-list-row-cards\"\n empty={\n <div className=\"text-center py-16\">\n <NoContent\n icon=\"sicon-heart\"\n message={t('common.errors.no_wishlist', \"You don't have any wishes\")}\n actionLabel={t('pages.offer.continue_shopping', 'Continue shopping')}\n actionUrl=\"/\"\n />\n </div>\n }\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) => {\n const remaining = items.filter((item) => !removedIds.has(Number(item.id)));\n shareState.loadedIdsRef.current = remaining.map((item) => Number(item.id));\n return remaining.map((prod) => (\n <WishlistCard\n key={prod.id}\n product={prod}\n removing={removingIds.has(Number(prod.id))}\n onRemoved={finishRemoving}\n selection={{\n selecting: shareState.selecting,\n selected: selectedIdSet.has(Number(prod.id)),\n onToggle: shareState.toggleSelected,\n }}\n />\n ));\n }}\n </ItemsList>\n <HookSlot name=\"customer:wishlist.items.end\" />\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/routes/account/wishlist/WishlistShare.tsx","../src/routes/account/wishlist/WishlistPage.tsx"],"names":["SallaSocialShare","useEffect","jsxs","jsx","SallaButton","useRef","useState","useCallback","items"],"mappings":"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","file":"WishlistPage-HHX3OVOF.js","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\n// The eager (non-deferred) export: the share dialog is opened imperatively through a ref, and the\n// deferred wrapper doesn't attach it until it has hydrated — a click before that would do nothing.\nimport { SallaSocialShareCore as SallaSocialShare } from '@salla.sa/twilight-components-react/social-share';\nimport { useTranslation } from '../../../providers/I18nProvider';\n\ntype ShareResponse = { data?: { url?: string }; url?: string } | undefined;\ntype SocialShareElement = HTMLElement & {\n url?: string;\n refresh?: () => Promise<void>;\n open?: () => Promise<void>;\n close?: () => Promise<void>;\n};\n\n/**\n * Share state for the wishlist page: the \"Share\" dropdown (share the whole list / share\n * specific items), the selection used by \"specific items\", and the share request itself.\n * Mirrors what the SDK's `<salla-wishlist-actions>` does, but drives the page's own React\n * list — that component needs a sibling `<salla-products-list>`, which this page doesn't render.\n */\nexport function useWishlistShare() {\n const [menuOpen, setMenuOpen] = useState(false);\n const [selecting, setSelecting] = useState(false);\n const [selectedIds, setSelectedIds] = useState<number[]>([]);\n const [sharing, setSharing] = useState(false);\n const [shareUrl, setShareUrl] = useState('');\n /** Ids of every product currently rendered (later cursor pages included), for \"select all\". */\n const loadedIdsRef = useRef<number[]>([]);\n const socialShareRef = useRef<SocialShareElement | null>(null);\n\n const share = useCallback(async (ids: number[], selectAll: boolean) => {\n if (!window.salla?.wishlist?.share) return;\n setSharing(true);\n try {\n const response = (await window.salla.wishlist.share(ids, selectAll)) as ShareResponse;\n const url = response?.data?.url || response?.url || '';\n if (!url) return;\n setShareUrl(url);\n const element = socialShareRef.current;\n if (element) {\n element.url = url;\n await element.refresh?.();\n await element.open?.();\n }\n } catch {\n // The SDK reports a failed share itself (notification); nothing to recover here.\n } finally {\n setSharing(false);\n }\n }, []);\n\n const shareAll = useCallback(() => {\n setMenuOpen(false);\n void share([], true);\n }, [share]);\n\n const shareSelected = useCallback(() => {\n if (selectedIds.length) void share(selectedIds, false);\n }, [share, selectedIds]);\n\n const startSelecting = useCallback(() => {\n setMenuOpen(false);\n setSelecting(true);\n }, []);\n\n const cancelSelecting = useCallback(() => {\n setSelecting(false);\n setSelectedIds([]);\n setShareUrl('');\n void socialShareRef.current?.close?.();\n }, []);\n\n const toggleSelected = useCallback((id: number) => {\n setShareUrl('');\n setSelectedIds((current) =>\n current.includes(id) ? current.filter((existing) => existing !== id) : [...current, id]\n );\n }, []);\n\n const selectedIdsRef = useRef(selectedIds);\n useEffect(() => {\n selectedIdsRef.current = selectedIds;\n }, [selectedIds]);\n\n const deselect = useCallback((id: number) => {\n if (!selectedIdsRef.current.includes(id)) return;\n // A link built for the old selection would still offer the removed product.\n setShareUrl('');\n const element = socialShareRef.current;\n if (element) {\n element.url = undefined;\n void element.close?.();\n }\n setSelectedIds((current) => current.filter((existing) => existing !== id));\n }, []);\n\n const toggleAll = useCallback(() => {\n setShareUrl('');\n setSelectedIds((current) =>\n current.length && current.length === loadedIdsRef.current.length\n ? []\n : [...loadedIdsRef.current]\n );\n }, []);\n\n return {\n menuOpen,\n setMenuOpen,\n selecting,\n selectedIds,\n sharing,\n shareUrl,\n loadedIdsRef,\n socialShareRef,\n shareAll,\n shareSelected,\n startSelecting,\n cancelSelecting,\n toggleSelected,\n toggleAll,\n deselect,\n };\n}\n\nexport type WishlistShareState = ReturnType<typeof useWishlistShare>;\n\n/** The bar above the wishlist: the \"Share\" dropdown, or — while picking products — the selection controls. */\nexport function WishlistShareBar({\n state,\n hasProducts,\n}: {\n state: WishlistShareState;\n hasProducts: boolean;\n}) {\n const { t } = useTranslation();\n const rootRef = useRef<HTMLDivElement>(null);\n const { menuOpen, setMenuOpen } = state;\n\n // Close the dropdown on an outside click or Escape.\n useEffect(() => {\n if (!menuOpen) return;\n const onPointerDown = (event: MouseEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setMenuOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setMenuOpen(false);\n };\n document.addEventListener('mousedown', onPointerDown);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('mousedown', onPointerDown);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [menuOpen, setMenuOpen]);\n\n const selectedCount = state.selectedIds.length;\n const allSelected = selectedCount > 0 && selectedCount === state.loadedIdsRef.current.length;\n\n return (\n <div ref={rootRef} className=\"s-wishlist-actions\">\n <div className=\"s-wishlist-actions-bar flex items-center justify-end gap-3 mb-3\">\n {state.selecting ? (\n <div className=\"s-wishlist-actions-selection flex items-center gap-3\">\n <label className=\"s-wishlist-actions-select-all inline-flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={allSelected}\n ref={(input) => {\n if (input) input.indeterminate = selectedCount > 0 && !allSelected;\n }}\n onChange={state.toggleAll}\n />\n {t('pages.wishlist.select_all', 'Select all')}\n </label>\n <SallaButton\n color=\"primary\"\n disabled={selectedCount === 0 || state.sharing}\n onClick={state.shareSelected}\n >\n {t('pages.wishlist.share', 'Share')}\n {selectedCount > 0 ? ` (${selectedCount})` : ''}\n </SallaButton>\n <SallaButton fill=\"outline\" color=\"light\" onClick={state.cancelSelecting}>\n {t('common.elements.cancel', 'Cancel')}\n </SallaButton>\n </div>\n ) : (\n <div className=\"s-wishlist-actions-dropdown relative\">\n <SallaButton\n color=\"primary\"\n fill=\"outline\"\n disabled={!hasProducts || state.sharing}\n aria-haspopup=\"true\"\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen(!menuOpen)}\n >\n <span className=\"flex items-center justify-center gap-2\">\n <i className=\"sicon-share-alt\" aria-hidden=\"true\" />\n {t('pages.wishlist.share', 'Share')}\n <i className=\"sicon-keyboard_arrow_down\" aria-hidden=\"true\" />\n </span>\n </SallaButton>\n {menuOpen && (\n <ul\n role=\"menu\"\n className=\"s-wishlist-actions-menu absolute z-10 mt-2 min-w-48 rounded-md bg-white py-2 shadow-default rtl:right-0 ltr:left-0\"\n >\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"s-wishlist-actions-item block w-full px-4 py-2 text-start text-sm text-gray-700 hover:bg-gray-50\"\n onClick={state.shareAll}\n >\n {t('pages.wishlist.share_all', 'Share the list')}\n </button>\n </li>\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"s-wishlist-actions-item block w-full px-4 py-2 text-start text-sm text-gray-700 hover:bg-gray-50\"\n onClick={state.startSelecting}\n >\n {t('pages.wishlist.share_specific', 'Share specific items')}\n </button>\n </li>\n </ul>\n )}\n </div>\n )}\n </div>\n {/* Same setup as the SDK's <salla-wishlist-actions>: the centered modal variant, opened by the\n dropdown rather than by the component's own round share button, so the default\n `widget` slot (that button) is replaced by an empty anchor. */}\n <SallaSocialShare\n ref={state.socialShareRef as never}\n url={state.shareUrl || undefined}\n mode=\"modal\"\n modalTitle={t('pages.wishlist.share_list_title', 'Share wishlist')}\n className=\"s-wishlist-actions-social\"\n >\n <span slot=\"widget\" className=\"s-wishlist-actions-social-anchor\" aria-hidden=\"true\" />\n </SallaSocialShare>\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type CSSProperties } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { ItemsList } from '@salla.sa/twilight-components-react';\nimport { SallaAddProductButton } from '@salla.sa/twilight-components-react/add-product-button';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { wishlist } from '../../../api/wishlist';\nimport type { Product } from '../../../types';\nimport { HookSlot, useWishlist, useMoney } from '../../../hooks';\nimport { useTranslation } from '../../../providers/I18nProvider';\nimport type { WishlistPageProps } from './types';\nimport { WishlistShareBar, useWishlistShare } from './WishlistShare';\nimport { NoContent, Image } from '../../../components/common';\nimport { useLocation } from '../../../providers/NavigationProvider';\nimport { onSallaEvent } from '../../../utils/sdk-helpers';\n\ninterface WishlistCardSelection {\n /** \"Share specific items\" mode: the card shows a checkbox and toggles on click. */\n selecting: boolean;\n selected: boolean;\n onToggle: (id: number) => void;\n}\n\n// The loaded component copies host attributes (not properties) onto its inner salla-button.\nconst setAddButtonAttributes = (el: HTMLElement | null) => {\n el?.setAttribute('loader-position', 'center');\n el?.setAttribute('fill', 'outline');\n};\n\nconst REMOVING_MS = 300;\n\nconst REMOVING_STYLE: CSSProperties = {\n opacity: 0,\n transform: 'scale(0.95)',\n transition: `opacity ${REMOVING_MS}ms ease-in-out, transform ${REMOVING_MS}ms ease-in-out`,\n};\n\nfunction WishlistCard({\n product: prod,\n selection,\n removing,\n onRemoved,\n}: {\n product: Product;\n selection?: WishlistCardSelection;\n /** Fades the card out, then calls `onRemoved` once the fade ends. */\n removing?: boolean;\n onRemoved?: (id: number) => void;\n}) {\n const { remove } = useWishlist();\n const { format } = useMoney();\n\n // Drops the card even when `transitionend` never fires (hidden tab, overridden styles).\n useEffect(() => {\n if (!removing) return;\n const timer = setTimeout(() => onRemoved?.(Number(prod.id)), REMOVING_MS + 50);\n return () => clearTimeout(timer);\n }, [removing, onRemoved, prod.id]);\n\n const handleRemove = () => {\n if (prod.id) {\n remove(Number(prod.id));\n }\n };\n\n const displayPrice = prod.sale_price ?? prod.price;\n const regularPrice = prod.regular_price;\n\n return (\n <div\n id={`wishlist-product-${prod.id}`}\n className={`product-entry product-entry--wishlist${selection?.selected ? ' is-selected' : ''}`}\n style={removing ? REMOVING_STYLE : undefined}\n onTransitionEnd={(event) => {\n if (removing && event.target === event.currentTarget && event.propertyName === 'opacity') {\n onRemoved?.(Number(prod.id));\n }\n }}\n >\n {selection?.selecting && (\n <input\n type=\"checkbox\"\n className=\"s-wishlist-select shrink-0 rtl:ml-4 ltr:mr-4\"\n aria-label={prod.name}\n checked={selection.selected}\n onChange={() => selection.onToggle(Number(prod.id))}\n />\n )}\n <div className=\"flex items-center mb-4 sm:mb-0\">\n <a href={prod.url} className=\"product-entry__image\">\n <Image\n className=\"object-cover w-full h-full\"\n src={prod.image?.url}\n alt={prod.image?.alt ?? prod.name}\n aspectRatio=\"1/1\"\n />\n </a>\n <div className=\"flex-1 rtl:pr-5 ltr:pl-5\">\n <h3 className=\"text-sm text-gray-800 leading-6 mb-1.5 rtl:pl-5 ltr:pr-5 rtl:md:pl-8 ltr:md:pr-8 line-clamp-1\">\n <a href={prod.url}>{prod.name}</a>\n </h3>\n <div className=\"w-full center-between\">\n {prod.is_on_sale && regularPrice ? (\n <div className=\"space-x-1 rtl:space-x-reverse\">\n <h4 className=\"inline-block text-sm font-bold text-red-400\">\n {format(displayPrice)}\n </h4>\n <span className=\"text-sm text-gray-500 line-through\">{format(regularPrice)}</span>\n </div>\n ) : (\n <h4 className=\"text-sm font-bold\">{format(displayPrice)}</h4>\n )}\n </div>\n </div>\n </div>\n <div className=\"flex items-center space-x-4 rtl:space-x-reverse\">\n <SallaAddProductButton\n ref={setAddButtonAttributes}\n productStatus={prod.status}\n productId={prod.id}\n productType={prod.type}\n fill=\"outline\"\n className=\"flex-grow w-full sm:grow-0 md:w-40\"\n />\n <SallaButton\n loaderPosition=\"center\"\n shape=\"icon\"\n size=\"small\"\n color=\"danger\"\n className=\"btn--delete\"\n onClick={handleRemove}\n >\n <i className=\"sicon-cancel\" />\n </SallaButton>\n </div>\n </div>\n );\n}\n\n/** The loaded wishlist pages, reloaded from the server once every loaded card is removed (like Twig). */\nfunction useWishlistItems(\n { query, products, pagination }: WishlistPageProps,\n onRemoved: (id: number) => void\n) {\n const queryClient = useQueryClient();\n // Track the next page to load (starts at page 2 since page 1 is SSR)\n const nextPageRef = useRef(query.page + 1);\n const [removedIds, setRemovedIds] = useState<ReadonlySet<number>>(() => new Set());\n const [removingIds, setRemovingIds] = useState<ReadonlySet<number>>(() => new Set());\n const [reloaded, setReloaded] = useState<{\n items: Product[];\n next: string | null;\n generation: number;\n } | null>(null);\n const loadedRef = useRef({\n ids: products.map((prod) => Number(prod.id)),\n hasMore: !!pagination?.next,\n });\n\n // A `?page=` navigation keeps this instance, so drop what the previous page removed or reloaded.\n const [loadedProducts, setLoadedProducts] = useState(products);\n if (loadedProducts !== products) {\n setLoadedProducts(products);\n setRemovedIds(new Set());\n setRemovingIds(new Set());\n setReloaded(null);\n }\n\n useEffect(() => {\n nextPageRef.current = query.page + 1;\n loadedRef.current = {\n ids: products.map((prod) => Number(prod.id)),\n hasMore: !!pagination?.next,\n };\n }, [products, query.page, pagination?.next]);\n\n useEffect(() => {\n const handleRemoved = (_response: unknown, id: unknown) => {\n const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n (reduceMotion ? setRemovedIds : setRemovingIds)((current) =>\n new Set(current).add(Number(id))\n );\n onRemoved(Number(id));\n };\n\n return onSallaEvent('wishlist::removed', handleRemoved);\n }, [onRemoved]);\n\n useEffect(() => {\n const { ids, hasMore } = loadedRef.current;\n if (!ids.length || !ids.every((id) => removedIds.has(id))) return;\n\n const reset = (items: Product[], next: string | null) => {\n nextPageRef.current = query.page + 1;\n loadedRef.current = { ids: items.map((prod) => Number(prod.id)), hasMore: !!next };\n setRemovedIds(new Set());\n setRemovingIds(new Set());\n setReloaded((current) => ({ items, next, generation: (current?.generation ?? 0) + 1 }));\n };\n\n if (!hasMore) {\n reset([], null);\n return;\n }\n\n let cancelled = false;\n queryClient\n .fetchQuery({ ...wishlist.queries.list({ page: query.page }), staleTime: 0 })\n .then((result) => {\n if (!cancelled) reset(result.items, result.next);\n })\n // A failed reload keeps the list as it is; later pages still load on scroll.\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [removedIds, query.page, products, queryClient]);\n\n const loader = async () => {\n const pageToLoad = nextPageRef.current;\n const result = await wishlist.list({ page: pageToLoad });\n\n nextPageRef.current = pageToLoad + 1;\n loadedRef.current = {\n ids: [...loadedRef.current.ids, ...result.items.map((prod) => Number(prod.id))],\n hasMore: !!result.next,\n };\n\n return {\n items: result.items,\n next: result.next,\n };\n };\n\n const finishRemoving = useCallback((id: number) => {\n setRemovedIds((current) => (current.has(id) ? current : new Set(current).add(id)));\n }, []);\n\n return {\n items: reloaded ? reloaded.items : products,\n next: reloaded ? reloaded.next : pagination?.next,\n generation: reloaded?.generation ?? 0,\n removedIds,\n removingIds,\n finishRemoving,\n loader,\n };\n}\n\nexport function WishlistPage(props: WishlistPageProps) {\n const { t } = useTranslation();\n const { pathname, searchStr } = useLocation();\n const shareState = useWishlistShare();\n const selectedIdSet = useMemo(() => new Set(shareState.selectedIds), [shareState.selectedIds]);\n const { items, next, generation, removedIds, removingIds, finishRemoving, loader } =\n useWishlistItems(props, shareState.deselect);\n const hasRemaining = items.some((prod) => !removedIds.has(Number(prod.id)));\n\n return (\n <div className=\"space-y-5\" id=\"wishlist\">\n {/* The SDK unconditionally auto-renders its own `<salla-wishlist-actions>` into this\n slot on every `customer.wishlist` page (tools/twilight's init-static-sections.js),\n but that widget only works alongside a sibling `<salla-products-list>` web\n component -- this page renders its products via the React-native `ItemsList`\n instead, so the SDK's widget never finds one and sits permanently disabled.\n `WishlistShareBar` below is this page's own, fully working replacement for the\n exact same \"Share\" feature. The slot itself stays (removing it would also drop\n whatever themes/apps register here via the hook registry, not just this widget);\n `#wishlist > salla-wishlist-actions` (user-pages.scss) hides just the dead\n SDK widget, which the SDK always inserts as this element's first child. */}\n <HookSlot name=\"customer:wishlist.items.start\" />\n <WishlistShareBar state={shareState} hasProducts={hasRemaining || !!next} />\n <ItemsList<Product>\n key={generation}\n items={items}\n loader={loader}\n mode={next ? 'infinite' : 'static'}\n pageUrl={pathname + searchStr}\n className=\"s-products-list\"\n itemsClassName=\"s-products-list-wrapper s-products-list-row-cards\"\n empty={\n <div className=\"text-center py-16\">\n <NoContent\n icon=\"sicon-heart\"\n message={t('common.errors.no_wishlist', \"You don't have any wishes\")}\n actionLabel={t('pages.offer.continue_shopping', 'Continue shopping')}\n actionUrl=\"/\"\n />\n </div>\n }\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) => {\n const remaining = items.filter((item) => !removedIds.has(Number(item.id)));\n shareState.loadedIdsRef.current = remaining.map((item) => Number(item.id));\n return remaining.map((prod) => (\n <WishlistCard\n key={prod.id}\n product={prod}\n removing={removingIds.has(Number(prod.id))}\n onRemoved={finishRemoving}\n selection={{\n selecting: shareState.selecting,\n selected: selectedIdSet.has(Number(prod.id)),\n onToggle: shareState.toggleSelected,\n }}\n />\n ));\n }}\n </ItemsList>\n <HookSlot name=\"customer:wishlist.items.end\" />\n </div>\n );\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { advertisement, advertisementsFor } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { advertisement, advertisementsFor } from '../chunk-VDY3VY7S.js';
|
|
2
|
+
import '../chunk-2DUN6DZK.js';
|
|
3
3
|
import '../chunk-Z5M4YYWT.js';
|
|
4
|
-
import '../chunk-
|
|
5
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-XMRNYUQY.js';
|
|
5
|
+
import '../chunk-T2752RH7.js';
|
|
6
6
|
import '../chunk-6K34BCUP.js';
|
|
7
7
|
import '../chunk-T72DAX7R.js';
|
|
8
8
|
import '../chunk-DGUM43GV.js';
|
package/dist/api/apps.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { apps } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { apps } from '../chunk-5EN3XZ32.js';
|
|
2
|
+
import '../chunk-2DUN6DZK.js';
|
|
3
3
|
import '../chunk-Z5M4YYWT.js';
|
|
4
|
-
import '../chunk-
|
|
5
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-XMRNYUQY.js';
|
|
5
|
+
import '../chunk-T2752RH7.js';
|
|
6
6
|
import '../chunk-6K34BCUP.js';
|
|
7
7
|
import '../chunk-T72DAX7R.js';
|
|
8
8
|
import '../chunk-DGUM43GV.js';
|
package/dist/api/blog.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export { blog } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { blog } from '../chunk-3QOALQQJ.js';
|
|
2
|
+
import '../chunk-VEVFVWF3.js';
|
|
3
3
|
import '../chunk-OUW6WESU.js';
|
|
4
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-2DUN6DZK.js';
|
|
5
5
|
import '../chunk-Z5M4YYWT.js';
|
|
6
|
-
import '../chunk-
|
|
7
|
-
import '../chunk-
|
|
8
|
-
import '../chunk-
|
|
6
|
+
import '../chunk-6TFM3UTF.js';
|
|
7
|
+
import '../chunk-XMRNYUQY.js';
|
|
8
|
+
import '../chunk-T2752RH7.js';
|
|
9
9
|
import '../chunk-6K34BCUP.js';
|
|
10
10
|
import '../chunk-T72DAX7R.js';
|
|
11
11
|
import '../chunk-DF6FBKDN.js';
|
package/dist/api/brands.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export { brand } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { brand } from '../chunk-QXWCIK6D.js';
|
|
2
|
+
import '../chunk-VEVFVWF3.js';
|
|
3
3
|
import '../chunk-OUW6WESU.js';
|
|
4
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-2DUN6DZK.js';
|
|
5
5
|
import '../chunk-Z5M4YYWT.js';
|
|
6
|
-
import '../chunk-
|
|
7
|
-
import '../chunk-
|
|
8
|
-
import '../chunk-
|
|
6
|
+
import '../chunk-6TFM3UTF.js';
|
|
7
|
+
import '../chunk-XMRNYUQY.js';
|
|
8
|
+
import '../chunk-T2752RH7.js';
|
|
9
9
|
import '../chunk-6K34BCUP.js';
|
|
10
10
|
import '../chunk-T72DAX7R.js';
|
|
11
11
|
import '../chunk-DF6FBKDN.js';
|
package/dist/api/cart.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export { cart } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { cart } from '../chunk-PBT52UWY.js';
|
|
2
|
+
import '../chunk-VEVFVWF3.js';
|
|
3
3
|
import '../chunk-OUW6WESU.js';
|
|
4
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-2DUN6DZK.js';
|
|
5
5
|
import '../chunk-Z5M4YYWT.js';
|
|
6
|
-
import '../chunk-
|
|
7
|
-
import '../chunk-
|
|
8
|
-
import '../chunk-
|
|
6
|
+
import '../chunk-6TFM3UTF.js';
|
|
7
|
+
import '../chunk-XMRNYUQY.js';
|
|
8
|
+
import '../chunk-T2752RH7.js';
|
|
9
9
|
import '../chunk-6K34BCUP.js';
|
|
10
10
|
import '../chunk-T72DAX7R.js';
|
|
11
11
|
import '../chunk-DF6FBKDN.js';
|
package/dist/api/category.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export { category } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { category } from '../chunk-O6RZ6AWT.js';
|
|
2
|
+
import '../chunk-VEVFVWF3.js';
|
|
3
3
|
import '../chunk-OUW6WESU.js';
|
|
4
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-2DUN6DZK.js';
|
|
5
5
|
import '../chunk-Z5M4YYWT.js';
|
|
6
|
-
import '../chunk-
|
|
7
|
-
import '../chunk-
|
|
8
|
-
import '../chunk-
|
|
6
|
+
import '../chunk-6TFM3UTF.js';
|
|
7
|
+
import '../chunk-XMRNYUQY.js';
|
|
8
|
+
import '../chunk-T2752RH7.js';
|
|
9
9
|
import '../chunk-6K34BCUP.js';
|
|
10
10
|
import '../chunk-T72DAX7R.js';
|
|
11
11
|
import '../chunk-DF6FBKDN.js';
|
package/dist/api/client.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { STORE_IDENTIFIER_HEADER, api, cdn, filesCdn, getActiveCurrency, getActiveScope, getActiveScopeId, getAuthToken } from '../chunk-
|
|
1
|
+
export { STORE_IDENTIFIER_HEADER, api, cdn, filesCdn, getActiveCurrency, getActiveScope, getActiveScopeId, getAuthToken } from '../chunk-2DUN6DZK.js';
|
|
2
2
|
import '../chunk-Z5M4YYWT.js';
|
|
3
|
-
import '../chunk-
|
|
4
|
-
import '../chunk-
|
|
3
|
+
import '../chunk-XMRNYUQY.js';
|
|
4
|
+
import '../chunk-T2752RH7.js';
|
|
5
5
|
import '../chunk-6K34BCUP.js';
|
|
6
6
|
import '../chunk-T72DAX7R.js';
|
|
7
7
|
import '../chunk-DGUM43GV.js';
|
package/dist/api/home.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { home } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { home } from '../chunk-FXW6H6J3.js';
|
|
2
|
+
import '../chunk-2DUN6DZK.js';
|
|
3
3
|
import '../chunk-Z5M4YYWT.js';
|
|
4
|
-
import '../chunk-
|
|
5
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-XMRNYUQY.js';
|
|
5
|
+
import '../chunk-T2752RH7.js';
|
|
6
6
|
import '../chunk-6K34BCUP.js';
|
|
7
7
|
import '../chunk-T72DAX7R.js';
|
|
8
8
|
import '../chunk-DGUM43GV.js';
|
package/dist/api/loyalty.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export { loyalty } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { loyalty } from '../chunk-B36NISD2.js';
|
|
2
|
+
import '../chunk-VEVFVWF3.js';
|
|
3
3
|
import '../chunk-OUW6WESU.js';
|
|
4
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-2DUN6DZK.js';
|
|
5
5
|
import '../chunk-Z5M4YYWT.js';
|
|
6
|
-
import '../chunk-
|
|
7
|
-
import '../chunk-
|
|
8
|
-
import '../chunk-
|
|
6
|
+
import '../chunk-6TFM3UTF.js';
|
|
7
|
+
import '../chunk-XMRNYUQY.js';
|
|
8
|
+
import '../chunk-T2752RH7.js';
|
|
9
9
|
import '../chunk-6K34BCUP.js';
|
|
10
10
|
import '../chunk-T72DAX7R.js';
|
|
11
11
|
import '../chunk-DF6FBKDN.js';
|