@salla.sa/twilight-theme-engine 1.0.73 → 1.0.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/dist/{AddToCartForm-G2HK5QB3.js → AddToCartForm-H2PRWRO7.js} +8 -6
  2. package/dist/AddToCartForm-H2PRWRO7.js.map +1 -0
  3. package/dist/{BlogAuthorPage-BU2LVISS.js → BlogAuthorPage-QDGBWGGT.js} +22 -22
  4. package/dist/{BlogAuthorPage-BU2LVISS.js.map → BlogAuthorPage-QDGBWGGT.js.map} +1 -1
  5. package/dist/{BlogCategoryPage-UR4MPDLE.js → BlogCategoryPage-BK4OL6T4.js} +22 -22
  6. package/dist/{BlogCategoryPage-UR4MPDLE.js.map → BlogCategoryPage-BK4OL6T4.js.map} +1 -1
  7. package/dist/{BlogPage-E2XZGFOP.js → BlogPage-5LLIKUOQ.js} +20 -20
  8. package/dist/{BlogPage-E2XZGFOP.js.map → BlogPage-5LLIKUOQ.js.map} +1 -1
  9. package/dist/{BlogSinglePage-ZK2K6WEU.js → BlogSinglePage-3BDXSFTY.js} +20 -20
  10. package/dist/{BlogSinglePage-ZK2K6WEU.js.map → BlogSinglePage-3BDXSFTY.js.map} +1 -1
  11. package/dist/{BlogTagPage-5N4VTPDN.js → BlogTagPage-S77JPNEZ.js} +22 -22
  12. package/dist/{BlogTagPage-5N4VTPDN.js.map → BlogTagPage-S77JPNEZ.js.map} +1 -1
  13. package/dist/{BrandsPage-XE7RYGXA.js → BrandsPage-2TJALMEG.js} +21 -21
  14. package/dist/{BrandsPage-XE7RYGXA.js.map → BrandsPage-2TJALMEG.js.map} +1 -1
  15. package/dist/{Breadcrumb-NX6BUSOA.js → Breadcrumb-SXC43X3D.js} +20 -20
  16. package/dist/{Breadcrumb-NX6BUSOA.js.map → Breadcrumb-SXC43X3D.js.map} +1 -1
  17. package/dist/{CartItem-SO34G6GZ.js → CartItem-R6BYAM4O.js} +20 -20
  18. package/dist/{CartItem-SO34G6GZ.js.map → CartItem-R6BYAM4O.js.map} +1 -1
  19. package/dist/{CartSummary-SDTY2CR2.js → CartSummary-YQ2RMHID.js} +20 -20
  20. package/dist/{CartSummary-SDTY2CR2.js.map → CartSummary-YQ2RMHID.js.map} +1 -1
  21. package/dist/{Copyright-C426OB5D.js → Copyright-5VLQICDY.js} +3 -3
  22. package/dist/{Copyright-C426OB5D.js.map → Copyright-5VLQICDY.js.map} +1 -1
  23. package/dist/{CustomerLayout-UXX5KJWR.js → CustomerLayout-DUT7BEKW.js} +20 -20
  24. package/dist/{CustomerLayout-UXX5KJWR.js.map → CustomerLayout-DUT7BEKW.js.map} +1 -1
  25. package/dist/{Footer-M5QEXJ4Z.js → Footer-J2KXYFB3.js} +20 -20
  26. package/dist/{Footer-M5QEXJ4Z.js.map → Footer-J2KXYFB3.js.map} +1 -1
  27. package/dist/{Header-CUJ4SYDF.js → Header-GZQINLEQ.js} +7 -7
  28. package/dist/{Header-CUJ4SYDF.js.map → Header-GZQINLEQ.js.map} +1 -1
  29. package/dist/{LoyaltyPage-UMQ2ZWA6.js → LoyaltyPage-IXLUF6MF.js} +20 -20
  30. package/dist/{LoyaltyPage-UMQ2ZWA6.js.map → LoyaltyPage-IXLUF6MF.js.map} +1 -1
  31. package/dist/{LoyaltyPointsPage-5YHEQSLT.js → LoyaltyPointsPage-RDNXI5VY.js} +3 -3
  32. package/dist/{LoyaltyPointsPage-5YHEQSLT.js.map → LoyaltyPointsPage-RDNXI5VY.js.map} +1 -1
  33. package/dist/{MainMenu-OFQDXUGW.js → MainMenu-KNJDJFJX.js} +7 -7
  34. package/dist/{MainMenu-OFQDXUGW.js.map → MainMenu-KNJDJFJX.js.map} +1 -1
  35. package/dist/{MasterLayout-TSHKSJ7U.js → MasterLayout-MFL2NYPF.js} +20 -20
  36. package/dist/{MasterLayout-TSHKSJ7U.js.map → MasterLayout-MFL2NYPF.js.map} +1 -1
  37. package/dist/{MobileMenu-7EKUQ4MU.js → MobileMenu-RXLYUAWL.js} +21 -21
  38. package/dist/{MobileMenu-7EKUQ4MU.js.map → MobileMenu-RXLYUAWL.js.map} +1 -1
  39. package/dist/{NotificationsPage-TBDOI7YB.js → NotificationsPage-QSF7S2PD.js} +20 -20
  40. package/dist/{NotificationsPage-TBDOI7YB.js.map → NotificationsPage-QSF7S2PD.js.map} +1 -1
  41. package/dist/{OrderSinglePage-7A37FKJE.js → OrderSinglePage-CWBHU2C6.js} +28 -23
  42. package/dist/OrderSinglePage-CWBHU2C6.js.map +1 -0
  43. package/dist/{OrdersPage-NJ3JH6SG.js → OrdersPage-L76IEAXR.js} +20 -20
  44. package/dist/{OrdersPage-NJ3JH6SG.js.map → OrdersPage-L76IEAXR.js.map} +1 -1
  45. package/dist/{PageSingle-UKA2U3E5.js → PageSingle-BUAZBPIQ.js} +6 -6
  46. package/dist/{PageSingle-UKA2U3E5.js.map → PageSingle-BUAZBPIQ.js.map} +1 -1
  47. package/dist/{ProductDetails-XDNE62ZZ.js → ProductDetails-MPNSWRTQ.js} +15 -7
  48. package/dist/ProductDetails-MPNSWRTQ.js.map +1 -0
  49. package/dist/{ProfilePage-WPJYGKYR.js → ProfilePage-I72265CD.js} +20 -20
  50. package/dist/{ProfilePage-WPJYGKYR.js.map → ProfilePage-I72265CD.js.map} +1 -1
  51. package/dist/ReviewsPage-M5GNHNZG.js +18 -0
  52. package/dist/ReviewsPage-M5GNHNZG.js.map +1 -0
  53. package/dist/{SeoCartWidget-G7NAANUN.js → SeoCartWidget-KV3T3BO7.js} +20 -20
  54. package/dist/{SeoCartWidget-G7NAANUN.js.map → SeoCartWidget-KV3T3BO7.js.map} +1 -1
  55. package/dist/{SettingsPage-X7GPCBJL.js → SettingsPage-3F5HZNXX.js} +20 -20
  56. package/dist/{SettingsPage-X7GPCBJL.js.map → SettingsPage-3F5HZNXX.js.map} +1 -1
  57. package/dist/{StoreClosedNotification-NKRYCLKX.js → StoreClosedNotification-65QIOIAM.js} +21 -21
  58. package/dist/{StoreClosedNotification-NKRYCLKX.js.map → StoreClosedNotification-65QIOIAM.js.map} +1 -1
  59. package/dist/{TestimonialsPage-JTUWHKPU.js → TestimonialsPage-5U7PH4TT.js} +6 -6
  60. package/dist/{TestimonialsPage-JTUWHKPU.js.map → TestimonialsPage-5U7PH4TT.js.map} +1 -1
  61. package/dist/{ThankYouPage-MCMBGHO2.js → ThankYouPage-HFUTJCRT.js} +20 -20
  62. package/dist/{ThankYouPage-MCMBGHO2.js.map → ThankYouPage-HFUTJCRT.js.map} +1 -1
  63. package/dist/{WalletPage-JJI6WPNT.js → WalletPage-KURO6WSP.js} +21 -21
  64. package/dist/{WalletPage-JJI6WPNT.js.map → WalletPage-KURO6WSP.js.map} +1 -1
  65. package/dist/{WishlistPage-HAOYS7NV.js → WishlistPage-RLUK4JRD.js} +22 -22
  66. package/dist/{WishlistPage-HAOYS7NV.js.map → WishlistPage-RLUK4JRD.js.map} +1 -1
  67. package/dist/api/apps.js +4 -4
  68. package/dist/api/blog.js +6 -6
  69. package/dist/api/brands.js +6 -6
  70. package/dist/api/cart.d.ts +1 -1
  71. package/dist/api/cart.d.ts.map +1 -1
  72. package/dist/api/cart.js +6 -6
  73. package/dist/api/category.js +6 -6
  74. package/dist/api/client.d.ts +6 -0
  75. package/dist/api/client.d.ts.map +1 -1
  76. package/dist/api/client.js +3 -3
  77. package/dist/api/home.js +4 -4
  78. package/dist/api/loyalty.js +6 -6
  79. package/dist/api/menu.js +4 -4
  80. package/dist/api/notification.js +4 -4
  81. package/dist/api/order.js +6 -6
  82. package/dist/api/page.js +6 -6
  83. package/dist/api/product.d.ts +20 -0
  84. package/dist/api/product.d.ts.map +1 -1
  85. package/dist/api/product.js +6 -6
  86. package/dist/api/profile.js +3 -3
  87. package/dist/api/store.d.ts +3 -1
  88. package/dist/api/store.d.ts.map +1 -1
  89. package/dist/api/store.js +4 -4
  90. package/dist/api/translations.js +4 -4
  91. package/dist/api/user.js +4 -4
  92. package/dist/api/wallet.js +4 -4
  93. package/dist/api/wishlist.js +7 -7
  94. package/dist/{chunk-3EE62REP.js → chunk-2OYXPNCE.js} +3 -3
  95. package/dist/{chunk-3EE62REP.js.map → chunk-2OYXPNCE.js.map} +1 -1
  96. package/dist/{chunk-YLSG4MEK.js → chunk-2ZQKAGSZ.js} +4 -4
  97. package/dist/{chunk-YLSG4MEK.js.map → chunk-2ZQKAGSZ.js.map} +1 -1
  98. package/dist/{chunk-RO6KBURF.js → chunk-3EBAXWBJ.js} +7 -6
  99. package/dist/chunk-3EBAXWBJ.js.map +1 -0
  100. package/dist/{chunk-KOMV5SEF.js → chunk-3EHECJ7M.js} +7 -6
  101. package/dist/chunk-3EHECJ7M.js.map +1 -0
  102. package/dist/{chunk-VFYT2VWC.js → chunk-3QT7JMAD.js} +13 -4
  103. package/dist/chunk-3QT7JMAD.js.map +1 -0
  104. package/dist/{chunk-OYP5CGHU.js → chunk-3TJKB3WR.js} +3 -3
  105. package/dist/{chunk-OYP5CGHU.js.map → chunk-3TJKB3WR.js.map} +1 -1
  106. package/dist/{chunk-WSXRUOI2.js → chunk-4VWWIA4M.js} +4 -4
  107. package/dist/{chunk-WSXRUOI2.js.map → chunk-4VWWIA4M.js.map} +1 -1
  108. package/dist/{chunk-DIVEHHMD.js → chunk-4YVGMXG7.js} +3 -3
  109. package/dist/{chunk-DIVEHHMD.js.map → chunk-4YVGMXG7.js.map} +1 -1
  110. package/dist/{chunk-5AFTFN72.js → chunk-5NUDOT33.js} +3 -3
  111. package/dist/{chunk-5AFTFN72.js.map → chunk-5NUDOT33.js.map} +1 -1
  112. package/dist/{chunk-IXUY5RMV.js → chunk-6I4LWF5Y.js} +3 -3
  113. package/dist/{chunk-IXUY5RMV.js.map → chunk-6I4LWF5Y.js.map} +1 -1
  114. package/dist/{chunk-JZ7BOB4G.js → chunk-6KVB2WHE.js} +4 -4
  115. package/dist/{chunk-JZ7BOB4G.js.map → chunk-6KVB2WHE.js.map} +1 -1
  116. package/dist/{chunk-BVSJPBJ6.js → chunk-6WI7R2BD.js} +14 -3
  117. package/dist/chunk-6WI7R2BD.js.map +1 -0
  118. package/dist/{chunk-CMD3ARR2.js → chunk-BLWLKRKH.js} +59 -28
  119. package/dist/chunk-BLWLKRKH.js.map +1 -0
  120. package/dist/{chunk-J427UFSZ.js → chunk-CJDAZQV6.js} +6 -6
  121. package/dist/{chunk-J427UFSZ.js.map → chunk-CJDAZQV6.js.map} +1 -1
  122. package/dist/{chunk-OGVUFMLX.js → chunk-D2T6246Q.js} +3 -3
  123. package/dist/{chunk-OGVUFMLX.js.map → chunk-D2T6246Q.js.map} +1 -1
  124. package/dist/chunk-E5O5ICIY.js +40 -0
  125. package/dist/chunk-E5O5ICIY.js.map +1 -0
  126. package/dist/{chunk-RSVAPXXI.js → chunk-E7EBWXCA.js} +23 -15
  127. package/dist/chunk-E7EBWXCA.js.map +1 -0
  128. package/dist/{chunk-L3X2H2RP.js → chunk-FIFNYC7B.js} +7 -7
  129. package/dist/{chunk-L3X2H2RP.js.map → chunk-FIFNYC7B.js.map} +1 -1
  130. package/dist/{chunk-WLDDKFSZ.js → chunk-FVDUTMH6.js} +4 -4
  131. package/dist/{chunk-WLDDKFSZ.js.map → chunk-FVDUTMH6.js.map} +1 -1
  132. package/dist/{chunk-L5K7VBOH.js → chunk-GFSTJ2PF.js} +3 -3
  133. package/dist/{chunk-L5K7VBOH.js.map → chunk-GFSTJ2PF.js.map} +1 -1
  134. package/dist/{chunk-HFISEQPK.js → chunk-IDY6OEXA.js} +8 -8
  135. package/dist/{chunk-HFISEQPK.js.map → chunk-IDY6OEXA.js.map} +1 -1
  136. package/dist/{chunk-EXBH6RGD.js → chunk-IK57LAIA.js} +19 -5
  137. package/dist/chunk-IK57LAIA.js.map +1 -0
  138. package/dist/{chunk-B5FDWE4U.js → chunk-JAPH535M.js} +4 -4
  139. package/dist/{chunk-B5FDWE4U.js.map → chunk-JAPH535M.js.map} +1 -1
  140. package/dist/{chunk-3IHFA2X5.js → chunk-JEG5WPNT.js} +3 -3
  141. package/dist/{chunk-3IHFA2X5.js.map → chunk-JEG5WPNT.js.map} +1 -1
  142. package/dist/{chunk-54XX3YPP.js → chunk-JHCLU3PS.js} +8 -8
  143. package/dist/{chunk-54XX3YPP.js.map → chunk-JHCLU3PS.js.map} +1 -1
  144. package/dist/{chunk-U53LIN2F.js → chunk-JNZLH2OR.js} +58 -9
  145. package/dist/chunk-JNZLH2OR.js.map +1 -0
  146. package/dist/{chunk-3CYIB6BL.js → chunk-KO3HG5GQ.js} +3 -3
  147. package/dist/{chunk-3CYIB6BL.js.map → chunk-KO3HG5GQ.js.map} +1 -1
  148. package/dist/{chunk-MISI3T6V.js → chunk-M6BXZTRK.js} +3 -3
  149. package/dist/{chunk-MISI3T6V.js.map → chunk-M6BXZTRK.js.map} +1 -1
  150. package/dist/{chunk-WYW7USLQ.js → chunk-MEMB7JYJ.js} +4 -4
  151. package/dist/{chunk-WYW7USLQ.js.map → chunk-MEMB7JYJ.js.map} +1 -1
  152. package/dist/{chunk-SDIQHTDG.js → chunk-OKNJFS44.js} +4 -4
  153. package/dist/{chunk-SDIQHTDG.js.map → chunk-OKNJFS44.js.map} +1 -1
  154. package/dist/{chunk-3YAR2SXQ.js → chunk-OQA2MKZA.js} +30 -17
  155. package/dist/chunk-OQA2MKZA.js.map +1 -0
  156. package/dist/{chunk-ZGHRSRDO.js → chunk-OUW6WESU.js} +3 -2
  157. package/dist/chunk-OUW6WESU.js.map +1 -0
  158. package/dist/{chunk-YKFGUVF7.js → chunk-P2YAPWMS.js} +5 -4
  159. package/dist/chunk-P2YAPWMS.js.map +1 -0
  160. package/dist/{chunk-QVJDYSCT.js → chunk-P4GOLSA2.js} +3 -3
  161. package/dist/{chunk-QVJDYSCT.js.map → chunk-P4GOLSA2.js.map} +1 -1
  162. package/dist/{chunk-5DPR7GWH.js → chunk-PNM4NP4U.js} +3 -3
  163. package/dist/{chunk-5DPR7GWH.js.map → chunk-PNM4NP4U.js.map} +1 -1
  164. package/dist/{chunk-52ETYODY.js → chunk-R72Q5Z6M.js} +4 -4
  165. package/dist/{chunk-52ETYODY.js.map → chunk-R72Q5Z6M.js.map} +1 -1
  166. package/dist/{chunk-HBTIZWT2.js → chunk-RYSJOCHI.js} +3 -3
  167. package/dist/{chunk-HBTIZWT2.js.map → chunk-RYSJOCHI.js.map} +1 -1
  168. package/dist/{chunk-XVNXXF67.js → chunk-TWVTIAMO.js} +3 -3
  169. package/dist/{chunk-XVNXXF67.js.map → chunk-TWVTIAMO.js.map} +1 -1
  170. package/dist/{chunk-2ALN2BPM.js → chunk-VYCNB6VN.js} +3 -3
  171. package/dist/{chunk-2ALN2BPM.js.map → chunk-VYCNB6VN.js.map} +1 -1
  172. package/dist/chunk-WG47KLHH.js +14 -0
  173. package/dist/{chunk-4LVBS3VI.js.map → chunk-WG47KLHH.js.map} +1 -1
  174. package/dist/{chunk-L2QUP6J3.js → chunk-WHGOO4A2.js} +6 -6
  175. package/dist/{chunk-L2QUP6J3.js.map → chunk-WHGOO4A2.js.map} +1 -1
  176. package/dist/{chunk-25FWAL3O.js → chunk-WS3WQ3OL.js} +4 -4
  177. package/dist/{chunk-25FWAL3O.js.map → chunk-WS3WQ3OL.js.map} +1 -1
  178. package/dist/{chunk-UAY6LTWB.js → chunk-XN7TVPAU.js} +4 -4
  179. package/dist/{chunk-UAY6LTWB.js.map → chunk-XN7TVPAU.js.map} +1 -1
  180. package/dist/{chunk-LPQFTXBB.js → chunk-Y5OGXJLH.js} +10 -3
  181. package/dist/chunk-Y5OGXJLH.js.map +1 -0
  182. package/dist/{chunk-R5MZV6KW.js → chunk-YUGZDWD6.js} +4 -4
  183. package/dist/{chunk-R5MZV6KW.js.map → chunk-YUGZDWD6.js.map} +1 -1
  184. package/dist/components/cart/index.js +1 -1
  185. package/dist/components/common/index.js +1 -1
  186. package/dist/components/drawer/index.js +18 -18
  187. package/dist/components/home/ReorderProducts.d.ts +7 -0
  188. package/dist/components/home/ReorderProducts.d.ts.map +1 -0
  189. package/dist/components/home/SquarePhotos.d.ts +2 -1
  190. package/dist/components/home/SquarePhotos.d.ts.map +1 -1
  191. package/dist/components/home/index.d.ts +2 -0
  192. package/dist/components/home/index.d.ts.map +1 -1
  193. package/dist/components/home/index.js +22 -22
  194. package/dist/components/home/reorder-hooks.d.ts +6 -0
  195. package/dist/components/home/reorder-hooks.d.ts.map +1 -0
  196. package/dist/components/layout/index.js +1 -1
  197. package/dist/components/product/AddToCartForm.d.ts.map +1 -1
  198. package/dist/components/product/ProductDetails.d.ts.map +1 -1
  199. package/dist/components/product/index.js +19 -19
  200. package/dist/components/snippets/AppsSnippets.d.ts +2 -0
  201. package/dist/components/snippets/AppsSnippets.d.ts.map +1 -1
  202. package/dist/components/store/index.js +20 -20
  203. package/dist/components/toast/index.js +4 -4
  204. package/dist/document-class-5FTU6EZE.js +25 -0
  205. package/dist/{document-class-DOQDO2DN.js.map → document-class-5FTU6EZE.js.map} +1 -1
  206. package/dist/hooks/index.js +18 -18
  207. package/dist/hooks/useComments.js +3 -3
  208. package/dist/hooks/useCoupon.d.ts +0 -41
  209. package/dist/hooks/useCoupon.d.ts.map +1 -1
  210. package/dist/hooks/useCoupon.js +3 -1
  211. package/dist/hooks/useGtm.js +18 -18
  212. package/dist/hooks/useMoney.js +18 -18
  213. package/dist/hooks/useProduct.js +3 -3
  214. package/dist/hooks/useStore.js +18 -18
  215. package/dist/hooks/useUser.js +5 -5
  216. package/dist/hooks/useWishlist.d.ts.map +1 -1
  217. package/dist/hooks/useWishlist.js +4 -1
  218. package/dist/index.js +18 -18
  219. package/dist/native-app/index.js +3 -3
  220. package/dist/navigation-CDITJYUW.js +13 -0
  221. package/dist/{navigation-P3GZOWUU.js.map → navigation-CDITJYUW.js.map} +1 -1
  222. package/dist/{navigation-TA3I3XEC.js → navigation-WCGV6RUK.js} +5 -5
  223. package/dist/{navigation-TA3I3XEC.js.map → navigation-WCGV6RUK.js.map} +1 -1
  224. package/dist/{not-found-6B6QSJYA.js → not-found-EL2XQE5D.js} +59 -33
  225. package/dist/not-found-EL2XQE5D.js.map +1 -0
  226. package/dist/providers/index.js +18 -18
  227. package/dist/providers/twilight-init.d.ts.map +1 -1
  228. package/dist/router/route-ids.d.ts +1 -0
  229. package/dist/router/route-ids.d.ts.map +1 -1
  230. package/dist/routes/account/orders/single/OrderHeader.d.ts.map +1 -1
  231. package/dist/routes/account/orders.js +7 -7
  232. package/dist/routes/account.js +16 -16
  233. package/dist/routes/blog.js +11 -11
  234. package/dist/routes/brands.js +7 -7
  235. package/dist/routes/cart.js +26 -26
  236. package/dist/routes/home/HomePage.d.ts.map +1 -1
  237. package/dist/routes/home.js +23 -23
  238. package/dist/routes/index.d.ts +1 -1
  239. package/dist/routes/index.d.ts.map +1 -1
  240. package/dist/routes/index.js +4 -4
  241. package/dist/routes/loyalty.js +8 -8
  242. package/dist/routes/page.js +7 -7
  243. package/dist/routes/product/index.d.ts.map +1 -1
  244. package/dist/routes/product-listing/ProductListPage.d.ts.map +1 -1
  245. package/dist/routes/product-listing/loader.d.ts.map +1 -1
  246. package/dist/routes/product-listing/types.d.ts +1 -1
  247. package/dist/routes/product-listing/types.d.ts.map +1 -1
  248. package/dist/routes/product-listing.js +204 -183
  249. package/dist/routes/product-listing.js.map +1 -1
  250. package/dist/routes/product-short-link.d.ts +9 -5
  251. package/dist/routes/product-short-link.d.ts.map +1 -1
  252. package/dist/routes/product.js +23 -23
  253. package/dist/routes/product.js.map +1 -1
  254. package/dist/routes/seo-redirects.js +4 -4
  255. package/dist/routes/testimonials/ReviewsPage.d.ts +3 -0
  256. package/dist/routes/testimonials/ReviewsPage.d.ts.map +1 -0
  257. package/dist/routes/testimonials/index.d.ts +15 -3
  258. package/dist/routes/testimonials/index.d.ts.map +1 -1
  259. package/dist/routes/testimonials/loader.d.ts +3 -1
  260. package/dist/routes/testimonials/loader.d.ts.map +1 -1
  261. package/dist/routes/testimonials/types.d.ts +3 -0
  262. package/dist/routes/testimonials/types.d.ts.map +1 -1
  263. package/dist/routes/testimonials.js +38 -3
  264. package/dist/routes/testimonials.js.map +1 -1
  265. package/dist/routes/thank-you.js +7 -7
  266. package/dist/skeleton.js +23 -23
  267. package/dist/tanstack/document-class.d.ts.map +1 -1
  268. package/dist/tanstack/router.d.ts.map +1 -1
  269. package/dist/tanstack.js +16 -16
  270. package/dist/types/index.d.ts +3 -1
  271. package/dist/types/index.d.ts.map +1 -1
  272. package/dist/types/salla-sdk.d.ts +4 -0
  273. package/dist/types/salla-sdk.d.ts.map +1 -1
  274. package/dist/utils/cookies.d.ts +5 -0
  275. package/dist/utils/cookies.d.ts.map +1 -1
  276. package/dist/utils/index.js +5 -4
  277. package/dist/utils/index.js.map +1 -1
  278. package/dist/utils/sdk-events.d.ts +6 -0
  279. package/dist/utils/sdk-events.d.ts.map +1 -1
  280. package/dist/vite/adapters/tanstack.adapter.d.ts.map +1 -1
  281. package/dist/vite/index.js +60 -1
  282. package/dist/vite/index.js.map +1 -1
  283. package/package.json +1 -1
  284. package/dist/AddToCartForm-G2HK5QB3.js.map +0 -1
  285. package/dist/OrderSinglePage-7A37FKJE.js.map +0 -1
  286. package/dist/ProductDetails-XDNE62ZZ.js.map +0 -1
  287. package/dist/chunk-3YAR2SXQ.js.map +0 -1
  288. package/dist/chunk-4LVBS3VI.js +0 -14
  289. package/dist/chunk-5ZR2HKZ7.js +0 -14
  290. package/dist/chunk-5ZR2HKZ7.js.map +0 -1
  291. package/dist/chunk-BVSJPBJ6.js.map +0 -1
  292. package/dist/chunk-CMD3ARR2.js.map +0 -1
  293. package/dist/chunk-EXBH6RGD.js.map +0 -1
  294. package/dist/chunk-KOMV5SEF.js.map +0 -1
  295. package/dist/chunk-LPQFTXBB.js.map +0 -1
  296. package/dist/chunk-RO6KBURF.js.map +0 -1
  297. package/dist/chunk-RSVAPXXI.js.map +0 -1
  298. package/dist/chunk-U53LIN2F.js.map +0 -1
  299. package/dist/chunk-VFYT2VWC.js.map +0 -1
  300. package/dist/chunk-YKFGUVF7.js.map +0 -1
  301. package/dist/chunk-ZGHRSRDO.js.map +0 -1
  302. package/dist/document-class-DOQDO2DN.js +0 -25
  303. package/dist/navigation-P3GZOWUU.js +0 -13
  304. package/dist/not-found-6B6QSJYA.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { onSallaEvent } from './chunk-QVJDYSCT.js';
1
+ import { onSallaEvent } from './chunk-P4GOLSA2.js';
2
2
  import { useState, useCallback, useEffect } from 'react';
3
3
 
4
4
  function useComments() {
@@ -16,5 +16,5 @@ function useComments() {
16
16
  }
17
17
 
18
18
  export { useComments };
19
- //# sourceMappingURL=chunk-DIVEHHMD.js.map
20
- //# sourceMappingURL=chunk-DIVEHHMD.js.map
19
+ //# sourceMappingURL=chunk-4YVGMXG7.js.map
20
+ //# sourceMappingURL=chunk-4YVGMXG7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useComments.ts"],"names":[],"mappings":";;;AAuCO,SAAS,WAAA,GAAiC;AAC/C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,CAAC,CAAA;AAEhD,EAAA,MAAM,OAAA,GAAU,YAAY,MAAM;AAChC,IAAA,cAAA,CAAe,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,qBAAqB,MAAM;AAC/B,MAAA,cAAA,CAAe,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAAA,IACnC,CAAA;AAEA,IAAA,OAAO,YAAA,CAAa,kBAAkB,kBAAkB,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,aAAa,OAAA,EAAQ;AAChC","file":"chunk-DIVEHHMD.js","sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport { onSallaEvent } from '../utils/sdk-helpers';\n\n/**\n * UseCommentsResult - Return type for useComments hook\n *\n * @property commentsKey - Key to pass to salla-comments component for re-render\n * @property refresh - Function to manually trigger a comments refresh\n */\nexport interface UseCommentsResult {\n commentsKey: number;\n refresh: () => void;\n}\n\n/**\n * useComments - Hook for managing salla-comments web component re-renders\n *\n * Listens to the Salla SDK's comment added events and automatically\n * increments a re-render key for the salla-comments component. This\n * eliminates the need for full page reloads when comments are added.\n *\n * @returns Object with comments key for component re-rendering and manual refresh function\n *\n * @example\n * ```tsx\n * function ProductPage({ product }) {\n * const { commentsKey } = useComments();\n *\n * return (\n * <salla-comments\n * key={commentsKey}\n * item-id={product.id}\n * type=\"product\"\n * />\n * );\n * }\n * ```\n */\n\nexport function useComments(): UseCommentsResult {\n const [commentsKey, setCommentsKey] = useState(0);\n\n const refresh = useCallback(() => {\n setCommentsKey((prev) => prev + 1);\n }, []);\n\n useEffect(() => {\n const handleCommentAdded = () => {\n setCommentsKey((prev) => prev + 1);\n };\n\n return onSallaEvent('comment::added', handleCommentAdded);\n }, []);\n\n return { commentsKey, refresh };\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/useComments.ts"],"names":[],"mappings":";;;AAuCO,SAAS,WAAA,GAAiC;AAC/C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,CAAC,CAAA;AAEhD,EAAA,MAAM,OAAA,GAAU,YAAY,MAAM;AAChC,IAAA,cAAA,CAAe,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,qBAAqB,MAAM;AAC/B,MAAA,cAAA,CAAe,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAAA,IACnC,CAAA;AAEA,IAAA,OAAO,YAAA,CAAa,kBAAkB,kBAAkB,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,aAAa,OAAA,EAAQ;AAChC","file":"chunk-4YVGMXG7.js","sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport { onSallaEvent } from '../utils/sdk-helpers';\n\n/**\n * UseCommentsResult - Return type for useComments hook\n *\n * @property commentsKey - Key to pass to salla-comments component for re-render\n * @property refresh - Function to manually trigger a comments refresh\n */\nexport interface UseCommentsResult {\n commentsKey: number;\n refresh: () => void;\n}\n\n/**\n * useComments - Hook for managing salla-comments web component re-renders\n *\n * Listens to the Salla SDK's comment added events and automatically\n * increments a re-render key for the salla-comments component. This\n * eliminates the need for full page reloads when comments are added.\n *\n * @returns Object with comments key for component re-rendering and manual refresh function\n *\n * @example\n * ```tsx\n * function ProductPage({ product }) {\n * const { commentsKey } = useComments();\n *\n * return (\n * <salla-comments\n * key={commentsKey}\n * item-id={product.id}\n * type=\"product\"\n * />\n * );\n * }\n * ```\n */\n\nexport function useComments(): UseCommentsResult {\n const [commentsKey, setCommentsKey] = useState(0);\n\n const refresh = useCallback(() => {\n setCommentsKey((prev) => prev + 1);\n }, []);\n\n useEffect(() => {\n const handleCommentAdded = () => {\n setCommentsKey((prev) => prev + 1);\n };\n\n return onSallaEvent('comment::added', handleCommentAdded);\n }, []);\n\n return { commentsKey, refresh };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { api } from './chunk-EXBH6RGD.js';
1
+ import { api } from './chunk-IK57LAIA.js';
2
2
 
3
3
  // src/api/wallet.ts
4
4
  var wallet = {
@@ -20,5 +20,5 @@ var wallet = {
20
20
  };
21
21
 
22
22
  export { wallet };
23
- //# sourceMappingURL=chunk-5AFTFN72.js.map
24
- //# sourceMappingURL=chunk-5AFTFN72.js.map
23
+ //# sourceMappingURL=chunk-5NUDOT33.js.map
24
+ //# sourceMappingURL=chunk-5NUDOT33.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/wallet.ts"],"names":[],"mappings":";;;AAgCO,IAAM,MAAA,GAAS;AAAA,EACpB,IAAA,EAAM,OAAO,MAAA,GAA2B,EAAC,KAAiC;AACxE,IAAA,MAAM,EAAE,IAAA,GAAO,CAAA,EAAG,OAAA,GAAU,EAAA,EAAI,QAAO,GAAI,MAAA;AAE3C,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAC,CAAA;AACrC,IAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,OAAO,CAAC,CAAA;AAE5C,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,IAAI,MAAA,UAAgB,MAAA,GAAS,MAAA;AAE7B,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CACpB,GAAA,CAAI,CAAA,eAAA,EAAkB,YAAA,CAAa,QAAA,EAAU,CAAA,CAAA,EAAI,OAAc,CAAA,CAC/D,IAAA,EAAsE;AAEzE,IAAA,MAAM,YAAA,GAAe,SAAS,IAAA,CAAK,YAAA;AAEnC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,YAAA,CAAa,IAAA,IAAQ,EAAC;AAAA,MAC7B,MAAM,YAAA,CAAa,aAAA;AAAA,MACnB,OAAA,EAAS,SAAS,IAAA,CAAK;AAAA,KACzB;AAAA,EACF;AACF","file":"chunk-5AFTFN72.js","sourcesContent":["import { api } from './client';\n\nexport interface TransactionItem {\n id: number;\n order_id: number;\n transaction_type: string;\n action_type: string;\n type: string;\n title: string;\n description: string;\n amount: number;\n created_at: number;\n expired_at: number;\n}\n\nexport interface WalletListParams {\n page?: number;\n perPage?: number;\n signal?: AbortSignal;\n}\n\nexport interface WalletListResponse {\n data: TransactionItem[];\n next_page_url: string | null;\n}\n\nexport interface WalletListResult {\n items: TransactionItem[];\n next: string | null;\n balance: number;\n}\n\nexport const wallet = {\n list: async (params: WalletListParams = {}): Promise<WalletListResult> => {\n const { page = 1, perPage = 10, signal } = params;\n\n const searchParams = new URLSearchParams();\n searchParams.set('page', String(page));\n searchParams.set('per_page', String(perPage));\n\n const options: Record<string, unknown> = {};\n if (signal) options.signal = signal;\n\n const response = await api\n .get(`balance/wallet?${searchParams.toString()}`, options as any)\n .json<{ data: { transactions: WalletListResponse; balance: number } }>();\n\n const transactions = response.data.transactions;\n\n return {\n items: transactions.data ?? [],\n next: transactions.next_page_url,\n balance: response.data.balance,\n };\n },\n};\n"]}
1
+ {"version":3,"sources":["../src/api/wallet.ts"],"names":[],"mappings":";;;AAgCO,IAAM,MAAA,GAAS;AAAA,EACpB,IAAA,EAAM,OAAO,MAAA,GAA2B,EAAC,KAAiC;AACxE,IAAA,MAAM,EAAE,IAAA,GAAO,CAAA,EAAG,OAAA,GAAU,EAAA,EAAI,QAAO,GAAI,MAAA;AAE3C,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAC,CAAA;AACrC,IAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,OAAO,CAAC,CAAA;AAE5C,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,IAAI,MAAA,UAAgB,MAAA,GAAS,MAAA;AAE7B,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CACpB,GAAA,CAAI,CAAA,eAAA,EAAkB,YAAA,CAAa,QAAA,EAAU,CAAA,CAAA,EAAI,OAAc,CAAA,CAC/D,IAAA,EAAsE;AAEzE,IAAA,MAAM,YAAA,GAAe,SAAS,IAAA,CAAK,YAAA;AAEnC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,YAAA,CAAa,IAAA,IAAQ,EAAC;AAAA,MAC7B,MAAM,YAAA,CAAa,aAAA;AAAA,MACnB,OAAA,EAAS,SAAS,IAAA,CAAK;AAAA,KACzB;AAAA,EACF;AACF","file":"chunk-5NUDOT33.js","sourcesContent":["import { api } from './client';\n\nexport interface TransactionItem {\n id: number;\n order_id: number;\n transaction_type: string;\n action_type: string;\n type: string;\n title: string;\n description: string;\n amount: number;\n created_at: number;\n expired_at: number;\n}\n\nexport interface WalletListParams {\n page?: number;\n perPage?: number;\n signal?: AbortSignal;\n}\n\nexport interface WalletListResponse {\n data: TransactionItem[];\n next_page_url: string | null;\n}\n\nexport interface WalletListResult {\n items: TransactionItem[];\n next: string | null;\n balance: number;\n}\n\nexport const wallet = {\n list: async (params: WalletListParams = {}): Promise<WalletListResult> => {\n const { page = 1, perPage = 10, signal } = params;\n\n const searchParams = new URLSearchParams();\n searchParams.set('page', String(page));\n searchParams.set('per_page', String(perPage));\n\n const options: Record<string, unknown> = {};\n if (signal) options.signal = signal;\n\n const response = await api\n .get(`balance/wallet?${searchParams.toString()}`, options as any)\n .json<{ data: { transactions: WalletListResponse; balance: number } }>();\n\n const transactions = response.data.transactions;\n\n return {\n items: transactions.data ?? [],\n next: transactions.next_page_url,\n balance: response.data.balance,\n };\n },\n};\n"]}
@@ -4,7 +4,7 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  export { BlogSkeleton, BreadcrumbSkeleton, CustomerLayoutSkeleton, CustomerPageSkeleton, PageSkeleton, ProductCardSkeleton, ProductDetailSkeleton, ProductGridSkeleton, SkeletonPulse } from '@salla.sa/twilight-components-react';
5
5
 
6
6
  var LazyBreadcrumb = lazy(
7
- () => import('./Breadcrumb-NX6BUSOA.js').then((m) => ({ default: m.Breadcrumb }))
7
+ () => import('./Breadcrumb-SXC43X3D.js').then((m) => ({ default: m.Breadcrumb }))
8
8
  );
9
9
  var LazyNoContent = lazy(
10
10
  () => import('./NoContent-63TMCPGY.js').then((m) => ({ default: m.NoContent }))
@@ -153,5 +153,5 @@ function DeferredData({ promise, fallback, children }) {
153
153
  }
154
154
 
155
155
  export { DeferredData, Image, LazyBreadcrumb, LazyCurrencySymbol, LazyErrorPage, LazyNoContent, LazyRenderWhenVisible, resolveDeferred };
156
- //# sourceMappingURL=chunk-IXUY5RMV.js.map
157
- //# sourceMappingURL=chunk-IXUY5RMV.js.map
156
+ //# sourceMappingURL=chunk-6I4LWF5Y.js.map
157
+ //# sourceMappingURL=chunk-6I4LWF5Y.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/common/lazy.ts","../src/components/common/Image.tsx","../src/components/common/DeferredData.tsx"],"names":["Image","memo","DeferredRenderer","jsx"],"mappings":"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","file":"chunk-IXUY5RMV.js","sourcesContent":["import { lazy } from 'react';\n\n/**\n * Lazy-loaded common components\n * Use these for code-splitting non-critical components\n *\n * NOTE: Skeleton components are sourced from @salla.sa/twilight-components-react\n * because they must render instantly during route transitions.\n */\nexport const LazyBreadcrumb = lazy(() =>\n import('./Breadcrumb').then((m) => ({ default: m.Breadcrumb }))\n);\n\nexport const LazyNoContent = lazy(() =>\n import('./NoContent').then((m) => ({ default: m.NoContent }))\n);\n\nexport const LazyRenderWhenVisible = lazy(() =>\n import('./RenderWhenVisible').then((m) => ({ default: m.RenderWhenVisible }))\n);\n\nexport const LazyCurrencySymbol = lazy(() =>\n import('./CurrencySymbol').then((m) => ({ default: m.CurrencySymbol }))\n);\n\nexport const LazyErrorPage = lazy(() =>\n import('./ErrorPage').then((m) => ({ default: m.ErrorPage }))\n);\n","import { memo } from 'react';\nimport { getCdnImageSrcSet, getCdnImageUrl } from '../../utils/cdn-image';\n\nexport interface ImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n /** Image source URL */\n src?: string;\n /** Alt text for accessibility */\n alt: string;\n /** Whether this image is above the fold / LCP candidate */\n priority?: boolean;\n /** Aspect ratio for CLS prevention (e.g. \"16/9\", \"1/1\", \"4/3\") */\n aspectRatio?: string;\n /** Object fit mode */\n objectFit?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';\n /** Mobile image source for <picture> element */\n mobileSrc?: string;\n /** Mobile breakpoint for <source> media query (default: 768px) */\n mobileBreakpoint?: number;\n /** Skip the wrapper div */\n noWrapper?: boolean;\n /**\n * CDN widths for a density `srcset`. Pass `sizes` so the browser picks a\n * candidate close to the displayed CSS size.\n */\n srcSetWidths?: readonly number[];\n}\n\n/**\n * Optimized Image component with native browser lazy loading.\n *\n * - Uses `loading=\"lazy\"` + `decoding=\"async\"` by default for below-the-fold images.\n * - Uses `loading=\"eager\"` + `fetchPriority=\"high\"` for priority (above-the-fold / LCP) images.\n * - Supports responsive `<picture>` with mobile source.\n * - Provides `aspectRatio` for CLS prevention.\n * - When `srcSetWidths` + `sizes` are set, emits a sized CDN `srcset`.\n */\nexport const Image = memo(function Image({\n src,\n alt,\n priority = false,\n aspectRatio,\n objectFit = 'cover',\n mobileSrc,\n mobileBreakpoint = 768,\n noWrapper = false,\n className = '',\n style,\n width,\n height,\n sizes,\n srcSet: srcSetProp,\n srcSetWidths,\n ...rest\n}: ImageProps) {\n if (!src) return null;\n\n const generatedSrcSet =\n srcSetProp || (srcSetWidths?.length ? getCdnImageSrcSet(src, srcSetWidths) : undefined);\n const generatedMobileSrcSet =\n srcSetWidths?.length && mobileSrc ? getCdnImageSrcSet(mobileSrc, srcSetWidths) : undefined;\n const cdnWidth = srcSetWidths?.length\n ? width != null && srcSetWidths.includes(Number(width))\n ? Number(width)\n : srcSetWidths[0]\n : width;\n // Width-only CDN URLs so `src` matches a srcset candidate for preload.\n const cdnOptions = generatedSrcSet ? { width: cdnWidth } : { width: cdnWidth, height };\n\n const optimizedSrc = getCdnImageUrl(src, cdnOptions);\n const optimizedMobileSrc = getCdnImageUrl(mobileSrc, cdnOptions);\n\n const objectFitClass = `object-${objectFit}`;\n const imgClasses = [className, objectFitClass].filter(Boolean).join(' ');\n\n const loadingProps: React.ImgHTMLAttributes<HTMLImageElement> = priority\n ? { loading: 'eager' as const, fetchPriority: 'high' as const, decoding: 'sync' as const }\n : { loading: 'lazy' as const, decoding: 'async' as const };\n\n const hasWrapper = !noWrapper && !!aspectRatio;\n\n const img = (\n <img\n src={optimizedSrc}\n alt={alt}\n className={imgClasses}\n width={width}\n height={height}\n sizes={sizes}\n srcSet={generatedSrcSet}\n // With a wrapper, `style` goes to the wrapper; otherwise it must land on the <img>.\n style={hasWrapper ? undefined : style}\n {...loadingProps}\n {...rest}\n />\n );\n\n const imgElement = optimizedMobileSrc ? (\n <picture>\n <source\n media={`(max-width: ${mobileBreakpoint}px)`}\n srcSet={generatedMobileSrcSet || optimizedMobileSrc}\n sizes={generatedMobileSrcSet ? sizes : undefined}\n />\n {img}\n </picture>\n ) : (\n img\n );\n\n if (!hasWrapper) {\n return imgElement;\n }\n\n return (\n <div className=\"relative overflow-hidden\" style={{ aspectRatio, ...style }}>\n {imgElement}\n </div>\n );\n});\n","import { Suspense, memo, use, type ReactNode } from 'react';\n\nexport interface DeferredDataProps<T> {\n promise: Promise<T> | T;\n fallback: ReactNode;\n children: (data: T) => ReactNode;\n}\n\nconst DEFERRED_KEY = Symbol.for('twilight.deferred');\n\ninterface DeferredState<T> {\n status: 'pending' | 'success' | 'error';\n value?: T;\n error?: unknown;\n}\n\nexport interface DeferredPromise<T> extends Promise<T> {\n [DEFERRED_KEY]?: DeferredState<T>;\n}\n\nconst seenPromises = typeof WeakSet !== 'undefined' ? new WeakSet() : null;\n\nfunction defer<T>(promise: Promise<T>): DeferredPromise<T> {\n const existing = (promise as DeferredPromise<T>)[DEFERRED_KEY];\n if (existing) return promise as DeferredPromise<T>;\n\n const state: DeferredState<T> = { status: 'pending' };\n\n const deferred = promise as DeferredPromise<T>;\n deferred[DEFERRED_KEY] = state;\n\n promise.then(\n (value) => {\n state.status = 'success';\n state.value = value;\n },\n (error) => {\n state.status = 'error';\n state.error = error;\n }\n );\n\n return deferred;\n}\n\nconst DeferredRenderer = memo(function DeferredRenderer<T>({\n promise,\n children,\n}: {\n promise: DeferredPromise<T>;\n children: (data: T) => ReactNode;\n}) {\n const state = promise[DEFERRED_KEY];\n\n if (state?.status === 'success') {\n return children(state.value!);\n }\n\n if (state?.status === 'error') {\n throw state.error;\n }\n\n const data = use(promise);\n return children(data);\n}) as <T>(props: { promise: DeferredPromise<T>; children: (data: T) => ReactNode }) => ReactNode;\n\nfunction DeferredFallback<T>({\n promise,\n fallback,\n children,\n}: {\n promise: DeferredPromise<T>;\n fallback: ReactNode;\n children: (data: T) => ReactNode;\n}) {\n const state = promise[DEFERRED_KEY];\n if (state?.status === 'success') {\n return children(state.value!);\n }\n return <>{fallback}</>;\n}\n\nexport function resolveDeferred<T>(\n promiseOrValue: Promise<T> | T | undefined\n): T | Promise<T> | undefined {\n if (promiseOrValue == null || !(promiseOrValue instanceof Promise)) return promiseOrValue;\n const deferred = defer(promiseOrValue);\n const state = deferred[DEFERRED_KEY];\n if (state?.status === 'success') return state.value as T;\n return promiseOrValue;\n}\n\nexport function DeferredData<T>({ promise, fallback, children }: DeferredDataProps<T>) {\n if (!(promise instanceof Promise)) {\n return children(promise);\n }\n\n if (seenPromises && promise instanceof Promise) seenPromises.add(promise);\n\n const deferred = defer(promise);\n const state = deferred[DEFERRED_KEY];\n\n if (state?.status === 'success') {\n return children(state.value!);\n }\n\n if (state?.status === 'error') {\n throw state.error;\n }\n\n return (\n <Suspense\n fallback={\n <DeferredFallback promise={deferred} fallback={fallback}>\n {children}\n </DeferredFallback>\n }\n >\n <DeferredRenderer promise={deferred}>{children}</DeferredRenderer>\n </Suspense>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/common/lazy.ts","../src/components/common/Image.tsx","../src/components/common/DeferredData.tsx"],"names":["Image","memo","DeferredRenderer","jsx"],"mappings":"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","file":"chunk-6I4LWF5Y.js","sourcesContent":["import { lazy } from 'react';\n\n/**\n * Lazy-loaded common components\n * Use these for code-splitting non-critical components\n *\n * NOTE: Skeleton components are sourced from @salla.sa/twilight-components-react\n * because they must render instantly during route transitions.\n */\nexport const LazyBreadcrumb = lazy(() =>\n import('./Breadcrumb').then((m) => ({ default: m.Breadcrumb }))\n);\n\nexport const LazyNoContent = lazy(() =>\n import('./NoContent').then((m) => ({ default: m.NoContent }))\n);\n\nexport const LazyRenderWhenVisible = lazy(() =>\n import('./RenderWhenVisible').then((m) => ({ default: m.RenderWhenVisible }))\n);\n\nexport const LazyCurrencySymbol = lazy(() =>\n import('./CurrencySymbol').then((m) => ({ default: m.CurrencySymbol }))\n);\n\nexport const LazyErrorPage = lazy(() =>\n import('./ErrorPage').then((m) => ({ default: m.ErrorPage }))\n);\n","import { memo } from 'react';\nimport { getCdnImageSrcSet, getCdnImageUrl } from '../../utils/cdn-image';\n\nexport interface ImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n /** Image source URL */\n src?: string;\n /** Alt text for accessibility */\n alt: string;\n /** Whether this image is above the fold / LCP candidate */\n priority?: boolean;\n /** Aspect ratio for CLS prevention (e.g. \"16/9\", \"1/1\", \"4/3\") */\n aspectRatio?: string;\n /** Object fit mode */\n objectFit?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';\n /** Mobile image source for <picture> element */\n mobileSrc?: string;\n /** Mobile breakpoint for <source> media query (default: 768px) */\n mobileBreakpoint?: number;\n /** Skip the wrapper div */\n noWrapper?: boolean;\n /**\n * CDN widths for a density `srcset`. Pass `sizes` so the browser picks a\n * candidate close to the displayed CSS size.\n */\n srcSetWidths?: readonly number[];\n}\n\n/**\n * Optimized Image component with native browser lazy loading.\n *\n * - Uses `loading=\"lazy\"` + `decoding=\"async\"` by default for below-the-fold images.\n * - Uses `loading=\"eager\"` + `fetchPriority=\"high\"` for priority (above-the-fold / LCP) images.\n * - Supports responsive `<picture>` with mobile source.\n * - Provides `aspectRatio` for CLS prevention.\n * - When `srcSetWidths` + `sizes` are set, emits a sized CDN `srcset`.\n */\nexport const Image = memo(function Image({\n src,\n alt,\n priority = false,\n aspectRatio,\n objectFit = 'cover',\n mobileSrc,\n mobileBreakpoint = 768,\n noWrapper = false,\n className = '',\n style,\n width,\n height,\n sizes,\n srcSet: srcSetProp,\n srcSetWidths,\n ...rest\n}: ImageProps) {\n if (!src) return null;\n\n const generatedSrcSet =\n srcSetProp || (srcSetWidths?.length ? getCdnImageSrcSet(src, srcSetWidths) : undefined);\n const generatedMobileSrcSet =\n srcSetWidths?.length && mobileSrc ? getCdnImageSrcSet(mobileSrc, srcSetWidths) : undefined;\n const cdnWidth = srcSetWidths?.length\n ? width != null && srcSetWidths.includes(Number(width))\n ? Number(width)\n : srcSetWidths[0]\n : width;\n // Width-only CDN URLs so `src` matches a srcset candidate for preload.\n const cdnOptions = generatedSrcSet ? { width: cdnWidth } : { width: cdnWidth, height };\n\n const optimizedSrc = getCdnImageUrl(src, cdnOptions);\n const optimizedMobileSrc = getCdnImageUrl(mobileSrc, cdnOptions);\n\n const objectFitClass = `object-${objectFit}`;\n const imgClasses = [className, objectFitClass].filter(Boolean).join(' ');\n\n const loadingProps: React.ImgHTMLAttributes<HTMLImageElement> = priority\n ? { loading: 'eager' as const, fetchPriority: 'high' as const, decoding: 'sync' as const }\n : { loading: 'lazy' as const, decoding: 'async' as const };\n\n const hasWrapper = !noWrapper && !!aspectRatio;\n\n const img = (\n <img\n src={optimizedSrc}\n alt={alt}\n className={imgClasses}\n width={width}\n height={height}\n sizes={sizes}\n srcSet={generatedSrcSet}\n // With a wrapper, `style` goes to the wrapper; otherwise it must land on the <img>.\n style={hasWrapper ? undefined : style}\n {...loadingProps}\n {...rest}\n />\n );\n\n const imgElement = optimizedMobileSrc ? (\n <picture>\n <source\n media={`(max-width: ${mobileBreakpoint}px)`}\n srcSet={generatedMobileSrcSet || optimizedMobileSrc}\n sizes={generatedMobileSrcSet ? sizes : undefined}\n />\n {img}\n </picture>\n ) : (\n img\n );\n\n if (!hasWrapper) {\n return imgElement;\n }\n\n return (\n <div className=\"relative overflow-hidden\" style={{ aspectRatio, ...style }}>\n {imgElement}\n </div>\n );\n});\n","import { Suspense, memo, use, type ReactNode } from 'react';\n\nexport interface DeferredDataProps<T> {\n promise: Promise<T> | T;\n fallback: ReactNode;\n children: (data: T) => ReactNode;\n}\n\nconst DEFERRED_KEY = Symbol.for('twilight.deferred');\n\ninterface DeferredState<T> {\n status: 'pending' | 'success' | 'error';\n value?: T;\n error?: unknown;\n}\n\nexport interface DeferredPromise<T> extends Promise<T> {\n [DEFERRED_KEY]?: DeferredState<T>;\n}\n\nconst seenPromises = typeof WeakSet !== 'undefined' ? new WeakSet() : null;\n\nfunction defer<T>(promise: Promise<T>): DeferredPromise<T> {\n const existing = (promise as DeferredPromise<T>)[DEFERRED_KEY];\n if (existing) return promise as DeferredPromise<T>;\n\n const state: DeferredState<T> = { status: 'pending' };\n\n const deferred = promise as DeferredPromise<T>;\n deferred[DEFERRED_KEY] = state;\n\n promise.then(\n (value) => {\n state.status = 'success';\n state.value = value;\n },\n (error) => {\n state.status = 'error';\n state.error = error;\n }\n );\n\n return deferred;\n}\n\nconst DeferredRenderer = memo(function DeferredRenderer<T>({\n promise,\n children,\n}: {\n promise: DeferredPromise<T>;\n children: (data: T) => ReactNode;\n}) {\n const state = promise[DEFERRED_KEY];\n\n if (state?.status === 'success') {\n return children(state.value!);\n }\n\n if (state?.status === 'error') {\n throw state.error;\n }\n\n const data = use(promise);\n return children(data);\n}) as <T>(props: { promise: DeferredPromise<T>; children: (data: T) => ReactNode }) => ReactNode;\n\nfunction DeferredFallback<T>({\n promise,\n fallback,\n children,\n}: {\n promise: DeferredPromise<T>;\n fallback: ReactNode;\n children: (data: T) => ReactNode;\n}) {\n const state = promise[DEFERRED_KEY];\n if (state?.status === 'success') {\n return children(state.value!);\n }\n return <>{fallback}</>;\n}\n\nexport function resolveDeferred<T>(\n promiseOrValue: Promise<T> | T | undefined\n): T | Promise<T> | undefined {\n if (promiseOrValue == null || !(promiseOrValue instanceof Promise)) return promiseOrValue;\n const deferred = defer(promiseOrValue);\n const state = deferred[DEFERRED_KEY];\n if (state?.status === 'success') return state.value as T;\n return promiseOrValue;\n}\n\nexport function DeferredData<T>({ promise, fallback, children }: DeferredDataProps<T>) {\n if (!(promise instanceof Promise)) {\n return children(promise);\n }\n\n if (seenPromises && promise instanceof Promise) seenPromises.add(promise);\n\n const deferred = defer(promise);\n const state = deferred[DEFERRED_KEY];\n\n if (state?.status === 'success') {\n return children(state.value!);\n }\n\n if (state?.status === 'error') {\n throw state.error;\n }\n\n return (\n <Suspense\n fallback={\n <DeferredFallback promise={deferred} fallback={fallback}>\n {children}\n </DeferredFallback>\n }\n >\n <DeferredRenderer promise={deferred}>{children}</DeferredRenderer>\n </Suspense>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { orThrow } from './chunk-SDIQHTDG.js';
2
- import { api } from './chunk-EXBH6RGD.js';
1
+ import { orThrow } from './chunk-OKNJFS44.js';
2
+ import { api } from './chunk-IK57LAIA.js';
3
3
  import { queryOptions } from '@tanstack/react-query';
4
4
 
5
5
  var page = {
@@ -17,5 +17,5 @@ var page = {
17
17
  };
18
18
 
19
19
  export { page };
20
- //# sourceMappingURL=chunk-JZ7BOB4G.js.map
21
- //# sourceMappingURL=chunk-JZ7BOB4G.js.map
20
+ //# sourceMappingURL=chunk-6KVB2WHE.js.map
21
+ //# sourceMappingURL=chunk-6KVB2WHE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/page.ts"],"names":[],"mappings":";;;;AAKO,IAAM,IAAA,GAAO;AAAA,EAClB,IAAA,EAAM,OAAO,IAAA,KAA2C;AACtD,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,MAAA,EAAS,IAAI,CAAA,CAAE,CAAA,CAAE,IAAA,EAAgC;AAChF,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,aAAa,CAAC,IAAA,KAA2C,QAAQ,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAEhF,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,CAAC,IAAA,KACP,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,OAAA,EAAS,QAAA,EAAU,IAAI,CAAA;AAAA,MAClC,OAAA,EAAS,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI;AAAA,KAC9B;AAAA;AAEP","file":"chunk-JZ7BOB4G.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport type { ApiPageResponse } from '../routes/page/types';\nimport { orThrow } from '../providers/NavigationProvider';\n\nexport const page = {\n find: async (slug: string): Promise<ApiPageResponse> => {\n const { data } = await api.get(`pages/${slug}`).json<{ data: ApiPageResponse }>();\n return data;\n },\n\n findOrThrow: (slug: string): Promise<ApiPageResponse> => orThrow(page.find(slug)),\n\n queries: {\n detail: (slug: string) =>\n queryOptions({\n queryKey: ['pages', 'detail', slug],\n queryFn: () => page.find(slug),\n }),\n },\n};\n"]}
1
+ {"version":3,"sources":["../src/api/page.ts"],"names":[],"mappings":";;;;AAKO,IAAM,IAAA,GAAO;AAAA,EAClB,IAAA,EAAM,OAAO,IAAA,KAA2C;AACtD,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,MAAA,EAAS,IAAI,CAAA,CAAE,CAAA,CAAE,IAAA,EAAgC;AAChF,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EAEA,aAAa,CAAC,IAAA,KAA2C,QAAQ,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAEhF,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,CAAC,IAAA,KACP,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,OAAA,EAAS,QAAA,EAAU,IAAI,CAAA;AAAA,MAClC,OAAA,EAAS,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI;AAAA,KAC9B;AAAA;AAEP","file":"chunk-6KVB2WHE.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport type { ApiPageResponse } from '../routes/page/types';\nimport { orThrow } from '../providers/NavigationProvider';\n\nexport const page = {\n find: async (slug: string): Promise<ApiPageResponse> => {\n const { data } = await api.get(`pages/${slug}`).json<{ data: ApiPageResponse }>();\n return data;\n },\n\n findOrThrow: (slug: string): Promise<ApiPageResponse> => orThrow(page.find(slug)),\n\n queries: {\n detail: (slug: string) =>\n queryOptions({\n queryKey: ['pages', 'detail', slug],\n queryFn: () => page.find(slug),\n }),\n },\n};\n"]}
@@ -1,7 +1,15 @@
1
+ import { useTranslation } from './chunk-TYNZ5B2B.js';
1
2
  import { useAsyncFn } from './chunk-6BZ5TKEV.js';
2
3
  import { useState } from 'react';
3
4
 
5
+ function couponError(error, fallback) {
6
+ if (!error) return null;
7
+ const { response } = error;
8
+ if (!response) return error.message;
9
+ return response.data?.error?.message || fallback;
10
+ }
4
11
  function useCoupon() {
12
+ const { t } = useTranslation();
5
13
  const [value, setValue] = useState(null);
6
14
  const [applyState, applyFn] = useAsyncFn(async (code) => {
7
15
  if (!code.trim()) throw new Error("Please enter a coupon code");
@@ -15,12 +23,15 @@ function useCoupon() {
15
23
  return {
16
24
  value,
17
25
  loading: applyState.loading || removeState.loading,
18
- error: (applyState.error ?? removeState.error)?.message ?? null,
26
+ error: couponError(
27
+ applyState.error ?? removeState.error,
28
+ t("pages.cart.coupon_application_error", "Could not apply the coupon")
29
+ ),
19
30
  apply: async (code) => !(await applyFn(code) instanceof Error),
20
31
  remove: async () => !(await removeFn() instanceof Error)
21
32
  };
22
33
  }
23
34
 
24
35
  export { useCoupon };
25
- //# sourceMappingURL=chunk-BVSJPBJ6.js.map
26
- //# sourceMappingURL=chunk-BVSJPBJ6.js.map
36
+ //# sourceMappingURL=chunk-6WI7R2BD.js.map
37
+ //# sourceMappingURL=chunk-6WI7R2BD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useCoupon.ts"],"names":[],"mappings":";;;;AAuEA,SAAS,WAAA,CAAY,OAA0B,QAAA,EAAiC;AAC9E,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,EAAE,UAAS,GAAI,KAAA;AAGrB,EAAA,IAAI,CAAC,QAAA,EAAU,OAAO,KAAA,CAAM,OAAA;AAC5B,EAAA,OAAO,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,OAAA,IAAW,QAAA;AAC1C;AAEO,SAAS,SAAA,GAA6B;AAC3C,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,CAAC,UAAA,EAAY,OAAO,CAAA,GAAI,UAAA,CAAW,OAAO,IAAA,KAAiB;AAC/D,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAC9D,IAAA,MAAM,OAAO,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AAC9C,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,CAAC,WAAA,EAAa,QAAQ,CAAA,GAAI,WAAW,YAAY;AACrD,IAAA,MAAM,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,YAAA,EAAa;AACtC,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA,EAAS,UAAA,CAAW,OAAA,IAAW,WAAA,CAAY,OAAA;AAAA,IAC3C,KAAA,EAAO,WAAA;AAAA,MACL,UAAA,CAAW,SAAS,WAAA,CAAY,KAAA;AAAA,MAChC,CAAA,CAAE,uCAAuC,4BAA4B;AAAA,KACvE;AAAA,IACA,OAAO,OAAO,IAAA,KAAS,EAAI,MAAM,OAAA,CAAQ,IAAI,CAAA,YAA0B,KAAA,CAAA;AAAA,IACvE,MAAA,EAAQ,YAAY,EAAI,MAAM,UAAS,YAA0B,KAAA;AAAA,GACnE;AACF","file":"chunk-6WI7R2BD.js","sourcesContent":["/**\n * useCoupon - Hook for managing coupon functionality in cart\n *\n * @example\n * ```tsx\n * function CouponInput() {\n * const { value, apply, remove, error, loading } = useCoupon();\n *\n * return (\n * <div>\n * <input placeholder=\"Enter coupon\" />\n * <button onClick={() => apply(code)}>Apply</button>\n * {error && <span>{error}</span>}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState } from 'react';\nimport { useAsyncFn } from './useAsyncFn';\nimport { useTranslation } from '../providers/I18nProvider';\nimport type { UseApply } from './types';\n\n/**\n * UseCouponResult - Return type for useCoupon hook\n */\nexport type UseCouponResult = UseApply<string>;\n\n/**\n * useCoupon - Hook for managing cart coupons\n *\n * Handles applying and removing coupons from the cart using the\n * Salla SDK. Returns state for loading, errors, and the current\n * coupon value.\n *\n * @returns Coupon management object with apply and remove functions\n *\n * @example\n * ```tsx\n * function CouponInput() {\n * const { value, apply, remove, error, loading } = useCoupon();\n *\n * const [code, setCode] = useState('');\n *\n * return (\n * <div>\n * {value ? (\n * <>\n * <span>Coupon applied: {value}</span>\n * <button onClick={remove}>Remove</button>\n * </>\n * ) : (\n * <div>\n * <input\n * placeholder=\"Enter coupon code\"\n * value={code}\n * onChange={(e) => setCode(e.target.value)}\n * />\n * <button onClick={() => apply(code)} disabled={loading}>\n * Apply\n * </button>\n * </div>\n * )}\n * {error && <span className=\"error\">{error}</span>}\n * </div>\n * );\n * }\n * ```\n */\n/** The API's own reason, as `salla-cart-coupons` shows it, not the HTTP client's message. */\nfunction couponError(error: Error | undefined, fallback: string): string | null {\n if (!error) return null;\n const { response } = error as Error & {\n response?: { data?: { error?: { message?: string } } };\n };\n if (!response) return error.message;\n return response.data?.error?.message || fallback;\n}\n\nexport function useCoupon(): UseCouponResult {\n const { t } = useTranslation();\n const [value, setValue] = useState<string | null>(null);\n\n const [applyState, applyFn] = useAsyncFn(async (code: string) => {\n if (!code.trim()) throw new Error('Please enter a coupon code');\n await window.salla?.cart.addCoupon(code.trim());\n setValue(code.trim());\n }, []);\n\n const [removeState, removeFn] = useAsyncFn(async () => {\n await window.salla?.cart.deleteCoupon();\n setValue(null);\n }, []);\n\n return {\n value,\n loading: applyState.loading || removeState.loading,\n error: couponError(\n applyState.error ?? removeState.error,\n t('pages.cart.coupon_application_error', 'Could not apply the coupon')\n ),\n apply: async (code) => !(((await applyFn(code)) as unknown) instanceof Error),\n remove: async () => !(((await removeFn()) as unknown) instanceof Error),\n };\n}\n"]}
@@ -1,24 +1,25 @@
1
- import { Header } from './chunk-L2QUP6J3.js';
1
+ import { Header } from './chunk-WHGOO4A2.js';
2
2
  import { Copyright } from './chunk-JKIRRMBU.js';
3
3
  import { useDevSettingsOverrides } from './chunk-2JV6WZ6O.js';
4
- import { apps } from './chunk-OYP5CGHU.js';
4
+ import { apps } from './chunk-3TJKB3WR.js';
5
5
  import { color } from './chunk-VVZNW5CB.js';
6
- import { applyThemeHookSlots, installAppScope } from './chunk-HBTIZWT2.js';
7
- import { useLocation, useIsHome, NavigationInterceptor } from './chunk-SDIQHTDG.js';
8
- import { useUser } from './chunk-3EE62REP.js';
6
+ import { applyThemeHookSlots, installAppScope } from './chunk-RYSJOCHI.js';
7
+ import { useLocation, useIsHome, NavigationInterceptor } from './chunk-OKNJFS44.js';
8
+ import { useUser } from './chunk-2OYXPNCE.js';
9
+ import { getActiveCurrency } from './chunk-IK57LAIA.js';
9
10
  import { useAsset } from './chunk-Z653O7MX.js';
10
11
  import { DocumentClassProvider, useDocumentClass } from './chunk-JWXJPJBO.js';
11
12
  import { useTranslation, I18nProvider } from './chunk-TYNZ5B2B.js';
12
13
  import { WidgetHead } from './chunk-V2ZDTY6H.js';
13
14
  import { HookSlot } from './chunk-5XDPAKF5.js';
14
15
  import { hookRegistry } from './chunk-GCPEMNSU.js';
15
- import { Image } from './chunk-IXUY5RMV.js';
16
+ import { Image } from './chunk-6I4LWF5Y.js';
16
17
  import { Link } from './chunk-AXW67SY7.js';
17
18
  import { LazyImageModal } from './chunk-7V5HOZW4.js';
18
- import { Toaster } from './chunk-MISI3T6V.js';
19
- import { isNativeApp } from './chunk-3IHFA2X5.js';
20
- import { whenSallaLoaded, whenSallaReady, onSallaEvent, syncSdkLocale } from './chunk-QVJDYSCT.js';
21
- import { AUTH_TOKEN_COOKIE_NAME, rememberDevStoreId, clearAuthTokenCookie, syncScopeCookie } from './chunk-LPQFTXBB.js';
19
+ import { Toaster } from './chunk-M6BXZTRK.js';
20
+ import { isNativeApp } from './chunk-JEG5WPNT.js';
21
+ import { whenSallaLoaded, whenSallaReady, onSallaEvent, syncSdkLocale } from './chunk-P4GOLSA2.js';
22
+ import { AUTH_TOKEN_COOKIE_NAME, rememberDevStoreId, clearAuthTokenCookie, syncScopeCookie } from './chunk-Y5OGXJLH.js';
22
23
  import { getTwilightContext, updateTwilightContext } from './chunk-N2S25NXP.js';
23
24
  import { FALLBACK_LOCALE, getLanguageInfo } from './chunk-T72DAX7R.js';
24
25
  import { useTwilight, TwilightContext } from './chunk-DF6FBKDN.js';
@@ -110,7 +111,7 @@ function ThemeDocumentSync({
110
111
  }
111
112
 
112
113
  // src/utils/engine-version.ts
113
- var ENGINE_VERSION = "1.0.73" ;
114
+ var ENGINE_VERSION = "1.0.74" ;
114
115
 
115
116
  // src/providers/twilight-init.ts
116
117
  function getSalla() {
@@ -118,10 +119,19 @@ function getSalla() {
118
119
  return window.salla;
119
120
  }
120
121
  var SDK_GUEST_CURRENCY = "SAR";
122
+ function withCookieLocale(sdk, stored) {
123
+ return {
124
+ ...stored,
125
+ language_code: sdk.cookie?.get?.("s-lang") ?? stored.language_code,
126
+ currency_code: sdk.cookie?.get?.("s-curr") ?? stored.currency_code ?? SDK_GUEST_CURRENCY
127
+ };
128
+ }
121
129
  function withSettingsUser(sdk, settings) {
122
130
  if (!settings) return settings;
123
131
  const { user: guest, ...rest } = settings;
124
- if (!guest || sdk.storage?.get?.("user")) return rest;
132
+ const stored = sdk.storage?.get?.("user");
133
+ if (stored) return { ...rest, user: withCookieLocale(sdk, stored) };
134
+ if (!guest) return rest;
125
135
  const {
126
136
  currency_code: _currency,
127
137
  country_code: _country,
@@ -180,7 +190,11 @@ function useTwilightInit({
180
190
  }
181
191
  return baseTheme;
182
192
  }, [baseTheme, devOverrides]);
183
- const [currency] = useState(null);
193
+ const [currency] = useState(() => {
194
+ const code = getActiveCurrency();
195
+ const active = code ? settingsData?.currencies?.[code] : void 0;
196
+ return active ? { code: active.code, name: active.name, symbol: active.symbol } : null;
197
+ });
184
198
  const [isMobileWebview] = useState(false);
185
199
  useEffect(() => {
186
200
  if (!isBrowser || !themeData) return;
@@ -262,13 +276,13 @@ function applySafeArea(data) {
262
276
  }
263
277
  var navigationSetups = {
264
278
  tanstack: lazy(
265
- () => import('./navigation-P3GZOWUU.js').then((m) => ({ default: m.NavigationSetup }))
279
+ () => import('./navigation-CDITJYUW.js').then((m) => ({ default: m.NavigationSetup }))
266
280
  ),
267
- nextjs: lazy(() => import('./navigation-TA3I3XEC.js').then((m) => ({ default: m.NavigationSetup })))
281
+ nextjs: lazy(() => import('./navigation-WCGV6RUK.js').then((m) => ({ default: m.NavigationSetup })))
268
282
  };
269
283
  var routeDocumentSyncs = {
270
284
  tanstack: lazy(
271
- () => import('./document-class-DOQDO2DN.js').then((m) => ({
285
+ () => import('./document-class-5FTU6EZE.js').then((m) => ({
272
286
  default: m.TanStackDocumentSync
273
287
  }))
274
288
  )
@@ -381,11 +395,11 @@ var isValid = (value) => {
381
395
  return false;
382
396
  };
383
397
  function useMoney() {
384
- const { store, settings } = useTwilight();
398
+ const { store, settings, currency: active } = useTwilight();
385
399
  const useArabicNumerals = store?.settings?.arabic_numbers_enabled ?? false;
386
400
  const useSarSymbol = store?.settings?.use_sar_symbol ?? false;
387
401
  const format = (amount, options) => {
388
- const currency = options?.currency ?? "SAR";
402
+ const currency = options?.currency ?? active?.code ?? "SAR";
389
403
  const type = options?.type ?? "product";
390
404
  if (amount == null || amount === "") {
391
405
  const showDash = type === "product" ? store?.settings?.product?.show_price_as_dash : false;
@@ -790,7 +804,7 @@ var LazySiftSnippet = lazy(
790
804
  () => import('./SiftSnippet-5FCU6TR6.js').then((m) => ({ default: m.SiftSnippet }))
791
805
  );
792
806
  var LazyStoreClosedNotification = lazy(
793
- () => import('./StoreClosedNotification-NKRYCLKX.js').then((m) => ({
807
+ () => import('./StoreClosedNotification-65QIOIAM.js').then((m) => ({
794
808
  default: m.StoreClosedNotification
795
809
  }))
796
810
  );
@@ -1056,6 +1070,21 @@ var waitForSdk = () => {
1056
1070
  const ready = window.salla?.onReady();
1057
1071
  return ready ? Promise.race([ready, timeout(READY_TIMEOUT_MS)]) : Promise.resolve();
1058
1072
  };
1073
+ function withDeferredOnReady(inject) {
1074
+ const sdk = window.salla;
1075
+ const onReady = sdk?.onReady;
1076
+ if (!sdk || typeof onReady !== "function") return inject();
1077
+ const queued = [];
1078
+ sdk.onReady = (callback) => new Promise((resolve, reject) => {
1079
+ queued.push(() => onReady.call(sdk, callback).then(resolve, reject));
1080
+ });
1081
+ try {
1082
+ inject();
1083
+ } finally {
1084
+ sdk.onReady = onReady;
1085
+ }
1086
+ queued.forEach((run) => run());
1087
+ }
1059
1088
  function mountSnippets(owned, clientSnippets, buckets) {
1060
1089
  applyThemeHookSlots();
1061
1090
  installAppScope({ apps: buckets });
@@ -1063,14 +1092,16 @@ function mountSnippets(owned, clientSnippets, buckets) {
1063
1092
  for (const s of owned) {
1064
1093
  if (s.url && !(s.appScopeId in buckets)) unresolved.add(s.appScopeId);
1065
1094
  }
1066
- for (const snippet of clientSnippets) {
1067
- const target = snippet.place?.includes("head") ? document.head : document.body;
1068
- try {
1069
- injectHtml(resolveCustomerParams(snippet.content, snippet.customer_parameters), target);
1070
- } catch (error) {
1071
- console.error(`[salla] failed to inject snippet for app ${snippet.appScopeId}`, error);
1095
+ withDeferredOnReady(() => {
1096
+ for (const snippet of clientSnippets) {
1097
+ const target = snippet.place?.includes("head") ? document.head : document.body;
1098
+ try {
1099
+ injectHtml(resolveCustomerParams(snippet.content, snippet.customer_parameters), target);
1100
+ } catch (error) {
1101
+ console.error(`[salla] failed to inject snippet for app ${snippet.appScopeId}`, error);
1102
+ }
1072
1103
  }
1073
- }
1104
+ });
1074
1105
  if (unresolved.size) {
1075
1106
  console.warn(
1076
1107
  `[salla] app settings missing for ${unresolved.size} app(s); their snippets ran without app.* config`,
@@ -1377,5 +1408,5 @@ function useStore() {
1377
1408
  }
1378
1409
 
1379
1410
  export { Footer, MasterLayout, TwilightProvider, fastCheckoutScript, registerDefaultHooks, registerDocumentSync, routeDocumentSyncs, useBreadcrumbs, useDate, useGtm, useMoney, useNumber, useOpeningHours, usePageConfig, useStore };
1380
- //# sourceMappingURL=chunk-CMD3ARR2.js.map
1381
- //# sourceMappingURL=chunk-CMD3ARR2.js.map
1411
+ //# sourceMappingURL=chunk-BLWLKRKH.js.map
1412
+ //# sourceMappingURL=chunk-BLWLKRKH.js.map