@salla.sa/twilight-theme-engine 1.0.136 → 1.0.137

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 (350) hide show
  1. package/dist/{AddToCartForm-RG4ANO47.js → AddToCartForm-NKY5PPUO.js} +4 -3
  2. package/dist/AddToCartForm-NKY5PPUO.js.map +1 -0
  3. package/dist/{BlogAuthorPage-JEYNAFRH.js → BlogAuthorPage-BEFTTLZP.js} +18 -17
  4. package/dist/BlogAuthorPage-BEFTTLZP.js.map +1 -0
  5. package/dist/{BlogCategoryPage-IIAXWMHD.js → BlogCategoryPage-ZHI4BOOC.js} +18 -17
  6. package/dist/BlogCategoryPage-ZHI4BOOC.js.map +1 -0
  7. package/dist/{BlogPage-NKYICNRT.js → BlogPage-YYZFF5TI.js} +16 -15
  8. package/dist/BlogPage-YYZFF5TI.js.map +1 -0
  9. package/dist/{BlogSinglePage-FBO4NQL5.js → BlogSinglePage-B7LWBOTP.js} +16 -15
  10. package/dist/BlogSinglePage-B7LWBOTP.js.map +1 -0
  11. package/dist/{BlogTagPage-WZIUPBEM.js → BlogTagPage-MRHYZNWV.js} +18 -17
  12. package/dist/BlogTagPage-MRHYZNWV.js.map +1 -0
  13. package/dist/{BrandsPage-EN6MZV6T.js → BrandsPage-EBQRAGCH.js} +17 -16
  14. package/dist/BrandsPage-EBQRAGCH.js.map +1 -0
  15. package/dist/{Breadcrumb-COB4TMMI.js → Breadcrumb-LXOPBBN4.js} +16 -15
  16. package/dist/Breadcrumb-LXOPBBN4.js.map +1 -0
  17. package/dist/{CartItem-SYQZHA2F.js → CartItem-7MMLNUN4.js} +16 -15
  18. package/dist/CartItem-7MMLNUN4.js.map +1 -0
  19. package/dist/{CartSummary-YQN7N6JW.js → CartSummary-G547ABBP.js} +16 -15
  20. package/dist/CartSummary-G547ABBP.js.map +1 -0
  21. package/dist/{Copyright-II2URAIP.js → Copyright-73W4NHW7.js} +4 -3
  22. package/dist/Copyright-73W4NHW7.js.map +1 -0
  23. package/dist/{CustomerLayout-75NK34WK.js → CustomerLayout-JTKY24VZ.js} +16 -15
  24. package/dist/CustomerLayout-JTKY24VZ.js.map +1 -0
  25. package/dist/{Footer-6MYG4POU.js → Footer-E2KUIBSW.js} +6 -5
  26. package/dist/{Footer-6MYG4POU.js.map → Footer-E2KUIBSW.js.map} +1 -1
  27. package/dist/{Header-KXX42XKB.js → Header-FVSR2NSQ.js} +9 -8
  28. package/dist/{Header-KXX42XKB.js.map → Header-FVSR2NSQ.js.map} +1 -1
  29. package/dist/{LoyaltyPage-R4KWVGLW.js → LoyaltyPage-MTUCGVJ5.js} +16 -15
  30. package/dist/LoyaltyPage-MTUCGVJ5.js.map +1 -0
  31. package/dist/{LoyaltyPointsPage-L7HG54RQ.js → LoyaltyPointsPage-CF2X3ZHW.js} +7 -6
  32. package/dist/LoyaltyPointsPage-CF2X3ZHW.js.map +1 -0
  33. package/dist/{MainMenu-KI4BAA7W.js → MainMenu-IDJXM45R.js} +6 -5
  34. package/dist/MainMenu-IDJXM45R.js.map +1 -0
  35. package/dist/{MasterLayout-WQ3VWDAA.js → MasterLayout-44QYYOSX.js} +16 -15
  36. package/dist/{MasterLayout-WQ3VWDAA.js.map → MasterLayout-44QYYOSX.js.map} +1 -1
  37. package/dist/{MobileMenu-LJXKYKRI.js → MobileMenu-TLDDRK6H.js} +17 -16
  38. package/dist/MobileMenu-TLDDRK6H.js.map +1 -0
  39. package/dist/{NotificationsPage-4TUPN24E.js → NotificationsPage-6MJCAI6D.js} +16 -15
  40. package/dist/NotificationsPage-6MJCAI6D.js.map +1 -0
  41. package/dist/{OrderSinglePage-N3YGXCKL.js → OrderSinglePage-ZRKP4PJX.js} +17 -16
  42. package/dist/OrderSinglePage-ZRKP4PJX.js.map +1 -0
  43. package/dist/{OrdersPage-V3WNW2WZ.js → OrdersPage-U3GHFHDO.js} +16 -15
  44. package/dist/OrdersPage-U3GHFHDO.js.map +1 -0
  45. package/dist/{PageSingle-H5YA47EG.js → PageSingle-TOJXQ5LW.js} +4 -3
  46. package/dist/PageSingle-TOJXQ5LW.js.map +1 -0
  47. package/dist/{ProductDetails-EHRMQR7F.js → ProductDetails-WX5LQXLW.js} +5 -4
  48. package/dist/ProductDetails-WX5LQXLW.js.map +1 -0
  49. package/dist/{ProfilePage-3GRY4RSA.js → ProfilePage-EVVDBLYL.js} +16 -15
  50. package/dist/ProfilePage-EVVDBLYL.js.map +1 -0
  51. package/dist/{ReviewsPage-SPHK5MCS.js → ReviewsPage-B2K3VNYU.js} +4 -3
  52. package/dist/ReviewsPage-B2K3VNYU.js.map +1 -0
  53. package/dist/{SeoCartWidget-P2QQ62AF.js → SeoCartWidget-R5ZCOT4Q.js} +16 -15
  54. package/dist/SeoCartWidget-R5ZCOT4Q.js.map +1 -0
  55. package/dist/{SettingsPage-YFN32XOV.js → SettingsPage-WGBMWUTX.js} +16 -15
  56. package/dist/SettingsPage-WGBMWUTX.js.map +1 -0
  57. package/dist/{StoreClosedNotification-3RU33TF6.js → StoreClosedNotification-2ZEUFOMA.js} +17 -16
  58. package/dist/{StoreClosedNotification-3RU33TF6.js.map → StoreClosedNotification-2ZEUFOMA.js.map} +1 -1
  59. package/dist/{TestimonialsPage-4W6SXN24.js → TestimonialsPage-UVUX2PE3.js} +4 -3
  60. package/dist/TestimonialsPage-UVUX2PE3.js.map +1 -0
  61. package/dist/{ThankYouPage-56AIK3QG.js → ThankYouPage-EIQ57UHN.js} +16 -15
  62. package/dist/ThankYouPage-EIQ57UHN.js.map +1 -0
  63. package/dist/{WalletPage-FLB4OCK4.js → WalletPage-HQAM2ZXP.js} +17 -16
  64. package/dist/WalletPage-HQAM2ZXP.js.map +1 -0
  65. package/dist/{WishlistPage-H6KGJYRT.js → WishlistPage-2IOAOQGS.js} +18 -17
  66. package/dist/WishlistPage-2IOAOQGS.js.map +1 -0
  67. package/dist/api/advertisement.js +2 -2
  68. package/dist/api/apps.js +2 -2
  69. package/dist/api/blog.js +3 -3
  70. package/dist/api/brands.js +3 -3
  71. package/dist/api/cart.js +3 -3
  72. package/dist/api/category.js +3 -3
  73. package/dist/api/client.js +1 -1
  74. package/dist/api/home.js +2 -2
  75. package/dist/api/loyalty.js +3 -3
  76. package/dist/api/menu.js +2 -2
  77. package/dist/api/notification.js +2 -2
  78. package/dist/api/order.js +3 -3
  79. package/dist/api/page.js +3 -3
  80. package/dist/api/product.js +3 -3
  81. package/dist/api/profile.js +1 -1
  82. package/dist/api/store.js +2 -2
  83. package/dist/api/translations.js +2 -2
  84. package/dist/api/user.js +2 -2
  85. package/dist/api/wallet.js +2 -2
  86. package/dist/api/wishlist.js +4 -4
  87. package/dist/{chunk-V4E6JFS4.js → chunk-2WEGBUAG.js} +12 -10
  88. package/dist/chunk-2WEGBUAG.js.map +1 -0
  89. package/dist/{chunk-EDK4U4WQ.js → chunk-3PHBJ3TA.js} +3 -3
  90. package/dist/{chunk-EDK4U4WQ.js.map → chunk-3PHBJ3TA.js.map} +1 -1
  91. package/dist/{chunk-OIL6F7S2.js → chunk-5MIP3DUG.js} +4 -4
  92. package/dist/{chunk-OIL6F7S2.js.map → chunk-5MIP3DUG.js.map} +1 -1
  93. package/dist/{chunk-F324WS4B.js → chunk-5Y4NL57B.js} +3 -3
  94. package/dist/{chunk-F324WS4B.js.map → chunk-5Y4NL57B.js.map} +1 -1
  95. package/dist/{chunk-YV5VCWQF.js → chunk-67J4DMB3.js} +4 -4
  96. package/dist/{chunk-YV5VCWQF.js.map → chunk-67J4DMB3.js.map} +1 -1
  97. package/dist/{chunk-ITNE6DTO.js → chunk-7GBVI6SK.js} +4 -4
  98. package/dist/{chunk-ITNE6DTO.js.map → chunk-7GBVI6SK.js.map} +1 -1
  99. package/dist/{chunk-THDD2H3C.js → chunk-7IQX4GHT.js} +4 -4
  100. package/dist/{chunk-THDD2H3C.js.map → chunk-7IQX4GHT.js.map} +1 -1
  101. package/dist/{chunk-DESMKK54.js → chunk-7VYVQMYE.js} +4 -4
  102. package/dist/{chunk-DESMKK54.js.map → chunk-7VYVQMYE.js.map} +1 -1
  103. package/dist/{chunk-XNNKW6FA.js → chunk-BPCSMALD.js} +3 -3
  104. package/dist/{chunk-XNNKW6FA.js.map → chunk-BPCSMALD.js.map} +1 -1
  105. package/dist/{chunk-B6CGVRJ7.js → chunk-BYP72WXK.js} +4 -4
  106. package/dist/{chunk-B6CGVRJ7.js.map → chunk-BYP72WXK.js.map} +1 -1
  107. package/dist/{chunk-F73QPQX7.js → chunk-COSCD4AH.js} +34 -28
  108. package/dist/chunk-COSCD4AH.js.map +1 -0
  109. package/dist/{chunk-PB2K5LRO.js → chunk-CYDQFZRF.js} +3 -3
  110. package/dist/{chunk-PB2K5LRO.js.map → chunk-CYDQFZRF.js.map} +1 -1
  111. package/dist/{chunk-ZAVUF234.js → chunk-DKYNZHZN.js} +3 -3
  112. package/dist/{chunk-ZAVUF234.js.map → chunk-DKYNZHZN.js.map} +1 -1
  113. package/dist/{chunk-WXE5OK4N.js → chunk-E74WBS5R.js} +3 -3
  114. package/dist/{chunk-WXE5OK4N.js.map → chunk-E74WBS5R.js.map} +1 -1
  115. package/dist/{chunk-RVPFDYQ2.js → chunk-GHM37DUT.js} +3 -3
  116. package/dist/{chunk-RVPFDYQ2.js.map → chunk-GHM37DUT.js.map} +1 -1
  117. package/dist/{chunk-NZ6REC6S.js → chunk-GKM24XYF.js} +4 -4
  118. package/dist/{chunk-NZ6REC6S.js.map → chunk-GKM24XYF.js.map} +1 -1
  119. package/dist/{chunk-UA4F3ZR3.js → chunk-HFWQRV3W.js} +4 -4
  120. package/dist/{chunk-UA4F3ZR3.js.map → chunk-HFWQRV3W.js.map} +1 -1
  121. package/dist/{chunk-DIA2LU6I.js → chunk-HJGBOABY.js} +11 -9
  122. package/dist/chunk-HJGBOABY.js.map +1 -0
  123. package/dist/{chunk-JLJKIXDT.js → chunk-IC6Z6BB2.js} +13 -9
  124. package/dist/chunk-IC6Z6BB2.js.map +1 -0
  125. package/dist/{chunk-MMXLOECO.js → chunk-JK7WLO72.js} +9 -8
  126. package/dist/chunk-JK7WLO72.js.map +1 -0
  127. package/dist/{chunk-NBVI4H4K.js → chunk-K356POFX.js} +3 -3
  128. package/dist/{chunk-NBVI4H4K.js.map → chunk-K356POFX.js.map} +1 -1
  129. package/dist/{chunk-RYAOXNRA.js → chunk-K7BDIB3L.js} +3 -3
  130. package/dist/{chunk-RYAOXNRA.js.map → chunk-K7BDIB3L.js.map} +1 -1
  131. package/dist/chunk-KYMWEUN2.js +10 -0
  132. package/dist/chunk-KYMWEUN2.js.map +1 -0
  133. package/dist/{chunk-C76QBKQT.js → chunk-L22FKPMY.js} +3 -3
  134. package/dist/{chunk-C76QBKQT.js.map → chunk-L22FKPMY.js.map} +1 -1
  135. package/dist/{chunk-DE7OXJXT.js → chunk-LQBDOXLO.js} +4 -4
  136. package/dist/{chunk-DE7OXJXT.js.map → chunk-LQBDOXLO.js.map} +1 -1
  137. package/dist/{chunk-VE34Y3Z3.js → chunk-MT7DVK2V.js} +3 -3
  138. package/dist/{chunk-VE34Y3Z3.js.map → chunk-MT7DVK2V.js.map} +1 -1
  139. package/dist/{chunk-KSPVQQ7J.js → chunk-NPN23RYM.js} +5 -5
  140. package/dist/{chunk-KSPVQQ7J.js.map → chunk-NPN23RYM.js.map} +1 -1
  141. package/dist/{chunk-D262IAAT.js → chunk-NZX2ZEF7.js} +4 -4
  142. package/dist/{chunk-D262IAAT.js.map → chunk-NZX2ZEF7.js.map} +1 -1
  143. package/dist/chunk-O47T67E3.js +16 -0
  144. package/dist/chunk-O47T67E3.js.map +1 -0
  145. package/dist/{chunk-3RHCWLJT.js → chunk-OXUIG3H3.js} +3 -3
  146. package/dist/{chunk-3RHCWLJT.js.map → chunk-OXUIG3H3.js.map} +1 -1
  147. package/dist/chunk-OYD6FP42.js +25 -0
  148. package/dist/chunk-OYD6FP42.js.map +1 -0
  149. package/dist/{chunk-W37R3JJ7.js → chunk-PEENIBSF.js} +3 -3
  150. package/dist/{chunk-W37R3JJ7.js.map → chunk-PEENIBSF.js.map} +1 -1
  151. package/dist/{chunk-BXQZXOFK.js → chunk-PYDHLM3Y.js} +11 -9
  152. package/dist/chunk-PYDHLM3Y.js.map +1 -0
  153. package/dist/{chunk-J37FMLCI.js → chunk-QG2ORHKD.js} +3 -3
  154. package/dist/{chunk-J37FMLCI.js.map → chunk-QG2ORHKD.js.map} +1 -1
  155. package/dist/{chunk-PLFD6UWD.js → chunk-QU5J4QXM.js} +3 -3
  156. package/dist/{chunk-PLFD6UWD.js.map → chunk-QU5J4QXM.js.map} +1 -1
  157. package/dist/{chunk-LPVWRPMV.js → chunk-SLAP5YVD.js} +4 -4
  158. package/dist/{chunk-LPVWRPMV.js.map → chunk-SLAP5YVD.js.map} +1 -1
  159. package/dist/{chunk-6O5EFNDM.js → chunk-T2WCFT6J.js} +4 -4
  160. package/dist/{chunk-6O5EFNDM.js.map → chunk-T2WCFT6J.js.map} +1 -1
  161. package/dist/{chunk-TUIB74QX.js → chunk-V7RDFLP6.js} +15 -12
  162. package/dist/chunk-V7RDFLP6.js.map +1 -0
  163. package/dist/{chunk-BFPTMZ4G.js → chunk-VT4HELNA.js} +3 -3
  164. package/dist/{chunk-BFPTMZ4G.js.map → chunk-VT4HELNA.js.map} +1 -1
  165. package/dist/chunk-VYGA5AT5.js +27 -0
  166. package/dist/chunk-VYGA5AT5.js.map +1 -0
  167. package/dist/{chunk-6TT5VHUM.js → chunk-W6BDJU4X.js} +3 -3
  168. package/dist/{chunk-6TT5VHUM.js.map → chunk-W6BDJU4X.js.map} +1 -1
  169. package/dist/components/cart/index.js +2 -1
  170. package/dist/components/cart/lazy.d.ts +3 -3
  171. package/dist/components/cart/lazy.d.ts.map +1 -1
  172. package/dist/components/common/index.js +2 -1
  173. package/dist/components/common/lazy.d.ts +5 -5
  174. package/dist/components/common/lazy.d.ts.map +1 -1
  175. package/dist/components/drawer/index.js +14 -13
  176. package/dist/components/home/index.js +18 -17
  177. package/dist/components/home/lazy.d.ts +1 -1
  178. package/dist/components/home/lazy.d.ts.map +1 -1
  179. package/dist/components/layout/MasterLayout.d.ts.map +1 -1
  180. package/dist/components/layout/index.js +5 -4
  181. package/dist/components/layout/lazy.d.ts +6 -6
  182. package/dist/components/layout/lazy.d.ts.map +1 -1
  183. package/dist/components/live-editor/index.d.ts.map +1 -1
  184. package/dist/components/modal/index.js +2 -1
  185. package/dist/components/modal/lazy.d.ts +1 -1
  186. package/dist/components/modal/lazy.d.ts.map +1 -1
  187. package/dist/components/navigation/lazy.d.ts +2 -2
  188. package/dist/components/navigation/lazy.d.ts.map +1 -1
  189. package/dist/components/product/index.js +15 -14
  190. package/dist/components/product/lazy.d.ts +2 -2
  191. package/dist/components/product/lazy.d.ts.map +1 -1
  192. package/dist/components/store/index.js +15 -14
  193. package/dist/components/store/lazy.d.ts +2 -2
  194. package/dist/components/store/lazy.d.ts.map +1 -1
  195. package/dist/components/tracking/index.js +4 -3
  196. package/dist/components/tracking/index.js.map +1 -1
  197. package/dist/components/tracking/lazy.d.ts +2 -2
  198. package/dist/components/tracking/lazy.d.ts.map +1 -1
  199. package/dist/dev/editor/index.js +1 -1
  200. package/dist/dev/index.js +1 -1
  201. package/dist/{document-class-4JUQ44JX.js → document-class-TCFZKDMC.js} +12 -11
  202. package/dist/{document-class-4JUQ44JX.js.map → document-class-TCFZKDMC.js.map} +1 -1
  203. package/dist/hooks/index.js +14 -13
  204. package/dist/hooks/registerDefaultHooks.d.ts.map +1 -1
  205. package/dist/hooks/useGtm.js +14 -13
  206. package/dist/hooks/useMoney.js +14 -13
  207. package/dist/hooks/useStore.js +14 -13
  208. package/dist/hooks/useUser.js +3 -3
  209. package/dist/index.js +14 -13
  210. package/dist/index.js.map +1 -1
  211. package/dist/{navigation-QYWF2VGQ.js → navigation-7F6D5AI5.js} +5 -5
  212. package/dist/{navigation-QYWF2VGQ.js.map → navigation-7F6D5AI5.js.map} +1 -1
  213. package/dist/{navigation-6KY4HODP.js → navigation-OID45FWX.js} +4 -4
  214. package/dist/{navigation-6KY4HODP.js.map → navigation-OID45FWX.js.map} +1 -1
  215. package/dist/{not-found-3M6US423.js → not-found-377JUHOW.js} +17 -16
  216. package/dist/not-found-377JUHOW.js.map +1 -0
  217. package/dist/providers/DocumentSyncRegistry.d.ts +3 -3
  218. package/dist/providers/DocumentSyncRegistry.d.ts.map +1 -1
  219. package/dist/providers/index.js +14 -13
  220. package/dist/providers/navigation-setups.d.ts +3 -3
  221. package/dist/providers/navigation-setups.d.ts.map +1 -1
  222. package/dist/routes/account/notifications/index.d.ts +2 -2
  223. package/dist/routes/account/notifications/index.d.ts.map +1 -1
  224. package/dist/routes/account/orders/index.d.ts +4 -4
  225. package/dist/routes/account/orders/index.d.ts.map +1 -1
  226. package/dist/routes/account/orders.js +5 -4
  227. package/dist/routes/account/profile/index.d.ts +2 -2
  228. package/dist/routes/account/profile/index.d.ts.map +1 -1
  229. package/dist/routes/account/settings/index.d.ts +2 -2
  230. package/dist/routes/account/settings/index.d.ts.map +1 -1
  231. package/dist/routes/account/wallet/index.d.ts +2 -2
  232. package/dist/routes/account/wallet/index.d.ts.map +1 -1
  233. package/dist/routes/account/wishlist/index.d.ts +2 -2
  234. package/dist/routes/account/wishlist/index.d.ts.map +1 -1
  235. package/dist/routes/account.js +20 -18
  236. package/dist/routes/account.js.map +1 -1
  237. package/dist/routes/blog/index.d.ts +10 -10
  238. package/dist/routes/blog/index.d.ts.map +1 -1
  239. package/dist/routes/blog.js +15 -13
  240. package/dist/routes/blog.js.map +1 -1
  241. package/dist/routes/brands/index.d.ts +2 -2
  242. package/dist/routes/brands/index.d.ts.map +1 -1
  243. package/dist/routes/brands.js +7 -5
  244. package/dist/routes/brands.js.map +1 -1
  245. package/dist/routes/cart.js +22 -21
  246. package/dist/routes/cart.js.map +1 -1
  247. package/dist/routes/home.js +19 -18
  248. package/dist/routes/index.js +3 -3
  249. package/dist/routes/lazy.d.ts +22 -22
  250. package/dist/routes/lazy.d.ts.map +1 -1
  251. package/dist/routes/loyalty/index.d.ts +4 -4
  252. package/dist/routes/loyalty/index.d.ts.map +1 -1
  253. package/dist/routes/loyalty.js +8 -8
  254. package/dist/routes/loyalty.js.map +1 -1
  255. package/dist/routes/page/index.d.ts +2 -2
  256. package/dist/routes/page/index.d.ts.map +1 -1
  257. package/dist/routes/page.js +7 -5
  258. package/dist/routes/page.js.map +1 -1
  259. package/dist/routes/product-listing.js +20 -19
  260. package/dist/routes/product-listing.js.map +1 -1
  261. package/dist/routes/product.js +18 -17
  262. package/dist/routes/product.js.map +1 -1
  263. package/dist/routes/root/beforeLoad.d.ts.map +1 -1
  264. package/dist/routes/seo-redirects.js +3 -3
  265. package/dist/routes/testimonials/index.d.ts +4 -4
  266. package/dist/routes/testimonials/index.d.ts.map +1 -1
  267. package/dist/routes/testimonials.js +5 -5
  268. package/dist/routes/testimonials.js.map +1 -1
  269. package/dist/routes/thank-you/index.d.ts +2 -2
  270. package/dist/routes/thank-you/index.d.ts.map +1 -1
  271. package/dist/routes/thank-you.js +6 -6
  272. package/dist/routes/thank-you.js.map +1 -1
  273. package/dist/skeleton.js +19 -18
  274. package/dist/{store-lookup-UDGPAAWQ.js → store-lookup-FNWIAJLT.js} +8 -8
  275. package/dist/{store-lookup-UDGPAAWQ.js.map → store-lookup-FNWIAJLT.js.map} +1 -1
  276. package/dist/tanstack/router.d.ts.map +1 -1
  277. package/dist/tanstack.js +12 -11
  278. package/dist/tanstack.js.map +1 -1
  279. package/dist/utils/index.js +2 -2
  280. package/dist/utils/lazy-component.d.ts +26 -0
  281. package/dist/utils/lazy-component.d.ts.map +1 -0
  282. package/package.json +1 -1
  283. package/tailwind/components/cart/lazy.ts.txt +6 -4
  284. package/tailwind/components/common/lazy.ts.txt +6 -6
  285. package/tailwind/components/home/lazy.ts.txt +2 -2
  286. package/tailwind/components/layout/MasterLayout.tsx.txt +5 -4
  287. package/tailwind/components/layout/lazy.ts.txt +11 -7
  288. package/tailwind/components/live-editor/index.tsx.txt +3 -2
  289. package/tailwind/components/modal/lazy.ts.txt +2 -2
  290. package/tailwind/components/navigation/lazy.ts.txt +5 -3
  291. package/tailwind/components/product/lazy.ts.txt +3 -3
  292. package/tailwind/components/store/lazy.ts.txt +3 -3
  293. package/tailwind/components/tracking/lazy.ts.txt +3 -3
  294. package/tailwind/routes/account/notifications/index.tsx.txt +3 -2
  295. package/tailwind/routes/account/orders/index.tsx.txt +6 -3
  296. package/tailwind/routes/account/profile/index.tsx.txt +3 -2
  297. package/tailwind/routes/account/settings/index.tsx.txt +3 -2
  298. package/tailwind/routes/account/wallet/index.tsx.txt +5 -2
  299. package/tailwind/routes/account/wishlist/index.tsx.txt +3 -2
  300. package/tailwind/routes/blog/index.tsx.txt +9 -6
  301. package/tailwind/routes/brands/index.tsx.txt +5 -2
  302. package/tailwind/routes/lazy.ts.txt +23 -23
  303. package/tailwind/routes/loyalty/index.tsx.txt +4 -3
  304. package/tailwind/routes/page/index.tsx.txt +5 -2
  305. package/tailwind/routes/root/beforeLoad.ts.txt +6 -0
  306. package/tailwind/routes/testimonials/index.tsx.txt +4 -3
  307. package/tailwind/routes/thank-you/index.tsx.txt +3 -2
  308. package/dist/AddToCartForm-RG4ANO47.js.map +0 -1
  309. package/dist/BlogAuthorPage-JEYNAFRH.js.map +0 -1
  310. package/dist/BlogCategoryPage-IIAXWMHD.js.map +0 -1
  311. package/dist/BlogPage-NKYICNRT.js.map +0 -1
  312. package/dist/BlogSinglePage-FBO4NQL5.js.map +0 -1
  313. package/dist/BlogTagPage-WZIUPBEM.js.map +0 -1
  314. package/dist/BrandsPage-EN6MZV6T.js.map +0 -1
  315. package/dist/Breadcrumb-COB4TMMI.js.map +0 -1
  316. package/dist/CartItem-SYQZHA2F.js.map +0 -1
  317. package/dist/CartSummary-YQN7N6JW.js.map +0 -1
  318. package/dist/Copyright-II2URAIP.js.map +0 -1
  319. package/dist/CustomerLayout-75NK34WK.js.map +0 -1
  320. package/dist/LoyaltyPage-R4KWVGLW.js.map +0 -1
  321. package/dist/LoyaltyPointsPage-L7HG54RQ.js.map +0 -1
  322. package/dist/MainMenu-KI4BAA7W.js.map +0 -1
  323. package/dist/MobileMenu-LJXKYKRI.js.map +0 -1
  324. package/dist/NotificationsPage-4TUPN24E.js.map +0 -1
  325. package/dist/OrderSinglePage-N3YGXCKL.js.map +0 -1
  326. package/dist/OrdersPage-V3WNW2WZ.js.map +0 -1
  327. package/dist/PageSingle-H5YA47EG.js.map +0 -1
  328. package/dist/ProductDetails-EHRMQR7F.js.map +0 -1
  329. package/dist/ProfilePage-3GRY4RSA.js.map +0 -1
  330. package/dist/ReviewsPage-SPHK5MCS.js.map +0 -1
  331. package/dist/SeoCartWidget-P2QQ62AF.js.map +0 -1
  332. package/dist/SettingsPage-YFN32XOV.js.map +0 -1
  333. package/dist/TestimonialsPage-4W6SXN24.js.map +0 -1
  334. package/dist/ThankYouPage-56AIK3QG.js.map +0 -1
  335. package/dist/WalletPage-FLB4OCK4.js.map +0 -1
  336. package/dist/WishlistPage-H6KGJYRT.js.map +0 -1
  337. package/dist/chunk-7V5HOZW4.js +0 -10
  338. package/dist/chunk-7V5HOZW4.js.map +0 -1
  339. package/dist/chunk-BXQZXOFK.js.map +0 -1
  340. package/dist/chunk-DIA2LU6I.js.map +0 -1
  341. package/dist/chunk-F73QPQX7.js.map +0 -1
  342. package/dist/chunk-IZ4MRCNY.js +0 -14
  343. package/dist/chunk-IZ4MRCNY.js.map +0 -1
  344. package/dist/chunk-JLJKIXDT.js.map +0 -1
  345. package/dist/chunk-MMXLOECO.js.map +0 -1
  346. package/dist/chunk-SDJVSRTL.js +0 -21
  347. package/dist/chunk-SDJVSRTL.js.map +0 -1
  348. package/dist/chunk-TUIB74QX.js.map +0 -1
  349. package/dist/chunk-V4E6JFS4.js.map +0 -1
  350. package/dist/not-found-3M6US423.js.map +0 -1
@@ -1,105 +1,105 @@
1
- import { lazy } from 'react';
1
+ import { lazyComponent } from '../utils/lazy-component';
2
2
 
3
3
  // Home
4
- export const LazyHomePage = lazy(() =>
4
+ export const LazyHomePage = lazyComponent(() =>
5
5
  import('./home/HomePage').then((m) => ({ default: m.HomePage }))
6
6
  );
7
7
 
8
8
  // Cart
9
- export const LazyCartPage = lazy(() =>
9
+ export const LazyCartPage = lazyComponent(() =>
10
10
  import('./cart/CartPage').then((m) => ({ default: m.CartPage }))
11
11
  );
12
12
 
13
13
  // Product
14
- export const LazyProductPage = lazy(() =>
14
+ export const LazyProductPage = lazyComponent(() =>
15
15
  import('./product/ProductPage').then((m) => ({ default: m.ProductPage }))
16
16
  );
17
17
 
18
18
  // Product Listing (unified for all product list pages: category, search, tag, latest, most-sales, offers)
19
- export const LazyProductListingPage = lazy(() =>
19
+ export const LazyProductListingPage = lazyComponent(() =>
20
20
  import('./product-listing/ProductListPage').then((m) => ({ default: m.ProductListPage }))
21
21
  );
22
22
 
23
23
  // Blog
24
- export const LazyBlogPage = lazy(() =>
24
+ export const LazyBlogPage = lazyComponent(() =>
25
25
  import('./blog/BlogPage').then((m) => ({ default: m.BlogPage }))
26
26
  );
27
27
 
28
- export const LazyBlogSinglePage = lazy(() =>
28
+ export const LazyBlogSinglePage = lazyComponent(() =>
29
29
  import('./blog/BlogSinglePage').then((m) => ({ default: m.BlogSinglePage }))
30
30
  );
31
31
 
32
- export const LazyBlogAuthorPage = lazy(() =>
32
+ export const LazyBlogAuthorPage = lazyComponent(() =>
33
33
  import('./blog/BlogAuthorPage').then((m) => ({ default: m.BlogAuthorPage }))
34
34
  );
35
35
 
36
- export const LazyBlogCategoryPage = lazy(() =>
36
+ export const LazyBlogCategoryPage = lazyComponent(() =>
37
37
  import('./blog/BlogCategoryPage').then((m) => ({ default: m.BlogCategoryPage }))
38
38
  );
39
39
 
40
- export const LazyBlogTagPage = lazy(() =>
40
+ export const LazyBlogTagPage = lazyComponent(() =>
41
41
  import('./blog/BlogTagPage').then((m) => ({ default: m.BlogTagPage }))
42
42
  );
43
43
 
44
44
  // Brands
45
- export const LazyBrandsPage = lazy(() =>
45
+ export const LazyBrandsPage = lazyComponent(() =>
46
46
  import('./brands/BrandsPage').then((m) => ({ default: m.BrandsPage }))
47
47
  );
48
48
 
49
49
  // BrandSingle uses ProductListing module via tanstack.adapter.ts - no lazy export needed
50
50
 
51
51
  // Customer
52
- export const LazyProfilePage = lazy(() =>
52
+ export const LazyProfilePage = lazyComponent(() =>
53
53
  import('./account/profile/ProfilePage').then((m) => ({ default: m.ProfilePage }))
54
54
  );
55
55
 
56
- export const LazyWishlistPage = lazy(() =>
56
+ export const LazyWishlistPage = lazyComponent(() =>
57
57
  import('./account/wishlist/WishlistPage').then((m) => ({ default: m.WishlistPage }))
58
58
  );
59
59
 
60
- export const LazyWalletPage = lazy(() =>
60
+ export const LazyWalletPage = lazyComponent(() =>
61
61
  import('./account/wallet/WalletPage').then((m) => ({ default: m.WalletPage }))
62
62
  );
63
63
 
64
- export const LazyNotificationsPage = lazy(() =>
64
+ export const LazyNotificationsPage = lazyComponent(() =>
65
65
  import('./account/notifications/NotificationsPage').then((m) => ({
66
66
  default: m.NotificationsPage,
67
67
  }))
68
68
  );
69
69
 
70
- export const LazySettingsPage = lazy(() =>
70
+ export const LazySettingsPage = lazyComponent(() =>
71
71
  import('./account/settings/SettingsPage').then((m) => ({ default: m.SettingsPage }))
72
72
  );
73
73
 
74
- export const LazyOrdersPage = lazy(() =>
74
+ export const LazyOrdersPage = lazyComponent(() =>
75
75
  import('./account/orders/OrdersPage').then((m) => ({ default: m.OrdersPage }))
76
76
  );
77
77
 
78
- export const LazyOrderSinglePage = lazy(() =>
78
+ export const LazyOrderSinglePage = lazyComponent(() =>
79
79
  import('./account/orders/OrderSinglePage').then((m) => ({ default: m.OrderSinglePage }))
80
80
  );
81
81
 
82
82
  // Loyalty
83
- export const LazyLoyaltyPage = lazy(() =>
83
+ export const LazyLoyaltyPage = lazyComponent(() =>
84
84
  import('./loyalty/LoyaltyPage').then((m) => ({ default: m.LoyaltyPage }))
85
85
  );
86
86
 
87
87
  // Page (static)
88
- export const LazyPageSingle = lazy(() =>
88
+ export const LazyPageSingle = lazyComponent(() =>
89
89
  import('./page/PageSingle').then((m) => ({ default: m.PageSingle }))
90
90
  );
91
91
 
92
92
  // Testimonials
93
- export const LazyTestimonialsPage = lazy(() =>
93
+ export const LazyTestimonialsPage = lazyComponent(() =>
94
94
  import('./testimonials/TestimonialsPage').then((m) => ({ default: m.TestimonialsPage }))
95
95
  );
96
96
 
97
97
  // Thank You
98
- export const LazyThankYouPage = lazy(() =>
98
+ export const LazyThankYouPage = lazyComponent(() =>
99
99
  import('./thank-you/ThankYouPage').then((m) => ({ default: m.ThankYouPage }))
100
100
  );
101
101
 
102
102
  // Not Found
103
- export const LazyNotFoundPage = lazy(() =>
103
+ export const LazyNotFoundPage = lazyComponent(() =>
104
104
  import('./not-found').then((m) => ({ default: m.NotFoundPage }))
105
105
  );
@@ -1,17 +1,17 @@
1
1
  import type { HeadDescriptor } from '../../utils/head';
2
2
  import { buildHreflangAlternates } from '../../utils/baseHead';
3
- import { lazy } from 'react';
3
+
4
4
  import { loyaltyLoader, loyaltyPointsLoader } from './loader';
5
5
  import type { LoyaltyPageProps, LoyaltyPointsPageProps } from './types';
6
6
  import type { TwilightContext } from '../../twilight/context';
7
7
  import { RouteId } from '../../router/route-ids';
8
8
 
9
9
  // Lazy-load component for code-splitting
10
- const LazyLoyaltyPage = lazy(() =>
10
+ const LazyLoyaltyPage = lazyComponent(() =>
11
11
  import('./LoyaltyPage').then((m) => ({ default: m.LoyaltyPage }))
12
12
  );
13
13
 
14
- const LazyLoyaltyPointsPage = lazy(() =>
14
+ const LazyLoyaltyPointsPage = lazyComponent(() =>
15
15
  import('./LoyaltyPointsPage').then((m) => ({ default: m.LoyaltyPointsPage }))
16
16
  );
17
17
 
@@ -25,6 +25,7 @@ export type {
25
25
  LoyaltyPrize,
26
26
  LoyaltyPrizeItem,
27
27
  } from './types';
28
+ import { lazyComponent } from '../../utils/lazy-component';
28
29
 
29
30
  async function loader(
30
31
  ctx?: { locale?: string },
@@ -1,14 +1,17 @@
1
1
  import type { HeadDescriptor } from '../../utils/head';
2
2
  import { buildHreflangAlternates } from '../../utils/baseHead';
3
- import { lazy } from 'react';
3
+
4
4
  import { pageSingleLoader } from './loader';
5
5
  import type { PageSingleProps } from './types';
6
6
  import type { IdParams } from '../types';
7
7
  import type { TwilightContext } from '../../twilight/context';
8
8
  import { RouteId } from '../../router/route-ids';
9
+ import { lazyComponent } from '../../utils/lazy-component';
9
10
 
10
11
  // Lazy-load component for code-splitting
11
- const LazyPageSingle = lazy(() => import('./PageSingle').then((m) => ({ default: m.PageSingle })));
12
+ const LazyPageSingle = lazyComponent(() =>
13
+ import('./PageSingle').then((m) => ({ default: m.PageSingle }))
14
+ );
12
15
 
13
16
  export const PageSingleLazy = LazyPageSingle;
14
17
  export { pageSingleLoader } from './loader';
@@ -39,6 +39,7 @@ import {
39
39
  import { persistLanguageCookie, readCookieHeader } from '../../utils/language-cookie';
40
40
  import { decideSharedHostLanguage } from '../../utils/shared-host-language';
41
41
  import { prefixStoreBase } from '../../utils/store-base';
42
+ import { preloadServerComponents } from '../../utils/lazy-component';
42
43
  import {
43
44
  ownerCookieMatches,
44
45
  ownerLinkMatches,
@@ -342,6 +343,10 @@ export async function rootBeforeLoad(ctx: {
342
343
  // client. No-op on the server and while the SDK storage API is still hydrating.
343
344
  syncScopeCookie();
344
345
 
346
+ // On the server, the lazy components load beside the requests below, so none suspends in
347
+ // the render: a fresh isolate otherwise streamed every block after the shell.
348
+ const componentsLoaded = preloadServerComponents();
349
+
345
350
  // Kept until the rest have settled, as a missing answer always was, then thrown:
346
351
  // it says why the store did not load.
347
352
  let settingsFailure: unknown;
@@ -380,6 +385,7 @@ export async function rootBeforeLoad(ctx: {
380
385
  ]
381
386
  );
382
387
 
388
+ await componentsLoaded;
383
389
  if (!settingsResult) throw settingsFailureToThrow(settingsFailure);
384
390
 
385
391
  // Settings answered for another market name another theme version; the SDK only
@@ -1,17 +1,18 @@
1
1
  import type { HeadDescriptor } from '../../utils/head';
2
2
  import { buildHreflangAlternates } from '../../utils/baseHead';
3
- import { lazy } from 'react';
3
+
4
4
  import { reviewsLoader, testimonialsLoader } from './loader';
5
5
  import type { ReviewsPageProps, TestimonialsPageProps } from './types';
6
6
  import type { TwilightContext } from '../../twilight/context';
7
7
  import { RouteId } from '../../router/route-ids';
8
+ import { lazyComponent } from '../../utils/lazy-component';
8
9
 
9
10
  // Lazy-load component for code-splitting
10
- const LazyTestimonialsPage = lazy(() =>
11
+ const LazyTestimonialsPage = lazyComponent(() =>
11
12
  import('./TestimonialsPage').then((m) => ({ default: m.TestimonialsPage }))
12
13
  );
13
14
 
14
- const LazyReviewsPage = lazy(() =>
15
+ const LazyReviewsPage = lazyComponent(() =>
15
16
  import('./ReviewsPage').then((m) => ({ default: m.ReviewsPage }))
16
17
  );
17
18
 
@@ -1,13 +1,14 @@
1
1
  import type { HeadDescriptor } from '../../utils/head';
2
2
  import { buildHreflangAlternates } from '../../utils/baseHead';
3
- import { lazy } from 'react';
3
+
4
4
  import { thankYouLoader } from './loader';
5
5
  import type { ThankYouPageProps, ThankYouLoaderParams } from './types';
6
6
  import type { TwilightContext } from '../../twilight/context';
7
7
  import { RouteId } from '../../router/route-ids';
8
+ import { lazyComponent } from '../../utils/lazy-component';
8
9
 
9
10
  // Lazy-load component for code-splitting
10
- const LazyThankYouPage = lazy(() =>
11
+ const LazyThankYouPage = lazyComponent(() =>
11
12
  import('./ThankYouPage').then((m) => ({ default: m.ThankYouPage }))
12
13
  );
13
14
 
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/product/AddToCartForm.tsx"],"names":["SallaProductOptions"],"mappings":"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","file":"AddToCartForm-RG4ANO47.js","sourcesContent":["import { SallaAddProductButton } from '@salla.sa/twilight-components-react/add-product-button';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { SallaCountDown } from '@salla.sa/twilight-components-react/count-down';\nimport { SallaFileUpload } from '@salla.sa/twilight-components-react/file-upload';\nimport { SallaGifting } from '@salla.sa/twilight-components-react/gifting';\nimport { SallaMultipleBundleProduct } from '@salla.sa/twilight-components-react/multiple-bundle-product';\n// Use the eager (non-deferred) Core export: product options are an essential form\n// control, and the deferred wrapper's visibility-triggered hydration races with the\n// gallery's image layout shift and gets stuck on the skeleton, so options never appear.\nimport { SallaProductOptionsCore as SallaProductOptions } from '@salla.sa/twilight-components-react/product-options';\nimport { SallaProductSizeGuide } from '@salla.sa/twilight-components-react/product-size-guide';\nimport { SallaQuantityInput } from '@salla.sa/twilight-components-react/quantity-input';\nimport { useHostAttributes } from '@salla.sa/twilight-theme-engine/hooks/useHostAttributes';\nimport { useTranslation } from '@salla.sa/twilight-theme-engine/i18n';\nimport { getActiveCurrency } from '@salla.sa/twilight-theme-engine/api/client';\nimport type { ReactNode } from 'react';\nimport { useCallback, useEffect, useState } from 'react';\nimport type { Product } from '../../types';\nimport { CurrencySymbol } from '../common';\n\ninterface AddToCartFormProps {\n product: Product;\n stickyAddToCart?: boolean;\n giftingIntro?: string;\n formStartSlot?: ReactNode;\n formEndSlot?: ReactNode;\n}\n\nconst handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n // Native event, like Twig's onsubmit: the SDK spins its submitter's salla-button until the add settles.\n window.salla?.form.onSubmit('cart.addItem', e.nativeEvent);\n};\n\nconst handleChange = (e: React.FormEvent<HTMLFormElement>) => {\n const form = e.currentTarget;\n // Not reportValidity(): it focuses and scrolls to the first empty required option mid-edit.\n const isComplete = Array.from(form.elements).every(\n (el) => !(el as HTMLInputElement).willValidate || (el as HTMLInputElement).validity.valid\n );\n if (isComplete) {\n window.salla?.product?.getPrice(new FormData(form));\n }\n};\n\nexport function AddToCartForm({\n product,\n stickyAddToCart,\n giftingIntro,\n formStartSlot,\n formEndSlot,\n}: AddToCartFormProps) {\n const { t } = useTranslation();\n // The API converts the amounts but still labels them in the store's own currency.\n const priceCurrency = getActiveCurrency(product.currency);\n const [activeCollapse, setActiveCollapse] = useState<string | null>(null);\n\n // stable ref: an inline arrow re-runs on every render and resets the user's selection\n const optionsRef = useCallback(\n (el: { setOptionsData?: (data: never[]) => void } | null) =>\n void el?.setOptionsData?.(product.options as never[]),\n [product.options]\n );\n\n // salla-product-options reads its `options` prop only in its constructor (no\n // @Watch), and on first load that constructor runs before sdk.init has set\n // page.id — so its getDetails(page.id) fallback fetches nothing and the options\n // never reflect. Seed page.id (=== product.id) and wait for the SDK to be ready\n // before mounting the element so its fallback resolves on first load too.\n const [optionsReady, setOptionsReady] = useState(false);\n useEffect(() => {\n const salla = window.salla;\n if (!salla) return;\n let alive = true;\n salla.config?.set?.('page.id', product.id);\n Promise.resolve(salla.onReady?.()).finally(() => {\n if (alive) setOptionsReady(true);\n });\n return () => {\n alive = false;\n };\n }, [product.id]);\n\n const handleCollapseToggle = useCallback((id: string) => {\n setActiveCollapse((current) => (current === id ? null : id));\n }, []);\n\n const hasPreorder = product.has_preorder_campaign && product.preorder;\n const hasWeightOrSizeGuide = product.weight || product.has_size_guide;\n const hasAttachments = product.can_add_note || product.can_upload_file;\n const amount =\n typeof product.base_currency_price === 'object'\n ? product.base_currency_price.amount\n : product.base_currency_price;\n\n const quantityRef = useHostAttributes({\n max: product.max_quantity,\n value: 1,\n name: 'quantity',\n });\n const addButtonRef = useHostAttributes({\n amount,\n 'loader-position': 'end',\n type: 'submit',\n width: 'wide',\n 'required-shipping': product.is_require_shipping,\n 'is-subscribed': product.notify_availability?.subscribed,\n });\n\n return (\n <form\n className=\"form product-form\"\n encType=\"multipart/form-data\"\n method=\"post\"\n onSubmit={handleSubmit}\n onChange={handleChange}\n >\n <input type=\"hidden\" name=\"id\" value={product.id} />\n\n {formStartSlot}\n\n {optionsReady && product.options && product.options.length > 0 && (\n <SallaProductOptions\n key={product.id}\n // constructor-only options parse: push data via ref on client remount\n ref={optionsRef}\n options={JSON.stringify(product.options)}\n productId={product.id}\n />\n )}\n\n {product.has_bundle_products && (\n <SallaMultipleBundleProduct bundleSections={JSON.stringify(product)} />\n )}\n\n {hasWeightOrSizeGuide && (\n <section className=\"bg-white p-5 rounded-md mb-5\">\n {product.weight && (\n <div\n className={`center-between ${product.has_size_guide ? 'pb-5 mb-5 border-b-[1px]' : ''}`}\n >\n <b className=\"form-label rtl:space-x-reverse space-x-1\">\n <i className=\"sicon-luggage-cart\"></i>\n <span>{t('pages.products.weight', 'Weight')}</span>\n </b>\n <span className=\"product-weight text-sm\">{product.weight}</span>\n </div>\n )}\n {product.has_size_guide && (\n <>\n <div className=\"center-between\">\n <b className=\"form-label rtl:space-x-reverse space-x-1\">\n <i className=\"sicon-pencil-ruler\"></i>\n <span>{t('pages.products.size_guides', 'Size Guides')}</span>\n </b>\n <SallaButton\n shape=\"link\"\n color=\"primary\"\n className=\"!p-0 text-sm with-arrow\"\n onClick={() =>\n window.salla?.event?.dispatch('size-guide::open', String(product.id))\n }\n >\n {t('pages.products.show_size_guides', 'Show Size Guides')}\n <i className=\"sicon-keyboard_arrow_left\"></i>\n </SallaButton>\n </div>\n <SallaProductSizeGuide />\n </>\n )}\n </section>\n )}\n\n {hasAttachments && (\n <section className=\"bg-white p-5 rounded-md mb-5\">\n <div className=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start\">\n <div className=\"form-label\">\n <b className=\"block\">{t('pages.products.attachments', 'Attachments')}</b>\n </div>\n <div className=\"mt-1 sm:mt-0 sm:col-span-2 text-end\">\n <div className=\"flex rtl:space-x-reverse space-x-3\">\n {product.can_add_note && (\n <button\n type=\"button\"\n onClick={() => handleCollapseToggle(`note_${product.id}`)}\n className={`btn-tab btn--collapse ${activeCollapse === `note_${product.id}` ? 'is-opened' : 'is-closed'}`}\n >\n <i className=\"font-medium sicon-chat-conversation-alt rtl:ml-1.5 ltr:mr-1.5\"></i>\n <span className=\"fix-align\">{t('pages.products.add_note', 'Add Note')}</span>\n </button>\n )}\n {product.can_upload_file && (\n <button\n type=\"button\"\n onClick={() => handleCollapseToggle(`file_${product.id}`)}\n className={`btn-tab btn--collapse ${activeCollapse === `file_${product.id}` ? 'is-opened' : 'is-closed'}`}\n >\n <i className=\"font-medium sicon-paperclip rtl:ml-1.5 ltr:mr-1.5\"></i>\n <span className=\"fix-align\">{t('pages.products.add_file', 'Add File')}</span>\n </button>\n )}\n </div>\n\n {product.can_add_note && (\n <div\n className={`collapse-content ${activeCollapse === `note_${product.id}` ? 'is-opened' : 'is-closed'}`}\n >\n <div className=\"pt-4\">\n <textarea\n className=\"animated animatedfadeInDown fadeInDown form-input h-16 bg-gray-50 block\"\n placeholder={t('pages.products.notes_placeholder', 'Add your notes here...')}\n name=\"notes\"\n cols={30}\n rows={10}\n defaultValue={product.notes}\n ></textarea>\n </div>\n </div>\n )}\n\n {product.can_upload_file && (\n <div\n className={`collapse-content ${activeCollapse === `file_${product.id}` ? 'is-opened' : 'is-closed'}`}\n >\n <div className=\"pt-4 px-1\">\n <SallaFileUpload\n accept=\"image/png, image/jpeg, image/jpg, image/gif, video/*, application/pdf\"\n className=\"product-option-uploader\"\n >\n <div className=\"product-option-uploader-placholder\">\n <span className=\"product-option-uploader-placholder-icon\">\n <i className=\"sicon-camera\"></i>\n </span>\n <p className=\"profile-filepond-placholder-text\">\n {t('common.uploader.drag_and_drop', 'Drag and drop files here')}\n </p>\n <span className=\"filepond--label-action\">\n {t('common.uploader.browse', 'Browse')}\n </span>\n </div>\n </SallaFileUpload>\n </div>\n </div>\n )}\n </div>\n </div>\n </section>\n )}\n\n {formEndSlot}\n\n <section className=\"flex bg-white p-5 sm:pb-0 rounded-md rounded-b-none\">\n <div className=\"center-between w-full\">\n <div className=\"form-label\">\n <b className=\"block\">{t('pages.products.price', 'Price')}</b>\n </div>\n\n <div\n className={`flex whitespace-nowrap price-wrapper gap-4 items-center ${product.is_out_of_stock ? 'hidden' : ''}`}\n >\n <div\n className={`price_is_on_sale space-x-2 rtl:space-x-reverse whitespace-nowrap ${product.is_on_sale ? '' : 'hidden'}`}\n >\n <span className=\"total-price text-red-800 font-bold text-xl inline-block\">\n {product.sale_price} <CurrencySymbol currency={priceCurrency} />\n </span>\n <span className=\"before-price text-gray-500 line-through\">\n {product.regular_price} <CurrencySymbol currency={priceCurrency} />\n </span>\n </div>\n <div\n className={`starting-or-normal-price gap-4 ${product.is_on_sale ? 'hidden' : 'flex'}`}\n >\n {product.starting_price && (\n <span className=\"starting-price-title\">\n {t('pages.products.starting_price', 'Starting from')}\n </span>\n )}\n <span className=\"total-price font-bold text-xl inline-block\">\n {String(product.starting_price ?? product.price)}{' '}\n <CurrencySymbol currency={priceCurrency} />\n </span>\n </div>\n </div>\n\n <div\n className={`out-of-stock min-h-7 leading-7 text-base text-red-600 !opacity-50 font-bold ${product.is_out_of_stock ? 'scale-pulse' : 'hidden'}`}\n >\n {t('pages.products.out_of_stock', 'Out of Stock')}\n </div>\n </div>\n </section>\n\n {hasPreorder ? (\n <section className=\"mt-5 p-5\">\n <SallaCountDown preOrder={JSON.stringify(product.preorder)} boxed labeled />\n </section>\n ) : null}\n\n <section className=\"sticky-product-bar bg-white p-5 rounded-md rounded-b-none\">\n {product.is_hidden_quantity || product.type === 'booking' ? (\n <input\n type=\"hidden\"\n value=\"1\"\n name=\"quantity\"\n aria-label={t('pages.products.quantity', 'Quantity')}\n />\n ) : (\n <div className=\"sticky-product-bar__quantity center-between mb-5\">\n <span className=\"form-label font-bold\">{t('pages.products.quantity', 'Quantity')}</span>\n <SallaQuantityInput\n ref={quantityRef}\n max={product.max_quantity ?? undefined}\n value={1}\n name=\"quantity\"\n aria-label={t('pages.products.quantity', 'Quantity')}\n className=\"border-gray-200 flex justify-end\"\n />\n </div>\n )}\n\n <SallaAddProductButton\n ref={addButtonRef}\n {...(product.can_quick_buy ? { quickBuy: true } : {})}\n {...(stickyAddToCart ? { supportStickyBar: true } : {})}\n {...(product.is_require_shipping ? { requiredShipping: true } : {})}\n {...(hasPreorder ? { hasPreOrder: true } : {})}\n amount={amount}\n className=\"mt-5 w-full sticky-product-bar__btn\"\n productStatus={product.status}\n productType={product.type}\n productId={product.id}\n type=\"submit\"\n width=\"wide\"\n {...(product.notify_availability\n ? {\n ...(product.notify_availability.subscribed ? { isSubscribed: true } : {}),\n channels: product.notify_availability.channels.join(','),\n ...(product.notify_availability.subscribed_options\n ? {\n subscribedOptions: JSON.stringify(\n product.notify_availability.subscribed_options\n ),\n }\n : {}),\n ...(product.notify_availability.options ? { notifyOptionsAvailability: true } : {}),\n }\n : {})}\n >\n {product.add_to_cart_label}\n </SallaAddProductButton>\n </section>\n\n {product.giftable && (\n <SallaGifting\n className=\"mt-5\"\n widgetSubtitle={giftingIntro}\n productId={Number(product.id)}\n {...(product.is_require_shipping ? { physicalProducts: true } : {})}\n />\n )}\n </form>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/blog/BlogAuthorPage.tsx"],"names":[],"mappings":"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","file":"BlogAuthorPage-JEYNAFRH.js","sourcesContent":["import { useRef, useCallback } from 'react';\nimport { ItemsList } from '@salla.sa/twilight-components-react';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useLocation } from '../../providers/NavigationProvider';\nimport { Breadcrumb, NoContent } from '../../components/common';\nimport { blog } from '../../api/blog';\nimport { BlogArticleCard, BlogListLayout } from './components';\nimport type { BlogAuthorLoaderData, ArticleSummary } from './types';\n\nconst EMPTY_CATEGORIES: BlogAuthorLoaderData['categories'] = [];\nconst EMPTY_ARTICLES: ArticleSummary[] = [];\n\nexport function BlogAuthorPage({\n page,\n author,\n categories = EMPTY_CATEGORIES,\n articles = EMPTY_ARTICLES,\n cursor,\n}: BlogAuthorLoaderData) {\n const { t } = useTranslation();\n const { pathname, searchStr } = useLocation();\n const nextCursorRef = useRef<string | null>(cursor?.next ?? null);\n\n const loader = useCallback(async () => {\n const nextUrl = nextCursorRef.current;\n const cursorMatch = nextUrl?.match(/[?&]cursor=([^&]+)/);\n const cursorValue = cursorMatch ? decodeURIComponent(cursorMatch[1]) : (nextUrl ?? undefined);\n\n const result = await blog.articles.list({ author: String(page.id), cursor: cursorValue });\n nextCursorRef.current = result.cursor?.next ?? null;\n\n return {\n items: result.data,\n next: result.cursor?.next ?? null,\n };\n }, [page.id]);\n\n if (articles.length === 0) {\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n <BlogListLayout categories={categories}>\n <HookSlot name=\"blog:author.start\" />\n <NoContent icon=\"sicon-inbox\" message={t('pages.blog_categories.no_articles')} />\n <HookSlot name=\"blog:author.end\" />\n </BlogListLayout>\n </div>\n );\n }\n\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n\n <BlogListLayout categories={categories}>\n <HookSlot name=\"blog:author.start\" />\n\n <div className=\"mb-6\">\n <h1 className=\"font-bold text-xl\">{author.name}</h1>\n </div>\n\n <ItemsList<ArticleSummary>\n items={articles}\n loader={cursor?.next ? loader : undefined}\n mode={cursor?.next ? 'infinite' : 'static'}\n pageUrl={pathname + searchStr}\n className=\"s-blog-list\"\n itemsClassName=\"grid md:grid-cols-2 gap-2.5 md:gap-8\"\n empty={<NoContent icon=\"sicon-inbox\" message={t('pages.blog_categories.no_articles')} />}\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) =>\n items.map((article) => <BlogArticleCard key={article.id} article={article} />)\n }\n </ItemsList>\n\n <HookSlot name=\"blog:author.end\" />\n </BlogListLayout>\n </div>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/blog/BlogCategoryPage.tsx"],"names":[],"mappings":"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","file":"BlogCategoryPage-IIAXWMHD.js","sourcesContent":["import { useRef, useCallback } from 'react';\nimport { ItemsList } from '@salla.sa/twilight-components-react';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useLocation } from '../../providers/NavigationProvider';\nimport { Breadcrumb, NoContent } from '../../components/common';\nimport { blog } from '../../api/blog';\nimport { BlogArticleCard, BlogListLayout } from './components';\nimport type { BlogCategoryLoaderData, ArticleSummary } from './types';\n\nconst EMPTY_CATEGORIES: BlogCategoryLoaderData['categories'] = [];\nconst EMPTY_ARTICLES: ArticleSummary[] = [];\n\nexport function BlogCategoryPage({\n page,\n blogCategory,\n categories = EMPTY_CATEGORIES,\n articles = EMPTY_ARTICLES,\n cursor,\n}: BlogCategoryLoaderData) {\n const { t } = useTranslation();\n const { pathname, searchStr } = useLocation();\n const nextCursorRef = useRef<string | null>(cursor?.next ?? null);\n\n const loader = useCallback(async () => {\n const nextUrl = nextCursorRef.current;\n const cursorMatch = nextUrl?.match(/[?&]cursor=([^&]+)/);\n const cursorValue = cursorMatch ? decodeURIComponent(cursorMatch[1]) : (nextUrl ?? undefined);\n\n const result = await blog.articles.list({ category: blogCategory.id, cursor: cursorValue });\n nextCursorRef.current = result.cursor?.next ?? null;\n\n return {\n items: result.data,\n next: result.cursor?.next ?? null,\n };\n }, [blogCategory.id]);\n\n if (articles.length === 0) {\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n <BlogListLayout categories={categories}>\n <HookSlot name=\"blog:category.start\" />\n <NoContent icon=\"sicon-inbox\" message={t('pages.blog_categories.no_articles')} />\n <HookSlot name=\"blog:category.end\" />\n </BlogListLayout>\n </div>\n );\n }\n\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n\n <BlogListLayout categories={categories}>\n <HookSlot name=\"blog:category.start\" />\n\n <div className=\"mb-6\">\n <h1 className=\"font-bold text-xl\">{blogCategory.name}</h1>\n </div>\n\n <ItemsList<ArticleSummary>\n items={articles}\n loader={cursor?.next ? loader : undefined}\n mode={cursor?.next ? 'infinite' : 'static'}\n pageUrl={pathname + searchStr}\n className=\"s-blog-list\"\n itemsClassName=\"grid md:grid-cols-2 gap-2.5 md:gap-8\"\n empty={<NoContent icon=\"sicon-inbox\" message={t('pages.blog_categories.no_articles')} />}\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) =>\n items.map((article) => (\n <BlogArticleCard key={article.id} article={article} showAuthor />\n ))\n }\n </ItemsList>\n\n <HookSlot name=\"blog:category.end\" />\n </BlogListLayout>\n </div>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/blog/BlogTags.tsx","../src/routes/blog/BlogPage.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"BlogPage-NKYICNRT.js","sourcesContent":["import { useState } from 'react';\nimport { Link } from '../../components/common';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport type { BlogTag } from './types';\n\n/** Tags shown on a blog card before the rest fold behind a \"+N\" toggle. */\nexport const BLOG_CARD_VISIBLE_TAGS = 3;\n\ninterface BlogTagsProps {\n tags: BlogTag[];\n /** How many tags to show before folding the rest. */\n visible?: number;\n}\n\n/**\n * The tag row of a blog card. Articles can carry dozens of tags, which used to wrap into\n * a wall of links and stretch the card; show the first few as compact chips and fold the\n * rest behind a \"+N\" toggle that expands them in place (and \"Show less\" to fold back).\n * Nothing folds when the tags fit.\n */\nexport function BlogTags({ tags, visible = BLOG_CARD_VISIBLE_TAGS }: BlogTagsProps) {\n const { t } = useTranslation();\n const [expanded, setExpanded] = useState(false);\n\n if (tags.length === 0) return null;\n\n const hiddenCount = Math.max(0, tags.length - visible);\n const shown = expanded ? tags : tags.slice(0, visible);\n\n return (\n <div className=\"s-blog-tags p-4 flex flex-wrap items-center gap-2 border-t border-gray-200\">\n {shown.map((tag) => (\n <Link\n key={tag.id}\n to={tag.url}\n className=\"s-blog-tags-item py-1 px-3 rounded-full border border-gray-200 inline-flex items-center max-w-full text-gray-500 hover:text-dark hover:border-gray-300 text-xs\"\n >\n <i className=\"font-medium sicon-tag rtl:ml-1.5 ltr:mr-1.5\"></i>\n <span className=\"fix-align truncate\">{tag.name}</span>\n </Link>\n ))}\n {hiddenCount > 0 && (\n <button\n type=\"button\"\n className=\"s-blog-tags-more py-1 px-3 rounded-full text-xs font-medium text-primary hover:opacity-80\"\n aria-expanded={expanded}\n onClick={() => setExpanded((open) => !open)}\n >\n {expanded ? t('common.elements.show_less', 'Show less') : `+${hiddenCount}`}\n </button>\n )}\n </div>\n );\n}\n","import { SallaSlider } from '@salla.sa/twilight-components-react/slider';\nimport { HookSlot, useDate } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport type { BlogPageProps, ArticleSummary } from './types';\nimport { Breadcrumb, NoContent, Link, Image } from '../../components/common';\nimport { BlogTags } from './BlogTags';\n\nconst EMPTY_CATEGORIES: NonNullable<BlogPageProps['categories']> = [];\nconst EMPTY_ARTICLES: ArticleSummary[] = [];\nconst EMPTY_SLIDES: NonNullable<BlogPageProps['slides']> = [];\n\nexport function BlogPage({\n page,\n categories = EMPTY_CATEGORIES,\n articles = EMPTY_ARTICLES,\n slides = EMPTY_SLIDES,\n}: BlogPageProps) {\n const { t } = useTranslation();\n const { format: formatDate } = useDate();\n\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <div className=\"center-between\">\n <Breadcrumb page={page} />\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-8 gap-8\">\n <nav aria-label=\"Sidebar\" className=\"hidden lg:block lg:sticky shrink-0 top-24 col-span-2\">\n <h2 className=\"font-bold mb-3\">{t('pages.blog_categories.categories')}</h2>\n <ul>\n {categories.map((category) => (\n <li key={category.id} className={category.is_current ? 'text-primary' : ''}>\n <Link className=\"py-3 block text-sm hover:text-primary\" to={category.url}>\n {category.name}\n </Link>\n </li>\n ))}\n </ul>\n </nav>\n\n <div className=\"main-content lg:col-span-6\">\n <HookSlot name=\"blog:start\" />\n\n {slides.length > 0 && (\n <SallaSlider\n id=\"blog-home-slider\"\n type=\"blog\"\n autoPlay\n autoHeight\n showControls={false}\n pagination\n className=\"blog-slider block rounded overflow-hidden mb-2.5 lg:mb-8\"\n sliderConfig={{ watchOverflow: true }}\n >\n <div slot=\"items\">\n {slides.map((article, index) => (\n <div\n key={article.id}\n className=\"swiper-slide has-overlay blog-slider__slide h-[300px] md:h-[400px] relative bg-border-color flex justify-center\"\n >\n <Image\n className=\"object-cover h-full w-full\"\n src={article.image}\n alt={article.name}\n aspectRatio=\"3/1\"\n priority={index === 0}\n />\n <div className=\"absolute z-10 bottom-0 rtl:right-0 ltr:left-0 p-4 pb-10 rtl:lg:pr-10 ltr:lg:pl-10 lg:pb-20\">\n <div className=\"blog-slider__content relative\">\n <div className=\"z-20 w-full md:w-5/6 lg:w-6/12 text-white\">\n <div className=\"block-slide-anime\">\n <div className=\"mb-2.5 rounded-md inline-flex text-sm rtl:space-x-reverse space-x-5\">\n <div className=\"flex items-center\">\n <i className=\"sicon-calendar-date rtl:ml-1 ltr:mr-1\"></i>\n <span className=\"whitespace-nowrap\">\n {formatDate(article.created_at)}\n </span>\n </div>\n <Link\n to={article.author?.url || '#'}\n className=\"flex items-center hover:underline\"\n >\n <i className=\"sicon-user rtl:ml-1 ltr:mr-1\"></i>\n <span className=\"whitespace-nowrap\">{article.author?.name}</span>\n </Link>\n </div>\n <h3 className=\"text-sm font-bold leading-normal mb-4\">\n <Link to={article.url}>{article.name}</Link>\n </h3>\n </div>\n <p className=\"line-clamp-2 block-slide-anime description\">\n {article.description}\n </p>\n </div>\n </div>\n </div>\n </div>\n ))}\n </div>\n </SallaSlider>\n )}\n\n {!slides.length && (\n <div className=\"sr-only lg:not-sr-only\">\n <h1 className=\"blog-category__title font-bold text-lg mb-8\">\n {t('blocks.footer.blog')}\n </h1>\n </div>\n )}\n\n {slides.length > 0 && <h1 className=\"sr-only\">{t('blocks.footer.blog')}</h1>}\n\n {articles.length > 0 ? (\n <>\n <HookSlot name=\"blog:items.start\" />\n <div className=\"grid md:grid-cols-2 gap-2.5 md:gap-8\">\n {articles.map((article) => (\n <div\n key={article.id}\n className=\"list-block post-entry relative h-full transition-shadow duration-500 bg-white hover:shadow-default rounded-lg justify-around overflow-hidden flex flex-col\"\n >\n <Link\n to={article.url}\n className=\"post-entry__image relative overflow-hidden hover:opacity-90 w-full h-56 bg-border-color flex items-center justify-center\"\n >\n <Image\n className=\"h-full w-full object-cover\"\n src={article.image}\n alt={article.name}\n aspectRatio=\"16/9\"\n />\n </Link>\n\n <div className=\"flex-1 px-5 pt-5 pb-7\">\n <div className=\"mb-2.5 text-gray-500 rounded-md inline-flex text-sm rtl:space-x-reverse space-x-5\">\n <div className=\"flex items-center\">\n <i className=\"sicon-calendar-date rtl:ml-1 ltr:mr-1\"></i>\n <span>{formatDate(article.created_at)}</span>\n </div>\n <Link\n to={article.author?.url || '#'}\n className=\"flex items-center hover:text-dark\"\n >\n <i className=\"sicon-user rtl:ml-1 ltr:mr-1\"></i>\n <span>{article.author?.name}</span>\n </Link>\n </div>\n\n <h3 className=\"post-entry__title text-sm font-bold text-gray-800 leading-6 mb-2.5\">\n <Link to={article.url}>{article.name}</Link>\n </h3>\n <p className=\"text-sm text-gray-500 leading-6 mb-2.5\">\n {article.description}\n </p>\n\n {((article.stats?.likes ?? 0) > 0 || (article.stats?.comments ?? 0) > 0) && (\n <div className=\"post-entry__icons flex items-center gap-2.5 text-gray-500 text-sm\">\n {(article.stats?.likes ?? 0) > 0 && (\n <div className=\"flex items-center gap-1\">\n <i className=\"sicon-thumbs-up\"></i>\n {article.stats?.likes}\n </div>\n )}\n {(article.stats?.comments ?? 0) > 0 && (\n <div className=\"flex items-center gap-1\">\n <i className=\"sicon-chat\"></i>\n {article.stats?.comments}\n </div>\n )}\n </div>\n )}\n </div>\n\n {article.tags && <BlogTags tags={article.tags} />}\n </div>\n ))}\n </div>\n <HookSlot name=\"blog:items.end\" />\n </>\n ) : (\n !slides.length && (\n <NoContent icon=\"sicon-inbox\" message={t('pages.blog_categories.no_articles')} />\n )\n )}\n\n <HookSlot name=\"blog:end\" />\n </div>\n </div>\n </div>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/blog/BlogSinglePage.tsx"],"names":[],"mappings":"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","file":"BlogSinglePage-FBO4NQL5.js","sourcesContent":["import { SallaComments } from '@salla.sa/twilight-components-react/comments';\nimport { HookSlot, useAsset, useDate } from '../../hooks';\nimport { useBlogLike } from '../../hooks/useBlogLike';\nimport { useComments } from '../../hooks/useComments';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport type { BlogSinglePageProps } from './types';\nimport { Breadcrumb, Image, Link } from '../../components/common';\nimport { useTwilight } from '../../providers/twilight-context';\n\nexport function BlogSinglePage({ page, article, related = [] }: BlogSinglePageProps) {\n const { t } = useTranslation();\n const { store } = useTwilight();\n const { cdn } = useAsset();\n const { format: formatDate } = useDate();\n const { active, count, toggle, loading } = useBlogLike(\n Number(article.id) || 0,\n article.stats?.likes ?? 0\n );\n const { commentsKey } = useComments();\n\n return (\n <div key={article.id} className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n\n <div className=\"md:flex items-start\">\n <div className=\"main-content blog-category md:w-96 flex-1 bg-white lg:p-8 rounded-md mb-10 md:mb-0\">\n <HookSlot name=\"blog:single.start\" />\n\n <h1 className=\"font-bold text-3xl mb-5 leading-10\">{article.name}</h1>\n\n <div className=\"mb-10 text-gray-500 rounded-md inline-flex text-sm rtl:space-x-reverse space-x-5\">\n <div className=\"flex items-center\">\n <i className=\"sicon-calendar-date rtl:ml-1 ltr:mr-1\"></i>\n <span>{formatDate(article.created_at)}</span>\n </div>\n <Link to={article.author?.url || '#'} className=\"flex items-center hover:text-dark\">\n <i className=\"sicon-user rtl:ml-1 ltr:mr-1\"></i>\n <span>{article.author?.name}</span>\n </Link>\n </div>\n\n {article.image && (\n <Image\n src={article.image}\n alt={article.name}\n className=\"h-80 mb-10 w-full rounded-md\"\n aspectRatio=\"16/9\"\n priority\n noWrapper\n />\n )}\n\n {store.settings?.blog?.allow_likes_and_comments && (\n <div className=\"flex items-center gap-2.5 text-gray-500 text-base mb-2\">\n <button\n type=\"button\"\n id=\"blog-like\"\n data-blog-id={article.id}\n className={`flex items-center gap-1 transition-colors ${active ? 'text-primary font-semibold liked' : ''}`}\n onClick={toggle}\n disabled={loading}\n >\n {loading ? (\n <span className=\"loader loader--small\"></span>\n ) : (\n <i className={`sicon-thumbs-up ${active ? 'text-primary' : ''}`}></i>\n )}\n <span>{count}</span>\n </button>\n {(article.stats?.comments ?? 0) > 0 && (\n <div className=\"flex items-center gap-1\">\n <i className=\"sicon-chat text-primary\"></i>\n {article.stats?.comments}\n </div>\n )}\n </div>\n )}\n\n <article\n className=\"leading-7 text-sm mb-10\"\n dangerouslySetInnerHTML={{ __html: article.description?.replace(/&nbsp;/g, ' ') || '' }}\n />\n\n {article.tags && article.tags.length > 0 && (\n <div className=\"p-4 flex flex-wrap items-center border-t border-gray-200\">\n {article.tags.map((tag) => (\n <Link\n key={tag.id}\n to={tag.url}\n className=\"py-2 px-4 rounded-large inline-flex items-center text-gray-500 hover:text-dark justify-center text-sm\"\n >\n <i className=\"font-medium sicon-tag rtl:ml-1.5 ltr:mr-1.5\"></i>\n <span className=\"fix-align whitespace-nowrap\">{tag.name}</span>\n </Link>\n ))}\n </div>\n )}\n\n {store.settings?.blog?.allow_likes_and_comments && (\n <SallaComments\n key={commentsKey}\n itemId={Number(article.id) || 0}\n type={'blog' as any}\n />\n )}\n\n <HookSlot name=\"blog:single.end\" />\n </div>\n\n <aside\n aria-label=\"Sidebar\"\n className=\"sticky shrink-0 top-24 md:w-96 rtl:lg:mr-8 ltr:lg:ml-8 pb-11\"\n >\n {related.length > 0 && (\n <>\n <h2 className=\"font-bold mb-3\">{t('pages.blog_articles.related')}</h2>\n\n <HookSlot name=\"blog:single.related.start\" />\n\n {related.map((relatedArticle) => (\n <div\n key={relatedArticle.id}\n className=\"mt-5 flex items-center bg-white p-5 rounded-md\"\n >\n <div className=\"shrink-0\">\n <Link\n to={relatedArticle.url}\n className=\"bg-border-color h-24 w-24 rounded-md overflow-hidden flex items-center justify-center\"\n >\n <span className=\"sr-only\">{relatedArticle.name}</span>\n {relatedArticle.image ? (\n <Image\n className=\"h-full w-full object-cover\"\n src={relatedArticle.image}\n alt={relatedArticle.name}\n aspectRatio=\"1/1\"\n />\n ) : (\n <Image\n className=\"sm:h-full w-10 object-contain opacity-60\"\n src={cdn('/images/placeholder.png')}\n alt=\"post image\"\n />\n )}\n </Link>\n </div>\n <div className=\"rtl:mr-3 ltr:ml-3\">\n <div className=\"flex items-center text-sm text-gray-500 mb-2\">\n <i className=\"sicon-calendar-date rtl:ml-1 ltr:mr-1 rtl:pl-px ltr:pr-px\"></i>\n <time>{formatDate(relatedArticle.created_at)}</time>\n </div>\n <h3 className=\"text-sm font-bold text-gray-800 leading-6\">\n <Link to={relatedArticle.url} className=\"hover:underline\">\n {relatedArticle.name}\n </Link>\n </h3>\n </div>\n </div>\n ))}\n\n <HookSlot name=\"blog:single.related.end\" />\n </>\n )}\n </aside>\n </div>\n </div>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/blog/BlogTagPage.tsx"],"names":[],"mappings":"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","file":"BlogTagPage-WZIUPBEM.js","sourcesContent":["import { useRef, useCallback } from 'react';\nimport { ItemsList } from '@salla.sa/twilight-components-react';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useLocation } from '../../providers/NavigationProvider';\nimport { Breadcrumb, NoContent } from '../../components/common';\nimport { blog } from '../../api/blog';\nimport { BlogArticleCard, BlogListLayout } from './components';\nimport type { BlogTagLoaderData, ArticleSummary } from './types';\n\nconst EMPTY_CATEGORIES: BlogTagLoaderData['categories'] = [];\nconst EMPTY_ARTICLES: ArticleSummary[] = [];\n\nexport function BlogTagPage({\n page,\n blogTag,\n categories = EMPTY_CATEGORIES,\n articles = EMPTY_ARTICLES,\n cursor,\n}: BlogTagLoaderData) {\n const { t } = useTranslation();\n const { pathname, searchStr } = useLocation();\n const nextCursorRef = useRef<string | null>(cursor?.next ?? null);\n\n const loader = useCallback(async () => {\n const nextUrl = nextCursorRef.current;\n const cursorMatch = nextUrl?.match(/[?&]cursor=([^&]+)/);\n const cursorValue = cursorMatch ? decodeURIComponent(cursorMatch[1]) : (nextUrl ?? undefined);\n\n const result = await blog.articles.list({ tag: String(blogTag.id), cursor: cursorValue });\n nextCursorRef.current = result.cursor?.next ?? null;\n\n return {\n items: result.data,\n next: result.cursor?.next ?? null,\n };\n }, [blogTag.id]);\n\n if (articles.length === 0) {\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n <BlogListLayout categories={categories}>\n <HookSlot name=\"blog:tag.start\" />\n <NoContent icon=\"sicon-inbox\" message={t('pages.blog_categories.no_articles')} />\n <HookSlot name=\"blog:tag.end\" />\n </BlogListLayout>\n </div>\n );\n }\n\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n\n <BlogListLayout categories={categories}>\n <HookSlot name=\"blog:tag.start\" />\n\n <div className=\"mb-6\">\n <h1 className=\"font-bold text-xl\">{blogTag.name}</h1>\n </div>\n\n <ItemsList<ArticleSummary>\n items={articles}\n loader={cursor?.next ? loader : undefined}\n mode={cursor?.next ? 'infinite' : 'static'}\n pageUrl={pathname + searchStr}\n className=\"s-blog-list\"\n itemsClassName=\"grid md:grid-cols-2 gap-2.5 md:gap-8\"\n empty={<NoContent icon=\"sicon-inbox\" message={t('pages.blog_categories.no_articles')} />}\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) =>\n items.map((article) => (\n <BlogArticleCard key={article.id} article={article} showAuthor />\n ))\n }\n </ItemsList>\n\n <HookSlot name=\"blog:tag.end\" />\n </BlogListLayout>\n </div>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/brands/BrandsPage.tsx"],"names":[],"mappings":"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","file":"BrandsPage-EN6MZV6T.js","sourcesContent":["import { memo, useState, useRef, useCallback, useEffect, useMemo } from 'react';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport { useWindowScroll } from '@uidotdev/usehooks';\nimport { Link, Breadcrumb, NoContent, Image } from '../../components/common';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { brand } from '../../api/brands';\nimport type { Brand, BrandsGroup, BrandsPageProps } from './types';\n\nfunction byLetter(brands: Brand[], locale: string): [string, Brand[]][] {\n const groups: BrandsGroup = {};\n for (const item of brands) {\n (groups[(locale === 'ar' ? item.ar_char : item.en_char) || '#'] ??= []).push(item);\n }\n // Code point order is alphabetical for Arabic and Latin, and the same on server and browser.\n return Object.entries(groups).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n}\n\ninterface BrandSectionProps {\n char: string;\n brands: Brand[];\n sectionRef: (el: HTMLElement | null) => void;\n}\n\nfunction BrandSection({ char, brands, sectionRef }: BrandSectionProps) {\n return (\n <section\n id={`brand-section-${char}`}\n ref={sectionRef}\n className=\"pt-24 first:pt-16 md:first:pt-24\"\n >\n <div className=\"flex items-center mb-10\">\n <span data-id={char} className=\"brand-char\">\n <span className=\"fix-align\">{char}</span>\n </span>\n <div className=\"bg-border-color h-px flex-1\"></div>\n </div>\n <div className=\"grid grid-cols-3 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 grid-flow-row gap-4 md:gap-8\">\n {brands.map((item) => (\n // A grid of logos would preload a brand for every logo the mouse crosses.\n <Link key={item.id} to={`/brands/${item.id}`} className=\"brand-item\" preload={false}>\n <Image\n className=\"max-h-full\"\n objectFit=\"contain\"\n width={400}\n height={300}\n src={item.logo}\n alt={item.name}\n />\n </Link>\n ))}\n </div>\n </section>\n );\n}\n\nconst PAGES_PER_WAVE = 6;\n\n// One retry per page, so a network blip does not drop it.\nconst fetchPage = (page: number) => brand.list(page).catch(() => brand.list(page));\n\nasync function fetchWave(from: number): Promise<{ items: Brand[]; done: boolean }> {\n const settled = await Promise.allSettled(\n Array.from({ length: PAGES_PER_WAVE }, (_, i) => fetchPage(from + i))\n );\n const pages = settled.flatMap((result) => (result.status === 'fulfilled' ? [result.value] : []));\n return {\n items: pages.flatMap((result) => result.items),\n // Stop at the last page, or when a whole wave fails.\n done: pages.length === 0 || pages.some((result) => !result.next),\n };\n}\n\n/**\n * The first page plus every page after `next`, fetched in the background so the letter menu is\n * complete without scrolling. The API has no page count, so pages load in parallel waves.\n */\nfunction useAllBrands(first: Brand[], next: string | null | undefined, locale: string): Brand[] {\n const startPage = Number(next?.match(/[?&]page=(\\d+)/)?.[1]) || 0;\n const { data, hasNextPage, isFetchingNextPage, fetchNextPage } = useInfiniteQuery({\n queryKey: ['brands', 'after-first-page', locale, startPage],\n queryFn: ({ pageParam }) => fetchWave(pageParam),\n initialPageParam: startPage,\n getNextPageParam: (wave, _waves, from) => (wave.done ? undefined : from + PAGES_PER_WAVE),\n enabled: startPage > 0,\n // Not reused across visits: it must match the first page the loader just fetched.\n gcTime: 0,\n });\n\n useEffect(() => {\n if (hasNextPage && !isFetchingNextPage) void fetchNextPage();\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n return useMemo(() => {\n const extra = data?.pages.flatMap((wave) => wave.items) ?? [];\n return extra.length ? [...first, ...extra] : first;\n }, [first, data]);\n}\n\nfunction BrandsPageComponent({ page, brands, pagination }: BrandsPageProps) {\n const { t, locale } = useTranslation();\n const allBrands = useAllBrands(brands, pagination?.next, locale);\n const brandEntries = useMemo(() => byLetter(allBrands, locale), [allBrands, locale]);\n const [selectedChar, setSelectedChar] = useState<string | null>(null);\n const sectionRefs = useRef<Record<string, HTMLElement | null>>({});\n\n // Use useWindowScroll hook instead of manual listener\n const [{ y }] = useWindowScroll();\n const isSticky = (y ?? 0) > 200;\n\n // Handle brand nav item click - matches brands.js toggle class logic\n const handleBrandClick = useCallback((e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n const char = e.currentTarget.dataset.id;\n if (char) {\n setSelectedChar(char);\n sectionRefs.current[char]?.scrollIntoView({ behavior: 'smooth' });\n }\n }, []);\n\n return (\n <div className=\"container mb-20\">\n <Breadcrumb page={page} />\n\n <div className=\"flex justify-between pt-2 pb-6\">\n <h1 className=\"font-bold mb-6 md:mb-0\">{page.title}</h1>\n </div>\n\n {brandEntries.length > 0 ? (\n <>\n <div className=\"brands-nav-wrap\">\n <ul\n id=\"brands-nav\"\n className={`brands-nav ${isSticky ? 'is-sticky' : 'is-not-sticky'}`}\n >\n <li></li>\n {brandEntries.map(([char]) => (\n <li key={char}>\n <a\n className={`brands-nav__item ${selectedChar === char ? 'is-selected' : 'unselected'}`}\n href={`#brand-section-${char}`}\n onClick={handleBrandClick}\n data-id={char}\n >\n <span className=\"fix-align\">{char}</span>\n </a>\n </li>\n ))}\n </ul>\n </div>\n\n <div className=\"px-8 xl:px-0\">\n <HookSlot name=\"brands:index.items.start\" />\n\n {brandEntries.map(([char, brandGroup]) => (\n <BrandSection\n key={char}\n char={char}\n brands={brandGroup}\n sectionRef={(el) => {\n sectionRefs.current[char] = el;\n }}\n />\n ))}\n\n <HookSlot name=\"brands:index.items.end\" />\n </div>\n </>\n ) : (\n <NoContent\n icon=\"sicon-award-ribbon\"\n message={t('pages.brands.non_brands')}\n actionLabel={t('common.elements.back_home')}\n />\n )}\n </div>\n );\n}\n\nexport const BrandsPage = memo(BrandsPageComponent);\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/common/BreadcrumbTrail.tsx","../src/components/common/BreadcrumbJsonLd.tsx","../src/components/common/Breadcrumb.tsx"],"names":["BreadcrumbTrail","jsx","jsxs","Fragment"],"mappings":"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","file":"Breadcrumb-COB4TMMI.js","sourcesContent":["import { memo, useState, useEffect } from 'react';\nimport type { Breadcrumb } from '../../types';\nimport { Link } from './Link';\n\nconst MAX_VISIBLE_ITEMS = 4;\n\ninterface BreadcrumbTrailProps {\n items: Breadcrumb[];\n className?: string;\n}\n\nconst ChevronIcon = () => (\n <svg\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 32 32\"\n aria-hidden=\"true\"\n >\n <title>keyboard_arrow_left</title>\n <path d=\"M20.563 22.104l-1.875 1.875-8-8 8-8 1.875 1.875-6.125 6.125z\"></path>\n </svg>\n);\n\nfunction truncateItems(items: Breadcrumb[]): Breadcrumb[] {\n if (items.length <= MAX_VISIBLE_ITEMS) return items;\n\n return [items[0], { name: '…', url: '' }, ...items.slice(-2)];\n}\n\nexport const BreadcrumbTrail = memo(function BreadcrumbTrail({\n items,\n className,\n}: BreadcrumbTrailProps) {\n const [expanded, setExpanded] = useState(false);\n\n useEffect(() => {\n setExpanded(false);\n }, [items]);\n\n if (items.length === 0) return null;\n\n const displayItems = expanded ? items : truncateItems(items);\n\n return (\n <nav className={className ?? 'breadcrumbs w-full py-5'} aria-label=\"Breadcrumb\">\n <ol className=\"s-breadcrumb-wrapper\" itemScope itemType=\"https://schema.org/BreadcrumbList\">\n {displayItems.map((item, index) => {\n const isLast = index === displayItems.length - 1;\n const isEllipsis = item.name === '…' && !item.url;\n\n return (\n <li\n key={`${item.url}-${item.name}`}\n className={['s-breadcrumb-item', isEllipsis ? 'cursor-pointer select-none' : ''].join(\n ' '\n )}\n aria-current={isLast ? 'page' : undefined}\n itemProp=\"itemListElement\"\n itemScope\n itemType=\"https://schema.org/ListItem\"\n >\n {isEllipsis ? (\n <button\n type=\"button\"\n onClick={() => {\n setExpanded(true);\n }}\n className=\"inline-flex items-center gap-1 hover:underline\"\n aria-label=\"Show all breadcrumbs\"\n >\n <span aria-hidden=\"true\" className=\"text-xs\">\n •••\n </span>\n </button>\n ) : isLast ? (\n <span itemProp=\"name\">{item.name}</span>\n ) : (\n <>\n <Link to={item.url} itemProp=\"item\">\n <span itemProp=\"name\">{item.name}</span>\n </Link>\n <span aria-hidden=\"true\" className=\"s-breadcrumb-arrow inline-flex\">\n <ChevronIcon />\n </span>\n <meta itemProp=\"position\" content={String(index + 1)} />\n </>\n )}\n {isLast && <meta itemProp=\"position\" content={String(index + 1)} />}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n});\n","import type { Breadcrumb } from '../../types';\n\ninterface BreadcrumbJsonLdProps {\n items: Breadcrumb[];\n origin: string;\n}\n\nfunction toAbsoluteUrl(origin: string, path: string): string {\n if (path.startsWith('http')) return path;\n return origin + path;\n}\n\nexport function BreadcrumbJsonLd({ items, origin }: BreadcrumbJsonLdProps) {\n if (items.length === 0) return null;\n\n const schema = {\n '@context': 'https://schema.org',\n '@type': 'BreadcrumbList',\n itemListElement: items.map((item, index) => {\n const isLast = index === items.length - 1;\n const url = toAbsoluteUrl(origin, item.url);\n return {\n '@type': 'ListItem',\n position: index + 1,\n name: item.name,\n ...(isLast ? { '@id': url } : { item: url }),\n };\n }),\n };\n\n const html = JSON.stringify(schema);\n\n return (\n <script\n type=\"application/ld+json\"\n suppressHydrationWarning\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n}\n","import type { Page } from '../../types';\nimport { useBreadcrumbs } from '../../hooks/useBreadcrumbs';\nimport { useTwilight } from '../../providers/TwilightProvider';\nimport { BreadcrumbTrail } from './BreadcrumbTrail';\nimport { BreadcrumbJsonLd } from './BreadcrumbJsonLd';\n\nexport interface BreadcrumbProps {\n page?: Page | null;\n className?: string;\n}\n\nexport function Breadcrumb({ page, className }: BreadcrumbProps) {\n const { theme, store } = useTwilight();\n const breadcrumbsEnabled = theme.settings.is_breadcrumbs_enabled ?? true;\n const origin = store.url;\n\n const items = useBreadcrumbs(page);\n\n if (!breadcrumbsEnabled) return null;\n\n return (\n <>\n <BreadcrumbTrail items={items} className={className} />\n <BreadcrumbJsonLd items={items} origin={origin} />\n </>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/cart/CartItem.tsx"],"names":[],"mappings":"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","file":"CartItem-SYQZHA2F.js","sourcesContent":["import type { Money, CartItem as CartItemType } from '../../types';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useMoney } from '../../hooks/useMoney';\nimport { Link, Image } from '../common';\nimport { SallaCartItemOffers } from '@salla.sa/twilight-components-react/cart-item-offers';\nimport { SallaQuantityInput } from '@salla.sa/twilight-components-react/quantity-input';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { SallaProductOptions } from '@salla.sa/twilight-components-react/product-options';\nimport { useHostAttributes } from '@salla.sa/twilight-theme-engine/hooks/useHostAttributes';\n\ninterface CartItemProps {\n item: CartItemType;\n isFirst?: boolean;\n}\n\nfunction toNumber(value: number | Money | undefined): number | undefined {\n if (value === undefined) return undefined;\n if (typeof value === 'number') return value;\n return value.amount;\n}\n\nfunction moneyCurrency(value: number | Money | undefined): string | undefined {\n if (typeof value !== 'object') return undefined;\n return value.currency;\n}\n\nfunction CartItemPrices({ item }: { item: CartItemType }) {\n const { format } = useMoney();\n return (\n <div className=\"flex items-center gap-2 flex-wrap\">\n {item.offer && (\n <span className=\"text-sm text-gray-500 line-through item-regular-price\">\n {format(toNumber(item.product_price), {\n currency: moneyCurrency(item.product_price),\n })}\n </span>\n )}\n\n {item.is_on_sale && (\n <span className=\"inline-flex gap-1 leading-4 text-sm text-gray-500 line-through item-original-price\">\n {format(toNumber(item.original_price), {\n currency: moneyCurrency(item.original_price),\n })}\n </span>\n )}\n\n <span\n className={`inline-flex gap-1 leading-4 item-price ${item.has_discount ? 'text-red-800' : 'text-sm text-gray-500'}`}\n >\n {format(toNumber(item.price), { currency: moneyCurrency(item.price) })}\n </span>\n </div>\n );\n}\n\nfunction CartItemQuantity({ item }: { item: CartItemType }) {\n const { t } = useTranslation();\n const quantityRef = useHostAttributes({\n max: item.max_quantity,\n value: item.quantity,\n name: 'quantity',\n });\n\n if (item.type === 'donating') return <span></span>;\n\n if (item.is_hidden_quantity) {\n return (\n <>\n <input\n type=\"hidden\"\n value={item.quantity}\n name=\"quantity\"\n aria-label={t('pages.products.quantity')}\n />\n <span className=\"w-10 text-center\">{item.quantity}</span>\n </>\n );\n }\n\n return (\n <SallaQuantityInput\n // The loaded component reads `value` only once, so remount when the quantity changes.\n key={`${item.id}-${item.quantity}`}\n ref={quantityRef}\n cartItemId={item.id}\n max={item.max_quantity ?? undefined}\n className=\"transition transition-color duration-300\"\n aria-label={t('pages.products.quantity')}\n value={item.quantity}\n name=\"quantity\"\n />\n );\n}\n\nfunction CartItemTotal({ item }: { item: CartItemType }) {\n const { t } = useTranslation();\n const { format } = useMoney();\n const total = item.detailed_offers?.length ? item.total_special_price : item.total;\n return (\n <p className=\"text-primary flex-none font-bold text-sm rtl:md:pl-12 ltr:md:pr-12\">\n <span>{t('pages.cart.total')}:</span>\n <span className=\"inline-block item-total\">\n {item.is_available\n ? format(toNumber(total), { currency: moneyCurrency(total) })\n : t('pages.products.out_of_stock')}\n </span>\n </p>\n );\n}\n\nconst handleChange = (e: React.ChangeEvent<HTMLFormElement>) => {\n window.salla?.form.onChange('cart.updateItem', e);\n};\n\nexport function CartItem({ item, isFirst = false }: CartItemProps) {\n const { t } = useTranslation();\n\n const handleDelete = async () => {\n await window.salla?.cart.deleteItem(item.id);\n document.querySelector(`#item-${item.id}`)?.remove();\n };\n\n const isFreeProduct = toNumber(item.price) === 0 && item.has_discount;\n\n return (\n <form onChange={handleChange} id={`item-${item.id}`}>\n <section className=\"cart-item bg-white p-5 xs:p-7 rounded-md mb-5 relative\">\n <input type=\"hidden\" name=\"id\" value={item.id} />\n\n <div className=\"md:flex rtl:space-x-reverse md:space-x-12 items-start justify-between mb-8 last:mb-0\">\n <div className=\"flex flex-1 rtl:space-x-reverse space-x-4\">\n <Link to={item.url} className=\"relative overflow-hidden shrink-0\">\n <Image\n src={item.product_image}\n alt={item.product_name}\n className=\"flex-none w-24 h-20 border border-gray-200 bg-gray-100 rounded-md object-center object-cover\"\n aspectRatio=\"6/5\"\n priority={isFirst}\n />\n\n {isFreeProduct && (\n <div className=\"free-ribbon absolute top-[11px] right-[-38px] w-32 bg-red-600 text-white text-xs font-bold text-center py-1 rotate-45 shadow-md\">\n {/* Twig: trans('pages.loyalty_program.free_product') */}\n {t('pages.loyalty_program.free_product')}\n </div>\n )}\n </Link>\n\n <div className=\"space-y-1\">\n <div className=\"text-gray-900 leading-6 text-lg font-bold\">\n <Link to={item.url} className=\"text-base\">\n {item.product_name}\n </Link>\n </div>\n\n <CartItemPrices item={item} />\n\n {item.weight_label && (\n <p className=\"text-sm text-gray-500\">\n {t('pages.products.weight')}: <span>{item.weight_label}</span>\n </p>\n )}\n\n {/* Twig: class=\"{{ item.detailed_offers ? 'hidden' : '' }}\": hide old offer when detailed_offers present */}\n {item.offer && !item.detailed_offers?.length && (\n <span className=\"old-offers flex items-center gap-1 mx-1.5\">\n <i className=\"sicon-discount-calculator text-gray-500 offer-icon\"></i>\n <span className=\"text-sm text-gray-500 offer-name\">{item.offer.names}</span>\n </span>\n )}\n\n {item.detailed_offers && item.detailed_offers.length > 0 && (\n <SallaCartItemOffers\n quantity={item.quantity}\n itemId={String(item.id) as any}\n productPrice={toNumber(item.product_price) ?? 0}\n offers={JSON.stringify(item.detailed_offers)}\n />\n )}\n </div>\n </div>\n\n <div className=\"border-t border-b border-gray-200 py-3 md:p-0 md:border-none mt-5 md:mt-0 flex gap-8 justify-between items-center md:items-start\">\n <CartItemQuantity item={item} />\n\n <CartItemTotal item={item} />\n </div>\n </div>\n\n {/* Twig: {% include 'pages.partials.product.options' with {product:item} %} */}\n {item.options && item.options.length > 0 && (\n <SallaProductOptions options={JSON.stringify(item.options)} productId={item.product_id} />\n )}\n\n <span className=\"absolute top-1.5 rtl:left-1.5 ltr:right-1.5 rtl:xs:left-5 ltr:xs:right-5 xs:top-5\">\n <SallaButton\n type=\"button\"\n shape=\"icon\"\n size=\"small\"\n color=\"danger\"\n className=\"btn--delete\"\n ariaLabel={t('common.elements.remove')}\n onClick={handleDelete}\n >\n <i className=\"sicon-cancel\"></i>\n </SallaButton>\n </span>\n </section>\n </form>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/cart/CartSummary.tsx"],"names":[],"mappings":"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","file":"CartSummary-YQN7N6JW.js","sourcesContent":["import { useCallback } from 'react';\nimport { HookSlot } from '../../hooks/HookSlot';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useCoupon } from '../../hooks/useCoupon';\nimport { useMoney } from '../../hooks/useMoney';\nimport { stripUnsafeHtml } from '../../utils/sanitize';\nimport { SallaLoyalty } from '@salla.sa/twilight-components-react/loyalty';\nimport { SallaGifting } from '@salla.sa/twilight-components-react/gifting';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { SallaTieredOffer } from '@salla.sa/twilight-components-react/tiered-offer';\nimport type { Cart } from '../../types';\n\ninterface CartSummaryProps {\n cart: Cart;\n applyCouponEnabled?: boolean;\n taxAmount?: number;\n loyalty?: Cart['loyalty'];\n gift?: Cart['gift'];\n loyaltyPoints?: number;\n}\n\nexport function CartSummary({\n cart,\n applyCouponEnabled = true,\n taxAmount,\n loyalty,\n gift,\n loyaltyPoints,\n}: CartSummaryProps) {\n const { t } = useTranslation();\n const { format } = useMoney();\n\n const handleCartSubmit = useCallback(async () => {\n // Twig's cart.js: a submit with an empty required option fails and the SDK resets the cart.\n const forms = document.querySelectorAll<HTMLFormElement>('form[id^=\"item-\"]');\n if (![...forms].every((form) => form.reportValidity())) {\n window.salla?.notify.error(window.salla.lang.get('common.messages.required_fields'));\n return;\n }\n try {\n await window.salla?.cart.submit();\n } catch {\n // Error handling\n }\n }, []);\n\n return (\n <div className=\"sticky top-24 w-full lg:w-96 rtl:lg:mr-8 ltr:lg:ml-8\">\n <HookSlot name=\"cart:summary.start\" />\n {cart.free_shipping_bar && <FreeShippingBar freeShippingBar={cart.free_shipping_bar} />}\n\n {/* Twig: {% if loyalty and user.loyalty_points %} — top-level page vars rendered inside sidebar */}\n {loyalty && loyaltyPoints && (\n <div className=\"shadow-default mb-5 rounded-md p-3 xs:p-7 bg-white\">\n <SallaLoyalty\n customerPoints={loyaltyPoints}\n prizePoints={loyalty.prize.points}\n prizeTitle={loyalty.prize.title}\n />\n </div>\n )}\n\n {/* Twig: {{gift.enabled ? '' : 'hidden'}} — top-level page var rendered inside sidebar */}\n {gift?.enabled && (\n <div id=\"cart-gifting\" className=\"shadow-default bg-white xs:p-2 rounded-md mb-5 relative\">\n <SallaGifting\n id=\"salla-gifting\"\n className=\"mt-5\"\n widgetTitle={t('pages.cart.gift_widget_title', 'Send as a gift')}\n widgetSubtitle={gift.text}\n {...(gift.type ? { [gift.type + 'Products']: true } : {})}\n vertical\n />\n </div>\n )}\n\n <div className=\"shadow-default bg-white p-5 xs:p-7 rounded-md mb-5 relative transition-height duration-1000\">\n <h2 className=\"font-bold text-sm mb-5\">{t('pages.cart.summary', 'Order Summary')}</h2>\n\n <div className=\"flex justify-between text-sm mb-5\">\n <span className=\"text-gray-500\">\n {taxAmount\n ? t('pages.cart.items_total_without_tax', 'Items total (excl. tax)')\n : t('pages.cart.items_total', 'Items total')}\n </span>\n <b id=\"sub-total\">{format(cart.sub_total)}</b>\n </div>\n\n {cart.options?.length > 0 && (\n <div className=\"flex justify-between text-sm mb-5\">\n <span className=\"text-gray-500\">\n {t('pages.cart.order_options_total', 'Options total')}\n </span>\n <b id=\"cart-options-total\">{format(cart.options_total ?? undefined)}</b>\n </div>\n )}\n\n {cart.has_shipping && (\n <div id=\"shipping-cost\" className=\"flex justify-between text-sm mb-5\">\n <span className=\"text-gray-500\">{t('pages.cart.shipping_cost', 'Shipping cost')}</span>\n <b>{format(cart.real_shipping_cost)}</b>\n </div>\n )}\n\n {applyCouponEnabled && <CouponInput initialCoupon={cart.coupon ?? undefined} />}\n\n {!!cart.total_discount && (\n <div id=\"total-discount\" className=\"flex justify-between text-sm\">\n <span className=\"text-gray-500 block h-10\">{t('pages.cart.discount', 'Discount')}</span>\n <b>- {format(cart.total_discount)}</b>\n </div>\n )}\n\n {!!taxAmount && (\n <div className=\"flex justify-between text-sm mb-5\">\n <span className=\"text-gray-500\">\n {t('pages.cart.VAT_tax_amount', 'VAT Tax Amount')}\n </span>\n <b id=\"tax-amount\">{format(taxAmount)}</b>\n </div>\n )}\n\n <div className=\"flex justify-between text-lg mb-5\">\n <span className=\"text-gray-500\">{t('pages.cart.final_total', 'Total')}</span>\n <b data-cart-total>{format(cart.total)}</b>\n </div>\n\n <div className=\"cart-submit-wrap\">\n <HookSlot name=\"cart:submit.start\" />\n <SallaButton\n id=\"cart-submit\"\n loaderPosition=\"center\"\n width=\"wide\"\n onClick={handleCartSubmit}\n >\n {t('pages.cart.complete_order', 'Complete Order')}\n </SallaButton>\n <HookSlot name=\"cart:submit.end\" />\n </div>\n\n <HookSlot name=\"cart:summary.end\" />\n </div>\n\n <SallaTieredOffer />\n </div>\n );\n}\n\nfunction FreeShippingBar({\n freeShippingBar,\n}: {\n freeShippingBar: NonNullable<Cart['free_shipping_bar']>;\n}) {\n const isFree = freeShippingBar.has_free_shipping;\n const { t } = useTranslation();\n\n return (\n <div className=\"shadow-default bg-white p-5 xs:p-7 rounded-md mb-5 relative\" id=\"free-shipping\">\n <div className=\"flex rtl:space-x-reverse space-x-3 items-center\">\n <i className=\"bg-primary text-white rounded-icon sicon-shipping-fast\"></i>\n <div className=\"flex-1\">\n <h4 className=\"shipping-item font-bold text-sm mb-1.5\">\n {t('pages.cart.free_shipping', 'Free Shipping')}\n </h4>\n <p className=\"shipping-item text-sm text-gray-500\">\n {isFree ? (\n <>\n <span\n id=\"free-shipping-msg\"\n dangerouslySetInnerHTML={{\n __html: stripUnsafeHtml(\n t('pages.cart.has_free_shipping', 'You have free shipping!')\n ),\n }}\n />\n <span className=\"emoji\" id=\"free-shipping-applied\">\n 🎉\n </span>\n </>\n ) : (\n <span\n id=\"free-shipping-msg\"\n dangerouslySetInnerHTML={{\n __html: stripUnsafeHtml(\n t(\n 'pages.cart.free_shipping_alert',\n 'Get free shipping when you add :amount more'\n ).replace(':amount', String(freeShippingBar.remaining))\n ),\n }}\n />\n )}\n </p>\n </div>\n </div>\n {!isFree && (\n <div className=\"mt-8 bg-border-color rounded-full\" id=\"free-shipping-bar\">\n <div\n className=\"progress-bg transition-all duration-500 h-2.5 bg-primary relative rounded-full flex justify-end\"\n style={{ width: `${freeShippingBar.percent}%` }}\n >\n <i className=\"inline-block sicon-shipping-fast absolute -top-5 rtl:left-0 ltr:right-0\"></i>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction CouponInput({ initialCoupon }: { initialCoupon?: string }) {\n const { t } = useTranslation();\n const { value, error, apply, remove } = useCoupon();\n\n // Use initial coupon from cart if available\n const appliedCoupon = value ?? initialCoupon;\n\n const handleApplyCoupon = useCallback(\n async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n const code = formData.get('coupon') as string;\n if (code?.trim()) {\n await apply(code.trim());\n }\n },\n [apply]\n );\n\n const handleRemoveCoupon = useCallback(async () => {\n await remove();\n }, [remove]);\n\n return (\n <form className=\"border-t border-gray-200 border-b py-5 mb-5\" onSubmit={handleApplyCoupon}>\n <label htmlFor=\"coupon-input\" className=\"block text-sm\">\n {t('pages.cart.have_coupon', 'Have a coupon?')}\n </label>\n <div className=\"mt-2.5 relative\">\n <input\n placeholder={t('pages.cart.coupon_placeholder', 'Enter coupon code')}\n disabled={!!appliedCoupon}\n className=\"rtl:pl-24 ltr:pr-24 form-input\"\n defaultValue={appliedCoupon}\n id=\"coupon-input\"\n name=\"coupon\"\n aria-label={t('pages.cart.apply_coupon', 'Apply coupon')}\n type=\"text\"\n />\n\n <SallaButton\n type=\"submit\"\n className={`btn--coupon ${appliedCoupon ? 'has-coupon btn--danger' : 'has-not-coupon btn--default'}`}\n loaderPosition=\"center\"\n onClick={appliedCoupon ? handleRemoveCoupon : undefined}\n >\n <span className=\"coupon-text\">\n {appliedCoupon ? '' : t('pages.cart.apply_coupon_btn', 'Apply')}\n </span>\n {appliedCoupon && <i className=\"sicon-cancel icon text-xl w-8\"></i>}\n </SallaButton>\n </div>\n {error && (\n <span className=\"text-xs text-red-700\" id=\"coupon-error\">\n {error}\n </span>\n )}\n </form>\n );\n}\n"]}
@@ -1 +0,0 @@
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":"Copyright-II2URAIP.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"]}