@salla.sa/twilight-theme-engine 1.0.126 → 1.0.128

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 (276) hide show
  1. package/dist/{AddToCartForm-BY24SGTR.js → AddToCartForm-NBU3MIEW.js} +3 -3
  2. package/dist/{AddToCartForm-BY24SGTR.js.map → AddToCartForm-NBU3MIEW.js.map} +1 -1
  3. package/dist/{BlogAuthorPage-UAQ6266M.js → BlogAuthorPage-4HGFVIG2.js} +17 -16
  4. package/dist/BlogAuthorPage-4HGFVIG2.js.map +1 -0
  5. package/dist/{BlogCategoryPage-UX5OZZRZ.js → BlogCategoryPage-67TZRH3C.js} +17 -16
  6. package/dist/BlogCategoryPage-67TZRH3C.js.map +1 -0
  7. package/dist/{BlogPage-AAITQ3UZ.js → BlogPage-HINCPIQO.js} +15 -14
  8. package/dist/BlogPage-HINCPIQO.js.map +1 -0
  9. package/dist/{BlogSinglePage-R7VG3WNP.js → BlogSinglePage-4BWHLJU6.js} +15 -14
  10. package/dist/BlogSinglePage-4BWHLJU6.js.map +1 -0
  11. package/dist/{BlogTagPage-YCJL3FNS.js → BlogTagPage-BGPLVWGM.js} +17 -16
  12. package/dist/BlogTagPage-BGPLVWGM.js.map +1 -0
  13. package/dist/{BrandsPage-4M4J7YH5.js → BrandsPage-2NC3RCZK.js} +16 -15
  14. package/dist/BrandsPage-2NC3RCZK.js.map +1 -0
  15. package/dist/{Breadcrumb-WB5NXLLA.js → Breadcrumb-CCYDVGCS.js} +15 -14
  16. package/dist/Breadcrumb-CCYDVGCS.js.map +1 -0
  17. package/dist/{CartItem-UWCMEGW7.js → CartItem-M5PC54CM.js} +15 -14
  18. package/dist/CartItem-M5PC54CM.js.map +1 -0
  19. package/dist/{CartSummary-TK55II7A.js → CartSummary-YQI7XI4D.js} +15 -14
  20. package/dist/CartSummary-YQI7XI4D.js.map +1 -0
  21. package/dist/{Copyright-PHLEOCO4.js → Copyright-67E3ANPE.js} +3 -3
  22. package/dist/{Copyright-PHLEOCO4.js.map → Copyright-67E3ANPE.js.map} +1 -1
  23. package/dist/{CustomerLayout-BCTFI56B.js → CustomerLayout-HPLKOG7R.js} +15 -14
  24. package/dist/CustomerLayout-HPLKOG7R.js.map +1 -0
  25. package/dist/{Footer-AXIXSATN.js → Footer-56IXUTHF.js} +4 -4
  26. package/dist/{Footer-AXIXSATN.js.map → Footer-56IXUTHF.js.map} +1 -1
  27. package/dist/{Header-5GD53HC5.js → Header-67Q5OA63.js} +9 -8
  28. package/dist/{Header-5GD53HC5.js.map → Header-67Q5OA63.js.map} +1 -1
  29. package/dist/{LoyaltyPage-MBYLZF7B.js → LoyaltyPage-GC7B5FXF.js} +15 -14
  30. package/dist/LoyaltyPage-GC7B5FXF.js.map +1 -0
  31. package/dist/{LoyaltyPointsPage-SFAL3TOO.js → LoyaltyPointsPage-UAZQ2GZT.js} +7 -6
  32. package/dist/LoyaltyPointsPage-UAZQ2GZT.js.map +1 -0
  33. package/dist/{MainMenu-VEZTUNCZ.js → MainMenu-7SXJ2DU4.js} +6 -5
  34. package/dist/MainMenu-7SXJ2DU4.js.map +1 -0
  35. package/dist/{MasterLayout-TFHNWIRE.js → MasterLayout-53MYQBTT.js} +15 -14
  36. package/dist/{MasterLayout-TFHNWIRE.js.map → MasterLayout-53MYQBTT.js.map} +1 -1
  37. package/dist/{MobileMenu-JWD22FVU.js → MobileMenu-U6W2XQYI.js} +16 -15
  38. package/dist/MobileMenu-U6W2XQYI.js.map +1 -0
  39. package/dist/{NotificationsPage-QVE7AOCV.js → NotificationsPage-2WFW7GCV.js} +15 -14
  40. package/dist/NotificationsPage-2WFW7GCV.js.map +1 -0
  41. package/dist/{OrderSinglePage-QSNZVQ22.js → OrderSinglePage-VN3IBWOO.js} +16 -15
  42. package/dist/OrderSinglePage-VN3IBWOO.js.map +1 -0
  43. package/dist/{OrdersPage-WGIHZJNJ.js → OrdersPage-NOUGRTHI.js} +15 -14
  44. package/dist/OrdersPage-NOUGRTHI.js.map +1 -0
  45. package/dist/{PageSingle-3HXGOYLZ.js → PageSingle-MP5THOR4.js} +3 -3
  46. package/dist/{PageSingle-3HXGOYLZ.js.map → PageSingle-MP5THOR4.js.map} +1 -1
  47. package/dist/{ProductDetails-ALVRCBP4.js → ProductDetails-GONQFVV2.js} +5 -4
  48. package/dist/ProductDetails-GONQFVV2.js.map +1 -0
  49. package/dist/{ProfilePage-AVJYAQOG.js → ProfilePage-RHK3OHFF.js} +15 -14
  50. package/dist/ProfilePage-RHK3OHFF.js.map +1 -0
  51. package/dist/{ReviewsPage-ULGQMLGH.js → ReviewsPage-3PODTNEP.js} +3 -3
  52. package/dist/{ReviewsPage-ULGQMLGH.js.map → ReviewsPage-3PODTNEP.js.map} +1 -1
  53. package/dist/{SeoCartWidget-5WY6AV2F.js → SeoCartWidget-MHOPTGWV.js} +15 -14
  54. package/dist/SeoCartWidget-MHOPTGWV.js.map +1 -0
  55. package/dist/{SettingsPage-ZHTSKKBD.js → SettingsPage-RLNSTOCG.js} +15 -14
  56. package/dist/SettingsPage-RLNSTOCG.js.map +1 -0
  57. package/dist/{StoreClosedNotification-5V7QGKMC.js → StoreClosedNotification-AUQCK2MP.js} +16 -15
  58. package/dist/{StoreClosedNotification-5V7QGKMC.js.map → StoreClosedNotification-AUQCK2MP.js.map} +1 -1
  59. package/dist/{TestimonialsPage-7YS7QRTY.js → TestimonialsPage-GXKXWGDA.js} +3 -3
  60. package/dist/{TestimonialsPage-7YS7QRTY.js.map → TestimonialsPage-GXKXWGDA.js.map} +1 -1
  61. package/dist/{ThankYouPage-PLCUI7LC.js → ThankYouPage-GILEXBPL.js} +15 -14
  62. package/dist/ThankYouPage-GILEXBPL.js.map +1 -0
  63. package/dist/{WalletPage-C6ZFJTSA.js → WalletPage-4OOHX65H.js} +16 -15
  64. package/dist/WalletPage-4OOHX65H.js.map +1 -0
  65. package/dist/{WishlistPage-3CIW7AIZ.js → WishlistPage-Z2TPPFFM.js} +17 -16
  66. package/dist/WishlistPage-Z2TPPFFM.js.map +1 -0
  67. package/dist/api/advertisement.js +3 -2
  68. package/dist/api/apps.js +3 -2
  69. package/dist/api/blog.js +4 -3
  70. package/dist/api/brands.js +4 -3
  71. package/dist/api/cart.js +4 -3
  72. package/dist/api/category.js +4 -3
  73. package/dist/api/client.d.ts.map +1 -1
  74. package/dist/api/client.js +2 -1
  75. package/dist/api/dev-settings-cache.d.ts +50 -0
  76. package/dist/api/dev-settings-cache.d.ts.map +1 -0
  77. package/dist/api/home.js +3 -2
  78. package/dist/api/loyalty.js +4 -3
  79. package/dist/api/menu.js +3 -2
  80. package/dist/api/notification.js +3 -2
  81. package/dist/api/order.js +4 -3
  82. package/dist/api/page.js +4 -3
  83. package/dist/api/product.js +4 -3
  84. package/dist/api/profile.js +2 -1
  85. package/dist/api/profile.js.map +1 -1
  86. package/dist/api/store.d.ts +6 -0
  87. package/dist/api/store.d.ts.map +1 -1
  88. package/dist/api/store.js +3 -2
  89. package/dist/api/translations.js +3 -2
  90. package/dist/api/user.js +3 -2
  91. package/dist/api/wallet.js +3 -2
  92. package/dist/api/wishlist.js +5 -4
  93. package/dist/{chunk-SGET4UYI.js → chunk-2VRMQZXF.js} +3 -3
  94. package/dist/{chunk-SGET4UYI.js.map → chunk-2VRMQZXF.js.map} +1 -1
  95. package/dist/{chunk-A6AAG7U6.js → chunk-3FMJHVRY.js} +4 -4
  96. package/dist/{chunk-A6AAG7U6.js.map → chunk-3FMJHVRY.js.map} +1 -1
  97. package/dist/{chunk-KKOFHYTI.js → chunk-3OGFV27B.js} +3 -3
  98. package/dist/{chunk-KKOFHYTI.js.map → chunk-3OGFV27B.js.map} +1 -1
  99. package/dist/{chunk-UHCNMJDI.js → chunk-3U6BZUQL.js} +7 -7
  100. package/dist/{chunk-UHCNMJDI.js.map → chunk-3U6BZUQL.js.map} +1 -1
  101. package/dist/{chunk-MHLKLADI.js → chunk-4LR7N76Q.js} +52 -14
  102. package/dist/chunk-4LR7N76Q.js.map +1 -0
  103. package/dist/{chunk-FN2GQ2B5.js → chunk-5GCOUJ7T.js} +3 -3
  104. package/dist/{chunk-FN2GQ2B5.js.map → chunk-5GCOUJ7T.js.map} +1 -1
  105. package/dist/{chunk-6PK4GITC.js → chunk-5U7LPEFE.js} +3 -3
  106. package/dist/{chunk-6PK4GITC.js.map → chunk-5U7LPEFE.js.map} +1 -1
  107. package/dist/{chunk-IGGIH6GL.js → chunk-6GDNC6DS.js} +3 -3
  108. package/dist/{chunk-IGGIH6GL.js.map → chunk-6GDNC6DS.js.map} +1 -1
  109. package/dist/{chunk-NHJ5U6WK.js → chunk-6NT6RC2H.js} +3 -3
  110. package/dist/{chunk-NHJ5U6WK.js.map → chunk-6NT6RC2H.js.map} +1 -1
  111. package/dist/{chunk-WFSKX5AI.js → chunk-7SBSV5DD.js} +3 -3
  112. package/dist/{chunk-WFSKX5AI.js.map → chunk-7SBSV5DD.js.map} +1 -1
  113. package/dist/{chunk-TNUK62YF.js → chunk-CGABIBZZ.js} +4 -4
  114. package/dist/{chunk-TNUK62YF.js.map → chunk-CGABIBZZ.js.map} +1 -1
  115. package/dist/{chunk-WBDU6KDP.js → chunk-CN4U4EWY.js} +4 -4
  116. package/dist/{chunk-WBDU6KDP.js.map → chunk-CN4U4EWY.js.map} +1 -1
  117. package/dist/{chunk-XRDQAJW5.js → chunk-DI463VGL.js} +3 -3
  118. package/dist/{chunk-XRDQAJW5.js.map → chunk-DI463VGL.js.map} +1 -1
  119. package/dist/{chunk-BWTUGXHI.js → chunk-DJN6JAF7.js} +5 -5
  120. package/dist/{chunk-BWTUGXHI.js.map → chunk-DJN6JAF7.js.map} +1 -1
  121. package/dist/{chunk-53IXPTVY.js → chunk-EXK6VVXU.js} +4 -4
  122. package/dist/{chunk-53IXPTVY.js.map → chunk-EXK6VVXU.js.map} +1 -1
  123. package/dist/{chunk-5SJRY6P3.js → chunk-EZK2WD75.js} +4 -4
  124. package/dist/{chunk-5SJRY6P3.js.map → chunk-EZK2WD75.js.map} +1 -1
  125. package/dist/{chunk-IM5NMPNU.js → chunk-FWGHTOGZ.js} +7 -7
  126. package/dist/{chunk-IM5NMPNU.js.map → chunk-FWGHTOGZ.js.map} +1 -1
  127. package/dist/{chunk-RE4QQM4Q.js → chunk-GFOAMXSO.js} +3 -3
  128. package/dist/{chunk-RE4QQM4Q.js.map → chunk-GFOAMXSO.js.map} +1 -1
  129. package/dist/{chunk-4C76FZV4.js → chunk-GN5V4IQI.js} +4 -4
  130. package/dist/{chunk-4C76FZV4.js.map → chunk-GN5V4IQI.js.map} +1 -1
  131. package/dist/{chunk-KEOCLT62.js → chunk-HAS46CRI.js} +8 -5
  132. package/dist/chunk-HAS46CRI.js.map +1 -0
  133. package/dist/{chunk-TCRZSLXH.js → chunk-HRDCUTC6.js} +6 -6
  134. package/dist/{chunk-TCRZSLXH.js.map → chunk-HRDCUTC6.js.map} +1 -1
  135. package/dist/{chunk-GLE6TNJ3.js → chunk-HZIQK63A.js} +3 -3
  136. package/dist/{chunk-GLE6TNJ3.js.map → chunk-HZIQK63A.js.map} +1 -1
  137. package/dist/{chunk-LWPIGNCW.js → chunk-JAP5KTIG.js} +4 -4
  138. package/dist/{chunk-LWPIGNCW.js.map → chunk-JAP5KTIG.js.map} +1 -1
  139. package/dist/{chunk-JAKLD546.js → chunk-JUKKXGHR.js} +3 -3
  140. package/dist/{chunk-JAKLD546.js.map → chunk-JUKKXGHR.js.map} +1 -1
  141. package/dist/{chunk-4VYKXIYA.js → chunk-KNTHVSUL.js} +8 -7
  142. package/dist/chunk-KNTHVSUL.js.map +1 -0
  143. package/dist/{chunk-A6IKHCIA.js → chunk-L36ZEKBI.js} +4 -4
  144. package/dist/{chunk-A6IKHCIA.js.map → chunk-L36ZEKBI.js.map} +1 -1
  145. package/dist/chunk-L4FKJ3ZN.js +14 -0
  146. package/dist/{chunk-UE65NYZF.js.map → chunk-L4FKJ3ZN.js.map} +1 -1
  147. package/dist/{chunk-JL7MKSCD.js → chunk-LIQHWHYV.js} +10 -10
  148. package/dist/{chunk-JL7MKSCD.js.map → chunk-LIQHWHYV.js.map} +1 -1
  149. package/dist/{chunk-KDV6WZYJ.js → chunk-M6Z7KIDX.js} +3 -3
  150. package/dist/{chunk-KDV6WZYJ.js.map → chunk-M6Z7KIDX.js.map} +1 -1
  151. package/dist/{chunk-HFCZIPYO.js → chunk-O3BZBI27.js} +3 -3
  152. package/dist/{chunk-HFCZIPYO.js.map → chunk-O3BZBI27.js.map} +1 -1
  153. package/dist/{chunk-47BPYZJF.js → chunk-OOQTZ7N7.js} +3 -3
  154. package/dist/{chunk-47BPYZJF.js.map → chunk-OOQTZ7N7.js.map} +1 -1
  155. package/dist/{chunk-R2FXTCRK.js → chunk-QLFRNPPF.js} +15 -14
  156. package/dist/chunk-QLFRNPPF.js.map +1 -0
  157. package/dist/{chunk-75STIRBZ.js → chunk-RA5O7L7Q.js} +4 -4
  158. package/dist/{chunk-75STIRBZ.js.map → chunk-RA5O7L7Q.js.map} +1 -1
  159. package/dist/{chunk-5LP2K2J7.js → chunk-S7QZUBXM.js} +112 -6
  160. package/dist/chunk-S7QZUBXM.js.map +1 -0
  161. package/dist/{chunk-4ZYJDSYQ.js → chunk-U2UDXLAE.js} +3 -3
  162. package/dist/{chunk-4ZYJDSYQ.js.map → chunk-U2UDXLAE.js.map} +1 -1
  163. package/dist/{chunk-CKH5HDHS.js → chunk-UGJ24VNF.js} +4 -4
  164. package/dist/{chunk-CKH5HDHS.js.map → chunk-UGJ24VNF.js.map} +1 -1
  165. package/dist/{chunk-Z76YTG4W.js → chunk-UWE2QL3O.js} +3 -3
  166. package/dist/{chunk-Z76YTG4W.js.map → chunk-UWE2QL3O.js.map} +1 -1
  167. package/dist/{chunk-GHLPK63Q.js → chunk-XCS62X6X.js} +7 -7
  168. package/dist/{chunk-GHLPK63Q.js.map → chunk-XCS62X6X.js.map} +1 -1
  169. package/dist/chunk-Z5M4YYWT.js +9 -0
  170. package/dist/chunk-Z5M4YYWT.js.map +1 -0
  171. package/dist/{chunk-ANLG2WBG.js → chunk-ZWV6YNIB.js} +4 -4
  172. package/dist/{chunk-ANLG2WBG.js.map → chunk-ZWV6YNIB.js.map} +1 -1
  173. package/dist/components/cart/index.js +1 -1
  174. package/dist/components/common/index.js +1 -1
  175. package/dist/components/drawer/index.js +13 -12
  176. package/dist/components/home/HomePageRenderer.d.ts.map +1 -1
  177. package/dist/components/home/index.js +17 -16
  178. package/dist/components/layout/index.js +5 -4
  179. package/dist/components/product/index.js +14 -13
  180. package/dist/components/store/index.js +14 -13
  181. package/dist/dev/dev-settings-store.d.ts +20 -0
  182. package/dist/dev/dev-settings-store.d.ts.map +1 -1
  183. package/dist/dev/editor/ThemeEditor.d.ts.map +1 -1
  184. package/dist/dev/editor/i18n.d.ts +3 -0
  185. package/dist/dev/editor/i18n.d.ts.map +1 -1
  186. package/dist/dev/editor/index.js +64 -4
  187. package/dist/dev/editor/index.js.map +1 -1
  188. package/dist/dev/editor/relative-time.d.ts +8 -0
  189. package/dist/dev/editor/relative-time.d.ts.map +1 -0
  190. package/dist/dev/editor/styles.d.ts +1 -1
  191. package/dist/dev/editor/styles.d.ts.map +1 -1
  192. package/dist/dev/index.js +1 -1
  193. package/dist/{document-class-P2H6HKXA.js → document-class-DSRV5LZK.js} +12 -11
  194. package/dist/{document-class-P2H6HKXA.js.map → document-class-DSRV5LZK.js.map} +1 -1
  195. package/dist/hooks/index.js +13 -12
  196. package/dist/hooks/useGtm.js +13 -12
  197. package/dist/hooks/useMoney.js +13 -12
  198. package/dist/hooks/useStore.js +13 -12
  199. package/dist/hooks/useUser.js +4 -3
  200. package/dist/index.js +13 -12
  201. package/dist/index.js.map +1 -1
  202. package/dist/{navigation-4STP3ZMK.js → navigation-ATD4DRST.js} +5 -4
  203. package/dist/navigation-ATD4DRST.js.map +1 -0
  204. package/dist/{navigation-6Y2SKWH3.js → navigation-XCZMJSNS.js} +6 -5
  205. package/dist/{navigation-6Y2SKWH3.js.map → navigation-XCZMJSNS.js.map} +1 -1
  206. package/dist/{not-found-LLCXGKVS.js → not-found-ZE4Y7RLW.js} +16 -15
  207. package/dist/not-found-ZE4Y7RLW.js.map +1 -0
  208. package/dist/providers/index.js +13 -12
  209. package/dist/providers/twilight-init.d.ts.map +1 -1
  210. package/dist/routes/account/orders.js +5 -4
  211. package/dist/routes/account.js +14 -13
  212. package/dist/routes/account.js.map +1 -1
  213. package/dist/routes/blog.js +9 -8
  214. package/dist/routes/blog.js.map +1 -1
  215. package/dist/routes/brands.js +5 -4
  216. package/dist/routes/brands.js.map +1 -1
  217. package/dist/routes/cart.js +21 -20
  218. package/dist/routes/cart.js.map +1 -1
  219. package/dist/routes/home.js +18 -17
  220. package/dist/routes/index.js +4 -3
  221. package/dist/routes/loyalty.js +6 -5
  222. package/dist/routes/loyalty.js.map +1 -1
  223. package/dist/routes/page.js +5 -4
  224. package/dist/routes/page.js.map +1 -1
  225. package/dist/routes/product-listing.js +19 -18
  226. package/dist/routes/product-listing.js.map +1 -1
  227. package/dist/routes/product.js +17 -16
  228. package/dist/routes/product.js.map +1 -1
  229. package/dist/routes/seo-redirects.js +4 -3
  230. package/dist/routes/testimonials.js +2 -2
  231. package/dist/routes/thank-you.js +5 -4
  232. package/dist/routes/thank-you.js.map +1 -1
  233. package/dist/skeleton.js +18 -17
  234. package/dist/{store-lookup-XKL42Y4H.js → store-lookup-TG6RV6NV.js} +9 -8
  235. package/dist/store-lookup-TG6RV6NV.js.map +1 -0
  236. package/dist/tanstack.js +12 -11
  237. package/dist/tanstack.js.map +1 -1
  238. package/dist/utils/dev-settings-refresh.d.ts +14 -0
  239. package/dist/utils/dev-settings-refresh.d.ts.map +1 -0
  240. package/dist/utils/index.js +3 -2
  241. package/dist/utils/index.js.map +1 -1
  242. package/package.json +1 -1
  243. package/tailwind/components/home/HomePageRenderer.tsx.txt +5 -2
  244. package/dist/BlogAuthorPage-UAQ6266M.js.map +0 -1
  245. package/dist/BlogCategoryPage-UX5OZZRZ.js.map +0 -1
  246. package/dist/BlogPage-AAITQ3UZ.js.map +0 -1
  247. package/dist/BlogSinglePage-R7VG3WNP.js.map +0 -1
  248. package/dist/BlogTagPage-YCJL3FNS.js.map +0 -1
  249. package/dist/BrandsPage-4M4J7YH5.js.map +0 -1
  250. package/dist/Breadcrumb-WB5NXLLA.js.map +0 -1
  251. package/dist/CartItem-UWCMEGW7.js.map +0 -1
  252. package/dist/CartSummary-TK55II7A.js.map +0 -1
  253. package/dist/CustomerLayout-BCTFI56B.js.map +0 -1
  254. package/dist/LoyaltyPage-MBYLZF7B.js.map +0 -1
  255. package/dist/LoyaltyPointsPage-SFAL3TOO.js.map +0 -1
  256. package/dist/MainMenu-VEZTUNCZ.js.map +0 -1
  257. package/dist/MobileMenu-JWD22FVU.js.map +0 -1
  258. package/dist/NotificationsPage-QVE7AOCV.js.map +0 -1
  259. package/dist/OrderSinglePage-QSNZVQ22.js.map +0 -1
  260. package/dist/OrdersPage-WGIHZJNJ.js.map +0 -1
  261. package/dist/ProductDetails-ALVRCBP4.js.map +0 -1
  262. package/dist/ProfilePage-AVJYAQOG.js.map +0 -1
  263. package/dist/SeoCartWidget-5WY6AV2F.js.map +0 -1
  264. package/dist/SettingsPage-ZHTSKKBD.js.map +0 -1
  265. package/dist/ThankYouPage-PLCUI7LC.js.map +0 -1
  266. package/dist/WalletPage-C6ZFJTSA.js.map +0 -1
  267. package/dist/WishlistPage-3CIW7AIZ.js.map +0 -1
  268. package/dist/chunk-4VYKXIYA.js.map +0 -1
  269. package/dist/chunk-5LP2K2J7.js.map +0 -1
  270. package/dist/chunk-KEOCLT62.js.map +0 -1
  271. package/dist/chunk-MHLKLADI.js.map +0 -1
  272. package/dist/chunk-R2FXTCRK.js.map +0 -1
  273. package/dist/chunk-UE65NYZF.js +0 -14
  274. package/dist/navigation-4STP3ZMK.js.map +0 -1
  275. package/dist/not-found-LLCXGKVS.js.map +0 -1
  276. package/dist/store-lookup-XKL42Y4H.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/analytics/gtm.ts","../src/components/cart/SeoCartWidget.tsx"],"names":[],"mappings":"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","file":"SeoCartWidget-5WY6AV2F.js","sourcesContent":["import type { Cart, CartItem } from '../../types';\n\n// ─── Payload Types ───────────────────────────────────────────────────────────\n\nexport interface GtmCheckoutProduct {\n id: number;\n name: string;\n price: number;\n quantity: number;\n}\n\nexport interface GtmCheckoutEvent {\n event: 'checkout';\n ecommerce: {\n checkout: {\n actionField: { step: 1 | 2 | 3 };\n products: GtmCheckoutProduct[];\n cart_total: number;\n currency: string;\n };\n };\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction getPriceAmount(value: CartItem['price']): number {\n if (typeof value === 'number') return value;\n return value.amount;\n}\n\nfunction getTotalAmount(value: Cart['total']): number {\n if (typeof value === 'number') return value;\n return parseFloat(value) || 0;\n}\n\n/**\n * Maps `Cart.items` to the GTM product array format.\n *\n * Only available items are included — mirrors PHP `$cartService->getAvailableItems()`.\n */\nexport function mapCartItemsToProducts(items: CartItem[]): GtmCheckoutProduct[] {\n return items\n .filter((item) => item.is_available)\n .map((item) => ({\n id: item.product_id,\n name: item.product_name,\n price: getPriceAmount(item.price),\n quantity: item.quantity,\n }));\n}\n\n// ─── Main Utility ─────────────────────────────────────────────────────────────\n\n/**\n * Pushes a GTM `checkout` event to `window.dataLayer`.\n *\n * Safe to call in SSR environments — guards against `typeof window`.\n * Initialises `window.dataLayer` if GTM hasn't done so yet.\n *\n * @param step Checkout funnel step (1 = cart, 2 = shipping, 3 = payment)\n * @param cart Current cart data from the Twilight loader\n * @param currencyCode ISO 4217 currency code, e.g. \"SAR\"\n */\nexport function pushCheckoutEvent(step: 1 | 2 | 3, cart: Cart, currencyCode: string): void {\n if (typeof window === 'undefined') return;\n\n window.dataLayer = window.dataLayer ?? [];\n\n const payload: GtmCheckoutEvent = {\n event: 'checkout',\n ecommerce: {\n checkout: {\n actionField: { step },\n products: mapCartItemsToProducts(cart.items),\n cart_total: getTotalAmount(cart.total),\n currency: currencyCode,\n },\n },\n };\n\n window.dataLayer.push(payload);\n}\n","import { useEffect } from 'react';\nimport { useTwilight } from '../../providers/TwilightProvider';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport type { Cart } from '../../types';\nimport { pushCheckoutEvent } from '../../lib/analytics/gtm';\nimport { onSallaEvent } from '../../utils/sdk-helpers';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface SeoCartWidgetProps {\n /**\n * Cart data from the TanStack Router loader — no extra fetch needed.\n */\n cart: Cart;\n /**\n * Current checkout funnel step.\n * Defaults to `1` (cart view) — CartPage always passes this default.\n * The widget internally listens to Salla SDK events to promote to 2 / 3.\n */\n step?: 1 | 2 | 3;\n}\n\n// ─── Page title translation keys (mirrors PHP SeoCartWidget::$pageTitle) ─────\n\n/**\n * Matches the PHP backend exactly:\n * ```php\n * protected $pageTitle = [\n * self::STEP_CART => 'common.titles.cart',\n * self::STEP_SHIPPING => 'common.titles.shipping',\n * self::STEP_PAYMENT => 'common.titles.checkout',\n * ];\n * ```\n */\nconst PAGE_TITLE_KEYS: Record<1 | 2 | 3, string> = {\n 1: 'common.titles.cart',\n 2: 'common.titles.shipping',\n 3: 'common.titles.checkout',\n};\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * SeoCartWidget — Null-rendering analytics side-effect component.\n *\n * Responsibilities:\n * 1. Fires a GTM `checkout` event (step 1) on cart page load.\n * 2. Listens to Salla SDK checkout overlay events to fire steps 2 & 3.\n * 3. Updates `document.title` to reflect the cart context.\n *\n * Architecture:\n * - Lives in `theme-engine` so all themes using the engine get GTM tracking.\n * - Mounted directly inside `CartPage`, which already has loader data.\n * - `window.dataLayer` must be initialised by the store's GTM embed snippet;\n * the widget initialises it as a safe-guard but does NOT inject GTM itself.\n * - Must be mounted inside `<TwilightProvider>` (reads `currency` from context).\n *\n * @example\n * // In CartPage:\n * <SeoCartWidget cart={cart} />\n */\nexport function SeoCartWidget({ cart, step = 1 }: SeoCartWidgetProps) {\n const { store, currency } = useTwilight();\n const { t } = useTranslation();\n const currencyCode = currency?.code ?? 'SAR';\n\n // ── Fire GTM checkout event for step 1 (or whichever step is passed) ────────\n useEffect(() => {\n pushCheckoutEvent(step, cart, currencyCode);\n // Re-fire if the cart id, contents, or currency changes\n }, [step, cart, currencyCode]);\n\n // ── Subscribe to Salla SDK checkout step events (steps 2 & 3) ──────────────\n // Fires GTM events when the user advances through the checkout overlay.\n useEffect(() => {\n const onShipping = () => pushCheckoutEvent(2, cart, currencyCode);\n const onPayment = () => pushCheckoutEvent(3, cart, currencyCode);\n\n const offShipping = onSallaEvent('checkout::step.shipping', onShipping);\n const offPayment = onSallaEvent('checkout::step.payment', onPayment);\n\n return () => {\n offShipping();\n offPayment();\n };\n }, [cart, currencyCode]);\n\n // ── Update document title — mirrors PHP SeoCartWidget::$pageTitle ───────────\n // Step 1 → 'common.titles.cart' (e.g. \"Cart\")\n // Step 2 → 'common.titles.shipping' (e.g. \"Shipping\")\n // Step 3 → 'common.titles.checkout' (e.g. \"Checkout\")\n useEffect(() => {\n const storeTitle = store.meta?.title || store.name;\n const stepTitle = t(PAGE_TITLE_KEYS[step], PAGE_TITLE_KEYS[step]);\n document.title = storeTitle ? `${stepTitle} - ${storeTitle}` : stepTitle;\n }, [step, store.meta?.title, store.name, t]);\n\n return null;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/account/settings/SettingsPage.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,SAAS,aAAa,MAAA,EAA2B;AACtD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,MAAK,yBAAA,EAA0B,CAAA;AAAA,wBACxC,iBAAA,EAAA,EAAkB,CAAA;AAAA,oBACnB,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,uBAAA,EAAwB;AAAA,GAAA,EACzC,CAAA;AAEJ","file":"SettingsPage-ZHTSKKBD.js","sourcesContent":["import { SallaUserSettings } from '@salla.sa/twilight-components-react/user-settings';\nimport { HookSlot } from '../../../hooks';\nimport type { SettingsPageProps } from './types';\n\nexport function SettingsPage(_props: SettingsPageProps) {\n return (\n <>\n <HookSlot name=\"customer:settings.start\" />\n <SallaUserSettings />\n <HookSlot name=\"customer:settings.end\" />\n </>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/thank-you/ThankYouPage.tsx"],"names":[],"mappings":"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","file":"ThankYouPage-PLCUI7LC.js","sourcesContent":["import { useState, useEffect } from 'react';\nimport { useCopyToClipboard } from '@uidotdev/usehooks';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { SallaNextOrderCoupon } from '@salla.sa/twilight-components-react/next-order-coupon';\nimport { SallaOrderBranch } from '@salla.sa/twilight-components-react/order-branch';\nimport { Link } from '../../components/common';\nimport { HookSlot, usePageConfig } from '../../hooks';\nimport type { ThankYouPageProps } from './types';\nimport { useTwilight } from '../../providers/twilight-context';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport confettiImage from './confetti.svg';\nimport { onSallaEvent } from '../../utils/sdk-helpers';\n\nconst EMPTY_MESSAGES: NonNullable<ThankYouPageProps['messages']> = [];\n\nexport function ThankYouPage({\n page,\n order,\n thank_you_title,\n messages = EMPTY_MESSAGES,\n}: ThankYouPageProps) {\n const { store } = useTwilight();\n const { t } = useTranslation();\n // `<salla-order-branch>` reads the order id from `salla.config.page.id` (see OrderSinglePage).\n usePageConfig(page);\n const title =\n thank_you_title ?? t('pages.thank_you.hero_title', 'Thank you for shopping with us! 😊');\n const [invoiceSent, setInvoiceSent] = useState(order?.email_sent ?? false);\n const [invoiceMessage, setInvoiceMessage] = useState<string | null>(null);\n const [, copyToClipboard] = useCopyToClipboard();\n\n // Listen for invoice sent event (matches thankyou.js)\n useEffect(() => {\n const handleInvoiceSent = (res: { data?: { message?: string } }) => {\n setInvoiceMessage(\n res.data?.message || t('pages.thank_you.invoice_sent_success', 'Invoice sent successfully')\n );\n setInvoiceSent(true);\n };\n const listener = handleInvoiceSent as (...args: unknown[]) => void;\n\n return onSallaEvent('order::invoice.sent', listener);\n }, [t]);\n\n return (\n <>\n <HookSlot name=\"thank-you:start\" />\n\n <div className=\"h-52 -mb-52 w-full bg-primary rtl:right-0 ltr:left-0 relative -z-1\">\n <svg\n className=\"text-primary absolute top-full\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 1440 320\"\n >\n <path\n className=\"fill-current\"\n fillOpacity=\"1\"\n d=\"M0,96L120,112C240,128,480,160,720,165.3C960,171,1200,149,1320,138.7L1440,128L1440,0L1320,0C1200,0,960,0,720,0C480,0,240,0,120,0L0,0Z\"\n ></path>\n </svg>\n </div>\n\n <div className=\"container mb-20\">\n <nav className=\"w-full py-5\">\n <ol className=\"list-reset flex items-center text-sm text-primary-reverse\">\n <li>\n <Link to=\"/\" className=\"fix-align text-primary-reverse\">\n {t('common.titles.home', 'Home')}\n </Link>\n </li>\n <li>\n <i className=\"sicon-keyboard_arrow_left mx-2\"></i>\n </li>\n <li>\n <span className=\"fix-align\">{title}</span>\n </li>\n </ol>\n </nav>\n\n <div className=\"bg-white p-4 md:p-8 rounded-md mb-6 md:mb-8\">\n <div className=\"flex flex-col items-center pt-16 pb-10\">\n <img src={confettiImage} alt={title} className=\"size-[140px] mb-8\" />\n <h1 className=\"font-bold text-lg mb-2.5\">{title}</h1>\n <p className=\"text-gray-500 max-w-xs text-center text-sm leading-6 mb-2.5\">\n {t(\n 'pages.thank_you.description',\n 'Your order has been received and will be reviewed and confirmed shortly.'\n )}\n </p>\n {order && (\n <>\n <p className=\"text-gray-500 max-w-xs text-center text-sm leading-6 mb-6\">\n {t('pages.thank_you.order_id_label', 'Order ID')}{' '}\n <SallaButton\n className=\"relative\"\n onClick={() => copyToClipboard(String(order.reference_id))}\n color=\"dark\"\n shape=\"link\"\n >\n <span>#{order.reference_id}</span>\n <i className=\"copy-icon sicon-swap-stroke pointer-events-none rtl:mr-1 ltr:ml-1\"></i>\n </SallaButton>\n </p>\n <Link\n to={`/account/orders/${order.id}`}\n className=\"bg-primary text-white text-sm font-bold h-10 px-4 rounded-md flex items-center justify-center gap-1.5\"\n >\n <i className=\"sicon-newspaper rtl:ml-1 ltr:mr-1\"></i>\n {t('pages.thank_you.view_order_details', 'View Order Details')}\n </Link>\n </>\n )}\n </div>\n\n {(order as { instructions?: string } | undefined)?.instructions && (\n <article\n className=\"article article--main article--small text-center\"\n dangerouslySetInnerHTML={{\n __html: (order as { instructions?: string }).instructions ?? '',\n }}\n />\n )}\n\n {messages.map((message) => (\n <div\n key={message}\n className=\"flex flex-col items-center pt-1 pb-10 justify-start rtl:space-x-reverse space-x-2\"\n >\n <span className=\"font-bold\">{message}</span>\n </div>\n ))}\n\n <HookSlot name=\"thank-you:items.start\" />\n <HookSlot name=\"thank-you:items.end\" />\n </div>\n\n {/* Next-order coupon and pickup branch — each renders nothing when it doesn't apply */}\n <SallaNextOrderCoupon />\n <SallaOrderBranch />\n\n <div className=\"lg:flex rtl:space-x-reverse lg:space-x-8\">\n {invoiceSent ? (\n <div className=\"duration-500 hover:shadow-default flex-1 bg-white p-8 rounded-md mb-6 md:mb-10 flex flex-col items-center justify-center\">\n <div className=\"bg-gray-100 rounded-icon w-12 h-12 mb-2.5\">\n <i className=\"sicon-newspaper-alt text-xl\"></i>\n </div>\n <p className=\"text-sm mb-2.5\">\n {t('pages.thank_you.email_sent_to', 'Email sent to')}\n </p>\n <b className=\"text-sm\">{order?.customer?.email}</b>\n {invoiceMessage && <p className=\"text-sm text-green-600 mt-2\">{invoiceMessage}</p>}\n </div>\n ) : (\n <div\n id=\"invoice-form\"\n className={invoiceMessage ? 'thankyou-block sent' : 'thankyou-block'}\n >\n {invoiceMessage ? (\n <div className=\"text-center\">\n <div className=\"bg-gray-100 rounded-icon w-12 h-12 mb-2.5 mx-auto\">\n <i className=\"sicon-newspaper-alt text-xl\"></i>\n </div>\n <p className=\"text-sm\" dangerouslySetInnerHTML={{ __html: invoiceMessage }} />\n </div>\n ) : (\n <>\n <div className=\"bg-gray-100 rounded-icon w-12 h-12 mb-2.5\">\n <i className=\"sicon-newspaper-alt text-xl\"></i>\n </div>\n <p className=\"text-sm mb-2.5\">\n {t('pages.thank_you.resend_invoice', 'Resend invoice email')}\n </p>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n window.salla?.form.onSubmit('order.sendInvoice', e);\n }}\n >\n <div className=\"flex max-w-3xl w-full\">\n <input\n type=\"email\"\n className=\"form-input rtl:rounded-l-none ltr:rounded-r-none rtl:border-l-0 ltr:border-r-0 !w-[160px] sm:!w-[220px]\"\n placeholder=\"your@email.com\"\n required\n name=\"email\"\n />\n <SallaButton\n type=\"submit\"\n loaderPosition=\"center\"\n className=\"rtl:rounded-r-none ltr:rounded-l-none lg:w-24 h-10\"\n >\n <span className=\"btn__text\">{t('pages.thank_you.send', 'Send')}</span>\n </SallaButton>\n </div>\n </form>\n </>\n )}\n </div>\n )}\n\n <div className=\"thankyou-block\">\n <div className=\"bg-gray-100 rounded-icon w-12 h-12 mb-2.5\">\n <i className=\"sicon-mail-letter text-xl\"></i>\n </div>\n <p className=\"text-sm mb-2.5\">{t('pages.thank_you.support', 'Support')}</p>\n\n <div className=\"flex rtl:space-x-reverse space-x-6\">\n {store.contacts.mobile && (\n <div className=\"text-sm unicode flex items-center\">\n <i className=\"sicon-phone\"></i>\n <a\n href={`tel:${store.contacts.mobile}`}\n className=\"hover:text-primary transition\"\n >\n <b className=\"unicode mx-1.5\">{store.contacts.mobile}</b>\n </a>\n </div>\n )}\n\n {store.contacts.whatsapp && (\n <div className=\"text-sm unicode flex items-center\">\n <i className=\"sicon-whatsapp\"></i>\n <a\n href={`https://wa.me/${store.contacts.whatsapp.replace(/[\\s+-]/g, '')}`}\n className=\"hover:text-primary transition\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <b className=\"unicode mx-1.5\">{store.contacts.whatsapp}</b>\n </a>\n </div>\n )}\n </div>\n </div>\n </div>\n\n <HookSlot name=\"thank-you:end\" />\n </div>\n </>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/account/wallet/WalletPage.tsx"],"names":["TransactionRow"],"mappings":"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","file":"WalletPage-C6ZFJTSA.js","sourcesContent":["import { memo, useCallback, useRef } from 'react';\nimport { ItemsList } from '@salla.sa/twilight-components-react';\nimport { wallet } from '../../../api/wallet';\nimport type { TransactionItem } from '../../../api/wallet';\nimport { HookSlot, useMoney } from '../../../hooks';\nimport { useTranslation } from '../../../providers/I18nProvider';\nimport type { WalletPageProps } from './types';\nimport { NoContent } from '../../../components/common';\n\nconst TransactionRow = memo(function TransactionRow({\n transaction,\n}: {\n transaction: TransactionItem;\n}) {\n const { t, locale } = useTranslation();\n const { format: formatMoney } = useMoney();\n\n const formatTimestamp = (ts: number) => {\n if (!ts) return '';\n return new Date(ts * 1000).toLocaleDateString(locale, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n });\n };\n\n const actionTypeClass =\n transaction.action_type === 'cashback'\n ? 's-wallet-table-transaction-status-cashback'\n : transaction.action_type === 'refund'\n ? 's-wallet-table-transaction-status-refund'\n : transaction.action_type === 'purchase_by_wallet'\n ? 's-wallet-table-transaction-status-purchase'\n : '';\n\n return (\n <tr className=\"s-wallet-table-tbody-tr s-wallet-table-tbody-tr-shadow animated\">\n <td className=\"s-wallet-table-tbody-tr-td\">\n <div className=\"s-wallet-table-tbody-tr-td-content\">\n <span className=\"s-wallet-mobile-title\">{t('pages.wallet.transaction_number')}:</span>\n {transaction.id && <span className=\"hidden md:inline-block\">#{transaction.id}</span>}\n <div className=\"flex items-center md:hidden\">\n {transaction.id && <span>#{transaction.id}</span>}\n </div>\n </div>\n </td>\n\n <td className=\"s-wallet-table-tbody-tr-td\">\n <div className=\"s-wallet-table-tbody-tr-td-content\">\n <span className=\"s-wallet-mobile-title\">{t('pages.wallet.amount')}:</span>\n <div>{formatMoney(transaction.amount, { type: 'general' })}</div>\n </div>\n </td>\n\n <td className=\"s-wallet-table-tbody-tr-td\">\n <div className=\"s-wallet-table-tbody-tr-td-content\">\n <span className=\"s-wallet-mobile-title\">{t('pages.wallet.date')}:</span>\n {transaction.created_at ? formatTimestamp(transaction.created_at) : ''}\n </div>\n </td>\n\n <td className=\"s-wallet-table-tbody-tr-td\">\n <div className=\"s-wallet-table-tbody-tr-td-content\">\n <span className=\"s-wallet-mobile-title\">{t('pages.wallet.order_no')}:</span>\n <span className=\"rtl:mr-auto ltr:ml-auto md:mx-0\">\n {transaction.order_id && <span>#{transaction.order_id}</span>}\n </span>\n </div>\n </td>\n\n <td className=\"s-wallet-table-tbody-tr-td\">\n <div className=\"s-wallet-table-tbody-tr-td-content\">\n <span className=\"s-wallet-mobile-title\">{t('pages.wallet.expiry_date')}:</span>\n <span>{transaction.expired_at ? formatTimestamp(transaction.expired_at) : ''}</span>\n </div>\n </td>\n\n <td className=\"s-wallet-table-tbody-tr-td\">\n <div className=\"s-wallet-table-tbody-tr-td-content\">\n <div>\n <span className=\"s-wallet-mobile-title\">{t('pages.wallet.transaction_type')}:</span>\n </div>\n <div className={`s-wallet-table-transaction-status-default ${actionTypeClass}`}>\n {!!transaction.description && (\n <>\n <i\n id={transaction.id.toString()}\n className=\"sicon-information text-lg rtl:ml-4 ltr:mr-4 s-wallet-table-transaction-status-icon-success\"\n />\n <salla-tooltip\n text={transaction.description}\n targetId={transaction.id.toString()}\n />\n </>\n )}\n <span>{transaction.title}</span>\n </div>\n </div>\n </td>\n </tr>\n );\n});\n\nexport function WalletPage({ query, transactions, balance, pagination }: WalletPageProps) {\n const { t } = useTranslation();\n\n const { format: formatMoney } = useMoney();\n\n const nextPageRef = useRef(query.page + 1);\n\n const loader = useCallback(async () => {\n const pageToLoad = nextPageRef.current;\n const result = await wallet.list({ page: pageToLoad });\n\n nextPageRef.current = pageToLoad + 1;\n\n return {\n items: result.items,\n next: result.next,\n };\n }, []);\n\n if (transactions.length === 0) {\n return (\n <>\n <HookSlot name=\"customer:wallet.transactions.start\" />\n <NoContent icon=\"sicon-full-wallet\" message={`${t('pages.wallet.no_transactions')}`} />\n <HookSlot name=\"customer:wallet.transactions.end\" />\n </>\n );\n }\n\n return (\n <>\n <HookSlot name=\"customer:wallet.transactions.start\" />\n <table className=\"s-wallet-table\">\n <tbody className=\"s-wallet-table-tbody\">\n <tr className=\"s-table__tr\">\n <td>\n <div className=\"s-wallet-table-balance-container\">\n <i className=\"s-wallet-table-balance-icon sicon-wallet\" />\n <div>\n <div>{formatMoney(balance, { type: 'general' })}</div>\n <div className=\"font-normal text-gray-400\">{t('pages.wallet.balance')}</div>\n </div>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n\n <h2 className=\"mt-8\">{t('pages.wallet.title')}</h2>\n <table className=\"s-wallet-table\">\n <thead className=\"s-wallet-table-head\">\n <tr className=\"s-wallet-table-head-tr\">\n <th scope=\"col\">{t('pages.wallet.transaction_number')}</th>\n <th scope=\"col\" className=\"s-wallet-table-head-tr-th\">\n {t('pages.wallet.amount')}\n </th>\n <th scope=\"col\" className=\"s-wallet-table-head-tr-th\">\n {t('pages.wallet.date')}\n </th>\n <th scope=\"col\" className=\"s-wallet-table-head-tr-th\">\n {t('pages.wallet.order_no')}\n </th>\n <th scope=\"col\" className=\"s-wallet-table-head-tr-th\">\n {t('pages.wallet.expiry_date')}\n </th>\n <th scope=\"col\" className=\"s-wallet-table-head-tr-th\">\n {t('pages.wallet.transaction_type')}\n </th>\n </tr>\n </thead>\n <tbody className=\"s-wallet-table-tbody\">\n <ItemsList<TransactionItem>\n items={transactions}\n loader={loader}\n mode={pagination.next ? 'infinite' : 'static'}\n itemsAs=\"Fragment\"\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) =>\n items.map((transaction) => (\n <TransactionRow key={transaction.id} transaction={transaction} />\n ))\n }\n </ItemsList>\n </tbody>\n </table>\n <HookSlot name=\"customer:wallet.transactions.end\" />\n </>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/routes/account/wishlist/WishlistShare.tsx","../src/routes/account/wishlist/WishlistPage.tsx"],"names":["SallaSocialShare","useEffect","jsxs","jsx","SallaButton","useRef","useState","useCallback","items"],"mappings":"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","file":"WishlistPage-3CIW7AIZ.js","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\n// The eager (non-deferred) export: the share dialog is opened imperatively through a ref, and the\n// deferred wrapper doesn't attach it until it has hydrated — a click before that would do nothing.\nimport { SallaSocialShareCore as SallaSocialShare } from '@salla.sa/twilight-components-react/social-share';\nimport { useTranslation } from '../../../providers/I18nProvider';\n\ntype ShareResponse = { data?: { url?: string }; url?: string } | undefined;\ntype SocialShareElement = HTMLElement & {\n url?: string;\n refresh?: () => Promise<void>;\n open?: () => Promise<void>;\n close?: () => Promise<void>;\n};\n\n/**\n * Share state for the wishlist page: the \"Share\" dropdown (share the whole list / share\n * specific items), the selection used by \"specific items\", and the share request itself.\n * Mirrors what the SDK's `<salla-wishlist-actions>` does, but drives the page's own React\n * list — that component needs a sibling `<salla-products-list>`, which this page doesn't render.\n */\nexport function useWishlistShare() {\n const [menuOpen, setMenuOpen] = useState(false);\n const [selecting, setSelecting] = useState(false);\n const [selectedIds, setSelectedIds] = useState<number[]>([]);\n const [sharing, setSharing] = useState(false);\n const [shareUrl, setShareUrl] = useState('');\n /** Ids of every product currently rendered (later cursor pages included), for \"select all\". */\n const loadedIdsRef = useRef<number[]>([]);\n const socialShareRef = useRef<SocialShareElement | null>(null);\n\n const share = useCallback(async (ids: number[], selectAll: boolean) => {\n if (!window.salla?.wishlist?.share) return;\n setSharing(true);\n try {\n const response = (await window.salla.wishlist.share(ids, selectAll)) as ShareResponse;\n const url = response?.data?.url || response?.url || '';\n if (!url) return;\n setShareUrl(url);\n const element = socialShareRef.current;\n if (element) {\n element.url = url;\n await element.refresh?.();\n await element.open?.();\n }\n } catch {\n // The SDK reports a failed share itself (notification); nothing to recover here.\n } finally {\n setSharing(false);\n }\n }, []);\n\n const shareAll = useCallback(() => {\n setMenuOpen(false);\n void share([], true);\n }, [share]);\n\n const shareSelected = useCallback(() => {\n if (selectedIds.length) void share(selectedIds, false);\n }, [share, selectedIds]);\n\n const startSelecting = useCallback(() => {\n setMenuOpen(false);\n setSelecting(true);\n }, []);\n\n const cancelSelecting = useCallback(() => {\n setSelecting(false);\n setSelectedIds([]);\n setShareUrl('');\n void socialShareRef.current?.close?.();\n }, []);\n\n const toggleSelected = useCallback((id: number) => {\n setShareUrl('');\n setSelectedIds((current) =>\n current.includes(id) ? current.filter((existing) => existing !== id) : [...current, id]\n );\n }, []);\n\n const selectedIdsRef = useRef(selectedIds);\n useEffect(() => {\n selectedIdsRef.current = selectedIds;\n }, [selectedIds]);\n\n const deselect = useCallback((id: number) => {\n if (!selectedIdsRef.current.includes(id)) return;\n // A link built for the old selection would still offer the removed product.\n setShareUrl('');\n const element = socialShareRef.current;\n if (element) {\n element.url = undefined;\n void element.close?.();\n }\n setSelectedIds((current) => current.filter((existing) => existing !== id));\n }, []);\n\n const toggleAll = useCallback(() => {\n setShareUrl('');\n setSelectedIds((current) =>\n current.length && current.length === loadedIdsRef.current.length\n ? []\n : [...loadedIdsRef.current]\n );\n }, []);\n\n return {\n menuOpen,\n setMenuOpen,\n selecting,\n selectedIds,\n sharing,\n shareUrl,\n loadedIdsRef,\n socialShareRef,\n shareAll,\n shareSelected,\n startSelecting,\n cancelSelecting,\n toggleSelected,\n toggleAll,\n deselect,\n };\n}\n\nexport type WishlistShareState = ReturnType<typeof useWishlistShare>;\n\n/** The bar above the wishlist: the \"Share\" dropdown, or — while picking products — the selection controls. */\nexport function WishlistShareBar({\n state,\n hasProducts,\n}: {\n state: WishlistShareState;\n hasProducts: boolean;\n}) {\n const { t } = useTranslation();\n const rootRef = useRef<HTMLDivElement>(null);\n const { menuOpen, setMenuOpen } = state;\n\n // Close the dropdown on an outside click or Escape.\n useEffect(() => {\n if (!menuOpen) return;\n const onPointerDown = (event: MouseEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setMenuOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setMenuOpen(false);\n };\n document.addEventListener('mousedown', onPointerDown);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('mousedown', onPointerDown);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [menuOpen, setMenuOpen]);\n\n const selectedCount = state.selectedIds.length;\n const allSelected = selectedCount > 0 && selectedCount === state.loadedIdsRef.current.length;\n\n return (\n <div ref={rootRef} className=\"s-wishlist-actions\">\n <div className=\"s-wishlist-actions-bar flex items-center justify-end gap-3 mb-3\">\n {state.selecting ? (\n <div className=\"s-wishlist-actions-selection flex items-center gap-3\">\n <label className=\"s-wishlist-actions-select-all inline-flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={allSelected}\n ref={(input) => {\n if (input) input.indeterminate = selectedCount > 0 && !allSelected;\n }}\n onChange={state.toggleAll}\n />\n {t('pages.wishlist.select_all', 'Select all')}\n </label>\n <SallaButton\n color=\"primary\"\n disabled={selectedCount === 0 || state.sharing}\n onClick={state.shareSelected}\n >\n {t('pages.wishlist.share', 'Share')}\n {selectedCount > 0 ? ` (${selectedCount})` : ''}\n </SallaButton>\n <SallaButton fill=\"outline\" color=\"light\" onClick={state.cancelSelecting}>\n {t('common.elements.cancel', 'Cancel')}\n </SallaButton>\n </div>\n ) : (\n <div className=\"s-wishlist-actions-dropdown relative\">\n <SallaButton\n color=\"primary\"\n fill=\"outline\"\n disabled={!hasProducts || state.sharing}\n aria-haspopup=\"true\"\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen(!menuOpen)}\n >\n <span className=\"flex items-center justify-center gap-2\">\n <i className=\"sicon-share-alt\" aria-hidden=\"true\" />\n {t('pages.wishlist.share', 'Share')}\n <i className=\"sicon-keyboard_arrow_down\" aria-hidden=\"true\" />\n </span>\n </SallaButton>\n {menuOpen && (\n <ul\n role=\"menu\"\n className=\"s-wishlist-actions-menu absolute z-10 mt-2 min-w-48 rounded-md bg-white py-2 shadow-default rtl:right-0 ltr:left-0\"\n >\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"s-wishlist-actions-item block w-full px-4 py-2 text-start text-sm text-gray-700 hover:bg-gray-50\"\n onClick={state.shareAll}\n >\n {t('pages.wishlist.share_all', 'Share the list')}\n </button>\n </li>\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"s-wishlist-actions-item block w-full px-4 py-2 text-start text-sm text-gray-700 hover:bg-gray-50\"\n onClick={state.startSelecting}\n >\n {t('pages.wishlist.share_specific', 'Share specific items')}\n </button>\n </li>\n </ul>\n )}\n </div>\n )}\n </div>\n {/* Same setup as the SDK's <salla-wishlist-actions>: the centered modal variant, opened by the\n dropdown rather than by the component's own round share button, so the default\n `widget` slot (that button) is replaced by an empty anchor. */}\n <SallaSocialShare\n ref={state.socialShareRef as never}\n url={state.shareUrl || undefined}\n mode=\"modal\"\n modalTitle={t('pages.wishlist.share_list_title', 'Share wishlist')}\n className=\"s-wishlist-actions-social\"\n >\n <span slot=\"widget\" className=\"s-wishlist-actions-social-anchor\" aria-hidden=\"true\" />\n </SallaSocialShare>\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type CSSProperties } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { ItemsList } from '@salla.sa/twilight-components-react';\nimport { SallaAddProductButton } from '@salla.sa/twilight-components-react/add-product-button';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { wishlist } from '../../../api/wishlist';\nimport type { Product } from '../../../types';\nimport { HookSlot, useWishlist, useMoney } from '../../../hooks';\nimport { useTranslation } from '../../../providers/I18nProvider';\nimport type { WishlistPageProps } from './types';\nimport { WishlistShareBar, useWishlistShare } from './WishlistShare';\nimport { NoContent, Image } from '../../../components/common';\nimport { useLocation } from '../../../providers/NavigationProvider';\nimport { onSallaEvent } from '../../../utils/sdk-helpers';\n\ninterface WishlistCardSelection {\n /** \"Share specific items\" mode: the card shows a checkbox and toggles on click. */\n selecting: boolean;\n selected: boolean;\n onToggle: (id: number) => void;\n}\n\n// The loaded component copies host attributes (not properties) onto its inner salla-button.\nconst setAddButtonAttributes = (el: HTMLElement | null) => {\n el?.setAttribute('loader-position', 'center');\n el?.setAttribute('fill', 'outline');\n};\n\nconst REMOVING_MS = 300;\n\nconst REMOVING_STYLE: CSSProperties = {\n opacity: 0,\n transform: 'scale(0.95)',\n transition: `opacity ${REMOVING_MS}ms ease-in-out, transform ${REMOVING_MS}ms ease-in-out`,\n};\n\nfunction WishlistCard({\n product: prod,\n selection,\n removing,\n onRemoved,\n}: {\n product: Product;\n selection?: WishlistCardSelection;\n /** Fades the card out, then calls `onRemoved` once the fade ends. */\n removing?: boolean;\n onRemoved?: (id: number) => void;\n}) {\n const { remove } = useWishlist();\n const { format } = useMoney();\n\n // Drops the card even when `transitionend` never fires (hidden tab, overridden styles).\n useEffect(() => {\n if (!removing) return;\n const timer = setTimeout(() => onRemoved?.(Number(prod.id)), REMOVING_MS + 50);\n return () => clearTimeout(timer);\n }, [removing, onRemoved, prod.id]);\n\n const handleRemove = () => {\n if (prod.id) {\n remove(Number(prod.id));\n }\n };\n\n const displayPrice = prod.sale_price ?? prod.price;\n const regularPrice = prod.regular_price;\n\n return (\n <div\n id={`wishlist-product-${prod.id}`}\n className={`product-entry product-entry--wishlist${selection?.selected ? ' is-selected' : ''}`}\n style={removing ? REMOVING_STYLE : undefined}\n onTransitionEnd={(event) => {\n if (removing && event.target === event.currentTarget && event.propertyName === 'opacity') {\n onRemoved?.(Number(prod.id));\n }\n }}\n >\n {selection?.selecting && (\n <input\n type=\"checkbox\"\n className=\"s-wishlist-select shrink-0 rtl:ml-4 ltr:mr-4\"\n aria-label={prod.name}\n checked={selection.selected}\n onChange={() => selection.onToggle(Number(prod.id))}\n />\n )}\n <div className=\"flex items-center mb-4 sm:mb-0\">\n <a href={prod.url} className=\"product-entry__image\">\n <Image\n className=\"object-cover w-full h-full\"\n src={prod.image?.url}\n alt={prod.image?.alt ?? prod.name}\n aspectRatio=\"1/1\"\n />\n </a>\n <div className=\"flex-1 rtl:pr-5 ltr:pl-5\">\n <h3 className=\"text-sm text-gray-800 leading-6 mb-1.5 rtl:pl-5 ltr:pr-5 rtl:md:pl-8 ltr:md:pr-8 line-clamp-1\">\n <a href={prod.url}>{prod.name}</a>\n </h3>\n <div className=\"w-full center-between\">\n {prod.is_on_sale && regularPrice ? (\n <div className=\"space-x-1 rtl:space-x-reverse\">\n <h4 className=\"inline-block text-sm font-bold text-red-400\">\n {format(displayPrice)}\n </h4>\n <span className=\"text-sm text-gray-500 line-through\">{format(regularPrice)}</span>\n </div>\n ) : (\n <h4 className=\"text-sm font-bold\">{format(displayPrice)}</h4>\n )}\n </div>\n </div>\n </div>\n <div className=\"flex items-center space-x-4 rtl:space-x-reverse\">\n <SallaAddProductButton\n ref={setAddButtonAttributes}\n productStatus={prod.status}\n productId={prod.id}\n productType={prod.type}\n fill=\"outline\"\n className=\"flex-grow w-full sm:grow-0 md:w-40\"\n />\n <SallaButton\n loaderPosition=\"center\"\n shape=\"icon\"\n size=\"small\"\n color=\"danger\"\n className=\"btn--delete\"\n onClick={handleRemove}\n >\n <i className=\"sicon-cancel\" />\n </SallaButton>\n </div>\n </div>\n );\n}\n\n/** The loaded wishlist pages, reloaded from the server once every loaded card is removed (like Twig). */\nfunction useWishlistItems(\n { query, products, pagination }: WishlistPageProps,\n onRemoved: (id: number) => void\n) {\n const queryClient = useQueryClient();\n // Track the next page to load (starts at page 2 since page 1 is SSR)\n const nextPageRef = useRef(query.page + 1);\n const [removedIds, setRemovedIds] = useState<ReadonlySet<number>>(() => new Set());\n const [removingIds, setRemovingIds] = useState<ReadonlySet<number>>(() => new Set());\n const [reloaded, setReloaded] = useState<{\n items: Product[];\n next: string | null;\n generation: number;\n } | null>(null);\n const loadedRef = useRef({\n ids: products.map((prod) => Number(prod.id)),\n hasMore: !!pagination?.next,\n });\n\n // A `?page=` navigation keeps this instance, so drop what the previous page removed or reloaded.\n const [loadedProducts, setLoadedProducts] = useState(products);\n if (loadedProducts !== products) {\n setLoadedProducts(products);\n setRemovedIds(new Set());\n setRemovingIds(new Set());\n setReloaded(null);\n }\n\n useEffect(() => {\n nextPageRef.current = query.page + 1;\n loadedRef.current = {\n ids: products.map((prod) => Number(prod.id)),\n hasMore: !!pagination?.next,\n };\n }, [products, query.page, pagination?.next]);\n\n useEffect(() => {\n const handleRemoved = (_response: unknown, id: unknown) => {\n const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n (reduceMotion ? setRemovedIds : setRemovingIds)((current) =>\n new Set(current).add(Number(id))\n );\n onRemoved(Number(id));\n };\n\n return onSallaEvent('wishlist::removed', handleRemoved);\n }, [onRemoved]);\n\n useEffect(() => {\n const { ids, hasMore } = loadedRef.current;\n if (!ids.length || !ids.every((id) => removedIds.has(id))) return;\n\n const reset = (items: Product[], next: string | null) => {\n nextPageRef.current = query.page + 1;\n loadedRef.current = { ids: items.map((prod) => Number(prod.id)), hasMore: !!next };\n setRemovedIds(new Set());\n setRemovingIds(new Set());\n setReloaded((current) => ({ items, next, generation: (current?.generation ?? 0) + 1 }));\n };\n\n if (!hasMore) {\n reset([], null);\n return;\n }\n\n let cancelled = false;\n queryClient\n .fetchQuery({ ...wishlist.queries.list({ page: query.page }), staleTime: 0 })\n .then((result) => {\n if (!cancelled) reset(result.items, result.next);\n })\n // A failed reload keeps the list as it is; later pages still load on scroll.\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [removedIds, query.page, products, queryClient]);\n\n const loader = async () => {\n const pageToLoad = nextPageRef.current;\n const result = await wishlist.list({ page: pageToLoad });\n\n nextPageRef.current = pageToLoad + 1;\n loadedRef.current = {\n ids: [...loadedRef.current.ids, ...result.items.map((prod) => Number(prod.id))],\n hasMore: !!result.next,\n };\n\n return {\n items: result.items,\n next: result.next,\n };\n };\n\n const finishRemoving = useCallback((id: number) => {\n setRemovedIds((current) => (current.has(id) ? current : new Set(current).add(id)));\n }, []);\n\n return {\n items: reloaded ? reloaded.items : products,\n next: reloaded ? reloaded.next : pagination?.next,\n generation: reloaded?.generation ?? 0,\n removedIds,\n removingIds,\n finishRemoving,\n loader,\n };\n}\n\nexport function WishlistPage(props: WishlistPageProps) {\n const { t } = useTranslation();\n const { pathname, searchStr } = useLocation();\n const shareState = useWishlistShare();\n const selectedIdSet = useMemo(() => new Set(shareState.selectedIds), [shareState.selectedIds]);\n const { items, next, generation, removedIds, removingIds, finishRemoving, loader } =\n useWishlistItems(props, shareState.deselect);\n const hasRemaining = items.some((prod) => !removedIds.has(Number(prod.id)));\n\n return (\n <div className=\"space-y-5\" id=\"wishlist\">\n {/* The SDK unconditionally auto-renders its own `<salla-wishlist-actions>` into this\n slot on every `customer.wishlist` page (tools/twilight's init-static-sections.js),\n but that widget only works alongside a sibling `<salla-products-list>` web\n component -- this page renders its products via the React-native `ItemsList`\n instead, so the SDK's widget never finds one and sits permanently disabled.\n `WishlistShareBar` below is this page's own, fully working replacement for the\n exact same \"Share\" feature. The slot itself stays (removing it would also drop\n whatever themes/apps register here via the hook registry, not just this widget);\n `#wishlist > salla-wishlist-actions` (user-pages.scss) hides just the dead\n SDK widget, which the SDK always inserts as this element's first child. */}\n <HookSlot name=\"customer:wishlist.items.start\" />\n <WishlistShareBar state={shareState} hasProducts={hasRemaining || !!next} />\n <ItemsList<Product>\n key={generation}\n items={items}\n loader={loader}\n mode={next ? 'infinite' : 'static'}\n pageUrl={pathname + searchStr}\n className=\"s-products-list\"\n itemsClassName=\"s-products-list-wrapper s-products-list-row-cards\"\n empty={\n <div className=\"text-center py-16\">\n <NoContent\n icon=\"sicon-heart\"\n message={t('common.errors.no_wishlist', \"You don't have any wishes\")}\n actionLabel={t('pages.offer.continue_shopping', 'Continue shopping')}\n actionUrl=\"/\"\n />\n </div>\n }\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) => {\n const remaining = items.filter((item) => !removedIds.has(Number(item.id)));\n shareState.loadedIdsRef.current = remaining.map((item) => Number(item.id));\n return remaining.map((prod) => (\n <WishlistCard\n key={prod.id}\n product={prod}\n removing={removingIds.has(Number(prod.id))}\n onRemoved={finishRemoving}\n selection={{\n selecting: shareState.selecting,\n selected: selectedIdSet.has(Number(prod.id)),\n onToggle: shareState.toggleSelected,\n }}\n />\n ));\n }}\n </ItemsList>\n <HookSlot name=\"customer:wishlist.items.end\" />\n </div>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/home/ProductsSlider.tsx","../src/components/home/StoreFeatures.tsx","../src/components/home/FixedBanner.tsx","../src/components/home/FixedProducts.tsx","../src/components/home/FeaturedProductsStyle1.tsx","../src/components/home/FeaturedProductsStyle2.tsx","../src/components/home/FeaturedProductsStyle3.tsx","../src/components/home/ParallaxBackground.tsx","../src/components/home/PhotosSlider.tsx","../src/components/home/SquarePhotos.tsx","../src/components/home/Youtube.tsx","../src/components/home/BundleComponent.tsx","../src/components/home/lazy.ts","../src/components/home/register.ts","../src/components/home/ComponentErrorBoundary.tsx","../src/components/home/HomePageRenderer.tsx","../src/components/home/PageBlocks.tsx","../src/components/home/reorder-hooks.ts","../src/components/home/ReorderProducts.tsx"],"names":["product","StoreFeatures","jsx","memo","FixedBanner","Fragment","jsxs","Suspense","FeaturedProductsStyle1","useCallback","FeaturedProductsStyle2","useState","SallaButton","SallaProductsSlider","FeaturedProductsStyle3","ParallaxBackground","PhotosSlider","SquarePhotos","Youtube","BundleComponent","useEffect","FallbackComponent","ProductsSliderSkeleton","FixedProductsSkeleton","HomeComponentRenderer","Component","PageBlocks","useQuery","ReorderProducts","useMemo"],"mappings":";;;;;;;;;;;;;;;;;AA6BO,SAAS,cAAA,CAAe,EAAE,IAAA,EAAK,EAAwB;AAC5D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,KAAA;AAAA,IACA,eAAA,EAAiB,aAAA;AAAA,IACjB,QAAA,GAAW,CAAA;AAAA,IACX,QAAA,GAAW,KAAA;AAAA,IACX,aAAA,EAAe,YAAA;AAAA,IACf,cAAA,EAAgB,aAAA;AAAA,IAChB,IAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA,EAAiB,aAAA;AAAA,IACjB,SAAA;AAAA,IACA;AAAA,GACF,GAAI,IAAA;AAEJ,EAAA,MAAM,WAAA,GAAc,OAAA;AAAA,IAClB,OAAO;AAAA,MACL,EAAA,EAAI,UAAU,QAAQ,CAAA,CAAA;AAAA,MACtB,eAAA,EAAiB,CAAA,CAAE,yBAAA,EAA2B,UAAU,CAAA;AAAA,MACxD,GAAI,YAAA,KAAiB,MAAA,IAAa,EAAE,YAAA,EAAa;AAAA,MACjD,GAAI,aAAA,KAAkB,MAAA,IAAa,EAAE,aAAA,EAAc;AAAA,MACnD,GAAI,IAAA,KAAS,MAAA,IAAa,EAAE,IAAA,EAAK;AAAA,MACjC,GAAI,QAAA,KAAa,MAAA,IAAa,EAAE,QAAA,EAAS;AAAA,MACzC,GAAI,aAAA,KAAkB,MAAA,IAAa,EAAE,aAAA,EAAc;AAAA,MACnD,GAAI,SAAA,KAAc,MAAA,IAAa,EAAE,SAAA;AAAU,KAC7C,CAAA;AAAA,IACA,CAAC,UAAU,CAAA,EAAG,YAAA,EAAc,eAAe,IAAA,EAAM,QAAA,EAAU,eAAe,SAAS;AAAA,GACrF;AAEA,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IACb,MACE,QAAQ,IAAA,CAAK;AAAA,MACX,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,aAAa,QAAA,CAAS;AAAA,KACvB,CAAA;AAAA,IACH,CAAC,QAAA,CAAS,MAAA,EAAQ,QAAA,CAAS,YAAY;AAAA,GACzC;AAEA,EAAA,uBACE,GAAA,CAAC,QAAA,EAAA,EAAS,QAAA,kBAAU,GAAA,CAAC,0BAAuB,CAAA,EAC1C,QAAA,kBAAA,GAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,eAAe,QAAQ,CAAA,OAAA,CAAA;AAAA,MAC3B,MAAA;AAAA,MACA,WAAA;AAAA,MACC,GAAI,aAAA,GAAgB,EAAE,aAAA,KAAkB,EAAC;AAAA,MACzC,GAAI,KAAA,GAAQ,EAAE,UAAA,EAAY,KAAA,KAAU,EAAC;AAAA,MACrC,GAAI,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa,EAAC;AAAA,MAC9C,QAAA,sBAAW,sBAAA,EAAA,EAAuB,CAAA;AAAA,MAEjC,QAAA,EAAA,CAACA,QAAAA,EAAS,KAAA,qBACT,GAAA,CAAC,WAAA,EAAA,EAAY,SAASA,QAAAA,EAAS,aAAA,EAAe,QAAA,IAAY,KAAA,GAAQ,CAAA,EAAG;AAAA;AAAA,GAEzE,EACF,CAAA;AAEJ;AC5EO,IAAM,gBAAgB,IAAA,CAAK,SAASC,cAAAA,CAAc,EAAE,MAAK,EAAuB;AACrF,EAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,EAAA,IAAI,CAAC,QAAA,CAAS,MAAA,EAAQ,OAAO,IAAA;AAE7B,EAAA,uBACEC,GAAAA,CAAA,QAAA,EAAA,EACE,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yGAAA,EACZ,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,qBACb,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAEC,SAAA,EAAU,yBAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,kBAAAA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAW,OAAA,CAAQ,IAAA,EAAM,CAAA,EAC9B,CAAA;AAAA,wBACAA,GAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,OAAA,CAAQ,KAAA,EAAM,CAAA;AAAA,wBACnBA,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,OAAA,CAAQ,WAAA,EAAY;AAAA;AAAA,KAAA;AAAA,IAPnB,CAAA,EAAG,QAAQ,IAAI,CAAA,CAAA,EAAI,QAAQ,KAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,WAAA,IAAe,EAAE,CAAA;AAAA,GASrE,GACH,CAAA,EACF,CAAA;AAEJ,CAAC;ACfM,IAAM,WAAA,GAAcC,IAAAA,CAAK,SAASC,YAAAA,CAAY,KAAA,EAAkC;AACrF,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,GAAW,KAAA,EAAM,GAAI,KAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAO,GAAA;AAE1B,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,IAAA,KAAS,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,IAAA,CAAK,KAAA,IAAS,cAAA;AAExE,EAAA,MAAM,WAAW,QAAA,GACb;AAAA,IACE,OAAA,EAAS,OAAA;AAAA,IACT,aAAA,EAAe,MAAA;AAAA,IACf,QAAA,EAAU;AAAA,GACZ,GACA;AAAA,IACE,OAAA,EAAS,MAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAEJ,EAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,SAAA;AAE5B,EAAA,uBACEF,IAAAG,QAAAA,EAAA,EACE,0BAAAH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,IAAI,GAAA,IAAO,GAAA;AAAA,MACX,SAAA,EAAU,sCAAA;AAAA,MACV,YAAA,EAAY,UAAU,OAAO,CAAA,CAAA;AAAA,MAE7B,QAAA,kBAAAI,KAAC,SAAA,EAAA,EACE,QAAA,EAAA;AAAA,QAAA,QAAA,oBAAYJ,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,oBAAA,EAAqB,QAAQ,QAAA,EAAU,CAAA;AAAA,wBAClEA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,MAAA;AAAA,YACN,MAAA,EAAO,KAAA;AAAA,YACP,GAAA,EAAK,KAAA;AAAA,YACL,GAAA,EAAK,OAAA;AAAA,YACL,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,WAAW,SAAA,EAAU;AAAA,YAChD,SAAS,QAAA,CAAS,OAAA;AAAA,YAClB,UAAU,QAAA,CAAS,QAAA;AAAA,YAClB,GAAI,QAAA,IAAY,EAAE,aAAA,EAAe,SAAS,aAAA;AAAc;AAAA;AAC3D,OAAA,EACF;AAAA;AAAA,KAEJ,CAAA,EACF,CAAA;AAEJ,CAAC;AC7CM,SAAS,aAAA,CAAc,EAAE,IAAA,EAAK,EAAuB;AAC1D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,WAAA,EAAY;AAE9B,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAGnB,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AACrC,EAAA,MAAM,QAAQ,MAAA,CAAO,SAAA,CAAU,WAAW,CAAA,IAAK,WAAA,GAAc,IAAI,WAAA,GAAc,MAAA;AAE/E,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,IAAc,KAAA,CAAM,SAAS,uBAAA,IAA2B,IAAA;AAEhF,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAU,GAAI,QAAA;AAAA,IAClC,OAAA,CAAQ,QAAQ,IAAA,CAAK;AAAA,MACnB,MAAA,EAAQ,KAAK,QAAA,CAAS,MAAA;AAAA,MACtB,WAAA,EAAa,KAAK,QAAA,EAAU,YAAA;AAAA,MAC5B,OAAA,EAAS;AAAA,KACV;AAAA,GACH;AAEA,EAAA,MAAM,QAAA,GAAW,MAAA,EAAQ,KAAA,IAAS,EAAC;AAEnC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAOA,IAAC,qBAAA,EAAA,EAAsB,CAAA;AAAA,EAChC;AAEA,EAAA,IAAI,CAAC,QAAA,CAAS,MAAA,EAAQ,OAAO,IAAA;AAE7B,EAAA,uBACEI,KAACC,QAAAA,EAAA,EAAS,0BAAUL,GAAAA,CAAC,yBAAsB,CAAA,EACxC,QAAA,EAAA;AAAA,IAAA,KAAA,oBACCI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,SAAI,SAAA,EAAU,YAAA,EACb,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAI,iBAAM,CAAA,EACb,CAAA;AAAA,MACC,IAAA,CAAK,mCACJI,IAAAA,CAAC,QAAK,EAAA,EAAI,IAAA,CAAK,eAAA,EAAiB,SAAA,EAAU,sBAAA,EACvC,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,2BAA2B,UAAU,CAAA;AAAA,wBACxCJ,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kBAAA,EAAmB;AAAA,OAAA,EAClC;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEFA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EACE,0BAAA,IACC,UAAA,GAAa,gCAAA,GAAmC,kCAAA,CAAA;AAAA,QAGlD,QAAA,EAAA,QAAA,CAAS,MAAM,CAAA,EAAG,KAAK,EAAE,GAAA,CAAI,CAACF,6BAC7BE,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YAEC,OAAA,EAASF,QAAAA;AAAA,YACT,MAAA,EAAQ,aAAa,UAAA,GAAa;AAAA,WAAA;AAAA,UAF7BA,QAAAA,CAAQ;AAAA,SAIhB;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;ACpDO,IAAM,sBAAA,GAAyBG,IAAAA,CAAK,SAASK,uBAAAA,CAAuB;AAAA,EACzE;AACF,CAAA,EAAgC;AAC9B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAC7B,EAAA,MAAM,cAAc,IAAA,CAAK,YAAA;AAEzB,EAAA,MAAM,CAAC,WAAW,YAAY,CAAA,GAAI,SAAiB,KAAA,CAAM,CAAC,CAAA,EAAG,EAAA,IAAM,EAAE,CAAA;AACrE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AAEpD,EAAA,MAAM,cAAA,GAAiBC,WAAAA;AAAA,IACrB,CAAC,KAAA,KAAkB;AACjB,MAAA,IAAI,UAAU,SAAA,EAAW;AACzB,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,UAAA,CAAW,MAAM,cAAA,CAAe,KAAK,CAAA,EAAG,GAAG,CAAA;AAAA,IAC7C,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,IAAA;AAE1B,EAAA,MAAM,mBAAA,GAAsB,MAAM,MAAA,GAAS,CAAA;AAE3C,EAAA,uBACEH,IAAAA,CAAAD,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,SAAI,SAAA,EAAU,YAAA,EACb,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,WAAA,EAAa,KAAA,EAAM,CAAA,EAC1B,CAAA;AAAA,MACC,mBAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,OAAA,qBACVA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UAEC,KAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS,MAAM,cAAA,CAAe,OAAA,CAAQ,MAAM,EAAE,CAAA;AAAA,UAC9C,WAAW,CAAA,YAAA,EAAe,SAAA,KAAc,OAAA,CAAQ,EAAA,GAAK,cAAc,EAAE,CAAA,CAAA;AAAA,UAEpE,QAAA,EAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ;AAAA,SAAA;AAAA,QALrB,OAAA,CAAQ;AAAA,OAOhB,CAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEAI,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,0BAA0B,WAAA,EAAa,OAAA,GAAU,gBAAA,GAAmB,EAAE,CAAA,CAAA,EACnF,QAAA,EAAA;AAAA,MAAA,WAAA,EAAa,2BACZJ,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBACb,QAAA,kBAAAA,GAAAA;AAAA,QAAC,2BAAA;AAAA,QAAA;AAAA,UACC,iBAAA,EAAe,IAAA;AAAA,UACf,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,OAAO,CAAA;AAAA,UAC3C,SAAA,EAAS;AAAA;AAAA,OACV,EACH,CAAA;AAAA,sBAEFI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACZ,QAAA,EAAA;AAAA,QAAA,mBAAA,oBACCJ,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,OAAA,qBACVA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YAEC,KAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAS,MAAM,cAAA,CAAe,OAAA,CAAQ,MAAM,EAAE,CAAA;AAAA,YAC9C,WAAW,CAAA,YAAA,EAAe,SAAA,KAAc,OAAA,CAAQ,EAAA,GAAK,cAAc,EAAE,CAAA,CAAA;AAAA,YAEpE,QAAA,EAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ;AAAA,WAAA;AAAA,UALrB,OAAA,CAAQ;AAAA,SAOhB,CAAA,EACH,CAAA;AAAA,wBAGFA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,OAAA,KAAY;AACtB,UAAA,MAAM,QAAA,GAAW,cAAc,OAAA,CAAQ,EAAA;AACvC,UAAA,uBACEA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAW,0BAA0B,WAAA,EAAa,OAAA,GAAU,KAAK,gBAAgB,CAAA,CAAA,EAAI,WAAW,WAAA,GAAc,EAAE,IAAI,WAAA,IAAe,QAAA,GAAW,4BAA4B,EAAE,CAAA,CAAA,EAAI,CAAC,WAAA,IAAe,QAAA,GAAW,8BAA8B,EAAE,CAAA,CAAA;AAAA,cAE1O,QAAA,EAAA,OAAA,CAAQ,QAAA,EACL,KAAA,CAAM,CAAA,EAAG,WAAA,EAAa,OAAA,GAAU,CAAA,GAAI,CAAC,CAAA,CACtC,GAAA,CAAI,CAACF,QAAAA,EAAS,iCACbE,GAAAA;AAAA,gBAAC,2BAAA;AAAA,gBAAA;AAAA,kBAEC,OAAA,EAAS,IAAA,CAAK,SAAA,CAAUF,QAAO;AAAA,iBAAA;AAAA,gBAD1BA,SAAQ,EAAA,IAAM;AAAA,eAGtB;AAAA,aAAA;AAAA,YAVE,OAAA,CAAQ;AAAA,WAWf;AAAA,QAEJ,CAAC,CAAA,EACH;AAAA,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC;AC3FM,IAAM,sBAAA,GAAyBG,IAAAA,CAAK,SAASO,uBAAAA,CAAuB;AAAA,EACzE;AACF,CAAA,EAAgC;AAC9B,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,WAAA,EAAY;AAC9B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAC7B,EAAA,MAAM,QAAA,GAAW,KAAK,SAAA,IAAa,IAAA;AACnC,EAAA,MAAM,UAAA,GAAc,KAAA,CAAM,QAAA,CAAS,uBAAA,IAA2B,OAAQ,UAAA,GAAa,YAAA;AAEnF,EAAA,MAAM,CAAC,WAAW,YAAY,CAAA,GAAIC,SAAiB,KAAA,CAAM,CAAC,CAAA,EAAG,EAAA,IAAM,EAAE,CAAA;AACrE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEpD,EAAA,MAAM,cAAA,GAAiBF,WAAAA;AAAA,IACrB,CAAC,KAAA,KAAkB;AACjB,MAAA,IAAI,UAAU,SAAA,EAAW;AACzB,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,UAAA,CAAW,MAAM,cAAA,CAAe,KAAK,CAAA,EAAG,GAAG,CAAA;AAAA,IAC7C,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,MAAA,GAASA,WAAAA;AAAA,IACb,CAAC,MAAA,EAA4B,KAAA,EAA2B,KAAA,KAAmB;AACzE,MAAA,OAAO,MACL,QAAQ,IAAA,CAAK;AAAA,QACX,MAAA;AAAA,QACA,WAAA,EAAa,KAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACL,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,IAAA;AAE1B,EAAA,MAAM,mBAAA,GAAsB,MAAM,MAAA,GAAS,CAAA;AAE3C,EAAA,uBACEP,IAAAG,QAAAA,EAAA,EACE,0BAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACZ,QAAA,EAAA;AAAA,IAAA,mBAAA,oBACCJ,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,OAAA,qBACVA,GAAAA;AAAA,MAACU,WAAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,SAAA;AAAA,QACL,OAAA,EAAS,MAAM,cAAA,CAAe,OAAA,CAAQ,MAAM,EAAE,CAAA;AAAA,QAC9C,WAAW,CAAA,YAAA,EAAe,SAAA,KAAc,OAAA,CAAQ,EAAA,GAAK,cAAc,EAAE,CAAA,CAAA;AAAA,QAEpE,QAAA,EAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ;AAAA,OAAA;AAAA,MALrB,OAAA,CAAQ;AAAA,KAOhB,CAAA,EACH,CAAA;AAAA,oBAGFV,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,OAAA,KAAY;AACtB,MAAA,MAAM,QAAA,GAAW,cAAc,OAAA,CAAQ,EAAA;AACvC,MAAA,uBACEA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAW,CAAA,WAAA,EAAc,QAAA,GAAW,WAAA,GAAc,EAAE,CAAA,CAAA,EAAI,WAAA,IAAe,QAAA,GAAW,yBAAA,GAA4B,EAAE,CAAA,CAAA,EAAI,CAAC,WAAA,IAAe,QAAA,GAAW,8BAA8B,EAAE,CAAA,CAAA;AAAA,UAE9K,qCACCA,GAAAA;AAAA,YAACW,mBAAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,MAAA;AAAA,gBACN,QAAQ,QAAA,CAAS,MAAA;AAAA,gBACjB,QAAQ,QAAA,EAAU,YAAA;AAAA,gBAClB,QAAQ,QAAA,EAAU;AAAA,eACpB;AAAA,cACA,aAAa,EAAE,EAAA,EAAI,CAAA,QAAA,EAAW,OAAA,CAAQ,EAAE,CAAA,OAAA,CAAA,EAAU;AAAA,cAEjD,QAAA,EAAA,CAACb,6BACAE,GAAAA,CAAC,eAAY,SAAA,EAAU,wBAAA,EAAyB,SAASF,QAAAA,EAAS;AAAA;AAAA,8BAItEE,GAAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,MAAA;AAAA,gBACN,QAAQ,QAAA,CAAS,MAAA;AAAA,gBACjB,QAAQ,QAAA,EAAU,YAAA;AAAA,gBAClB,QAAQ,QAAA,EAAU;AAAA,eACpB;AAAA,cACA,cAAA,EAAgB,mBAAmB,UAAU,CAAA,MAAA,CAAA;AAAA,cAE5C,QAAA,EAAA,CAAC,QAAA,KACA,QAAA,CAAS,GAAA,CAAI,CAACF,QAAAA,qBACZE,GAAAA,CAAC,WAAA,EAAA,EAA6B,SAASF,QAAAA,EAAS,MAAA,EAAQ,UAAA,EAAA,EAAtCA,QAAAA,CAAQ,EAA0C,CACrE;AAAA;AAAA;AAEL,SAAA;AAAA,QA9BG,OAAA,CAAQ;AAAA,OAgCf;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ,CAAC;AC9GM,IAAM,sBAAA,GAAyBG,IAAAA,CAAK,SAASW,uBAAAA,CAAuB;AAAA,EACzE;AACF,CAAA,EAAgC;AAC9B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAE7B,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,IAAA;AAE1B,EAAA,uBACEZ,GAAAA,CAAAG,QAAAA,EAAA,EACE,QAAA,kBAAAH,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,OAAA,EACZ,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,OAAA,EAAS,YAAA,qBACnBI,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAAC,SAAI,SAAA,EAAU,gBAAA,EACb,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,OAAA,CAAQ,KAAA,EAAM,CAAA,EACrB,CAAA;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACZ,kBAAQ,gBAAA,mBACPI,IAAAA,CAAAD,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAH,GAAAA,CAAC,eAAY,OAAA,EAAS,OAAA,CAAQ,kBAAkB,MAAA,EAAO,WAAA,EAAY,YAAU,IAAA,EAAC,CAAA;AAAA,sBAC9EA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBACZ,QAAA,EAAA,OAAA,CAAQ,QAAA,EAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAACF,QAAAA,EAAS,wBAC3CE,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UAEC,OAAA,EAASF,QAAAA;AAAA,UACT,MAAA,EAAO,SAAA;AAAA,UACP,UAAA,EAAU,IAAA;AAAA,UACV,KAAA,EAAO;AAAA,SAAA;AAAA,QAJFA,QAAAA,CAAQ;AAAA,OAMhB,CAAA,EACH;AAAA,KAAA,EACF,IAEA,OAAA,CAAQ,QAAA,EAAU,IAAI,CAACA,QAAAA,EAAS,wBAC9BE,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QAEC,OAAA,EAASF,QAAAA;AAAA,QACT,MAAA,EAAO,SAAA;AAAA,QACP,UAAA,EAAU,IAAA;AAAA,QACV,KAAA,EAAO;AAAA,OAAA;AAAA,MAJFA,QAAAA,CAAQ;AAAA,KAMhB,CAAA,EAEL;AAAA,GAAA,EAAA,EA/BQ,OAAA,CAAQ,EAAA,IAAM,YAgCxB,CACD,GACH,CAAA,EACF,CAAA;AAEJ,CAAC;ACnDM,IAAM,kBAAA,GAAqBG,IAAAA,CAAK,SAASY,mBAAAA,CAAmB;AAAA,EACjE;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,EAAE,OAAO,GAAA,EAAK,KAAA,EAAO,WAAW,QAAA,EAAU,UAAA,EAAY,SAAA,GAAY,KAAA,EAAM,GAAI,IAAA;AAElF,EAAA,IAAI,CAAC,KAAA,EAAO,GAAA,EAAK,OAAO,IAAA;AAExB,EAAA,uBACEb,GAAAA,CAAAG,QAAAA,EAAA,EACE,QAAA,kBAAAC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAoB,KAAA,EAAO,EAAE,eAAA,EAAiB,CAAA,IAAA,EAAO,KAAA,CAAM,GAAG,KAAI,EAC/E,QAAA,EAAA;AAAA,oBAAAJ,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,CAAA,sBAAA,EAAyB,SAAA,GAAY,UAAA,GAAa,EAAE,CAAA,iCAAA;AAAA;AAAA,KAChE;AAAA,oBACDA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8DAAA,EACb,QAAA,kBAAAI,KAAC,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,KAAA,oBAASJ,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iCAAiC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAE9D,GAAA,IAAO,4BACNA,GAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAI,GAAA;AAAA,UACJ,SAAA,EAAU,uEAAA;AAAA,UAET,QAAA,EAAA;AAAA;AAAA;AACH,KAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ,CAAC;AC7BM,IAAM,eAAeC,IAAAA,CAAK,SAASa,aAAAA,CAAa,EAAE,MAAK,EAAsB;AAClF,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAC7B,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,CAAA;AAElC,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,IAAA;AAE1B,EAAA,uBACEd,GAAAA,CAAAG,QAAAA,EAAA,EACE,QAAA,kBAAAH,GAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,UAAA;AAAA,MACL,SAAA,EAAU,2BAAA;AAAA,MACV,QAAA,EAAQ,IAAA;AAAA,MACR,QAAA,EAAQ,IAAA;AAAA,MACR,UAAA,EAAU,IAAA;AAAA,MACV,EAAA,EAAI,UAAU,QAAQ,CAAA,OAAA,CAAA;AAAA,MACtB,YAAA,EAAc,EAAE,aAAA,EAAe,IAAA,EAAK;AAAA,MAEpC,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,OAAA,EACP,gBAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBAChBA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,cAAA;AAAA,UACV,KAAA,EAAO,EAAE,WAAA,EAAa,UAAA,EAAW;AAAA,UAEjC,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAI,IAAA,CAAK,GAAA,IAAO,KACpB,QAAA,kBAAAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAK,IAAA,CAAK,KAAA;AAAA,cACV,SAAA,EAAU,yCAAA;AAAA,cACV,GAAA,EAAK,gBAAgB,KAAK,CAAA,CAAA;AAAA,cAC1B,KAAA,EAAO,IAAA;AAAA,cACP,MAAA,EAAQ,GAAA;AAAA,cACR,UAAU,KAAA,KAAU;AAAA;AAAA,WACtB,EACF;AAAA,SAAA;AAAA,QAbK,IAAA,CAAK,MAAM,CAAA,EAAG,IAAA,CAAK,OAAO,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA;AAAA,OAexD,CAAA,EACH;AAAA;AAAA,GACF,EACF,CAAA;AAEJ,CAAC;AC3CD,IAAM,QAAA,GAAW,CAAC,IAAA,KAChB,OAAO,IAAA,CAAK,UAAU,QAAA,GAAW,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,EAAO,GAAA;AAWrD,IAAM,eAAeC,IAAAA,CAAK,SAASc,aAAAA,CAAa,EAAE,MAAK,EAAsB;AAClF,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAC7B,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAEnB,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,IAAA;AAE1B,EAAA,MAAM,WACJ,KAAA,CAAM,MAAA,IAAU,IAAI,CAAA,qBAAA,EAAwB,KAAA,CAAM,MAAM,CAAA,CAAA,GAAK,wBAAA;AAE/D,EAAA,uBACEX,IAAAA,CAAAD,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,KAAA,oBACCH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cACb,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,KAAA,EAAM,GACb,CAAA,EACF,CAAA;AAAA,oBAGFA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,KAAA,EAAQ,QAAQ,CAAA,6BAAA,CAAA,EAC7B,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACV,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACE,GAAI,KAAK,SAAA,KAAc,eAAA,GAAkB,EAAE,MAAA,EAAQ,QAAA,KAAa,EAAC;AAAA,QAClE,KAAK,IAAA,CAAK,EAAA,IAAM,QAAA,CAAS,IAAI,KAAK,IAAA,CAAK,GAAA;AAAA,QACvC,SAAA,EAAW,CAAA,2BAAA,EAA8B,IAAA,CAAK,IAAA,GAAO,2BAA2B,EAAE,CAAA,CAAA;AAAA,QAClF,OAAO,EAAE,eAAA,EAAiB,OAAO,QAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAAA,EAAI;AAAA,QACnD,EAAA,EAAI,KAAK,GAAA,IAAO;AAAA,OAAA;AAAA,MAEf,IAAA,CAAK,IAAA,oBACJA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kBAAA,EACZ,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,IAAA,EAAK,CAAA,EACnB;AAAA,KAGL,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC;ACzDM,IAAM,UAAUC,IAAAA,CAAK,SAASe,QAAAA,CAAQ,EAAE,MAAK,EAAiB;AACnE,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAU,GAAI,IAAA;AAClC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIP,SAAS,KAAK,CAAA;AAE9C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AAGhB,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,OAAO,6BAA6B,CAAA,CACjC,IAAA,CAAK,MAAM;AACV,MAAA,IAAI,OAAA,cAAqB,IAAI,CAAA;AAAA,IAC/B,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,GAAG,CAAA;AAAA,IACnD,CAAC,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,GAAU,KAAA;AAAA,IACZ,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AAEvB,EAAA,uBACET,GAAAA,CAAAG,QAAAA,EAAA,EACE,QAAA,kBAAAH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EACZ,QAAA,EAAA,QAAA,mBACCA,GAAAA,CAAC,cAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EAAW,MAAA,EAAO,OAAA,EAAQ,CAAA,mBAEjDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EAAgE,CAAA,EAEnF,GACF,CAAA,EACF,CAAA;AAEJ,CAAC;ACrCM,IAAM,eAAA,GAAkBC,IAAAA,CAAK,SAASgB,gBAAAA,CAAgB,KAAA,EAA6B;AACxF,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIR,SAAS,KAAK,CAAA;AAE5C,EAAAS,UAAU,MAAM;AACd,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,gBAAgB,aAAA,EAAe,SAAA,EAAW,UAAU,GAAG,IAAA,KAAS,KAAA,CAAM,IAAA;AAC9E,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAElC,EAAA,uBACElB,GAAAA,CAAAG,QAAAA,EAAA,EACE,QAAA,kBAAAH,GAAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,gBAAA,EAAgB,aAAA;AAAA,MAChB,WAAA,EAAW,QAAA;AAAA,MACX,MAAA;AAAA,MACA,wBAAA,EAAwB;AAAA;AAAA,GAC1B,EACF,CAAA;AAEJ,CAAC;;;ACtBM,IAAM,gBAAA,GAAmB,IAAA;AAAA,EAAK,MACnC,OAAO,4BAAgB,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,YAAA,EAAa,CAAE;AACpE;;;ACIO,IAAM,qBAAA,GAAiE;AAAA,EAC5E,cAAA,EAAgB,WAAA;AAAA,EAChB,eAAA,EAAiB,YAAA;AAAA,EACjB,WAAA,EAAa,gBAAA;AAAA,EACb,gBAAA,EAAkB,aAAA;AAAA,EAClB,OAAA,EAAS,OAAA;AAAA,EACT,eAAA,EAAiB,YAAA;AAAA,EACjB,gBAAA,EAAkB,aAAA;AAAA,EAClB,iBAAA,EAAmB,cAAA;AAAA,EACnB,qBAAA,EAAuB,kBAAA;AAAA,EACvB,0BAAA,EAA4B,sBAAA;AAAA,EAC5B,0BAAA,EAA4B,sBAAA;AAAA,EAC5B,0BAAA,EAA4B,sBAAA;AAAA,EAC5B,kBAAA,EAAoB;AACtB;AAEO,SAAS,sBAAA,CACd,UAAA,GAAsD,qBAAA,EACtD,MAAA,GAAS,OAAA,EACH;AACN,EAAA,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,IAAA,EAAM,SAAS,CAAA,KAAM;AACxD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,QAAA,CAAS,SAAS,CAAA,EAAG,MAAM,CAAA,EAAG,IAAI,IAAI,SAAS,CAAA;AAAA,IACjD;AAAA,EACF,CAAC,CAAA;AACH;AC3BA,SAAS,oBAAA,CAAqB,EAAE,KAAA,EAAO,IAAA,EAAK,EAA8C;AACxF,EAAA,uBACEI,IAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAI,KAAA;AAAA,MACJ,SAAA,EAAU,uEAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gCAAA,EAAiC,QAAA,EAAA;AAAA,UAAA,wBAAA;AAAA,UAAuB,IAAA,CAAK;AAAA,SAAA,EAAK,CAAA;AAAA,wBAC/EJ,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2BAAA,EAA6B,gBAAM,OAAA,EAAQ,CAAA;AAAA,wBACxDI,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,MAAA,EACjB,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,qCAAA,EAAsC,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,0BACpEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EAAoD,gBAAM,KAAA,EAAM;AAAA,SAAA,EACjF,CAAA;AAAA,wBACAI,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,MAAA,EACjB,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,qCAAA,EAAsC,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,0BACvEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACZ,eAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,EAC/B;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEO,IAAM,sBAAA,GAAN,cAAqC,SAAA,CAG1C;AAAA,EACA;AAAA,IAAA,IAAA,CAAO,WAAA,GAAc,eAAA;AAAA;AAAA,EAIrB,YAAY,KAAA,EAAoC;AAC9C,IAAA,KAAA,CAAM,KAAK,CAAA;AACX,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,QAAA,EAAU,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,EAC9C;AAAA,EAEA,OAAO,yBAAyB,KAAA,EAA2C;AACzE,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM;AAAA,EACjC;AAAA;AAAA;AAAA,EAIA,mBAAmB,SAAA,EAA8C;AAC/D,IAAA,IAAI,KAAK,KAAA,CAAM,QAAA,IAAY,UAAU,IAAA,KAAS,IAAA,CAAK,MAAM,IAAA,EAAM;AAC7D,MAAA,IAAA,CAAK,SAAS,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,iBAAA,CAAkB,OAAc,SAAA,EAA4B;AAC1D,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAA,CAAQ,MAAM,+DAA+D,CAAA;AAC7E,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAE,GAAA,EAAI,GAAI,IAAA,CAAK,OAAA;AACrB,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAS,GAAI,IAAA,CAAK,KAAA;AAEhC,IAAA,GAAA,CAAI,cAAA,CAAe,CAAA,qBAAA,EAAwB,IAAA,CAAK,IAAA,IAAQ,SAAS,CAAA,CAAE,CAAA;AACnE,IAAA,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,OAAO,CAAA;AAChC,IAAA,GAAA,CAAI,KAAA,CAAM,WAAA,EAAa,IAAA,CAAK,IAAA,IAAQ,SAAS,CAAA;AAC7C,IAAA,GAAA,CAAI,KAAA,CAAM,YAAY,QAAQ,CAAA;AAC9B,IAAA,GAAA,CAAI,KAAA,CAAM,OAAO,OAAO,MAAA,KAAW,cAAc,MAAA,CAAO,QAAA,CAAS,OAAO,KAAK,CAAA;AAC7E,IAAA,GAAA,CAAI,MAAM,MAAA,EAAA,iBAAQ,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA;AAC1C,IAAA,GAAA,CAAI,KAAA,CAAM,aAAA,EAAe,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA;AAC1C,IAAA,GAAA,CAAI,KAAA,CAAM,iBAAA,EAAmB,SAAA,CAAU,cAAA,IAAkB,EAAE,CAAA;AAC3D,IAAA,GAAA,CAAI,GAAA,CAAI,kBAAkB,IAAI,CAAA;AAC9B,IAAA,GAAA,CAAI,QAAA,EAAS;AAAA,EACf;AAAA,EAEA,MAAA,GAAoB;AAClB,IAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAI,IAAA,CAAK,KAAA;AACjC,IAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,IAAA,CAAK,KAAA;AAEhC,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AACzC,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,uBAAOA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,KAAA,EAAc,IAAA,EAAY,CAAA;AAAA,IACzD;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AChFA,SAAS,kBAAA,GAAqB;AAC5B,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEACZ,QAAA,EAAA,CAAC,CAAA,EAAG,GAAG,CAAA,EAAG,CAAC,EAAE,GAAA,CAAI,CAAC,sBACjBA,GAAAA,CAAC,SAAc,SAAA,EAAU,eAAA,EAAA,EAAb,CAA6B,CAC1C,CAAA,EACH,CAAA;AAEJ;AAaA,IAAM,oBAAoBC,IAAAA,CAAK,SAASkB,kBAAAA,CAAkB,EAAE,MAAK,EAAwB;AACvF,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc,OAAO,IAAA;AAElD,EAAA,uBACEf,IAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAI,KAAA;AAAA,MACJ,SAAA,EAAU,6EAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yBAAA,EACX,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,YAAO,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,UAAS,GAAA;AAAA,UAAE,IAAA,CAAK;AAAA,SAAA,EAC5C,CAAA;AAAA,wBACAI,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAAA,EAA+B,QAAA,EAAA;AAAA,UAAA,2BAAA;AAAA,0BACjBA,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,YAAA,0BAAA;AAAA,YAAyB,IAAA,CAAK,IAAA;AAAA,YAAK;AAAA,WAAA,EAAiB;AAAA,SAAA,EACrF,CAAA;AAAA,wBACAA,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,MAAA,EACjB,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,wBAAA,EAAyB,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,0BAC1DA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EAAuC,eAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,EAAE;AAAA,SAAA,EACtF;AAAA;AAAA;AAAA,GACF;AAEJ,CAAC,CAAA;AAMD,SAAS,mBAAmB,IAAA,EAA2C;AACrE,EAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,SAAA,EAAU,GAAI,IAAA;AAGxC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,UAAA,GAAa,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,QAAQ,IAAI,CAAA,CAAA;AAChC,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA;AAC9C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,SAAA;AAAA,EACT;AAGA,EAAA,OAAO,iBAAA;AACT;AAGA,IAAM,sBAAA,GACJ,4IAAA;AAQK,SAAS,uBAAuB,IAAA,EAAiC;AACtE,EAAA,MAAM,MAAM,IAAA,CAAK,kBAAA;AACjB,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,EAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,KAAY,KAAA;AAChC,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,KAAW,KAAA;AAC9B,EAAA,IAAI,OAAA,IAAW,CAAC,MAAA,EAAQ,OAAO,kBAAA;AAC/B,EAAA,IAAI,MAAA,IAAU,CAAC,OAAA,EAAS,OAAO,mBAAA;AAC/B,EAAA,OAAO,EAAA;AACT;AAmBA,IAAM,gBAAA,GAAwD;AAAA,EAC5D,iBAAA,EAAmB,EAAE,MAAA,EAAQ,OAAA,EAAS,6BAAaA,GAAAA,CAACoB,sBAAAA,EAAA,EAAuB,CAAA,EAAG;AAAA,EAC9E,gBAAA,EAAkB,EAAE,MAAA,EAAQ,OAAA,EAAS,6BAAapB,GAAAA,CAACqB,qBAAAA,EAAA,EAAsB,CAAA,EAAG;AAAA,EAC5E,mBAAA,EAAqB;AAAA,IACnB,MAAA,EAAQ,OAAA;AAAA,IACR,WAAA,kBAAarB,GAAAA,CAACoB,sBAAAA,EAAA,EAAuB,CAAA;AAAA,IACrC,SAAA,EAAW,CAAC,IAAA,KAAS;AACnB,MAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AACnB,MAAA,IAAI,KAAA,KAAU,QAAA;AACZ,QAAA,OAAO,sGAAA;AACT,MAAA,IAAI,KAAA,KAAU,QAAA;AACZ,QAAA,OAAO,CAAA,yGAAA,EAA4G,IAAA,CAAK,SAAA,GAAY,WAAA,GAAc,SAAS,CAAA,0BAAA,CAAA;AAC7J,MAAA,IAAI,KAAA,KAAU,QAAA;AACZ,QAAA,OAAO,CAAA,6DAAA,EAAgE,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,WAAA,GAAc,EAAE,CAAA,UAAA,CAAA;AAC9I,MAAA,OAAO,8DAAA;AAAA,IACT,CAAA;AAAA,IACA,EAAA,EAAI,CAAC,IAAA,KAAS,CAAA,kBAAA,EAAqB,KAAK,UAAU,CAAA,CAAA,EAAI,IAAA,CAAK,QAAA,IAAY,CAAC,CAAA;AAAA,GAC1E;AAAA,EACA,WAAA,EAAa,EAAE,MAAA,EAAQ,OAAA,EAAS,6BAAapB,GAAAA,CAAC,sBAAmB,CAAA,EAAG;AAAA,EACpE,gBAAA,EAAkB,EAAE,MAAA,EAAQ,OAAA,EAAS,6BAAaA,GAAAA,CAAC,0BAAuB,CAAA,EAAG;AAAA,EAC7E,qBAAA,EAAuB,EAAE,MAAA,EAAQ,OAAA,EAAS,6BAAaA,GAAAA,CAAC,4BAAyB,CAAA,EAAG;AAAA,EACpF,cAAA,EAAgB,EAAE,MAAA,EAAQ,OAAA,EAAS,6BAAaA,GAAAA,CAAC,4BAAyB,CAAA,EAAG;AAAA,EAC7E,eAAA,EAAiB;AAAA,IACf,MAAA,EAAQ,2BAAA;AAAA,IACR,WAAA,kBAAaA,GAAAA,CAAC,cAAA,EAAA,EAAe,CAAA;AAAA,IAC7B,WAAW,CAAC,IAAA,KACV,iCAAiC,IAAA,CAAK,WAAA,GAAc,oBAAoB,EAAE,CAAA;AAAA,GAC9E;AAAA,EACA,eAAA,EAAiB,EAAE,MAAA,EAAQ,OAAA,EAAS,6BAAaA,GAAAA,CAAC,sBAAmB,CAAA,EAAG;AAAA,EACxE,OAAA,EAAS,EAAE,MAAA,EAAQ,OAAA,EAAS,6BAAaA,GAAAA,CAAC,kBAAe,CAAA,EAAG;AAAA,EAC5D,kBAAA,EAAoB;AAAA;AAAA,IAElB,MAAA,EAAQ,KAAA;AAAA,IACR,WAAA,kBAAaA,GAAAA,CAAAG,QAAAA,EAAA,EAAE,CAAA;AAAA,IACf,SAAA,EAAW,CAAC,IAAA,KAAS,CAAA,wBAAA,EAA2B,KAAK,cAAc,CAAA,CAAA;AAAA;AAAA,IAEnE,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,MAAA,EAAQ,OAAA;AAAA,IACR,WAAA,kBAAaH,GAAAA,CAAC,YAAA,EAAA,EAAa,CAAA;AAAA,IAC3B,SAAA,EAAW,CAAC,IAAA,KAAS;AACnB,MAAA,MAAM,eAAe,IAAA,CAAK,8BAAA;AAC1B,MAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,MAAA,OAAO;AAAA,QACL,SAAA;AAAA,QACA,qBAAA;AAAA,QACA,YAAA,IAAgB,WAAW,0BAAA,GAA6B,EAAA;AAAA,QACxD,CAAC,IAAA,CAAK,KAAA,IAAS,YAAA,GAAe,qBAAA,GAAwB;AAAA,OACxD,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAAA,IACb;AAAA,GACF;AAAA,EACA,cAAA,EAAgB,EAAE,MAAA,EAAQ,OAAA,EAAS,6BAAaA,GAAAA,CAAC,sBAAmB,CAAA;AACtE,CAAA;AAQA,IAAM,uBAA4D,EAAC;AAO5D,SAAS,4BAA4B,MAAA,EAAmD;AAC7F,EAAA,MAAA,CAAO,MAAA,CAAO,sBAAsB,MAAM,CAAA;AAC5C;AAOA,SAAS,uBAAuB,IAAA,EAA+C;AAC7E,EAAA,OAAO,oBAAA,CAAqB,IAAI,CAAA,IAAK,gBAAA,CAAiB,IAAI,CAAA;AAC5D;AAQA,SAAS,cAAc,IAAA,EAA6C;AAClE,EAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,QAAA,KAAa,QAAA,GAAW,KAAK,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,GAAI,MAAA;AACvF,EAAA,MAAM,EAAA,GAAK,KAAA,IAAS,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,GAAA;AACpC,EAAA,OAAO,OAAO,OAAO,QAAA,IAAa,OAAO,OAAO,QAAA,IAAY,EAAA,GAAM,MAAA,CAAO,EAAE,CAAA,GAAI,MAAA;AACjF;AAMO,IAAM,qBAAA,GAAwBC,IAAAA,CAAK,SAASqB,sBAAAA,CAAsB;AAAA,EACvE,IAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,cAAA,GAAiB,OAAO,CAAC,CAAA;AAC/B,EAAA,cAAA,CAAe,OAAA,IAAW,CAAA;AAE1B,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,aAAA,EAAe;AAC1C,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,wCAAwC,IAAA,CAAK,IAAI,WAAW,KAAK,CAAA,cAAA,EAAiB,eAAe,OAAO,CAAA;AAAA,KAC1G;AAAA,EACF;AAEA,EAAAJ,UAAU,MAAM;AACd,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,uCAAuC,IAAA,CAAK,IAAI,WAAW,KAAK,CAAA,cAAA,EAAiB,eAAe,OAAO,CAAA;AAAA,KACzG;AACA,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,CAAQ,IAAI,CAAA,sCAAA,EAAyC,IAAA,CAAK,IAAI,CAAA,QAAA,EAAW,KAAK,CAAA,CAAE,CAAA;AAAA,IAClF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,CAAK,IAAA,EAAM,KAAK,CAAC,CAAA;AAErB,EAAA,MAAM,gBAAA,GAAmB,YAAY,KAAA,IAAS,CAAA;AAC9C,EAAA,MAAMK,UAAAA,GAAY,mBAAmB,IAAI,CAAA;AAEzC,EAAA,MAAM,MAAA,GAAS,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA;AAE/C,EAAA,MAAM,iBAAA,GAAoB,MAAA,EAAQ,SAAA,GAC9B,OAAO,OAAO,SAAA,KAAc,UAAA,GAC1B,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA,GACrB,MAAA,CAAO,SAAA,GACT,CAAA,iBAAA,EAAoB,KAAK,IAAI,CAAA,CAAA;AACjC,EAAA,MAAM,SAAA,GAAY,uBAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,MAAA,EAAQ,EAAA,GACvB,OAAO,MAAA,CAAO,EAAA,KAAO,UAAA,GACnB,MAAA,CAAO,EAAA,CAAG,IAAI,CAAA,GACd,MAAA,CAAO,EAAA,GACT,MAAA;AACJ,EAAA,MAAM,WAAA,GAAc,cAAc,IAAI,CAAA;AACtC,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,OAAA;AAEjC,EAAA,MAAM,gBAAgB,MAAA,EAAQ,aAAA,IAAiB,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA,EAAG,aAAA;AAE5E,EAAA,MAAM,OAAA,mBACJvB,GAAAA,CAAC,sBAAA,EAAA,EAAuB,MAAY,QAAA,EAAU,KAAA,GAAQ,CAAA,EACpD,QAAA,kBAAAA,GAAAA,CAACuB,UAAAA,EAAA,EAAU,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,QAAQ,CAAA,EAAG,QAAA,EAAU,gBAAA,EAAiB,EAAG,CAAA,EACjF,CAAA;AAGF,EAAA,uBACEnB,IAAAA,CAAAD,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,SAAA,oBACCH,GAAAA,CAAC,OAAA,EAAA,EAAM,MAAK,6BAAA,EAA8B,UAAA,EAAW,WAClD,QAAA,EAAA,sBAAA,EACH,CAAA;AAAA,oBAEFA,GAAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAW,MAAA;AAAA,QACX,WAAW,SAAA,GAAY,CAAA,EAAG,iBAAiB,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAK,iBAAA;AAAA,QAC7D,EAAA,EAAI,UAAA;AAAA,QACJ,eAAA,EAAiB,MAAA;AAAA,QACjB,aAAA,EAAe,oBAAoB,aAAA,KAAkB,IAAA;AAAA,QACrD,aAAa,MAAA,EAAQ,WAAA,oBAAeA,GAAAA,CAACoB,wBAAA,EAAuB,CAAA;AAAA,QAE5D,UAAA,EAAY,MAAA,CAAA,IAAA,CAAY,GAAA,CAAI,GAAA,GAAM,KAAA,GAAQ,MAAA;AAAA,QAC1C,WAAA;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ,CAAC;AC/RM,IAAM,aAAanB,IAAAA,CAAK,SAASuB,YAAW,EAAE,IAAA,EAAM,OAAM,EAAoB;AACnF,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,GAAS,EAAC,EAAE,GAAIC,QAAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,KAAK,CAAC,CAAA;AAEvE,EAAA,uBACEzB,GAAAA,CAAAG,QAAAA,EAAA,EACG,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBACjBH,GAAAA,CAAC,yBAAkC,IAAA,EAAY,KAAA,EAAc,UAAU,KAAA,EAAA,EAA3C,KAAkD,CAC/E,CAAA,EACH,CAAA;AAEJ,CAAC;ACZD,IAAI,UAAA,GAAa,KAAA;AAOjB,SAAS,qBAAqB,MAAA,EAA6B;AACzD,EAAA,IAAI,UAAA,EAAY;AAChB,EAAA,UAAA,GAAa,IAAA;AACb,EAAA,eAAA,CAAgB,CAAC,GAAA,KAAQ;AACvB,IAAA,GAAA,CAAI,KAAA,EAAO,YAAA,GAAe,0BAAA,EAA4B,kBAAA,EAAoB,CAAC,SAAA,KAAc;AACvF,MAAA,IAAI,CAAC,SAAA,CAAU,IAAA,EAAM,OAAA,CAAQ,6CAA6C,CAAA,EAAG;AAC7E,MAAA,MAAM,YAAA,GACJ,SAAA,CAAU,aAAA,KAAkB,KAAA,IAAS,UAAU,aAAA,KAAkB,gBAAA;AACnE,MAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,GAAA,EAAK,QAAQ,YAAA,GAAe,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,GAAG,CAAA;AAC3F,MAAA,QAAA,EAAS;AACT,MAAA,GAAA,CAAI,IAAA,EAAM,WAAW,QAAQ,CAAA;AAC7B,MAAA,IAAI,YAAA,EAAc;AAClB,MAAA,SAAA,CAAU,gBAAA,GAAmB,OAAO,KAAA,KAAiB;AACnD,QAAA,KAAA,CAAM,cAAA,EAAe;AAErB,QAAA,MAAM,YAAY,SAAA,CAAU,SAAA,IAAa,SAAA,CAAU,IAAA,CAAK,aAAa,YAAY,CAAA;AACjF,QAAA,MAAM,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,cAAA,GAAiB,aAAa,MAAS,CAAA;AAAA,MAC7D,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAMO,SAAS,kBAAkB,OAAA,EAAwB;AACxD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,GAAA,GAAM,EAAE,yBAAyB,CAAA;AACvC,EAAA,MAAM,UAAA,GAAa,EAAE,6BAA6B,CAAA;AAClD,EAAAkB,UAAU,MAAM;AACd,IAAA,IAAI,OAAA,EAAS,oBAAA,CAAqB,EAAE,GAAA,EAAK,YAAY,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,OAAA,EAAS,GAAA,EAAK,UAAU,CAAC,CAAA;AAC/B;ACvCO,IAAM,eAAA,GAAkBjB,IAAAA,CAAK,SAASyB,gBAAAA,GAAkB;AAC7D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAS,GAAI,kBAAA,EAAmB;AAEnD,EAAA,MAAM,OAAA,GAAU,CAAC,CAAC,SAAA,IAAa,CAAC,CAAC,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,QAAA,CAAS,SAAS,CAAA;AAC9E,EAAA,MAAM,KAAA,GAAQ,EAAE,yBAAyB,CAAA;AACzC,EAAA,iBAAA,CAAkB,OAAO,CAAA;AAEzB,EAAA,MAAM,IAAA,GAAOC,OAAAA;AAAA,IACX,OAAO;AAAA,MACL,IAAA,EAAM,iBAAA;AAAA,MACN,KAAA;AAAA,MACA,eAAA,EAAiB,0BAAA;AAAA,MACjB,QAAA,EAAU,EAAE,MAAA,EAAQ,SAAA;AAAU,KAChC,CAAA;AAAA,IACA,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,uBACE3B,GAAAA,CAAC,KAAA,EAAA,EAAI,EAAA,EAAG,mBAAkB,aAAA,EAAY,SAAA,EACpC,QAAA,kBAAAA,GAAAA,CAAC,yBAAsB,IAAA,EAAY,KAAA,EAAO,EAAA,EAAI,QAAA,EAAU,OAAO,CAAA,EACjE,CAAA;AAEJ,CAAC","file":"chunk-4VYKXIYA.js","sourcesContent":["import { Suspense, useCallback, useMemo } from 'react';\nimport { product, ProductsListSource } from '../../api/product';\nimport { ProductCard } from '../../components/product';\nimport { ProductsSliderSkeleton, SallaProductsSlider } from '@salla.sa/twilight-components-react';\nimport { useTranslation } from '../../providers/I18nProvider';\n\ninterface ProductsSourceConfig {\n source: ProductsListSource;\n source_value?: number | number[] | null;\n}\n\nexport interface ProductsSliderProps {\n data: {\n products: ProductsSourceConfig;\n title?: string;\n display_all_url?: string;\n position?: number;\n priority?: boolean;\n show_controls?: boolean;\n controls_outer?: boolean;\n loop?: boolean;\n centered?: boolean;\n slides_per_view?: number | 'auto';\n direction?: 'rtl' | 'ltr';\n autoplay?: boolean;\n [key: string]: unknown;\n };\n}\n\nexport function ProductsSlider({ data }: ProductsSliderProps) {\n const { t } = useTranslation();\n const {\n products,\n title,\n display_all_url: displayAllUrl,\n position = 1,\n priority = false,\n show_controls: showControls,\n controls_outer: controlsOuter,\n loop,\n centered,\n slides_per_view: slidesPerView,\n direction,\n autoplay,\n } = data;\n\n const sliderProps = useMemo(\n () => ({\n id: `slider-${position}`,\n displayAllTitle: t('blocks.home.display_all', 'View All'),\n ...(showControls !== undefined && { showControls }),\n ...(controlsOuter !== undefined && { controlsOuter }),\n ...(loop !== undefined && { loop }),\n ...(centered !== undefined && { centered }),\n ...(slidesPerView !== undefined && { slidesPerView }),\n ...(direction !== undefined && { direction }),\n }),\n [position, t, showControls, controlsOuter, loop, centered, slidesPerView, direction]\n );\n\n const loader = useCallback(\n () =>\n product.list({\n source: products.source,\n sourceValue: products.source_value,\n }),\n [products.source, products.source_value]\n );\n\n return (\n <Suspense fallback={<ProductsSliderSkeleton />}>\n <SallaProductsSlider\n id={`best-offers-${position}-slider`}\n loader={loader}\n sliderProps={sliderProps}\n {...(displayAllUrl ? { displayAllUrl } : {})}\n {...(title ? { blockTitle: title } : {})}\n {...(autoplay !== undefined ? { autoplay } : {})}\n skeleton={<ProductsSliderSkeleton />}\n >\n {(product, index) => (\n <ProductCard product={product} imagePriority={priority && index < 2} />\n )}\n </SallaProductsSlider>\n </Suspense>\n );\n}\n","import { memo } from 'react';\nimport type { Feature } from '../../types';\n\nexport interface StoreFeaturesProps {\n data: {\n features: Feature[];\n [key: string]: unknown;\n };\n}\n\nexport const StoreFeatures = memo(function StoreFeatures({ data }: StoreFeaturesProps) {\n const { features } = data;\n\n if (!features.length) return null;\n\n return (\n <>\n <div className=\"grid grid-cols-[repeat(2,minmax(0,1fr))] md:grid-cols-[repeat(3,minmax(0,1fr))] gap-4 sm:gap-6 xl:gap-8\">\n {features.map((feature) => (\n <div\n key={`${feature.icon}:${feature.title}:${feature.description ?? ''}`}\n className=\"s-block--features__item\"\n >\n <div className=\"feature-icon\">\n <i className={feature.icon}></i>\n </div>\n <h2>{feature.title}</h2>\n <p>{feature.description}</p>\n </div>\n ))}\n </div>\n </>\n );\n});\n","import { memo } from 'react';\nimport { Link } from '../common';\n\nexport interface FixedBannerComponentProps {\n data: {\n image: {\n url: string;\n alt?: string;\n small_url?: string;\n };\n url?: string;\n title?: string;\n position?: number;\n [key: string]: unknown;\n };\n priority?: boolean;\n}\n\nexport const FixedBanner = memo(function FixedBanner(props: FixedBannerComponentProps) {\n const { data, priority = false } = props;\n const image = data.image?.url;\n\n if (!image) {\n return null;\n }\n\n const url = data.url;\n const altText = data.image.alt?.trim() ? data.image.alt : data.title || 'fixed banner';\n\n const imgProps = priority\n ? {\n loading: 'eager' as const,\n fetchPriority: 'high' as const,\n decoding: 'sync' as const,\n }\n : {\n loading: 'lazy' as const,\n decoding: 'async' as const,\n };\n\n const smallUrl = data.image.small_url;\n\n return (\n <>\n <div className=\"container\">\n <Link\n to={url || '#'}\n className=\"banner banner--fixed overflow-hidden\"\n aria-label={`Banner ${altText}`}\n >\n <picture>\n {smallUrl && <source media=\"(max-width: 767px)\" srcSet={smallUrl} />}\n <img\n width=\"1200\"\n height=\"300\"\n src={image}\n alt={altText}\n style={{ maxWidth: '100%', objectFit: 'contain' }}\n loading={imgProps.loading}\n decoding={imgProps.decoding}\n {...(priority && { fetchPriority: imgProps.fetchPriority })}\n />\n </picture>\n </Link>\n </div>\n </>\n );\n});\n","import { Suspense } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { FixedProductsSkeleton } from '@salla.sa/twilight-components-react';\nimport { Link } from '../common';\nimport { product, ProductsListSource } from '../../api/product';\nimport { ProductCard } from '../../components/product';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useTwilight } from '../../providers/TwilightProvider';\n\nexport interface FixedProductsProps {\n data: {\n products: { source: ProductsListSource; source_value?: number[] | null };\n title?: string;\n limit?: number | string;\n display_all_url?: string | null;\n key?: string | null;\n isVertical?: boolean;\n position?: number;\n [key: string]: unknown;\n };\n}\n\nexport function FixedProducts({ data }: FixedProductsProps) {\n const { t } = useTranslation();\n const { theme } = useTwilight();\n\n const title = data.title;\n // The merchant's product count: a number, or the same as a string. Anything that\n // isn't a positive whole number falls back to what the API returns.\n const parsedLimit = Number(data.limit);\n const limit = Number.isInteger(parsedLimit) && parsedLimit > 0 ? parsedLimit : undefined;\n // Matches Twig Raed: `theme.settings.get('vertical_fixed_products', true)`.\n const isVertical = data.isVertical ?? theme.settings.vertical_fixed_products ?? true;\n\n const { data: result, isLoading } = useQuery(\n product.queries.list({\n source: data.products.source,\n sourceValue: data.products?.source_value,\n perPage: limit,\n })\n );\n\n const products = result?.items ?? [];\n\n if (isLoading) {\n return <FixedProductsSkeleton />;\n }\n\n if (!products.length) return null;\n\n return (\n <Suspense fallback={<FixedProductsSkeleton />}>\n {title && (\n <div className=\"s-block__title\">\n <div className=\"right-side\">\n <h2>{title}</h2>\n </div>\n {data.display_all_url && (\n <Link to={data.display_all_url} className=\"s-block__display-all\">\n {t('blocks.home.display_all', 'View All')}\n <i className=\"sicon-arrow-left\"></i>\n </Link>\n )}\n </div>\n )}\n <div\n className={\n 's-products-list-wrapper ' +\n (isVertical ? 's-products-list-vertical-cards' : 's-products-list-horizontal-cards')\n }\n >\n {products.slice(0, limit).map((product) => (\n <ProductCard\n key={product.id}\n product={product}\n layout={isVertical ? 'vertical' : 'horizontal'}\n />\n ))}\n </div>\n </Suspense>\n );\n}\n","import { memo, useState, useCallback } from 'react';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport type { Product } from '../../types';\n\ninterface SectionItem {\n title?: string;\n name?: string;\n type?: string;\n id?: string;\n products?: Product[];\n limit?: number;\n}\n\ninterface MainProduct {\n id?: string;\n title?: string;\n value?: string;\n product?: Product;\n}\n\nexport interface FeaturedProductsStyle1Props {\n data: {\n items: SectionItem[];\n main_product?: MainProduct;\n position?: number;\n [key: string]: unknown;\n };\n}\n\nexport const FeaturedProductsStyle1 = memo(function FeaturedProductsStyle1({\n data,\n}: FeaturedProductsStyle1Props) {\n const items = data.items || [];\n const mainProduct = data.main_product;\n\n const [activeTab, setActiveTab] = useState<string>(items[0]?.id || '');\n const [isAnimating, setIsAnimating] = useState(false);\n\n const handleTabClick = useCallback(\n (tabId: string) => {\n if (tabId === activeTab) return;\n setIsAnimating(true);\n setActiveTab(tabId);\n setTimeout(() => setIsAnimating(false), 100);\n },\n [activeTab]\n );\n\n if (!items.length) return null;\n\n const hasMultipleSections = items.length > 1;\n\n return (\n <>\n <div className=\"s-block__title\">\n <div className=\"right-side\">\n <h2>{mainProduct?.title}</h2>\n </div>\n {hasMultipleSections && (\n <div className=\"tabs hide-scroll hidden lg:flex\">\n {items.map((section) => (\n <SallaButton\n key={section.id}\n shape=\"link\"\n onClick={() => handleTabClick(section.id || '')}\n className={`tab-trigger ${activeTab === section.id ? 'is-active' : ''}`}\n >\n {section.title || section.name}\n </SallaButton>\n ))}\n </div>\n )}\n </div>\n\n <div className={`grid grid-cols-1 gap-8 ${mainProduct?.product ? 'lg:grid-cols-2' : ''}`}>\n {mainProduct?.product && (\n <div className=\"flex flex-col\">\n <custom-salla-product-card\n shadow-on-hover\n product={JSON.stringify(mainProduct.product)}\n isSpecial\n ></custom-salla-product-card>\n </div>\n )}\n <div className=\"flex flex-col\">\n {hasMultipleSections && (\n <div className=\"tabs mb-4 sm:mb-8 hide-scroll lg:hidden\">\n {items.map((section) => (\n <SallaButton\n key={section.id}\n shape=\"link\"\n onClick={() => handleTabClick(section.id || '')}\n className={`tab-trigger ${activeTab === section.id ? 'is-active' : ''}`}\n >\n {section.title || section.name}\n </SallaButton>\n ))}\n </div>\n )}\n\n <div className=\"tabs-wrapper flex flex-1\">\n {items.map((section) => {\n const isActive = activeTab === section.id;\n return (\n <div\n key={section.id}\n className={`tabs__item grid-cols-2 ${mainProduct?.product ? '' : 'lg:grid-cols-4'} ${isActive ? 'is-active' : ''} ${isAnimating && isActive ? 'opacity-0 translate-y-3' : ''} ${!isAnimating && isActive ? 'opacity-100 translate-y-0' : ''}`}\n >\n {section.products\n ?.slice(0, mainProduct?.product ? 4 : 8)\n .map((product, productIndex) => (\n <custom-salla-product-card\n key={product.id || productIndex}\n product={JSON.stringify(product)}\n ></custom-salla-product-card>\n ))}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </>\n );\n});\n","import { memo, useState, useCallback } from 'react';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { SallaProductsList } from '@salla.sa/twilight-components-react';\nimport { SallaProductsSlider } from '@salla.sa/twilight-components-react';\nimport { product, ProductsListSource } from '../../api/product';\nimport { ProductCard } from '../../components/product';\nimport { useTwilight } from '../../providers/TwilightProvider';\n\ninterface ProductSource {\n source: ProductsListSource;\n limit?: number;\n source_value?: number | number[];\n}\n\ninterface SectionItem {\n title?: string;\n name?: string;\n type?: string;\n id?: string;\n products: ProductSource;\n limit?: number;\n}\n\nexport interface FeaturedProductsStyle2Props {\n data: {\n items: SectionItem[];\n position?: number;\n is_slider?: boolean;\n [key: string]: unknown;\n };\n}\n\n// Like Twig Raed, the grid honors `vertical_fixed_products`; the slider never does.\nexport const FeaturedProductsStyle2 = memo(function FeaturedProductsStyle2({\n data,\n}: FeaturedProductsStyle2Props) {\n const { theme } = useTwilight();\n const items = data.items || [];\n const isSlider = data.is_slider ?? true;\n const cardLayout = (theme.settings.vertical_fixed_products ?? true) ? 'vertical' : 'horizontal';\n\n const [activeTab, setActiveTab] = useState<string>(items[0]?.id || '');\n const [isAnimating, setIsAnimating] = useState(false);\n\n const handleTabClick = useCallback(\n (tabId: string) => {\n if (tabId === activeTab) return;\n setIsAnimating(true);\n setActiveTab(tabId);\n setTimeout(() => setIsAnimating(false), 100);\n },\n [activeTab]\n );\n\n const loader = useCallback(\n (source: ProductsListSource, value?: number | number[], limit?: number) => {\n return () =>\n product.list({\n source: source,\n sourceValue: value,\n perPage: limit,\n });\n },\n []\n );\n\n if (!items.length) return null;\n\n const hasMultipleSections = items.length > 1;\n\n return (\n <>\n <div className=\"container\">\n {hasMultipleSections && (\n <div className=\"tabs hide-scroll\">\n {items.map((section) => (\n <SallaButton\n key={section.id}\n fill=\"outline\"\n onClick={() => handleTabClick(section.id || '')}\n className={`tab-trigger ${activeTab === section.id ? 'is-active' : ''}`}\n >\n {section.title || section.name}\n </SallaButton>\n ))}\n </div>\n )}\n\n <div className=\"tabs-wrapper\">\n {items.map((section) => {\n const isActive = activeTab === section.id;\n return (\n <div\n key={section.id}\n className={`tabs__item ${isActive ? 'is-active' : ''} ${isAnimating && isActive ? 'opacity-0 translate-y-3' : ''} ${!isAnimating && isActive ? 'opacity-100 translate-y-0' : ''}`}\n >\n {isSlider ? (\n <SallaProductsSlider\n loader={loader(\n section.products.source,\n section.products?.source_value,\n section.products?.limit\n )}\n sliderProps={{ id: `section-${section.id}-slider` }}\n >\n {(product) => (\n <ProductCard className=\"s-products-slider-card\" product={product} />\n )}\n </SallaProductsSlider>\n ) : (\n <SallaProductsList\n loader={loader(\n section.products.source,\n section.products?.source_value,\n section.products?.limit\n )}\n itemsClassName={`s-products-list-${cardLayout}-cards`}\n >\n {(products) =>\n products.map((product) => (\n <ProductCard key={product.id} product={product} layout={cardLayout} />\n ))\n }\n </SallaProductsList>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </>\n );\n});\n","import { memo } from 'react';\nimport { ProductCard } from '../product/ProductCard';\nimport type { Product } from '../../types';\n\ninterface SectionItem {\n title?: string;\n name?: string;\n type?: string;\n products?: Product[];\n featured_product?: Product;\n limit?: number;\n id?: string;\n}\n\nexport interface FeaturedProductsStyle3Props {\n data: {\n items: SectionItem[];\n position?: number;\n [key: string]: unknown;\n };\n}\n\nexport const FeaturedProductsStyle3 = memo(function FeaturedProductsStyle3({\n data,\n}: FeaturedProductsStyle3Props) {\n const items = data.items || [];\n\n if (!items.length) return null;\n\n return (\n <>\n <div className=\"inner\">\n {items.map((section, sectionIndex) => (\n <div key={section.id || sectionIndex}>\n <div className=\"s-block__title\">\n <h2>{section.title}</h2>\n </div>\n <div className=\"flex-1 grid lg:grid-cols-2 gap-4 sm:gap-8\">\n {section.featured_product ? (\n <>\n <ProductCard product={section.featured_product} layout=\"fullImage\" withShadow />\n <div className=\"grid gap-4 sm:gap-8\">\n {section.products?.slice(0, 3).map((product, idx) => (\n <ProductCard\n key={product.id}\n product={product}\n layout=\"minimal\"\n withShadow\n index={idx}\n />\n ))}\n </div>\n </>\n ) : (\n section.products?.map((product, idx) => (\n <ProductCard\n key={product.id}\n product={product}\n layout=\"minimal\"\n withShadow\n index={idx}\n />\n ))\n )}\n </div>\n </div>\n ))}\n </div>\n </>\n );\n});\n","import { memo } from 'react';\nimport { Link } from '../common';\n\ninterface ImageData {\n url?: string;\n}\n\nexport interface ParallaxBackgroundProps {\n data: {\n image: ImageData;\n url?: string;\n title?: string;\n link_text?: string;\n is_opacity?: boolean;\n position?: number;\n [key: string]: unknown;\n };\n}\n\nexport const ParallaxBackground = memo(function ParallaxBackground({\n data,\n}: ParallaxBackgroundProps) {\n const { image, url, title, link_text: linkText, is_opacity: isOpacity = false } = data;\n\n if (!image?.url) return null;\n\n return (\n <>\n <div className=\"full-banner-entry\" style={{ backgroundImage: `url(${image.url})` }}>\n <div\n className={`overlay h-full w-full ${isOpacity ? 'bg-black' : ''} opacity-60 absolute top-0 left-0`}\n ></div>\n <div className=\"flex h-full items-center justify-center p-5 xs:p-11 relative\">\n <div>\n {title && <h2 className=\"text-2xl font-bold leading-12\">{title}</h2>}\n\n {url && linkText && (\n <Link\n to={url}\n className=\"inline-block text-white text-sm border rounded-md font-bold px-8 py-4\"\n >\n {linkText}\n </Link>\n )}\n </div>\n </div>\n </div>\n </>\n );\n});\n","import { memo } from 'react';\nimport { SallaSlider } from '@salla.sa/twilight-components-react/slider';\nimport { Link, Image } from '../common';\n\ninterface PhotoItem {\n id?: string | number;\n url?: string;\n link_type?: string;\n image?: string;\n}\n\nexport interface PhotosSliderProps {\n data: {\n items: PhotoItem[];\n position?: number;\n is_repeated?: boolean;\n [key: string]: unknown;\n };\n}\n\nexport const PhotosSlider = memo(function PhotosSlider({ data }: PhotosSliderProps) {\n const items = data.items || [];\n const position = data.position ?? 1;\n\n if (!items.length) return null;\n\n return (\n <>\n <SallaSlider\n type=\"carousel\"\n className=\"home-slider photos-slider\"\n centered\n autoPlay\n pagination\n id={`photos-${position}-slider`}\n sliderConfig={{ watchOverflow: true }}\n >\n <div slot=\"items\">\n {items.map((item, index) => (\n <div\n key={item.id ?? `${item.url ?? ''}:${item.image ?? ''}`}\n className=\"swiper-slide\"\n style={{ aspectRatio: '1200/300' }}\n >\n <Link to={item.url || '#'}>\n <Image\n src={item.image}\n className=\"w-full h-full object-contain rounded-md\"\n alt={`image-slider-${index}`}\n width={1200}\n height={300}\n priority={index === 0}\n />\n </Link>\n </div>\n ))}\n </div>\n </SallaSlider>\n </>\n );\n});\n","import { memo } from 'react';\nimport { Link } from '../common';\n\ninterface ImageData {\n url?: string;\n alt?: string;\n}\n\ninterface SquarePhotoItem {\n id?: string | number;\n url?: string;\n link_type?: string;\n /** The Store API sends the URL itself to the engine; Twig gets `{ url, alt }`. */\n image?: string | ImageData;\n text?: string;\n}\n\nconst imageUrl = (item: SquarePhotoItem) =>\n typeof item.image === 'string' ? item.image : item.image?.url;\n\nexport interface SquarePhotosProps {\n data: {\n title?: string;\n items: SquarePhotoItem[];\n position?: number;\n [key: string]: unknown;\n };\n}\n\nexport const SquarePhotos = memo(function SquarePhotos({ data }: SquarePhotosProps) {\n const items = data.items || [];\n const title = data.title;\n\n if (!items.length) return null;\n\n const gridCols =\n items.length <= 3 ? `one-row md:grid-cols-${items.length}` : 'md:grid-cols-3 two-row';\n\n return (\n <>\n {title && (\n <div className=\"s-block__title\">\n <div className=\"right-side\">\n <h2>{title}</h2>\n </div>\n </div>\n )}\n\n <div className={`grid ${gridCols} grid-flow-row gap-3 sm:gap-8`}>\n {items.map((item) => (\n <Link\n {...(item.link_type === 'external_link' ? { target: '_blank' } : {})}\n key={item.id ?? imageUrl(item) ?? item.url}\n className={`banner-entry square-photos ${item.text ? 'has-overlay with-hover' : ''}`}\n style={{ backgroundImage: `url(${imageUrl(item)})` }}\n to={item.url || '#'}\n >\n {item.text && (\n <h3 className=\"text-with-border\">\n <span>{item.text}</span>\n </h3>\n )}\n </Link>\n ))}\n </div>\n </>\n );\n});\n","import { memo, useEffect, useState } from 'react';\n\nexport interface YoutubeProps {\n data: {\n youtube_id: string;\n position?: number;\n [key: string]: unknown;\n };\n}\n\nexport const Youtube = memo(function Youtube({ data }: YoutubeProps) {\n const { youtube_id: youtubeId } = data;\n const [isLoaded, setIsLoaded] = useState(false);\n\n useEffect(() => {\n if (!youtubeId) return;\n\n // Lazy load the lite-youtube web component\n let mounted = true;\n import('@justinribeiro/lite-youtube')\n .then(() => {\n if (mounted) setIsLoaded(true);\n })\n .catch((err) => {\n console.error('Failed to load lite-youtube:', err);\n });\n\n return () => {\n mounted = false;\n };\n }, [youtubeId]);\n\n if (!youtubeId) return null;\n\n return (\n <>\n <div className=\"container\">\n <div className=\"videoWrapper\">\n {isLoaded ? (\n <lite-youtube videoid={youtubeId} params=\"rel=0\"></lite-youtube>\n ) : (\n <div className=\"animate-pulse bg-gray-200 w-full h-full min-h-[300px] rounded\" />\n )}\n </div>\n </div>\n </>\n );\n});\n","import { memo, useState, useEffect } from 'react';\n\nexport interface BundleComponentProps {\n data: {\n component_name: string;\n bundle_id: string;\n [key: string]: unknown;\n };\n}\n\nexport const BundleComponent = memo(function BundleComponent(props: BundleComponentProps) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!mounted) {\n return null;\n }\n\n const { component_name: componentName, bundle_id: bundleId, ...rest } = props.data;\n const config = JSON.stringify(rest);\n\n return (\n <>\n <salla-custom-component\n component-name={componentName}\n bundle-id={bundleId}\n config={config}\n suppressHydrationWarning\n />\n </>\n );\n});\n","import { lazy } from 'react';\n\nexport { ProductsSlider as LazyProductsSlider } from './ProductsSlider';\nexport { StoreFeatures as LazyStoreFeatures } from './StoreFeatures';\nexport { FixedBanner as LazyFixedBanner } from './FixedBanner';\nexport { FixedProducts as LazyFixedProducts } from './FixedProducts';\nexport { FeaturedProductsStyle1 as LazyFeaturedProductsStyle1 } from './FeaturedProductsStyle1';\nexport { FeaturedProductsStyle2 as LazyFeaturedProductsStyle2 } from './FeaturedProductsStyle2';\nexport { FeaturedProductsStyle3 as LazyFeaturedProductsStyle3 } from './FeaturedProductsStyle3';\nexport { ParallaxBackground as LazyParallaxBackground } from './ParallaxBackground';\nexport { PhotosSlider as LazyPhotosSlider } from './PhotosSlider';\nexport { SquarePhotos as LazySquarePhotos } from './SquarePhotos';\nexport const LazyTestimonials = lazy(() =>\n import('./Testimonials').then((m) => ({ default: m.Testimonials }))\n);\nexport { Youtube as LazyYoutube } from './Youtube';\nexport { BundleComponent as LazyBundleComponent } from './BundleComponent';\n","import {\n LazyProductsSlider,\n LazyStoreFeatures,\n LazyFixedBanner,\n LazyFixedProducts,\n LazyFeaturedProductsStyle1,\n LazyFeaturedProductsStyle2,\n LazyFeaturedProductsStyle3,\n LazyParallaxBackground,\n LazyPhotosSlider,\n LazySquarePhotos,\n LazyTestimonials,\n LazyYoutube,\n LazyBundleComponent,\n} from './lazy';\nimport type { AnyHomeComponent } from './types';\nimport { registry } from '../ComponentRegistry';\n\nexport const DefaultHomeComponents: Record<string, AnyHomeComponent | null> = {\n 'fixed-banner': LazyFixedBanner,\n 'photos-slider': LazyPhotosSlider,\n testimonial: LazyTestimonials,\n 'store-features': LazyStoreFeatures,\n youtube: LazyYoutube,\n 'square-photos': LazySquarePhotos,\n 'fixed-products': LazyFixedProducts,\n 'products-slider': LazyProductsSlider,\n 'parallax-background': LazyParallaxBackground,\n 'featured-products:style1': LazyFeaturedProductsStyle1,\n 'featured-products:style2': LazyFeaturedProductsStyle2,\n 'featured-products:style3': LazyFeaturedProductsStyle3,\n 'bundle-component': LazyBundleComponent,\n};\n\nexport function registerHomeComponents(\n components: Record<string, AnyHomeComponent | null> = DefaultHomeComponents,\n prefix = 'home:'\n): void {\n Object.entries(components).forEach(([path, component]) => {\n if (component) {\n registry.register(`${prefix}${path}`, component);\n }\n });\n}\n","import { Component, type ReactNode, type ErrorInfo } from 'react';\nimport { TwilightContext } from '../../providers/twilight-context';\nimport type { TwilightContextValue } from '../../types/twilight';\nimport type { HomeComponentData } from '../../types';\n\ninterface ComponentErrorBoundaryProps {\n children: ReactNode;\n data: HomeComponentData;\n position: number;\n}\n\ninterface ComponentErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nfunction DevelopmentErrorCard({ error, data }: { error: Error; data: HomeComponentData }) {\n return (\n <section\n dir=\"ltr\"\n className=\"s-block container overflow-hidden bg-red-50 border border-red-300 p-4\"\n >\n <p className=\"text-red-800 text-sm font-bold\">Home Component Error: {data.path}</p>\n <p className=\"text-red-700 text-sm mt-2\">{error.message}</p>\n <details className=\"mt-2\">\n <summary className=\"text-xs cursor-pointer text-red-600\">Stack Trace</summary>\n <pre className=\"text-xs mt-1 overflow-auto max-h-32 text-red-700\">{error.stack}</pre>\n </details>\n <details className=\"mt-2\">\n <summary className=\"text-xs cursor-pointer text-red-600\">Component Data</summary>\n <pre className=\"text-xs mt-1 overflow-auto max-h-32 text-red-700\">\n {JSON.stringify(data, null, 2)}\n </pre>\n </details>\n </section>\n );\n}\n\nexport class ComponentErrorBoundary extends Component<\n ComponentErrorBoundaryProps,\n ComponentErrorBoundaryState\n> {\n static contextType = TwilightContext;\n\n declare context: TwilightContextValue | null;\n\n constructor(props: ComponentErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ComponentErrorBoundaryState {\n return { hasError: true, error };\n }\n\n // Blocks are keyed by position, so a replacement block at the same position reuses\n // this boundary. An error belongs to the block that threw it, not the position.\n componentDidUpdate(prevProps: ComponentErrorBoundaryProps): void {\n if (this.state.hasError && prevProps.data !== this.props.data) {\n this.setState({ hasError: false, error: null });\n }\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n if (!this.context) {\n console.error('[ComponentErrorBoundary] Must be used within TwilightProvider');\n return;\n }\n const { log } = this.context;\n const { data, position } = this.props;\n\n log.groupCollapsed(`HomeComponent Error: ${data.path || 'unknown'}`);\n log.error('ERROR', error.message);\n log.label('COMPONENT', data.path || 'unknown');\n log.label('POSITION', position);\n log.label('URL', typeof window !== 'undefined' ? window.location.href : 'SSR');\n log.label('TIME', new Date().toISOString());\n log.trace('STACK TRACE', error.stack || '');\n log.trace('COMPONENT STACK', errorInfo.componentStack || '');\n log.dir('COMPONENT DATA', data);\n log.groupEnd();\n }\n\n render(): ReactNode {\n const { hasError, error } = this.state;\n const { children, data } = this.props;\n\n if (hasError && error) {\n if (process.env.NODE_ENV === 'production') {\n return null;\n }\n\n return <DevelopmentErrorCard error={error} data={data} />;\n }\n\n return children;\n }\n}\n","import { memo, useEffect, useRef, type ReactNode } from 'react';\nimport { registry } from '../ComponentRegistry';\nimport { RenderWhenVisible } from '../common';\nimport { ComponentErrorBoundary } from './ComponentErrorBoundary';\nimport type { AnyHomeComponent } from './index';\nimport type { HomeComponentData } from '../../types';\nimport {\n BackgroundSliderSkeleton,\n BulletDeliverySkeleton,\n FixedProductsSkeleton,\n ListSkeleton,\n ProductsSliderSkeleton,\n Pulse,\n ReviewItemSkeleton,\n SliderSkeleton,\n} from '@salla.sa/twilight-components-react';\n\nfunction SquareGridSkeleton() {\n return (\n <div className=\"s-block container grid grid-cols-2 sm:grid-cols-4 gap-4 py-8\">\n {[1, 2, 3, 4].map((i) => (\n <Pulse key={i} className=\"aspect-square\" />\n ))}\n </div>\n );\n}\n\nexport type HomeComponentsProps = {\n data: HomeComponentData & {\n position?: number;\n [key: string]: unknown;\n };\n};\n\n/**\n * Fallback component for unknown/unregistered components\n * Only shows in development mode\n */\nconst FallbackComponent = memo(function FallbackComponent({ data }: HomeComponentsProps) {\n if (process.env.NODE_ENV === 'production') return null;\n\n return (\n <section\n dir=\"ltr\"\n className=\"s-block container overflow-hidden bg-yellow-50 border border-yellow-200 p-4\"\n >\n <p className=\"text-yellow-800 text-sm\">\n <strong>Unknown component:</strong> {data.path}\n </p>\n <p className=\"text-yellow-700 text-xs mt-1\">\n Register it in setup.ts: <code>registry.register('home:{data.path}', YourComponent)</code>\n </p>\n <details className=\"mt-2\">\n <summary className=\"text-xs cursor-pointer\">Component Data</summary>\n <pre className=\"text-xs mt-1 overflow-auto max-h-32\">{JSON.stringify(data, null, 2)}</pre>\n </details>\n </section>\n );\n});\n\n/**\n * Get the React component for a given home component path\n * Looks up from registry only - theme must register components\n */\nfunction getComponentByPath(data: HomeComponentData): AnyHomeComponent {\n const { path, view_style: viewStyle } = data;\n\n // 1. Check for view_style variant first\n if (viewStyle) {\n const variantKey = `home:${path}:${viewStyle}`;\n const variant = registry.resolve(variantKey);\n if (variant) {\n return variant as AnyHomeComponent;\n }\n }\n\n // 2. Check registry for component\n const registryKey = `home:${path}`;\n const component = registry.resolve(registryKey);\n if (component) {\n return component as AnyHomeComponent;\n }\n\n // 3. Fallback for unknown components\n return FallbackComponent;\n}\n\n/** Same breakpoint and rules the Store injects for Twig themes (`ComponentVisibilityStyles`). */\nconst CHANNEL_VISIBILITY_CSS =\n '@media (max-width:767.98px){.s-hide-on-mobile{display:none!important}}' +\n '@media (min-width:768px){.s-hide-on-desktop{display:none!important}}';\n\n/**\n * Hide class for the merchant's per-channel pick. A missing key, or one that\n * hides on both channels, means visible everywhere: hiding a block outright\n * is the `is_visible` toggle's job, and stores without the feature send no key.\n */\nexport function channelVisibilityClass(data: HomeComponentData): string {\n const raw = data.channel_visibility;\n if (!raw || typeof raw !== 'object') return '';\n const desktop = raw.desktop !== false;\n const mobile = raw.mobile !== false;\n if (desktop && !mobile) return 's-hide-on-mobile';\n if (mobile && !desktop) return 's-hide-on-desktop';\n return '';\n}\n\n/**\n * Render-shell config for a home block: the values the lazy-load wrapper\n * (`RenderWhenVisible`) needs *before* the block mounts — reserved height, the\n * skeleton placeholder, and the wrapper's className/id.\n *\n * Themes register config for blocks they own via `registerHomeComponentConfig`;\n * the engine knows nothing about theme-specific blocks.\n */\nexport type HomeComponentConfig = {\n height?: string;\n className?: string | ((data: HomeComponentData) => string);\n id?: string | ((data: HomeComponentData) => string);\n placeholder?: ReactNode;\n /** Mount on page load instead of when the block nears the viewport. */\n renderOnMount?: boolean;\n};\n\nconst COMPONENT_CONFIG: Record<string, HomeComponentConfig> = {\n 'products-slider': { height: '450px', placeholder: <ProductsSliderSkeleton /> },\n 'fixed-products': { height: '450px', placeholder: <FixedProductsSkeleton /> },\n 'featured-products': {\n height: '450px',\n placeholder: <ProductsSliderSkeleton />,\n className: (data) => {\n const style = data.view_style;\n if (style === 'style1')\n return 's-block s-block--featured-products s-block-tabs s-block--special-products container tabs-initialized';\n if (style === 'style2')\n return `s-block s-block--featured-products s-block-tabs s-block--tabs-produtcs s-block--full-bg tabs-initialized ${data.is_slider ? 'as-slider' : 'as-grid'} bg-gray-100 py-8 sm:py-16`;\n if (style === 'style3')\n return `s-block s-block--featured-products s-block--features-products${Array.isArray(data.items) && data.items.length > 1 ? ' two-cols' : ''} container`;\n return 's-block s-block--featured-products container overflow-hidden';\n },\n id: (data) => `featured-products-${data.view_style}-${data.position ?? 0}`,\n },\n testimonial: { height: '350px', placeholder: <ReviewItemSkeleton /> },\n 'store-features': { height: '200px', placeholder: <BulletDeliverySkeleton /> },\n 'parallax-background': { height: '500px', placeholder: <BackgroundSliderSkeleton /> },\n 'fixed-banner': { height: '350px', placeholder: <BackgroundSliderSkeleton /> },\n 'photos-slider': {\n height: 'clamp(130px, 30vw, 350px)',\n placeholder: <SliderSkeleton />,\n className: (data) =>\n `s-block s-block--photos-slider${data.is_repeated ? ' repeated-block' : ''}`,\n },\n 'square-photos': { height: '250px', placeholder: <SquareGridSkeleton /> },\n youtube: { height: '350px', placeholder: <SliderSkeleton /> },\n 'bundle-component': {\n // As in Twig: reserve nothing, the bundle grows the block from 0.\n height: '0px',\n placeholder: <></>,\n className: (data) => `s-block s-block--bundle-${data.component_name}`,\n // As in Twig, where merchant scripts wait a limited time for the bundle's markup.\n renderOnMount: true,\n },\n 'main-links': {\n height: '200px',\n placeholder: <ListSkeleton />,\n className: (data) => {\n const mergeWithTop = data.merge_links_with_top_component;\n const position = data.position;\n return [\n 's-block',\n 's-block--main-links',\n mergeWithTop && position ? 'merge-with-top-component' : '',\n !data.title && mergeWithTop ? 'merged-has-no-title' : '',\n ]\n .filter(Boolean)\n .join(' ');\n },\n },\n 'square-links': { height: '200px', placeholder: <SquareGridSkeleton /> },\n};\n\n/**\n * Theme-registered render-shell config, keyed by home component path. Themes own\n * the display of their blocks by registering config here; at render time a path's\n * theme entry replaces (not field-merges) the engine's built-in `COMPONENT_CONFIG`\n * entry for that path.\n */\nconst themeComponentConfig: Record<string, HomeComponentConfig> = {};\n\n/**\n * Register render-shell config for home blocks a theme owns (height, placeholder,\n * className, id). Merges by path and overwrites existing keys, so it is safe to\n * call more than once and idempotent for the same keys.\n */\nexport function registerHomeComponentConfig(config: Record<string, HomeComponentConfig>): void {\n Object.assign(themeComponentConfig, config);\n}\n\n/**\n * Resolve a block's render-shell config: theme-registered config takes precedence\n * over the engine's built-in config; returns `undefined` when neither defines the\n * path so the renderer can apply generic defaults.\n */\nfunction resolveComponentConfig(path: string): HomeComponentConfig | undefined {\n return themeComponentConfig[path] ?? COMPONENT_CONFIG[path];\n}\n\n/**\n * What the theme editor addresses a block by: the dev editor's layout id (less\n * the remount suffix), its row id, or the uuid of one not saved yet. The layout\n * id comes first: a customized layout keeps the store blocks' row ids among\n * their fields, and duplicates share them.\n */\nfunction liveBlockIdOf(data: HomeComponentData): string | undefined {\n const devId = typeof data.__dev_id === 'string' ? data.__dev_id.replace(/~\\d+$/, '') : undefined;\n const id = devId ?? data.id ?? data.key;\n return typeof id === 'number' || (typeof id === 'string' && id) ? String(id) : undefined;\n}\n\n/**\n * Memoized component renderer with scroll-based lazy loading\n * Components only mount when scrolled into view - preventing API calls until needed\n */\nexport const HomeComponentRenderer = memo(function HomeComponentRenderer({\n data,\n index,\n priority,\n}: {\n data: HomeComponentData;\n index: number;\n /** Mount right away with eager images. Defaults to the first three blocks of the page. */\n priority?: boolean;\n}) {\n const renderCountRef = useRef(0);\n renderCountRef.current += 1;\n\n if (process.env.NODE_ENV === 'development') {\n console.log(\n `[HomeComponentRenderer] RENDER: path=${data.path}, index=${index}, renderCount=${renderCountRef.current}`\n );\n }\n\n useEffect(() => {\n console.log(\n `[HomeComponentRenderer] MOUNT: path=${data.path}, index=${index}, renderCount=${renderCountRef.current}`\n );\n return () => {\n console.log(`[HomeComponentRenderer] UNMOUNT: path=${data.path}, index=${index}`);\n };\n }, [data.path, index]);\n\n const isFirstComponent = priority ?? index <= 2;\n const Component = getComponentByPath(data);\n\n const config = resolveComponentConfig(data.path);\n\n const resolvedClassName = config?.className\n ? typeof config.className === 'function'\n ? config.className(data)\n : config.className\n : `s-block s-block--${data.path}`;\n const hideClass = channelVisibilityClass(data);\n const resolvedId = config?.id\n ? typeof config.id === 'function'\n ? config.id(data)\n : config.id\n : undefined;\n const liveBlockId = liveBlockIdOf(data);\n const height = config?.height || '400px';\n // A theme's config replaces the engine's, but keeps its mount timing unless the theme sets one.\n const renderOnMount = config?.renderOnMount ?? COMPONENT_CONFIG[data.path]?.renderOnMount;\n\n const content = (\n <ComponentErrorBoundary data={data} position={index + 1}>\n <Component data={{ ...data, position: index + 1, priority: isFirstComponent }} />\n </ComponentErrorBoundary>\n );\n\n return (\n <>\n {hideClass && (\n <style href=\"twilight-channel-visibility\" precedence=\"default\">\n {CHANNEL_VISIBILITY_CSS}\n </style>\n )}\n <RenderWhenVisible\n rootMargin=\"50px\"\n className={hideClass ? `${resolvedClassName} ${hideClass}` : resolvedClassName}\n id={resolvedId}\n estimatedHeight={height}\n renderOnMount={isFirstComponent || renderOnMount === true}\n placeholder={config?.placeholder ?? <ProductsSliderSkeleton />}\n // Dev only: lets the theme editor scroll the preview to a block.\n blockIndex={import.meta.env.DEV ? index : undefined}\n liveBlockId={liveBlockId}\n >\n {content}\n </RenderWhenVisible>\n </>\n );\n});\n","import { memo } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { home, type BlockScope } from '../../api/home';\nimport { HomeComponentRenderer } from './HomePageRenderer';\n\nexport interface PageBlocksProps {\n /** The page hook the merchant placed the blocks at, e.g. `product.single.before_customer_reviews`. */\n hook: string;\n /** The product, category or page being shown. */\n scope: BlockScope;\n}\n\n/** Draws the blocks placed at a product, category or page hook, loaded in the browser. */\nexport const PageBlocks = memo(function PageBlocks({ hook, scope }: PageBlocksProps) {\n const { data: blocks = [] } = useQuery(home.queries.blocks(hook, scope));\n\n return (\n <>\n {blocks.map((data, index) => (\n <HomeComponentRenderer key={index} data={data} index={index} priority={false} />\n ))}\n </>\n );\n});\n","import { useEffect } from 'react';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { whenSallaLoaded } from '../../utils/sdk-helpers';\n\ninterface ReorderLabels {\n /** The add button's text in a reorder list. */\n add: string;\n /** Its text for an out-of-stock product. */\n outOfStock: string;\n}\n\nlet registered = false;\n\n/**\n * Twig's ReorderProductsWidget script: inside a reorder list the add button reads the block's\n * title and adds the product as the customer last ordered it. The SDK has no way to remove a\n * hook, so it is registered once per page load.\n */\nfunction registerReorderHooks(labels: ReorderLabels): void {\n if (registered) return;\n registered = true;\n whenSallaLoaded((sdk) => {\n sdk.hooks?.registerHook?.('salla-add-product-button', 'componentDidLoad', (component) => {\n if (!component.host?.closest('[source=\"reorder\"], [data-source=\"reorder\"]')) return;\n const isOutOfStock =\n component.productStatus === 'out' || component.productStatus === 'out-and-notify';\n const setLabel = () => component.btn?.setText(isOutOfStock ? labels.outOfStock : labels.add);\n setLabel();\n sdk.lang?.onLoaded?.(setLabel);\n if (isOutOfStock) return;\n component.addProductToCart = async (event: Event) => {\n event.preventDefault();\n // The click lands on the inner button, which has no product-id; without one the SDK uses the page's.\n const productId = component.productId ?? component.host.getAttribute('product-id');\n await sdk.order.api.reorderProduct?.(productId ?? undefined);\n };\n });\n });\n}\n\n/**\n * Inside an element with `data-source=\"reorder\"`, make each add button read \"order again\" and\n * add the product as the customer last ordered it, as Twig's reorder block and page do.\n */\nexport function useReorderButtons(enabled: boolean): void {\n const { t } = useTranslation();\n const add = t('pages.orders.repurchase');\n const outOfStock = t('pages.products.out_of_stock');\n useEffect(() => {\n if (enabled) registerReorderHooks({ add, outOfStock });\n }, [enabled, add, outOfStock]);\n}\n","import { memo, useMemo } from 'react';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { getTwilightContext } from '../../twilight/context';\nimport type { HomeComponentData } from '../../types';\nimport { HomeComponentRenderer } from './HomePageRenderer';\nimport { useReorderButtons } from './reorder-hooks';\n\n/**\n * Twig's \"order again\" block (the Store app's ReorderProductsWidget): on the home page, for a\n * signed-in customer of a store with Reorder on, the products they ordered before, drawn by the\n * theme's own `products-slider` like the home's other product rows.\n */\nexport const ReorderProducts = memo(function ReorderProducts() {\n const { t } = useTranslation();\n const { authToken, settings } = getTwilightContext();\n // The platform lists `reorder` in the store's features exactly when the Reorder setting is on.\n const enabled = !!authToken && !!settings?.store?.features?.includes('reorder');\n const title = t('pages.orders.repurchase');\n useReorderButtons(enabled);\n\n const data = useMemo<HomeComponentData>(\n () => ({\n path: 'products-slider',\n title,\n display_all_url: '/products?source=reorder',\n products: { source: 'reorder' },\n }),\n [title]\n );\n\n if (!enabled) return null;\n\n return (\n <div id=\"reorder-section\" data-source=\"reorder\">\n <HomeComponentRenderer data={data} index={-1} priority={false} />\n </div>\n );\n});\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/engine-version.ts","../src/api/client.ts"],"names":[],"mappings":"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","file":"chunk-5LP2K2J7.js","sourcesContent":["/**\n * The engine's own build version, injected by tsup `define` when dist is\n * built. Falls back to 'dev' when the source runs unbundled (vitest, direct\n * src imports in the monorepo).\n *\n * Exposed at runtime as `salla.versions.engine` by `useTwilightInit` so a\n * storefront can always be asked which engine build rendered it.\n */\nexport const ENGINE_VERSION: string =\n typeof __TWILIGHT_ENGINE_VERSION__ !== 'undefined' ? __TWILIGHT_ENGINE_VERSION__ : 'dev';\n","import ky from 'ky';\nimport { createIsomorphicFn } from '@tanstack/react-start';\nimport { getCookie } from '@tanstack/react-start/server';\nimport { getStoreIdentifier } from '../utils/sdk-helpers';\nimport { resolveThemeVersionId } from '../utils/theme-version';\nimport { getInjectedRuntimeEnv, readEnv } from '../utils/runtime-env';\nimport { getTwilightContext } from '../twilight/context';\nimport { ENGINE_VERSION } from '../utils/engine-version';\nimport {\n AUTH_TOKEN_COOKIE_NAME,\n CURRENCY_COOKIE_NAME,\n extractCurrencyFromCookies,\n extractScopeFromCookies,\n toCurrencyCode,\n extractTokenFromCookies,\n readSdkScope,\n type ActiveScope,\n} from '../utils/cookies';\n\n// The twilight module store doesn't reliably carry authToken into every scope: on the\n// SERVER workerd has no AsyncLocalStorage, and on BOTH sides this api client can live in a\n// different module instance than the one rootBeforeLoad populates (engine subpath import vs\n// engine-internal relative import). So `getTwilightContext().authToken` is often null even\n// for logged-in users → API calls (orders/customer/…) return `token_not_provided` (400).\n// Read the token directly from the request cookie (server) or document.cookie / salla.storage\n// (client) as a fallback. The server-only import is stripped from the client bundle by\n// createIsomorphicFn.\nconst readFallbackToken = createIsomorphicFn()\n .server((): string | null => {\n try {\n return getCookie(AUTH_TOKEN_COOKIE_NAME) ?? null;\n } catch {\n return null;\n }\n })\n .client((): string | null => {\n const fromCookie =\n typeof document !== 'undefined'\n ? extractTokenFromCookies(document.cookie, AUTH_TOKEN_COOKIE_NAME)\n : null;\n if (fromCookie) return fromCookie;\n const storage = typeof window !== 'undefined' ? window.salla?.storage : undefined;\n const fromStorage =\n typeof storage?.get === 'function' ? storage.get(AUTH_TOKEN_COOKIE_NAME) : null;\n if (typeof fromStorage === 'string' && fromStorage) return fromStorage;\n // `?token=` webview injection lands only on the SDK's axios instance\n const fromSdkApi = typeof window !== 'undefined' ? window.salla?.api?.token : undefined;\n return typeof fromSdkApi === 'string' && fromSdkApi ? fromSdkApi : null;\n });\n\n/**\n * The auth token as the api client sees it: twilight context first, cookie/storage fallback.\n * Use this (not `getTwilightContext().authToken`, which is often null for logged-in users —\n * see the note above) to decide whether an authenticated-only query should run.\n */\nexport const getAuthToken = (): string | null =>\n getTwilightContext().authToken ?? readFallbackToken();\n\nconst readRequestCurrency = createIsomorphicFn()\n .server((): string | null => {\n try {\n return toCurrencyCode(getCookie(CURRENCY_COOKIE_NAME));\n } catch {\n return null;\n }\n })\n .client((): string | null => null);\n\n/**\n * The currency the visitor chose, from the `s-curr` cookie the SDK writes: the API\n * answers in the store's own currency unless the request names one.\n */\nexport function getActiveCurrency(): string | null;\nexport function getActiveCurrency(fallback: string): string;\nexport function getActiveCurrency(fallback: string | null = null): string | null {\n const chosen =\n typeof document !== 'undefined'\n ? extractCurrencyFromCookies(document.cookie)\n : readRequestCurrency();\n return chosen ?? fallback;\n}\n\nconst API_HEADERS = {\n ACCEPT: 'accept',\n ACCEPT_LANGUAGE: 'accept-language',\n APP_OS: 's-app-os',\n APP_VERSION: 's-app-version',\n RAY: 's-ray',\n SOURCE: 's-source',\n THEME_TYPE: 's-theme-type',\n STORE_API_VERSION: 's-store-api-version',\n REQUESTED_WITH: 'x-requested-with',\n CF_PROXY_WHITELIST: 's-cf-proxy-whitelist-id',\n STORE_IDENTIFIER: 'store-identifier',\n CURRENCY: 'currency',\n AUTHORIZATION: 'Authorization',\n VERSION_ID: 's-version-id',\n SCOPE_ID: 's-scope-id',\n SCOPE_TYPE: 's-scope-type',\n SCOPE_ALLOCATION_TYPE: 's-scope-allocation-type',\n SCOPE_ALLOCATION_ID: 's-scope-allocation-id',\n USER_AGENT: 'user-agent',\n} as const;\n\n/**\n * The header every Salla API call is answered by store.\n *\n * Exported because a caller that already knows which store it is asking about\n * must be able to say so on the request itself — see `store.settings`. Without\n * it the only way to name a store is the ambient resolver, and \"the identifier\n * I checked\" and \"the identifier that was sent\" become two different things.\n */\nexport const STORE_IDENTIFIER_HEADER = API_HEADERS.STORE_IDENTIFIER;\n\n/**\n * Active scope: the market plus its branch allocation, as the SDK stores it. On the\n * client it comes from `salla.storage.get('scope')`; before the SDK hydrates storage\n * it falls back to the `scope` cookie the theme mirrors that selection into (see\n * writeScopeCookie), then to the scope twilightMiddleware seeded from the same\n * cookie on the server. Requests vary by the `s-scope-*` headers, so React Query\n * keys must include this to avoid serving another branch's cached categories/products.\n *\n * The cookie step matters for hydration: the SDK is not guaranteed to have\n * populated `salla.storage` by the time the client rebuilds a dehydrated query\n * key, and without it the client would compute null against a scoped SSR key.\n */\nexport const getActiveScope = (): ActiveScope | null => {\n // `!== undefined`, not `!= null`: a null here is the SDK authoritatively saying \"no branch\n // selected\", which must beat a cookie left over from the previous selection. Only a\n // not-yet-ready storage API (undefined) falls through to the cookie.\n const fromStorage = readSdkScope();\n if (fromStorage !== undefined) return fromStorage;\n\n if (typeof document !== 'undefined') {\n const fromCookie = extractScopeFromCookies(document.cookie);\n if (fromCookie != null) return fromCookie;\n }\n\n try {\n return getTwilightContext().scope;\n } catch {\n return null;\n }\n};\n\n/** {@link getActiveScope} reduced to the market id. */\nexport const getActiveScopeId = (): string | null => getActiveScope()?.id ?? null;\n\nconst sharedHeaders = (locale: string) => ({\n [API_HEADERS.ACCEPT]: 'application/json' as const,\n [API_HEADERS.ACCEPT_LANGUAGE]: locale,\n [API_HEADERS.APP_OS]: 'browser',\n [API_HEADERS.APP_VERSION]: '2.14.363',\n [API_HEADERS.RAY]: '50',\n [API_HEADERS.SOURCE]: 'twilight',\n [API_HEADERS.THEME_TYPE]: 'react',\n [API_HEADERS.STORE_API_VERSION]: 'swoole',\n [API_HEADERS.REQUESTED_WITH]: 'XMLHttpRequest',\n [API_HEADERS.CF_PROXY_WHITELIST]: '019a2f78-a64c-7edb-proxy-whitelist-id-9a3a-17afda90f03a',\n});\n\n/**\n * Who a server-rendered call says it is.\n *\n * Every theme worker reaches api.salla.dev from Cloudflare's one Workers address, so\n * salla.dev's per-IP rate limits counted every React store as a single client and\n * refused the calls each page makes (`store/settings` among them: \"Store Unavailable\").\n * The zone skips rate limiting for a User-Agent shaped `Salla-<Name>/<N.N.N> (<env>; <meta>)`\n * from Cloudflare's or AWS's networks, the convention Salla's other services already send.\n *\n * Built from fixed parts: the zone's pattern takes only digits and dots for the version,\n * so a prerelease suffix is dropped, and an unbundled engine (`dev`) reads as `0.0.0`.\n */\nconst SERVER_USER_AGENT = `Salla-TwilightReact/${\n /^\\d+(?:\\.\\d+)*/.exec(ENGINE_VERSION)?.[0] ?? '0.0.0'\n} (${import.meta.env.DEV ? 'development' : 'production'}; ssr)`;\n\n/**\n * Store API base. `VITE_API_URL` override points a preview at a branch backend; unset → prod\n * `api.salla.dev`. Resolution order matters: the value the SSR worker resolved (published into\n * the head, since worker `vars` are server-only `process.env` and never reach the browser\n * bundle) wins, so the hydrated client keeps talking to the backend that rendered the page.\n */\n\nconst STORE_API_BASE =\n getInjectedRuntimeEnv().apiBase || readEnv('VITE_API_URL') || 'https://api.salla.dev/store/v1';\n\nexport const api = ky.extend({\n prefix: STORE_API_BASE,\n timeout: 8000,\n hooks: {\n beforeRequest: [\n ({ request }) => {\n const { locale, authToken } = getTwilightContext();\n const headers = sharedHeaders(locale);\n for (const [key, value] of Object.entries(headers)) {\n request.headers.set(key, value);\n }\n // Only when the caller did not say. `headers.set` here would otherwise\n // overwrite a per-request identifier with the ambient one, which is a\n // silent way to answer a question about one store with another's data.\n if (!request.headers.get(API_HEADERS.STORE_IDENTIFIER)) {\n request.headers.set(API_HEADERS.STORE_IDENTIFIER, getStoreIdentifier());\n }\n\n // Server only. A browser call comes from the shopper's own address and is\n // counted against it, which is what the zone's limits are for.\n if (typeof document === 'undefined') {\n request.headers.set(API_HEADERS.USER_AGENT, SERVER_USER_AGENT);\n }\n\n const scope = getActiveScope();\n\n // The version the request asked for, else the one the settings named for\n // this scope. Absent means \"whatever is live\", which is what an ordinary\n // storefront visit wants — so a null is left off rather than sent empty.\n const versionId = resolveThemeVersionId(scope?.id ?? null);\n if (versionId) {\n request.headers.set(API_HEADERS.VERSION_ID, versionId);\n }\n\n const currency = getActiveCurrency();\n if (currency) request.headers.set(API_HEADERS.CURRENCY, currency);\n\n const token = authToken ?? readFallbackToken();\n if (token) {\n request.headers.set(API_HEADERS.AUTHORIZATION, `Bearer ${token}`);\n }\n\n // The same four the SDK's own client sends. The API resolves stock per\n // allocation: id alone asks about the market, not the branch the shopper chose.\n if (scope) {\n request.headers.set(API_HEADERS.SCOPE_ID, scope.id);\n if (scope.type) request.headers.set(API_HEADERS.SCOPE_TYPE, scope.type);\n if (scope.allocation_type)\n request.headers.set(API_HEADERS.SCOPE_ALLOCATION_TYPE, scope.allocation_type);\n if (scope.allocation_id)\n request.headers.set(API_HEADERS.SCOPE_ALLOCATION_ID, scope.allocation_id);\n }\n },\n ],\n },\n});\n\nexport const cdn = ky.extend({\n prefix: 'https://cdn.salla.network',\n timeout: 5000,\n});\n\n/**\n * The merchant uploader's public bucket, `admin-uploader-prod`.\n *\n * A different host from {@link cdn} and a different thing behind it: this one\n * is an R2 custom domain, so a read never passes through a worker. Storefront\n * translations live here, per language, under `translations/` — see\n * `api/translations.ts`.\n */\nexport const filesCdn = ky.extend({\n prefix: 'https://cdn.files.salla.network',\n timeout: 5000,\n});\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/native-app-headers.ts","../src/api/store.ts"],"names":[],"mappings":";;;;;;;;AACO,IAAM,kBAAA,GAAqB;AAAA,EAChC,UAAA;AAAA,EACA,eAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAA;AAUO,SAAS,qBAAqB,OAAA,EAAiD;AACpF,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,UAAU,GAAG,WAAA,EAAY;AAChD,EAAA,IAAI,EAAA,KAAO,KAAA,IAAS,EAAA,KAAO,SAAA,EAAW,OAAO,IAAA;AAC7C,EAAA,MAAM,QAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,QAAQ,kBAAA,EAAoB;AACrC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC9B,IAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA;AAAA,EAC3B;AACA,EAAA,OAAO,KAAA;AACT;;;ACZA,IAAM,qBAAA,GAAwB;AAAA,EAC5B,OAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAA;AAAA,EACA,mBAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AA+FA,IAAM,cAAA,GAAuD;AAAA,EAC3D,SAAA,EAAW,cAAA;AAAA,EACX,OAAA,EAAS,YAAA;AAAA,EACT,WAAA,EAAa,iBAAA;AAAA,EACb,GAAA,EAAK;AACP,CAAA;AAEA,SAAS,iBAAiB,OAAA,EAA0D;AAClF,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,EAAA,MAAM,SAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAuC;AAC9F,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC9B,IAAA,IAAI,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,GAAI,KAAA;AAAA,EAC7B;AACA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,MAAA,GAAS,MAAA;AAC/C;AAQA,SAAS,iBAAiB,SAAA,EAA8D;AACtF,EAAA,IAAI,CAAC,WAAW,OAAO,MAAA;AAGvB,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,GAAG,MAAK,CAAE,CAAA;AAClF;AAOA,SAAS,qBAAqB,KAAA,EAA8C;AAC1E,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,MAAA,KAAW,aAAa,OAAO,KAAA;AACpD,EAAA,IAAI,UAAA,GAA4C,IAAA;AAChD,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,oBAAmB,CAAE,gBAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,EAAS,KAAA;AAE7B,EAAA,MAAM,OAAA,GAAU,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AACpC,EAAA,KAAA,MAAW,IAAA,IAAQ,kBAAA,EAAoB,OAAO,OAAA,CAAQ,IAAI,CAAA;AAC1D,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,OAAA,EAAS;AAAA,MACP,GAAG,KAAA,CAAM,OAAA;AAAA,MACT,KAAA,EAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,GAAG,UAAA,EAAW;AAAE;AAC5D,GACF;AACF;AAEA,IAAM,mBAAA,GAAsB,GAAA;AAE5B,eAAe,gBAAgB,UAAA,EAA2C;AACxE,EAAA,MAAM,aAAA,GAAgB,qBAAA,CAAsB,GAAA,CAAI,CAAC,CAAA,KAAM,aAAa,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACjF,EAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,EAAA,MAAM,MAAA,GAAS,SAAS,IAAA,GAAO,CAAA,EAAG,aAAa,CAAA,OAAA,EAAU,KAAA,CAAM,EAAE,CAAA,CAAA,GAAK,aAAA;AAEtE,EAAA,MAAM,OAAA,GAAU,GAAA,CAKb,GAAA,CAAI,CAAA,eAAA,EAAkB,MAAM,CAAA,CAAA,EAAI;AAAA,IAC/B,OAAA,EAAS,mBAAA;AAAA,IACT,OAAA,EAAS,EAAE,CAAC,uBAAuB,GAAG,UAAA;AAAW,GAClD,CAAA;AACH,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,IAAA,EAAqC;AAEhE,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAA,CAAkB,MAAM,OAAA,GAAU,OAAO,CAAA;AAExD,EAAA,MAAM,OAAO,IAAA,EAAM,IAAA;AACnB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,aAAA;AAAA,MACR,0DAA0D,UAAU,CAAA,mBAAA,CAAA;AAAA,MACpE,EAAE,QAAQ,OAAA;AAAQ,KACpB;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAA;AAEjD,EAAA,OAAO;AAAA,IACL,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,SAAA;AAAA,IACA,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,mBAAmB,IAAA,CAAK,iBAAA;AAAA,IACxB,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,KAAA,EAAO,oBAAA,CAAqB,IAAA,CAAK,KAAK,CAAA;AAAA,IACtC,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,qBAAqB,IAAA,CAAK,mBAAA;AAAA,IAC1B,GAAI,KAAA,IAAS,EAAE,gBAAA,EAAkB,MAAM,EAAA,EAAG;AAAA,IAC1C,GAAI,MAAA,IAAU,EAAE,MAAA;AAAO,GACzB;AACF;AAGA,SAAS,gBAAgB,IAAA,EAAmC;AAC1D,EAAA,MAAM,OAAA,GAAW,MAAwD,KAAA,EAAO,OAAA;AAChF,EAAA,OAAO,OAAO,YAAY,QAAA,IAAY,OAAA,CAAQ,SAAS,CAAA,IAAK,OAAA,CAAQ,MAAA,IAAU,GAAA,GAC1E,OAAA,GACA,MAAA;AACN;AAQA,IAAM,uBAAA,GAA0B,wFAAA;AAShC,SAAS,eAAA,CAAgB,UAAA,EAAoB,MAAA,EAAgB,IAAA,EAAmC;AAC9F,EAAA,IAAI,MAAA,KAAW,GAAA,EAAK,OAAO,YAAA,CAAa,UAAU,CAAA,KAAM,IAAA;AACxD,EAAA,OAAO,MAAA,KAAW,OAAO,IAAA,KAAS,uBAAA;AACpC;AAQA,SAAS,uBAAA,CAAwB,YAAoB,KAAA,EAA+B;AAClF,EAAA,IAAI,KAAA,YAAiB,eAAe,OAAO,KAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,mCAAmC,UAAU,CAAA,CAAA,CAAA;AAC7D,EAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG;AACzB,IAAA,OAAO,IAAI,aAAA;AAAA,MACT,CAAA,6BAAA,EAAgC,OAAO,CAAA,QAAA,EAAW,mBAAmB,CAAA,IAAA,CAAA;AAAA,MACrE,EAAE,QAAQ,SAAA;AAAU,KACtB;AAAA,EACF;AACA,EAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,KAAA,CAAM,QAAA;AACzB,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,KAAA,CAAM,IAAI,CAAA;AACvC,IAAA,OAAO,IAAI,aAAA;AAAA,MACT,CAAA,uBAAA,EAA0B,OAAO,CAAA,WAAA,EAAc,MAAM,GAAG,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,CAAA;AAAA,MAC/E,EAAE,QAAQ,eAAA,CAAgB,UAAA,EAAY,QAAQ,IAAI,CAAA,GAAI,WAAA,GAAc,MAAA,EAAQ,MAAA;AAAO,KACrF;AAAA,EACF;AACA,EAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG;AACzB,IAAA,OAAO,IAAI,aAAA,CAAc,CAAA,uCAAA,EAA0C,OAAO,CAAA,CAAA,CAAA,EAAK;AAAA,MAC7E,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AACA,EAAA,MAAM,SAAS,KAAA,YAAiB,KAAA,GAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAA,GAAK,EAAA;AAC/D,EAAA,OAAO,IAAI,aAAA,CAAc,CAAA,gCAAA,EAAmC,UAAU,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA,CAAG,CAAA;AAC5F;AAOA,eAAe,cAAc,eAAA,EAAiD;AAC5E,EAAA,MAAM,UAAA,GAAa,mBAAmB,sBAAA,EAAuB;AAE7D,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,QAAQ,IAAI,aAAA;AAAA,MAChB,yHAAA;AAAA,MACA,EAAE,QAAQ,UAAA;AAAW,KACvB;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,kBAAA,EAAoB,KAAA,CAAM,OAAO,CAAA;AAC9C,IAAA,MAAM,KAAA;AAAA,EACR;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,gBAAgB,UAAU,CAAA;AAAA,EACzC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,KAAA,GAAQ,uBAAA,CAAwB,UAAA,EAAY,KAAK,CAAA;AACvD,IAAA,OAAA,CAAQ,KAAA,CAAM,kBAAA,EAAoB,KAAA,CAAM,OAAA,EAAS,GAAI,KAAA,KAAU,KAAA,GAAQ,EAAC,GAAI,CAAC,KAAK,CAAE,CAAA;AACpF,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAEO,IAAM,KAAA,GAAQ;AAAA,EACnB,QAAA,EAAU,OAAO,eAAA,KAA2D;AAC1E,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,cAAc,eAAe,CAAA;AAAA,IAC5C,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,QAAA,EAAU,CAAC,eAAA,KACT,YAAA,CAAkC;AAAA,MAChC,QAAA,EAAU;AAAA,QACR,OAAA;AAAA,QACA,UAAA;AAAA,QACA,eAAA;AAAA,QACA,oBAAmB,CAAE,MAAA;AAAA,QACrB,cAAA,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQf,uBAAA;AAAwB,OAC1B;AAAA;AAAA,MAEA,OAAA,EAAS,MAAM,aAAA,CAAc,eAAe,CAAA;AAAA;AAAA;AAAA,MAG5C,KAAA,EAAO;AAAA,KACR;AAAA;AAEP","file":"chunk-KEOCLT62.js","sourcesContent":["/** The headers the Salla native app sends with every page it loads in its webview. */\nexport const NATIVE_APP_HEADERS = [\n 's-app-os',\n 's-app-version',\n 's-app-full-version',\n 's-app-os-version',\n];\n\n/**\n * The native app's own headers on this request, or null when it is not the app.\n *\n * On a Twig theme Laravel copies them into the settings' `jitsu.context.extra.headers`,\n * where the SDK reads the app's platform and version from (`salla.config.isMobileApp()`).\n * A React theme asks for its settings from the server, through the API, so the app's\n * headers never reach that call: the request is the only place they are.\n */\nexport function readNativeAppHeaders(headers: Headers): Record<string, string> | null {\n const os = headers.get('s-app-os')?.toLowerCase();\n if (os !== 'ios' && os !== 'android') return null;\n const found: Record<string, string> = {};\n for (const name of NATIVE_APP_HEADERS) {\n const value = headers.get(name);\n if (value) found[name] = value;\n }\n return found;\n}\n","import { queryOptions } from '@tanstack/react-query';\nimport { isHTTPError, isNetworkError, isTimeoutError } from 'ky';\nimport { api, getActiveScope, STORE_IDENTIFIER_HEADER } from './client';\nimport { SettingsError } from '../utils/errors';\nimport type { Store, Theme, Language, JitsuConfig, MaintenanceDetails } from '../types';\nimport { getTwilightContext } from '../twilight/context';\nimport { resolveStoreIdentifier } from '../utils/store-identity';\nimport { parseStoreId } from '../utils/cookies';\nimport { requestedThemeVersionId } from '../utils/theme-version';\nimport { NATIVE_APP_HEADERS } from '../utils/native-app-headers';\n\nexport { resolveStoreIdentifier };\n\nconst DEFAULT_INCLUDE_ITEMS = [\n 'store',\n 'settings',\n 'theme',\n 'theme_settings',\n 'external_services',\n 'currencies',\n 'languages',\n 'payments',\n 'product_widgets',\n 'rating',\n 'ratings',\n 'user',\n];\n\n/** Twig's `salla.init({ user })` object; the endpoint ignores the token, so always the guest. */\nexport interface SettingsUser {\n type: 'guest' | 'user';\n id?: number | string | null;\n language_code?: string;\n currency_code?: string;\n country_code?: string;\n [key: string]: unknown;\n}\n\n/**\n * Raw API response for settings endpoint.\n * Languages come as object: { \"AR\": { code, name, ... }, \"EN\": {...} }\n */\ninterface SettingsApiResponse {\n store?: Store;\n theme?: Theme;\n languages?: Record<string, Language>;\n currencies?: Record<\n string,\n { code: string; name: string; symbol: string; amount: number; country_code: string }\n >;\n external_services?: Record<string, unknown>;\n headers?: Record<string, unknown>;\n login?: { url: string; turnstile_site_key: string };\n affiliate?: { utm_url: string; cta_enabled: boolean };\n debug?: boolean;\n trace_console?: boolean;\n policy_url?: string;\n user?: SettingsUser;\n swoole?: string[];\n jitsu?: JitsuConfig;\n maintenance?: boolean;\n maintenance_details?: MaintenanceDetails;\n}\n\n/**\n * Central settings context - single source of truth for all API data.\n * Contains everything from the settings endpoint response after processing.\n */\nexport interface StoreContext {\n store?: Store;\n theme?: Theme;\n /** Languages as array after conversion from API object format */\n languages?: Language[];\n currencies?: Record<\n string,\n { code: string; name: string; symbol: string; amount: number; country_code: string }\n >;\n external_services?: Record<string, unknown>;\n headers?: Record<string, unknown>;\n login?: { url: string; turnstile_site_key: string };\n affiliate?: { utm_url: string; cta_enabled: boolean };\n debug?: boolean;\n trace_console?: boolean; // todo:: remove it\n policy_url?: string;\n user?: SettingsUser;\n /** API paths the SDK sends with `s-store-api-version: swoole` */\n swoole?: string[];\n /** Where the SDK's analytics send events, and which ones; without it the SDK tracks nothing. */\n jitsu?: JitsuConfig;\n /**\n * The store is closed: by the merchant from the dashboard, by the platform, or\n * for the selected market only. The engine then renders the maintenance page\n * to everyone but the merchant; see `rootBeforeLoad`.\n */\n maintenance?: boolean;\n /** What the maintenance page says; sent beside `maintenance`. */\n maintenance_details?: MaintenanceDetails;\n /**\n * The scope these settings were requested with; absent when none was. Not from\n * the API: stamped by `store.settings`, so `resolveThemeVersionId` can tell\n * whether the version they name still answers the scope that is active now.\n */\n requestedScopeId?: string;\n /** Which answer of the API these settings are; see {@link SettingsAnswer}. */\n answer?: SettingsAnswer;\n}\n\n/**\n * Which answer of the settings API a set of settings came from, read off the\n * response rather than the body: the API's request id, the Store's trace, and\n * whether Cloudflare served it from its cache and how old it was. A decision the\n * settings drive for every visitor alike (the maintenance page) can then be\n * traced to the exact request the backend logged, or to a cached copy of it.\n */\nexport interface SettingsAnswer {\n requestId?: string;\n traceId?: string;\n cacheStatus?: string;\n age?: string;\n}\n\nconst ANSWER_HEADERS: Record<keyof SettingsAnswer, string> = {\n requestId: 's-request-id',\n traceId: 'x-trace-id',\n cacheStatus: 'cf-cache-status',\n age: 'age',\n};\n\nfunction settingsAnswerOf(headers: Headers | undefined): SettingsAnswer | undefined {\n if (!headers) return undefined;\n const answer: SettingsAnswer = {};\n for (const [field, name] of Object.entries(ANSWER_HEADERS) as [keyof SettingsAnswer, string][]) {\n const value = headers.get(name);\n if (value) answer[field] = value;\n }\n return Object.keys(answer).length ? answer : undefined;\n}\n\n/**\n * Converts languages object from API to array format.\n * API returns: { \"AR\": { code, name, ... }, \"EN\": { ... } }\n * We need: [{ code, name, ... }, { code, name, ... }]\n * todo:: return the languages as object from the APIs to avoid this\n */\nfunction languagesToArray(languages?: Record<string, Language>): Language[] | undefined {\n if (!languages) return undefined;\n // The SDK's localization modal reads `lang.iso_code` (not `code`) when a language is\n // selected — without it the switch navigates to `/undefined/...`.\n return Object.values(languages).map((lang) => ({ iso_code: lang.code, ...lang }));\n}\n\n/**\n * The settings' analytics context with the native app's headers in it, as Laravel\n * writes it for a Twig theme: the SDK reads the app's platform and version from there.\n * The API answers a server-side call with the engine's own headers, never the app's.\n */\nfunction withNativeAppHeaders(jitsu?: JitsuConfig): JitsuConfig | undefined {\n if (!jitsu || typeof window !== 'undefined') return jitsu;\n let appHeaders: Record<string, string> | null = null;\n try {\n appHeaders = getTwilightContext().nativeAppHeaders;\n } catch {\n return jitsu;\n }\n if (!appHeaders) return jitsu;\n const extra = jitsu.context?.extra;\n // The engine's own app headers go, so an app that sends no version doesn't get the engine's.\n const headers = { ...extra?.headers };\n for (const name of NATIVE_APP_HEADERS) delete headers[name];\n return {\n ...jitsu,\n context: {\n ...jitsu.context,\n extra: { ...extra, headers: { ...headers, ...appHeaders } },\n },\n };\n}\n\nconst SETTINGS_TIMEOUT_MS = 5000;\n\nasync function requestSettings(identifier: string): Promise<StoreContext> {\n const includeParams = DEFAULT_INCLUDE_ITEMS.map((i) => `include[]=${i}`).join('&');\n const scope = getActiveScope();\n const params = scope != null ? `${includeParams}&scope=${scope.id}` : includeParams;\n\n const request = api\n // Sent explicitly rather than left to the client's own resolution, so\n // the identifier this function checked is the identifier that travels.\n // They agree today; a caller passing one and being answered about\n // another is the failure this makes impossible rather than unlikely.\n .get(`store/settings?${params}`, {\n timeout: SETTINGS_TIMEOUT_MS,\n headers: { [STORE_IDENTIFIER_HEADER]: identifier },\n });\n const json = await request.json<{ data?: SettingsApiResponse }>();\n // The same response, already settled; only its headers are read.\n const answer = settingsAnswerOf((await request)?.headers);\n\n const data = json?.data;\n if (!data) {\n throw new SettingsError(\n `The Salla API answered the settings request for store \"${identifier}\" without settings.`,\n { reason: 'empty' }\n );\n }\n\n // Convert languages from object to array\n const languages = languagesToArray(data.languages);\n\n return {\n store: data.store,\n theme: data.theme,\n languages,\n currencies: data.currencies,\n external_services: data.external_services,\n headers: data.headers,\n login: data.login,\n affiliate: data.affiliate,\n policy_url: data.policy_url,\n user: data.user,\n swoole: data.swoole,\n jitsu: withNativeAppHeaders(data.jitsu),\n maintenance: data.maintenance,\n maintenance_details: data.maintenance_details,\n ...(scope && { requestedScopeId: scope.id }),\n ...(answer && { answer }),\n };\n}\n\n/** The message the API put in an error body, `{ error: { message } }`, when it sent one. */\nfunction apiErrorMessage(data: unknown): string | undefined {\n const message = (data as { error?: { message?: unknown } } | undefined)?.error?.message;\n return typeof message === 'string' && message.length > 0 && message.length <= 200\n ? message\n : undefined;\n}\n\n/**\n * What core's `CurrentStoreMiddleware` answers, with a 422, when no store has the\n * username or domain it was given (or the store's status is `deleted`). The lookup is\n * `loadUseUsernameOrDomain`, the same one Twig's `checkUsername` turns into its 410.\n * The literal is not translated: it reads the same whatever language was asked for.\n */\nconst STORE_NOT_FOUND_MESSAGE = 'المتجر غير موجود';\n\n/**\n * Whether the API answered that no store has this identifier. A numeric identifier\n * is looked up with `findOrFail`, which Store's exception handler answers with a 410;\n * a username or domain gets {@link STORE_NOT_FOUND_MESSAGE}. A 410 for a username is\n * not read as one: nothing on that path answers it, and a store that does exist must\n * never be told it does not.\n */\nfunction isStoreNotFound(identifier: string, status: number, said: string | undefined): boolean {\n if (status === 410) return parseStoreId(identifier) !== null;\n return status === 422 && said === STORE_NOT_FOUND_MESSAGE;\n}\n\n/**\n * Names what went wrong, because the page, the server log and Sentry all carry\n * this message. Every failure used to read \"Make sure VITE_STORE_DOMAIN is set\",\n * a local-development variable no deployed theme has, so a slow API looked like\n * a misconfigured theme.\n */\nfunction describeSettingsFailure(identifier: string, error: unknown): SettingsError {\n if (error instanceof SettingsError) return error;\n const request = `the settings request for store \"${identifier}\"`;\n if (isTimeoutError(error)) {\n return new SettingsError(\n `The Salla API did not answer ${request} within ${SETTINGS_TIMEOUT_MS} ms.`,\n { reason: 'timeout' }\n );\n }\n if (isHTTPError(error)) {\n const { status } = error.response;\n const said = apiErrorMessage(error.data);\n return new SettingsError(\n `The Salla API answered ${request} with HTTP ${status}${said ? `: ${said}` : ''}.`,\n { reason: isStoreNotFound(identifier, status, said) ? 'not-found' : 'http', status }\n );\n }\n if (isNetworkError(error)) {\n return new SettingsError(`The Salla API could not be reached for ${request}.`, {\n reason: 'network',\n });\n }\n const detail = error instanceof Error ? `: ${error.message}` : '';\n return new SettingsError(`The settings request for store \"${identifier}\" failed${detail}.`);\n}\n\n/**\n * The settings, or a {@link SettingsError} that says why there are none. The\n * query throws it so the root route can say why the store did not load;\n * `store.settings` keeps answering `null` for its own callers.\n */\nasync function fetchSettings(storeIdentifier?: string): Promise<StoreContext> {\n const identifier = storeIdentifier ?? resolveStoreIdentifier();\n\n if (!identifier) {\n const error = new SettingsError(\n 'No store is named for this request: add `?storeId=` on the preview host, or set VITE_STORE_DOMAIN in local development.',\n { reason: 'no-store' }\n );\n console.warn('[store.settings]', error.message);\n throw error;\n }\n\n try {\n return await requestSettings(identifier);\n } catch (cause) {\n const error = describeSettingsFailure(identifier, cause);\n console.error('[store.settings]', error.message, ...(cause === error ? [] : [cause]));\n throw error;\n }\n}\n\nexport const store = {\n settings: async (storeIdentifier?: string): Promise<StoreContext | null> => {\n try {\n return await fetchSettings(storeIdentifier);\n } catch {\n // Already logged, with the reason.\n return null;\n }\n },\n\n queries: {\n settings: (storeIdentifier?: string) =>\n queryOptions<StoreContext | null>({\n queryKey: [\n 'store',\n 'settings',\n storeIdentifier,\n getTwilightContext().locale,\n getActiveScope(),\n // Two versions of one store's settings are two different answers, and\n // this is the query whose answer decides what every other call is\n // pinned to. `requestedThemeVersionId` rather than the resolved one:\n // the resolved value falls back to what these settings report, so it\n // is not knowable until after this query has run — the key would be\n // one thing on the server and another on the client, and the hydrated\n // page would refetch the settings it was just handed.\n requestedThemeVersionId(),\n ],\n // Throws rather than resolving `null`, so the failure keeps its reason.\n queryFn: () => fetchSettings(storeIdentifier),\n // A null never retried, and the root route waits on this: the router's\n // default `retry: 1` would sit through the timeout twice.\n retry: 0,\n }),\n },\n};\n"]}