@salla.sa/twilight-theme-engine 1.0.0-beta.9 → 1.0.0
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-VS67AFNL.js → AddToCartForm-H4K4VS3M.js} +24 -25
- package/dist/AddToCartForm-H4K4VS3M.js.map +1 -0
- package/dist/{BlogAuthorPage-276K2KQS.js → BlogAuthorPage-FN4XX2OK.js} +30 -27
- package/dist/BlogAuthorPage-FN4XX2OK.js.map +1 -0
- package/dist/{BlogCategoryPage-GF5PLRG7.js → BlogCategoryPage-MUHIK4WT.js} +30 -27
- package/dist/BlogCategoryPage-MUHIK4WT.js.map +1 -0
- package/dist/{BlogPage-BU672BXD.js → BlogPage-ZG655QM7.js} +33 -24
- package/dist/BlogPage-ZG655QM7.js.map +1 -0
- package/dist/{BlogSinglePage-ELV4S5EV.js → BlogSinglePage-FLVGIIL7.js} +25 -23
- package/dist/BlogSinglePage-FLVGIIL7.js.map +1 -0
- package/dist/{BlogTagPage-TXQP6ZOI.js → BlogTagPage-ETQGMVW3.js} +30 -27
- package/dist/BlogTagPage-ETQGMVW3.js.map +1 -0
- package/dist/{BrandsPage-C6ZHC4KC.js → BrandsPage-BCJWSKQ4.js} +24 -23
- package/dist/BrandsPage-BCJWSKQ4.js.map +1 -0
- package/dist/{Breadcrumb-TG4UTNRM.js → Breadcrumb-4AANUEKN.js} +24 -23
- package/dist/Breadcrumb-4AANUEKN.js.map +1 -0
- package/dist/{CartItem-55JV6HDS.js → CartItem-VMYGVMOT.js} +27 -26
- package/dist/CartItem-VMYGVMOT.js.map +1 -0
- package/dist/{CartSummary-CUWMHHMD.js → CartSummary-W7H5YTN6.js} +24 -23
- package/dist/CartSummary-W7H5YTN6.js.map +1 -0
- package/dist/Copyright-VREW3OTU.js +9 -0
- package/dist/{Copyright-PG76AVV6.js.map → Copyright-VREW3OTU.js.map} +1 -1
- package/dist/{CustomerLayout-SLNVCNZ6.js → CustomerLayout-HI3MHMOJ.js} +24 -23
- package/dist/CustomerLayout-HI3MHMOJ.js.map +1 -0
- package/dist/ErrorPage-XGBROULF.js +6 -0
- package/dist/{ErrorPage-TK4U3ENF.js.map → ErrorPage-XGBROULF.js.map} +1 -1
- package/dist/Footer-66XHPADY.js +40 -0
- package/dist/{Footer-MZDSEK57.js.map → Footer-66XHPADY.js.map} +1 -1
- package/dist/Header-TZX55FDN.js +15 -0
- package/dist/{Header-CXFKDTOA.js.map → Header-TZX55FDN.js.map} +1 -1
- package/dist/ImageModal-LHFSYPSU.js +32 -0
- package/dist/ImageModal-LHFSYPSU.js.map +1 -0
- package/dist/{LoyaltyPage-AIA3CUYI.js → LoyaltyPage-JN2KJC7E.js} +29 -28
- package/dist/LoyaltyPage-JN2KJC7E.js.map +1 -0
- package/dist/{MainMenu-T3M5RB7L.js → MainMenu-M2SHKHOK.js} +16 -37
- package/dist/MainMenu-M2SHKHOK.js.map +1 -0
- package/dist/MasterLayout-2346V2WQ.js +40 -0
- package/dist/{MasterLayout-QUBHRA32.js.map → MasterLayout-2346V2WQ.js.map} +1 -1
- package/dist/{MobileMenu-6D52JOQA.js → MobileMenu-LTGCUCOZ.js} +47 -60
- package/dist/MobileMenu-LTGCUCOZ.js.map +1 -0
- package/dist/{NotificationsPage-6H45SAS7.js → NotificationsPage-6D7WS3H2.js} +24 -23
- package/dist/NotificationsPage-6D7WS3H2.js.map +1 -0
- package/dist/{OrderSinglePage-GP2M3YVH.js → OrderSinglePage-NAZY23SD.js} +73 -61
- package/dist/OrderSinglePage-NAZY23SD.js.map +1 -0
- package/dist/{OrdersPage-OQGJLTQP.js → OrdersPage-ARIDUNIW.js} +25 -24
- package/dist/OrdersPage-ARIDUNIW.js.map +1 -0
- package/dist/{PageSingle-44NVAUIT.js → PageSingle-X7FAYXMH.js} +3 -3
- package/dist/{PageSingle-44NVAUIT.js.map → PageSingle-X7FAYXMH.js.map} +1 -1
- package/dist/{PreOrderNotification-ZVTGNV7K.js → PreOrderNotification-OP57EA6F.js} +3 -3
- package/dist/PreOrderNotification-OP57EA6F.js.map +1 -0
- package/dist/{PriceQuoteButton-RAAPL4N4.js → PriceQuoteButton-CGRNHY3E.js} +6 -6
- package/dist/PriceQuoteButton-CGRNHY3E.js.map +1 -0
- package/dist/{ProductDetails-2JUCRU4W.js → ProductDetails-M5DBXW7K.js} +11 -10
- package/dist/ProductDetails-M5DBXW7K.js.map +1 -0
- package/dist/{ProfilePage-XGZ2HCQH.js → ProfilePage-YMFZQIKT.js} +24 -23
- package/dist/ProfilePage-YMFZQIKT.js.map +1 -0
- package/dist/{SeoCartWidget-PDK6IQ2H.js → SeoCartWidget-VVDUBWCT.js} +24 -23
- package/dist/SeoCartWidget-VVDUBWCT.js.map +1 -0
- package/dist/{SettingsPage-VCQNV2PP.js → SettingsPage-P7H7MQHU.js} +24 -23
- package/dist/SettingsPage-P7H7MQHU.js.map +1 -0
- package/dist/StoreClosedNotification-4WCOB6Y6.js +41 -0
- package/dist/{StoreClosedNotification-3JRNBNQK.js.map → StoreClosedNotification-4WCOB6Y6.js.map} +1 -1
- package/dist/{TestimonialsPage-ENMVJ4QG.js → TestimonialsPage-OYWHHUB3.js} +4 -4
- package/dist/TestimonialsPage-OYWHHUB3.js.map +1 -0
- package/dist/{ThankYouPage-4FTP6E2Y.js → ThankYouPage-XSZXBUV3.js} +32 -26
- package/dist/ThankYouPage-XSZXBUV3.js.map +1 -0
- package/dist/{WalletPage-VKV44EEG.js → WalletPage-EPD22OHW.js} +25 -24
- package/dist/WalletPage-EPD22OHW.js.map +1 -0
- package/dist/WidgetHead-RWL7D3CT.js +7 -0
- package/dist/{WidgetHead-FXEPCB23.js.map → WidgetHead-RWL7D3CT.js.map} +1 -1
- package/dist/{WishlistPage-GJZCXQUY.js → WishlistPage-I27GDNTK.js} +25 -24
- package/dist/WishlistPage-I27GDNTK.js.map +1 -0
- package/dist/ambient/virtual-modules.d.ts +28 -0
- package/dist/api/apps.js +2 -2
- package/dist/api/brands.js +5 -34
- package/dist/api/cart.js +5 -34
- package/dist/api/category.js +5 -34
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +2 -2
- package/dist/api/home.js +3 -3
- package/dist/api/loyalty.js +5 -34
- package/dist/api/menu.js +3 -3
- package/dist/api/notification.js +3 -3
- package/dist/api/order.js +5 -34
- package/dist/api/page.js +5 -34
- package/dist/api/product.js +5 -34
- package/dist/api/profile.js +2 -2
- package/dist/api/store.js +3 -3
- package/dist/api/translations.d.ts +1 -1
- package/dist/api/translations.d.ts.map +1 -1
- package/dist/api/translations.js +3 -3
- package/dist/api/user.js +3 -3
- package/dist/api/wishlist.js +3 -3
- package/dist/chunk-2JV6WZ6O.js +136 -0
- package/dist/chunk-2JV6WZ6O.js.map +1 -0
- package/dist/{chunk-TQUHDSKQ.js → chunk-2TB2LTL2.js} +3 -11
- package/dist/chunk-2TB2LTL2.js.map +1 -0
- package/dist/{chunk-JIJOXZPF.js → chunk-2ZRLSZ4V.js} +6 -12
- package/dist/chunk-2ZRLSZ4V.js.map +1 -0
- package/dist/{chunk-433EFDBW.js → chunk-3OAVM4PY.js} +4 -4
- package/dist/chunk-3OAVM4PY.js.map +1 -0
- package/dist/{chunk-S6AVEFCN.js → chunk-4LGAJDZV.js} +19 -12
- package/dist/chunk-4LGAJDZV.js.map +1 -0
- package/dist/{chunk-GFMVML6I.js → chunk-6D7SF3YR.js} +3 -3
- package/dist/{chunk-GFMVML6I.js.map → chunk-6D7SF3YR.js.map} +1 -1
- package/dist/{chunk-THXWAZX2.js → chunk-6JMXDZXL.js} +12 -17
- package/dist/chunk-6JMXDZXL.js.map +1 -0
- package/dist/{chunk-FCZRF6DB.js → chunk-6NBBXERE.js} +3 -3
- package/dist/{chunk-FCZRF6DB.js.map → chunk-6NBBXERE.js.map} +1 -1
- package/dist/{chunk-5DZ7HLSO.js → chunk-6Q5BFHFA.js} +3 -3
- package/dist/{chunk-5DZ7HLSO.js.map → chunk-6Q5BFHFA.js.map} +1 -1
- package/dist/{chunk-XHGF75TM.js → chunk-6TKIUG5C.js} +11 -4
- package/dist/chunk-6TKIUG5C.js.map +1 -0
- package/dist/{chunk-TQLEQSXE.js → chunk-6Z4MOC4S.js} +3 -19
- package/dist/chunk-6Z4MOC4S.js.map +1 -0
- package/dist/{chunk-SUFCEN4T.js → chunk-7LP7D75V.js} +3 -3
- package/dist/{chunk-SUFCEN4T.js.map → chunk-7LP7D75V.js.map} +1 -1
- package/dist/{chunk-GS3G4O2R.js → chunk-7O5DYSLX.js} +4 -4
- package/dist/chunk-7O5DYSLX.js.map +1 -0
- package/dist/{chunk-EB7X4YMZ.js → chunk-7UZEHQEQ.js} +4 -4
- package/dist/{chunk-EB7X4YMZ.js.map → chunk-7UZEHQEQ.js.map} +1 -1
- package/dist/{chunk-D4SRWUMH.js → chunk-B2NXQJEO.js} +4 -4
- package/dist/{chunk-D4SRWUMH.js.map → chunk-B2NXQJEO.js.map} +1 -1
- package/dist/{chunk-2FU6CVSB.js → chunk-C5X6CVXC.js} +3 -3
- package/dist/{chunk-2FU6CVSB.js.map → chunk-C5X6CVXC.js.map} +1 -1
- package/dist/chunk-CUG6VOLM.js +10 -0
- package/dist/{chunk-3DCZJDDK.js.map → chunk-CUG6VOLM.js.map} +1 -1
- package/dist/{chunk-BWFBVXT3.js → chunk-DF6FBKDN.js} +2 -2
- package/dist/chunk-DF6FBKDN.js.map +1 -0
- package/dist/{chunk-GTM2GV2N.js → chunk-DIVL44G5.js} +65 -43
- package/dist/chunk-DIVL44G5.js.map +1 -0
- package/dist/{chunk-YRKMHN7W.js → chunk-EHKTHLXK.js} +3 -3
- package/dist/{chunk-YRKMHN7W.js.map → chunk-EHKTHLXK.js.map} +1 -1
- package/dist/{chunk-P43TLDS6.js → chunk-ENIGLGGV.js} +6 -6
- package/dist/chunk-ENIGLGGV.js.map +1 -0
- package/dist/{chunk-UE3BUFZI.js → chunk-FZKRSGLP.js} +3 -3
- package/dist/{chunk-UE3BUFZI.js.map → chunk-FZKRSGLP.js.map} +1 -1
- package/dist/{chunk-C5GWTTB6.js → chunk-GQG4KE5Z.js} +4 -4
- package/dist/chunk-GQG4KE5Z.js.map +1 -0
- package/dist/{chunk-J37AYLWL.js → chunk-GU2KUQVD.js} +4 -3
- package/dist/chunk-GU2KUQVD.js.map +1 -0
- package/dist/{chunk-SVZOWI7E.js → chunk-HTGBIA7K.js} +3 -6
- package/dist/chunk-HTGBIA7K.js.map +1 -0
- package/dist/{chunk-ZZ7Q5LEG.js → chunk-HWVEOUG4.js} +3 -3
- package/dist/{chunk-ZZ7Q5LEG.js.map → chunk-HWVEOUG4.js.map} +1 -1
- package/dist/{chunk-3UHSMGPY.js → chunk-HX3YKS5W.js} +9 -3
- package/dist/chunk-HX3YKS5W.js.map +1 -0
- package/dist/{chunk-WA5QBFRU.js → chunk-I5Z4NJBB.js} +4 -4
- package/dist/{chunk-WA5QBFRU.js.map → chunk-I5Z4NJBB.js.map} +1 -1
- package/dist/{chunk-TWAHYRKI.js → chunk-IWMGDYNN.js} +4 -4
- package/dist/chunk-IWMGDYNN.js.map +1 -0
- package/dist/{chunk-TFZ2RT6P.js → chunk-JKIRRMBU.js} +3 -3
- package/dist/chunk-JKIRRMBU.js.map +1 -0
- package/dist/{chunk-YU36GBMB.js → chunk-KCKHA75V.js} +3 -3
- package/dist/{chunk-YU36GBMB.js.map → chunk-KCKHA75V.js.map} +1 -1
- package/dist/{chunk-W4CSWDEH.js → chunk-KIPZQN3Y.js} +2 -7
- package/dist/chunk-KIPZQN3Y.js.map +1 -0
- package/dist/{chunk-2SUOZEX2.js → chunk-KJRALAYM.js} +3 -3
- package/dist/chunk-KJRALAYM.js.map +1 -0
- package/dist/{chunk-SAZBQNQK.js → chunk-KZDE3XKU.js} +7 -7
- package/dist/chunk-KZDE3XKU.js.map +1 -0
- package/dist/{chunk-O7Z6BIPP.js → chunk-LSDIFHXZ.js} +4 -4
- package/dist/{chunk-O7Z6BIPP.js.map → chunk-LSDIFHXZ.js.map} +1 -1
- package/dist/{chunk-7RVUSB5C.js → chunk-NBHI5X36.js} +4 -4
- package/dist/{chunk-7RVUSB5C.js.map → chunk-NBHI5X36.js.map} +1 -1
- package/dist/{chunk-UIX3W2PN.js → chunk-OAMIDZKW.js} +3 -3
- package/dist/chunk-OAMIDZKW.js.map +1 -0
- package/dist/{chunk-MXQCE3KA.js → chunk-OBSAH7K6.js} +4 -45
- package/dist/chunk-OBSAH7K6.js.map +1 -0
- package/dist/{chunk-IILTG4A6.js → chunk-P26QKBJC.js} +84 -63
- package/dist/chunk-P26QKBJC.js.map +1 -0
- package/dist/chunk-Q5YIGQTT.js +14 -0
- package/dist/{chunk-ZOCDYJPX.js.map → chunk-Q5YIGQTT.js.map} +1 -1
- package/dist/{chunk-25SSLQAJ.js → chunk-Q7VWURUR.js} +5 -12
- package/dist/chunk-Q7VWURUR.js.map +1 -0
- package/dist/{chunk-SSQ75CKA.js → chunk-RINZVHVS.js} +4 -4
- package/dist/chunk-RINZVHVS.js.map +1 -0
- package/dist/{chunk-RYBA3JDM.js → chunk-RJPPO3ET.js} +4 -4
- package/dist/{chunk-RYBA3JDM.js.map → chunk-RJPPO3ET.js.map} +1 -1
- package/dist/{chunk-Q6MQLAYL.js → chunk-TCSNNCRH.js} +3 -3
- package/dist/{chunk-Q6MQLAYL.js.map → chunk-TCSNNCRH.js.map} +1 -1
- package/dist/{chunk-GOYYO4NI.js → chunk-TP3LCGE7.js} +2 -2
- package/dist/{chunk-GOYYO4NI.js.map → chunk-TP3LCGE7.js.map} +1 -1
- package/dist/{chunk-U33UQAWO.js → chunk-TSAQIQCD.js} +10 -9
- package/dist/chunk-TSAQIQCD.js.map +1 -0
- package/dist/{chunk-VVRYP6IL.js → chunk-TYNZ5B2B.js} +2 -2
- package/dist/chunk-TYNZ5B2B.js.map +1 -0
- package/dist/{chunk-CI4HKXVH.js → chunk-W6HFR7YA.js} +4 -4
- package/dist/chunk-W6HFR7YA.js.map +1 -0
- package/dist/{chunk-REQC7YOE.js → chunk-WUTGBZQR.js} +9 -14
- package/dist/chunk-WUTGBZQR.js.map +1 -0
- package/dist/{chunk-4AYOFKHU.js → chunk-XK42WXU5.js} +3 -3
- package/dist/chunk-XK42WXU5.js.map +1 -0
- package/dist/{chunk-HL3HSO4R.js → chunk-Y62QQRYP.js} +5 -5
- package/dist/chunk-Y62QQRYP.js.map +1 -0
- package/dist/{chunk-FBFPH5BB.js → chunk-Z4Y55HWX.js} +8 -8
- package/dist/chunk-Z4Y55HWX.js.map +1 -0
- package/dist/{chunk-6LQFMCWK.js → chunk-ZNOJPVX3.js} +4 -4
- package/dist/chunk-ZNOJPVX3.js.map +1 -0
- package/dist/components/cart/CartItem.d.ts.map +1 -1
- package/dist/components/cart/PriceQuoteButton.d.ts.map +1 -1
- package/dist/components/cart/index.js +1 -1
- package/dist/components/collapse/Collapse.d.ts +2 -2
- package/dist/components/collapse/Collapse.d.ts.map +1 -1
- package/dist/components/collapse/index.js +3 -3
- package/dist/components/collapse/index.js.map +1 -1
- package/dist/components/common/DeferredData.d.ts +0 -1
- package/dist/components/common/DeferredData.d.ts.map +1 -1
- package/dist/components/common/ErrorPage.d.ts.map +1 -1
- package/dist/components/common/index.js +1 -1
- package/dist/components/drawer/Drawer.d.ts.map +1 -1
- package/dist/components/drawer/index.js +23 -22
- package/dist/components/dropdown/Dropdown.d.ts.map +1 -1
- package/dist/components/dropdown/index.js +17 -1
- package/dist/components/dropdown/index.js.map +1 -1
- package/dist/components/home/ComponentErrorBoundary.d.ts +1 -1
- package/dist/components/home/ComponentErrorBoundary.d.ts.map +1 -1
- package/dist/components/home/PhotosSlider.d.ts +1 -0
- package/dist/components/home/PhotosSlider.d.ts.map +1 -1
- package/dist/components/home/SquarePhotos.d.ts +1 -0
- package/dist/components/home/SquarePhotos.d.ts.map +1 -1
- package/dist/components/home/StoreFeatures.d.ts.map +1 -1
- package/dist/components/home/index.js +25 -24
- package/dist/components/layout/Header.d.ts.map +1 -1
- package/dist/components/layout/index.js +10 -10
- package/dist/components/modal/ImageModal.d.ts.map +1 -1
- package/dist/components/modal/Modal.d.ts.map +1 -1
- package/dist/components/modal/index.js +2 -2
- package/dist/components/navigation/MainMenu.d.ts.map +1 -1
- package/dist/components/navigation/MobileMenu.d.ts +1 -1
- package/dist/components/navigation/MobileMenu.d.ts.map +1 -1
- package/dist/components/product/AddToCartForm.d.ts +1 -1
- package/dist/components/product/AddToCartForm.d.ts.map +1 -1
- package/dist/components/product/ProductGallery.d.ts.map +1 -1
- package/dist/components/product/index.js +23 -22
- package/dist/components/store/index.js +24 -23
- package/dist/components/store/index.js.map +1 -1
- package/dist/components/toast/index.js +47 -2
- package/dist/components/toast/index.js.map +1 -1
- package/dist/dev/DevSettingsWidget.d.ts +19 -0
- package/dist/dev/DevSettingsWidget.d.ts.map +1 -0
- package/dist/dev/dev-settings-store.d.ts +62 -0
- package/dist/dev/dev-settings-store.d.ts.map +1 -0
- package/dist/dev/index.d.ts +9 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/index.js +330 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/schema-types.d.ts +43 -0
- package/dist/dev/schema-types.d.ts.map +1 -0
- package/dist/document-class-WLNCTQI2.js +21 -0
- package/dist/{document-class-V5XSWLMX.js.map → document-class-WLNCTQI2.js.map} +1 -1
- package/dist/hooks/HookRegistry.d.ts +1 -0
- package/dist/hooks/HookRegistry.d.ts.map +1 -1
- package/dist/hooks/HookRegistry.js +1 -1
- package/dist/hooks/HookSlot.d.ts +1 -1
- package/dist/hooks/HookSlot.d.ts.map +1 -1
- package/dist/hooks/HookSlot.js +3 -3
- package/dist/hooks/index.d.ts +0 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +22 -21
- package/dist/hooks/useBlogLike.js +2 -2
- package/dist/hooks/useGtm.js +22 -21
- package/dist/hooks/useHook.js +2 -2
- package/dist/hooks/useMoney.d.ts.map +1 -1
- package/dist/hooks/useMoney.js +22 -21
- package/dist/hooks/useNumber.d.ts.map +1 -1
- package/dist/hooks/useStore.js +22 -21
- package/dist/hooks/useTheme.js +2 -2
- package/dist/hooks/useUser.js +4 -4
- package/dist/i18n.d.ts +1 -1
- package/dist/i18n.js +1 -1
- package/dist/index.d.ts +1 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -21
- package/dist/index.js.map +1 -1
- package/dist/navigation-ZCEGLIHD.js +10 -0
- package/dist/{navigation-77T2NTFS.js.map → navigation-ZCEGLIHD.js.map} +1 -1
- package/dist/{navigation-JPUI67XY.js → navigation-ZIULIDFF.js} +6 -6
- package/dist/{navigation-JPUI67XY.js.map → navigation-ZIULIDFF.js.map} +1 -1
- package/dist/nextjs/index.d.ts +1 -2
- package/dist/nextjs/index.d.ts.map +1 -1
- package/dist/nextjs/link.d.ts +0 -4
- package/dist/nextjs/link.d.ts.map +1 -1
- package/dist/nextjs/router.d.ts +0 -6
- package/dist/nextjs/router.d.ts.map +1 -1
- package/dist/nextjs.js +2 -7
- package/dist/nextjs.js.map +1 -1
- package/dist/{not-found-73ZVE5QO.js → not-found-GRNEMF22.js} +24 -23
- package/dist/not-found-GRNEMF22.js.map +1 -0
- package/dist/providers/{i18n.d.ts → I18nProvider.d.ts} +1 -1
- package/dist/providers/I18nProvider.d.ts.map +1 -0
- package/dist/providers/NavigationProvider.d.ts +1 -4
- package/dist/providers/NavigationProvider.d.ts.map +1 -1
- package/dist/providers/TwilightProvider.d.ts +1 -1
- package/dist/providers/TwilightProvider.d.ts.map +1 -1
- package/dist/providers/index.js +22 -21
- package/dist/providers/navigation-setups.d.ts +5 -0
- package/dist/providers/navigation-setups.d.ts.map +1 -0
- package/dist/providers/twilight-context.d.ts +1 -1
- package/dist/providers/twilight-context.d.ts.map +1 -1
- package/dist/providers/twilight-init.d.ts +1 -2
- package/dist/providers/twilight-init.d.ts.map +1 -1
- package/dist/routes/account/orders/OrderSinglePage.d.ts.map +1 -1
- package/dist/routes/account/orders.js +6 -35
- package/dist/routes/account.js +14 -43
- package/dist/routes/account.js.map +1 -1
- package/dist/routes/blog/BlogAuthorPage.d.ts.map +1 -1
- package/dist/routes/blog/BlogCategoryPage.d.ts.map +1 -1
- package/dist/routes/blog/BlogPage.d.ts +1 -1
- package/dist/routes/blog/BlogPage.d.ts.map +1 -1
- package/dist/routes/blog/BlogSinglePage.d.ts.map +1 -1
- package/dist/routes/blog/BlogTagPage.d.ts.map +1 -1
- package/dist/routes/blog.js +10 -39
- package/dist/routes/blog.js.map +1 -1
- package/dist/routes/brands.js +6 -35
- package/dist/routes/brands.js.map +1 -1
- package/dist/routes/cart.js +30 -29
- package/dist/routes/cart.js.map +1 -1
- package/dist/routes/home/HomePage.d.ts.map +1 -1
- package/dist/routes/home.js +27 -26
- package/dist/routes/index.d.ts +2 -2
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +5 -35
- package/dist/routes/loyalty.js +6 -35
- package/dist/routes/loyalty.js.map +1 -1
- package/dist/routes/page.js +6 -35
- package/dist/routes/page.js.map +1 -1
- package/dist/routes/product-listing/ProductListPage.d.ts.map +1 -1
- package/dist/routes/product-listing.js +30 -32
- package/dist/routes/product-listing.js.map +1 -1
- package/dist/routes/product.js +25 -24
- package/dist/routes/product.js.map +1 -1
- package/dist/routes/root/beforeLoad.d.ts +0 -2
- package/dist/routes/root/beforeLoad.d.ts.map +1 -1
- package/dist/routes/seo-redirects.js +4 -35
- package/dist/routes/testimonials.js +2 -2
- package/dist/routes/thank-you/ThankYouPage.d.ts +1 -1
- package/dist/routes/thank-you/ThankYouPage.d.ts.map +1 -1
- package/dist/routes/thank-you.js +6 -35
- package/dist/routes/thank-you.js.map +1 -1
- package/dist/skeleton.js +27 -26
- package/dist/tanstack/middleware/twilight.d.ts.map +1 -1
- package/dist/tanstack/router.d.ts +0 -3
- package/dist/tanstack/router.d.ts.map +1 -1
- package/dist/tanstack.js +16 -31
- package/dist/tanstack.js.map +1 -1
- package/dist/twilight/context.d.ts +0 -1
- package/dist/twilight/context.d.ts.map +1 -1
- package/dist/types/hooks.d.ts +1 -0
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/hooks.js +1 -1
- package/dist/types/index.js +1 -1
- package/dist/{providers/salla-sdk.types.d.ts → types/salla-sdk.d.ts} +3 -1
- package/dist/types/salla-sdk.d.ts.map +1 -0
- package/dist/{providers/twilight.types.d.ts → types/twilight.d.ts} +4 -5
- package/dist/types/twilight.d.ts.map +1 -0
- package/dist/utils/breadcrumb.d.ts +0 -1
- package/dist/utils/breadcrumb.d.ts.map +1 -1
- package/dist/utils/engine-version.d.ts +10 -0
- package/dist/utils/engine-version.d.ts.map +1 -0
- package/dist/utils/index.js +21 -3
- package/dist/utils/index.js.map +1 -1
- package/dist/vite/adapters/tanstack.adapter.d.ts.map +1 -1
- package/dist/vite/index.js +174 -4
- package/dist/vite/index.js.map +1 -1
- package/dist/vite/plugins/twilight-schema.d.ts +18 -0
- package/dist/vite/plugins/twilight-schema.d.ts.map +1 -0
- package/dist/vite/plugins/twilight-schema.plugin.d.ts +20 -0
- package/dist/vite/plugins/twilight-schema.plugin.d.ts.map +1 -0
- package/dist/vite/types.d.ts +7 -0
- package/dist/vite/types.d.ts.map +1 -1
- package/package.json +8 -1
- package/dist/AddToCartForm-VS67AFNL.js.map +0 -1
- package/dist/BlogAuthorPage-276K2KQS.js.map +0 -1
- package/dist/BlogCategoryPage-GF5PLRG7.js.map +0 -1
- package/dist/BlogPage-BU672BXD.js.map +0 -1
- package/dist/BlogSinglePage-ELV4S5EV.js.map +0 -1
- package/dist/BlogTagPage-TXQP6ZOI.js.map +0 -1
- package/dist/BrandsPage-C6ZHC4KC.js.map +0 -1
- package/dist/Breadcrumb-TG4UTNRM.js.map +0 -1
- package/dist/CartItem-55JV6HDS.js.map +0 -1
- package/dist/CartSummary-CUWMHHMD.js.map +0 -1
- package/dist/Copyright-PG76AVV6.js +0 -9
- package/dist/CustomerLayout-SLNVCNZ6.js.map +0 -1
- package/dist/ErrorPage-TK4U3ENF.js +0 -6
- package/dist/Footer-MZDSEK57.js +0 -39
- package/dist/Header-CXFKDTOA.js +0 -15
- package/dist/ImageModal-WLJM3WIE.js +0 -41
- package/dist/ImageModal-WLJM3WIE.js.map +0 -1
- package/dist/LoyaltyPage-AIA3CUYI.js.map +0 -1
- package/dist/MainMenu-T3M5RB7L.js.map +0 -1
- package/dist/MasterLayout-QUBHRA32.js +0 -39
- package/dist/MobileMenu-6D52JOQA.js.map +0 -1
- package/dist/NotificationsPage-6H45SAS7.js.map +0 -1
- package/dist/OrderSinglePage-GP2M3YVH.js.map +0 -1
- package/dist/OrdersPage-OQGJLTQP.js.map +0 -1
- package/dist/PreOrderNotification-ZVTGNV7K.js.map +0 -1
- package/dist/PriceQuoteButton-RAAPL4N4.js.map +0 -1
- package/dist/ProductDetails-2JUCRU4W.js.map +0 -1
- package/dist/ProfilePage-XGZ2HCQH.js.map +0 -1
- package/dist/SeoCartWidget-PDK6IQ2H.js.map +0 -1
- package/dist/SettingsPage-VCQNV2PP.js.map +0 -1
- package/dist/StoreClosedNotification-3JRNBNQK.js +0 -40
- package/dist/TestimonialsPage-ENMVJ4QG.js.map +0 -1
- package/dist/ThankYouPage-4FTP6E2Y.js.map +0 -1
- package/dist/WalletPage-VKV44EEG.js.map +0 -1
- package/dist/WidgetHead-FXEPCB23.js +0 -7
- package/dist/WishlistPage-GJZCXQUY.js.map +0 -1
- package/dist/chunk-25SSLQAJ.js.map +0 -1
- package/dist/chunk-2SUOZEX2.js.map +0 -1
- package/dist/chunk-3DCZJDDK.js +0 -10
- package/dist/chunk-3UHSMGPY.js.map +0 -1
- package/dist/chunk-433EFDBW.js.map +0 -1
- package/dist/chunk-4AYOFKHU.js.map +0 -1
- package/dist/chunk-6LQFMCWK.js.map +0 -1
- package/dist/chunk-BWFBVXT3.js.map +0 -1
- package/dist/chunk-C5GWTTB6.js.map +0 -1
- package/dist/chunk-CI4HKXVH.js.map +0 -1
- package/dist/chunk-FBFPH5BB.js.map +0 -1
- package/dist/chunk-GS3G4O2R.js.map +0 -1
- package/dist/chunk-GTM2GV2N.js.map +0 -1
- package/dist/chunk-HL3HSO4R.js.map +0 -1
- package/dist/chunk-IILTG4A6.js.map +0 -1
- package/dist/chunk-J37AYLWL.js.map +0 -1
- package/dist/chunk-JIJOXZPF.js.map +0 -1
- package/dist/chunk-MXQCE3KA.js.map +0 -1
- package/dist/chunk-P43TLDS6.js.map +0 -1
- package/dist/chunk-REQC7YOE.js.map +0 -1
- package/dist/chunk-S6AVEFCN.js.map +0 -1
- package/dist/chunk-SAZBQNQK.js.map +0 -1
- package/dist/chunk-SSQ75CKA.js.map +0 -1
- package/dist/chunk-SVZOWI7E.js.map +0 -1
- package/dist/chunk-TFZ2RT6P.js.map +0 -1
- package/dist/chunk-THXWAZX2.js.map +0 -1
- package/dist/chunk-TQLEQSXE.js.map +0 -1
- package/dist/chunk-TQUHDSKQ.js.map +0 -1
- package/dist/chunk-TWAHYRKI.js.map +0 -1
- package/dist/chunk-U33UQAWO.js.map +0 -1
- package/dist/chunk-UIX3W2PN.js.map +0 -1
- package/dist/chunk-VVRYP6IL.js.map +0 -1
- package/dist/chunk-W4CSWDEH.js.map +0 -1
- package/dist/chunk-XHGF75TM.js.map +0 -1
- package/dist/chunk-ZOCDYJPX.js +0 -14
- package/dist/components/common/types.d.ts +0 -7
- package/dist/components/common/types.d.ts.map +0 -1
- package/dist/document-class-V5XSWLMX.js +0 -21
- package/dist/hooks/useIsMobile.d.ts +0 -2
- package/dist/hooks/useIsMobile.d.ts.map +0 -1
- package/dist/lib/services/index.d.ts +0 -1
- package/dist/lib/services/index.d.ts.map +0 -1
- package/dist/navigation-77T2NTFS.js +0 -10
- package/dist/not-found-73ZVE5QO.js.map +0 -1
- package/dist/providers/i18n.d.ts.map +0 -1
- package/dist/providers/salla-sdk.types.d.ts.map +0 -1
- package/dist/providers/twilight.types.d.ts.map +0 -1
- package/dist/router/context.d.ts +0 -3
- package/dist/router/context.d.ts.map +0 -1
- package/dist/router/index.d.ts +0 -4
- package/dist/router/index.d.ts.map +0 -1
- package/dist/twilight/index.d.ts +0 -3
- package/dist/twilight/index.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/modal/Modal.tsx"],"names":[],"mappings":"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","file":"chunk-HX3YKS5W.js","sourcesContent":["/**\n * Modal Component\n *\n * A controlled modal dialog with backdrop, close button, and keyboard support.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const [isOpen, setIsOpen] = useState(false);\n *\n * return (\n * <>\n * <button onClick={() => setIsOpen(true)}>Open Modal</button>\n * <Modal isOpen={isOpen} onClose={() => setIsOpen(false)}>\n * <Modal.Header>Modal Title</Modal.Header>\n * <Modal.Body>Modal content here</Modal.Body>\n * <Modal.Footer>\n * <Button onClick={() => setIsOpen(false)}>Close</Button>\n * </Modal.Footer>\n * </Modal>\n * </>\n * );\n * }\n * ```\n */\n\nimport React, { useEffect, useCallback, useRef, type ReactNode, type HTMLAttributes } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n children: ReactNode;\n /**\n * Close modal when clicking backdrop\n * @default true\n */\n closeOnBackdropClick?: boolean;\n /**\n * Close modal on Escape key\n * @default true\n */\n closeOnEscape?: boolean;\n /**\n * Prevent body scroll when modal is open\n * @default true\n */\n preventBodyScroll?: boolean;\n /**\n * Size of the modal\n * @default 'md'\n */\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n /**\n * Position of the modal\n * @default 'center'\n */\n position?: 'center' | 'top';\n /**\n * Additional className for the modal content\n */\n className?: string;\n}\n\nconst sizeClasses = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n full: 'max-w-full mx-4',\n};\n\nconst positionClasses = {\n center: 'items-center',\n top: 'items-start pt-10',\n};\n\nexport function Modal({\n isOpen,\n onClose,\n children,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n preventBodyScroll = true,\n size = 'md',\n position = 'center',\n className,\n}: ModalProps) {\n const modalRef = useRef<HTMLDivElement>(null);\n const previousActiveElement = useRef<HTMLElement | null>(null);\n\n // Handle Escape key\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Escape' && closeOnEscape) {\n onClose();\n }\n },\n [closeOnEscape, onClose]\n );\n\n // Handle backdrop click\n const handleBackdropClick = useCallback(\n (event: React.MouseEvent) => {\n if (closeOnBackdropClick && event.target === event.currentTarget) {\n onClose();\n }\n },\n [closeOnBackdropClick, onClose]\n );\n\n // Focus management and body scroll\n useEffect(() => {\n if (isOpen) {\n // Store the previously focused element\n previousActiveElement.current = document.activeElement as HTMLElement;\n\n // Focus the modal\n modalRef.current?.focus();\n\n // Prevent body scroll\n if (preventBodyScroll) {\n document.body.classList.add('menu-opened');\n }\n\n // Add keyboard listener\n document.addEventListener('keydown', handleKeyDown);\n }\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n\n // Restore body scroll\n if (preventBodyScroll) {\n document.body.classList.remove('menu-opened');\n }\n\n // Restore focus\n previousActiveElement.current?.focus();\n };\n }, [isOpen, handleKeyDown, preventBodyScroll]);\n\n if (!isOpen || typeof document === 'undefined') {\n return null;\n }\n\n return createPortal(\n <div\n className={`fixed inset-0 z-50 flex justify-center ${positionClasses[position]}`}\n onClick={handleBackdropClick}\n onKeyDown={(e) => {\n if ((e.key === 'Enter' || e.key === ' ') && closeOnBackdropClick) {\n e.preventDefault();\n onClose();\n }\n }}\n aria-modal=\"true\"\n role=\"dialog\"\n >\n {/* Backdrop */}\n <div className=\"absolute inset-0 bg-black/50 transition-opacity\" role=\"presentation\" />\n\n {/* Modal Content */}\n <div\n ref={modalRef}\n tabIndex={-1}\n className={`relative z-10 w-full rounded-lg bg-white shadow-xl transform transition-all duration-200 ease-out ${sizeClasses[size]} ${isOpen ? 'scale-100 opacity-100' : 'scale-95 opacity-0'} ${className || ''}`}\n >\n {children}\n </div>\n </div>,\n document.body\n );\n}\n\n// Modal Sub-components\nexport interface ModalHeaderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n showCloseButton?: boolean;\n onClose?: () => void;\n}\n\nModal.Header = function ModalHeader({\n children,\n showCloseButton = true,\n onClose,\n className,\n ...props\n}: ModalHeaderProps) {\n return (\n <div\n className={`flex items-center justify-between border-b border-gray-200 px-6 py-4 ${className || ''}`}\n {...props}\n >\n <h2 className=\"text-lg font-semibold text-gray-900\">{children}</h2>\n {showCloseButton && onClose && (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-md text-gray-400 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-gray-500\"\n >\n <span className=\"sr-only\">Close</span>\n <svg className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n );\n};\n\nexport interface ModalBodyProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nModal.Body = function ModalBody({ children, className, ...props }: ModalBodyProps) {\n return (\n <div className={`px-6 py-4 ${className || ''}`} {...props}>\n {children}\n </div>\n );\n};\n\nexport interface ModalFooterProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nModal.Footer = function ModalFooter({ children, className, ...props }: ModalFooterProps) {\n return (\n <div\n className={`flex items-center justify-end gap-3 border-t border-gray-200 px-6 py-4 ${className || ''}`}\n {...props}\n >\n {children}\n </div>\n );\n};\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { user } from './chunk-
|
|
2
|
-
import { getTwilightContext } from './chunk-
|
|
1
|
+
import { user } from './chunk-TCSNNCRH.js';
|
|
2
|
+
import { getTwilightContext } from './chunk-KIPZQN3Y.js';
|
|
3
3
|
import { useQuery } from '@tanstack/react-query';
|
|
4
4
|
|
|
5
5
|
function useUser() {
|
|
@@ -13,5 +13,5 @@ function useUser() {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export { useUser };
|
|
16
|
-
//# sourceMappingURL=chunk-
|
|
17
|
-
//# sourceMappingURL=chunk-
|
|
16
|
+
//# sourceMappingURL=chunk-I5Z4NJBB.js.map
|
|
17
|
+
//# sourceMappingURL=chunk-I5Z4NJBB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useUser.ts"],"names":[],"mappings":";;;;AAUO,SAAS,OAAA,GAAyB;AACvC,EAAA,MAAM,KAAA,GAAQ,oBAAmB,CAAE,SAAA;AAEnC,EAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,IACrB,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAQ;AAAA,IACxB,OAAA,EAAS,CAAC,CAAC,KAAA;AAAA,IACX,eAAA,EAAiB;AAAA,GAClB,CAAA;AAED,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,UAAA,EAAY,CAAC,CAAC,KAAA,EAAM;AACzC","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useUser.ts"],"names":[],"mappings":";;;;AAUO,SAAS,OAAA,GAAyB;AACvC,EAAA,MAAM,KAAA,GAAQ,oBAAmB,CAAE,SAAA;AAEnC,EAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,IACrB,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAQ;AAAA,IACxB,OAAA,EAAS,CAAC,CAAC,KAAA;AAAA,IACX,eAAA,EAAiB;AAAA,GAClB,CAAA;AAED,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,UAAA,EAAY,CAAC,CAAC,KAAA,EAAM;AACzC","file":"chunk-I5Z4NJBB.js","sourcesContent":["import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { getTwilightContext } from '../twilight/context';\nimport { user } from '../api/user';\nimport type { User } from '../types';\n\nexport type UseUserReturn = UseQueryResult<User | null> & {\n /** True when an auth token exists (regardless of query state). */\n isLoggedIn: boolean;\n};\n\nexport function useUser(): UseUserReturn {\n const token = getTwilightContext().authToken;\n\n const query = useQuery({\n ...user.queries.current(),\n enabled: !!token,\n placeholderData: null,\n });\n\n return { ...query, isLoggedIn: !!token };\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { orThrow } from './chunk-
|
|
2
|
-
import { getActiveScopeId, api } from './chunk-
|
|
1
|
+
import { orThrow } from './chunk-2ZRLSZ4V.js';
|
|
2
|
+
import { getActiveScopeId, api } from './chunk-2TB2LTL2.js';
|
|
3
3
|
import { queryOptions } from '@tanstack/react-query';
|
|
4
4
|
|
|
5
5
|
var category = {
|
|
@@ -26,5 +26,5 @@ var category = {
|
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
export { category };
|
|
29
|
-
//# sourceMappingURL=chunk-
|
|
30
|
-
//# sourceMappingURL=chunk-
|
|
29
|
+
//# sourceMappingURL=chunk-IWMGDYNN.js.map
|
|
30
|
+
//# sourceMappingURL=chunk-IWMGDYNN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api/category.ts"],"names":[],"mappings":";;;;AAKO,IAAM,QAAA,GAAW;AAAA,EACtB,IAAA,EAAM,OAAO,EAAA,KAAkC;AAC7C,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,WAAA,EAAc,EAAE,CAAA,CAAE,CAAA,CAAE,IAAA,EAAyB;AAC5E,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,aAAa,CAAC,EAAA,KAAkC,QAAQ,QAAA,CAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EAEzE,MAAM,YAAiC;AACrC,IAAA,MAAM,EAAE,MAAK,GAAI,MAAM,IAAI,GAAA,CAAI,YAAY,EAAE,IAAA,EAA2B;AACxE,IAAA,OAAO,QAAQ,EAAC;AAAA,EAClB,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,CAAC,EAAA,KACP,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,YAAA,EAAc,QAAA,EAAU,EAAE,CAAA;AAAA,MACrC,OAAA,EAAS,MAAM,QAAA,CAAS,IAAA,CAAK,EAAE;AAAA,KAChC,CAAA;AAAA,IAEH,IAAA,EAAM,MACJ,YAAA,CAAa;AAAA;AAAA,MAEX,QAAA,EAAU,CAAC,YAAA,EAAc,MAAA,EAAQ,EAAE,KAAA,EAAO,gBAAA,IAAoB,CAAA;AAAA,MAC9D,OAAA,EAAS,MAAM,QAAA,CAAS,IAAA;AAAK,KAC9B;AAAA;AAEP","file":"chunk-IWMGDYNN.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api, getActiveScopeId } from './client';\nimport type { Category } from '../types';\nimport { orThrow } from '../providers/NavigationProvider';\n\nexport const category = {\n find: async (id: string): Promise<Category> => {\n const { data } = await api.get(`categories/${id}`).json<{ data: Category }>();\n return data;\n },\n\n findOrThrow: (id: string): Promise<Category> => orThrow(category.find(id)),\n\n list: async (): Promise<Category[]> => {\n const { data } = await api.get('categories').json<{ data: Category[] }>();\n return data ?? [];\n },\n\n queries: {\n detail: (id: string) =>\n queryOptions({\n queryKey: ['categories', 'detail', id],\n queryFn: () => category.find(id),\n }),\n\n list: () =>\n queryOptions({\n // Scope (branch) varies the API response — key must include it.\n queryKey: ['categories', 'list', { scope: getActiveScopeId() }],\n queryFn: () => category.list(),\n }),\n },\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useTranslation } from './chunk-
|
|
1
|
+
import { useTranslation } from './chunk-TYNZ5B2B.js';
|
|
2
2
|
import { Link } from './chunk-AXW67SY7.js';
|
|
3
3
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
4
4
|
|
|
@@ -16,5 +16,5 @@ function Copyright({ storeName = "" }) {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
export { Copyright };
|
|
19
|
-
//# sourceMappingURL=chunk-
|
|
20
|
-
//# sourceMappingURL=chunk-
|
|
19
|
+
//# sourceMappingURL=chunk-JKIRRMBU.js.map
|
|
20
|
+
//# sourceMappingURL=chunk-JKIRRMBU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/layout/Copyright.tsx"],"names":[],"mappings":";;;;AAUO,SAAS,SAAA,CAAU,EAAE,SAAA,GAAY,EAAA,EAAG,EAAmB;AAC5D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,IAAA,GAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAEpC,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,CAAA,CAAE,2BAA2B,WAAW,CAAA;AAAA,IAAE,KAAA;AAAA,IAAI,IAAA;AAAA,IAAM,GAAA;AAAA,wBACpD,IAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,SAAA,EAAU,sBACpB,QAAA,EAAA,SAAA,EACH,CAAA;AAAA,IAAQ;AAAA,GAAA,EACV,CAAA;AAEJ","file":"chunk-JKIRRMBU.js","sourcesContent":["import { useTranslation } from '../../providers/I18nProvider';\nimport { Link } from '../common';\n\nexport interface CopyrightProps {\n storeName?: string;\n}\n\n/**\n * Simple copyright component - shows \"Copyright | Year StoreName | Powered by Salla\"\n */\nexport function Copyright({ storeName = '' }: CopyrightProps) {\n const { t } = useTranslation();\n const year = new Date().getFullYear();\n\n return (\n <>\n {t('blocks.footer.copyright', 'Copyright')} | {year}{' '}\n <Link to=\"/\" className=\"hover:text-primary\">\n {storeName}\n </Link>{' '}\n </>\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { api } from './chunk-
|
|
1
|
+
import { api } from './chunk-2TB2LTL2.js';
|
|
2
2
|
import { queryOptions } from '@tanstack/react-query';
|
|
3
3
|
|
|
4
4
|
var home = {
|
|
@@ -15,5 +15,5 @@ var home = {
|
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
export { home };
|
|
18
|
-
//# sourceMappingURL=chunk-
|
|
19
|
-
//# sourceMappingURL=chunk-
|
|
18
|
+
//# sourceMappingURL=chunk-KCKHA75V.js.map
|
|
19
|
+
//# sourceMappingURL=chunk-KCKHA75V.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/home.ts"],"names":[],"mappings":";;;AAIO,IAAM,IAAA,GAAO;AAAA,EAClB,YAAY,YAA0C;AACpD,IAAA,MAAM,EAAE,MAAK,GAAI,MAAM,IAAI,GAAA,CAAI,gBAAgB,EAAE,IAAA,EAAoC;AACrF,IAAA,OAAO,QAAQ,EAAC;AAAA,EAClB,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,MACV,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,MAAA,EAAQ,YAAY,CAAA;AAAA,MAC/B,OAAA,EAAS,MAAM,IAAA,CAAK,UAAA;AAAW,KAChC;AAAA;AAEP","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/api/home.ts"],"names":[],"mappings":";;;AAIO,IAAM,IAAA,GAAO;AAAA,EAClB,YAAY,YAA0C;AACpD,IAAA,MAAM,EAAE,MAAK,GAAI,MAAM,IAAI,GAAA,CAAI,gBAAgB,EAAE,IAAA,EAAoC;AACrF,IAAA,OAAO,QAAQ,EAAC;AAAA,EAClB,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,MACV,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,MAAA,EAAQ,YAAY,CAAA;AAAA,MAC/B,OAAA,EAAS,MAAM,IAAA,CAAK,UAAA;AAAW,KAChC;AAAA;AAEP","file":"chunk-KCKHA75V.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport type { HomeComponentData } from '../types';\n\nexport const home = {\n components: async (): Promise<HomeComponentData[]> => {\n const { data } = await api.get('component/list').json<{ data: HomeComponentData[] }>();\n return data ?? [];\n },\n\n queries: {\n components: () =>\n queryOptions({\n queryKey: ['home', 'components'],\n queryFn: () => home.components(),\n }),\n },\n};\n"]}
|
|
@@ -49,7 +49,6 @@ var DEFAULT_DATA = {
|
|
|
49
49
|
routeId: "",
|
|
50
50
|
location: { ...DEFAULT_LOCATION },
|
|
51
51
|
authToken: null,
|
|
52
|
-
isMobile: false,
|
|
53
52
|
scopeId: null,
|
|
54
53
|
i18n: void 0,
|
|
55
54
|
page: void 0
|
|
@@ -82,7 +81,6 @@ function mergeIntoStore(store, partial) {
|
|
|
82
81
|
store.location = { ...store.location, ...partial.location };
|
|
83
82
|
if ("authToken" in partial && partial.authToken !== void 0)
|
|
84
83
|
store.authToken = partial.authToken ?? null;
|
|
85
|
-
if ("isMobile" in partial) store.isMobile = partial.isMobile ?? false;
|
|
86
84
|
if ("scopeId" in partial && partial.scopeId !== void 0)
|
|
87
85
|
store.scopeId = partial.scopeId ?? null;
|
|
88
86
|
if ("i18n" in partial && partial.i18n != null) store.i18n = partial.i18n;
|
|
@@ -133,9 +131,6 @@ function getTwilightContext() {
|
|
|
133
131
|
get authToken() {
|
|
134
132
|
return data.authToken;
|
|
135
133
|
},
|
|
136
|
-
get isMobile() {
|
|
137
|
-
return data.isMobile;
|
|
138
|
-
},
|
|
139
134
|
get scopeId() {
|
|
140
135
|
return data.scopeId;
|
|
141
136
|
},
|
|
@@ -159,5 +154,5 @@ function getTwilightContext() {
|
|
|
159
154
|
}
|
|
160
155
|
|
|
161
156
|
export { SettingsError, createI18nInstance, getTwilightContext, runWithTwilightContext, subscribeTwilight, updateTwilightContext };
|
|
162
|
-
//# sourceMappingURL=chunk-
|
|
163
|
-
//# sourceMappingURL=chunk-
|
|
157
|
+
//# sourceMappingURL=chunk-KIPZQN3Y.js.map
|
|
158
|
+
//# sourceMappingURL=chunk-KIPZQN3Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/errors.ts","../src/providers/i18n-factory.ts","../src/twilight/context.ts"],"names":[],"mappings":"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","file":"chunk-KIPZQN3Y.js","sourcesContent":["export class SettingsError extends Error {\n constructor(message?: string) {\n super(message ?? 'Store settings could not be loaded.');\n this.name = 'SettingsError';\n }\n}\n","import { createInstance, type i18n as I18nInstance } from 'i18next';\nimport { initReactI18next } from 'react-i18next';\n\nexport type TranslationMessages = Record<string, Record<string, string>>;\n\n/**\n * Creates a new i18next instance for the given locale.\n *\n * @param locale - Active locale code, e.g. `'ar'`\n * @param translations - App translations from the Salla API (store-specific)\n * @param themeTranslations - Bundled theme translations (static defaults)\n */\nexport function createI18nInstance(\n locale: string,\n translations?: TranslationMessages,\n themeTranslations?: TranslationMessages\n): I18nInstance {\n const instance = createInstance();\n const transKey = `${locale}.trans`;\n\n instance.use(initReactI18next).init({\n lng: locale,\n fallbackLng: locale,\n ns: ['app', 'theme'],\n defaultNS: 'app',\n fallbackNS: 'theme',\n resources: {\n [locale]: {\n app: translations?.[transKey] ?? {},\n theme: themeTranslations?.[transKey] ?? {},\n },\n },\n interpolation: { escapeValue: false },\n react: { useSuspense: false },\n keySeparator: '.',\n nsSeparator: false,\n });\n\n return instance;\n}\n\n/**\n * Creates i18n instance for testing\n * @param locale - Locale code (default: 'ar')\n * @param translations - Optional translations\n */\nexport function createTestI18n(locale = 'ar', translations?: TranslationMessages): I18nInstance {\n return createI18nInstance(locale, translations);\n}\n","import type { QueryClient } from '@tanstack/react-query';\nimport type { i18n } from 'i18next';\nimport type { StoreContext } from '../api/store';\nimport { FALLBACK_LOCALE, getLanguageInfo } from '../providers/locale-constants';\nimport type { TranslationMessages } from '../providers/i18n-factory';\nimport { createI18nInstance } from '../providers/i18n-factory';\nimport { SettingsError } from '../utils/errors';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TwilightLocation<TSearch = Record<string, unknown>> {\n href: string;\n pathname: string;\n search: TSearch;\n searchStr: string;\n state: Record<string, unknown>;\n hash: string;\n}\n\nexport interface PageContext {\n slug: string;\n id?: string | number;\n title: string;\n url?: string;\n parent?: { id: string | number; name: string; url: string } | null;\n breadcrumbs?: { name: string; url: string }[];\n}\n\nexport interface TwilightContext {\n queryClient: QueryClient;\n settings: StoreContext;\n locale: string;\n routeId: string;\n location: TwilightLocation;\n authToken: string | null;\n scopeId: string | null;\n i18n: i18n;\n dir: 'ltr' | 'rtl';\n page?: PageContext;\n extras?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Internal Store\n// ============================================================================\n\nconst DEFAULT_LOCATION: TwilightLocation = {\n href: '',\n pathname: '',\n search: {},\n searchStr: '',\n state: {},\n hash: '',\n};\n\ninterface ContextData {\n queryClient: QueryClient;\n settings: StoreContext | null;\n locale: string;\n routeId: string;\n location: TwilightLocation;\n authToken: string | null;\n scopeId: string | null;\n i18n?: i18n;\n page?: PageContext;\n extras?: Record<string, unknown>;\n}\n\nconst DEFAULT_DATA: ContextData = {\n queryClient: null as unknown as QueryClient,\n settings: null,\n locale: FALLBACK_LOCALE,\n routeId: '',\n location: { ...DEFAULT_LOCATION },\n authToken: null,\n scopeId: null,\n i18n: undefined,\n page: undefined,\n};\n\n// ============================================================================\n// Storage: AsyncLocalStorage (server) or module-level store (client)\n// ============================================================================\n\ntype AsyncLocalStore<T> = { getStore(): T | undefined; run(val: T, fn: () => unknown): unknown };\n\n// Initialize ALS at module load time for SSR — no race condition\nlet _als: AsyncLocalStore<ContextData> | null = null;\nif (typeof window === 'undefined') {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { AsyncLocalStorage } = require('node:async_hooks') as {\n AsyncLocalStorage: new <T>() => AsyncLocalStore<T>;\n };\n _als = new AsyncLocalStorage<ContextData>();\n } catch {\n _als = null;\n }\n}\n\nconst clientStore: ContextData = { ...DEFAULT_DATA };\n\nfunction getTwilightStore(): ContextData {\n if (_als) {\n const store = _als.getStore();\n if (!store)\n throw new Error('[Twilight] No request context. Wrap with runWithTwilightContext().');\n return store;\n }\n return clientStore;\n}\n\nfunction writableStore(): ContextData {\n if (_als) {\n const store = _als.getStore();\n if (store) return store;\n }\n return clientStore;\n}\n\nfunction mergeIntoStore(store: ContextData, partial: Partial<TwilightContext>): void {\n if ('queryClient' in partial && partial.queryClient) store.queryClient = partial.queryClient;\n if ('settings' in partial && partial.settings != null) store.settings = partial.settings;\n if ('locale' in partial && partial.locale != null) store.locale = partial.locale;\n if ('routeId' in partial && partial.routeId != null) store.routeId = partial.routeId;\n if ('location' in partial && partial.location != null)\n store.location = { ...store.location, ...partial.location };\n if ('authToken' in partial && partial.authToken !== undefined)\n store.authToken = partial.authToken ?? null;\n if ('scopeId' in partial && partial.scopeId !== undefined)\n store.scopeId = partial.scopeId ?? null;\n if ('i18n' in partial && partial.i18n != null) store.i18n = partial.i18n;\n if ('page' in partial) store.page = partial.page;\n if ('extras' in partial) store.extras = partial.extras;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\nexport function runWithTwilightContext<T>(partial: Partial<TwilightContext>, fn: () => T): T {\n if (_als) {\n const data: ContextData = { ...DEFAULT_DATA };\n mergeIntoStore(data, partial);\n return _als.run(data, fn) as T;\n }\n mergeIntoStore(clientStore, partial);\n return fn();\n}\n\n// Client-only subscription so React consumers (useRouteId/useIsHome/…) re-render\n// when navigation mutates the module store. Mirrors hooks/useWishlist.ts.\nconst listeners = new Set<() => void>();\n\nexport function subscribeTwilight(listener: () => void): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\nexport function updateTwilightContext(partial: Partial<TwilightContext>): void {\n mergeIntoStore(getTwilightStore(), partial);\n // Server uses AsyncLocalStorage and has no React subscribers; notify on client only.\n if (typeof window !== 'undefined') {\n for (const listener of listeners) listener();\n }\n}\n\nexport function getTwilightContext(): TwilightContext {\n const data = getTwilightStore();\n return {\n get queryClient() {\n return data.queryClient;\n },\n get settings() {\n if (!data.settings) throw new SettingsError();\n return data.settings;\n },\n get locale() {\n return data.locale;\n },\n get routeId() {\n return data.routeId;\n },\n get location() {\n return data.location;\n },\n get authToken() {\n return data.authToken;\n },\n get scopeId() {\n return data.scopeId;\n },\n get i18n() {\n if (!data.i18n) {\n const translations = data.queryClient?.getQueryData(['translations']) as\n | TranslationMessages\n | undefined;\n data.i18n = createI18nInstance(data.locale, translations);\n }\n return data.i18n;\n },\n get dir() {\n return getLanguageInfo(data.locale).dir;\n },\n get page() {\n return data.page;\n },\n get extras() {\n return data.extras;\n },\n };\n}\n\n/** @internal Reset store for testing */\nexport function resetForTesting(): void {\n Object.assign(writableStore(), { ...DEFAULT_DATA });\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cdn } from './chunk-
|
|
1
|
+
import { cdn } from './chunk-2TB2LTL2.js';
|
|
2
2
|
import { queryOptions } from '@tanstack/react-query';
|
|
3
3
|
|
|
4
4
|
var TRANSLATIONS_CDN_FALLBACK = "js/translations.json";
|
|
@@ -21,5 +21,5 @@ var translations = {
|
|
|
21
21
|
};
|
|
22
22
|
|
|
23
23
|
export { translations };
|
|
24
|
-
//# sourceMappingURL=chunk-
|
|
25
|
-
//# sourceMappingURL=chunk-
|
|
24
|
+
//# sourceMappingURL=chunk-KJRALAYM.js.map
|
|
25
|
+
//# sourceMappingURL=chunk-KJRALAYM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api/translations.ts"],"names":[],"mappings":";;;AAIA,IAAM,yBAAA,GAA4B,sBAAA;AAC3B,IAAM,YAAA,GAAe;AAAA,EAC1B,KAAK,YAAiD;AACpD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAChB,GAAA,CAAI,yBAAA,EAA2B,EAAE,OAAA,EAAS,GAAA,EAAM,CAAA,CAChD,IAAA,EAA0B;AAC7B,MAAA,OAAO,IAAA,IAAQ,IAAA;AAAA,IACjB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,CAAQ,KAAK,gDAAgD,CAAA;AAC7D,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,QAAA,EAAU,MACR,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,cAAc,CAAA;AAAA,MACzB,OAAA,EAAS,MAAM,YAAA,CAAa,GAAA;AAAI,KACjC;AAAA;AAEP","file":"chunk-KJRALAYM.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { cdn } from './client';\nimport type { TranslationMessages } from '../providers/I18nProvider';\n\nconst TRANSLATIONS_CDN_FALLBACK = 'js/translations.json';\nexport const translations = {\n get: async (): Promise<TranslationMessages | null> => {\n try {\n const data = await cdn\n .get(TRANSLATIONS_CDN_FALLBACK, { timeout: 5000 })\n .json<TranslationMessages>();\n return data ?? null;\n } catch {\n console.warn('[translations.get] Failed to load translations');\n return null;\n }\n },\n\n queries: {\n byLocale: () =>\n queryOptions({\n queryKey: ['translations'],\n queryFn: () => translations.get(),\n }),\n },\n};\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { order } from './chunk-
|
|
1
|
+
import { order } from './chunk-GQG4KE5Z.js';
|
|
2
2
|
import { buildHreflangAlternates } from './chunk-TZ3E5BN4.js';
|
|
3
|
-
import { orUnauthorized } from './chunk-
|
|
3
|
+
import { orUnauthorized } from './chunk-2ZRLSZ4V.js';
|
|
4
4
|
import { RouteId } from './chunk-MTONGOJD.js';
|
|
5
|
-
import { getTwilightContext } from './chunk-
|
|
5
|
+
import { getTwilightContext } from './chunk-KIPZQN3Y.js';
|
|
6
6
|
import { lazy } from 'react';
|
|
7
7
|
|
|
8
8
|
// src/routes/account/orders/loader.ts
|
|
@@ -47,9 +47,9 @@ async function orderSingleLoader({
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
// src/routes/account/orders/index.tsx
|
|
50
|
-
var LazyOrdersPage = lazy(() => import('./OrdersPage-
|
|
50
|
+
var LazyOrdersPage = lazy(() => import('./OrdersPage-ARIDUNIW.js').then((m) => ({ default: m.OrdersPage })));
|
|
51
51
|
var LazyOrderSinglePage = lazy(
|
|
52
|
-
() => import('./OrderSinglePage-
|
|
52
|
+
() => import('./OrderSinglePage-NAZY23SD.js').then((m) => ({ default: m.OrderSinglePage }))
|
|
53
53
|
);
|
|
54
54
|
var OrdersPage = LazyOrdersPage;
|
|
55
55
|
var OrderSinglePage = LazyOrderSinglePage;
|
|
@@ -101,5 +101,5 @@ var OrderSingle = {
|
|
|
101
101
|
};
|
|
102
102
|
|
|
103
103
|
export { OrderSingle, OrderSinglePage, Orders, OrdersPage, orderSingleLoader, ordersLoader };
|
|
104
|
-
//# sourceMappingURL=chunk-
|
|
105
|
-
//# sourceMappingURL=chunk-
|
|
104
|
+
//# sourceMappingURL=chunk-KZDE3XKU.js.map
|
|
105
|
+
//# sourceMappingURL=chunk-KZDE3XKU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/routes/account/orders/loader.ts","../src/routes/account/orders/index.tsx"],"names":[],"mappings":"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","file":"chunk-KZDE3XKU.js","sourcesContent":["import { order } from '../../../api/order';\nimport { getTwilightContext } from '../../../twilight/context';\nimport { RouteId } from '../../../router/route-ids';\nimport { orUnauthorized } from '../../../providers/NavigationProvider';\nimport type { OrdersPageProps, OrderSinglePageProps, OrdersQuery } from './types';\nimport type { IdParams } from '../../types';\n\nexport async function ordersLoader(\n ctx: { query?: OrdersQuery },\n extend?: (\n data: OrdersPageProps,\n ctx: { params: Record<string, never> }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<OrdersPageProps> {\n const query = ctx.query;\n const isPending = query?.status === 'pending';\n const response = await orUnauthorized(\n order.list({\n status: query?.status,\n feedback_status: query?.feedback_status,\n })\n );\n const i18n = getTwilightContext().i18n;\n const pageData: OrdersPageProps = {\n page: {\n title: isPending\n ? i18n.t('common.titles.pending_orders') || 'Pending Orders'\n : i18n.t('common.titles.orders') || 'Orders',\n slug: 'orders',\n },\n orders: response.data,\n cursor: response.cursor,\n query,\n };\n\n if (extend) {\n const extra = await extend(pageData, { params: {} });\n return { ...pageData, ...extra } as OrdersPageProps;\n }\n return pageData;\n}\n\nexport async function orderSingleLoader({\n params,\n}: {\n params: IdParams;\n}): Promise<OrderSinglePageProps> {\n const data = await order.findOrThrow(params.id);\n const i18n = getTwilightContext().i18n;\n return {\n page: {\n slug: RouteId.CUSTOMER_ORDERS_SINGLE,\n id: String(params.id),\n title: (i18n.t('pages.orders.order_details') || 'Order Details').replace(':id', params.id),\n },\n order: data.order,\n };\n}\n","import type { HeadDescriptor } from '../../../utils/head';\nimport { buildHreflangAlternates } from '../../../utils/baseHead';\nimport { lazy } from 'react';\nimport { ordersLoader, orderSingleLoader } from './loader';\nimport type { OrdersPageProps, OrderSinglePageProps, OrdersSearchParams } from './types';\nimport type { IdParams } from '../../types';\nimport type { TwilightContext } from '../../../twilight/context';\nimport { RouteId } from '../../../router/route-ids';\n\n// Lazy-load components for code-splitting\nconst LazyOrdersPage = lazy(() => import('./OrdersPage').then((m) => ({ default: m.OrdersPage })));\nconst LazyOrderSinglePage = lazy(() =>\n import('./OrderSinglePage').then((m) => ({ default: m.OrderSinglePage }))\n);\n\nexport const OrdersPage = LazyOrdersPage;\nexport const OrderSinglePage = LazyOrderSinglePage;\nexport { ordersLoader, orderSingleLoader } from './loader';\nexport type {\n OrdersPageProps,\n OrderSinglePageProps,\n OrdersSearchParams,\n OrdersQuery,\n} from './types';\n\nasync function ordersLoaderWithExtend(\n ctx: { search?: OrdersSearchParams; locale?: string },\n extend?: (\n data: OrdersPageProps,\n ctx: { params: Record<string, never> }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<OrdersPageProps> {\n const query = ctx.search;\n const data = await ordersLoader({ query }, extend);\n\n if (extend) {\n const extra = await extend(data, { params: {} });\n return { ...data, ...extra } as OrdersPageProps;\n }\n return data;\n}\n\nfunction ordersHead(ctx: TwilightContext, data: OrdersPageProps): HeadDescriptor {\n const isPending = ctx.location.search?.status === 'pending';\n const base: HeadDescriptor = {\n title: ctx.i18n.t(isPending ? 'common.titles.pending_orders' : 'common.titles.orders'),\n description: data.page.description,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nasync function orderSingleLoaderWithExtend(\n ctx: { params: IdParams; locale?: string },\n extend?: (\n data: OrderSinglePageProps,\n ctx: { params: IdParams }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<OrderSinglePageProps> {\n const data = await orderSingleLoader({ params: ctx.params });\n\n if (extend) {\n const extra = await extend(data, ctx);\n return { ...data, ...extra } as OrderSinglePageProps;\n }\n return data;\n}\n\nfunction orderSingleHead(ctx: TwilightContext, data: OrderSinglePageProps): HeadDescriptor {\n const base: HeadDescriptor = {\n title: data.page.title,\n description: data.page.description,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const Orders = {\n id: RouteId.CUSTOMER_ORDERS_INDEX,\n loader: ordersLoaderWithExtend,\n head: ordersHead,\n Component: LazyOrdersPage,\n} as const;\nexport const OrderSingle = {\n id: RouteId.CUSTOMER_ORDERS_SINGLE,\n loader: orderSingleLoaderWithExtend,\n head: orderSingleHead,\n Component: LazyOrderSinglePage,\n} as const;\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { getActiveScopeId, api } from './chunk-
|
|
2
|
-
import { getTwilightContext } from './chunk-
|
|
1
|
+
import { getActiveScopeId, api } from './chunk-2TB2LTL2.js';
|
|
2
|
+
import { getTwilightContext } from './chunk-KIPZQN3Y.js';
|
|
3
3
|
import { queryOptions } from '@tanstack/react-query';
|
|
4
4
|
|
|
5
5
|
var DEFAULT_INCLUDE_ITEMS = [
|
|
@@ -76,5 +76,5 @@ var store = {
|
|
|
76
76
|
};
|
|
77
77
|
|
|
78
78
|
export { resolveStoreIdentifier, store };
|
|
79
|
-
//# sourceMappingURL=chunk-
|
|
80
|
-
//# sourceMappingURL=chunk-
|
|
79
|
+
//# sourceMappingURL=chunk-LSDIFHXZ.js.map
|
|
80
|
+
//# sourceMappingURL=chunk-LSDIFHXZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/store.ts"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/api/store.ts"],"names":[],"mappings":"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","file":"chunk-LSDIFHXZ.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api, getActiveScopeId } from './client';\nimport type { Store, Theme, Language } from '../types';\nimport { getTwilightContext } from '../twilight/context';\n\nconst DEFAULT_INCLUDE_ITEMS = [\n 'store',\n 'settings',\n 'theme',\n 'theme_settings',\n 'external_services',\n 'currencies',\n 'languages',\n 'payments',\n 'product_widgets',\n 'rating',\n 'ratings',\n];\n\n/**\n * Raw API response for settings endpoint.\n * Languages come as object: { \"AR\": { code, name, ... }, \"EN\": {...} }\n */\ninterface SettingsApiResponse {\n store?: Store;\n theme?: Theme;\n languages?: Record<string, Language>;\n currencies?: Record<\n string,\n { code: string; name: string; symbol: string; amount: number; country_code: string }\n >;\n external_services?: Record<string, unknown>;\n headers?: Record<string, unknown>;\n login?: { url: string; turnstile_site_key: string };\n affiliate?: { utm_url: string; cta_enabled: boolean };\n debug?: boolean;\n trace_console?: boolean;\n policy_url?: string;\n}\n\n/**\n * Central settings context - single source of truth for all API data.\n * Contains everything from the settings endpoint response after processing.\n */\nexport interface StoreContext {\n store?: Store;\n theme?: Theme;\n /** Languages as array after conversion from API object format */\n languages?: Language[];\n currencies?: Record<\n string,\n { code: string; name: string; symbol: string; amount: number; country_code: string }\n >;\n external_services?: Record<string, unknown>;\n headers?: Record<string, unknown>;\n login?: { url: string; turnstile_site_key: string };\n affiliate?: { utm_url: string; cta_enabled: boolean };\n debug?: boolean;\n trace_console?: boolean; // todo:: remove it\n policy_url?: string;\n}\n\nexport function resolveStoreIdentifier(explicit?: string): string {\n if (explicit) return explicit;\n try {\n const viteEnv = (import.meta as { env?: { VITE_STORE_DOMAIN?: string } }).env\n ?.VITE_STORE_DOMAIN;\n if (viteEnv) return viteEnv;\n } catch {\n /* import.meta not available in all environments */\n }\n const isBrowser = typeof window !== 'undefined';\n if (isBrowser) return window.location.host;\n return (typeof process !== 'undefined' && process.env?.STORE_DOMAIN) || '';\n}\n\n/**\n * Converts languages object from API to array format.\n * API returns: { \"AR\": { code, name, ... }, \"EN\": { ... } }\n * We need: [{ code, name, ... }, { code, name, ... }]\n * todo:: return the languages as object from the APIs to avoid this\n */\nfunction languagesToArray(languages?: Record<string, Language>): Language[] | undefined {\n if (!languages) return undefined;\n // The SDK's localization modal reads `lang.iso_code` (not `code`) when a language is\n // selected — without it the switch navigates to `/undefined/...`.\n return Object.values(languages).map((lang) => ({ iso_code: lang.code, ...lang }));\n}\n\nexport const store = {\n settings: async (storeIdentifier?: string): Promise<StoreContext | null> => {\n const identifier = storeIdentifier ?? resolveStoreIdentifier();\n\n if (!identifier) {\n console.warn('[store.settings] No store identifier available');\n return null;\n }\n\n const includeParams = DEFAULT_INCLUDE_ITEMS.map((i) => `include[]=${i}`).join('&');\n const scopeId = getActiveScopeId();\n const params = scopeId != null ? `${includeParams}&scope=${scopeId}` : includeParams;\n\n try {\n const json = await api\n .get(`store/settings?${params}`, { timeout: 5000 })\n .json<{ data?: SettingsApiResponse }>();\n\n const data = json?.data;\n if (!data) return null;\n\n // Convert languages from object to array\n const languages = languagesToArray(data.languages);\n\n return {\n store: data.store,\n theme: data.theme,\n languages,\n currencies: data.currencies,\n external_services: data.external_services,\n headers: data.headers,\n login: data.login,\n affiliate: data.affiliate,\n policy_url: data.policy_url,\n };\n } catch (error) {\n console.error('[store.settings] Failed:', error);\n return null;\n }\n },\n\n queries: {\n settings: (storeIdentifier?: string) =>\n queryOptions<StoreContext | null>({\n queryKey: [\n 'store',\n 'settings',\n storeIdentifier,\n getTwilightContext().locale,\n getActiveScopeId(),\n ],\n queryFn: () => store.settings(storeIdentifier),\n }),\n },\n};\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { api } from './chunk-
|
|
2
|
-
import { getTwilightContext } from './chunk-
|
|
1
|
+
import { api } from './chunk-2TB2LTL2.js';
|
|
2
|
+
import { getTwilightContext } from './chunk-KIPZQN3Y.js';
|
|
3
3
|
import { queryOptions } from '@tanstack/react-query';
|
|
4
4
|
|
|
5
5
|
var menu = {
|
|
@@ -23,5 +23,5 @@ var menu = {
|
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
export { menu };
|
|
26
|
-
//# sourceMappingURL=chunk-
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
26
|
+
//# sourceMappingURL=chunk-NBHI5X36.js.map
|
|
27
|
+
//# sourceMappingURL=chunk-NBHI5X36.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/menu.ts"],"names":[],"mappings":";;;;AAKO,IAAM,IAAA,GAAO;AAAA,EAClB,QAAQ,YAAiC;AACvC,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,kBAAA,EAAmB;AACtC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAE,CAAA,CAAE,IAAA,EAA2B;AACzF,IAAA,OAAO,QAAQ,EAAC;AAAA,EAClB,CAAA;AAAA,EAEA,QAAQ,YAAiC;AACvC,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,kBAAA,EAAmB;AACtC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAE,CAAA,CAAE,IAAA,EAA2B;AACzF,IAAA,OAAO,QAAQ,EAAC;AAAA,EAClB,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,MACN,YAAA,CAAa;AAAA,MACX,UAAU,CAAC,OAAA,EAAS,QAAA,EAAU,kBAAA,GAAqB,MAAM,CAAA;AAAA,MACzD,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAO;AAAA,MAC3B,SAAA,EAAW,IAAI,EAAA,GAAK;AAAA,KACrB;AAAA;AAEP","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/api/menu.ts"],"names":[],"mappings":";;;;AAKO,IAAM,IAAA,GAAO;AAAA,EAClB,QAAQ,YAAiC;AACvC,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,kBAAA,EAAmB;AACtC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAE,CAAA,CAAE,IAAA,EAA2B;AACzF,IAAA,OAAO,QAAQ,EAAC;AAAA,EAClB,CAAA;AAAA,EAEA,QAAQ,YAAiC;AACvC,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,kBAAA,EAAmB;AACtC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAE,CAAA,CAAE,IAAA,EAA2B;AACzF,IAAA,OAAO,QAAQ,EAAC;AAAA,EAClB,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,MACN,YAAA,CAAa;AAAA,MACX,UAAU,CAAC,OAAA,EAAS,QAAA,EAAU,kBAAA,GAAqB,MAAM,CAAA;AAAA,MACzD,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAO;AAAA,MAC3B,SAAA,EAAW,IAAI,EAAA,GAAK;AAAA,KACrB;AAAA;AAEP","file":"chunk-NBHI5X36.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport { getTwilightContext } from '../twilight/context';\nimport type { MenuItem } from '../types';\n\nexport const menu = {\n header: async (): Promise<MenuItem[]> => {\n const { locale } = getTwilightContext();\n const { data } = await api.get(`menus/header?lang=${locale}`).json<{ data: MenuItem[] }>();\n return data || [];\n },\n\n footer: async (): Promise<MenuItem[]> => {\n const { locale } = getTwilightContext();\n const { data } = await api.get(`menus/footer?lang=${locale}`).json<{ data: MenuItem[] }>();\n return data || [];\n },\n\n queries: {\n header: () =>\n queryOptions({\n queryKey: ['menus', 'header', getTwilightContext().locale],\n queryFn: () => menu.header(),\n staleTime: 5 * 60 * 1000,\n }),\n },\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useTranslation } from './chunk-
|
|
1
|
+
import { useTranslation } from './chunk-TYNZ5B2B.js';
|
|
2
2
|
import { useAsyncFn } from './chunk-6BZ5TKEV.js';
|
|
3
3
|
import { useState, useEffect, useCallback } from 'react';
|
|
4
4
|
|
|
@@ -52,5 +52,5 @@ function useBlogLike(blogId, initialCount = 0) {
|
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
export { useBlogLike };
|
|
55
|
-
//# sourceMappingURL=chunk-
|
|
56
|
-
//# sourceMappingURL=chunk-
|
|
55
|
+
//# sourceMappingURL=chunk-OAMIDZKW.js.map
|
|
56
|
+
//# sourceMappingURL=chunk-OAMIDZKW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useBlogLike.ts"],"names":[],"mappings":"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","file":"chunk-OAMIDZKW.js","sourcesContent":["import { useState, useCallback, useEffect } from 'react';\nimport { useAsyncFn } from './useAsyncFn';\nimport { useTranslation } from '../providers/I18nProvider';\nimport type { UseToggle } from './types';\n\n/**\n * UseBlogLikeResult - Return type for useBlogLike hook\n */\nexport type UseBlogLikeResult = UseToggle;\n\n/**\n * useBlogLike - Hook for managing blog like functionality\n *\n * Handles blog likes with local storage persistence to remember liked blogs\n * across sessions. Integrates with the Salla SDK for API operations and\n * maintains like counts.\n *\n * @param blogId - The ID of the blog to manage likes for\n * @param initialCount - Initial like count (optional, defaults to 0)\n *\n * @returns Blog like state and management functions\n *\n * @example\n * ```tsx\n * function BlogLikeButton({ blogId, initialCount }) {\n * const { active, count, toggle, loading } = useBlogLike(blogId, initialCount);\n *\n * return (\n * <button\n * onClick={toggle}\n * disabled={loading}\n * className={active ? 'liked' : ''}\n * >\n * {loading ? (\n * <span className=\"loader loader--small\"></span>\n * ) : (\n * <i className=\"sicon-thumbs-up\"></i>\n * )}\n * {count}\n * </button>\n * );\n * }\n * ```\n */\n\nconst LIKED_BLOGS_KEY = 'liked_blogs';\n\nexport function useBlogLike(blogId: number, initialCount: number = 0): UseBlogLikeResult {\n const [likedBlogs, setLikedBlogs] = useState<number[]>([]);\n\n useEffect(() => {\n try {\n const stored = localStorage.getItem(LIKED_BLOGS_KEY);\n if (stored) setLikedBlogs(JSON.parse(stored));\n } catch (_error) {\n /* ignore storage errors */\n }\n }, []);\n\n useEffect(() => {\n try {\n localStorage.setItem(LIKED_BLOGS_KEY, JSON.stringify(likedBlogs));\n } catch (_error) {\n /* ignore storage errors */\n }\n }, [likedBlogs]);\n const [count, setCount] = useState(initialCount);\n const { t } = useTranslation();\n\n const active = likedBlogs.includes(blogId);\n\n const [addState, addFn] = useAsyncFn(async () => {\n const salla = window.salla;\n if (salla?.config?.isGuest?.()) {\n salla.notify.error(t('common.messages.must_login', 'Please login first'));\n return;\n }\n await salla?.api.request(`blogs/${blogId}/like`, {}, 'put');\n setLikedBlogs((prev) => (prev.includes(blogId) ? prev : [...prev, blogId]));\n setCount((prev) => prev + 1);\n }, [blogId, setLikedBlogs]);\n\n const [removeState, removeFn] = useAsyncFn(async () => {\n const salla = window.salla;\n await salla?.api.request(`blogs/${blogId}/unlike`, {}, 'delete');\n setLikedBlogs((prev) => prev.filter((id) => id !== blogId));\n setCount((prev) => Math.max(0, prev - 1));\n }, [blogId, setLikedBlogs]);\n\n const add = async (): Promise<boolean> => !(((await addFn()) as unknown) instanceof Error);\n const remove = async (): Promise<boolean> => !(((await removeFn()) as unknown) instanceof Error);\n\n const toggle = useCallback(() => (active ? remove() : add()), [active, addFn, removeFn]);\n\n return {\n active,\n count,\n add,\n remove,\n toggle,\n loading: addState.loading || removeState.loading,\n error: (addState.error ?? removeState.error)?.message ?? null,\n };\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useTwilight } from './chunk-
|
|
1
|
+
import { useTwilight } from './chunk-DF6FBKDN.js';
|
|
2
2
|
import { useRef, useState, useEffect } from 'react';
|
|
3
3
|
import { toast, Toaster as Toaster$1 } from 'sonner';
|
|
4
4
|
import { jsx } from 'react/jsx-runtime';
|
|
@@ -126,48 +126,7 @@ function Toaster({
|
|
|
126
126
|
}
|
|
127
127
|
);
|
|
128
128
|
}
|
|
129
|
-
var useToast = Object.assign(
|
|
130
|
-
(title, options) => toast(title, options),
|
|
131
|
-
{
|
|
132
|
-
success: (title, options) => toast.success(title, options),
|
|
133
|
-
error: (title, options) => toast.error(title, options),
|
|
134
|
-
warning: (title, options) => toast.warning(title, options),
|
|
135
|
-
info: (title, options) => toast.info(title, options),
|
|
136
|
-
loading: (title, options) => toast.loading(title, options),
|
|
137
|
-
update: (id, options) => {
|
|
138
|
-
const { title, type, ...rest } = options;
|
|
139
|
-
if (type === "success") {
|
|
140
|
-
toast.success(id, { ...rest, description: title });
|
|
141
|
-
} else if (type === "error") {
|
|
142
|
-
toast.error(id, { ...rest, description: title });
|
|
143
|
-
} else if (type === "warning") {
|
|
144
|
-
toast.warning(id, { ...rest, description: title });
|
|
145
|
-
} else if (type === "info") {
|
|
146
|
-
toast.info(id, { ...rest, description: title });
|
|
147
|
-
} else if (type === "loading") {
|
|
148
|
-
toast.loading(id, { ...rest, description: title });
|
|
149
|
-
} else {
|
|
150
|
-
toast(id, { ...rest, description: title });
|
|
151
|
-
}
|
|
152
|
-
},
|
|
153
|
-
dismiss: (id) => {
|
|
154
|
-
if (id !== void 0) {
|
|
155
|
-
toast.dismiss(id);
|
|
156
|
-
} else {
|
|
157
|
-
toast.dismiss();
|
|
158
|
-
}
|
|
159
|
-
},
|
|
160
|
-
promise: (promise, options) => {
|
|
161
|
-
toast.promise(promise, {
|
|
162
|
-
loading: options.loading,
|
|
163
|
-
success: options.success,
|
|
164
|
-
error: options.error
|
|
165
|
-
});
|
|
166
|
-
return promise;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
);
|
|
170
129
|
|
|
171
|
-
export { Toaster
|
|
172
|
-
//# sourceMappingURL=chunk-
|
|
173
|
-
//# sourceMappingURL=chunk-
|
|
130
|
+
export { Toaster };
|
|
131
|
+
//# sourceMappingURL=chunk-OBSAH7K6.js.map
|
|
132
|
+
//# sourceMappingURL=chunk-OBSAH7K6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/toast/Toaster.tsx"],"names":["SonnerToaster"],"mappings":"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","file":"chunk-OBSAH7K6.js","sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { Toaster as SonnerToaster, toast } from 'sonner';\nimport { useTwilight } from '../../providers/twilight-context';\nimport type { ToastPosition } from './types';\n\nconst toastClassNames = {\n toast: 'group bg-white border-2 rounded-xl shadow-2xl p-4 font-primary',\n title: 'text-base font-bold',\n description: 'text-sm mt-1 text-gray-600',\n actionButton: 'bg-primary text-white px-3 py-1 rounded',\n cancelButton: 'bg-gray-100 px-3 py-1 rounded',\n success: 'border-green-500 [&_svg]:text-green-500 [&_aside]:text-green-700',\n error: 'border-red-500 [&_svg]:text-red-500 [&_aside]:text-red-700',\n warning: 'border-yellow-500 [&_svg]:text-yellow-500 [&_aside]:text-yellow-700',\n info: 'border-blue-500 [&_svg]:text-blue-500 [&_aside]:text-blue-700',\n loading: 'border-gray-400',\n};\n\ntype RawMessage = string | { title?: string; text?: string; icon?: string };\ntype ToastVariant = 'success' | 'error' | 'warning' | 'info';\n\nconst MOBILE_BREAKPOINT = 768;\nconst NATIVE_ALERT_EVENT = 'ui::alert';\n\nfunction dispatchNativeAlert(type: ToastVariant, message: string, title?: string) {\n const salla = window.salla;\n if (!salla?.mobile?.isEnabled?.() || !salla.event?.dispatch) return false;\n\n salla.event.dispatch(NATIVE_ALERT_EVENT, {\n type,\n message,\n ...(title ? { title } : {}),\n });\n return true;\n}\n\nexport function Toaster({\n mobilePosition = 'bottom-center',\n addToCartToast = true,\n}: {\n mobilePosition?: ToastPosition;\n /** Show the default add-to-cart toast. Themes whose cart badge is the feedback can turn it off. */\n addToCartToast?: boolean;\n}) {\n const { theme } = useTwilight();\n const themeRef = useRef(theme);\n themeRef.current = theme;\n const flashShownRef = useRef(false);\n\n const isRtl = theme.is_rtl;\n const desktopPosition: ToastPosition = isRtl ? 'top-left' : 'top-right';\n\n const [position, setPosition] = useState<ToastPosition>(() => {\n if (typeof window === 'undefined') return desktopPosition;\n return window.innerWidth < MOBILE_BREAKPOINT ? mobilePosition : desktopPosition;\n });\n\n useEffect(() => {\n const handleResize = () => {\n setPosition(window.innerWidth < MOBILE_BREAKPOINT ? mobilePosition : desktopPosition);\n };\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [desktopPosition, mobilePosition]);\n\n useEffect(() => {\n const salla = window.salla;\n if (!salla?.notify?.setNotifier) return;\n\n const handleNotify = (message: RawMessage, type: string, data?: unknown) => {\n const eventData = data as { data?: { googleTags?: { event?: string } } } | undefined;\n const shouldSuppressAddToCartToast =\n (!addToCartToast || themeRef.current.settings?.enable_add_product_toast) &&\n eventData?.data?.googleTags?.event === 'addToCart';\n let title: string;\n let toastType: ToastVariant;\n\n if (typeof message === 'object' && message !== null) {\n title = message.title || message.text || '';\n toastType = (message.icon || type || 'info') as ToastVariant;\n } else {\n title = message;\n toastType = (type || 'info') as ToastVariant;\n }\n\n // Suppress the default addToCart toast when the theme opted out (addToCartToast=false)\n // or renders its own rich toast (enable_add_product_toast) so they don't double up.\n if (shouldSuppressAddToCartToast) {\n return;\n }\n\n if (dispatchNativeAlert(toastType, title)) {\n return;\n }\n\n if (toastType === 'success') {\n toast.success(title, { duration: 3000 });\n } else if (toastType === 'error') {\n toast.error(title, { duration: 3000 });\n } else if (toastType === 'warning') {\n toast.warning(title, { duration: 3000 });\n } else {\n toast.info(title, { duration: 3000 });\n }\n };\n\n salla.notify.setNotifier(handleNotify);\n return () => {\n salla.notify?.setNotifier?.(() => {});\n };\n }, [addToCartToast]);\n\n useEffect(() => {\n if (flashShownRef.current || typeof window === 'undefined') return;\n\n const params = new URLSearchParams(window.location.search);\n const successMsg = params.get('success');\n const dangerMsg = params.get('danger');\n\n if (!successMsg && !dangerMsg) return;\n\n flashShownRef.current = true;\n\n const message = successMsg || dangerMsg || '';\n const toastType = dangerMsg ? 'error' : 'success';\n\n const url = new URL(window.location.href);\n url.searchParams.delete('success');\n url.searchParams.delete('danger');\n window.history.replaceState({}, '', url.toString());\n\n const timer = setTimeout(() => {\n if (dispatchNativeAlert(toastType, message)) return;\n\n if (toastType === 'success') {\n toast.success(message, { duration: 3000 });\n } else {\n toast.error(message, { duration: 3000 });\n }\n }, 100);\n\n return () => clearTimeout(timer);\n }, []);\n\n return (\n <SonnerToaster\n position={position}\n // Keep sonner's default gaps (24px desktop / 16px mobile) but clear the\n // native status bar inset (--app-safe-area-top, set by useSafeAreaInset)\n // so top-positioned toasts aren't covered in the app webview.\n offset={{ top: 'calc(var(--app-safe-area-top, 0px) + 24px)' }}\n mobileOffset={{ top: 'calc(var(--app-safe-area-top, 0px) + 16px)' }}\n toastOptions={{\n classNames: toastClassNames,\n style: {\n fontFamily: 'var(--font-main, inherit)',\n },\n }}\n style={{\n fontFamily: 'var(--font-main, inherit)',\n }}\n />\n );\n}\n\nexport type { ToasterProps } from 'sonner';\n"]}
|