@salla.sa/twilight-theme-engine 1.0.61 → 1.0.63

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 (277) hide show
  1. package/dist/{AddToCartForm-RAQX7VHU.js → AddToCartForm-365O6IQY.js} +26 -6
  2. package/dist/AddToCartForm-365O6IQY.js.map +1 -0
  3. package/dist/{BlogAuthorPage-HV6JUJNL.js → BlogAuthorPage-QIII3YRK.js} +12 -11
  4. package/dist/BlogAuthorPage-QIII3YRK.js.map +1 -0
  5. package/dist/{BlogCategoryPage-ATPIVUAL.js → BlogCategoryPage-HNGWYTN6.js} +12 -11
  6. package/dist/BlogCategoryPage-HNGWYTN6.js.map +1 -0
  7. package/dist/{BlogPage-6IIOSB45.js → BlogPage-7NGO5VLL.js} +10 -9
  8. package/dist/BlogPage-7NGO5VLL.js.map +1 -0
  9. package/dist/{BlogSinglePage-DV3XYB26.js → BlogSinglePage-Y42LPA2L.js} +10 -9
  10. package/dist/BlogSinglePage-Y42LPA2L.js.map +1 -0
  11. package/dist/{BlogTagPage-RVJIXERD.js → BlogTagPage-ZCFYLXH6.js} +12 -11
  12. package/dist/BlogTagPage-ZCFYLXH6.js.map +1 -0
  13. package/dist/{BrandsPage-RQXP67LV.js → BrandsPage-PPJVASUW.js} +11 -10
  14. package/dist/BrandsPage-PPJVASUW.js.map +1 -0
  15. package/dist/{Breadcrumb-NXXVZJJD.js → Breadcrumb-4DUAJK3V.js} +10 -9
  16. package/dist/Breadcrumb-4DUAJK3V.js.map +1 -0
  17. package/dist/{CartItem-XRWTSJB5.js → CartItem-T4N3HMXU.js} +83 -59
  18. package/dist/CartItem-T4N3HMXU.js.map +1 -0
  19. package/dist/{CartSummary-F6BY5APF.js → CartSummary-Z25JDFWN.js} +10 -9
  20. package/dist/CartSummary-Z25JDFWN.js.map +1 -0
  21. package/dist/{Copyright-TEDF6HMC.js → Copyright-WNJIDKSR.js} +3 -3
  22. package/dist/{Copyright-TEDF6HMC.js.map → Copyright-WNJIDKSR.js.map} +1 -1
  23. package/dist/{CustomerLayout-T5BSTU6T.js → CustomerLayout-A6DVYYC3.js} +10 -9
  24. package/dist/CustomerLayout-A6DVYYC3.js.map +1 -0
  25. package/dist/{Footer-IRX2WAEF.js → Footer-3YBOSAO5.js} +10 -9
  26. package/dist/{Footer-IRX2WAEF.js.map → Footer-3YBOSAO5.js.map} +1 -1
  27. package/dist/{Header-HQKDTZSI.js → Header-6M7TVMSW.js} +6 -6
  28. package/dist/{Header-HQKDTZSI.js.map → Header-6M7TVMSW.js.map} +1 -1
  29. package/dist/LoyaltyPage-XQJ6RDT6.js +61 -0
  30. package/dist/LoyaltyPage-XQJ6RDT6.js.map +1 -0
  31. package/dist/LoyaltyPointsPage-K75LJNNP.js +16 -0
  32. package/dist/LoyaltyPointsPage-K75LJNNP.js.map +1 -0
  33. package/dist/{MainMenu-4ZPVIJCN.js → MainMenu-V7GPKDTU.js} +3 -3
  34. package/dist/{MainMenu-4ZPVIJCN.js.map → MainMenu-V7GPKDTU.js.map} +1 -1
  35. package/dist/{MasterLayout-G3MVZLYZ.js → MasterLayout-MBQ4JM3D.js} +10 -9
  36. package/dist/{MasterLayout-G3MVZLYZ.js.map → MasterLayout-MBQ4JM3D.js.map} +1 -1
  37. package/dist/{MobileMenu-A5DBTPS7.js → MobileMenu-UFX4ZHW7.js} +10 -9
  38. package/dist/MobileMenu-UFX4ZHW7.js.map +1 -0
  39. package/dist/{NotificationsPage-T2O67MLD.js → NotificationsPage-M3YK2HRM.js} +10 -9
  40. package/dist/NotificationsPage-M3YK2HRM.js.map +1 -0
  41. package/dist/{OrderSinglePage-4W4JZX7I.js → OrderSinglePage-7LIUMNRB.js} +11 -10
  42. package/dist/OrderSinglePage-7LIUMNRB.js.map +1 -0
  43. package/dist/{OrdersPage-DYKFBMRC.js → OrdersPage-WI4OSGBF.js} +11 -10
  44. package/dist/OrdersPage-WI4OSGBF.js.map +1 -0
  45. package/dist/{PageSingle-6U6GPMXJ.js → PageSingle-HRMSVNHN.js} +4 -4
  46. package/dist/{PageSingle-6U6GPMXJ.js.map → PageSingle-HRMSVNHN.js.map} +1 -1
  47. package/dist/{ProductDetails-OWSIL357.js → ProductDetails-GAC3NYQM.js} +10 -3
  48. package/dist/ProductDetails-GAC3NYQM.js.map +1 -0
  49. package/dist/{ProfilePage-LLCIJHAI.js → ProfilePage-33I2XTJ6.js} +10 -9
  50. package/dist/ProfilePage-33I2XTJ6.js.map +1 -0
  51. package/dist/{SeoCartWidget-ZL3FTBWK.js → SeoCartWidget-AEG2YLEF.js} +13 -12
  52. package/dist/SeoCartWidget-AEG2YLEF.js.map +1 -0
  53. package/dist/{SettingsPage-2XU5IF4A.js → SettingsPage-N3M677LP.js} +10 -9
  54. package/dist/SettingsPage-N3M677LP.js.map +1 -0
  55. package/dist/{StoreClosedNotification-CNJI2Q26.js → StoreClosedNotification-5MTDRRC3.js} +11 -10
  56. package/dist/{StoreClosedNotification-CNJI2Q26.js.map → StoreClosedNotification-5MTDRRC3.js.map} +1 -1
  57. package/dist/{TestimonialsPage-QYPLMNWL.js → TestimonialsPage-Z64P6MZX.js} +4 -4
  58. package/dist/{TestimonialsPage-QYPLMNWL.js.map → TestimonialsPage-Z64P6MZX.js.map} +1 -1
  59. package/dist/{ThankYouPage-WG3CM5JP.js → ThankYouPage-ZXQZMWCX.js} +14 -12
  60. package/dist/ThankYouPage-ZXQZMWCX.js.map +1 -0
  61. package/dist/{WalletPage-J7CH22JM.js → WalletPage-557AU5GH.js} +10 -9
  62. package/dist/WalletPage-557AU5GH.js.map +1 -0
  63. package/dist/{WishlistPage-ZXWYB56R.js → WishlistPage-HTDQW2N2.js} +150 -26
  64. package/dist/WishlistPage-HTDQW2N2.js.map +1 -0
  65. package/dist/api/brands.js +3 -3
  66. package/dist/api/cart.d.ts +7 -6
  67. package/dist/api/cart.d.ts.map +1 -1
  68. package/dist/api/cart.js +3 -3
  69. package/dist/api/category.js +3 -3
  70. package/dist/api/loyalty.js +3 -3
  71. package/dist/api/order.js +3 -3
  72. package/dist/api/page.js +3 -3
  73. package/dist/api/product.js +3 -3
  74. package/dist/api/store.d.ts +12 -0
  75. package/dist/api/store.d.ts.map +1 -1
  76. package/dist/api/store.js +1 -1
  77. package/dist/api/wishlist.js +4 -4
  78. package/dist/{chunk-3YVAYIM4.js → chunk-4KTY2FT6.js} +6 -6
  79. package/dist/{chunk-3YVAYIM4.js.map → chunk-4KTY2FT6.js.map} +1 -1
  80. package/dist/chunk-7V36I5GT.js +26 -0
  81. package/dist/chunk-7V36I5GT.js.map +1 -0
  82. package/dist/{chunk-OET4G4XC.js → chunk-BE3JDKE2.js} +19 -3
  83. package/dist/chunk-BE3JDKE2.js.map +1 -0
  84. package/dist/{chunk-2U3PUO3V.js → chunk-EIJXSBL6.js} +34 -17
  85. package/dist/chunk-EIJXSBL6.js.map +1 -0
  86. package/dist/{chunk-7OIP65ER.js → chunk-EQ32CL4D.js} +7 -4
  87. package/dist/chunk-EQ32CL4D.js.map +1 -0
  88. package/dist/{chunk-IZFZLJHD.js → chunk-EXKTSWBC.js} +5 -5
  89. package/dist/{chunk-IZFZLJHD.js.map → chunk-EXKTSWBC.js.map} +1 -1
  90. package/dist/{chunk-PK7EU5TM.js → chunk-GD26FI4J.js} +2 -2
  91. package/dist/chunk-GD26FI4J.js.map +1 -0
  92. package/dist/{chunk-YMVLYYLU.js → chunk-GOPUP26T.js} +4 -4
  93. package/dist/chunk-GOPUP26T.js.map +1 -0
  94. package/dist/{chunk-N4THXNXA.js → chunk-HSVGQ2DV.js} +12 -10
  95. package/dist/chunk-HSVGQ2DV.js.map +1 -0
  96. package/dist/{chunk-WH225GEC.js → chunk-I62RENKM.js} +3 -3
  97. package/dist/{chunk-WH225GEC.js.map → chunk-I62RENKM.js.map} +1 -1
  98. package/dist/{chunk-TDZSHACC.js → chunk-IC7YN4OQ.js} +3 -3
  99. package/dist/{chunk-TDZSHACC.js.map → chunk-IC7YN4OQ.js.map} +1 -1
  100. package/dist/{chunk-4DHLIY6V.js → chunk-IIYK56TI.js} +4 -3
  101. package/dist/chunk-IIYK56TI.js.map +1 -0
  102. package/dist/chunk-JKT44Y2M.js +14 -0
  103. package/dist/{chunk-ZPRZQTYM.js.map → chunk-JKT44Y2M.js.map} +1 -1
  104. package/dist/{chunk-W2B5P54C.js → chunk-KHRIGLYL.js} +3 -3
  105. package/dist/{chunk-W2B5P54C.js.map → chunk-KHRIGLYL.js.map} +1 -1
  106. package/dist/{chunk-NHKP5XIG.js → chunk-KILNHLWE.js} +4 -4
  107. package/dist/{chunk-NHKP5XIG.js.map → chunk-KILNHLWE.js.map} +1 -1
  108. package/dist/{chunk-ZQGMVUPE.js → chunk-KWHCKGLL.js} +3 -3
  109. package/dist/{chunk-ZQGMVUPE.js.map → chunk-KWHCKGLL.js.map} +1 -1
  110. package/dist/{chunk-LCJW7JKZ.js → chunk-LUTMPFRW.js} +4 -4
  111. package/dist/{chunk-LCJW7JKZ.js.map → chunk-LUTMPFRW.js.map} +1 -1
  112. package/dist/{chunk-YH4O3H4R.js → chunk-NPEI4SAZ.js} +3 -3
  113. package/dist/{chunk-YH4O3H4R.js.map → chunk-NPEI4SAZ.js.map} +1 -1
  114. package/dist/{chunk-JVGZDLFP.js → chunk-PE3LLBNR.js} +3 -3
  115. package/dist/{chunk-JVGZDLFP.js.map → chunk-PE3LLBNR.js.map} +1 -1
  116. package/dist/{chunk-3U26OMNO.js → chunk-PWBMSGMU.js} +24 -17
  117. package/dist/chunk-PWBMSGMU.js.map +1 -0
  118. package/dist/{chunk-VSJLPWFI.js → chunk-Q5UYV2EN.js} +3 -3
  119. package/dist/{chunk-VSJLPWFI.js.map → chunk-Q5UYV2EN.js.map} +1 -1
  120. package/dist/{chunk-GUGZ4CEG.js → chunk-S3CC2YGF.js} +3 -3
  121. package/dist/{chunk-GUGZ4CEG.js.map → chunk-S3CC2YGF.js.map} +1 -1
  122. package/dist/{chunk-NFTOMTTI.js → chunk-UFPZXWGM.js} +4 -4
  123. package/dist/{chunk-NFTOMTTI.js.map → chunk-UFPZXWGM.js.map} +1 -1
  124. package/dist/{chunk-TLAEW7TB.js → chunk-UH5ZXDEO.js} +3 -3
  125. package/dist/{chunk-TLAEW7TB.js.map → chunk-UH5ZXDEO.js.map} +1 -1
  126. package/dist/{chunk-3ITQB3PY.js → chunk-VLBQPVHM.js} +3 -3
  127. package/dist/{chunk-3ITQB3PY.js.map → chunk-VLBQPVHM.js.map} +1 -1
  128. package/dist/{chunk-TLO2M5TJ.js → chunk-W66OHTSM.js} +3 -3
  129. package/dist/{chunk-TLO2M5TJ.js.map → chunk-W66OHTSM.js.map} +1 -1
  130. package/dist/{chunk-6IDCWH5K.js → chunk-XFCJM6RN.js} +7 -7
  131. package/dist/{chunk-6IDCWH5K.js.map → chunk-XFCJM6RN.js.map} +1 -1
  132. package/dist/chunk-Y7HKVYDG.js +21 -0
  133. package/dist/chunk-Y7HKVYDG.js.map +1 -0
  134. package/dist/{chunk-VJHDE6UT.js → chunk-YEY3SO23.js} +3 -3
  135. package/dist/{chunk-VJHDE6UT.js.map → chunk-YEY3SO23.js.map} +1 -1
  136. package/dist/{chunk-FUIPNVQY.js → chunk-YLPI4HDD.js} +9 -6
  137. package/dist/chunk-YLPI4HDD.js.map +1 -0
  138. package/dist/{chunk-TFB3QXYH.js → chunk-ZGHRSRDO.js} +3 -2
  139. package/dist/chunk-ZGHRSRDO.js.map +1 -0
  140. package/dist/components/cart/CartItem.d.ts.map +1 -1
  141. package/dist/components/cart/index.js +1 -1
  142. package/dist/components/common/index.js +1 -1
  143. package/dist/components/drawer/index.js +8 -7
  144. package/dist/components/home/index.js +11 -10
  145. package/dist/components/layout/index.js +1 -18
  146. package/dist/components/layout/index.js.map +1 -1
  147. package/dist/components/product/AddToCartForm.d.ts.map +1 -1
  148. package/dist/components/product/ProductCard.d.ts.map +1 -1
  149. package/dist/components/product/ProductDetails.d.ts.map +1 -1
  150. package/dist/components/product/index.js +9 -8
  151. package/dist/components/store/index.js +10 -9
  152. package/dist/components/store/index.js.map +1 -1
  153. package/dist/{document-class-7KPUN2DK.js → document-class-SKCL6IJF.js} +9 -9
  154. package/dist/{document-class-7KPUN2DK.js.map → document-class-SKCL6IJF.js.map} +1 -1
  155. package/dist/hooks/index.d.ts +1 -0
  156. package/dist/hooks/index.d.ts.map +1 -1
  157. package/dist/hooks/index.js +8 -7
  158. package/dist/hooks/useComments.js +1 -1
  159. package/dist/hooks/useGtm.js +8 -7
  160. package/dist/hooks/useHostAttributes.d.ts +4 -0
  161. package/dist/hooks/useHostAttributes.d.ts.map +1 -0
  162. package/dist/hooks/useHostAttributes.js +4 -0
  163. package/dist/hooks/useHostAttributes.js.map +1 -0
  164. package/dist/hooks/useMoney.js +8 -7
  165. package/dist/hooks/useProduct.d.ts.map +1 -1
  166. package/dist/hooks/useProduct.js +1 -1
  167. package/dist/hooks/useStore.js +8 -7
  168. package/dist/index.js +8 -7
  169. package/dist/index.js.map +1 -1
  170. package/dist/{navigation-QMBOIYJI.js → navigation-ESPAHRXM.js} +5 -5
  171. package/dist/{navigation-QMBOIYJI.js.map → navigation-ESPAHRXM.js.map} +1 -1
  172. package/dist/{navigation-XZJCQXY3.js → navigation-YKRXGGSL.js} +4 -4
  173. package/dist/{navigation-XZJCQXY3.js.map → navigation-YKRXGGSL.js.map} +1 -1
  174. package/dist/{not-found-UE5XOV5C.js → not-found-KBOXJ3AG.js} +11 -10
  175. package/dist/not-found-KBOXJ3AG.js.map +1 -0
  176. package/dist/providers/TwilightProvider.d.ts.map +1 -1
  177. package/dist/providers/index.js +8 -7
  178. package/dist/providers/twilight-init.d.ts.map +1 -1
  179. package/dist/router/route-ids.d.ts +1 -0
  180. package/dist/router/route-ids.d.ts.map +1 -1
  181. package/dist/routes/account/orders.js +4 -4
  182. package/dist/routes/account/wishlist/WishlistPage.d.ts +1 -1
  183. package/dist/routes/account/wishlist/WishlistPage.d.ts.map +1 -1
  184. package/dist/routes/account/wishlist/WishlistShare.d.ts +1 -0
  185. package/dist/routes/account/wishlist/WishlistShare.d.ts.map +1 -1
  186. package/dist/routes/account.js +11 -11
  187. package/dist/routes/blog.js +8 -8
  188. package/dist/routes/brands.js +4 -4
  189. package/dist/routes/cart/CartPage.d.ts.map +1 -1
  190. package/dist/routes/cart.js +17 -16
  191. package/dist/routes/cart.js.map +1 -1
  192. package/dist/routes/home.js +12 -11
  193. package/dist/routes/index.d.ts +1 -1
  194. package/dist/routes/index.d.ts.map +1 -1
  195. package/dist/routes/index.js +3 -3
  196. package/dist/routes/loyalty/LoyaltyPage.d.ts +1 -1
  197. package/dist/routes/loyalty/LoyaltyPage.d.ts.map +1 -1
  198. package/dist/routes/loyalty/LoyaltyPointsPage.d.ts +3 -0
  199. package/dist/routes/loyalty/LoyaltyPointsPage.d.ts.map +1 -0
  200. package/dist/routes/loyalty/index.d.ts +15 -3
  201. package/dist/routes/loyalty/index.d.ts.map +1 -1
  202. package/dist/routes/loyalty/loader.d.ts +2 -1
  203. package/dist/routes/loyalty/loader.d.ts.map +1 -1
  204. package/dist/routes/loyalty/types.d.ts +3 -0
  205. package/dist/routes/loyalty/types.d.ts.map +1 -1
  206. package/dist/routes/loyalty.js +62 -11
  207. package/dist/routes/loyalty.js.map +1 -1
  208. package/dist/routes/page.js +4 -4
  209. package/dist/routes/product/index.d.ts.map +1 -1
  210. package/dist/routes/product-listing/index.d.ts.map +1 -1
  211. package/dist/routes/product-listing.js +23 -19
  212. package/dist/routes/product-listing.js.map +1 -1
  213. package/dist/routes/product.js +16 -13
  214. package/dist/routes/product.js.map +1 -1
  215. package/dist/routes/seo-redirects.js +3 -3
  216. package/dist/routes/testimonials.js +2 -2
  217. package/dist/routes/thank-you/ThankYouPage.d.ts.map +1 -1
  218. package/dist/routes/thank-you.js +4 -4
  219. package/dist/skeleton.js +12 -11
  220. package/dist/tanstack/document-class.d.ts.map +1 -1
  221. package/dist/tanstack/head.d.ts +1 -4
  222. package/dist/tanstack/head.d.ts.map +1 -1
  223. package/dist/tanstack/router.d.ts.map +1 -1
  224. package/dist/tanstack/templates/locale-wrapper.d.ts.map +1 -1
  225. package/dist/tanstack.js +10 -10
  226. package/dist/types/index.d.ts +1 -0
  227. package/dist/types/index.d.ts.map +1 -1
  228. package/dist/types/salla-sdk.d.ts +1 -1
  229. package/dist/types/salla-sdk.d.ts.map +1 -1
  230. package/dist/utils/head.d.ts +3 -0
  231. package/dist/utils/head.d.ts.map +1 -1
  232. package/dist/utils/head.js +1 -1
  233. package/dist/utils/index.js +1 -1
  234. package/dist/vite/adapters/tanstack.adapter.d.ts.map +1 -1
  235. package/dist/vite/index.js +92 -11
  236. package/dist/vite/index.js.map +1 -1
  237. package/dist/vite/plugins/best-practices/hooks-registry.d.ts.map +1 -1
  238. package/dist/vite/plugins/component-deps.d.ts +5 -0
  239. package/dist/vite/plugins/component-deps.d.ts.map +1 -0
  240. package/dist/vite/plugins/package-aliases.plugin.d.ts.map +1 -1
  241. package/package.json +5 -1
  242. package/dist/AddToCartForm-RAQX7VHU.js.map +0 -1
  243. package/dist/BlogAuthorPage-HV6JUJNL.js.map +0 -1
  244. package/dist/BlogCategoryPage-ATPIVUAL.js.map +0 -1
  245. package/dist/BlogPage-6IIOSB45.js.map +0 -1
  246. package/dist/BlogSinglePage-DV3XYB26.js.map +0 -1
  247. package/dist/BlogTagPage-RVJIXERD.js.map +0 -1
  248. package/dist/BrandsPage-RQXP67LV.js.map +0 -1
  249. package/dist/Breadcrumb-NXXVZJJD.js.map +0 -1
  250. package/dist/CartItem-XRWTSJB5.js.map +0 -1
  251. package/dist/CartSummary-F6BY5APF.js.map +0 -1
  252. package/dist/CustomerLayout-T5BSTU6T.js.map +0 -1
  253. package/dist/LoyaltyPage-AIUDZLT7.js +0 -194
  254. package/dist/LoyaltyPage-AIUDZLT7.js.map +0 -1
  255. package/dist/MobileMenu-A5DBTPS7.js.map +0 -1
  256. package/dist/NotificationsPage-T2O67MLD.js.map +0 -1
  257. package/dist/OrderSinglePage-4W4JZX7I.js.map +0 -1
  258. package/dist/OrdersPage-DYKFBMRC.js.map +0 -1
  259. package/dist/ProductDetails-OWSIL357.js.map +0 -1
  260. package/dist/ProfilePage-LLCIJHAI.js.map +0 -1
  261. package/dist/SeoCartWidget-ZL3FTBWK.js.map +0 -1
  262. package/dist/SettingsPage-2XU5IF4A.js.map +0 -1
  263. package/dist/ThankYouPage-WG3CM5JP.js.map +0 -1
  264. package/dist/WalletPage-J7CH22JM.js.map +0 -1
  265. package/dist/WishlistPage-ZXWYB56R.js.map +0 -1
  266. package/dist/chunk-2U3PUO3V.js.map +0 -1
  267. package/dist/chunk-3U26OMNO.js.map +0 -1
  268. package/dist/chunk-4DHLIY6V.js.map +0 -1
  269. package/dist/chunk-7OIP65ER.js.map +0 -1
  270. package/dist/chunk-FUIPNVQY.js.map +0 -1
  271. package/dist/chunk-N4THXNXA.js.map +0 -1
  272. package/dist/chunk-OET4G4XC.js.map +0 -1
  273. package/dist/chunk-PK7EU5TM.js.map +0 -1
  274. package/dist/chunk-TFB3QXYH.js.map +0 -1
  275. package/dist/chunk-YMVLYYLU.js.map +0 -1
  276. package/dist/chunk-ZPRZQTYM.js +0 -14
  277. package/dist/not-found-UE5XOV5C.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { LazyCurrencySymbol } from './chunk-TLAEW7TB.js';
1
+ import { LazyCurrencySymbol } from './chunk-UH5ZXDEO.js';
2
2
  import './chunk-AXW67SY7.js';
3
3
  import './chunk-BYMOPN2S.js';
4
4
  import './chunk-SKLEJJ6M.js';
@@ -12,17 +12,21 @@ import { SallaMultipleBundleProduct } from '@salla.sa/twilight-components-react/
12
12
  import { SallaProductOptionsCore } from '@salla.sa/twilight-components-react/product-options';
13
13
  import { SallaProductSizeGuide } from '@salla.sa/twilight-components-react/product-size-guide';
14
14
  import { SallaQuantityInput } from '@salla.sa/twilight-components-react/quantity-input';
15
+ import { useHostAttributes } from '@salla.sa/twilight-theme-engine/hooks/useHostAttributes';
15
16
  import { useTranslation } from '@salla.sa/twilight-theme-engine/i18n';
16
17
  import { useState, useCallback, useEffect } from 'react';
17
18
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
18
19
 
19
20
  var handleSubmit = (e) => {
20
21
  e.preventDefault();
21
- window.salla?.form.onSubmit("cart.addItem", e);
22
+ window.salla?.form.onSubmit("cart.addItem", e.nativeEvent);
22
23
  };
23
24
  var handleChange = (e) => {
24
25
  const form = e.currentTarget;
25
- if (form.reportValidity()) {
26
+ const isComplete = Array.from(form.elements).every(
27
+ (el) => !el.willValidate || el.validity.valid
28
+ );
29
+ if (isComplete) {
26
30
  window.salla?.product?.getPrice(new FormData(form));
27
31
  }
28
32
  };
@@ -58,6 +62,20 @@ function AddToCartForm({
58
62
  const hasPreorder = product.has_preorder_campaign && product.preorder;
59
63
  const hasWeightOrSizeGuide = product.weight || product.has_size_guide;
60
64
  const hasAttachments = product.can_add_note || product.can_upload_file;
65
+ const amount = typeof product.base_currency_price === "object" ? product.base_currency_price.amount : product.base_currency_price;
66
+ const quantityRef = useHostAttributes({
67
+ max: product.max_quantity,
68
+ value: 1,
69
+ name: "quantity"
70
+ });
71
+ const addButtonRef = useHostAttributes({
72
+ amount,
73
+ "loader-position": "end",
74
+ type: "submit",
75
+ width: "wide",
76
+ "required-shipping": product.is_require_shipping,
77
+ "is-subscribed": product.notify_availability?.subscribed
78
+ });
61
79
  return /* @__PURE__ */ jsxs(
62
80
  "form",
63
81
  {
@@ -248,6 +266,7 @@ function AddToCartForm({
248
266
  /* @__PURE__ */ jsx(
249
267
  SallaQuantityInput,
250
268
  {
269
+ ref: quantityRef,
251
270
  max: product.max_quantity ?? void 0,
252
271
  value: 1,
253
272
  name: "quantity",
@@ -259,11 +278,12 @@ function AddToCartForm({
259
278
  /* @__PURE__ */ jsx(
260
279
  SallaAddProductButton,
261
280
  {
281
+ ref: addButtonRef,
262
282
  ...product.can_quick_buy ? { quickBuy: true } : {},
263
283
  ...stickyAddToCart ? { supportStickyBar: true } : {},
264
284
  ...product.is_require_shipping ? { requiredShipping: true } : {},
265
285
  ...hasPreorder ? { hasPreOrder: true } : {},
266
- amount: typeof product.base_currency_price === "object" ? product.base_currency_price.amount : product.base_currency_price,
286
+ amount,
267
287
  className: "mt-5 w-full sticky-product-bar__btn",
268
288
  productStatus: product.status,
269
289
  productType: product.type,
@@ -300,5 +320,5 @@ function AddToCartForm({
300
320
  }
301
321
 
302
322
  export { AddToCartForm };
303
- //# sourceMappingURL=AddToCartForm-RAQX7VHU.js.map
304
- //# sourceMappingURL=AddToCartForm-RAQX7VHU.js.map
323
+ //# sourceMappingURL=AddToCartForm-365O6IQY.js.map
324
+ //# sourceMappingURL=AddToCartForm-365O6IQY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/product/AddToCartForm.tsx"],"names":["SallaProductOptions"],"mappings":"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","file":"AddToCartForm-365O6IQY.js","sourcesContent":["import { SallaAddProductButton } from '@salla.sa/twilight-components-react/add-product-button';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { SallaCountDown } from '@salla.sa/twilight-components-react/count-down';\nimport { SallaFileUpload } from '@salla.sa/twilight-components-react/file-upload';\nimport { SallaGifting } from '@salla.sa/twilight-components-react/gifting';\nimport { SallaMultipleBundleProduct } from '@salla.sa/twilight-components-react/multiple-bundle-product';\n// Use the eager (non-deferred) Core export: product options are an essential form\n// control, and the deferred wrapper's visibility-triggered hydration races with the\n// gallery's image layout shift and gets stuck on the skeleton, so options never appear.\nimport { SallaProductOptionsCore as SallaProductOptions } from '@salla.sa/twilight-components-react/product-options';\nimport { SallaProductSizeGuide } from '@salla.sa/twilight-components-react/product-size-guide';\nimport { SallaQuantityInput } from '@salla.sa/twilight-components-react/quantity-input';\nimport { useHostAttributes } from '@salla.sa/twilight-theme-engine/hooks/useHostAttributes';\nimport { useTranslation } from '@salla.sa/twilight-theme-engine/i18n';\nimport type { ReactNode } from 'react';\nimport { useCallback, useEffect, useState } from 'react';\nimport type { Product } from '../../types';\nimport { CurrencySymbol } from '../common';\n\ninterface AddToCartFormProps {\n product: Product;\n stickyAddToCart?: boolean;\n giftingIntro?: string;\n formStartSlot?: ReactNode;\n formEndSlot?: ReactNode;\n}\n\nconst handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n // Native event, like Twig's onsubmit: the SDK spins its submitter's salla-button until the add settles.\n window.salla?.form.onSubmit('cart.addItem', e.nativeEvent);\n};\n\nconst handleChange = (e: React.FormEvent<HTMLFormElement>) => {\n const form = e.currentTarget;\n // Not reportValidity(): it focuses and scrolls to the first empty required option mid-edit.\n const isComplete = Array.from(form.elements).every(\n (el) => !(el as HTMLInputElement).willValidate || (el as HTMLInputElement).validity.valid\n );\n if (isComplete) {\n window.salla?.product?.getPrice(new FormData(form));\n }\n};\n\nexport function AddToCartForm({\n product,\n stickyAddToCart,\n giftingIntro,\n formStartSlot,\n formEndSlot,\n}: AddToCartFormProps) {\n const { t } = useTranslation();\n const [activeCollapse, setActiveCollapse] = useState<string | null>(null);\n\n // stable ref: an inline arrow re-runs on every render and resets the user's selection\n const optionsRef = useCallback(\n (el: { setOptionsData?: (data: never[]) => void } | null) =>\n void el?.setOptionsData?.(product.options as never[]),\n [product.options]\n );\n\n // salla-product-options reads its `options` prop only in its constructor (no\n // @Watch), and on first load that constructor runs before sdk.init has set\n // page.id — so its getDetails(page.id) fallback fetches nothing and the options\n // never reflect. Seed page.id (=== product.id) and wait for the SDK to be ready\n // before mounting the element so its fallback resolves on first load too.\n const [optionsReady, setOptionsReady] = useState(false);\n useEffect(() => {\n const salla = window.salla;\n if (!salla) return;\n let alive = true;\n salla.config?.set?.('page.id', product.id);\n Promise.resolve(salla.onReady?.()).finally(() => {\n if (alive) setOptionsReady(true);\n });\n return () => {\n alive = false;\n };\n }, [product.id]);\n\n const handleCollapseToggle = useCallback((id: string) => {\n setActiveCollapse((current) => (current === id ? null : id));\n }, []);\n\n const hasPreorder = product.has_preorder_campaign && product.preorder;\n const hasWeightOrSizeGuide = product.weight || product.has_size_guide;\n const hasAttachments = product.can_add_note || product.can_upload_file;\n const amount =\n typeof product.base_currency_price === 'object'\n ? product.base_currency_price.amount\n : product.base_currency_price;\n\n const quantityRef = useHostAttributes({\n max: product.max_quantity,\n value: 1,\n name: 'quantity',\n });\n const addButtonRef = useHostAttributes({\n amount,\n 'loader-position': 'end',\n type: 'submit',\n width: 'wide',\n 'required-shipping': product.is_require_shipping,\n 'is-subscribed': product.notify_availability?.subscribed,\n });\n\n return (\n <form\n className=\"form product-form\"\n encType=\"multipart/form-data\"\n method=\"post\"\n onSubmit={handleSubmit}\n onChange={handleChange}\n >\n <input type=\"hidden\" name=\"id\" value={product.id} />\n\n {formStartSlot}\n\n {optionsReady && product.options && product.options.length > 0 && (\n <SallaProductOptions\n key={product.id}\n // constructor-only options parse: push data via ref on client remount\n ref={optionsRef}\n options={JSON.stringify(product.options)}\n productId={product.id}\n />\n )}\n\n {product.has_bundle_products && (\n <SallaMultipleBundleProduct bundleSections={JSON.stringify(product)} />\n )}\n\n {hasWeightOrSizeGuide && (\n <section className=\"bg-white p-5 rounded-md mb-5\">\n {product.weight && (\n <div\n className={`center-between ${product.has_size_guide ? 'pb-5 mb-5 border-b-[1px]' : ''}`}\n >\n <b className=\"form-label rtl:space-x-reverse space-x-1\">\n <i className=\"sicon-luggage-cart\"></i>\n <span>{t('pages.products.weight', 'Weight')}</span>\n </b>\n <span className=\"product-weight text-sm\">{product.weight}</span>\n </div>\n )}\n {product.has_size_guide && (\n <>\n <div className=\"center-between\">\n <b className=\"form-label rtl:space-x-reverse space-x-1\">\n <i className=\"sicon-pencil-ruler\"></i>\n <span>{t('pages.products.size_guides', 'Size Guides')}</span>\n </b>\n <SallaButton\n shape=\"link\"\n color=\"primary\"\n className=\"!p-0 text-sm with-arrow\"\n onClick={() =>\n window.salla?.event?.dispatch('size-guide::open', String(product.id))\n }\n >\n {t('pages.products.show_size_guides', 'Show Size Guides')}\n <i className=\"sicon-keyboard_arrow_left\"></i>\n </SallaButton>\n </div>\n <SallaProductSizeGuide />\n </>\n )}\n </section>\n )}\n\n {hasAttachments && (\n <section className=\"bg-white p-5 rounded-md mb-5\">\n <div className=\"sm:grid sm:grid-cols-3 sm:gap-4 sm:items-start\">\n <div className=\"form-label\">\n <b className=\"block\">{t('pages.products.attachments', 'Attachments')}</b>\n </div>\n <div className=\"mt-1 sm:mt-0 sm:col-span-2 text-end\">\n <div className=\"flex rtl:space-x-reverse space-x-3\">\n {product.can_add_note && (\n <button\n type=\"button\"\n onClick={() => handleCollapseToggle(`note_${product.id}`)}\n className={`btn-tab btn--collapse ${activeCollapse === `note_${product.id}` ? 'is-opened' : 'is-closed'}`}\n >\n <i className=\"font-medium sicon-chat-conversation-alt rtl:ml-1.5 ltr:mr-1.5\"></i>\n <span className=\"fix-align\">{t('pages.products.add_note', 'Add Note')}</span>\n </button>\n )}\n {product.can_upload_file && (\n <button\n type=\"button\"\n onClick={() => handleCollapseToggle(`file_${product.id}`)}\n className={`btn-tab btn--collapse ${activeCollapse === `file_${product.id}` ? 'is-opened' : 'is-closed'}`}\n >\n <i className=\"font-medium sicon-paperclip rtl:ml-1.5 ltr:mr-1.5\"></i>\n <span className=\"fix-align\">{t('pages.products.add_file', 'Add File')}</span>\n </button>\n )}\n </div>\n\n {product.can_add_note && (\n <div\n className={`collapse-content ${activeCollapse === `note_${product.id}` ? 'is-opened' : 'is-closed'}`}\n >\n <div className=\"pt-4\">\n <textarea\n className=\"animated animatedfadeInDown fadeInDown form-input h-16 bg-gray-50 block\"\n placeholder={t('pages.products.notes_placeholder', 'Add your notes here...')}\n name=\"notes\"\n cols={30}\n rows={10}\n defaultValue={product.notes}\n ></textarea>\n </div>\n </div>\n )}\n\n {product.can_upload_file && (\n <div\n className={`collapse-content ${activeCollapse === `file_${product.id}` ? 'is-opened' : 'is-closed'}`}\n >\n <div className=\"pt-4 px-1\">\n <SallaFileUpload\n accept=\"image/png, image/jpeg, image/jpg, image/gif, video/*, application/pdf\"\n className=\"product-option-uploader\"\n >\n <div className=\"product-option-uploader-placholder\">\n <span className=\"product-option-uploader-placholder-icon\">\n <i className=\"sicon-camera\"></i>\n </span>\n <p className=\"profile-filepond-placholder-text\">\n {t('common.uploader.drag_and_drop', 'Drag and drop files here')}\n </p>\n <span className=\"filepond--label-action\">\n {t('common.uploader.browse', 'Browse')}\n </span>\n </div>\n </SallaFileUpload>\n </div>\n </div>\n )}\n </div>\n </div>\n </section>\n )}\n\n {formEndSlot}\n\n <section className=\"flex bg-white p-5 sm:pb-0 rounded-md rounded-b-none\">\n <div className=\"center-between w-full\">\n <div className=\"form-label\">\n <b className=\"block\">{t('pages.products.price', 'Price')}</b>\n </div>\n\n <div\n className={`flex whitespace-nowrap price-wrapper gap-4 items-center ${product.is_out_of_stock ? 'hidden' : ''}`}\n >\n <div\n className={`price_is_on_sale space-x-2 rtl:space-x-reverse whitespace-nowrap ${product.is_on_sale ? '' : 'hidden'}`}\n >\n <span className=\"total-price text-red-800 font-bold text-xl inline-block\">\n {product.sale_price} <CurrencySymbol currency={product.currency} />\n </span>\n <span className=\"before-price text-gray-500 line-through\">\n {product.regular_price} <CurrencySymbol currency={product.currency} />\n </span>\n </div>\n <div\n className={`starting-or-normal-price gap-4 ${product.is_on_sale ? 'hidden' : 'flex'}`}\n >\n {product.starting_price && (\n <span className=\"starting-price-title\">\n {t('pages.products.starting_price', 'Starting from')}\n </span>\n )}\n <span className=\"total-price font-bold text-xl inline-block\">\n {String(product.starting_price ?? product.price)}{' '}\n <CurrencySymbol currency={product.currency} />\n </span>\n </div>\n </div>\n\n <div\n className={`out-of-stock min-h-7 leading-7 text-base text-red-600 !opacity-50 font-bold ${product.is_out_of_stock ? 'scale-pulse' : 'hidden'}`}\n >\n {t('pages.products.out_of_stock', 'Out of Stock')}\n </div>\n </div>\n </section>\n\n {hasPreorder ? (\n <section className=\"mt-5 p-5\">\n <SallaCountDown preOrder={JSON.stringify(product.preorder)} boxed labeled />\n </section>\n ) : null}\n\n <section className=\"sticky-product-bar bg-white p-5 rounded-md rounded-b-none\">\n {product.is_hidden_quantity || product.type === 'booking' ? (\n <input\n type=\"hidden\"\n value=\"1\"\n name=\"quantity\"\n aria-label={t('pages.products.quantity', 'Quantity')}\n />\n ) : (\n <div className=\"sticky-product-bar__quantity center-between mb-5\">\n <span className=\"form-label font-bold\">{t('pages.products.quantity', 'Quantity')}</span>\n <SallaQuantityInput\n ref={quantityRef}\n max={product.max_quantity ?? undefined}\n value={1}\n name=\"quantity\"\n aria-label={t('pages.products.quantity', 'Quantity')}\n className=\"border-gray-200 flex justify-end\"\n />\n </div>\n )}\n\n <SallaAddProductButton\n ref={addButtonRef}\n {...(product.can_quick_buy ? { quickBuy: true } : {})}\n {...(stickyAddToCart ? { supportStickyBar: true } : {})}\n {...(product.is_require_shipping ? { requiredShipping: true } : {})}\n {...(hasPreorder ? { hasPreOrder: true } : {})}\n amount={amount}\n className=\"mt-5 w-full sticky-product-bar__btn\"\n productStatus={product.status}\n productType={product.type}\n productId={product.id}\n loaderPosition=\"end\"\n type=\"submit\"\n width=\"wide\"\n {...(product.notify_availability\n ? {\n ...(product.notify_availability.subscribed ? { isSubscribed: true } : {}),\n channels: product.notify_availability.channels.join(','),\n ...(product.notify_availability.subscribed_options\n ? {\n subscribedOptions: JSON.stringify(\n product.notify_availability.subscribed_options\n ),\n }\n : {}),\n ...(product.notify_availability.options ? { notifyOptionsAvailability: true } : {}),\n }\n : {})}\n >\n {product.add_to_cart_label}\n </SallaAddProductButton>\n </section>\n\n {product.giftable && (\n <SallaGifting\n className=\"mt-5\"\n widgetSubtitle={giftingIntro}\n productId={product.id}\n {...(product.is_require_shipping ? { physicalProducts: true } : {})}\n />\n )}\n </form>\n );\n}\n"]}
@@ -1,14 +1,15 @@
1
- import { BlogListLayout, BlogArticleCard } from './chunk-NHKP5XIG.js';
2
- import { blog } from './chunk-W2B5P54C.js';
3
- import './chunk-2U3PUO3V.js';
4
- import './chunk-3YVAYIM4.js';
1
+ import { BlogListLayout, BlogArticleCard } from './chunk-KILNHLWE.js';
2
+ import { blog } from './chunk-KHRIGLYL.js';
3
+ import './chunk-EIJXSBL6.js';
4
+ import './chunk-4KTY2FT6.js';
5
5
  import './chunk-JKIRRMBU.js';
6
6
  import './chunk-2JV6WZ6O.js';
7
7
  import './chunk-UIOLSYKV.js';
8
8
  import './chunk-VVZNW5CB.js';
9
9
  import './chunk-2XGQSJKH.js';
10
- import { useLocation } from './chunk-WH225GEC.js';
11
- import './chunk-TFB3QXYH.js';
10
+ import { useLocation } from './chunk-I62RENKM.js';
11
+ import './chunk-ZGHRSRDO.js';
12
+ import './chunk-GOPUP26T.js';
12
13
  import './chunk-C5X6CVXC.js';
13
14
  import './chunk-UZKTK6YV.js';
14
15
  import './chunk-5X2UFNKY.js';
@@ -20,19 +21,19 @@ import './chunk-N2S25NXP.js';
20
21
  import './chunk-TP3LCGE7.js';
21
22
  import './chunk-Z653O7MX.js';
22
23
  import './chunk-ZCH7W7DZ.js';
23
- import './chunk-3U26OMNO.js';
24
+ import './chunk-PWBMSGMU.js';
24
25
  import './chunk-JWXJPJBO.js';
25
26
  import './chunk-CW625T2E.js';
27
+ import './chunk-7V36I5GT.js';
26
28
  import './chunk-BVSJPBJ6.js';
27
29
  import './chunk-GBWCXUPD.js';
28
30
  import './chunk-OAMIDZKW.js';
29
31
  import { useTranslation } from './chunk-TYNZ5B2B.js';
30
32
  import './chunk-T72DAX7R.js';
31
- import './chunk-YMVLYYLU.js';
32
33
  import './chunk-RJPPO3ET.js';
33
34
  import { HookSlot } from './chunk-Q7VWURUR.js';
34
35
  import './chunk-GU2KUQVD.js';
35
- import { LazyBreadcrumb, LazyNoContent } from './chunk-TLAEW7TB.js';
36
+ import { LazyBreadcrumb, LazyNoContent } from './chunk-UH5ZXDEO.js';
36
37
  import './chunk-AXW67SY7.js';
37
38
  import './chunk-BYMOPN2S.js';
38
39
  import './chunk-SKLEJJ6M.js';
@@ -105,5 +106,5 @@ function BlogAuthorPage({
105
106
  }
106
107
 
107
108
  export { BlogAuthorPage };
108
- //# sourceMappingURL=BlogAuthorPage-HV6JUJNL.js.map
109
- //# sourceMappingURL=BlogAuthorPage-HV6JUJNL.js.map
109
+ //# sourceMappingURL=BlogAuthorPage-QIII3YRK.js.map
110
+ //# sourceMappingURL=BlogAuthorPage-QIII3YRK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/routes/blog/BlogAuthorPage.tsx"],"names":[],"mappings":"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","file":"BlogAuthorPage-QIII3YRK.js","sourcesContent":["import { useRef, useCallback } from 'react';\nimport { ItemsList } from '@salla.sa/twilight-components-react';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useLocation } from '../../providers/NavigationProvider';\nimport { Breadcrumb, NoContent } from '../../components/common';\nimport { blog } from '../../api/blog';\nimport { BlogArticleCard, BlogListLayout } from './components';\nimport type { BlogAuthorLoaderData, ArticleSummary } from './types';\n\nconst EMPTY_CATEGORIES: BlogAuthorLoaderData['categories'] = [];\nconst EMPTY_ARTICLES: ArticleSummary[] = [];\n\nexport function BlogAuthorPage({\n page,\n author,\n categories = EMPTY_CATEGORIES,\n articles = EMPTY_ARTICLES,\n cursor,\n}: BlogAuthorLoaderData) {\n const { t } = useTranslation();\n const { pathname, searchStr } = useLocation();\n const nextCursorRef = useRef<string | null>(cursor?.next ?? null);\n\n const loader = useCallback(async () => {\n const nextUrl = nextCursorRef.current;\n const cursorMatch = nextUrl?.match(/[?&]cursor=([^&]+)/);\n const cursorValue = cursorMatch ? decodeURIComponent(cursorMatch[1]) : (nextUrl ?? undefined);\n\n const result = await blog.articles.list({ author: author.name, cursor: cursorValue });\n nextCursorRef.current = result.cursor?.next ?? null;\n\n return {\n items: result.data,\n next: result.cursor?.next ?? null,\n };\n }, [author.name]);\n\n if (articles.length === 0) {\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n <BlogListLayout categories={categories}>\n <HookSlot name=\"blog:author.start\" />\n <NoContent icon=\"sicon-inbox\" message={t('pages.blog_articles.no_articles')} />\n <HookSlot name=\"blog:author.end\" />\n </BlogListLayout>\n </div>\n );\n }\n\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n\n <BlogListLayout categories={categories}>\n <HookSlot name=\"blog:author.start\" />\n\n <div className=\"mb-6\">\n <h1 className=\"font-bold text-xl\">{author.name}</h1>\n </div>\n\n <ItemsList<ArticleSummary>\n items={articles}\n loader={cursor?.next ? loader : undefined}\n mode={cursor?.next ? 'infinite' : 'static'}\n pageUrl={pathname + searchStr}\n className=\"s-blog-list\"\n itemsClassName=\"grid md:grid-cols-2 gap-2.5 md:gap-8\"\n empty={<NoContent icon=\"sicon-inbox\" message={t('pages.blog_articles.no_articles')} />}\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) =>\n items.map((article) => <BlogArticleCard key={article.id} article={article} />)\n }\n </ItemsList>\n\n <HookSlot name=\"blog:author.end\" />\n </BlogListLayout>\n </div>\n );\n}\n"]}
@@ -1,14 +1,15 @@
1
- import { BlogListLayout, BlogArticleCard } from './chunk-NHKP5XIG.js';
2
- import { blog } from './chunk-W2B5P54C.js';
3
- import './chunk-2U3PUO3V.js';
4
- import './chunk-3YVAYIM4.js';
1
+ import { BlogListLayout, BlogArticleCard } from './chunk-KILNHLWE.js';
2
+ import { blog } from './chunk-KHRIGLYL.js';
3
+ import './chunk-EIJXSBL6.js';
4
+ import './chunk-4KTY2FT6.js';
5
5
  import './chunk-JKIRRMBU.js';
6
6
  import './chunk-2JV6WZ6O.js';
7
7
  import './chunk-UIOLSYKV.js';
8
8
  import './chunk-VVZNW5CB.js';
9
9
  import './chunk-2XGQSJKH.js';
10
- import { useLocation } from './chunk-WH225GEC.js';
11
- import './chunk-TFB3QXYH.js';
10
+ import { useLocation } from './chunk-I62RENKM.js';
11
+ import './chunk-ZGHRSRDO.js';
12
+ import './chunk-GOPUP26T.js';
12
13
  import './chunk-C5X6CVXC.js';
13
14
  import './chunk-UZKTK6YV.js';
14
15
  import './chunk-5X2UFNKY.js';
@@ -20,19 +21,19 @@ import './chunk-N2S25NXP.js';
20
21
  import './chunk-TP3LCGE7.js';
21
22
  import './chunk-Z653O7MX.js';
22
23
  import './chunk-ZCH7W7DZ.js';
23
- import './chunk-3U26OMNO.js';
24
+ import './chunk-PWBMSGMU.js';
24
25
  import './chunk-JWXJPJBO.js';
25
26
  import './chunk-CW625T2E.js';
27
+ import './chunk-7V36I5GT.js';
26
28
  import './chunk-BVSJPBJ6.js';
27
29
  import './chunk-GBWCXUPD.js';
28
30
  import './chunk-OAMIDZKW.js';
29
31
  import { useTranslation } from './chunk-TYNZ5B2B.js';
30
32
  import './chunk-T72DAX7R.js';
31
- import './chunk-YMVLYYLU.js';
32
33
  import './chunk-RJPPO3ET.js';
33
34
  import { HookSlot } from './chunk-Q7VWURUR.js';
34
35
  import './chunk-GU2KUQVD.js';
35
- import { LazyBreadcrumb, LazyNoContent } from './chunk-TLAEW7TB.js';
36
+ import { LazyBreadcrumb, LazyNoContent } from './chunk-UH5ZXDEO.js';
36
37
  import './chunk-AXW67SY7.js';
37
38
  import './chunk-BYMOPN2S.js';
38
39
  import './chunk-SKLEJJ6M.js';
@@ -105,5 +106,5 @@ function BlogCategoryPage({
105
106
  }
106
107
 
107
108
  export { BlogCategoryPage };
108
- //# sourceMappingURL=BlogCategoryPage-ATPIVUAL.js.map
109
- //# sourceMappingURL=BlogCategoryPage-ATPIVUAL.js.map
109
+ //# sourceMappingURL=BlogCategoryPage-HNGWYTN6.js.map
110
+ //# sourceMappingURL=BlogCategoryPage-HNGWYTN6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/routes/blog/BlogCategoryPage.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,IAAM,mBAAyD,EAAC;AAChE,IAAM,iBAAmC,EAAC;AAEnC,SAAS,gBAAA,CAAiB;AAAA,EAC/B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA,GAAa,gBAAA;AAAA,EACb,QAAA,GAAW,cAAA;AAAA,EACX;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAU,GAAI,WAAA,EAAY;AAC5C,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAsB,MAAA,EAAQ,IAAA,IAAQ,IAAI,CAAA;AAEhE,EAAA,MAAM,MAAA,GAAS,YAAY,YAAY;AACrC,IAAA,MAAM,UAAU,aAAA,CAAc,OAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,OAAA,EAAS,KAAA,CAAM,oBAAoB,CAAA;AACvD,IAAA,MAAM,cAAc,WAAA,GAAc,kBAAA,CAAmB,YAAY,CAAC,CAAC,IAAK,OAAA,IAAW,MAAA;AAEnF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAE,QAAA,EAAU,YAAA,CAAa,EAAA,EAAI,MAAA,EAAQ,WAAA,EAAa,CAAA;AAC1F,IAAA,aAAA,CAAc,OAAA,GAAU,MAAA,CAAO,MAAA,EAAQ,IAAA,IAAQ,IAAA;AAE/C,IAAA,OAAO;AAAA,MACL,OAAO,MAAA,CAAO,IAAA;AAAA,MACd,IAAA,EAAM,MAAA,CAAO,MAAA,EAAQ,IAAA,IAAQ;AAAA,KAC/B;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,CAAa,EAAE,CAAC,CAAA;AAEpB,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,kBAAW,IAAA,EAAY,CAAA;AAAA,sBACxB,IAAA,CAAC,kBAAe,UAAA,EACd,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,MAAK,qBAAA,EAAsB,CAAA;AAAA,4BACpC,aAAA,EAAA,EAAU,IAAA,EAAK,eAAc,OAAA,EAAS,CAAA,CAAE,iCAAiC,CAAA,EAAG,CAAA;AAAA,wBAC7E,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,mBAAA,EAAoB;AAAA,OAAA,EACrC;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,kBAAW,IAAA,EAAY,CAAA;AAAA,oBAExB,IAAA,CAAC,kBAAe,UAAA,EACd,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,MAAK,qBAAA,EAAsB,CAAA;AAAA,sBAErC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,kBAAA,GAAA,CAAC,QAAG,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA,YAAA,CAAa,IAAA,EAAK,CAAA,EACvD,CAAA;AAAA,sBAEA,GAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,QAAA;AAAA,UACP,MAAA,EAAQ,MAAA,EAAQ,IAAA,GAAO,MAAA,GAAS,MAAA;AAAA,UAChC,IAAA,EAAM,MAAA,EAAQ,IAAA,GAAO,UAAA,GAAa,QAAA;AAAA,UAClC,SAAS,QAAA,GAAW,SAAA;AAAA,UACpB,SAAA,EAAU,aAAA;AAAA,UACV,cAAA,EAAe,sCAAA;AAAA,UACf,KAAA,sBAAQ,aAAA,EAAA,EAAU,IAAA,EAAK,eAAc,OAAA,EAAS,CAAA,CAAE,iCAAiC,CAAA,EAAG,CAAA;AAAA,UACpF,GAAG,CAAC,GAAA,EAAK,aAAa,CAAA,CAAE,GAAA,EAAK,YAAY,GAAG,CAAA;AAAA,UAE3C,QAAA,EAAA,CAAC,KAAA,KACA,KAAA,CAAM,GAAA,CAAI,CAAC,OAAA,qBACT,GAAA,CAAC,eAAA,EAAA,EAAiC,OAAA,EAAkB,UAAA,EAAU,IAAA,EAAA,EAAxC,OAAA,CAAQ,EAAiC,CAChE;AAAA;AAAA,OAEL;AAAA,sBAEA,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,mBAAA,EAAoB;AAAA,KAAA,EACrC;AAAA,GAAA,EACF,CAAA;AAEJ","file":"BlogCategoryPage-HNGWYTN6.js","sourcesContent":["import { useRef, useCallback } from 'react';\nimport { ItemsList } from '@salla.sa/twilight-components-react';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useLocation } from '../../providers/NavigationProvider';\nimport { Breadcrumb, NoContent } from '../../components/common';\nimport { blog } from '../../api/blog';\nimport { BlogArticleCard, BlogListLayout } from './components';\nimport type { BlogCategoryLoaderData, ArticleSummary } from './types';\n\nconst EMPTY_CATEGORIES: BlogCategoryLoaderData['categories'] = [];\nconst EMPTY_ARTICLES: ArticleSummary[] = [];\n\nexport function BlogCategoryPage({\n page,\n blogCategory,\n categories = EMPTY_CATEGORIES,\n articles = EMPTY_ARTICLES,\n cursor,\n}: BlogCategoryLoaderData) {\n const { t } = useTranslation();\n const { pathname, searchStr } = useLocation();\n const nextCursorRef = useRef<string | null>(cursor?.next ?? null);\n\n const loader = useCallback(async () => {\n const nextUrl = nextCursorRef.current;\n const cursorMatch = nextUrl?.match(/[?&]cursor=([^&]+)/);\n const cursorValue = cursorMatch ? decodeURIComponent(cursorMatch[1]) : (nextUrl ?? undefined);\n\n const result = await blog.articles.list({ category: blogCategory.id, cursor: cursorValue });\n nextCursorRef.current = result.cursor?.next ?? null;\n\n return {\n items: result.data,\n next: result.cursor?.next ?? null,\n };\n }, [blogCategory.id]);\n\n if (articles.length === 0) {\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n <BlogListLayout categories={categories}>\n <HookSlot name=\"blog:category.start\" />\n <NoContent icon=\"sicon-inbox\" message={t('pages.blog_articles.no_articles')} />\n <HookSlot name=\"blog:category.end\" />\n </BlogListLayout>\n </div>\n );\n }\n\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n\n <BlogListLayout categories={categories}>\n <HookSlot name=\"blog:category.start\" />\n\n <div className=\"mb-6\">\n <h1 className=\"font-bold text-xl\">{blogCategory.name}</h1>\n </div>\n\n <ItemsList<ArticleSummary>\n items={articles}\n loader={cursor?.next ? loader : undefined}\n mode={cursor?.next ? 'infinite' : 'static'}\n pageUrl={pathname + searchStr}\n className=\"s-blog-list\"\n itemsClassName=\"grid md:grid-cols-2 gap-2.5 md:gap-8\"\n empty={<NoContent icon=\"sicon-inbox\" message={t('pages.blog_articles.no_articles')} />}\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) =>\n items.map((article) => (\n <BlogArticleCard key={article.id} article={article} showAuthor />\n ))\n }\n </ItemsList>\n\n <HookSlot name=\"blog:category.end\" />\n </BlogListLayout>\n </div>\n );\n}\n"]}
@@ -1,12 +1,13 @@
1
- import { useDate } from './chunk-2U3PUO3V.js';
2
- import './chunk-3YVAYIM4.js';
1
+ import { useDate } from './chunk-EIJXSBL6.js';
2
+ import './chunk-4KTY2FT6.js';
3
3
  import './chunk-JKIRRMBU.js';
4
4
  import './chunk-2JV6WZ6O.js';
5
5
  import './chunk-UIOLSYKV.js';
6
6
  import './chunk-VVZNW5CB.js';
7
7
  import './chunk-2XGQSJKH.js';
8
- import './chunk-WH225GEC.js';
9
- import './chunk-TFB3QXYH.js';
8
+ import './chunk-I62RENKM.js';
9
+ import './chunk-ZGHRSRDO.js';
10
+ import './chunk-GOPUP26T.js';
10
11
  import './chunk-C5X6CVXC.js';
11
12
  import './chunk-UZKTK6YV.js';
12
13
  import './chunk-5X2UFNKY.js';
@@ -18,19 +19,19 @@ import './chunk-N2S25NXP.js';
18
19
  import './chunk-TP3LCGE7.js';
19
20
  import './chunk-Z653O7MX.js';
20
21
  import './chunk-ZCH7W7DZ.js';
21
- import './chunk-3U26OMNO.js';
22
+ import './chunk-PWBMSGMU.js';
22
23
  import './chunk-JWXJPJBO.js';
23
24
  import './chunk-CW625T2E.js';
25
+ import './chunk-7V36I5GT.js';
24
26
  import './chunk-BVSJPBJ6.js';
25
27
  import './chunk-GBWCXUPD.js';
26
28
  import './chunk-OAMIDZKW.js';
27
29
  import { useTranslation } from './chunk-TYNZ5B2B.js';
28
30
  import './chunk-T72DAX7R.js';
29
- import './chunk-YMVLYYLU.js';
30
31
  import './chunk-RJPPO3ET.js';
31
32
  import { HookSlot } from './chunk-Q7VWURUR.js';
32
33
  import './chunk-GU2KUQVD.js';
33
- import { LazyBreadcrumb, Image, LazyNoContent } from './chunk-TLAEW7TB.js';
34
+ import { LazyBreadcrumb, Image, LazyNoContent } from './chunk-UH5ZXDEO.js';
34
35
  import { Link } from './chunk-AXW67SY7.js';
35
36
  import './chunk-BYMOPN2S.js';
36
37
  import './chunk-SKLEJJ6M.js';
@@ -222,5 +223,5 @@ function BlogPage({
222
223
  }
223
224
 
224
225
  export { BlogPage };
225
- //# sourceMappingURL=BlogPage-6IIOSB45.js.map
226
- //# sourceMappingURL=BlogPage-6IIOSB45.js.map
226
+ //# sourceMappingURL=BlogPage-7NGO5VLL.js.map
227
+ //# sourceMappingURL=BlogPage-7NGO5VLL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/routes/blog/BlogTags.tsx","../src/routes/blog/BlogPage.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"BlogPage-7NGO5VLL.js","sourcesContent":["import { useState } from 'react';\nimport { Link } from '../../components/common';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport type { BlogTag } from './types';\n\n/** Tags shown on a blog card before the rest fold behind a \"+N\" toggle. */\nexport const BLOG_CARD_VISIBLE_TAGS = 3;\n\ninterface BlogTagsProps {\n tags: BlogTag[];\n /** How many tags to show before folding the rest. */\n visible?: number;\n}\n\n/**\n * The tag row of a blog card. Articles can carry dozens of tags, which used to wrap into\n * a wall of links and stretch the card; show the first few as compact chips and fold the\n * rest behind a \"+N\" toggle that expands them in place (and \"Show less\" to fold back).\n * Nothing folds when the tags fit.\n */\nexport function BlogTags({ tags, visible = BLOG_CARD_VISIBLE_TAGS }: BlogTagsProps) {\n const { t } = useTranslation();\n const [expanded, setExpanded] = useState(false);\n\n if (tags.length === 0) return null;\n\n const hiddenCount = Math.max(0, tags.length - visible);\n const shown = expanded ? tags : tags.slice(0, visible);\n\n return (\n <div className=\"s-blog-tags p-4 flex flex-wrap items-center gap-2 border-t border-gray-200\">\n {shown.map((tag) => (\n <Link\n key={tag.id}\n to={tag.url}\n className=\"s-blog-tags-item py-1 px-3 rounded-full border border-gray-200 inline-flex items-center max-w-full text-gray-500 hover:text-dark hover:border-gray-300 text-xs\"\n >\n <i className=\"font-medium sicon-tag rtl:ml-1.5 ltr:mr-1.5\"></i>\n <span className=\"fix-align truncate\">{tag.name}</span>\n </Link>\n ))}\n {hiddenCount > 0 && (\n <button\n type=\"button\"\n className=\"s-blog-tags-more py-1 px-3 rounded-full text-xs font-medium text-primary hover:opacity-80\"\n aria-expanded={expanded}\n onClick={() => setExpanded((open) => !open)}\n >\n {expanded ? t('common.elements.show_less', 'Show less') : `+${hiddenCount}`}\n </button>\n )}\n </div>\n );\n}\n","import { SallaSlider } from '@salla.sa/twilight-components-react/slider';\nimport { HookSlot, useDate } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport type { BlogPageProps, ArticleSummary } from './types';\nimport { Breadcrumb, NoContent, Link, Image } from '../../components/common';\nimport { BlogTags } from './BlogTags';\n\nconst EMPTY_CATEGORIES: NonNullable<BlogPageProps['categories']> = [];\nconst EMPTY_ARTICLES: ArticleSummary[] = [];\nconst EMPTY_SLIDES: NonNullable<BlogPageProps['slides']> = [];\n\nexport function BlogPage({\n page,\n categories = EMPTY_CATEGORIES,\n articles = EMPTY_ARTICLES,\n slides = EMPTY_SLIDES,\n}: BlogPageProps) {\n const { t } = useTranslation();\n const { format: formatDate } = useDate();\n\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <div className=\"center-between\">\n <Breadcrumb page={page} />\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-8 gap-8\">\n <nav aria-label=\"Sidebar\" className=\"hidden lg:block lg:sticky shrink-0 top-24 col-span-2\">\n <h2 className=\"font-bold mb-3\">{t('pages.blog_categories.categories')}</h2>\n <ul>\n {categories.map((category) => (\n <li key={category.id} className={category.is_current ? 'text-primary' : ''}>\n <Link className=\"py-3 block text-sm hover:text-primary\" to={category.url}>\n {category.name}\n </Link>\n </li>\n ))}\n </ul>\n </nav>\n\n <div className=\"main-content lg:col-span-6\">\n <HookSlot name=\"blog:start\" />\n\n {slides.length > 0 && (\n <SallaSlider\n id=\"blog-home-slider\"\n type=\"blog\"\n autoPlay\n autoHeight\n showControls={false}\n pagination\n className=\"blog-slider block rounded overflow-hidden mb-2.5 lg:mb-8\"\n sliderConfig={{ watchOverflow: true }}\n >\n <div slot=\"items\">\n {slides.map((article, index) => (\n <div\n key={article.id}\n className=\"swiper-slide has-overlay blog-slider__slide h-[300px] md:h-[400px] relative bg-border-color flex justify-center\"\n >\n <Image\n className=\"object-cover h-full w-full\"\n src={article.image}\n alt={article.name}\n aspectRatio=\"3/1\"\n priority={index === 0}\n />\n <div className=\"absolute z-10 bottom-0 rtl:right-0 ltr:left-0 p-4 pb-10 rtl:lg:pr-10 ltr:lg:pl-10 lg:pb-20\">\n <div className=\"blog-slider__content relative\">\n <div className=\"z-20 w-full md:w-5/6 lg:w-6/12 text-white\">\n <div className=\"block-slide-anime\">\n <div className=\"mb-2.5 rounded-md inline-flex text-sm rtl:space-x-reverse space-x-5\">\n <div className=\"flex items-center\">\n <i className=\"sicon-calendar-date rtl:ml-1 ltr:mr-1\"></i>\n <span className=\"whitespace-nowrap\">\n {formatDate(article.created_at)}\n </span>\n </div>\n <Link\n to={article.author?.url || '#'}\n className=\"flex items-center hover:underline\"\n >\n <i className=\"sicon-user rtl:ml-1 ltr:mr-1\"></i>\n <span className=\"whitespace-nowrap\">{article.author?.name}</span>\n </Link>\n </div>\n <h3 className=\"text-sm font-bold leading-normal mb-4\">\n <Link to={article.url}>{article.name}</Link>\n </h3>\n </div>\n <p className=\"line-clamp-2 block-slide-anime description\">\n {article.description}\n </p>\n </div>\n </div>\n </div>\n </div>\n ))}\n </div>\n </SallaSlider>\n )}\n\n {!slides.length && (\n <div className=\"sr-only lg:not-sr-only\">\n <h1 className=\"blog-category__title font-bold text-lg mb-8\">\n {t('blocks.footer.blog')}\n </h1>\n </div>\n )}\n\n {slides.length > 0 && <h1 className=\"sr-only\">{t('blocks.footer.blog')}</h1>}\n\n {articles.length > 0 ? (\n <>\n <HookSlot name=\"blog:items.start\" />\n <div className=\"grid md:grid-cols-2 gap-2.5 md:gap-8\">\n {articles.map((article) => (\n <div\n key={article.id}\n className=\"list-block post-entry relative h-full transition-shadow duration-500 bg-white hover:shadow-default rounded-lg justify-around overflow-hidden flex flex-col\"\n >\n <Link\n to={article.url}\n className=\"post-entry__image relative overflow-hidden hover:opacity-90 w-full h-56 bg-border-color flex items-center justify-center\"\n >\n <Image\n className=\"h-full w-full object-cover\"\n src={article.image}\n alt={article.name}\n aspectRatio=\"16/9\"\n />\n </Link>\n\n <div className=\"flex-1 px-5 pt-5 pb-7\">\n <div className=\"mb-2.5 text-gray-500 rounded-md inline-flex text-sm rtl:space-x-reverse space-x-5\">\n <div className=\"flex items-center\">\n <i className=\"sicon-calendar-date rtl:ml-1 ltr:mr-1\"></i>\n <span>{formatDate(article.created_at)}</span>\n </div>\n <Link\n to={article.author?.url || '#'}\n className=\"flex items-center hover:text-dark\"\n >\n <i className=\"sicon-user rtl:ml-1 ltr:mr-1\"></i>\n <span>{article.author?.name}</span>\n </Link>\n </div>\n\n <h3 className=\"post-entry__title text-sm font-bold text-gray-800 leading-6 mb-2.5\">\n <Link to={article.url}>{article.name}</Link>\n </h3>\n <p className=\"text-sm text-gray-500 leading-6 mb-2.5\">\n {article.description}\n </p>\n\n {((article.stats?.likes ?? 0) > 0 || (article.stats?.comments ?? 0) > 0) && (\n <div className=\"post-entry__icons flex items-center gap-2.5 text-gray-500 text-sm\">\n {(article.stats?.likes ?? 0) > 0 && (\n <div className=\"flex items-center gap-1\">\n <i className=\"sicon-thumbs-up\"></i>\n {article.stats?.likes}\n </div>\n )}\n {(article.stats?.comments ?? 0) > 0 && (\n <div className=\"flex items-center gap-1\">\n <i className=\"sicon-chat\"></i>\n {article.stats?.comments}\n </div>\n )}\n </div>\n )}\n </div>\n\n {article.tags && <BlogTags tags={article.tags} />}\n </div>\n ))}\n </div>\n <HookSlot name=\"blog:items.end\" />\n </>\n ) : (\n !slides.length && (\n <NoContent icon=\"sicon-inbox\" message={t('pages.blog_articles.no_articles')} />\n )\n )}\n\n <HookSlot name=\"blog:end\" />\n </div>\n </div>\n </div>\n );\n}\n"]}
@@ -1,12 +1,13 @@
1
- import { useDate } from './chunk-2U3PUO3V.js';
2
- import './chunk-3YVAYIM4.js';
1
+ import { useDate } from './chunk-EIJXSBL6.js';
2
+ import './chunk-4KTY2FT6.js';
3
3
  import './chunk-JKIRRMBU.js';
4
4
  import './chunk-2JV6WZ6O.js';
5
5
  import './chunk-UIOLSYKV.js';
6
6
  import './chunk-VVZNW5CB.js';
7
7
  import './chunk-2XGQSJKH.js';
8
- import './chunk-WH225GEC.js';
9
- import './chunk-TFB3QXYH.js';
8
+ import './chunk-I62RENKM.js';
9
+ import './chunk-ZGHRSRDO.js';
10
+ import { useComments } from './chunk-GOPUP26T.js';
10
11
  import './chunk-C5X6CVXC.js';
11
12
  import './chunk-UZKTK6YV.js';
12
13
  import './chunk-5X2UFNKY.js';
@@ -18,19 +19,19 @@ import './chunk-N2S25NXP.js';
18
19
  import './chunk-TP3LCGE7.js';
19
20
  import { useAsset } from './chunk-Z653O7MX.js';
20
21
  import './chunk-ZCH7W7DZ.js';
21
- import './chunk-3U26OMNO.js';
22
+ import './chunk-PWBMSGMU.js';
22
23
  import './chunk-JWXJPJBO.js';
23
24
  import './chunk-CW625T2E.js';
25
+ import './chunk-7V36I5GT.js';
24
26
  import './chunk-BVSJPBJ6.js';
25
27
  import './chunk-GBWCXUPD.js';
26
28
  import { useBlogLike } from './chunk-OAMIDZKW.js';
27
29
  import { useTranslation } from './chunk-TYNZ5B2B.js';
28
30
  import './chunk-T72DAX7R.js';
29
- import { useComments } from './chunk-YMVLYYLU.js';
30
31
  import './chunk-RJPPO3ET.js';
31
32
  import { HookSlot } from './chunk-Q7VWURUR.js';
32
33
  import './chunk-GU2KUQVD.js';
33
- import { LazyBreadcrumb, Image } from './chunk-TLAEW7TB.js';
34
+ import { LazyBreadcrumb, Image } from './chunk-UH5ZXDEO.js';
34
35
  import { Link } from './chunk-AXW67SY7.js';
35
36
  import './chunk-BYMOPN2S.js';
36
37
  import './chunk-SKLEJJ6M.js';
@@ -190,5 +191,5 @@ function BlogSinglePage({ page, article, related = [] }) {
190
191
  }
191
192
 
192
193
  export { BlogSinglePage };
193
- //# sourceMappingURL=BlogSinglePage-DV3XYB26.js.map
194
- //# sourceMappingURL=BlogSinglePage-DV3XYB26.js.map
194
+ //# sourceMappingURL=BlogSinglePage-Y42LPA2L.js.map
195
+ //# sourceMappingURL=BlogSinglePage-Y42LPA2L.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/routes/blog/BlogSinglePage.tsx"],"names":[],"mappings":"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","file":"BlogSinglePage-Y42LPA2L.js","sourcesContent":["import { SallaComments } from '@salla.sa/twilight-components-react/comments';\nimport { HookSlot, useAsset, useDate } from '../../hooks';\nimport { useBlogLike } from '../../hooks/useBlogLike';\nimport { useComments } from '../../hooks/useComments';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport type { BlogSinglePageProps } from './types';\nimport { Breadcrumb, Image, Link } from '../../components/common';\nimport { useTwilight } from '../../providers/twilight-context';\n\nexport function BlogSinglePage({ page, article, related = [] }: BlogSinglePageProps) {\n const { t } = useTranslation();\n const { store } = useTwilight();\n const { cdn } = useAsset();\n const { format: formatDate } = useDate();\n const { active, count, toggle, loading } = useBlogLike(\n Number(article.id) || 0,\n article.stats?.likes ?? 0\n );\n const { commentsKey } = useComments();\n\n return (\n <div key={article.id} className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n\n <div className=\"md:flex items-start\">\n <div className=\"main-content blog-category md:w-96 flex-1 bg-white lg:p-8 rounded-md mb-10 md:mb-0\">\n <HookSlot name=\"blog:single.start\" />\n\n <h1 className=\"font-bold text-3xl mb-5 leading-10\">{article.name}</h1>\n\n <div className=\"mb-10 text-gray-500 rounded-md inline-flex text-sm rtl:space-x-reverse space-x-5\">\n <div className=\"flex items-center\">\n <i className=\"sicon-calendar-date rtl:ml-1 ltr:mr-1\"></i>\n <span>{formatDate(article.created_at)}</span>\n </div>\n <Link to={article.author?.url || '#'} className=\"flex items-center hover:text-dark\">\n <i className=\"sicon-user rtl:ml-1 ltr:mr-1\"></i>\n <span>{article.author?.name}</span>\n </Link>\n </div>\n\n {article.image && (\n <Image\n src={article.image}\n alt={article.name}\n className=\"h-80 mb-10 w-full rounded-md\"\n aspectRatio=\"16/9\"\n priority\n noWrapper\n />\n )}\n\n {store.settings?.blog?.allow_likes_and_comments && (\n <div className=\"flex items-center gap-2.5 text-gray-500 text-base mb-2\">\n <button\n type=\"button\"\n id=\"blog-like\"\n data-blog-id={article.id}\n className={`flex items-center gap-1 transition-colors ${active ? 'text-primary font-semibold liked' : ''}`}\n onClick={toggle}\n disabled={loading}\n >\n {loading ? (\n <span className=\"loader loader--small\"></span>\n ) : (\n <i className={`sicon-thumbs-up ${active ? 'text-primary' : ''}`}></i>\n )}\n <span>{count}</span>\n </button>\n {(article.stats?.comments ?? 0) > 0 && (\n <div className=\"flex items-center gap-1\">\n <i className=\"sicon-chat text-primary\"></i>\n {article.stats?.comments}\n </div>\n )}\n </div>\n )}\n\n <article\n className=\"leading-7 text-sm mb-10\"\n dangerouslySetInnerHTML={{ __html: article.description?.replace(/&nbsp;/g, ' ') || '' }}\n />\n\n {article.tags && article.tags.length > 0 && (\n <div className=\"p-4 flex flex-wrap items-center border-t border-gray-200\">\n {article.tags.map((tag) => (\n <Link\n key={tag.id}\n to={tag.url}\n className=\"py-2 px-4 rounded-large inline-flex items-center text-gray-500 hover:text-dark justify-center text-sm\"\n >\n <i className=\"font-medium sicon-tag rtl:ml-1.5 ltr:mr-1.5\"></i>\n <span className=\"fix-align whitespace-nowrap\">{tag.name}</span>\n </Link>\n ))}\n </div>\n )}\n\n {store.settings?.blog?.allow_likes_and_comments && (\n <SallaComments\n key={commentsKey}\n itemId={Number(article.id) || 0}\n type={'blog' as any}\n />\n )}\n\n <HookSlot name=\"blog:single.end\" />\n </div>\n\n <aside\n aria-label=\"Sidebar\"\n className=\"sticky shrink-0 top-24 md:w-96 rtl:lg:mr-8 ltr:lg:ml-8 pb-11\"\n >\n {related.length > 0 && (\n <>\n <h2 className=\"font-bold mb-3\">{t('pages.blog_articles.related')}</h2>\n\n <HookSlot name=\"blog:single.related.start\" />\n\n {related.map((relatedArticle) => (\n <div\n key={relatedArticle.id}\n className=\"mt-5 flex items-center bg-white p-5 rounded-md\"\n >\n <div className=\"shrink-0\">\n <Link\n to={relatedArticle.url}\n className=\"bg-border-color h-24 w-24 rounded-md overflow-hidden flex items-center justify-center\"\n >\n <span className=\"sr-only\">{relatedArticle.name}</span>\n {relatedArticle.image ? (\n <Image\n className=\"h-full w-full object-cover\"\n src={relatedArticle.image}\n alt={relatedArticle.name}\n aspectRatio=\"1/1\"\n />\n ) : (\n <Image\n className=\"sm:h-full w-10 object-contain opacity-60\"\n src={cdn('/images/placeholder.png')}\n alt=\"post image\"\n />\n )}\n </Link>\n </div>\n <div className=\"rtl:mr-3 ltr:ml-3\">\n <div className=\"flex items-center text-sm text-gray-500 mb-2\">\n <i className=\"sicon-calendar-date rtl:ml-1 ltr:mr-1 rtl:pl-px ltr:pr-px\"></i>\n <time>{formatDate(relatedArticle.created_at)}</time>\n </div>\n <h3 className=\"text-sm font-bold text-gray-800 leading-6\">\n <Link to={relatedArticle.url} className=\"hover:underline\">\n {relatedArticle.name}\n </Link>\n </h3>\n </div>\n </div>\n ))}\n\n <HookSlot name=\"blog:single.related.end\" />\n </>\n )}\n </aside>\n </div>\n </div>\n );\n}\n"]}
@@ -1,14 +1,15 @@
1
- import { BlogListLayout, BlogArticleCard } from './chunk-NHKP5XIG.js';
2
- import { blog } from './chunk-W2B5P54C.js';
3
- import './chunk-2U3PUO3V.js';
4
- import './chunk-3YVAYIM4.js';
1
+ import { BlogListLayout, BlogArticleCard } from './chunk-KILNHLWE.js';
2
+ import { blog } from './chunk-KHRIGLYL.js';
3
+ import './chunk-EIJXSBL6.js';
4
+ import './chunk-4KTY2FT6.js';
5
5
  import './chunk-JKIRRMBU.js';
6
6
  import './chunk-2JV6WZ6O.js';
7
7
  import './chunk-UIOLSYKV.js';
8
8
  import './chunk-VVZNW5CB.js';
9
9
  import './chunk-2XGQSJKH.js';
10
- import { useLocation } from './chunk-WH225GEC.js';
11
- import './chunk-TFB3QXYH.js';
10
+ import { useLocation } from './chunk-I62RENKM.js';
11
+ import './chunk-ZGHRSRDO.js';
12
+ import './chunk-GOPUP26T.js';
12
13
  import './chunk-C5X6CVXC.js';
13
14
  import './chunk-UZKTK6YV.js';
14
15
  import './chunk-5X2UFNKY.js';
@@ -20,19 +21,19 @@ import './chunk-N2S25NXP.js';
20
21
  import './chunk-TP3LCGE7.js';
21
22
  import './chunk-Z653O7MX.js';
22
23
  import './chunk-ZCH7W7DZ.js';
23
- import './chunk-3U26OMNO.js';
24
+ import './chunk-PWBMSGMU.js';
24
25
  import './chunk-JWXJPJBO.js';
25
26
  import './chunk-CW625T2E.js';
27
+ import './chunk-7V36I5GT.js';
26
28
  import './chunk-BVSJPBJ6.js';
27
29
  import './chunk-GBWCXUPD.js';
28
30
  import './chunk-OAMIDZKW.js';
29
31
  import { useTranslation } from './chunk-TYNZ5B2B.js';
30
32
  import './chunk-T72DAX7R.js';
31
- import './chunk-YMVLYYLU.js';
32
33
  import './chunk-RJPPO3ET.js';
33
34
  import { HookSlot } from './chunk-Q7VWURUR.js';
34
35
  import './chunk-GU2KUQVD.js';
35
- import { LazyBreadcrumb, LazyNoContent } from './chunk-TLAEW7TB.js';
36
+ import { LazyBreadcrumb, LazyNoContent } from './chunk-UH5ZXDEO.js';
36
37
  import './chunk-AXW67SY7.js';
37
38
  import './chunk-BYMOPN2S.js';
38
39
  import './chunk-SKLEJJ6M.js';
@@ -105,5 +106,5 @@ function BlogTagPage({
105
106
  }
106
107
 
107
108
  export { BlogTagPage };
108
- //# sourceMappingURL=BlogTagPage-RVJIXERD.js.map
109
- //# sourceMappingURL=BlogTagPage-RVJIXERD.js.map
109
+ //# sourceMappingURL=BlogTagPage-ZCFYLXH6.js.map
110
+ //# sourceMappingURL=BlogTagPage-ZCFYLXH6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/routes/blog/BlogTagPage.tsx"],"names":[],"mappings":"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","file":"BlogTagPage-ZCFYLXH6.js","sourcesContent":["import { useRef, useCallback } from 'react';\nimport { ItemsList } from '@salla.sa/twilight-components-react';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useLocation } from '../../providers/NavigationProvider';\nimport { Breadcrumb, NoContent } from '../../components/common';\nimport { blog } from '../../api/blog';\nimport { BlogArticleCard, BlogListLayout } from './components';\nimport type { BlogTagLoaderData, ArticleSummary } from './types';\n\nconst EMPTY_CATEGORIES: BlogTagLoaderData['categories'] = [];\nconst EMPTY_ARTICLES: ArticleSummary[] = [];\n\nexport function BlogTagPage({\n page,\n blogTag,\n categories = EMPTY_CATEGORIES,\n articles = EMPTY_ARTICLES,\n cursor,\n}: BlogTagLoaderData) {\n const { t } = useTranslation();\n const { pathname, searchStr } = useLocation();\n const nextCursorRef = useRef<string | null>(cursor?.next ?? null);\n\n const loader = useCallback(async () => {\n const nextUrl = nextCursorRef.current;\n const cursorMatch = nextUrl?.match(/[?&]cursor=([^&]+)/);\n const cursorValue = cursorMatch ? decodeURIComponent(cursorMatch[1]) : (nextUrl ?? undefined);\n\n const result = await blog.articles.list({ tag: String(blogTag.id), cursor: cursorValue });\n nextCursorRef.current = result.cursor?.next ?? null;\n\n return {\n items: result.data,\n next: result.cursor?.next ?? null,\n };\n }, [blogTag.id]);\n\n if (articles.length === 0) {\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n <BlogListLayout categories={categories}>\n <HookSlot name=\"blog:tag.start\" />\n <NoContent icon=\"sicon-inbox\" message={t('pages.blog_articles.no_articles')} />\n <HookSlot name=\"blog:tag.end\" />\n </BlogListLayout>\n </div>\n );\n }\n\n return (\n <div className=\"container mb-8 sm:mb-24\">\n <Breadcrumb page={page} />\n\n <BlogListLayout categories={categories}>\n <HookSlot name=\"blog:tag.start\" />\n\n <div className=\"mb-6\">\n <h1 className=\"font-bold text-xl\">{blogTag.name}</h1>\n </div>\n\n <ItemsList<ArticleSummary>\n items={articles}\n loader={cursor?.next ? loader : undefined}\n mode={cursor?.next ? 'infinite' : 'static'}\n pageUrl={pathname + searchStr}\n className=\"s-blog-list\"\n itemsClassName=\"grid md:grid-cols-2 gap-2.5 md:gap-8\"\n empty={<NoContent icon=\"sicon-inbox\" message={t('pages.blog_articles.no_articles')} />}\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) =>\n items.map((article) => (\n <BlogArticleCard key={article.id} article={article} showAuthor />\n ))\n }\n </ItemsList>\n\n <HookSlot name=\"blog:tag.end\" />\n </BlogListLayout>\n </div>\n );\n}\n"]}
@@ -1,13 +1,14 @@
1
- import { brand } from './chunk-ZQGMVUPE.js';
2
- import './chunk-2U3PUO3V.js';
3
- import './chunk-3YVAYIM4.js';
1
+ import { brand } from './chunk-KWHCKGLL.js';
2
+ import './chunk-EIJXSBL6.js';
3
+ import './chunk-4KTY2FT6.js';
4
4
  import './chunk-JKIRRMBU.js';
5
5
  import './chunk-2JV6WZ6O.js';
6
6
  import './chunk-UIOLSYKV.js';
7
7
  import './chunk-VVZNW5CB.js';
8
8
  import './chunk-2XGQSJKH.js';
9
- import './chunk-WH225GEC.js';
10
- import './chunk-TFB3QXYH.js';
9
+ import './chunk-I62RENKM.js';
10
+ import './chunk-ZGHRSRDO.js';
11
+ import './chunk-GOPUP26T.js';
11
12
  import './chunk-C5X6CVXC.js';
12
13
  import './chunk-UZKTK6YV.js';
13
14
  import './chunk-5X2UFNKY.js';
@@ -19,19 +20,19 @@ import './chunk-N2S25NXP.js';
19
20
  import './chunk-TP3LCGE7.js';
20
21
  import './chunk-Z653O7MX.js';
21
22
  import './chunk-ZCH7W7DZ.js';
22
- import './chunk-3U26OMNO.js';
23
+ import './chunk-PWBMSGMU.js';
23
24
  import './chunk-JWXJPJBO.js';
24
25
  import './chunk-CW625T2E.js';
26
+ import './chunk-7V36I5GT.js';
25
27
  import './chunk-BVSJPBJ6.js';
26
28
  import './chunk-GBWCXUPD.js';
27
29
  import './chunk-OAMIDZKW.js';
28
30
  import { useTranslation } from './chunk-TYNZ5B2B.js';
29
31
  import './chunk-T72DAX7R.js';
30
- import './chunk-YMVLYYLU.js';
31
32
  import './chunk-RJPPO3ET.js';
32
33
  import { HookSlot } from './chunk-Q7VWURUR.js';
33
34
  import './chunk-GU2KUQVD.js';
34
- import { LazyBreadcrumb, LazyNoContent, Image } from './chunk-TLAEW7TB.js';
35
+ import { LazyBreadcrumb, LazyNoContent, Image } from './chunk-UH5ZXDEO.js';
35
36
  import { Link } from './chunk-AXW67SY7.js';
36
37
  import './chunk-BYMOPN2S.js';
37
38
  import './chunk-SKLEJJ6M.js';
@@ -183,5 +184,5 @@ function BrandsPageComponent({ page, brands, pagination }) {
183
184
  var BrandsPage = memo(BrandsPageComponent);
184
185
 
185
186
  export { BrandsPage };
186
- //# sourceMappingURL=BrandsPage-RQXP67LV.js.map
187
- //# sourceMappingURL=BrandsPage-RQXP67LV.js.map
187
+ //# sourceMappingURL=BrandsPage-PPJVASUW.js.map
188
+ //# sourceMappingURL=BrandsPage-PPJVASUW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/routes/brands/BrandsPage.tsx"],"names":[],"mappings":"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","file":"BrandsPage-PPJVASUW.js","sourcesContent":["import { memo, useState, useRef, useCallback, useEffect, useMemo } from 'react';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport { useWindowScroll } from '@uidotdev/usehooks';\nimport { Link, Breadcrumb, NoContent, Image } from '../../components/common';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { brand } from '../../api/brands';\nimport type { Brand, BrandsGroup, BrandsPageProps } from './types';\n\nfunction byLetter(brands: Brand[], locale: string): [string, Brand[]][] {\n const groups: BrandsGroup = {};\n for (const item of brands) {\n (groups[(locale === 'ar' ? item.ar_char : item.en_char) || '#'] ??= []).push(item);\n }\n // Code point order is alphabetical for Arabic and Latin, and the same on server and browser.\n return Object.entries(groups).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n}\n\ninterface BrandSectionProps {\n char: string;\n brands: Brand[];\n sectionRef: (el: HTMLElement | null) => void;\n}\n\nfunction BrandSection({ char, brands, sectionRef }: BrandSectionProps) {\n return (\n <section\n id={`brand-section-${char}`}\n ref={sectionRef}\n className=\"pt-24 first:pt-16 md:first:pt-24\"\n >\n <div className=\"flex items-center mb-10\">\n <span data-id={char} className=\"brand-char\">\n <span className=\"fix-align\">{char}</span>\n </span>\n <div className=\"bg-border-color h-px flex-1\"></div>\n </div>\n <div className=\"grid grid-cols-3 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 grid-flow-row gap-4 md:gap-8\">\n {brands.map((item) => (\n // A grid of logos would preload a brand for every logo the mouse crosses.\n <Link key={item.id} to={`/brands/${item.id}`} className=\"brand-item\" preload={false}>\n <Image\n className=\"max-h-full\"\n width={400}\n height={300}\n src={item.logo}\n alt={item.name}\n />\n </Link>\n ))}\n </div>\n </section>\n );\n}\n\nconst PAGES_PER_WAVE = 6;\n\n// One retry per page, so a network blip does not drop it.\nconst fetchPage = (page: number) => brand.list(page).catch(() => brand.list(page));\n\nasync function fetchWave(from: number): Promise<{ items: Brand[]; done: boolean }> {\n const settled = await Promise.allSettled(\n Array.from({ length: PAGES_PER_WAVE }, (_, i) => fetchPage(from + i))\n );\n const pages = settled.flatMap((result) => (result.status === 'fulfilled' ? [result.value] : []));\n return {\n items: pages.flatMap((result) => result.items),\n // Stop at the last page, or when a whole wave fails.\n done: pages.length === 0 || pages.some((result) => !result.next),\n };\n}\n\n/**\n * The first page plus every page after `next`, fetched in the background so the letter menu is\n * complete without scrolling. The API has no page count, so pages load in parallel waves.\n */\nfunction useAllBrands(first: Brand[], next: string | null | undefined, locale: string): Brand[] {\n const startPage = Number(next?.match(/[?&]page=(\\d+)/)?.[1]) || 0;\n const { data, hasNextPage, isFetchingNextPage, fetchNextPage } = useInfiniteQuery({\n queryKey: ['brands', 'after-first-page', locale, startPage],\n queryFn: ({ pageParam }) => fetchWave(pageParam),\n initialPageParam: startPage,\n getNextPageParam: (wave, _waves, from) => (wave.done ? undefined : from + PAGES_PER_WAVE),\n enabled: startPage > 0,\n // Not reused across visits: it must match the first page the loader just fetched.\n gcTime: 0,\n });\n\n useEffect(() => {\n if (hasNextPage && !isFetchingNextPage) void fetchNextPage();\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n return useMemo(() => {\n const extra = data?.pages.flatMap((wave) => wave.items) ?? [];\n return extra.length ? [...first, ...extra] : first;\n }, [first, data]);\n}\n\nfunction BrandsPageComponent({ page, brands, pagination }: BrandsPageProps) {\n const { t, locale } = useTranslation();\n const allBrands = useAllBrands(brands, pagination?.next, locale);\n const brandEntries = useMemo(() => byLetter(allBrands, locale), [allBrands, locale]);\n const [selectedChar, setSelectedChar] = useState<string | null>(null);\n const sectionRefs = useRef<Record<string, HTMLElement | null>>({});\n\n // Use useWindowScroll hook instead of manual listener\n const [{ y }] = useWindowScroll();\n const isSticky = (y ?? 0) > 200;\n\n // Handle brand nav item click - matches brands.js toggle class logic\n const handleBrandClick = useCallback((e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n const char = e.currentTarget.dataset.id;\n if (char) {\n setSelectedChar(char);\n sectionRefs.current[char]?.scrollIntoView({ behavior: 'smooth' });\n }\n }, []);\n\n return (\n <div className=\"container mb-20\">\n <Breadcrumb page={page} />\n\n <div className=\"flex justify-between pt-2 pb-6\">\n <h1 className=\"font-bold mb-6 md:mb-0\">{page.title}</h1>\n </div>\n\n {brandEntries.length > 0 ? (\n <>\n <div className=\"brands-nav-wrap\">\n <ul\n id=\"brands-nav\"\n className={`brands-nav ${isSticky ? 'is-sticky' : 'is-not-sticky'}`}\n >\n <li></li>\n {brandEntries.map(([char]) => (\n <li key={char}>\n <a\n className={`brands-nav__item ${selectedChar === char ? 'is-selected' : 'unselected'}`}\n href={`#brand-section-${char}`}\n onClick={handleBrandClick}\n data-id={char}\n >\n <span className=\"fix-align\">{char}</span>\n </a>\n </li>\n ))}\n </ul>\n </div>\n\n <div className=\"px-8 xl:px-0\">\n <HookSlot name=\"brands:index.items.start\" />\n\n {brandEntries.map(([char, brandGroup]) => (\n <BrandSection\n key={char}\n char={char}\n brands={brandGroup}\n sectionRef={(el) => {\n sectionRefs.current[char] = el;\n }}\n />\n ))}\n\n <HookSlot name=\"brands:index.items.end\" />\n </div>\n </>\n ) : (\n <NoContent\n icon=\"sicon-award-ribbon\"\n message={t('pages.brands.non_brands')}\n actionLabel={t('common.elements.back_home')}\n />\n )}\n </div>\n );\n}\n\nexport const BrandsPage = memo(BrandsPageComponent);\n"]}