@salla.sa/twilight-theme-engine 1.0.67 → 1.0.68

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 (212) hide show
  1. package/dist/{AddToCartForm-UVQG3BI5.js → AddToCartForm-TX36PDIE.js} +3 -3
  2. package/dist/{AddToCartForm-UVQG3BI5.js.map → AddToCartForm-TX36PDIE.js.map} +1 -1
  3. package/dist/{BlogAuthorPage-7HVGT3CS.js → BlogAuthorPage-AT6YYDG4.js} +17 -17
  4. package/dist/{BlogAuthorPage-7HVGT3CS.js.map → BlogAuthorPage-AT6YYDG4.js.map} +1 -1
  5. package/dist/{BlogCategoryPage-MSITS6B3.js → BlogCategoryPage-ELPLV67S.js} +17 -17
  6. package/dist/{BlogCategoryPage-MSITS6B3.js.map → BlogCategoryPage-ELPLV67S.js.map} +1 -1
  7. package/dist/{BlogPage-6FLWZBK3.js → BlogPage-RO3U4OTI.js} +15 -15
  8. package/dist/{BlogPage-6FLWZBK3.js.map → BlogPage-RO3U4OTI.js.map} +1 -1
  9. package/dist/{BlogSinglePage-LSF5P4GA.js → BlogSinglePage-HSRVLJYE.js} +15 -15
  10. package/dist/{BlogSinglePage-LSF5P4GA.js.map → BlogSinglePage-HSRVLJYE.js.map} +1 -1
  11. package/dist/{BlogTagPage-JPOF3OC4.js → BlogTagPage-KLCLNP2Q.js} +17 -17
  12. package/dist/{BlogTagPage-JPOF3OC4.js.map → BlogTagPage-KLCLNP2Q.js.map} +1 -1
  13. package/dist/{BrandsPage-7G5VWJ2S.js → BrandsPage-C2TTKTMV.js} +16 -16
  14. package/dist/{BrandsPage-7G5VWJ2S.js.map → BrandsPage-C2TTKTMV.js.map} +1 -1
  15. package/dist/{Breadcrumb-MNYKDV27.js → Breadcrumb-MLWGLXJZ.js} +15 -15
  16. package/dist/{Breadcrumb-MNYKDV27.js.map → Breadcrumb-MLWGLXJZ.js.map} +1 -1
  17. package/dist/{CartItem-DNA2TJ6B.js → CartItem-5JKJ3AD6.js} +15 -15
  18. package/dist/{CartItem-DNA2TJ6B.js.map → CartItem-5JKJ3AD6.js.map} +1 -1
  19. package/dist/{CartSummary-RTDKJUV7.js → CartSummary-ZNBVWC2P.js} +15 -15
  20. package/dist/{CartSummary-RTDKJUV7.js.map → CartSummary-ZNBVWC2P.js.map} +1 -1
  21. package/dist/{Copyright-IR4VD3I6.js → Copyright-LBUY2AJJ.js} +3 -3
  22. package/dist/{Copyright-IR4VD3I6.js.map → Copyright-LBUY2AJJ.js.map} +1 -1
  23. package/dist/{CustomerLayout-6YWOUFEN.js → CustomerLayout-YDJQYMQI.js} +15 -15
  24. package/dist/{CustomerLayout-6YWOUFEN.js.map → CustomerLayout-YDJQYMQI.js.map} +1 -1
  25. package/dist/{Footer-YQHS47HV.js → Footer-X46MKKA5.js} +15 -15
  26. package/dist/{Footer-YQHS47HV.js.map → Footer-X46MKKA5.js.map} +1 -1
  27. package/dist/{Header-VEI2M3XJ.js → Header-YK5QFAO7.js} +4 -4
  28. package/dist/{Header-VEI2M3XJ.js.map → Header-YK5QFAO7.js.map} +1 -1
  29. package/dist/{LoyaltyPage-L7LABJWG.js → LoyaltyPage-RM3WQLVC.js} +15 -15
  30. package/dist/{LoyaltyPage-L7LABJWG.js.map → LoyaltyPage-RM3WQLVC.js.map} +1 -1
  31. package/dist/{LoyaltyPointsPage-Z2GAMWCG.js → LoyaltyPointsPage-AN7VC3AF.js} +3 -3
  32. package/dist/{LoyaltyPointsPage-Z2GAMWCG.js.map → LoyaltyPointsPage-AN7VC3AF.js.map} +1 -1
  33. package/dist/{MainMenu-76GBUVNZ.js → MainMenu-ETIJZLKV.js} +6 -6
  34. package/dist/{MainMenu-76GBUVNZ.js.map → MainMenu-ETIJZLKV.js.map} +1 -1
  35. package/dist/{MasterLayout-GEQBU2MH.js → MasterLayout-QSYGLVJD.js} +15 -15
  36. package/dist/{MasterLayout-GEQBU2MH.js.map → MasterLayout-QSYGLVJD.js.map} +1 -1
  37. package/dist/{MobileMenu-DS5OJRCO.js → MobileMenu-V624P4XH.js} +16 -16
  38. package/dist/{MobileMenu-DS5OJRCO.js.map → MobileMenu-V624P4XH.js.map} +1 -1
  39. package/dist/{NotificationsPage-OT2WY2EF.js → NotificationsPage-MAN7PINP.js} +15 -15
  40. package/dist/{NotificationsPage-OT2WY2EF.js.map → NotificationsPage-MAN7PINP.js.map} +1 -1
  41. package/dist/{OrderSinglePage-XGPSBIA3.js → OrderSinglePage-43FJCEPN.js} +16 -16
  42. package/dist/{OrderSinglePage-XGPSBIA3.js.map → OrderSinglePage-43FJCEPN.js.map} +1 -1
  43. package/dist/{OrdersPage-A5TARKJ7.js → OrdersPage-TW3VH6EN.js} +15 -15
  44. package/dist/{OrdersPage-A5TARKJ7.js.map → OrdersPage-TW3VH6EN.js.map} +1 -1
  45. package/dist/{PageSingle-VUNU2BG4.js → PageSingle-AX7M6XH3.js} +9 -4
  46. package/dist/PageSingle-AX7M6XH3.js.map +1 -0
  47. package/dist/{ProductDetails-2JWKUXLI.js → ProductDetails-4ABLVN5Z.js} +3 -3
  48. package/dist/{ProductDetails-2JWKUXLI.js.map → ProductDetails-4ABLVN5Z.js.map} +1 -1
  49. package/dist/{ProfilePage-AVUCRBHQ.js → ProfilePage-ACF2CGYH.js} +15 -15
  50. package/dist/{ProfilePage-AVUCRBHQ.js.map → ProfilePage-ACF2CGYH.js.map} +1 -1
  51. package/dist/{SeoCartWidget-X5HTL62D.js → SeoCartWidget-AFJRAXWF.js} +19 -21
  52. package/dist/SeoCartWidget-AFJRAXWF.js.map +1 -0
  53. package/dist/{SettingsPage-WGGKT3I4.js → SettingsPage-FYFH4QLC.js} +15 -15
  54. package/dist/{SettingsPage-WGGKT3I4.js.map → SettingsPage-FYFH4QLC.js.map} +1 -1
  55. package/dist/{StoreClosedNotification-XDYQO7JF.js → StoreClosedNotification-PPQFOIW3.js} +16 -16
  56. package/dist/{StoreClosedNotification-XDYQO7JF.js.map → StoreClosedNotification-PPQFOIW3.js.map} +1 -1
  57. package/dist/{TestimonialsPage-CKAYXFER.js → TestimonialsPage-Q5UIOYG6.js} +8 -4
  58. package/dist/TestimonialsPage-Q5UIOYG6.js.map +1 -0
  59. package/dist/{ThankYouPage-ZTCFTEI7.js → ThankYouPage-FKM3DCWO.js} +16 -21
  60. package/dist/ThankYouPage-FKM3DCWO.js.map +1 -0
  61. package/dist/{WalletPage-XKAOZIO2.js → WalletPage-WI7DXCGJ.js} +16 -16
  62. package/dist/{WalletPage-XKAOZIO2.js.map → WalletPage-WI7DXCGJ.js.map} +1 -1
  63. package/dist/{WishlistPage-LHIUUR4U.js → WishlistPage-G5Z2W5QD.js} +18 -23
  64. package/dist/WishlistPage-G5Z2W5QD.js.map +1 -0
  65. package/dist/api/apps.js +3 -3
  66. package/dist/api/brands.js +3 -3
  67. package/dist/api/cart.js +3 -3
  68. package/dist/api/category.js +3 -3
  69. package/dist/api/client.js +2 -2
  70. package/dist/api/home.js +3 -3
  71. package/dist/api/loyalty.js +3 -3
  72. package/dist/api/menu.js +3 -3
  73. package/dist/api/notification.js +3 -3
  74. package/dist/api/order.js +3 -3
  75. package/dist/api/page.js +3 -3
  76. package/dist/api/product.js +3 -3
  77. package/dist/api/profile.js +2 -2
  78. package/dist/api/store.js +3 -3
  79. package/dist/api/translations.js +3 -3
  80. package/dist/api/user.js +3 -3
  81. package/dist/api/wishlist.js +4 -4
  82. package/dist/{chunk-RH5VLLTG.js → chunk-2IYOHSQN.js} +4 -4
  83. package/dist/{chunk-RH5VLLTG.js.map → chunk-2IYOHSQN.js.map} +1 -1
  84. package/dist/{chunk-3L5VG2X4.js → chunk-4YQQVUXS.js} +4 -4
  85. package/dist/{chunk-3L5VG2X4.js.map → chunk-4YQQVUXS.js.map} +1 -1
  86. package/dist/chunk-5Y64476S.js +80 -0
  87. package/dist/chunk-5Y64476S.js.map +1 -0
  88. package/dist/{chunk-W5K6YUA2.js → chunk-AH6KEBKX.js} +6 -6
  89. package/dist/{chunk-W5K6YUA2.js.map → chunk-AH6KEBKX.js.map} +1 -1
  90. package/dist/{chunk-TOPFB6FL.js → chunk-B2OHRXRD.js} +3 -3
  91. package/dist/{chunk-TOPFB6FL.js.map → chunk-B2OHRXRD.js.map} +1 -1
  92. package/dist/{chunk-3Q22KK7C.js → chunk-CTLTXDHH.js} +5 -5
  93. package/dist/{chunk-3Q22KK7C.js.map → chunk-CTLTXDHH.js.map} +1 -1
  94. package/dist/{chunk-UEQFXSTX.js → chunk-DISOIXUL.js} +124 -119
  95. package/dist/chunk-DISOIXUL.js.map +1 -0
  96. package/dist/{chunk-5X2UFNKY.js → chunk-DZT26OCM.js} +3 -3
  97. package/dist/{chunk-5X2UFNKY.js.map → chunk-DZT26OCM.js.map} +1 -1
  98. package/dist/{chunk-TTMYT3RB.js → chunk-E2XHLK5O.js} +3 -3
  99. package/dist/{chunk-TTMYT3RB.js.map → chunk-E2XHLK5O.js.map} +1 -1
  100. package/dist/{chunk-GOPUP26T.js → chunk-E43ALK3R.js} +4 -9
  101. package/dist/chunk-E43ALK3R.js.map +1 -0
  102. package/dist/{chunk-VI5R46KX.js → chunk-EBFYRFMI.js} +7 -7
  103. package/dist/{chunk-VI5R46KX.js.map → chunk-EBFYRFMI.js.map} +1 -1
  104. package/dist/chunk-EI52BZFN.js +14 -0
  105. package/dist/{chunk-TFROBJP5.js.map → chunk-EI52BZFN.js.map} +1 -1
  106. package/dist/{chunk-A4UQKSOU.js → chunk-ELS6I3O2.js} +4 -4
  107. package/dist/{chunk-A4UQKSOU.js.map → chunk-ELS6I3O2.js.map} +1 -1
  108. package/dist/{chunk-UIOLSYKV.js → chunk-ETPOZJHG.js} +3 -3
  109. package/dist/{chunk-UIOLSYKV.js.map → chunk-ETPOZJHG.js.map} +1 -1
  110. package/dist/{chunk-FTM3RIVB.js → chunk-FBOSUTNC.js} +3 -3
  111. package/dist/{chunk-FTM3RIVB.js.map → chunk-FBOSUTNC.js.map} +1 -1
  112. package/dist/{chunk-EFMAB636.js → chunk-G2VNDZID.js} +3 -3
  113. package/dist/{chunk-EFMAB636.js.map → chunk-G2VNDZID.js.map} +1 -1
  114. package/dist/{chunk-PWBMSGMU.js → chunk-H7BCB2HO.js} +6 -23
  115. package/dist/chunk-H7BCB2HO.js.map +1 -0
  116. package/dist/{chunk-EYFMLMMF.js → chunk-I4XPOEQY.js} +3 -3
  117. package/dist/{chunk-EYFMLMMF.js.map → chunk-I4XPOEQY.js.map} +1 -1
  118. package/dist/{chunk-P3OPJL6I.js → chunk-IKUDCH7Q.js} +3 -3
  119. package/dist/{chunk-P3OPJL6I.js.map → chunk-IKUDCH7Q.js.map} +1 -1
  120. package/dist/{chunk-FAVZMJRY.js → chunk-ITHU2R5C.js} +6 -6
  121. package/dist/{chunk-FAVZMJRY.js.map → chunk-ITHU2R5C.js.map} +1 -1
  122. package/dist/{chunk-SOPZ72BU.js → chunk-J2YKHDMH.js} +3 -3
  123. package/dist/{chunk-SOPZ72BU.js.map → chunk-J2YKHDMH.js.map} +1 -1
  124. package/dist/{chunk-FRFTO2HP.js → chunk-J5DXKBVJ.js} +6 -6
  125. package/dist/{chunk-FRFTO2HP.js.map → chunk-J5DXKBVJ.js.map} +1 -1
  126. package/dist/{chunk-HDO37URJ.js → chunk-K6SNUM3L.js} +3 -3
  127. package/dist/{chunk-HDO37URJ.js.map → chunk-K6SNUM3L.js.map} +1 -1
  128. package/dist/{chunk-VAW73MFZ.js → chunk-KCCU3S5F.js} +9 -9
  129. package/dist/chunk-KCCU3S5F.js.map +1 -0
  130. package/dist/{chunk-Q3COPV5Z.js → chunk-L2DRHH4E.js} +3 -3
  131. package/dist/{chunk-Q3COPV5Z.js.map → chunk-L2DRHH4E.js.map} +1 -1
  132. package/dist/{chunk-UZKTK6YV.js → chunk-NCTG4ZTU.js} +3 -3
  133. package/dist/{chunk-UZKTK6YV.js.map → chunk-NCTG4ZTU.js.map} +1 -1
  134. package/dist/{chunk-EQ32CL4D.js → chunk-NTIGQYSN.js} +3 -3
  135. package/dist/{chunk-EQ32CL4D.js.map → chunk-NTIGQYSN.js.map} +1 -1
  136. package/dist/{chunk-VGIK4BW6.js → chunk-OFRV3WKR.js} +4 -4
  137. package/dist/{chunk-VGIK4BW6.js.map → chunk-OFRV3WKR.js.map} +1 -1
  138. package/dist/{chunk-6IRWFBGU.js → chunk-TRZAQSHU.js} +3 -3
  139. package/dist/{chunk-6IRWFBGU.js.map → chunk-TRZAQSHU.js.map} +1 -1
  140. package/dist/{chunk-Y43T7PJV.js → chunk-TY3XJOIQ.js} +3 -3
  141. package/dist/{chunk-Y43T7PJV.js.map → chunk-TY3XJOIQ.js.map} +1 -1
  142. package/dist/{chunk-EAZGFREP.js → chunk-VAMIJGCU.js} +3 -3
  143. package/dist/{chunk-EAZGFREP.js.map → chunk-VAMIJGCU.js.map} +1 -1
  144. package/dist/{chunk-RJAVZBUK.js → chunk-XBW7EHBA.js} +3 -3
  145. package/dist/{chunk-RJAVZBUK.js.map → chunk-XBW7EHBA.js.map} +1 -1
  146. package/dist/{chunk-GYXT7T2Z.js → chunk-XCYIGCUN.js} +3 -3
  147. package/dist/{chunk-GYXT7T2Z.js.map → chunk-XCYIGCUN.js.map} +1 -1
  148. package/dist/{chunk-VKB5AQUS.js → chunk-Y7NC2NDA.js} +3 -3
  149. package/dist/{chunk-VKB5AQUS.js.map → chunk-Y7NC2NDA.js.map} +1 -1
  150. package/dist/components/cart/SeoCartWidget.d.ts.map +1 -1
  151. package/dist/components/cart/index.js +1 -1
  152. package/dist/components/common/index.js +1 -1
  153. package/dist/components/drawer/index.js +13 -13
  154. package/dist/components/home/index.js +17 -17
  155. package/dist/components/layout/index.js +1 -1
  156. package/dist/components/product/index.js +14 -14
  157. package/dist/components/store/index.js +15 -15
  158. package/dist/{document-class-SPTMBRWL.js → document-class-P33S4CA7.js} +9 -9
  159. package/dist/{document-class-SPTMBRWL.js.map → document-class-P33S4CA7.js.map} +1 -1
  160. package/dist/hooks/index.js +13 -13
  161. package/dist/hooks/useComments.d.ts.map +1 -1
  162. package/dist/hooks/useComments.js +6 -1
  163. package/dist/hooks/useGtm.js +13 -13
  164. package/dist/hooks/useMoney.js +13 -13
  165. package/dist/hooks/usePageConfig.d.ts.map +1 -1
  166. package/dist/hooks/useProduct.d.ts.map +1 -1
  167. package/dist/hooks/useProduct.js +6 -1
  168. package/dist/hooks/useStore.js +13 -13
  169. package/dist/hooks/useUser.js +4 -4
  170. package/dist/index.js +13 -13
  171. package/dist/{not-found-T2WYF64G.js → not-found-4R764WCJ.js} +16 -16
  172. package/dist/{not-found-T2WYF64G.js.map → not-found-4R764WCJ.js.map} +1 -1
  173. package/dist/providers/TwilightProvider.d.ts.map +1 -1
  174. package/dist/providers/index.js +13 -13
  175. package/dist/providers/twilight-init.d.ts.map +1 -1
  176. package/dist/routes/account/orders.js +4 -4
  177. package/dist/routes/account/wishlist/WishlistPage.d.ts.map +1 -1
  178. package/dist/routes/account.js +13 -13
  179. package/dist/routes/blog.js +8 -8
  180. package/dist/routes/brands.js +4 -4
  181. package/dist/routes/cart.js +21 -21
  182. package/dist/routes/home.js +18 -18
  183. package/dist/routes/loyalty.js +5 -5
  184. package/dist/routes/page.js +4 -4
  185. package/dist/routes/product-listing/ProductListPage.d.ts.map +1 -1
  186. package/dist/routes/product-listing/useAppliedFilters.d.ts.map +1 -1
  187. package/dist/routes/product-listing.js +21 -29
  188. package/dist/routes/product-listing.js.map +1 -1
  189. package/dist/routes/product.js +17 -17
  190. package/dist/routes/testimonials.js +1 -1
  191. package/dist/routes/thank-you/ThankYouPage.d.ts.map +1 -1
  192. package/dist/routes/thank-you.js +4 -4
  193. package/dist/skeleton.js +18 -18
  194. package/dist/tanstack.js +8 -8
  195. package/dist/utils/index.d.ts +1 -1
  196. package/dist/utils/index.d.ts.map +1 -1
  197. package/dist/utils/index.js +2 -2
  198. package/dist/utils/sdk-helpers.d.ts +36 -0
  199. package/dist/utils/sdk-helpers.d.ts.map +1 -1
  200. package/package.json +1 -1
  201. package/dist/PageSingle-VUNU2BG4.js.map +0 -1
  202. package/dist/SeoCartWidget-X5HTL62D.js.map +0 -1
  203. package/dist/TestimonialsPage-CKAYXFER.js.map +0 -1
  204. package/dist/ThankYouPage-ZTCFTEI7.js.map +0 -1
  205. package/dist/WishlistPage-LHIUUR4U.js.map +0 -1
  206. package/dist/chunk-GOPUP26T.js.map +0 -1
  207. package/dist/chunk-PWBMSGMU.js.map +0 -1
  208. package/dist/chunk-TFROBJP5.js +0 -14
  209. package/dist/chunk-UEQFXSTX.js.map +0 -1
  210. package/dist/chunk-VAW73MFZ.js.map +0 -1
  211. package/dist/chunk-WY4IYO3G.js +0 -25
  212. package/dist/chunk-WY4IYO3G.js.map +0 -1
@@ -1,36 +1,36 @@
1
- import { cart } from '../chunk-3L5VG2X4.js';
2
- import { loyalty } from '../chunk-VKB5AQUS.js';
1
+ import { cart } from '../chunk-4YQQVUXS.js';
2
+ import { loyalty } from '../chunk-Y7NC2NDA.js';
3
3
  import { CartSkeleton } from '../chunk-N7CCSGZF.js';
4
- import '../chunk-VGIK4BW6.js';
4
+ import '../chunk-OFRV3WKR.js';
5
5
  import { buildHreflangAlternates } from '../chunk-TZ3E5BN4.js';
6
- import '../chunk-W5K6YUA2.js';
7
- import '../chunk-Y43T7PJV.js';
8
- import '../chunk-HDO37URJ.js';
9
- import { LazySeoCartWidget, LazyCartItem, LazyCartSummary } from '../chunk-TFROBJP5.js';
10
- import '../chunk-FAVZMJRY.js';
6
+ import '../chunk-AH6KEBKX.js';
7
+ import '../chunk-TY3XJOIQ.js';
8
+ import '../chunk-K6SNUM3L.js';
9
+ import { LazySeoCartWidget, LazyCartItem, LazyCartSummary } from '../chunk-EI52BZFN.js';
10
+ import '../chunk-ITHU2R5C.js';
11
11
  import '../chunk-342EPVXN.js';
12
- import '../chunk-UEQFXSTX.js';
13
- import '../chunk-3Q22KK7C.js';
12
+ import '../chunk-DISOIXUL.js';
13
+ import '../chunk-CTLTXDHH.js';
14
14
  import '../chunk-JKIRRMBU.js';
15
15
  import '../chunk-2JV6WZ6O.js';
16
- import '../chunk-UIOLSYKV.js';
16
+ import '../chunk-ETPOZJHG.js';
17
17
  import '../chunk-VVZNW5CB.js';
18
18
  import '../chunk-2XGQSJKH.js';
19
19
  import '../chunk-SSPAMQRV.js';
20
20
  import { RouteId } from '../chunk-ZGHRSRDO.js';
21
- import '../chunk-GOPUP26T.js';
21
+ import '../chunk-E43ALK3R.js';
22
22
  import '../chunk-C5X6CVXC.js';
23
- import '../chunk-UZKTK6YV.js';
24
- import '../chunk-5X2UFNKY.js';
25
- import '../chunk-P3OPJL6I.js';
26
- import '../chunk-WY4IYO3G.js';
27
- import '../chunk-TYLKNVQA.js';
28
- import '../chunk-SR4OTLTJ.js';
29
- import { getTwilightContext } from '../chunk-N2S25NXP.js';
23
+ import '../chunk-NCTG4ZTU.js';
24
+ import '../chunk-DZT26OCM.js';
25
+ import '../chunk-IKUDCH7Q.js';
30
26
  import '../chunk-TP3LCGE7.js';
31
27
  import '../chunk-Z653O7MX.js';
32
28
  import '../chunk-ZCH7W7DZ.js';
33
- import '../chunk-PWBMSGMU.js';
29
+ import '../chunk-H7BCB2HO.js';
30
+ import '../chunk-5Y64476S.js';
31
+ import '../chunk-TYLKNVQA.js';
32
+ import '../chunk-SR4OTLTJ.js';
33
+ import { getTwilightContext } from '../chunk-N2S25NXP.js';
34
34
  import '../chunk-JWXJPJBO.js';
35
35
  import '../chunk-CW625T2E.js';
36
36
  import '../chunk-7V36I5GT.js';
@@ -42,7 +42,7 @@ import '../chunk-T72DAX7R.js';
42
42
  import '../chunk-RJPPO3ET.js';
43
43
  import { HookSlot } from '../chunk-Q7VWURUR.js';
44
44
  import '../chunk-GU2KUQVD.js';
45
- import { LazyBreadcrumb, LazyNoContent } from '../chunk-SOPZ72BU.js';
45
+ import { LazyBreadcrumb, LazyNoContent } from '../chunk-J2YKHDMH.js';
46
46
  import '../chunk-AXW67SY7.js';
47
47
  import '../chunk-BYMOPN2S.js';
48
48
  import '../chunk-SKLEJJ6M.js';
@@ -1,32 +1,32 @@
1
- export { Home, HomeSkeleton, homeLoader } from '../chunk-VGIK4BW6.js';
1
+ export { Home, HomeSkeleton, homeLoader } from '../chunk-OFRV3WKR.js';
2
2
  import '../chunk-TZ3E5BN4.js';
3
- export { DefaultHomeComponents, registerHomeComponentConfig, registerHomeComponents } from '../chunk-W5K6YUA2.js';
4
- import '../chunk-Y43T7PJV.js';
5
- import '../chunk-HDO37URJ.js';
6
- import '../chunk-FAVZMJRY.js';
3
+ export { DefaultHomeComponents, registerHomeComponentConfig, registerHomeComponents } from '../chunk-AH6KEBKX.js';
4
+ import '../chunk-TY3XJOIQ.js';
5
+ import '../chunk-K6SNUM3L.js';
6
+ import '../chunk-ITHU2R5C.js';
7
7
  import '../chunk-342EPVXN.js';
8
- import '../chunk-UEQFXSTX.js';
9
- import '../chunk-3Q22KK7C.js';
8
+ import '../chunk-DISOIXUL.js';
9
+ import '../chunk-CTLTXDHH.js';
10
10
  import '../chunk-JKIRRMBU.js';
11
11
  import '../chunk-2JV6WZ6O.js';
12
- import '../chunk-UIOLSYKV.js';
12
+ import '../chunk-ETPOZJHG.js';
13
13
  import '../chunk-VVZNW5CB.js';
14
14
  import '../chunk-2XGQSJKH.js';
15
15
  import '../chunk-SSPAMQRV.js';
16
16
  import '../chunk-ZGHRSRDO.js';
17
- import '../chunk-GOPUP26T.js';
17
+ import '../chunk-E43ALK3R.js';
18
18
  import '../chunk-C5X6CVXC.js';
19
- import '../chunk-UZKTK6YV.js';
20
- import '../chunk-5X2UFNKY.js';
21
- import '../chunk-P3OPJL6I.js';
22
- import '../chunk-WY4IYO3G.js';
23
- import '../chunk-TYLKNVQA.js';
24
- import '../chunk-SR4OTLTJ.js';
25
- import '../chunk-N2S25NXP.js';
19
+ import '../chunk-NCTG4ZTU.js';
20
+ import '../chunk-DZT26OCM.js';
21
+ import '../chunk-IKUDCH7Q.js';
26
22
  import '../chunk-TP3LCGE7.js';
27
23
  import '../chunk-Z653O7MX.js';
28
24
  import '../chunk-ZCH7W7DZ.js';
29
- import '../chunk-PWBMSGMU.js';
25
+ import '../chunk-H7BCB2HO.js';
26
+ import '../chunk-5Y64476S.js';
27
+ import '../chunk-TYLKNVQA.js';
28
+ import '../chunk-SR4OTLTJ.js';
29
+ import '../chunk-N2S25NXP.js';
30
30
  import '../chunk-JWXJPJBO.js';
31
31
  import '../chunk-CW625T2E.js';
32
32
  import '../chunk-7V36I5GT.js';
@@ -38,7 +38,7 @@ import '../chunk-T72DAX7R.js';
38
38
  import '../chunk-RJPPO3ET.js';
39
39
  import '../chunk-Q7VWURUR.js';
40
40
  import '../chunk-GU2KUQVD.js';
41
- import '../chunk-SOPZ72BU.js';
41
+ import '../chunk-J2YKHDMH.js';
42
42
  import '../chunk-AXW67SY7.js';
43
43
  import '../chunk-BYMOPN2S.js';
44
44
  import '../chunk-SKLEJJ6M.js';
@@ -1,9 +1,9 @@
1
- import { loyalty } from '../chunk-VKB5AQUS.js';
1
+ import { loyalty } from '../chunk-Y7NC2NDA.js';
2
2
  import { buildHreflangAlternates } from '../chunk-TZ3E5BN4.js';
3
3
  import { unauthorized, orUnauthorized, redirect } from '../chunk-SSPAMQRV.js';
4
4
  import { RouteId } from '../chunk-ZGHRSRDO.js';
5
- import { getAuthToken } from '../chunk-P3OPJL6I.js';
6
- import '../chunk-WY4IYO3G.js';
5
+ import { getAuthToken } from '../chunk-IKUDCH7Q.js';
6
+ import '../chunk-5Y64476S.js';
7
7
  import '../chunk-TYLKNVQA.js';
8
8
  import '../chunk-SR4OTLTJ.js';
9
9
  import { getTwilightContext } from '../chunk-N2S25NXP.js';
@@ -58,10 +58,10 @@ async function loyaltyPointsLoader(locale) {
58
58
 
59
59
  // src/routes/loyalty/index.tsx
60
60
  var LazyLoyaltyPage = lazy(
61
- () => import('../LoyaltyPage-L7LABJWG.js').then((m) => ({ default: m.LoyaltyPage }))
61
+ () => import('../LoyaltyPage-RM3WQLVC.js').then((m) => ({ default: m.LoyaltyPage }))
62
62
  );
63
63
  var LazyLoyaltyPointsPage = lazy(
64
- () => import('../LoyaltyPointsPage-Z2GAMWCG.js').then((m) => ({ default: m.LoyaltyPointsPage }))
64
+ () => import('../LoyaltyPointsPage-AN7VC3AF.js').then((m) => ({ default: m.LoyaltyPointsPage }))
65
65
  );
66
66
  var LoyaltyPage = LazyLoyaltyPage;
67
67
  var LoyaltyPointsPage = LazyLoyaltyPointsPage;
@@ -1,9 +1,9 @@
1
- import { page } from '../chunk-EFMAB636.js';
1
+ import { page } from '../chunk-G2VNDZID.js';
2
2
  import { buildHreflangAlternates } from '../chunk-TZ3E5BN4.js';
3
3
  import '../chunk-SSPAMQRV.js';
4
4
  import { RouteId } from '../chunk-ZGHRSRDO.js';
5
- import '../chunk-P3OPJL6I.js';
6
- import '../chunk-WY4IYO3G.js';
5
+ import '../chunk-IKUDCH7Q.js';
6
+ import '../chunk-5Y64476S.js';
7
7
  import '../chunk-TYLKNVQA.js';
8
8
  import '../chunk-SR4OTLTJ.js';
9
9
  import '../chunk-N2S25NXP.js';
@@ -29,7 +29,7 @@ async function pageSingleLoader({ params }) {
29
29
  }
30
30
 
31
31
  // src/routes/page/index.tsx
32
- var LazyPageSingle = lazy(() => import('../PageSingle-VUNU2BG4.js').then((m) => ({ default: m.PageSingle })));
32
+ var LazyPageSingle = lazy(() => import('../PageSingle-AX7M6XH3.js').then((m) => ({ default: m.PageSingle })));
33
33
  var PageSingleLazy = LazyPageSingle;
34
34
  async function loader(ctx, extend) {
35
35
  const data = await pageSingleLoader({ params: ctx.params });
@@ -1 +1 @@
1
- {"version":3,"file":"ProductListPage.d.ts","sourceRoot":"","sources":["../../../src/routes/product-listing/ProductListPage.tsx"],"names":[],"mappings":"AAeA,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,+BA2RvB"}
1
+ {"version":3,"file":"ProductListPage.d.ts","sourceRoot":"","sources":["../../../src/routes/product-listing/ProductListPage.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAQrD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,MAAM,EACN,KAAK,EACL,QAAQ,EACR,UAAU,EACV,OAAO,GACR,EAAE,qBAAqB,+BAoRvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAppliedFilters.d.ts","sourceRoot":"","sources":["../../../src/routes/product-listing/useAppliedFilters.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAErD,KAAK,MAAM,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;AAM9C;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAyBhF;AAED,UAAU,YAAY;IACpB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1E;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,GACf;IACD,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACnC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAmDA"}
1
+ {"version":3,"file":"useAppliedFilters.d.ts","sourceRoot":"","sources":["../../../src/routes/product-listing/useAppliedFilters.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAGrD,KAAK,MAAM,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;AAM9C;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAyBhF;AAED,UAAU,YAAY;IACpB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1E;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,GACf;IACD,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACnC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAgDA"}
@@ -1,35 +1,35 @@
1
1
  import { sortOptions } from '../chunk-6Z4MOC4S.js';
2
- import { category } from '../chunk-GYXT7T2Z.js';
3
- import { brand } from '../chunk-TOPFB6FL.js';
2
+ import { category } from '../chunk-XCYIGCUN.js';
3
+ import { brand } from '../chunk-B2OHRXRD.js';
4
4
  import { buildHreflangAlternates } from '../chunk-TZ3E5BN4.js';
5
- import { LazyTestimonials } from '../chunk-W5K6YUA2.js';
6
- import '../chunk-Y43T7PJV.js';
7
- import { product } from '../chunk-HDO37URJ.js';
5
+ import { LazyTestimonials } from '../chunk-AH6KEBKX.js';
6
+ import '../chunk-TY3XJOIQ.js';
7
+ import { product } from '../chunk-K6SNUM3L.js';
8
8
  import { Drawer } from '../chunk-6TKIUG5C.js';
9
- import { ProductCard } from '../chunk-FAVZMJRY.js';
9
+ import { ProductCard } from '../chunk-ITHU2R5C.js';
10
10
  import '../chunk-342EPVXN.js';
11
- import { useStore } from '../chunk-UEQFXSTX.js';
12
- import '../chunk-3Q22KK7C.js';
11
+ import { useStore } from '../chunk-DISOIXUL.js';
12
+ import '../chunk-CTLTXDHH.js';
13
13
  import '../chunk-JKIRRMBU.js';
14
14
  import '../chunk-2JV6WZ6O.js';
15
- import '../chunk-UIOLSYKV.js';
15
+ import '../chunk-ETPOZJHG.js';
16
16
  import '../chunk-VVZNW5CB.js';
17
17
  import '../chunk-2XGQSJKH.js';
18
18
  import { notFound, useNavigate, useLocation } from '../chunk-SSPAMQRV.js';
19
19
  import { RouteId } from '../chunk-ZGHRSRDO.js';
20
- import '../chunk-GOPUP26T.js';
20
+ import '../chunk-E43ALK3R.js';
21
21
  import '../chunk-C5X6CVXC.js';
22
- import '../chunk-UZKTK6YV.js';
23
- import '../chunk-5X2UFNKY.js';
24
- import '../chunk-P3OPJL6I.js';
25
- import '../chunk-WY4IYO3G.js';
26
- import '../chunk-TYLKNVQA.js';
27
- import '../chunk-SR4OTLTJ.js';
28
- import { getTwilightContext } from '../chunk-N2S25NXP.js';
22
+ import '../chunk-NCTG4ZTU.js';
23
+ import '../chunk-DZT26OCM.js';
24
+ import '../chunk-IKUDCH7Q.js';
29
25
  import '../chunk-TP3LCGE7.js';
30
26
  import '../chunk-Z653O7MX.js';
31
27
  import '../chunk-ZCH7W7DZ.js';
32
- import '../chunk-PWBMSGMU.js';
28
+ import '../chunk-H7BCB2HO.js';
29
+ import { onSallaEvent } from '../chunk-5Y64476S.js';
30
+ import '../chunk-TYLKNVQA.js';
31
+ import '../chunk-SR4OTLTJ.js';
32
+ import { getTwilightContext } from '../chunk-N2S25NXP.js';
33
33
  import '../chunk-JWXJPJBO.js';
34
34
  import '../chunk-CW625T2E.js';
35
35
  import '../chunk-7V36I5GT.js';
@@ -41,7 +41,7 @@ import '../chunk-T72DAX7R.js';
41
41
  import '../chunk-RJPPO3ET.js';
42
42
  import { HookSlot } from '../chunk-Q7VWURUR.js';
43
43
  import '../chunk-GU2KUQVD.js';
44
- import { LazyBreadcrumb, Image, LazyNoContent, ProductCardSkeleton, LazyRenderWhenVisible } from '../chunk-SOPZ72BU.js';
44
+ import { LazyBreadcrumb, Image, LazyNoContent, ProductCardSkeleton, LazyRenderWhenVisible } from '../chunk-J2YKHDMH.js';
45
45
  import '../chunk-AXW67SY7.js';
46
46
  import '../chunk-BYMOPN2S.js';
47
47
  import '../chunk-SKLEJJ6M.js';
@@ -331,14 +331,11 @@ function useAppliedFilters(source, sort, enabled) {
331
331
  useEffect(() => {
332
332
  if (!enabled) return;
333
333
  setFilters(parseFiltersFromSearch(window.location.search));
334
- const sdk = window.salla;
335
- if (!sdk?.event) return;
336
334
  const onChanged = (...args) => {
337
335
  const next = args[0];
338
336
  setFilters(next && Object.keys(next).length ? { ...next } : null);
339
337
  };
340
- sdk.event.on("salla-filters::changed", onChanged);
341
- return () => sdk.event.off("salla-filters::changed", onChanged);
338
+ return onSallaEvent("salla-filters::changed", onChanged);
342
339
  }, [enabled, source.type, source.value]);
343
340
  const key = filters ? JSON.stringify([source.type, source.value, sort, filters]) : "";
344
341
  useEffect(() => {
@@ -396,12 +393,7 @@ function ProductListPage({
396
393
  const filteredKey = filterStatus === "idle" ? "" : `-${filterStatus}${filterStatus === "ready" ? JSON.stringify(appliedFilters) : ""}`;
397
394
  useEffect(() => {
398
395
  const handleFiltersChanged = () => setFiltersOpen(false);
399
- const sdk = window.salla;
400
- if (typeof sdk === "undefined") return;
401
- sdk.event.on("salla-filters::changed", handleFiltersChanged);
402
- return () => {
403
- sdk.event.off("salla-filters::changed", handleFiltersChanged);
404
- };
396
+ return onSallaEvent("salla-filters::changed", handleFiltersChanged);
405
397
  }, []);
406
398
  const handleSortChange = useCallback(
407
399
  (event) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/routes/product-listing/loader.ts","../../src/routes/product-listing/useAppliedFilters.ts","../../src/routes/product-listing/ProductListPage.tsx","../../src/routes/product-listing/index.tsx"],"names":["i18n","useState","brand","useEffect","useCallback","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: 'common.titles.discounts',\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('pages.products.search_result'),\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: i18n.t('pages.products.search_result'), 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: i18n.t('common.elements.search_about').replace(':word', 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 // The brand API sends no url.\n { name: brandData.name, url: `/brands/${id}` },\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 { useCallback, useEffect, useState } from 'react';\nimport { product } from '../../api/product';\nimport type { ProductListFilters } from '../../api/product';\nimport type { Product } from '../../types';\nimport type { ProductListLoaderData } from './types';\n\ntype Source = ProductListLoaderData['source'];\ntype Node = Record<string, unknown>;\n\n/** Path segments that would reach the shared prototype chain if used as object keys. */\nconst UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Reads the `filters[...]` selection `<salla-filters>` writes to the address bar\n * (`filters[k]=v`, `filters[k][]=v`, `filters[k][sub]=v`) back into an object, so a\n * filtered link can be opened directly.\n *\n * The keys come straight from the URL, so nodes are null-prototype objects and any\n * `__proto__` / `constructor` / `prototype` segment drops the whole entry — a crafted\n * `?filters[__proto__][x]=1` must never reach `Object.prototype`.\n */\nexport function parseFiltersFromSearch(search: string): ProductListFilters | null {\n const out: Node = Object.create(null);\n new URLSearchParams(search).forEach((value, rawKey) => {\n if (!rawKey.startsWith('filters[')) return;\n const path = [...rawKey.matchAll(/\\[([^\\]]*)\\]/g)].map((m) => m[1]);\n const isList = path[path.length - 1] === '';\n const keys = isList ? path.slice(0, -1) : path;\n if (!keys.length || keys.includes('') || keys.some((key) => UNSAFE_KEYS.has(key))) return;\n\n let node = out;\n keys.slice(0, -1).forEach((key) => {\n const existing = node[key];\n if (typeof existing !== 'object' || existing === null || Array.isArray(existing)) {\n node[key] = Object.create(null);\n }\n node = node[key] as Node;\n });\n const leaf = keys[keys.length - 1];\n if (isList) {\n node[leaf] = [...(Array.isArray(node[leaf]) ? (node[leaf] as string[]) : []), value];\n } else {\n node[leaf] = value;\n }\n });\n return Object.keys(out).length ? (out as ProductListFilters) : null;\n}\n\ninterface FilteredPage {\n items: Product[];\n next: string | null;\n}\n\nexport type AppliedFiltersStatus = 'idle' | 'loading' | 'ready' | 'error';\n\n/**\n * Applies the `<salla-filters>` selection to the product list.\n *\n * The filters component only rewrites the address bar (`history.pushState`, invisible\n * to the router) and emits `salla-filters::changed`; nothing re-queries the list, so\n * the route's loader output — fetched without filters — kept showing. This listens\n * for that event (and for a filtered URL on first load) and fetches the first page\n * with the selection.\n *\n * Each fetched page is stored with the selection that produced it, so `page` is only\n * ever the page for the *current* selection. Until it arrives `status` is `loading`\n * (and `lastPage` is the previous selection's page, for a dimmed placeholder); if the\n * request fails `status` is `error` and `retry` re-runs it — the old products never\n * pass for the new selection.\n */\nexport function useAppliedFilters(\n source: Source,\n sort: string,\n enabled: boolean\n): {\n filters: ProductListFilters | null;\n page: FilteredPage | null;\n lastPage: FilteredPage | null;\n status: AppliedFiltersStatus;\n retry: () => void;\n} {\n const [filters, setFilters] = useState<ProductListFilters | null>(null);\n const [result, setResult] = useState<{ key: string; page: FilteredPage } | null>(null);\n const [failedKey, setFailedKey] = useState<string | null>(null);\n const [attempt, setAttempt] = useState(0);\n\n useEffect(() => {\n if (!enabled) return;\n setFilters(parseFiltersFromSearch(window.location.search));\n const sdk = window.salla;\n if (!sdk?.event) return;\n const onChanged = (...args: unknown[]) => {\n const next = args[0] as ProductListFilters | undefined;\n setFilters(next && Object.keys(next).length ? { ...next } : null);\n };\n sdk.event.on('salla-filters::changed', onChanged);\n return () => sdk.event.off('salla-filters::changed', onChanged);\n }, [enabled, source.type, source.value]);\n\n const key = filters ? JSON.stringify([source.type, source.value, sort, filters]) : '';\n\n useEffect(() => {\n if (!filters) return;\n const controller = new AbortController();\n setFailedKey(null);\n product\n .list({\n source: source.type,\n sourceValue: source.value,\n sort,\n filterable: true,\n filters,\n signal: controller.signal,\n })\n .then((res) => setResult({ key, page: { items: res.items, next: res.next } }))\n .catch(() => {\n // Aborted by a newer selection (its own effect run owns the state now), or failed.\n if (!controller.signal.aborted) setFailedKey(key);\n });\n return () => controller.abort();\n // `key` already encodes filters + source + sort.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key, attempt]);\n\n const retry = useCallback(() => setAttempt((n) => n + 1), []);\n\n if (!filters) return { filters: null, page: null, lastPage: null, status: 'idle', retry };\n\n const page = result?.key === key ? result.page : null;\n const status: AppliedFiltersStatus = page ? 'ready' : failedKey === key ? 'error' : 'loading';\n return { filters, page, lastPage: result?.page ?? null, status, retry };\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 { useTwilight } from '../../providers/TwilightProvider';\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 { useAppliedFilters } from './useAppliedFilters';\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 { theme } = useTwilight();\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 // Re-query the list with the selection made in `<salla-filters>`: the component only\n // rewrites the address bar and emits `salla-filters::changed`, and the route's loader\n // output was fetched without it.\n const {\n filters: appliedFilters,\n page: filteredPage,\n lastPage,\n status: filterStatus,\n retry: retryFilters,\n } = useAppliedFilters(source, selectedSort, !!showFilters);\n // While the new selection loads, the previous page stays up (dimmed, `aria-busy`); if\n // the request fails nothing stale passes for the new selection. Infinite scroll is only\n // live for the loader's own page or a fully loaded filtered one.\n const shownPage = filterStatus === 'ready' ? filteredPage : lastPage;\n const shownProducts =\n filterStatus === 'error'\n ? []\n : filterStatus === 'idle'\n ? products\n : (shownPage?.items ?? products);\n const shownNext =\n filterStatus === 'idle'\n ? pagination?.next\n : filterStatus === 'ready'\n ? filteredPage?.next\n : null;\n const filteredKey =\n filterStatus === 'idle'\n ? ''\n : `-${filterStatus}${filterStatus === 'ready' ? JSON.stringify(appliedFilters) : ''}`;\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>(shownNext ?? null);\n useEffect(() => {\n nextCursorRef.current = shownNext ?? null;\n }, [shownNext]);\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 ...(appliedFilters && { filterable: true, filters: appliedFilters }),\n });\n\n nextCursorRef.current = result.next;\n\n return result;\n }, [source.type, source.value, selectedSort, appliedFilters]);\n\n return (\n <div key={listKey} className=\"container px-2.5 ms:px-5 mb-10\">\n {theme?.settings?.product_index_show_breadcrumbs !== false && <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\n className={`flex min-h-screen${filterStatus === 'loading' ? ' opacity-60' : ''}`}\n aria-busy={filterStatus === 'loading'}\n >\n {filterStatus === 'error' ? (\n <div className=\"flex-1 min-w-0 flex flex-col items-center\">\n <NoContent\n icon=\"sicon-shopping-bag\"\n message={t('common.errors.error_occurred', 'Something went wrong')}\n />\n <button type=\"button\" className=\"link--primary mt-4\" onClick={retryFilters}>\n {t('common.elements.try_again', 'Try again')}\n </button>\n </div>\n ) : (\n <ItemsList<Product>\n key={`${listKey}-${selectedSort}${filteredKey}`}\n resetKey={`${listKey}-${selectedSort}${filteredKey}`}\n items={shownProducts}\n loader={loader}\n mode={shownNext ? '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(\n 'pages.categories.no_products',\n 'No products found in this category'\n )}\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 )}\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 const storeName = ctx.settings?.store?.name;\n // Twig: categories read \"<category> | <store name>\", other listings get the default suffix.\n const pageTitle = category && storeName ? `${title} | ${storeName}` : title;\n\n const base: HeadDescriptor = {\n title: pageTitle,\n appendStoreTitle: !category,\n description: `Browse ${title}`,\n canonical,\n openGraph: {\n type: 'website',\n title: pageTitle,\n description: `Browse ${title}`,\n images: image,\n url: canonical,\n },\n twitter: {\n card: 'summary_large_image',\n title: pageTitle,\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 };\nexport { useAppliedFilters, parseFiltersFromSearch } from './useAppliedFilters';\nexport type { AppliedFiltersStatus } from './useAppliedFilters';\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/useAppliedFilters.ts","../../src/routes/product-listing/ProductListPage.tsx","../../src/routes/product-listing/index.tsx"],"names":["i18n","useState","brand","useEffect","useCallback","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: 'common.titles.discounts',\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('pages.products.search_result'),\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: i18n.t('pages.products.search_result'), 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: i18n.t('common.elements.search_about').replace(':word', 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 // The brand API sends no url.\n { name: brandData.name, url: `/brands/${id}` },\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 { useCallback, useEffect, useState } from 'react';\nimport { product } from '../../api/product';\nimport type { ProductListFilters } from '../../api/product';\nimport type { Product } from '../../types';\nimport type { ProductListLoaderData } from './types';\nimport { onSallaEvent } from '../../utils/sdk-helpers';\n\ntype Source = ProductListLoaderData['source'];\ntype Node = Record<string, unknown>;\n\n/** Path segments that would reach the shared prototype chain if used as object keys. */\nconst UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Reads the `filters[...]` selection `<salla-filters>` writes to the address bar\n * (`filters[k]=v`, `filters[k][]=v`, `filters[k][sub]=v`) back into an object, so a\n * filtered link can be opened directly.\n *\n * The keys come straight from the URL, so nodes are null-prototype objects and any\n * `__proto__` / `constructor` / `prototype` segment drops the whole entry — a crafted\n * `?filters[__proto__][x]=1` must never reach `Object.prototype`.\n */\nexport function parseFiltersFromSearch(search: string): ProductListFilters | null {\n const out: Node = Object.create(null);\n new URLSearchParams(search).forEach((value, rawKey) => {\n if (!rawKey.startsWith('filters[')) return;\n const path = [...rawKey.matchAll(/\\[([^\\]]*)\\]/g)].map((m) => m[1]);\n const isList = path[path.length - 1] === '';\n const keys = isList ? path.slice(0, -1) : path;\n if (!keys.length || keys.includes('') || keys.some((key) => UNSAFE_KEYS.has(key))) return;\n\n let node = out;\n keys.slice(0, -1).forEach((key) => {\n const existing = node[key];\n if (typeof existing !== 'object' || existing === null || Array.isArray(existing)) {\n node[key] = Object.create(null);\n }\n node = node[key] as Node;\n });\n const leaf = keys[keys.length - 1];\n if (isList) {\n node[leaf] = [...(Array.isArray(node[leaf]) ? (node[leaf] as string[]) : []), value];\n } else {\n node[leaf] = value;\n }\n });\n return Object.keys(out).length ? (out as ProductListFilters) : null;\n}\n\ninterface FilteredPage {\n items: Product[];\n next: string | null;\n}\n\nexport type AppliedFiltersStatus = 'idle' | 'loading' | 'ready' | 'error';\n\n/**\n * Applies the `<salla-filters>` selection to the product list.\n *\n * The filters component only rewrites the address bar (`history.pushState`, invisible\n * to the router) and emits `salla-filters::changed`; nothing re-queries the list, so\n * the route's loader output — fetched without filters — kept showing. This listens\n * for that event (and for a filtered URL on first load) and fetches the first page\n * with the selection.\n *\n * Each fetched page is stored with the selection that produced it, so `page` is only\n * ever the page for the *current* selection. Until it arrives `status` is `loading`\n * (and `lastPage` is the previous selection's page, for a dimmed placeholder); if the\n * request fails `status` is `error` and `retry` re-runs it — the old products never\n * pass for the new selection.\n */\nexport function useAppliedFilters(\n source: Source,\n sort: string,\n enabled: boolean\n): {\n filters: ProductListFilters | null;\n page: FilteredPage | null;\n lastPage: FilteredPage | null;\n status: AppliedFiltersStatus;\n retry: () => void;\n} {\n const [filters, setFilters] = useState<ProductListFilters | null>(null);\n const [result, setResult] = useState<{ key: string; page: FilteredPage } | null>(null);\n const [failedKey, setFailedKey] = useState<string | null>(null);\n const [attempt, setAttempt] = useState(0);\n\n useEffect(() => {\n if (!enabled) return;\n setFilters(parseFiltersFromSearch(window.location.search));\n const onChanged = (...args: unknown[]) => {\n const next = args[0] as ProductListFilters | undefined;\n setFilters(next && Object.keys(next).length ? { ...next } : null);\n };\n return onSallaEvent('salla-filters::changed', onChanged);\n }, [enabled, source.type, source.value]);\n\n const key = filters ? JSON.stringify([source.type, source.value, sort, filters]) : '';\n\n useEffect(() => {\n if (!filters) return;\n const controller = new AbortController();\n setFailedKey(null);\n product\n .list({\n source: source.type,\n sourceValue: source.value,\n sort,\n filterable: true,\n filters,\n signal: controller.signal,\n })\n .then((res) => setResult({ key, page: { items: res.items, next: res.next } }))\n .catch(() => {\n // Aborted by a newer selection (its own effect run owns the state now), or failed.\n if (!controller.signal.aborted) setFailedKey(key);\n });\n return () => controller.abort();\n // `key` already encodes filters + source + sort.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key, attempt]);\n\n const retry = useCallback(() => setAttempt((n) => n + 1), []);\n\n if (!filters) return { filters: null, page: null, lastPage: null, status: 'idle', retry };\n\n const page = result?.key === key ? result.page : null;\n const status: AppliedFiltersStatus = page ? 'ready' : failedKey === key ? 'error' : 'loading';\n return { filters, page, lastPage: result?.page ?? null, status, retry };\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 { useTwilight } from '../../providers/TwilightProvider';\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 { useAppliedFilters } from './useAppliedFilters';\nimport type { ProductListLoaderData } from './types';\nimport type { Brand } from '../brands/types';\nimport type { Product } from '../../types';\nimport { onSallaEvent } from '../../utils/sdk-helpers';\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 { theme } = useTwilight();\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 // Re-query the list with the selection made in `<salla-filters>`: the component only\n // rewrites the address bar and emits `salla-filters::changed`, and the route's loader\n // output was fetched without it.\n const {\n filters: appliedFilters,\n page: filteredPage,\n lastPage,\n status: filterStatus,\n retry: retryFilters,\n } = useAppliedFilters(source, selectedSort, !!showFilters);\n // While the new selection loads, the previous page stays up (dimmed, `aria-busy`); if\n // the request fails nothing stale passes for the new selection. Infinite scroll is only\n // live for the loader's own page or a fully loaded filtered one.\n const shownPage = filterStatus === 'ready' ? filteredPage : lastPage;\n const shownProducts =\n filterStatus === 'error'\n ? []\n : filterStatus === 'idle'\n ? products\n : (shownPage?.items ?? products);\n const shownNext =\n filterStatus === 'idle'\n ? pagination?.next\n : filterStatus === 'ready'\n ? filteredPage?.next\n : null;\n const filteredKey =\n filterStatus === 'idle'\n ? ''\n : `-${filterStatus}${filterStatus === 'ready' ? JSON.stringify(appliedFilters) : ''}`;\n\n // Listen for filters changed event to close drawer\n useEffect(() => {\n const handleFiltersChanged = () => setFiltersOpen(false);\n return onSallaEvent('salla-filters::changed', handleFiltersChanged);\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>(shownNext ?? null);\n useEffect(() => {\n nextCursorRef.current = shownNext ?? null;\n }, [shownNext]);\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 ...(appliedFilters && { filterable: true, filters: appliedFilters }),\n });\n\n nextCursorRef.current = result.next;\n\n return result;\n }, [source.type, source.value, selectedSort, appliedFilters]);\n\n return (\n <div key={listKey} className=\"container px-2.5 ms:px-5 mb-10\">\n {theme?.settings?.product_index_show_breadcrumbs !== false && <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\n className={`flex min-h-screen${filterStatus === 'loading' ? ' opacity-60' : ''}`}\n aria-busy={filterStatus === 'loading'}\n >\n {filterStatus === 'error' ? (\n <div className=\"flex-1 min-w-0 flex flex-col items-center\">\n <NoContent\n icon=\"sicon-shopping-bag\"\n message={t('common.errors.error_occurred', 'Something went wrong')}\n />\n <button type=\"button\" className=\"link--primary mt-4\" onClick={retryFilters}>\n {t('common.elements.try_again', 'Try again')}\n </button>\n </div>\n ) : (\n <ItemsList<Product>\n key={`${listKey}-${selectedSort}${filteredKey}`}\n resetKey={`${listKey}-${selectedSort}${filteredKey}`}\n items={shownProducts}\n loader={loader}\n mode={shownNext ? '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(\n 'pages.categories.no_products',\n 'No products found in this category'\n )}\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 )}\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 const storeName = ctx.settings?.store?.name;\n // Twig: categories read \"<category> | <store name>\", other listings get the default suffix.\n const pageTitle = category && storeName ? `${title} | ${storeName}` : title;\n\n const base: HeadDescriptor = {\n title: pageTitle,\n appendStoreTitle: !category,\n description: `Browse ${title}`,\n canonical,\n openGraph: {\n type: 'website',\n title: pageTitle,\n description: `Browse ${title}`,\n images: image,\n url: canonical,\n },\n twitter: {\n card: 'summary_large_image',\n title: pageTitle,\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 };\nexport { useAppliedFilters, parseFiltersFromSearch } from './useAppliedFilters';\nexport type { AppliedFiltersStatus } from './useAppliedFilters';\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,31 +1,31 @@
1
1
  import { buildHreflangAlternates } from '../chunk-TZ3E5BN4.js';
2
- import { ProductsSlider, LazyTestimonials } from '../chunk-W5K6YUA2.js';
3
- import '../chunk-Y43T7PJV.js';
4
- import { product } from '../chunk-HDO37URJ.js';
5
- import { ProductGallery, LazyProductDetails, LazyAddToCartForm } from '../chunk-FAVZMJRY.js';
2
+ import { ProductsSlider, LazyTestimonials } from '../chunk-AH6KEBKX.js';
3
+ import '../chunk-TY3XJOIQ.js';
4
+ import { product } from '../chunk-K6SNUM3L.js';
5
+ import { ProductGallery, LazyProductDetails, LazyAddToCartForm } from '../chunk-ITHU2R5C.js';
6
6
  import '../chunk-342EPVXN.js';
7
- import { fastCheckoutScript } from '../chunk-UEQFXSTX.js';
8
- import '../chunk-3Q22KK7C.js';
7
+ import { fastCheckoutScript } from '../chunk-DISOIXUL.js';
8
+ import '../chunk-CTLTXDHH.js';
9
9
  import '../chunk-JKIRRMBU.js';
10
10
  import '../chunk-2JV6WZ6O.js';
11
- import '../chunk-UIOLSYKV.js';
11
+ import '../chunk-ETPOZJHG.js';
12
12
  import '../chunk-VVZNW5CB.js';
13
13
  import '../chunk-2XGQSJKH.js';
14
14
  import '../chunk-SSPAMQRV.js';
15
15
  import { RouteId } from '../chunk-ZGHRSRDO.js';
16
- import { useComments } from '../chunk-GOPUP26T.js';
16
+ import { useComments } from '../chunk-E43ALK3R.js';
17
17
  import '../chunk-C5X6CVXC.js';
18
- import '../chunk-UZKTK6YV.js';
19
- import '../chunk-5X2UFNKY.js';
20
- import '../chunk-P3OPJL6I.js';
21
- import '../chunk-WY4IYO3G.js';
22
- import '../chunk-TYLKNVQA.js';
23
- import '../chunk-SR4OTLTJ.js';
24
- import { getTwilightContext } from '../chunk-N2S25NXP.js';
18
+ import '../chunk-NCTG4ZTU.js';
19
+ import '../chunk-DZT26OCM.js';
20
+ import '../chunk-IKUDCH7Q.js';
25
21
  import '../chunk-TP3LCGE7.js';
26
22
  import '../chunk-Z653O7MX.js';
27
23
  import '../chunk-ZCH7W7DZ.js';
28
- import { useProduct } from '../chunk-PWBMSGMU.js';
24
+ import { useProduct } from '../chunk-H7BCB2HO.js';
25
+ import '../chunk-5Y64476S.js';
26
+ import '../chunk-TYLKNVQA.js';
27
+ import '../chunk-SR4OTLTJ.js';
28
+ import { getTwilightContext } from '../chunk-N2S25NXP.js';
29
29
  import '../chunk-JWXJPJBO.js';
30
30
  import '../chunk-CW625T2E.js';
31
31
  import '../chunk-7V36I5GT.js';
@@ -37,7 +37,7 @@ import '../chunk-T72DAX7R.js';
37
37
  import '../chunk-RJPPO3ET.js';
38
38
  import { HookSlot } from '../chunk-Q7VWURUR.js';
39
39
  import '../chunk-GU2KUQVD.js';
40
- import { LazyBreadcrumb, LazyRenderWhenVisible } from '../chunk-SOPZ72BU.js';
40
+ import { LazyBreadcrumb, LazyRenderWhenVisible } from '../chunk-J2YKHDMH.js';
41
41
  import '../chunk-AXW67SY7.js';
42
42
  import '../chunk-BYMOPN2S.js';
43
43
  import '../chunk-SKLEJJ6M.js';
@@ -18,7 +18,7 @@ async function testimonialsLoader(_ctx) {
18
18
 
19
19
  // src/routes/testimonials/index.tsx
20
20
  var LazyTestimonialsPage = lazy(
21
- () => import('../TestimonialsPage-CKAYXFER.js').then((m) => ({ default: m.TestimonialsPage }))
21
+ () => import('../TestimonialsPage-Q5UIOYG6.js').then((m) => ({ default: m.TestimonialsPage }))
22
22
  );
23
23
  var TestimonialsPage = LazyTestimonialsPage;
24
24
  async function loader(ctx, extend) {
@@ -1 +1 @@
1
- {"version":3,"file":"ThankYouPage.d.ts","sourceRoot":"","sources":["../../../src/routes/thank-you/ThankYouPage.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAOjD,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,KAAK,EACL,eAAe,EACf,QAAyB,GAC1B,EAAE,iBAAiB,+BAmOnB"}
1
+ {"version":3,"file":"ThankYouPage.d.ts","sourceRoot":"","sources":["../../../src/routes/thank-you/ThankYouPage.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAQjD,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,KAAK,EACL,eAAe,EACf,QAAyB,GAC1B,EAAE,iBAAiB,+BA4NnB"}