@salla.sa/twilight-theme-engine 1.0.45 → 1.0.47

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 (263) hide show
  1. package/dist/{AddToCartForm-QBPE4QIU.js → AddToCartForm-NICDUAS3.js} +3 -3
  2. package/dist/{AddToCartForm-QBPE4QIU.js.map → AddToCartForm-NICDUAS3.js.map} +1 -1
  3. package/dist/{BlogAuthorPage-X3I7KLML.js → BlogAuthorPage-NKPS4CQ2.js} +16 -15
  4. package/dist/BlogAuthorPage-NKPS4CQ2.js.map +1 -0
  5. package/dist/{BlogCategoryPage-F3ORUZAF.js → BlogCategoryPage-FSCFBS36.js} +16 -15
  6. package/dist/BlogCategoryPage-FSCFBS36.js.map +1 -0
  7. package/dist/{BlogPage-G7AOQDP2.js → BlogPage-OZTHYA3G.js} +14 -13
  8. package/dist/BlogPage-OZTHYA3G.js.map +1 -0
  9. package/dist/{BlogSinglePage-VP4ZLQPA.js → BlogSinglePage-KC67IUL7.js} +14 -13
  10. package/dist/BlogSinglePage-KC67IUL7.js.map +1 -0
  11. package/dist/{BlogTagPage-WCHB3VL2.js → BlogTagPage-N7JLIRKV.js} +16 -15
  12. package/dist/BlogTagPage-N7JLIRKV.js.map +1 -0
  13. package/dist/{BrandsPage-MR3RNHNS.js → BrandsPage-5SC62L6S.js} +14 -13
  14. package/dist/BrandsPage-5SC62L6S.js.map +1 -0
  15. package/dist/{Breadcrumb-QCWPUUEQ.js → Breadcrumb-W64WMO56.js} +14 -13
  16. package/dist/Breadcrumb-W64WMO56.js.map +1 -0
  17. package/dist/{CartItem-M2FEFI23.js → CartItem-UOVSSW5O.js} +14 -13
  18. package/dist/CartItem-UOVSSW5O.js.map +1 -0
  19. package/dist/{CartSummary-RND3CQYW.js → CartSummary-4V3L56U7.js} +14 -13
  20. package/dist/CartSummary-4V3L56U7.js.map +1 -0
  21. package/dist/{Copyright-YVUGHPR6.js → Copyright-OCQCOUFS.js} +3 -3
  22. package/dist/{Copyright-YVUGHPR6.js.map → Copyright-OCQCOUFS.js.map} +1 -1
  23. package/dist/{CustomerLayout-B7HTCSMV.js → CustomerLayout-PLJTAXCP.js} +14 -13
  24. package/dist/CustomerLayout-PLJTAXCP.js.map +1 -0
  25. package/dist/{Footer-JOBYWULB.js → Footer-QD7ASWFT.js} +14 -13
  26. package/dist/{Footer-JOBYWULB.js.map → Footer-QD7ASWFT.js.map} +1 -1
  27. package/dist/{Header-TE35DMNI.js → Header-M5GOR6XZ.js} +7 -6
  28. package/dist/{Header-TE35DMNI.js.map → Header-M5GOR6XZ.js.map} +1 -1
  29. package/dist/{LoyaltyPage-26NMNBJV.js → LoyaltyPage-C7FKYLIW.js} +15 -14
  30. package/dist/LoyaltyPage-C7FKYLIW.js.map +1 -0
  31. package/dist/{MainMenu-4ZZEDUBZ.js → MainMenu-MMAYRKYE.js} +8 -7
  32. package/dist/MainMenu-MMAYRKYE.js.map +1 -0
  33. package/dist/{MasterLayout-AELGECHE.js → MasterLayout-SCTQ42ID.js} +14 -13
  34. package/dist/{MasterLayout-AELGECHE.js.map → MasterLayout-SCTQ42ID.js.map} +1 -1
  35. package/dist/{MobileMenu-GFEOQWO6.js → MobileMenu-J34MVD6W.js} +15 -14
  36. package/dist/MobileMenu-J34MVD6W.js.map +1 -0
  37. package/dist/{NotificationsPage-226QGY4Q.js → NotificationsPage-KF6AIPK3.js} +14 -13
  38. package/dist/NotificationsPage-KF6AIPK3.js.map +1 -0
  39. package/dist/{OrderSinglePage-44VBTQQS.js → OrderSinglePage-LP7FUHKL.js} +18 -16
  40. package/dist/OrderSinglePage-LP7FUHKL.js.map +1 -0
  41. package/dist/{OrdersPage-NUQUDEAK.js → OrdersPage-A3K5BDBZ.js} +15 -14
  42. package/dist/OrdersPage-A3K5BDBZ.js.map +1 -0
  43. package/dist/{PageSingle-76O4HAYZ.js → PageSingle-FHHC5QDA.js} +3 -3
  44. package/dist/{PageSingle-76O4HAYZ.js.map → PageSingle-FHHC5QDA.js.map} +1 -1
  45. package/dist/{ProductDetails-WTXNHY2S.js → ProductDetails-AF3I5FQQ.js} +3 -3
  46. package/dist/{ProductDetails-WTXNHY2S.js.map → ProductDetails-AF3I5FQQ.js.map} +1 -1
  47. package/dist/{ProfilePage-K7ZEU6IF.js → ProfilePage-RXQIUTU4.js} +14 -13
  48. package/dist/ProfilePage-RXQIUTU4.js.map +1 -0
  49. package/dist/{SeoCartWidget-6LY5YQKA.js → SeoCartWidget-72U3UQKH.js} +14 -13
  50. package/dist/SeoCartWidget-72U3UQKH.js.map +1 -0
  51. package/dist/{SettingsPage-NDZAS5PQ.js → SettingsPage-65CZ2LNG.js} +14 -13
  52. package/dist/SettingsPage-65CZ2LNG.js.map +1 -0
  53. package/dist/{StoreClosedNotification-CU2OVCIG.js → StoreClosedNotification-4KJVEGPE.js} +15 -14
  54. package/dist/{StoreClosedNotification-CU2OVCIG.js.map → StoreClosedNotification-4KJVEGPE.js.map} +1 -1
  55. package/dist/{TestimonialsPage-ICQGRIXS.js → TestimonialsPage-NGCHKB4F.js} +3 -3
  56. package/dist/{TestimonialsPage-ICQGRIXS.js.map → TestimonialsPage-NGCHKB4F.js.map} +1 -1
  57. package/dist/{ThankYouPage-WIHRO3DC.js → ThankYouPage-A7IWCMXJ.js} +14 -13
  58. package/dist/ThankYouPage-A7IWCMXJ.js.map +1 -0
  59. package/dist/{WalletPage-YD4TKPGA.js → WalletPage-FNGL7Z3Z.js} +15 -14
  60. package/dist/WalletPage-FNGL7Z3Z.js.map +1 -0
  61. package/dist/{WishlistPage-3UNTMS2B.js → WishlistPage-KDLBETWD.js} +16 -15
  62. package/dist/WishlistPage-KDLBETWD.js.map +1 -0
  63. package/dist/api/apps.js +5 -4
  64. package/dist/api/brands.js +6 -5
  65. package/dist/api/cart.js +6 -5
  66. package/dist/api/category.js +6 -5
  67. package/dist/api/client.js +4 -3
  68. package/dist/api/home.js +5 -4
  69. package/dist/api/loyalty.js +6 -5
  70. package/dist/api/menu.js +5 -4
  71. package/dist/api/notification.js +5 -4
  72. package/dist/api/order.js +6 -5
  73. package/dist/api/page.js +6 -5
  74. package/dist/api/product.js +6 -5
  75. package/dist/api/profile.js +4 -3
  76. package/dist/api/profile.js.map +1 -1
  77. package/dist/api/store.js +5 -4
  78. package/dist/api/translations.js +5 -4
  79. package/dist/api/user.js +5 -4
  80. package/dist/api/wishlist.js +7 -6
  81. package/dist/chunk-3FIWHGCZ.js +101 -0
  82. package/dist/chunk-3FIWHGCZ.js.map +1 -0
  83. package/dist/{chunk-E5EH32L7.js → chunk-3MHDV5JS.js} +3 -3
  84. package/dist/{chunk-E5EH32L7.js.map → chunk-3MHDV5JS.js.map} +1 -1
  85. package/dist/{chunk-KOZYZQH4.js → chunk-3XIITSKM.js} +4 -4
  86. package/dist/{chunk-KOZYZQH4.js.map → chunk-3XIITSKM.js.map} +1 -1
  87. package/dist/{chunk-5TRRUV7N.js → chunk-4D44TJ72.js} +3 -3
  88. package/dist/{chunk-5TRRUV7N.js.map → chunk-4D44TJ72.js.map} +1 -1
  89. package/dist/{chunk-UWWYR3UX.js → chunk-65Z2ZDKZ.js} +6 -6
  90. package/dist/{chunk-UWWYR3UX.js.map → chunk-65Z2ZDKZ.js.map} +1 -1
  91. package/dist/{chunk-AGT5BKY4.js → chunk-AVPIY3Y4.js} +7 -7
  92. package/dist/{chunk-AGT5BKY4.js.map → chunk-AVPIY3Y4.js.map} +1 -1
  93. package/dist/{chunk-XLJPUFN4.js → chunk-CPQXPECC.js} +5 -5
  94. package/dist/{chunk-XLJPUFN4.js.map → chunk-CPQXPECC.js.map} +1 -1
  95. package/dist/{chunk-PNXUBS5X.js → chunk-DTWFNS3F.js} +16 -15
  96. package/dist/chunk-DTWFNS3F.js.map +1 -0
  97. package/dist/{chunk-ZNWNJZSM.js → chunk-EMKO3C2V.js} +4 -4
  98. package/dist/{chunk-ZNWNJZSM.js.map → chunk-EMKO3C2V.js.map} +1 -1
  99. package/dist/{chunk-KFH3OBFW.js → chunk-GXNQX4Z2.js} +4 -4
  100. package/dist/{chunk-KFH3OBFW.js.map → chunk-GXNQX4Z2.js.map} +1 -1
  101. package/dist/chunk-HNSZ6VBK.js +14 -0
  102. package/dist/{chunk-I2UBYEUG.js.map → chunk-HNSZ6VBK.js.map} +1 -1
  103. package/dist/{chunk-TMR7TZMB.js → chunk-ICNOLZNT.js} +4 -4
  104. package/dist/{chunk-TMR7TZMB.js.map → chunk-ICNOLZNT.js.map} +1 -1
  105. package/dist/{chunk-2AGMXJVP.js → chunk-IH3TQ3LD.js} +4 -4
  106. package/dist/{chunk-2AGMXJVP.js.map → chunk-IH3TQ3LD.js.map} +1 -1
  107. package/dist/{chunk-6KI2QCPL.js → chunk-JD4J2ZB6.js} +3 -3
  108. package/dist/{chunk-6KI2QCPL.js.map → chunk-JD4J2ZB6.js.map} +1 -1
  109. package/dist/{chunk-NX6BEOXW.js → chunk-JEJR23P4.js} +4 -4
  110. package/dist/{chunk-NX6BEOXW.js.map → chunk-JEJR23P4.js.map} +1 -1
  111. package/dist/{chunk-XLGVT7QF.js → chunk-JK77XRXR.js} +13 -9
  112. package/dist/chunk-JK77XRXR.js.map +1 -0
  113. package/dist/{chunk-XTOXFAP7.js → chunk-KT2MUSRN.js} +3 -3
  114. package/dist/{chunk-XTOXFAP7.js.map → chunk-KT2MUSRN.js.map} +1 -1
  115. package/dist/{chunk-ME727LL4.js → chunk-KV5R4LKM.js} +3 -3
  116. package/dist/{chunk-ME727LL4.js.map → chunk-KV5R4LKM.js.map} +1 -1
  117. package/dist/{chunk-3644MRQI.js → chunk-L42W6YS3.js} +5 -5
  118. package/dist/{chunk-3644MRQI.js.map → chunk-L42W6YS3.js.map} +1 -1
  119. package/dist/{chunk-G6F5DCCP.js → chunk-LKBWIN26.js} +3 -3
  120. package/dist/{chunk-G6F5DCCP.js.map → chunk-LKBWIN26.js.map} +1 -1
  121. package/dist/{chunk-CCCKRNO4.js → chunk-MENDTTOA.js} +3 -3
  122. package/dist/{chunk-CCCKRNO4.js.map → chunk-MENDTTOA.js.map} +1 -1
  123. package/dist/{chunk-AZ5HAIYQ.js → chunk-O6XXHXC4.js} +5 -4
  124. package/dist/chunk-O6XXHXC4.js.map +1 -0
  125. package/dist/{chunk-2TEGEKIQ.js → chunk-OKP6LUT7.js} +4 -4
  126. package/dist/{chunk-2TEGEKIQ.js.map → chunk-OKP6LUT7.js.map} +1 -1
  127. package/dist/{chunk-QG2Q6HB5.js → chunk-P4DUWQU4.js} +3 -3
  128. package/dist/{chunk-QG2Q6HB5.js.map → chunk-P4DUWQU4.js.map} +1 -1
  129. package/dist/{chunk-6XWMNQ52.js → chunk-PJWFEMBX.js} +15 -4
  130. package/dist/chunk-PJWFEMBX.js.map +1 -0
  131. package/dist/{chunk-OGGWNPF3.js → chunk-PZL3JWM2.js} +3 -3
  132. package/dist/{chunk-OGGWNPF3.js.map → chunk-PZL3JWM2.js.map} +1 -1
  133. package/dist/{chunk-6MGDRMZM.js → chunk-QKIQ3K24.js} +4 -4
  134. package/dist/{chunk-6MGDRMZM.js.map → chunk-QKIQ3K24.js.map} +1 -1
  135. package/dist/{chunk-BWIESZJK.js → chunk-QUUSMVCP.js} +3 -3
  136. package/dist/{chunk-BWIESZJK.js.map → chunk-QUUSMVCP.js.map} +1 -1
  137. package/dist/{chunk-MLIJWD6B.js → chunk-QVPMWMPP.js} +35 -14
  138. package/dist/chunk-QVPMWMPP.js.map +1 -0
  139. package/dist/{chunk-X26WB7AG.js → chunk-R6M6RM6U.js} +3 -3
  140. package/dist/{chunk-X26WB7AG.js.map → chunk-R6M6RM6U.js.map} +1 -1
  141. package/dist/{chunk-J5J64BAN.js → chunk-U325BK62.js} +4 -4
  142. package/dist/{chunk-J5J64BAN.js.map → chunk-U325BK62.js.map} +1 -1
  143. package/dist/{chunk-G4M73JU5.js → chunk-UQRLBMIO.js} +6 -6
  144. package/dist/{chunk-G4M73JU5.js.map → chunk-UQRLBMIO.js.map} +1 -1
  145. package/dist/{chunk-RBISDOPR.js → chunk-UV5BRJH4.js} +4 -4
  146. package/dist/{chunk-RBISDOPR.js.map → chunk-UV5BRJH4.js.map} +1 -1
  147. package/dist/{chunk-ULQMJUO2.js → chunk-WHOWSSX4.js} +4 -4
  148. package/dist/{chunk-ULQMJUO2.js.map → chunk-WHOWSSX4.js.map} +1 -1
  149. package/dist/{chunk-CG3AM4DH.js → chunk-WITIL2MK.js} +5 -5
  150. package/dist/{chunk-CG3AM4DH.js.map → chunk-WITIL2MK.js.map} +1 -1
  151. package/dist/{chunk-QIC6DSWU.js → chunk-WL5CWJVZ.js} +4 -4
  152. package/dist/{chunk-QIC6DSWU.js.map → chunk-WL5CWJVZ.js.map} +1 -1
  153. package/dist/{chunk-2KZORZZN.js → chunk-WMSOSA74.js} +5 -5
  154. package/dist/{chunk-2KZORZZN.js.map → chunk-WMSOSA74.js.map} +1 -1
  155. package/dist/{chunk-JBXTU5NM.js → chunk-XTMHHLNK.js} +62 -78
  156. package/dist/chunk-XTMHHLNK.js.map +1 -0
  157. package/dist/{chunk-RIZOT5FN.js → chunk-Z74NUTEI.js} +3 -3
  158. package/dist/{chunk-RIZOT5FN.js.map → chunk-Z74NUTEI.js.map} +1 -1
  159. package/dist/components/cart/index.js +1 -1
  160. package/dist/components/common/index.js +1 -1
  161. package/dist/components/drawer/index.js +12 -11
  162. package/dist/components/home/index.js +15 -14
  163. package/dist/components/layout/index.js +5 -5
  164. package/dist/components/product/index.js +13 -12
  165. package/dist/components/store/index.js +14 -13
  166. package/dist/components/store/index.js.map +1 -1
  167. package/dist/document-class-IESLLQCD.js +26 -0
  168. package/dist/{document-class-G34XZMVK.js.map → document-class-IESLLQCD.js.map} +1 -1
  169. package/dist/hooks/index.js +12 -11
  170. package/dist/hooks/useGtm.js +12 -11
  171. package/dist/hooks/useMoney.js +12 -11
  172. package/dist/hooks/useStore.js +12 -11
  173. package/dist/hooks/useUser.js +6 -5
  174. package/dist/index.js +12 -11
  175. package/dist/index.js.map +1 -1
  176. package/dist/{navigation-D7QS3NK2.js → navigation-BCTD7TIG.js} +5 -4
  177. package/dist/navigation-BCTD7TIG.js.map +1 -0
  178. package/dist/{navigation-DQNNT2LY.js → navigation-DF2RT7D6.js} +6 -5
  179. package/dist/{navigation-DQNNT2LY.js.map → navigation-DF2RT7D6.js.map} +1 -1
  180. package/dist/{not-found-6PX2EO7T.js → not-found-3OWRDBD3.js} +14 -13
  181. package/dist/not-found-3OWRDBD3.js.map +1 -0
  182. package/dist/providers/NavigationProvider.d.ts +9 -2
  183. package/dist/providers/NavigationProvider.d.ts.map +1 -1
  184. package/dist/providers/index.js +12 -11
  185. package/dist/routes/account/orders/OrderSinglePage.d.ts.map +1 -1
  186. package/dist/routes/account/orders.js +7 -6
  187. package/dist/routes/account.js +16 -15
  188. package/dist/routes/account.js.map +1 -1
  189. package/dist/routes/blog.js +11 -10
  190. package/dist/routes/blog.js.map +1 -1
  191. package/dist/routes/brands.js +7 -6
  192. package/dist/routes/brands.js.map +1 -1
  193. package/dist/routes/cart.js +20 -19
  194. package/dist/routes/cart.js.map +1 -1
  195. package/dist/routes/home.js +17 -16
  196. package/dist/routes/index.js +4 -3
  197. package/dist/routes/loyalty.js +7 -6
  198. package/dist/routes/loyalty.js.map +1 -1
  199. package/dist/routes/page.js +7 -6
  200. package/dist/routes/page.js.map +1 -1
  201. package/dist/routes/product-listing/ProductListPage.d.ts.map +1 -1
  202. package/dist/routes/product-listing.js +22 -21
  203. package/dist/routes/product-listing.js.map +1 -1
  204. package/dist/routes/product.js +15 -14
  205. package/dist/routes/product.js.map +1 -1
  206. package/dist/routes/root/beforeLoad.d.ts.map +1 -1
  207. package/dist/routes/seo-redirects.js +4 -3
  208. package/dist/routes/testimonials.js +2 -2
  209. package/dist/routes/thank-you.js +7 -6
  210. package/dist/routes/thank-you.js.map +1 -1
  211. package/dist/skeleton.js +17 -16
  212. package/dist/tanstack/middleware/twilight.d.ts.map +1 -1
  213. package/dist/tanstack/router.d.ts.map +1 -1
  214. package/dist/tanstack/store-base.d.ts +20 -0
  215. package/dist/tanstack/store-base.d.ts.map +1 -0
  216. package/dist/tanstack.js +18 -17
  217. package/dist/tanstack.js.map +1 -1
  218. package/dist/twilight/context.d.ts +10 -0
  219. package/dist/twilight/context.d.ts.map +1 -1
  220. package/dist/utils/cookies.d.ts +56 -0
  221. package/dist/utils/cookies.d.ts.map +1 -1
  222. package/dist/utils/index.js +5 -4
  223. package/dist/utils/index.js.map +1 -1
  224. package/dist/utils/runtime-env.d.ts +11 -0
  225. package/dist/utils/runtime-env.d.ts.map +1 -1
  226. package/dist/utils/store-base.d.ts +62 -0
  227. package/dist/utils/store-base.d.ts.map +1 -0
  228. package/dist/utils/store-identity.d.ts +38 -3
  229. package/dist/utils/store-identity.d.ts.map +1 -1
  230. package/dist/vite/index.js +2 -2
  231. package/package.json +1 -1
  232. package/dist/BlogAuthorPage-X3I7KLML.js.map +0 -1
  233. package/dist/BlogCategoryPage-F3ORUZAF.js.map +0 -1
  234. package/dist/BlogPage-G7AOQDP2.js.map +0 -1
  235. package/dist/BlogSinglePage-VP4ZLQPA.js.map +0 -1
  236. package/dist/BlogTagPage-WCHB3VL2.js.map +0 -1
  237. package/dist/BrandsPage-MR3RNHNS.js.map +0 -1
  238. package/dist/Breadcrumb-QCWPUUEQ.js.map +0 -1
  239. package/dist/CartItem-M2FEFI23.js.map +0 -1
  240. package/dist/CartSummary-RND3CQYW.js.map +0 -1
  241. package/dist/CustomerLayout-B7HTCSMV.js.map +0 -1
  242. package/dist/LoyaltyPage-26NMNBJV.js.map +0 -1
  243. package/dist/MainMenu-4ZZEDUBZ.js.map +0 -1
  244. package/dist/MobileMenu-GFEOQWO6.js.map +0 -1
  245. package/dist/NotificationsPage-226QGY4Q.js.map +0 -1
  246. package/dist/OrderSinglePage-44VBTQQS.js.map +0 -1
  247. package/dist/OrdersPage-NUQUDEAK.js.map +0 -1
  248. package/dist/ProfilePage-K7ZEU6IF.js.map +0 -1
  249. package/dist/SeoCartWidget-6LY5YQKA.js.map +0 -1
  250. package/dist/SettingsPage-NDZAS5PQ.js.map +0 -1
  251. package/dist/ThankYouPage-WIHRO3DC.js.map +0 -1
  252. package/dist/WalletPage-YD4TKPGA.js.map +0 -1
  253. package/dist/WishlistPage-3UNTMS2B.js.map +0 -1
  254. package/dist/chunk-6XWMNQ52.js.map +0 -1
  255. package/dist/chunk-AZ5HAIYQ.js.map +0 -1
  256. package/dist/chunk-I2UBYEUG.js +0 -14
  257. package/dist/chunk-JBXTU5NM.js.map +0 -1
  258. package/dist/chunk-MLIJWD6B.js.map +0 -1
  259. package/dist/chunk-PNXUBS5X.js.map +0 -1
  260. package/dist/chunk-XLGVT7QF.js.map +0 -1
  261. package/dist/document-class-G34XZMVK.js +0 -25
  262. package/dist/navigation-D7QS3NK2.js.map +0 -1
  263. package/dist/not-found-6PX2EO7T.js.map +0 -1
@@ -1,30 +1,31 @@
1
- import { cart } from '../chunk-KFH3OBFW.js';
2
- import { loyalty } from '../chunk-ZNWNJZSM.js';
1
+ import { cart } from '../chunk-GXNQX4Z2.js';
2
+ import { loyalty } from '../chunk-EMKO3C2V.js';
3
3
  import { CartSkeleton } from '../chunk-N7CCSGZF.js';
4
- import '../chunk-3644MRQI.js';
5
- import '../chunk-QG2Q6HB5.js';
4
+ import '../chunk-L42W6YS3.js';
5
+ import '../chunk-P4DUWQU4.js';
6
6
  import { buildHreflangAlternates } from '../chunk-TZ3E5BN4.js';
7
- import '../chunk-CG3AM4DH.js';
8
- import '../chunk-XLJPUFN4.js';
9
- import { LazySeoCartWidget, LazyCartItem, LazyCartSummary } from '../chunk-I2UBYEUG.js';
10
- import '../chunk-G4M73JU5.js';
7
+ import '../chunk-WITIL2MK.js';
8
+ import '../chunk-CPQXPECC.js';
9
+ import { LazySeoCartWidget, LazyCartItem, LazyCartSummary } from '../chunk-HNSZ6VBK.js';
10
+ import '../chunk-UQRLBMIO.js';
11
11
  import '../chunk-342EPVXN.js';
12
- import '../chunk-PNXUBS5X.js';
13
- import '../chunk-UWWYR3UX.js';
12
+ import '../chunk-DTWFNS3F.js';
13
+ import '../chunk-65Z2ZDKZ.js';
14
14
  import '../chunk-JKIRRMBU.js';
15
15
  import '../chunk-2JV6WZ6O.js';
16
16
  import '../chunk-6IATCGID.js';
17
- import '../chunk-E5EH32L7.js';
17
+ import '../chunk-3MHDV5JS.js';
18
18
  import '../chunk-VVZNW5CB.js';
19
- import '../chunk-6KI2QCPL.js';
20
- import '../chunk-XLGVT7QF.js';
19
+ import '../chunk-JD4J2ZB6.js';
20
+ import '../chunk-JK77XRXR.js';
21
21
  import { RouteId } from '../chunk-MTONGOJD.js';
22
22
  import '../chunk-C5X6CVXC.js';
23
- import '../chunk-6MGDRMZM.js';
24
- import '../chunk-RIZOT5FN.js';
25
- import '../chunk-AZ5HAIYQ.js';
26
- import '../chunk-JBXTU5NM.js';
27
- import { getTwilightContext } from '../chunk-6XWMNQ52.js';
23
+ import '../chunk-QKIQ3K24.js';
24
+ import '../chunk-Z74NUTEI.js';
25
+ import '../chunk-O6XXHXC4.js';
26
+ import '../chunk-3FIWHGCZ.js';
27
+ import '../chunk-XTMHHLNK.js';
28
+ import { getTwilightContext } from '../chunk-PJWFEMBX.js';
28
29
  import '../chunk-TP3LCGE7.js';
29
30
  import '../chunk-Z653O7MX.js';
30
31
  import '../chunk-ZCH7W7DZ.js';
@@ -40,7 +41,7 @@ import '../chunk-YMVLYYLU.js';
40
41
  import '../chunk-RJPPO3ET.js';
41
42
  import { HookSlot } from '../chunk-Q7VWURUR.js';
42
43
  import '../chunk-GU2KUQVD.js';
43
- import { LazyBreadcrumb, LazyNoContent } from '../chunk-G6F5DCCP.js';
44
+ import { LazyBreadcrumb, LazyNoContent } from '../chunk-LKBWIN26.js';
44
45
  import '../chunk-AXW67SY7.js';
45
46
  import '../chunk-BYMOPN2S.js';
46
47
  import '../chunk-SKLEJJ6M.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/routes/cart/CartPage.tsx","../../src/routes/cart/loader.ts","../../src/routes/cart/index.tsx"],"names":[],"mappings":"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","file":"cart.js","sourcesContent":["import { useState, useEffect } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { SallaConditionalOffer } from '@salla.sa/twilight-components-react/conditional-offer';\nimport { SallaOffer } from '@salla.sa/twilight-components-react/offer';\nimport { SallaProductOptions } from '@salla.sa/twilight-components-react/product-options';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport type { CartPageProps } from './types';\nimport { Breadcrumb, NoContent } from '../../components/common';\nimport { CartItem, CartSummary, SeoCartWidget } from '../../components/cart';\nimport { useTwilight } from '../../providers/twilight-context';\nimport { CartSkeleton } from '../../skeleton';\nimport { loyalty } from '../../api/loyalty';\nimport { cart } from '../../api/cart';\n\nfunction CartPageContent({ page }: CartPageProps) {\n const { store } = useTwilight();\n const { t } = useTranslation();\n const { data: loyaltyPoints } = useQuery(loyalty.queries.points());\n\n const [cartId, setCartId] = useState<number | null>(null);\n\n useEffect(() => {\n window.salla?.cart.api.getCurrentCartId().then(setCartId);\n }, []);\n\n const { data: cartData } = useQuery({\n ...cart.queries.detail(cartId!),\n enabled: !!cartId,\n });\n\n const isLoading = cartId === null || !cartData;\n\n if (isLoading) {\n return <CartSkeleton />;\n }\n\n if (cartData.items.length === 0) {\n return (\n <div className=\"container\">\n <Breadcrumb page={page} />\n <NoContent\n icon=\"sicon-shopping-bag\"\n message={t('pages.cart.empty_cart', 'Your cart is empty')}\n actionLabel={t('common.elements.back_home', 'Back to Home')}\n actionUrl=\"/\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"container\">\n {/* Analytics — no visible UI, fires GTM checkout events */}\n <SeoCartWidget cart={cartData} />\n\n <Breadcrumb page={page} />\n <h1 className=\"sr-only\">{t('common.titles.cart', 'Cart')}</h1>\n <SallaConditionalOffer />\n\n <HookSlot name=\"cart:start\" />\n\n <div className=\"pt-5 flex flex-col items-start lg:flex-row pb-6 lg:pb-20\">\n <div className=\"main-content w-full lg:w-[calc(100%-384px)]\">\n <HookSlot name=\"cart:items.start\" context={{ cartItems: cartData.items }} />\n\n {cartData.items.map((item, index) => (\n <CartItem key={item.id} item={item} isFirst={index === 0} />\n ))}\n\n {cartData.options?.length > 0 && (\n <div className=\"cart-options\">\n {cartData.options.map((option) => (\n <form\n key={option.id}\n className=\"first:pt-5 relative\"\n onChange={(e) => window.salla?.form.onChange('cart.updateItem', e)}\n id={`item-${option.id}`}\n >\n <input type=\"hidden\" name=\"id\" value={option.id} />\n <input type=\"hidden\" name=\"quantity\" value={option.quantity} />\n {/* Twig: {% include 'pages.partials.product.options' with {product:product_option} %} */}\n {option.options && option.options.length > 0 && (\n <SallaProductOptions\n options={JSON.stringify(option.options)}\n productId={option.id}\n />\n )}\n </form>\n ))}\n </div>\n )}\n\n <SallaOffer />\n <HookSlot name=\"cart:items.end\" />\n </div>\n\n <CartSummary\n cart={cartData}\n applyCouponEnabled={store.settings?.cart?.apply_coupon_enabled}\n taxAmount={cartData.tax_amount}\n key={cartData.id}\n loyalty={cartData.loyalty}\n gift={cartData.gift}\n loyaltyPoints={loyaltyPoints ?? undefined}\n />\n </div>\n\n <HookSlot name=\"cart:end\" />\n </div>\n );\n}\n\nexport function CartPage(props: CartPageProps) {\n return <CartPageContent {...props} />;\n}\n","import type { CartPageProps } from './types';\nimport { getTwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\n/**\n * SSR-safe loader that returns only page metadata.\n * Cart data is fetched client-side via React Query since the cart ID\n * lives in localStorage (unavailable during SSR).\n */\nexport function cartLoader(): CartPageProps {\n const i18n = getTwilightContext().i18n;\n return {\n page: { slug: RouteId.CART, title: i18n.t('common.titles.cart') || 'Cart' },\n } as CartPageProps;\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport { CartPage } from './CartPage';\nimport { cartLoader } from './loader';\nimport type { CartPageProps } from './types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\nexport { CartPage } from './CartPage';\nexport { cartLoader } from './loader';\nexport type { CartPageProps } from './types';\n\nasync function loader(\n _ctx?: { locale?: string },\n extend?: (\n data: CartPageProps,\n ctx: { params: Record<string, never> }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<CartPageProps> {\n const data = cartLoader();\n\n if (extend) {\n const extra = extend(data, { params: {} });\n return { ...data, ...(extra instanceof Promise ? {} : extra) } as CartPageProps;\n }\n return data;\n}\n\nfunction head(ctx: TwilightContext, data: CartPageProps): HeadDescriptor {\n const base: HeadDescriptor = {\n title: data.page.title,\n description: data.page.description,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const Cart = { id: RouteId.CART, loader, head, Component: CartPage } as const;\n"]}
1
+ {"version":3,"sources":["../../src/routes/cart/CartPage.tsx","../../src/routes/cart/loader.ts","../../src/routes/cart/index.tsx"],"names":[],"mappings":"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","file":"cart.js","sourcesContent":["import { useState, useEffect } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { SallaConditionalOffer } from '@salla.sa/twilight-components-react/conditional-offer';\nimport { SallaOffer } from '@salla.sa/twilight-components-react/offer';\nimport { SallaProductOptions } from '@salla.sa/twilight-components-react/product-options';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport type { CartPageProps } from './types';\nimport { Breadcrumb, NoContent } from '../../components/common';\nimport { CartItem, CartSummary, SeoCartWidget } from '../../components/cart';\nimport { useTwilight } from '../../providers/twilight-context';\nimport { CartSkeleton } from '../../skeleton';\nimport { loyalty } from '../../api/loyalty';\nimport { cart } from '../../api/cart';\n\nfunction CartPageContent({ page }: CartPageProps) {\n const { store } = useTwilight();\n const { t } = useTranslation();\n const { data: loyaltyPoints } = useQuery(loyalty.queries.points());\n\n const [cartId, setCartId] = useState<number | null>(null);\n\n useEffect(() => {\n window.salla?.cart.api.getCurrentCartId().then(setCartId);\n }, []);\n\n const { data: cartData } = useQuery({\n ...cart.queries.detail(cartId!),\n enabled: !!cartId,\n });\n\n const isLoading = cartId === null || !cartData;\n\n if (isLoading) {\n return <CartSkeleton />;\n }\n\n if (cartData.items.length === 0) {\n return (\n <div className=\"container\">\n <Breadcrumb page={page} />\n <NoContent\n icon=\"sicon-shopping-bag\"\n message={t('pages.cart.empty_cart', 'Your cart is empty')}\n actionLabel={t('common.elements.back_home', 'Back to Home')}\n actionUrl=\"/\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"container\">\n {/* Analytics — no visible UI, fires GTM checkout events */}\n <SeoCartWidget cart={cartData} />\n\n <Breadcrumb page={page} />\n <h1 className=\"sr-only\">{t('common.titles.cart', 'Cart')}</h1>\n <SallaConditionalOffer />\n\n <HookSlot name=\"cart:start\" />\n\n <div className=\"pt-5 flex flex-col items-start lg:flex-row pb-6 lg:pb-20\">\n <div className=\"main-content w-full lg:w-[calc(100%-384px)]\">\n <HookSlot name=\"cart:items.start\" context={{ cartItems: cartData.items }} />\n\n {cartData.items.map((item, index) => (\n <CartItem key={item.id} item={item} isFirst={index === 0} />\n ))}\n\n {cartData.options?.length > 0 && (\n <div className=\"cart-options\">\n {cartData.options.map((option) => (\n <form\n key={option.id}\n className=\"first:pt-5 relative\"\n onChange={(e) => window.salla?.form.onChange('cart.updateItem', e)}\n id={`item-${option.id}`}\n >\n <input type=\"hidden\" name=\"id\" value={option.id} />\n <input type=\"hidden\" name=\"quantity\" value={option.quantity} />\n {/* Twig: {% include 'pages.partials.product.options' with {product:product_option} %} */}\n {option.options && option.options.length > 0 && (\n <SallaProductOptions\n options={JSON.stringify(option.options)}\n productId={option.id}\n />\n )}\n </form>\n ))}\n </div>\n )}\n\n <SallaOffer />\n <HookSlot name=\"cart:items.end\" />\n </div>\n\n <CartSummary\n cart={cartData}\n applyCouponEnabled={store.settings?.cart?.apply_coupon_enabled}\n taxAmount={cartData.tax_amount}\n key={cartData.id}\n loyalty={cartData.loyalty}\n gift={cartData.gift}\n loyaltyPoints={loyaltyPoints ?? undefined}\n />\n </div>\n\n <HookSlot name=\"cart:end\" />\n </div>\n );\n}\n\nexport function CartPage(props: CartPageProps) {\n return <CartPageContent {...props} />;\n}\n","import type { CartPageProps } from './types';\nimport { getTwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\n/**\n * SSR-safe loader that returns only page metadata.\n * Cart data is fetched client-side via React Query since the cart ID\n * lives in localStorage (unavailable during SSR).\n */\nexport function cartLoader(): CartPageProps {\n const i18n = getTwilightContext().i18n;\n return {\n page: { slug: RouteId.CART, title: i18n.t('common.titles.cart') || 'Cart' },\n } as CartPageProps;\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport { CartPage } from './CartPage';\nimport { cartLoader } from './loader';\nimport type { CartPageProps } from './types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\nexport { CartPage } from './CartPage';\nexport { cartLoader } from './loader';\nexport type { CartPageProps } from './types';\n\nasync function loader(\n _ctx?: { locale?: string },\n extend?: (\n data: CartPageProps,\n ctx: { params: Record<string, never> }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<CartPageProps> {\n const data = cartLoader();\n\n if (extend) {\n const extra = extend(data, { params: {} });\n return { ...data, ...(extra instanceof Promise ? {} : extra) } as CartPageProps;\n }\n return data;\n}\n\nfunction head(ctx: TwilightContext, data: CartPageProps): HeadDescriptor {\n const base: HeadDescriptor = {\n title: data.page.title,\n description: data.page.description,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const Cart = { id: RouteId.CART, loader, head, Component: CartPage } as const;\n"]}
@@ -1,26 +1,27 @@
1
- export { Home, HomeSkeleton, homeLoader } from '../chunk-3644MRQI.js';
2
- import '../chunk-QG2Q6HB5.js';
1
+ export { Home, HomeSkeleton, homeLoader } from '../chunk-L42W6YS3.js';
2
+ import '../chunk-P4DUWQU4.js';
3
3
  import '../chunk-TZ3E5BN4.js';
4
- export { DefaultHomeComponents, registerHomeComponentConfig, registerHomeComponents } from '../chunk-CG3AM4DH.js';
5
- import '../chunk-XLJPUFN4.js';
6
- import '../chunk-G4M73JU5.js';
4
+ export { DefaultHomeComponents, registerHomeComponentConfig, registerHomeComponents } from '../chunk-WITIL2MK.js';
5
+ import '../chunk-CPQXPECC.js';
6
+ import '../chunk-UQRLBMIO.js';
7
7
  import '../chunk-342EPVXN.js';
8
- import '../chunk-PNXUBS5X.js';
9
- import '../chunk-UWWYR3UX.js';
8
+ import '../chunk-DTWFNS3F.js';
9
+ import '../chunk-65Z2ZDKZ.js';
10
10
  import '../chunk-JKIRRMBU.js';
11
11
  import '../chunk-2JV6WZ6O.js';
12
12
  import '../chunk-6IATCGID.js';
13
- import '../chunk-E5EH32L7.js';
13
+ import '../chunk-3MHDV5JS.js';
14
14
  import '../chunk-VVZNW5CB.js';
15
- import '../chunk-6KI2QCPL.js';
16
- import '../chunk-XLGVT7QF.js';
15
+ import '../chunk-JD4J2ZB6.js';
16
+ import '../chunk-JK77XRXR.js';
17
17
  import '../chunk-MTONGOJD.js';
18
18
  import '../chunk-C5X6CVXC.js';
19
- import '../chunk-6MGDRMZM.js';
20
- import '../chunk-RIZOT5FN.js';
21
- import '../chunk-AZ5HAIYQ.js';
22
- import '../chunk-JBXTU5NM.js';
23
- import '../chunk-6XWMNQ52.js';
19
+ import '../chunk-QKIQ3K24.js';
20
+ import '../chunk-Z74NUTEI.js';
21
+ import '../chunk-O6XXHXC4.js';
22
+ import '../chunk-3FIWHGCZ.js';
23
+ import '../chunk-XTMHHLNK.js';
24
+ import '../chunk-PJWFEMBX.js';
24
25
  import '../chunk-TP3LCGE7.js';
25
26
  import '../chunk-Z653O7MX.js';
26
27
  import '../chunk-ZCH7W7DZ.js';
@@ -36,7 +37,7 @@ import '../chunk-YMVLYYLU.js';
36
37
  import '../chunk-RJPPO3ET.js';
37
38
  import '../chunk-Q7VWURUR.js';
38
39
  import '../chunk-GU2KUQVD.js';
39
- import '../chunk-G6F5DCCP.js';
40
+ import '../chunk-LKBWIN26.js';
40
41
  import '../chunk-AXW67SY7.js';
41
42
  import '../chunk-BYMOPN2S.js';
42
43
  import '../chunk-SKLEJJ6M.js';
@@ -1,7 +1,8 @@
1
- export { slugBrandRedirectLoader } from '../chunk-ME727LL4.js';
2
- import '../chunk-XLGVT7QF.js';
1
+ export { slugBrandRedirectLoader } from '../chunk-KV5R4LKM.js';
2
+ import '../chunk-JK77XRXR.js';
3
3
  import '../chunk-MTONGOJD.js';
4
- import '../chunk-6XWMNQ52.js';
4
+ import '../chunk-XTMHHLNK.js';
5
+ import '../chunk-PJWFEMBX.js';
5
6
  import '../chunk-TYNZ5B2B.js';
6
7
  export { FALLBACK_LOCALE, SUPPORTED_LOCALES, getLanguageInfo, isLocale } from '../chunk-T72DAX7R.js';
7
8
  import '../chunk-DF6FBKDN.js';
@@ -1,10 +1,11 @@
1
- import { loyalty } from '../chunk-ZNWNJZSM.js';
1
+ import { loyalty } from '../chunk-EMKO3C2V.js';
2
2
  import { buildHreflangAlternates } from '../chunk-TZ3E5BN4.js';
3
- import '../chunk-XLGVT7QF.js';
3
+ import '../chunk-JK77XRXR.js';
4
4
  import { RouteId } from '../chunk-MTONGOJD.js';
5
- import '../chunk-AZ5HAIYQ.js';
6
- import '../chunk-JBXTU5NM.js';
7
- import '../chunk-6XWMNQ52.js';
5
+ import '../chunk-O6XXHXC4.js';
6
+ import '../chunk-3FIWHGCZ.js';
7
+ import '../chunk-XTMHHLNK.js';
8
+ import '../chunk-PJWFEMBX.js';
8
9
  import '../chunk-T72DAX7R.js';
9
10
  import '../chunk-DF6FBKDN.js';
10
11
  import '../chunk-DGUM43GV.js';
@@ -18,7 +19,7 @@ async function loyaltyLoader() {
18
19
 
19
20
  // src/routes/loyalty/index.tsx
20
21
  var LazyLoyaltyPage = lazy(
21
- () => import('../LoyaltyPage-26NMNBJV.js').then((m) => ({ default: m.LoyaltyPage }))
22
+ () => import('../LoyaltyPage-C7FKYLIW.js').then((m) => ({ default: m.LoyaltyPage }))
22
23
  );
23
24
  var LoyaltyPage = LazyLoyaltyPage;
24
25
  async function loader(_ctx, extend) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/routes/loyalty/loader.ts","../../src/routes/loyalty/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;AAIA,eAAsB,aAAA,GAA2C;AAC/D,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,UAAA,EAAW;AACtC,EAAA,OAAO,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAO,IAAA,CAAK,IAAA,EAAK,EAAG,OAAA,EAAS,IAAA,EAAK;AAC5E;;;ACEA,IAAM,eAAA,GAAkB,IAAA;AAAA,EAAK,MAC3B,OAAO,4BAAe,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,WAAA,EAAY,CAAE;AAClE,CAAA;AAEO,IAAM,WAAA,GAAc;AAI3B,eAAe,MAAA,CACb,MACA,MAAA,EAI2B;AAC3B,EAAA,MAAM,IAAA,GAAO,MAAM,aAAA,EAAc;AAEjC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAM,EAAE,MAAA,EAAQ,IAAI,CAAA;AAC/C,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,GAAG,KAAA,EAAM;AAAA,EAC7B;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,IAAA,CAAK,KAAsB,IAAA,EAAwC;AAC1E,EAAA,MAAM,IAAA,GAAuB;AAAA,IAC3B,KAAA,EAAO,KAAK,IAAA,CAAK,KAAA;AAAA,IACjB,WAAA,EAAa,KAAK,IAAA,CAAK,WAAA;AAAA,IACvB,oBAAoB,uBAAA,CAAwB,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,SAAS,QAAQ;AAAA,GACjF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,OAAA,GAAU,EAAE,EAAA,EAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ,IAAA,EAAM,WAAW,eAAA","file":"loyalty.js","sourcesContent":["import { loyalty } from '../../api/loyalty';\nimport type { LoyaltyPageProps } from './types';\nimport { RouteId } from '../../router/route-ids';\n\nexport async function loyaltyLoader(): Promise<LoyaltyPageProps> {\n const data = await loyalty.getOrThrow();\n return { page: { slug: RouteId.LOYALTY, title: data.name }, loyalty: data };\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport { lazy } from 'react';\nimport { loyaltyLoader } from './loader';\nimport type { LoyaltyPageProps } from './types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\n// Lazy-load component for code-splitting\nconst LazyLoyaltyPage = lazy(() =>\n import('./LoyaltyPage').then((m) => ({ default: m.LoyaltyPage }))\n);\n\nexport const LoyaltyPage = LazyLoyaltyPage;\nexport { loyaltyLoader } from './loader';\nexport type { LoyaltyPageProps, LoyaltyPoint, LoyaltyPrize, LoyaltyPrizeItem } from './types';\n\nasync function loader(\n _ctx?: { locale?: string },\n extend?: (\n data: LoyaltyPageProps,\n ctx: { params: Record<string, never> }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<LoyaltyPageProps> {\n const data = await loyaltyLoader();\n\n if (extend) {\n const extra = await extend(data, { params: {} });\n return { ...data, ...extra } as LoyaltyPageProps;\n }\n return data;\n}\n\nfunction head(ctx: TwilightContext, data: LoyaltyPageProps): HeadDescriptor {\n const base: HeadDescriptor = {\n title: data.page.title,\n description: data.page.description,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const Loyalty = { id: RouteId.LOYALTY, loader, head, Component: LazyLoyaltyPage } as const;\n"]}
1
+ {"version":3,"sources":["../../src/routes/loyalty/loader.ts","../../src/routes/loyalty/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;AAIA,eAAsB,aAAA,GAA2C;AAC/D,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,UAAA,EAAW;AACtC,EAAA,OAAO,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAO,IAAA,CAAK,IAAA,EAAK,EAAG,OAAA,EAAS,IAAA,EAAK;AAC5E;;;ACEA,IAAM,eAAA,GAAkB,IAAA;AAAA,EAAK,MAC3B,OAAO,4BAAe,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,WAAA,EAAY,CAAE;AAClE,CAAA;AAEO,IAAM,WAAA,GAAc;AAI3B,eAAe,MAAA,CACb,MACA,MAAA,EAI2B;AAC3B,EAAA,MAAM,IAAA,GAAO,MAAM,aAAA,EAAc;AAEjC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAM,EAAE,MAAA,EAAQ,IAAI,CAAA;AAC/C,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,GAAG,KAAA,EAAM;AAAA,EAC7B;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,IAAA,CAAK,KAAsB,IAAA,EAAwC;AAC1E,EAAA,MAAM,IAAA,GAAuB;AAAA,IAC3B,KAAA,EAAO,KAAK,IAAA,CAAK,KAAA;AAAA,IACjB,WAAA,EAAa,KAAK,IAAA,CAAK,WAAA;AAAA,IACvB,oBAAoB,uBAAA,CAAwB,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,SAAS,QAAQ;AAAA,GACjF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,OAAA,GAAU,EAAE,EAAA,EAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ,IAAA,EAAM,WAAW,eAAA","file":"loyalty.js","sourcesContent":["import { loyalty } from '../../api/loyalty';\nimport type { LoyaltyPageProps } from './types';\nimport { RouteId } from '../../router/route-ids';\n\nexport async function loyaltyLoader(): Promise<LoyaltyPageProps> {\n const data = await loyalty.getOrThrow();\n return { page: { slug: RouteId.LOYALTY, title: data.name }, loyalty: data };\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport { lazy } from 'react';\nimport { loyaltyLoader } from './loader';\nimport type { LoyaltyPageProps } from './types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\n// Lazy-load component for code-splitting\nconst LazyLoyaltyPage = lazy(() =>\n import('./LoyaltyPage').then((m) => ({ default: m.LoyaltyPage }))\n);\n\nexport const LoyaltyPage = LazyLoyaltyPage;\nexport { loyaltyLoader } from './loader';\nexport type { LoyaltyPageProps, LoyaltyPoint, LoyaltyPrize, LoyaltyPrizeItem } from './types';\n\nasync function loader(\n _ctx?: { locale?: string },\n extend?: (\n data: LoyaltyPageProps,\n ctx: { params: Record<string, never> }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<LoyaltyPageProps> {\n const data = await loyaltyLoader();\n\n if (extend) {\n const extra = await extend(data, { params: {} });\n return { ...data, ...extra } as LoyaltyPageProps;\n }\n return data;\n}\n\nfunction head(ctx: TwilightContext, data: LoyaltyPageProps): HeadDescriptor {\n const base: HeadDescriptor = {\n title: data.page.title,\n description: data.page.description,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const Loyalty = { id: RouteId.LOYALTY, loader, head, Component: LazyLoyaltyPage } as const;\n"]}
@@ -1,10 +1,11 @@
1
- import { page } from '../chunk-TMR7TZMB.js';
1
+ import { page } from '../chunk-ICNOLZNT.js';
2
2
  import { buildHreflangAlternates } from '../chunk-TZ3E5BN4.js';
3
- import '../chunk-XLGVT7QF.js';
3
+ import '../chunk-JK77XRXR.js';
4
4
  import { RouteId } from '../chunk-MTONGOJD.js';
5
- import '../chunk-AZ5HAIYQ.js';
6
- import '../chunk-JBXTU5NM.js';
7
- import '../chunk-6XWMNQ52.js';
5
+ import '../chunk-O6XXHXC4.js';
6
+ import '../chunk-3FIWHGCZ.js';
7
+ import '../chunk-XTMHHLNK.js';
8
+ import '../chunk-PJWFEMBX.js';
8
9
  import '../chunk-T72DAX7R.js';
9
10
  import '../chunk-DF6FBKDN.js';
10
11
  import '../chunk-DGUM43GV.js';
@@ -27,7 +28,7 @@ async function pageSingleLoader({ params }) {
27
28
  }
28
29
 
29
30
  // src/routes/page/index.tsx
30
- var LazyPageSingle = lazy(() => import('../PageSingle-76O4HAYZ.js').then((m) => ({ default: m.PageSingle })));
31
+ var LazyPageSingle = lazy(() => import('../PageSingle-FHHC5QDA.js').then((m) => ({ default: m.PageSingle })));
31
32
  var PageSingleLazy = LazyPageSingle;
32
33
  async function loader(ctx, extend) {
33
34
  const data = await pageSingleLoader({ params: ctx.params });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/routes/page/loader.ts","../../src/routes/page/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;AAKA,eAAsB,gBAAA,CAAiB,EAAE,MAAA,EAAO,EAAmD;AACjG,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,WAAA,CAAY,OAAO,EAAE,CAAA;AAC7C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,MAAM,OAAA,CAAQ,WAAA;AAAA,MACd,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,OAAO,IAAA,CAAK,IAAA;AAAA,MACZ,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK;AAAA;AACnB,GACF;AACF;;;ACRA,IAAM,cAAA,GAAiB,IAAA,CAAK,MAAM,OAAO,2BAAc,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,UAAA,GAAa,CAAC,CAAA;AAE1F,IAAM,cAAA,GAAiB;AAI9B,eAAe,MAAA,CACb,KACA,MAAA,EAI0B;AAC1B,EAAA,MAAM,OAAO,MAAM,gBAAA,CAAiB,EAAE,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA;AAE1D,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA;AACpC,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,GAAG,KAAA,EAAM;AAAA,EAC7B;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,IAAA,CAAK,KAAsB,IAAA,EAAuC;AACzE,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,CAAK,KAAA;AACxB,EAAA,MAAM,cAAc,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,OAAA,CAAQ,YAAY,EAAE,CAAA;AAE7D,EAAA,MAAM,IAAA,GAAuB;AAAA,IAC3B,KAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,EAAW,KAAK,IAAA,CAAK,GAAA;AAAA,IACrB,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,SAAA;AAAA,MACN,KAAA;AAAA,MACA,WAAA;AAAA,MACA,GAAA,EAAK,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,aAAA,EAAe,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,cAAA;AAAA,MACrC,YAAA,EAAc,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY;AAAA,KACtC;AAAA,IACA,oBAAoB,uBAAA,CAAwB,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,SAAS,QAAQ;AAAA,GACjF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,UAAA,GAAa;AAAA,EACxB,IAAI,OAAA,CAAQ,WAAA;AAAA,EACZ,MAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA,EAAW;AACb","file":"page.js","sourcesContent":["import type { PageSingleProps } from './types';\nimport type { IdParams } from '../types';\nimport { page } from '../../api/page';\nimport { RouteId } from '../../router/route-ids';\n\nexport async function pageSingleLoader({ params }: { params: IdParams }): Promise<PageSingleProps> {\n const data = await page.findOrThrow(params.id);\n return {\n page: {\n slug: RouteId.PAGE_SINGLE,\n id: data.id,\n title: data.name,\n url: data.url,\n content: data.content,\n metadata: data.metadata,\n created_at: data.created_at,\n },\n };\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport { lazy } from 'react';\nimport { pageSingleLoader } from './loader';\nimport type { PageSingleProps } from './types';\nimport type { IdParams } from '../types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\n// Lazy-load component for code-splitting\nconst LazyPageSingle = lazy(() => import('./PageSingle').then((m) => ({ default: m.PageSingle })));\n\nexport const PageSingleLazy = LazyPageSingle;\nexport { pageSingleLoader } from './loader';\nexport type { PageSingleProps, StaticPage } from './types';\n\nasync function loader(\n ctx: { params: IdParams; locale?: string },\n extend?: (\n data: PageSingleProps,\n ctx: { params: IdParams }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<PageSingleProps> {\n const data = await pageSingleLoader({ params: ctx.params });\n\n if (extend) {\n const extra = await extend(data, ctx);\n return { ...data, ...extra } as PageSingleProps;\n }\n return data;\n}\n\nfunction head(ctx: TwilightContext, data: PageSingleProps): HeadDescriptor {\n const title = data.page.title;\n const description = data.page.content?.replace(/<[^>]+>/g, '');\n\n const base: HeadDescriptor = {\n title,\n description,\n canonical: data.page.url,\n openGraph: {\n type: 'article',\n title,\n description,\n url: data.page.url,\n publishedTime: data.page.created_at?.published_time,\n modifiedTime: data.page.created_at?.modified_time,\n },\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const PageSingle = {\n id: RouteId.PAGE_SINGLE,\n loader,\n head,\n Component: LazyPageSingle,\n} as const;\n"]}
1
+ {"version":3,"sources":["../../src/routes/page/loader.ts","../../src/routes/page/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;AAKA,eAAsB,gBAAA,CAAiB,EAAE,MAAA,EAAO,EAAmD;AACjG,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,WAAA,CAAY,OAAO,EAAE,CAAA;AAC7C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,MAAM,OAAA,CAAQ,WAAA;AAAA,MACd,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,OAAO,IAAA,CAAK,IAAA;AAAA,MACZ,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK;AAAA;AACnB,GACF;AACF;;;ACRA,IAAM,cAAA,GAAiB,IAAA,CAAK,MAAM,OAAO,2BAAc,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,UAAA,GAAa,CAAC,CAAA;AAE1F,IAAM,cAAA,GAAiB;AAI9B,eAAe,MAAA,CACb,KACA,MAAA,EAI0B;AAC1B,EAAA,MAAM,OAAO,MAAM,gBAAA,CAAiB,EAAE,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA;AAE1D,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA;AACpC,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,GAAG,KAAA,EAAM;AAAA,EAC7B;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,IAAA,CAAK,KAAsB,IAAA,EAAuC;AACzE,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,CAAK,KAAA;AACxB,EAAA,MAAM,cAAc,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,OAAA,CAAQ,YAAY,EAAE,CAAA;AAE7D,EAAA,MAAM,IAAA,GAAuB;AAAA,IAC3B,KAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,EAAW,KAAK,IAAA,CAAK,GAAA;AAAA,IACrB,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,SAAA;AAAA,MACN,KAAA;AAAA,MACA,WAAA;AAAA,MACA,GAAA,EAAK,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,aAAA,EAAe,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,cAAA;AAAA,MACrC,YAAA,EAAc,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY;AAAA,KACtC;AAAA,IACA,oBAAoB,uBAAA,CAAwB,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,SAAS,QAAQ;AAAA,GACjF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,UAAA,GAAa;AAAA,EACxB,IAAI,OAAA,CAAQ,WAAA;AAAA,EACZ,MAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA,EAAW;AACb","file":"page.js","sourcesContent":["import type { PageSingleProps } from './types';\nimport type { IdParams } from '../types';\nimport { page } from '../../api/page';\nimport { RouteId } from '../../router/route-ids';\n\nexport async function pageSingleLoader({ params }: { params: IdParams }): Promise<PageSingleProps> {\n const data = await page.findOrThrow(params.id);\n return {\n page: {\n slug: RouteId.PAGE_SINGLE,\n id: data.id,\n title: data.name,\n url: data.url,\n content: data.content,\n metadata: data.metadata,\n created_at: data.created_at,\n },\n };\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport { lazy } from 'react';\nimport { pageSingleLoader } from './loader';\nimport type { PageSingleProps } from './types';\nimport type { IdParams } from '../types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\n// Lazy-load component for code-splitting\nconst LazyPageSingle = lazy(() => import('./PageSingle').then((m) => ({ default: m.PageSingle })));\n\nexport const PageSingleLazy = LazyPageSingle;\nexport { pageSingleLoader } from './loader';\nexport type { PageSingleProps, StaticPage } from './types';\n\nasync function loader(\n ctx: { params: IdParams; locale?: string },\n extend?: (\n data: PageSingleProps,\n ctx: { params: IdParams }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<PageSingleProps> {\n const data = await pageSingleLoader({ params: ctx.params });\n\n if (extend) {\n const extra = await extend(data, ctx);\n return { ...data, ...extra } as PageSingleProps;\n }\n return data;\n}\n\nfunction head(ctx: TwilightContext, data: PageSingleProps): HeadDescriptor {\n const title = data.page.title;\n const description = data.page.content?.replace(/<[^>]+>/g, '');\n\n const base: HeadDescriptor = {\n title,\n description,\n canonical: data.page.url,\n openGraph: {\n type: 'article',\n title,\n description,\n url: data.page.url,\n publishedTime: data.page.created_at?.published_time,\n modifiedTime: data.page.created_at?.modified_time,\n },\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const PageSingle = {\n id: RouteId.PAGE_SINGLE,\n loader,\n head,\n Component: LazyPageSingle,\n} as const;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ProductListPage.d.ts","sourceRoot":"","sources":["../../../src/routes/product-listing/ProductListPage.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAOrD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,MAAM,EACN,KAAK,EACL,QAAQ,EACR,UAAU,EACV,OAAO,GACR,EAAE,qBAAqB,+BAqOvB"}
1
+ {"version":3,"file":"ProductListPage.d.ts","sourceRoot":"","sources":["../../../src/routes/product-listing/ProductListPage.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAOrD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,MAAM,EACN,KAAK,EACL,QAAQ,EACR,UAAU,EACV,OAAO,GACR,EAAE,qBAAqB,+BAwOvB"}
@@ -1,28 +1,29 @@
1
1
  import { sortOptions } from '../chunk-6Z4MOC4S.js';
2
- import { category } from '../chunk-ULQMJUO2.js';
3
- import { brand } from '../chunk-2AGMXJVP.js';
2
+ import { category } from '../chunk-WHOWSSX4.js';
3
+ import { brand } from '../chunk-IH3TQ3LD.js';
4
4
  import { buildHreflangAlternates } from '../chunk-TZ3E5BN4.js';
5
- import { LazyTestimonials } from '../chunk-CG3AM4DH.js';
6
- import { product } from '../chunk-XLJPUFN4.js';
5
+ import { LazyTestimonials } from '../chunk-WITIL2MK.js';
6
+ import { product } from '../chunk-CPQXPECC.js';
7
7
  import { Drawer } from '../chunk-6TKIUG5C.js';
8
- import { ProductCard } from '../chunk-G4M73JU5.js';
8
+ import { ProductCard } from '../chunk-UQRLBMIO.js';
9
9
  import '../chunk-342EPVXN.js';
10
- import { useStore } from '../chunk-PNXUBS5X.js';
11
- import '../chunk-UWWYR3UX.js';
10
+ import { useStore } from '../chunk-DTWFNS3F.js';
11
+ import '../chunk-65Z2ZDKZ.js';
12
12
  import '../chunk-JKIRRMBU.js';
13
13
  import '../chunk-2JV6WZ6O.js';
14
14
  import '../chunk-6IATCGID.js';
15
- import '../chunk-E5EH32L7.js';
15
+ import '../chunk-3MHDV5JS.js';
16
16
  import '../chunk-VVZNW5CB.js';
17
- import '../chunk-6KI2QCPL.js';
18
- import { notFound, useNavigate, useLocation } from '../chunk-XLGVT7QF.js';
17
+ import '../chunk-JD4J2ZB6.js';
18
+ import { notFound, useNavigate, useLocation } from '../chunk-JK77XRXR.js';
19
19
  import { RouteId } from '../chunk-MTONGOJD.js';
20
20
  import '../chunk-C5X6CVXC.js';
21
- import '../chunk-6MGDRMZM.js';
22
- import '../chunk-RIZOT5FN.js';
23
- import '../chunk-AZ5HAIYQ.js';
24
- import '../chunk-JBXTU5NM.js';
25
- import { getTwilightContext } from '../chunk-6XWMNQ52.js';
21
+ import '../chunk-QKIQ3K24.js';
22
+ import '../chunk-Z74NUTEI.js';
23
+ import '../chunk-O6XXHXC4.js';
24
+ import '../chunk-3FIWHGCZ.js';
25
+ import '../chunk-XTMHHLNK.js';
26
+ import { getTwilightContext } from '../chunk-PJWFEMBX.js';
26
27
  import '../chunk-TP3LCGE7.js';
27
28
  import '../chunk-Z653O7MX.js';
28
29
  import '../chunk-ZCH7W7DZ.js';
@@ -38,7 +39,7 @@ import '../chunk-YMVLYYLU.js';
38
39
  import '../chunk-RJPPO3ET.js';
39
40
  import { HookSlot } from '../chunk-Q7VWURUR.js';
40
41
  import '../chunk-GU2KUQVD.js';
41
- import { LazyBreadcrumb, Image, LazyNoContent, ProductCardSkeleton, LazyRenderWhenVisible } from '../chunk-G6F5DCCP.js';
42
+ import { LazyBreadcrumb, Image, LazyNoContent, ProductCardSkeleton, LazyRenderWhenVisible } from '../chunk-LKBWIN26.js';
42
43
  import '../chunk-AXW67SY7.js';
43
44
  import '../chunk-BYMOPN2S.js';
44
45
  import '../chunk-SKLEJJ6M.js';
@@ -324,12 +325,12 @@ function ProductListPage({
324
325
  const handleSortChange = useCallback(
325
326
  (event) => {
326
327
  const newSort = event.target.value;
327
- const url = new URL(window.location.href);
328
- url.searchParams.set("sort", newSort);
329
- url.searchParams.delete("page");
330
- navigate(url.pathname + url.search);
328
+ const params = new URLSearchParams(location.searchStr);
329
+ params.set("sort", newSort);
330
+ params.delete("page");
331
+ navigate(`${location.pathname}?${params.toString()}`);
331
332
  },
332
- [navigate]
333
+ [navigate, location.pathname, location.searchStr]
333
334
  );
334
335
  const listKey = source.value ?? source.type;
335
336
  const nextCursorRef = useRef(pagination?.next ?? null);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/routes/product-listing/loader.ts","../../src/routes/product-listing/ProductListPage.tsx","../../src/routes/product-listing/index.tsx"],"names":["i18n","brand","category"],"mappings":"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","file":"product-listing.js","sourcesContent":["import type { ProductListLoaderData, ProductListLoaderContext, ProductListSource } from './types';\nimport type { ProductsListSource } from '../../api/product';\nimport { category } from '../../api/category';\nimport { product } from '../../api/product';\nimport { brand } from '../../api/brands';\nimport { notFound } from '../../providers/NavigationProvider';\nimport { getTwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\nconst DEFAULT_SORT = 'ourSuggest';\n\nconst SOURCE_TO_API: Record<ProductListSource, ProductsListSource> = {\n categories: 'categories',\n latest: 'latest',\n sales: 'sales',\n offers: 'offers',\n search: 'search',\n tags: 'tags',\n brands: 'brands',\n};\n\nconst SOURCE_TITLE_KEY: Record<'latest' | 'sales' | 'offers', string> = {\n latest: 'blocks.home.latest_products',\n sales: 'common.titles.most_sales',\n offers: 'blocks.header.offers',\n};\n\nconst SOURCE_SLUG: Record<'latest' | 'sales' | 'offers', string> = {\n latest: 'latest-products',\n sales: 'most-sales-products',\n offers: 'offers',\n};\n\nexport async function productListLoader(\n ctx: ProductListLoaderContext\n): Promise<ProductListLoaderData> {\n const { params, search } = ctx;\n const cursor = search?.page ? String(search.page) : undefined;\n const sort = search?.sort ?? DEFAULT_SORT;\n\n const sourceType = params.source ?? (params.id ? 'categories' : undefined);\n\n if (!sourceType) {\n throw new Error('ProductList loader requires source type');\n }\n\n if (sourceType === 'categories' && params.id) {\n return loadCategoryProducts(params.id, cursor, sort);\n }\n\n if (sourceType === 'search') {\n const keyword = (search?.q ?? params.keyword ?? '').trim();\n return loadSearchProducts(keyword, cursor, sort);\n }\n\n if (sourceType === 'tags' && params.id) {\n return loadTagProducts(params.id, cursor, sort);\n }\n\n if (sourceType === 'brands' && params.id) {\n return loadBrandProducts(params.id, cursor, sort);\n }\n\n if (sourceType === 'latest' || sourceType === 'sales' || sourceType === 'offers') {\n return loadStaticProducts(\n sourceType as 'latest' | 'sales' | 'offers',\n params.title ?? '',\n params.slug ?? '',\n cursor,\n sort\n );\n }\n\n throw new Error(`Unknown source type: ${sourceType}`);\n}\n\n// ============================================================================\n// Source-Specific Loaders\n// ============================================================================\n\nasync function loadCategoryProducts(\n id: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n const { queryClient, i18n } = getTwilightContext();\n let categoryData, productsResult;\n try {\n [categoryData, productsResult] = await Promise.all([\n queryClient.fetchQuery(category.queries.detail(id)),\n queryClient.fetchQuery(\n product.queries.list({\n source: 'categories',\n sourceValue: id,\n cursor,\n sort,\n filterable: true,\n })\n ),\n ]);\n } catch {\n throw notFound();\n }\n\n if (!categoryData) throw notFound();\n\n return {\n page: {\n slug: RouteId.PRODUCT_INDEX,\n id,\n title: categoryData.name,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: categoryData.name, url: categoryData.url },\n ],\n },\n source: { type: 'categories', value: id, entity: categoryData },\n query: { sort, filters: true },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n filters: productsResult.filters,\n };\n}\n\nasync function loadSearchProducts(\n keyword: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n if (!keyword) {\n const { i18n } = getTwilightContext();\n return {\n page: {\n slug: RouteId.SEARCH,\n title: i18n.t('common.titles.search') || 'Search Results',\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: i18n.t('common.titles.search') || 'Search Results', url: '/search' },\n ],\n },\n source: { type: 'search', value: '' },\n query: { sort, filters: true },\n products: [],\n pagination: { next: null },\n };\n }\n\n const { queryClient, i18n } = getTwilightContext();\n const productsResult = await queryClient.fetchQuery(\n product.queries.list({\n source: 'search',\n sourceValue: keyword,\n cursor,\n sort,\n filterable: true,\n })\n );\n\n return {\n page: {\n slug: RouteId.SEARCH,\n title: keyword,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: keyword, url: '/search' },\n ],\n },\n source: { type: 'search', value: keyword },\n query: { sort, filters: true },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n filters: productsResult.filters,\n };\n}\n\nasync function loadTagProducts(\n id: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n const { queryClient, i18n } = getTwilightContext();\n const productsResult = await queryClient.fetchQuery(\n product.queries.list({\n source: 'tags',\n sourceValue: id,\n cursor,\n sort,\n })\n );\n\n const tagFromProduct = productsResult.items[0]?.tags?.find((t) => String(t.id) === id);\n if (!tagFromProduct) throw notFound();\n\n const tag = { id: Number(tagFromProduct.id), name: tagFromProduct.name, url: tagFromProduct.url };\n\n return {\n page: {\n slug: RouteId.PRODUCT_INDEX_TAG,\n id,\n title: tag.name,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: tag.name, url: tag.url },\n ],\n },\n source: { type: 'tags', value: id, entity: tag },\n query: { sort, filters: false },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n };\n}\n\nasync function loadBrandProducts(\n id: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n const { queryClient, i18n } = getTwilightContext();\n let brandData, productsResult;\n try {\n [brandData, productsResult] = await Promise.all([\n queryClient.fetchQuery(brand.queries.detail(id)),\n queryClient.fetchQuery(\n product.queries.list({\n source: 'brands',\n sourceValue: id,\n cursor,\n sort,\n })\n ),\n ]);\n } catch {\n throw notFound();\n }\n\n if (!brandData) throw notFound();\n\n return {\n page: {\n slug: RouteId.BRANDS_INDEX,\n id,\n title: brandData.name,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: brandData.name, url: brandData.url },\n ],\n },\n source: { type: 'brands', value: id, entity: brandData },\n query: { sort, filters: false },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n };\n}\n\nconst SOURCE_ROUTE_ID: Record<'latest' | 'sales' | 'offers', string> = {\n latest: RouteId.PRODUCT_INDEX_LATEST,\n sales: RouteId.PRODUCT_INDEX_SALES,\n offers: RouteId.PRODUCT_INDEX_OFFERS,\n};\n\nasync function loadStaticProducts(\n source: 'latest' | 'sales' | 'offers',\n title: string,\n slug: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n const { queryClient, i18n } = getTwilightContext();\n const resolvedTitle = title || i18n.t(SOURCE_TITLE_KEY[source]);\n const resolvedSlug = slug || SOURCE_SLUG[source];\n const productsResult = await queryClient.fetchQuery(\n product.queries.list({\n source: SOURCE_TO_API[source],\n cursor,\n sort,\n })\n );\n\n return {\n page: {\n slug: SOURCE_ROUTE_ID[source],\n title: resolvedTitle,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: resolvedTitle, url: `/${resolvedSlug}` },\n ],\n },\n source: { type: source },\n query: { sort, filters: false },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n };\n}\n","import { useState, useRef, useEffect, useMemo, useCallback } from 'react';\nimport { HookSlot, useStore } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useNavigate, useLocation } from '../../providers/NavigationProvider';\nimport { sortOptions } from '../../utils/sort-options';\nimport { Drawer } from '../../components/drawer';\nimport { Breadcrumb } from '../../components/common';\nimport { SallaFilters } from '@salla.sa/twilight-components-react/filters';\nimport { ItemsList, ReviewItemSkeleton } from '@salla.sa/twilight-components-react';\nimport { Testimonials } from '../../components/home';\nimport { ProductCard } from '../../components/product';\nimport { NoContent, ProductCardSkeleton, Image, RenderWhenVisible } from '../../components/common';\nimport { product } from '../../api/product';\nimport type { ProductListLoaderData } from './types';\nimport type { Brand } from '../brands/types';\nimport type { Product } from '../../types';\n\n/** 3-col + 288px sidebar from md; 3-col of the full container below md. */\nconst FILTERED_PRODUCT_IMAGE_SIZES = '(min-width: 768px) 25vw, 33vw';\n\n/**\n * Product List Page - Unified component for all product listing pages\n *\n * Handles:\n * - Category pages (with filters, category entity, testimonials)\n * - Search pages (keyword display, product count)\n * - Tag pages (tag entity)\n * - Brand pages (brand entity with banner/logo)\n * - Static listings (latest, sales, offers)\n */\nexport function ProductListPage({\n page,\n source,\n query,\n products,\n pagination,\n filters,\n}: ProductListLoaderData) {\n const { t } = useTranslation();\n const store = useStore();\n const navigate = useNavigate();\n // Sort is now SSR-driven, no local state needed\n const selectedSort = query.sort;\n const [filtersOpen, setFiltersOpen] = useState(false);\n\n // Determine filters visibility\n const showFilters = query.filters && store?.settings?.product?.filters;\n // const isSearch = source.type === 'search';\n const isBrand = source.type === 'brands';\n const brand = isBrand ? (source.entity as Brand | undefined) : null;\n\n // Generate sort options with translations\n const sortOptionsWithTrans = useMemo(() => sortOptions(selectedSort, t), [selectedSort, t]);\n\n // Get location from hook for consistent URL handling\n const location = useLocation();\n\n // Listen for filters changed event to close drawer\n useEffect(() => {\n const handleFiltersChanged = () => setFiltersOpen(false);\n const sdk = window.salla;\n if (typeof sdk === 'undefined') return;\n\n sdk.event.on('salla-filters::changed', handleFiltersChanged);\n\n return () => {\n sdk.event.off('salla-filters::changed', handleFiltersChanged);\n };\n }, []);\n\n // Handle sort change - use client-side navigation to trigger route loader re-run\n const handleSortChange = useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newSort = event.target.value;\n\n const url = new URL(window.location.href);\n url.searchParams.set('sort', newSort);\n url.searchParams.delete('page'); // clear any cursor token from URL on sort change\n\n // Use client-side navigation to trigger route loader re-execution (SSR-like)\n navigate(url.pathname + url.search);\n },\n [navigate]\n );\n\n // Key for remounting products list\n const listKey = source.value ?? source.type;\n\n // Track cursor for the next page — initialized from SSR pagination response.\n // On sort change the key prop remounts ItemsList and this effect resets the cursor.\n const nextCursorRef = useRef<string | null>(pagination?.next ?? null);\n useEffect(() => {\n nextCursorRef.current = pagination?.next ?? null;\n }, [pagination?.next]);\n\n const loader = useCallback(async () => {\n const nextUrl = nextCursorRef.current;\n // Extract the cursor token from the next URL provided by the previous response\n const cursorMatch = nextUrl?.match(/[?&]cursor=([^&]+)/);\n const cursor = cursorMatch ? decodeURIComponent(cursorMatch[1]) : (nextUrl ?? undefined);\n\n const result = await product.list({\n source: source.type,\n sourceValue: source.value,\n ...(cursor && { cursor }),\n sort: selectedSort,\n });\n\n nextCursorRef.current = result.next;\n\n return result;\n }, [source.type, source.value, selectedSort]);\n\n return (\n <div key={listKey} className=\"container px-2.5 ms:px-5 mb-10\">\n <Breadcrumb page={page} />\n\n {isBrand && brand && (\n <>\n <Image\n width={1200}\n height={300}\n className=\"w-full max-h-[300px] object-cover rounded-md bg-gray-100\"\n src={brand.banner || undefined}\n alt={brand.name}\n priority\n />\n <header className=\"flex flex-col md:flex-row items-center md:items-start text-center rtl:md:text-right ltr:md:text-left mt-2 mb-8\">\n <Image\n className=\"rounded-md w-40 h-24 object-contain shadow-md p-4 bg-white shrink-0\"\n src={brand.logo || undefined}\n alt={brand.name}\n aspectRatio=\"5/3\"\n />\n <div className=\"px-5 pt-3 rtl:text-right\">\n <h1 className=\"text-2xl font-bold mb-1\">{brand.name}</h1>\n {brand.description && (\n <p\n className=\"text-base text-gray-500 font-medium\"\n dangerouslySetInnerHTML={{ __html: brand.description }}\n />\n )}\n </div>\n </header>\n </>\n )}\n\n <HookSlot name=\"product:list.start\" />\n\n <div className={showFilters ? 'md:grid md:grid-cols-[288px_1fr] gap-8' : ''}>\n {/* <FiltersSkeleton></FiltersSkeleton> */}\n {showFilters && (\n <SallaFilters\n id=\"filters-menu\"\n className=\"hidden md:block lg:sticky lg:top-20\"\n filters={filters as any}\n />\n )}\n\n <div className=\"min-w-0\">\n <div className=\"mb-4 sm:mb-6 flex justify-between items-center\">\n <h1 className=\"font-bold text-xl rtl:pl-3 ltr:pr-3\" id=\"page-main-title\">\n {isBrand ? t('common.titles.products') : page.title}\n </h1>\n\n <div className=\"flex items-center space-x-2 rtl:space-x-reverse\">\n {showFilters && (\n <button\n type=\"button\"\n onClick={() => setFiltersOpen(true)}\n className=\"filters-trigger bg-border-color text-primary lg:hidden p-2 rounded\"\n >\n <i className=\"sicon-filter text-gray-text text-2xl\" />\n </button>\n )}\n\n {sortOptionsWithTrans.length > 0 && (\n <div className=\"flex items-center\">\n <label\n className=\"hidden sm:block rtl:ml-3 ltr:mr-3 whitespace-nowrap\"\n htmlFor=\"product-sort\"\n >\n {t('pages.categories.sorting', 'Sort By')}\n </label>\n <select\n id=\"product-sort\"\n className=\"form-input pt-0 pb-1 rtl:md:pl-10 ltr:md:pr-10\"\n value={selectedSort}\n onChange={handleSortChange}\n >\n {sortOptionsWithTrans.map((option) => (\n <option key={option.id} value={option.id}>\n {option.name}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n </div>\n\n <HookSlot name=\"product:list.items.start\" />\n\n <div className=\"flex min-h-screen\">\n <ItemsList<Product>\n key={`${listKey}-${selectedSort}`}\n resetKey={`${listKey}-${selectedSort}`}\n items={products}\n loader={loader}\n mode={pagination?.next ? 'infinite' : 'static'}\n pageUrl={location.pathname + location.searchStr}\n className=\"s-products-list flex-1 min-w-0\"\n itemsClassName={`s-products-list-wrapper s-products-list-vertical-cards${showFilters ? ' s-products-list-with-filters' : ''}`}\n skeleton={<ProductCardSkeleton />}\n skeletonType=\"item\"\n skeletonCount={12}\n empty={\n <NoContent\n icon=\"sicon-shopping-bag\"\n message={t('pages.categories.no_products', 'No products found in this category')}\n />\n }\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) =>\n items.map((prod, idx) => (\n <ProductCard\n key={prod.id}\n product={prod}\n index={idx}\n sizes={showFilters ? FILTERED_PRODUCT_IMAGE_SIZES : undefined}\n />\n ))\n }\n </ItemsList>\n </div>\n\n <HookSlot name=\"product:list.items.end\" />\n </div>\n </div>\n\n {showFilters && (\n <Drawer isOpen={filtersOpen} onClose={() => setFiltersOpen(false)} size=\"md\">\n <div className=\"p-4\">\n <div className=\"flex justify-between items-center mb-4\">\n <h3 className=\"font-bold text-lg\">{t('pages.categories.filters', 'Filters')}</h3>\n <button\n type=\"button\"\n onClick={() => setFiltersOpen(false)}\n className=\"btn--close-sm sicon-cancel text-gray-500\"\n />\n </div>\n <SallaFilters id=\"filters-menu-mobile\" filters={filters as any} />\n </div>\n </Drawer>\n )}\n\n {source.type === 'categories' && store?.settings?.category?.testimonial_enabled && (\n <RenderWhenVisible placeholder={<ReviewItemSkeleton />}>\n <Testimonials data={{}} />\n </RenderWhenVisible>\n )}\n\n <HookSlot name=\"product:list.end\" />\n </div>\n );\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport { productListLoader } from './loader';\nimport type { ProductListLoaderData, ProductListTag, Category } from './types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\nimport { ProductListPage } from './ProductListPage';\n\nexport function head(ctx: TwilightContext, data: ProductListLoaderData): HeadDescriptor {\n const entity = data.source.entity;\n const category = data.source.type === 'categories' ? (entity as Category | undefined) : undefined;\n const tag = data.source.type === 'tags' ? (entity as ProductListTag | undefined) : undefined;\n\n const canonical = category?.url ?? tag?.url;\n const title = category?.name ?? tag?.name ?? data.page.title;\n const image = category?.image ?? undefined;\n\n const base: HeadDescriptor = {\n title,\n description: `Browse ${title}`,\n canonical,\n openGraph: {\n type: 'website',\n title,\n description: `Browse ${title}`,\n images: image,\n url: canonical,\n },\n twitter: {\n card: 'summary_large_image',\n title,\n description: `Browse ${title}`,\n images: image,\n },\n alternateLanguages: buildHreflangAlternates(ctx.settings, canonical ?? ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const ProductListing = {\n id: RouteId.PRODUCT_INDEX,\n loader: productListLoader,\n head,\n Component: ProductListPage,\n} as const;\n\nexport { ProductListPage };\nexport { productListLoader };\n\nexport type {\n ProductListLoaderData,\n ProductListLoaderParams,\n ProductListLoaderContext,\n ProductListSource,\n ProductListTag,\n ProductListEntity,\n ProductListPageMeta,\n ProductListSourceConfig,\n ProductListQuery,\n CategoryPageProps,\n} from './types';\n"]}
1
+ {"version":3,"sources":["../../src/routes/product-listing/loader.ts","../../src/routes/product-listing/ProductListPage.tsx","../../src/routes/product-listing/index.tsx"],"names":["i18n","brand","category"],"mappings":"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","file":"product-listing.js","sourcesContent":["import type { ProductListLoaderData, ProductListLoaderContext, ProductListSource } from './types';\nimport type { ProductsListSource } from '../../api/product';\nimport { category } from '../../api/category';\nimport { product } from '../../api/product';\nimport { brand } from '../../api/brands';\nimport { notFound } from '../../providers/NavigationProvider';\nimport { getTwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\nconst DEFAULT_SORT = 'ourSuggest';\n\nconst SOURCE_TO_API: Record<ProductListSource, ProductsListSource> = {\n categories: 'categories',\n latest: 'latest',\n sales: 'sales',\n offers: 'offers',\n search: 'search',\n tags: 'tags',\n brands: 'brands',\n};\n\nconst SOURCE_TITLE_KEY: Record<'latest' | 'sales' | 'offers', string> = {\n latest: 'blocks.home.latest_products',\n sales: 'common.titles.most_sales',\n offers: 'blocks.header.offers',\n};\n\nconst SOURCE_SLUG: Record<'latest' | 'sales' | 'offers', string> = {\n latest: 'latest-products',\n sales: 'most-sales-products',\n offers: 'offers',\n};\n\nexport async function productListLoader(\n ctx: ProductListLoaderContext\n): Promise<ProductListLoaderData> {\n const { params, search } = ctx;\n const cursor = search?.page ? String(search.page) : undefined;\n const sort = search?.sort ?? DEFAULT_SORT;\n\n const sourceType = params.source ?? (params.id ? 'categories' : undefined);\n\n if (!sourceType) {\n throw new Error('ProductList loader requires source type');\n }\n\n if (sourceType === 'categories' && params.id) {\n return loadCategoryProducts(params.id, cursor, sort);\n }\n\n if (sourceType === 'search') {\n const keyword = (search?.q ?? params.keyword ?? '').trim();\n return loadSearchProducts(keyword, cursor, sort);\n }\n\n if (sourceType === 'tags' && params.id) {\n return loadTagProducts(params.id, cursor, sort);\n }\n\n if (sourceType === 'brands' && params.id) {\n return loadBrandProducts(params.id, cursor, sort);\n }\n\n if (sourceType === 'latest' || sourceType === 'sales' || sourceType === 'offers') {\n return loadStaticProducts(\n sourceType as 'latest' | 'sales' | 'offers',\n params.title ?? '',\n params.slug ?? '',\n cursor,\n sort\n );\n }\n\n throw new Error(`Unknown source type: ${sourceType}`);\n}\n\n// ============================================================================\n// Source-Specific Loaders\n// ============================================================================\n\nasync function loadCategoryProducts(\n id: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n const { queryClient, i18n } = getTwilightContext();\n let categoryData, productsResult;\n try {\n [categoryData, productsResult] = await Promise.all([\n queryClient.fetchQuery(category.queries.detail(id)),\n queryClient.fetchQuery(\n product.queries.list({\n source: 'categories',\n sourceValue: id,\n cursor,\n sort,\n filterable: true,\n })\n ),\n ]);\n } catch {\n throw notFound();\n }\n\n if (!categoryData) throw notFound();\n\n return {\n page: {\n slug: RouteId.PRODUCT_INDEX,\n id,\n title: categoryData.name,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: categoryData.name, url: categoryData.url },\n ],\n },\n source: { type: 'categories', value: id, entity: categoryData },\n query: { sort, filters: true },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n filters: productsResult.filters,\n };\n}\n\nasync function loadSearchProducts(\n keyword: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n if (!keyword) {\n const { i18n } = getTwilightContext();\n return {\n page: {\n slug: RouteId.SEARCH,\n title: i18n.t('common.titles.search') || 'Search Results',\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: i18n.t('common.titles.search') || 'Search Results', url: '/search' },\n ],\n },\n source: { type: 'search', value: '' },\n query: { sort, filters: true },\n products: [],\n pagination: { next: null },\n };\n }\n\n const { queryClient, i18n } = getTwilightContext();\n const productsResult = await queryClient.fetchQuery(\n product.queries.list({\n source: 'search',\n sourceValue: keyword,\n cursor,\n sort,\n filterable: true,\n })\n );\n\n return {\n page: {\n slug: RouteId.SEARCH,\n title: keyword,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: keyword, url: '/search' },\n ],\n },\n source: { type: 'search', value: keyword },\n query: { sort, filters: true },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n filters: productsResult.filters,\n };\n}\n\nasync function loadTagProducts(\n id: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n const { queryClient, i18n } = getTwilightContext();\n const productsResult = await queryClient.fetchQuery(\n product.queries.list({\n source: 'tags',\n sourceValue: id,\n cursor,\n sort,\n })\n );\n\n const tagFromProduct = productsResult.items[0]?.tags?.find((t) => String(t.id) === id);\n if (!tagFromProduct) throw notFound();\n\n const tag = { id: Number(tagFromProduct.id), name: tagFromProduct.name, url: tagFromProduct.url };\n\n return {\n page: {\n slug: RouteId.PRODUCT_INDEX_TAG,\n id,\n title: tag.name,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: tag.name, url: tag.url },\n ],\n },\n source: { type: 'tags', value: id, entity: tag },\n query: { sort, filters: false },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n };\n}\n\nasync function loadBrandProducts(\n id: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n const { queryClient, i18n } = getTwilightContext();\n let brandData, productsResult;\n try {\n [brandData, productsResult] = await Promise.all([\n queryClient.fetchQuery(brand.queries.detail(id)),\n queryClient.fetchQuery(\n product.queries.list({\n source: 'brands',\n sourceValue: id,\n cursor,\n sort,\n })\n ),\n ]);\n } catch {\n throw notFound();\n }\n\n if (!brandData) throw notFound();\n\n return {\n page: {\n slug: RouteId.BRANDS_INDEX,\n id,\n title: brandData.name,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: brandData.name, url: brandData.url },\n ],\n },\n source: { type: 'brands', value: id, entity: brandData },\n query: { sort, filters: false },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n };\n}\n\nconst SOURCE_ROUTE_ID: Record<'latest' | 'sales' | 'offers', string> = {\n latest: RouteId.PRODUCT_INDEX_LATEST,\n sales: RouteId.PRODUCT_INDEX_SALES,\n offers: RouteId.PRODUCT_INDEX_OFFERS,\n};\n\nasync function loadStaticProducts(\n source: 'latest' | 'sales' | 'offers',\n title: string,\n slug: string,\n cursor: string | undefined,\n sort: string\n): Promise<ProductListLoaderData> {\n const { queryClient, i18n } = getTwilightContext();\n const resolvedTitle = title || i18n.t(SOURCE_TITLE_KEY[source]);\n const resolvedSlug = slug || SOURCE_SLUG[source];\n const productsResult = await queryClient.fetchQuery(\n product.queries.list({\n source: SOURCE_TO_API[source],\n cursor,\n sort,\n })\n );\n\n return {\n page: {\n slug: SOURCE_ROUTE_ID[source],\n title: resolvedTitle,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: resolvedTitle, url: `/${resolvedSlug}` },\n ],\n },\n source: { type: source },\n query: { sort, filters: false },\n products: productsResult.items,\n pagination: {\n next: productsResult.next,\n },\n };\n}\n","import { useState, useRef, useEffect, useMemo, useCallback } from 'react';\nimport { HookSlot, useStore } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useNavigate, useLocation } from '../../providers/NavigationProvider';\nimport { sortOptions } from '../../utils/sort-options';\nimport { Drawer } from '../../components/drawer';\nimport { Breadcrumb } from '../../components/common';\nimport { SallaFilters } from '@salla.sa/twilight-components-react/filters';\nimport { ItemsList, ReviewItemSkeleton } from '@salla.sa/twilight-components-react';\nimport { Testimonials } from '../../components/home';\nimport { ProductCard } from '../../components/product';\nimport { NoContent, ProductCardSkeleton, Image, RenderWhenVisible } from '../../components/common';\nimport { product } from '../../api/product';\nimport type { ProductListLoaderData } from './types';\nimport type { Brand } from '../brands/types';\nimport type { Product } from '../../types';\n\n/** 3-col + 288px sidebar from md; 3-col of the full container below md. */\nconst FILTERED_PRODUCT_IMAGE_SIZES = '(min-width: 768px) 25vw, 33vw';\n\n/**\n * Product List Page - Unified component for all product listing pages\n *\n * Handles:\n * - Category pages (with filters, category entity, testimonials)\n * - Search pages (keyword display, product count)\n * - Tag pages (tag entity)\n * - Brand pages (brand entity with banner/logo)\n * - Static listings (latest, sales, offers)\n */\nexport function ProductListPage({\n page,\n source,\n query,\n products,\n pagination,\n filters,\n}: ProductListLoaderData) {\n const { t } = useTranslation();\n const store = useStore();\n const navigate = useNavigate();\n // Sort is now SSR-driven, no local state needed\n const selectedSort = query.sort;\n const [filtersOpen, setFiltersOpen] = useState(false);\n\n // Determine filters visibility\n const showFilters = query.filters && store?.settings?.product?.filters;\n // const isSearch = source.type === 'search';\n const isBrand = source.type === 'brands';\n const brand = isBrand ? (source.entity as Brand | undefined) : null;\n\n // Generate sort options with translations\n const sortOptionsWithTrans = useMemo(() => sortOptions(selectedSort, t), [selectedSort, t]);\n\n // Get location from hook for consistent URL handling\n const location = useLocation();\n\n // Listen for filters changed event to close drawer\n useEffect(() => {\n const handleFiltersChanged = () => setFiltersOpen(false);\n const sdk = window.salla;\n if (typeof sdk === 'undefined') return;\n\n sdk.event.on('salla-filters::changed', handleFiltersChanged);\n\n return () => {\n sdk.event.off('salla-filters::changed', handleFiltersChanged);\n };\n }, []);\n\n // Handle sort change - use client-side navigation to trigger route loader re-run\n const handleSortChange = useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newSort = event.target.value;\n\n const params = new URLSearchParams(location.searchStr);\n params.set('sort', newSort);\n params.delete('page'); // clear any cursor token from URL on sort change\n\n // Use client-side navigation to trigger route loader re-execution (SSR-like).\n // Built from the router's location rather than `window.location`: on a host\n // where the store is the root, the address bar carries the store segment and\n // `navigate` would add it a second time.\n navigate(`${location.pathname}?${params.toString()}`);\n },\n [navigate, location.pathname, location.searchStr]\n );\n\n // Key for remounting products list\n const listKey = source.value ?? source.type;\n\n // Track cursor for the next page — initialized from SSR pagination response.\n // On sort change the key prop remounts ItemsList and this effect resets the cursor.\n const nextCursorRef = useRef<string | null>(pagination?.next ?? null);\n useEffect(() => {\n nextCursorRef.current = pagination?.next ?? null;\n }, [pagination?.next]);\n\n const loader = useCallback(async () => {\n const nextUrl = nextCursorRef.current;\n // Extract the cursor token from the next URL provided by the previous response\n const cursorMatch = nextUrl?.match(/[?&]cursor=([^&]+)/);\n const cursor = cursorMatch ? decodeURIComponent(cursorMatch[1]) : (nextUrl ?? undefined);\n\n const result = await product.list({\n source: source.type,\n sourceValue: source.value,\n ...(cursor && { cursor }),\n sort: selectedSort,\n });\n\n nextCursorRef.current = result.next;\n\n return result;\n }, [source.type, source.value, selectedSort]);\n\n return (\n <div key={listKey} className=\"container px-2.5 ms:px-5 mb-10\">\n <Breadcrumb page={page} />\n\n {isBrand && brand && (\n <>\n <Image\n width={1200}\n height={300}\n className=\"w-full max-h-[300px] object-cover rounded-md bg-gray-100\"\n src={brand.banner || undefined}\n alt={brand.name}\n priority\n />\n <header className=\"flex flex-col md:flex-row items-center md:items-start text-center rtl:md:text-right ltr:md:text-left mt-2 mb-8\">\n <Image\n className=\"rounded-md w-40 h-24 object-contain shadow-md p-4 bg-white shrink-0\"\n src={brand.logo || undefined}\n alt={brand.name}\n aspectRatio=\"5/3\"\n />\n <div className=\"px-5 pt-3 rtl:text-right\">\n <h1 className=\"text-2xl font-bold mb-1\">{brand.name}</h1>\n {brand.description && (\n <p\n className=\"text-base text-gray-500 font-medium\"\n dangerouslySetInnerHTML={{ __html: brand.description }}\n />\n )}\n </div>\n </header>\n </>\n )}\n\n <HookSlot name=\"product:list.start\" />\n\n <div className={showFilters ? 'md:grid md:grid-cols-[288px_1fr] gap-8' : ''}>\n {/* <FiltersSkeleton></FiltersSkeleton> */}\n {showFilters && (\n <SallaFilters\n id=\"filters-menu\"\n className=\"hidden md:block lg:sticky lg:top-20\"\n filters={filters as any}\n />\n )}\n\n <div className=\"min-w-0\">\n <div className=\"mb-4 sm:mb-6 flex justify-between items-center\">\n <h1 className=\"font-bold text-xl rtl:pl-3 ltr:pr-3\" id=\"page-main-title\">\n {isBrand ? t('common.titles.products') : page.title}\n </h1>\n\n <div className=\"flex items-center space-x-2 rtl:space-x-reverse\">\n {showFilters && (\n <button\n type=\"button\"\n onClick={() => setFiltersOpen(true)}\n className=\"filters-trigger bg-border-color text-primary lg:hidden p-2 rounded\"\n >\n <i className=\"sicon-filter text-gray-text text-2xl\" />\n </button>\n )}\n\n {sortOptionsWithTrans.length > 0 && (\n <div className=\"flex items-center\">\n <label\n className=\"hidden sm:block rtl:ml-3 ltr:mr-3 whitespace-nowrap\"\n htmlFor=\"product-sort\"\n >\n {t('pages.categories.sorting', 'Sort By')}\n </label>\n <select\n id=\"product-sort\"\n className=\"form-input pt-0 pb-1 rtl:md:pl-10 ltr:md:pr-10\"\n value={selectedSort}\n onChange={handleSortChange}\n >\n {sortOptionsWithTrans.map((option) => (\n <option key={option.id} value={option.id}>\n {option.name}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n </div>\n\n <HookSlot name=\"product:list.items.start\" />\n\n <div className=\"flex min-h-screen\">\n <ItemsList<Product>\n key={`${listKey}-${selectedSort}`}\n resetKey={`${listKey}-${selectedSort}`}\n items={products}\n loader={loader}\n mode={pagination?.next ? 'infinite' : 'static'}\n pageUrl={location.pathname + location.searchStr}\n className=\"s-products-list flex-1 min-w-0\"\n itemsClassName={`s-products-list-wrapper s-products-list-vertical-cards${showFilters ? ' s-products-list-with-filters' : ''}`}\n skeleton={<ProductCardSkeleton />}\n skeletonType=\"item\"\n skeletonCount={12}\n empty={\n <NoContent\n icon=\"sicon-shopping-bag\"\n message={t('pages.categories.no_products', 'No products found in this category')}\n />\n }\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) =>\n items.map((prod, idx) => (\n <ProductCard\n key={prod.id}\n product={prod}\n index={idx}\n sizes={showFilters ? FILTERED_PRODUCT_IMAGE_SIZES : undefined}\n />\n ))\n }\n </ItemsList>\n </div>\n\n <HookSlot name=\"product:list.items.end\" />\n </div>\n </div>\n\n {showFilters && (\n <Drawer isOpen={filtersOpen} onClose={() => setFiltersOpen(false)} size=\"md\">\n <div className=\"p-4\">\n <div className=\"flex justify-between items-center mb-4\">\n <h3 className=\"font-bold text-lg\">{t('pages.categories.filters', 'Filters')}</h3>\n <button\n type=\"button\"\n onClick={() => setFiltersOpen(false)}\n className=\"btn--close-sm sicon-cancel text-gray-500\"\n />\n </div>\n <SallaFilters id=\"filters-menu-mobile\" filters={filters as any} />\n </div>\n </Drawer>\n )}\n\n {source.type === 'categories' && store?.settings?.category?.testimonial_enabled && (\n <RenderWhenVisible placeholder={<ReviewItemSkeleton />}>\n <Testimonials data={{}} />\n </RenderWhenVisible>\n )}\n\n <HookSlot name=\"product:list.end\" />\n </div>\n );\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport { productListLoader } from './loader';\nimport type { ProductListLoaderData, ProductListTag, Category } from './types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\nimport { ProductListPage } from './ProductListPage';\n\nexport function head(ctx: TwilightContext, data: ProductListLoaderData): HeadDescriptor {\n const entity = data.source.entity;\n const category = data.source.type === 'categories' ? (entity as Category | undefined) : undefined;\n const tag = data.source.type === 'tags' ? (entity as ProductListTag | undefined) : undefined;\n\n const canonical = category?.url ?? tag?.url;\n const title = category?.name ?? tag?.name ?? data.page.title;\n const image = category?.image ?? undefined;\n\n const base: HeadDescriptor = {\n title,\n description: `Browse ${title}`,\n canonical,\n openGraph: {\n type: 'website',\n title,\n description: `Browse ${title}`,\n images: image,\n url: canonical,\n },\n twitter: {\n card: 'summary_large_image',\n title,\n description: `Browse ${title}`,\n images: image,\n },\n alternateLanguages: buildHreflangAlternates(ctx.settings, canonical ?? ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const ProductListing = {\n id: RouteId.PRODUCT_INDEX,\n loader: productListLoader,\n head,\n Component: ProductListPage,\n} as const;\n\nexport { ProductListPage };\nexport { productListLoader };\n\nexport type {\n ProductListLoaderData,\n ProductListLoaderParams,\n ProductListLoaderContext,\n ProductListSource,\n ProductListTag,\n ProductListEntity,\n ProductListPageMeta,\n ProductListSourceConfig,\n ProductListQuery,\n CategoryPageProps,\n} from './types';\n"]}
@@ -1,24 +1,25 @@
1
1
  import { buildHreflangAlternates } from '../chunk-TZ3E5BN4.js';
2
- import { ProductsSlider, LazyTestimonials } from '../chunk-CG3AM4DH.js';
3
- import { product } from '../chunk-XLJPUFN4.js';
4
- import { ProductGallery, LazyProductDetails, LazyAddToCartForm } from '../chunk-G4M73JU5.js';
2
+ import { ProductsSlider, LazyTestimonials } from '../chunk-WITIL2MK.js';
3
+ import { product } from '../chunk-CPQXPECC.js';
4
+ import { ProductGallery, LazyProductDetails, LazyAddToCartForm } from '../chunk-UQRLBMIO.js';
5
5
  import '../chunk-342EPVXN.js';
6
- import '../chunk-PNXUBS5X.js';
7
- import '../chunk-UWWYR3UX.js';
6
+ import '../chunk-DTWFNS3F.js';
7
+ import '../chunk-65Z2ZDKZ.js';
8
8
  import '../chunk-JKIRRMBU.js';
9
9
  import '../chunk-2JV6WZ6O.js';
10
10
  import '../chunk-6IATCGID.js';
11
- import '../chunk-E5EH32L7.js';
11
+ import '../chunk-3MHDV5JS.js';
12
12
  import '../chunk-VVZNW5CB.js';
13
- import '../chunk-6KI2QCPL.js';
14
- import '../chunk-XLGVT7QF.js';
13
+ import '../chunk-JD4J2ZB6.js';
14
+ import '../chunk-JK77XRXR.js';
15
15
  import { RouteId } from '../chunk-MTONGOJD.js';
16
16
  import '../chunk-C5X6CVXC.js';
17
- import '../chunk-6MGDRMZM.js';
18
- import '../chunk-RIZOT5FN.js';
19
- import '../chunk-AZ5HAIYQ.js';
20
- import '../chunk-JBXTU5NM.js';
21
- import { getTwilightContext } from '../chunk-6XWMNQ52.js';
17
+ import '../chunk-QKIQ3K24.js';
18
+ import '../chunk-Z74NUTEI.js';
19
+ import '../chunk-O6XXHXC4.js';
20
+ import '../chunk-3FIWHGCZ.js';
21
+ import '../chunk-XTMHHLNK.js';
22
+ import { getTwilightContext } from '../chunk-PJWFEMBX.js';
22
23
  import '../chunk-TP3LCGE7.js';
23
24
  import '../chunk-Z653O7MX.js';
24
25
  import '../chunk-ZCH7W7DZ.js';
@@ -34,7 +35,7 @@ import { useComments } from '../chunk-YMVLYYLU.js';
34
35
  import '../chunk-RJPPO3ET.js';
35
36
  import { HookSlot } from '../chunk-Q7VWURUR.js';
36
37
  import '../chunk-GU2KUQVD.js';
37
- import { LazyBreadcrumb, LazyRenderWhenVisible } from '../chunk-G6F5DCCP.js';
38
+ import { LazyBreadcrumb, LazyRenderWhenVisible } from '../chunk-LKBWIN26.js';
38
39
  import '../chunk-AXW67SY7.js';
39
40
  import '../chunk-BYMOPN2S.js';
40
41
  import '../chunk-SKLEJJ6M.js';