@salla.sa/twilight-theme-engine 1.0.139 → 1.0.141

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 (237) hide show
  1. package/dist/{AddToCartForm-QGJ2XVCZ.js → AddToCartForm-WNDQP34Y.js} +3 -3
  2. package/dist/{AddToCartForm-QGJ2XVCZ.js.map → AddToCartForm-WNDQP34Y.js.map} +1 -1
  3. package/dist/{BlogAuthorPage-5QGP4RDK.js → BlogAuthorPage-U4CFZZWU.js} +17 -17
  4. package/dist/{BlogAuthorPage-5QGP4RDK.js.map → BlogAuthorPage-U4CFZZWU.js.map} +1 -1
  5. package/dist/{BlogCategoryPage-FH7ASETM.js → BlogCategoryPage-JXCHHGMM.js} +17 -17
  6. package/dist/{BlogCategoryPage-FH7ASETM.js.map → BlogCategoryPage-JXCHHGMM.js.map} +1 -1
  7. package/dist/{BlogPage-HNNR2Q4U.js → BlogPage-BLSTB5BQ.js} +15 -15
  8. package/dist/{BlogPage-HNNR2Q4U.js.map → BlogPage-BLSTB5BQ.js.map} +1 -1
  9. package/dist/{BlogSinglePage-OYXJCOJ2.js → BlogSinglePage-TUNH4RZZ.js} +15 -15
  10. package/dist/{BlogSinglePage-OYXJCOJ2.js.map → BlogSinglePage-TUNH4RZZ.js.map} +1 -1
  11. package/dist/{BlogTagPage-XEHXO4PE.js → BlogTagPage-24P5YHNB.js} +17 -17
  12. package/dist/{BlogTagPage-XEHXO4PE.js.map → BlogTagPage-24P5YHNB.js.map} +1 -1
  13. package/dist/{BrandsPage-QSTJTEAA.js → BrandsPage-2TES2Y7B.js} +16 -16
  14. package/dist/{BrandsPage-QSTJTEAA.js.map → BrandsPage-2TES2Y7B.js.map} +1 -1
  15. package/dist/{Breadcrumb-7QGTM5S5.js → Breadcrumb-MUN36Q5L.js} +15 -15
  16. package/dist/{Breadcrumb-7QGTM5S5.js.map → Breadcrumb-MUN36Q5L.js.map} +1 -1
  17. package/dist/{CartItem-7FNRMTQS.js → CartItem-FM6RUM2U.js} +15 -15
  18. package/dist/{CartItem-7FNRMTQS.js.map → CartItem-FM6RUM2U.js.map} +1 -1
  19. package/dist/{CartSummary-A32524GZ.js → CartSummary-P6PEKCS7.js} +15 -15
  20. package/dist/{CartSummary-A32524GZ.js.map → CartSummary-P6PEKCS7.js.map} +1 -1
  21. package/dist/{Copyright-PVSTODJF.js → Copyright-EHQHBFRP.js} +3 -3
  22. package/dist/{Copyright-PVSTODJF.js.map → Copyright-EHQHBFRP.js.map} +1 -1
  23. package/dist/{CustomerLayout-NOHKTFXG.js → CustomerLayout-QRBLOWA4.js} +15 -15
  24. package/dist/{CustomerLayout-NOHKTFXG.js.map → CustomerLayout-QRBLOWA4.js.map} +1 -1
  25. package/dist/{Footer-RDRSICZP.js → Footer-GH6UEQR2.js} +4 -4
  26. package/dist/{Footer-RDRSICZP.js.map → Footer-GH6UEQR2.js.map} +1 -1
  27. package/dist/{Header-YCS4HJCH.js → Header-4KUXZJMA.js} +8 -8
  28. package/dist/{Header-YCS4HJCH.js.map → Header-4KUXZJMA.js.map} +1 -1
  29. package/dist/{LatestProducts-JEOWAHON.js → LatestProducts-AKCLYRRU.js} +17 -17
  30. package/dist/{LatestProducts-JEOWAHON.js.map → LatestProducts-AKCLYRRU.js.map} +1 -1
  31. package/dist/{LiveEditorBar-4AWOAJYX.js → LiveEditorBar-3DUDCCSM.js} +3 -3
  32. package/dist/{LiveEditorBar-4AWOAJYX.js.map → LiveEditorBar-3DUDCCSM.js.map} +1 -1
  33. package/dist/{LoyaltyPage-TE5E3OJC.js → LoyaltyPage-MUMMZ37S.js} +15 -15
  34. package/dist/{LoyaltyPage-TE5E3OJC.js.map → LoyaltyPage-MUMMZ37S.js.map} +1 -1
  35. package/dist/{LoyaltyPointsPage-GI3EQOLY.js → LoyaltyPointsPage-N6XMXNZY.js} +6 -6
  36. package/dist/{LoyaltyPointsPage-GI3EQOLY.js.map → LoyaltyPointsPage-N6XMXNZY.js.map} +1 -1
  37. package/dist/{MainMenu-46II2DJE.js → MainMenu-Q5R3HK7F.js} +6 -6
  38. package/dist/MainMenu-Q5R3HK7F.js.map +1 -0
  39. package/dist/{MasterLayout-ZYWD2XZO.js → MasterLayout-3VXL2VCQ.js} +15 -15
  40. package/dist/{MasterLayout-ZYWD2XZO.js.map → MasterLayout-3VXL2VCQ.js.map} +1 -1
  41. package/dist/{MobileMenu-O7354R4E.js → MobileMenu-UY3GHY7B.js} +16 -16
  42. package/dist/{MobileMenu-O7354R4E.js.map → MobileMenu-UY3GHY7B.js.map} +1 -1
  43. package/dist/{NotificationsPage-OZKKZ2CC.js → NotificationsPage-N3MF2RS7.js} +15 -15
  44. package/dist/{NotificationsPage-OZKKZ2CC.js.map → NotificationsPage-N3MF2RS7.js.map} +1 -1
  45. package/dist/{OrderSinglePage-IVOIE2YE.js → OrderSinglePage-3XHUQGEW.js} +16 -16
  46. package/dist/{OrderSinglePage-IVOIE2YE.js.map → OrderSinglePage-3XHUQGEW.js.map} +1 -1
  47. package/dist/{OrdersPage-PMLHIHDV.js → OrdersPage-SWBRRHAH.js} +15 -15
  48. package/dist/{OrdersPage-PMLHIHDV.js.map → OrdersPage-SWBRRHAH.js.map} +1 -1
  49. package/dist/{PageSingle-C3NBFFHR.js → PageSingle-YZCWWOAW.js} +3 -3
  50. package/dist/{PageSingle-C3NBFFHR.js.map → PageSingle-YZCWWOAW.js.map} +1 -1
  51. package/dist/{ProductDetails-R7SFKXNC.js → ProductDetails-V27IGZYV.js} +4 -4
  52. package/dist/{ProductDetails-R7SFKXNC.js.map → ProductDetails-V27IGZYV.js.map} +1 -1
  53. package/dist/{ProfilePage-5FU4N6O7.js → ProfilePage-57TZ4ZKP.js} +15 -15
  54. package/dist/{ProfilePage-5FU4N6O7.js.map → ProfilePage-57TZ4ZKP.js.map} +1 -1
  55. package/dist/{ReviewsPage-M7QHDNCJ.js → ReviewsPage-JC2ZKARA.js} +3 -3
  56. package/dist/{ReviewsPage-M7QHDNCJ.js.map → ReviewsPage-JC2ZKARA.js.map} +1 -1
  57. package/dist/{SeoCartWidget-T6PF34G4.js → SeoCartWidget-D3GIOO56.js} +15 -15
  58. package/dist/{SeoCartWidget-T6PF34G4.js.map → SeoCartWidget-D3GIOO56.js.map} +1 -1
  59. package/dist/{SettingsPage-HBREYY5Q.js → SettingsPage-C2PSTHXQ.js} +15 -15
  60. package/dist/{SettingsPage-HBREYY5Q.js.map → SettingsPage-C2PSTHXQ.js.map} +1 -1
  61. package/dist/{StoreClosedNotification-QTKW4PQ2.js → StoreClosedNotification-NXDQW24E.js} +16 -16
  62. package/dist/{StoreClosedNotification-QTKW4PQ2.js.map → StoreClosedNotification-NXDQW24E.js.map} +1 -1
  63. package/dist/{TestimonialsPage-ESB4CQRS.js → TestimonialsPage-MENUPYFS.js} +3 -3
  64. package/dist/{TestimonialsPage-ESB4CQRS.js.map → TestimonialsPage-MENUPYFS.js.map} +1 -1
  65. package/dist/{ThankYouPage-BLYIJQNV.js → ThankYouPage-WNX3JNVJ.js} +15 -15
  66. package/dist/{ThankYouPage-BLYIJQNV.js.map → ThankYouPage-WNX3JNVJ.js.map} +1 -1
  67. package/dist/{WalletPage-7YOOVSXO.js → WalletPage-FKIRJ327.js} +16 -16
  68. package/dist/{WalletPage-7YOOVSXO.js.map → WalletPage-FKIRJ327.js.map} +1 -1
  69. package/dist/{WishlistPage-MXVTTJD6.js → WishlistPage-5LOWSXHY.js} +17 -17
  70. package/dist/{WishlistPage-MXVTTJD6.js.map → WishlistPage-5LOWSXHY.js.map} +1 -1
  71. package/dist/api/advertisement.js +2 -2
  72. package/dist/api/apps.js +2 -2
  73. package/dist/api/blog.js +3 -3
  74. package/dist/api/brands.js +3 -3
  75. package/dist/api/cart.js +3 -3
  76. package/dist/api/category.js +3 -3
  77. package/dist/api/client.js +1 -1
  78. package/dist/api/home.js +2 -2
  79. package/dist/api/loyalty.js +3 -3
  80. package/dist/api/menu.js +2 -2
  81. package/dist/api/notification.js +2 -2
  82. package/dist/api/order.js +3 -3
  83. package/dist/api/page.js +3 -3
  84. package/dist/api/product.js +3 -3
  85. package/dist/api/profile.js +1 -1
  86. package/dist/api/store.js +2 -2
  87. package/dist/api/translations.js +2 -2
  88. package/dist/api/user.js +2 -2
  89. package/dist/api/wallet.js +2 -2
  90. package/dist/api/wishlist.js +4 -4
  91. package/dist/{chunk-NVPOH3CU.js → chunk-45UU2OKF.js} +4 -4
  92. package/dist/{chunk-NVPOH3CU.js.map → chunk-45UU2OKF.js.map} +1 -1
  93. package/dist/{chunk-XNBCPEH6.js → chunk-6LQHXT4S.js} +7 -7
  94. package/dist/{chunk-XNBCPEH6.js.map → chunk-6LQHXT4S.js.map} +1 -1
  95. package/dist/{chunk-PLPIAVLJ.js → chunk-7AWWYJXA.js} +3 -3
  96. package/dist/{chunk-PLPIAVLJ.js.map → chunk-7AWWYJXA.js.map} +1 -1
  97. package/dist/{chunk-VZ342V4W.js → chunk-7CU5YP4T.js} +4 -4
  98. package/dist/{chunk-VZ342V4W.js.map → chunk-7CU5YP4T.js.map} +1 -1
  99. package/dist/{chunk-JRWBBN3M.js → chunk-AD7KLDOA.js} +4 -4
  100. package/dist/{chunk-JRWBBN3M.js.map → chunk-AD7KLDOA.js.map} +1 -1
  101. package/dist/{chunk-YF3U4WYG.js → chunk-ASLBVSLC.js} +4 -4
  102. package/dist/{chunk-YF3U4WYG.js.map → chunk-ASLBVSLC.js.map} +1 -1
  103. package/dist/{chunk-RSHQ43OI.js → chunk-C7UFIC63.js} +3 -3
  104. package/dist/{chunk-RSHQ43OI.js.map → chunk-C7UFIC63.js.map} +1 -1
  105. package/dist/{chunk-TZCTCRGB.js → chunk-CSONBCDW.js} +3 -3
  106. package/dist/{chunk-TZCTCRGB.js.map → chunk-CSONBCDW.js.map} +1 -1
  107. package/dist/{chunk-ECMDQQO2.js → chunk-CSPVLZDC.js} +3 -3
  108. package/dist/{chunk-ECMDQQO2.js.map → chunk-CSPVLZDC.js.map} +1 -1
  109. package/dist/{chunk-BBMRL2QU.js → chunk-CTPYM52J.js} +3 -3
  110. package/dist/{chunk-BBMRL2QU.js.map → chunk-CTPYM52J.js.map} +1 -1
  111. package/dist/{chunk-N63CWDNI.js → chunk-D7UQKKFR.js} +4 -4
  112. package/dist/{chunk-N63CWDNI.js.map → chunk-D7UQKKFR.js.map} +1 -1
  113. package/dist/{chunk-Y6X3TVOI.js → chunk-DD622QIQ.js} +3 -3
  114. package/dist/{chunk-Y6X3TVOI.js.map → chunk-DD622QIQ.js.map} +1 -1
  115. package/dist/{chunk-P4UZRDTR.js → chunk-ENQEMMQ5.js} +16 -16
  116. package/dist/{chunk-P4UZRDTR.js.map → chunk-ENQEMMQ5.js.map} +1 -1
  117. package/dist/{chunk-62FNNS7U.js → chunk-EVBRWESV.js} +7 -7
  118. package/dist/{chunk-62FNNS7U.js.map → chunk-EVBRWESV.js.map} +1 -1
  119. package/dist/{chunk-ELQFU3RH.js → chunk-HK3545K3.js} +4 -4
  120. package/dist/{chunk-ELQFU3RH.js.map → chunk-HK3545K3.js.map} +1 -1
  121. package/dist/{chunk-J4GUGMPX.js → chunk-HMMOUH2W.js} +3 -3
  122. package/dist/{chunk-J4GUGMPX.js.map → chunk-HMMOUH2W.js.map} +1 -1
  123. package/dist/{chunk-7CGTHJ6S.js → chunk-HQLFHGPV.js} +5 -5
  124. package/dist/{chunk-7CGTHJ6S.js.map → chunk-HQLFHGPV.js.map} +1 -1
  125. package/dist/{chunk-C5UK27T6.js → chunk-HWVRIO2E.js} +4 -4
  126. package/dist/{chunk-C5UK27T6.js.map → chunk-HWVRIO2E.js.map} +1 -1
  127. package/dist/{chunk-E7TU4RW4.js → chunk-I2NUWNDF.js} +3 -3
  128. package/dist/{chunk-E7TU4RW4.js.map → chunk-I2NUWNDF.js.map} +1 -1
  129. package/dist/{chunk-2IGIQA2S.js → chunk-IS6CEQF7.js} +3 -3
  130. package/dist/{chunk-2IGIQA2S.js.map → chunk-IS6CEQF7.js.map} +1 -1
  131. package/dist/{chunk-FG2B552D.js → chunk-JYGEHJU4.js} +10 -5
  132. package/dist/chunk-JYGEHJU4.js.map +1 -0
  133. package/dist/{chunk-ISDSQORB.js → chunk-MFHGYANL.js} +4 -4
  134. package/dist/{chunk-ISDSQORB.js.map → chunk-MFHGYANL.js.map} +1 -1
  135. package/dist/{chunk-ZU7TSTT7.js → chunk-NTOWUMLA.js} +3 -3
  136. package/dist/{chunk-ZU7TSTT7.js.map → chunk-NTOWUMLA.js.map} +1 -1
  137. package/dist/{chunk-JI6ZNE7R.js → chunk-OFDFDY2F.js} +3 -3
  138. package/dist/{chunk-JI6ZNE7R.js.map → chunk-OFDFDY2F.js.map} +1 -1
  139. package/dist/{chunk-ECFDJBTE.js → chunk-ONHJKZ6J.js} +7 -7
  140. package/dist/{chunk-ECFDJBTE.js.map → chunk-ONHJKZ6J.js.map} +1 -1
  141. package/dist/{chunk-5J3HVOTR.js → chunk-OZP22OV3.js} +3 -3
  142. package/dist/{chunk-5J3HVOTR.js.map → chunk-OZP22OV3.js.map} +1 -1
  143. package/dist/{chunk-HGNR4XBD.js → chunk-P4WJ2JMF.js} +9 -15
  144. package/dist/chunk-P4WJ2JMF.js.map +1 -0
  145. package/dist/{chunk-5KKQUH72.js → chunk-QGDRC7U7.js} +10 -3
  146. package/dist/chunk-QGDRC7U7.js.map +1 -0
  147. package/dist/{chunk-LQ2PXFR4.js → chunk-QLY2NOJT.js} +3 -3
  148. package/dist/{chunk-LQ2PXFR4.js.map → chunk-QLY2NOJT.js.map} +1 -1
  149. package/dist/{chunk-FN4I3UDJ.js → chunk-RISG443X.js} +3 -3
  150. package/dist/{chunk-FN4I3UDJ.js.map → chunk-RISG443X.js.map} +1 -1
  151. package/dist/{chunk-J5OJ7JM2.js → chunk-RORNWRSU.js} +3 -3
  152. package/dist/{chunk-J5OJ7JM2.js.map → chunk-RORNWRSU.js.map} +1 -1
  153. package/dist/{chunk-EPMM5ZWB.js → chunk-RQY66Y3Z.js} +5 -5
  154. package/dist/{chunk-EPMM5ZWB.js.map → chunk-RQY66Y3Z.js.map} +1 -1
  155. package/dist/{chunk-ONPV2TED.js → chunk-SMKHH7X6.js} +5 -5
  156. package/dist/{chunk-ONPV2TED.js.map → chunk-SMKHH7X6.js.map} +1 -1
  157. package/dist/{chunk-WWGGQY6N.js → chunk-TGPAAFOW.js} +4 -4
  158. package/dist/{chunk-WWGGQY6N.js.map → chunk-TGPAAFOW.js.map} +1 -1
  159. package/dist/{chunk-HUJARQI7.js → chunk-TLT4HZMM.js} +3 -3
  160. package/dist/{chunk-HUJARQI7.js.map → chunk-TLT4HZMM.js.map} +1 -1
  161. package/dist/{chunk-GCZ46XF6.js → chunk-W4RC4HES.js} +12 -12
  162. package/dist/chunk-W4RC4HES.js.map +1 -0
  163. package/dist/{chunk-ICQIH7F6.js → chunk-WSNBAH3Z.js} +3 -3
  164. package/dist/{chunk-ICQIH7F6.js.map → chunk-WSNBAH3Z.js.map} +1 -1
  165. package/dist/{chunk-AORRIQPD.js → chunk-Y2ZCCAXG.js} +4 -4
  166. package/dist/{chunk-AORRIQPD.js.map → chunk-Y2ZCCAXG.js.map} +1 -1
  167. package/dist/{chunk-XETMTAZC.js → chunk-YHTFDUAJ.js} +4 -4
  168. package/dist/{chunk-XETMTAZC.js.map → chunk-YHTFDUAJ.js.map} +1 -1
  169. package/dist/{chunk-H2QBHOF2.js → chunk-YL6X3ZMG.js} +9 -3
  170. package/dist/chunk-YL6X3ZMG.js.map +1 -0
  171. package/dist/{chunk-XRX6VFSO.js → chunk-ZACN2Z2L.js} +4 -4
  172. package/dist/{chunk-XRX6VFSO.js.map → chunk-ZACN2Z2L.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 -13
  176. package/dist/components/home/HomePageRenderer.d.ts.map +1 -1
  177. package/dist/components/home/index.js +18 -18
  178. package/dist/components/layout/index.js +4 -4
  179. package/dist/components/live-editor/frame.d.ts +14 -0
  180. package/dist/components/live-editor/frame.d.ts.map +1 -1
  181. package/dist/components/navigation/MainMenu.d.ts.map +1 -1
  182. package/dist/components/product/index.js +15 -15
  183. package/dist/components/store/index.js +14 -14
  184. package/dist/dev/dev-settings-store.d.ts +3 -2
  185. package/dist/dev/dev-settings-store.d.ts.map +1 -1
  186. package/dist/dev/editor/index.js +34 -9
  187. package/dist/dev/editor/index.js.map +1 -1
  188. package/dist/dev/editor/live-actions.d.ts +2 -1
  189. package/dist/dev/editor/live-actions.d.ts.map +1 -1
  190. package/dist/dev/index.js +1 -1
  191. package/dist/{document-class-LR4X2CH5.js → document-class-4OCKM577.js} +11 -11
  192. package/dist/{document-class-LR4X2CH5.js.map → document-class-4OCKM577.js.map} +1 -1
  193. package/dist/hooks/index.js +13 -13
  194. package/dist/hooks/useGtm.js +13 -13
  195. package/dist/hooks/useMoney.js +13 -13
  196. package/dist/hooks/useStore.js +13 -13
  197. package/dist/hooks/useUser.js +3 -3
  198. package/dist/index.js +13 -13
  199. package/dist/{navigation-OQ2ZT3ID.js → navigation-BFBWKBGA.js} +5 -5
  200. package/dist/{navigation-OQ2ZT3ID.js.map → navigation-BFBWKBGA.js.map} +1 -1
  201. package/dist/{navigation-5PCMFALH.js → navigation-LZNDPCZR.js} +4 -4
  202. package/dist/{navigation-5PCMFALH.js.map → navigation-LZNDPCZR.js.map} +1 -1
  203. package/dist/{not-found-YHQVBI7H.js → not-found-4MCKSS62.js} +16 -16
  204. package/dist/{not-found-YHQVBI7H.js.map → not-found-4MCKSS62.js.map} +1 -1
  205. package/dist/providers/index.js +13 -13
  206. package/dist/routes/account/orders.js +4 -4
  207. package/dist/routes/account.js +13 -13
  208. package/dist/routes/blog.js +8 -8
  209. package/dist/routes/brands.js +4 -4
  210. package/dist/routes/cart.js +22 -22
  211. package/dist/routes/home.js +19 -19
  212. package/dist/routes/index.js +3 -3
  213. package/dist/routes/loyalty.js +5 -5
  214. package/dist/routes/page.js +4 -4
  215. package/dist/routes/product-listing.js +20 -20
  216. package/dist/routes/product.js +18 -18
  217. package/dist/routes/root/beforeLoad.d.ts.map +1 -1
  218. package/dist/routes/seo-redirects.js +3 -3
  219. package/dist/routes/testimonials.js +2 -2
  220. package/dist/routes/thank-you.js +4 -4
  221. package/dist/skeleton.js +19 -19
  222. package/dist/{store-lookup-NJCTSPFL.js → store-lookup-6JBMBBBF.js} +8 -8
  223. package/dist/{store-lookup-NJCTSPFL.js.map → store-lookup-6JBMBBBF.js.map} +1 -1
  224. package/dist/tanstack/link.d.ts.map +1 -1
  225. package/dist/tanstack.js +11 -11
  226. package/dist/utils/index.js +2 -2
  227. package/package.json +1 -1
  228. package/tailwind/components/home/HomePageRenderer.tsx.txt +3 -18
  229. package/tailwind/components/live-editor/frame.ts.txt +20 -0
  230. package/tailwind/components/navigation/MainMenu.tsx.txt +2 -1
  231. package/tailwind/routes/root/beforeLoad.ts.txt +4 -2
  232. package/dist/MainMenu-46II2DJE.js.map +0 -1
  233. package/dist/chunk-5KKQUH72.js.map +0 -1
  234. package/dist/chunk-FG2B552D.js.map +0 -1
  235. package/dist/chunk-GCZ46XF6.js.map +0 -1
  236. package/dist/chunk-H2QBHOF2.js.map +0 -1
  237. package/dist/chunk-HGNR4XBD.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/cart/CartSummary.tsx"],"names":[],"mappings":"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","file":"CartSummary-A32524GZ.js","sourcesContent":["import { useCallback } from 'react';\nimport { HookSlot } from '../../hooks/HookSlot';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useCoupon } from '../../hooks/useCoupon';\nimport { useMoney } from '../../hooks/useMoney';\nimport { stripUnsafeHtml } from '../../utils/sanitize';\nimport { SallaLoyalty } from '@salla.sa/twilight-components-react/loyalty';\nimport { SallaGifting } from '@salla.sa/twilight-components-react/gifting';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { SallaTieredOffer } from '@salla.sa/twilight-components-react/tiered-offer';\nimport type { Cart } from '../../types';\n\ninterface CartSummaryProps {\n cart: Cart;\n applyCouponEnabled?: boolean;\n taxAmount?: number;\n loyalty?: Cart['loyalty'];\n gift?: Cart['gift'];\n loyaltyPoints?: number;\n}\n\nexport function CartSummary({\n cart,\n applyCouponEnabled = true,\n taxAmount,\n loyalty,\n gift,\n loyaltyPoints,\n}: CartSummaryProps) {\n const { t } = useTranslation();\n const { format } = useMoney();\n\n const handleCartSubmit = useCallback(async () => {\n // Twig's cart.js: a submit with an empty required option fails and the SDK resets the cart.\n const forms = document.querySelectorAll<HTMLFormElement>('form[id^=\"item-\"]');\n if (![...forms].every((form) => form.reportValidity())) {\n window.salla?.notify.error(window.salla.lang.get('common.messages.required_fields'));\n return;\n }\n try {\n await window.salla?.cart.submit();\n } catch {\n // Error handling\n }\n }, []);\n\n return (\n <div className=\"sticky top-24 w-full lg:w-96 rtl:lg:mr-8 ltr:lg:ml-8\">\n <HookSlot name=\"cart:summary.start\" />\n {cart.free_shipping_bar && <FreeShippingBar freeShippingBar={cart.free_shipping_bar} />}\n\n {/* Twig: {% if loyalty and user.loyalty_points %} — top-level page vars rendered inside sidebar */}\n {loyalty && loyaltyPoints && (\n <div className=\"shadow-default mb-5 rounded-md p-3 xs:p-7 bg-white\">\n <SallaLoyalty\n customerPoints={loyaltyPoints}\n prizePoints={loyalty.prize.points}\n prizeTitle={loyalty.prize.title}\n />\n </div>\n )}\n\n {/* Twig: {{gift.enabled ? '' : 'hidden'}} — top-level page var rendered inside sidebar */}\n {gift?.enabled && (\n <div id=\"cart-gifting\" className=\"shadow-default bg-white xs:p-2 rounded-md mb-5 relative\">\n <SallaGifting\n id=\"salla-gifting\"\n className=\"mt-5\"\n widgetTitle={t('pages.cart.gift_widget_title', 'Send as a gift')}\n widgetSubtitle={gift.text}\n {...(gift.type ? { [gift.type + 'Products']: true } : {})}\n vertical\n />\n </div>\n )}\n\n <div className=\"shadow-default bg-white p-5 xs:p-7 rounded-md mb-5 relative transition-height duration-1000\">\n <h2 className=\"font-bold text-sm mb-5\">{t('pages.cart.summary', 'Order Summary')}</h2>\n\n <div className=\"flex justify-between text-sm mb-5\">\n <span className=\"text-gray-500\">\n {taxAmount\n ? t('pages.cart.items_total_without_tax', 'Items total (excl. tax)')\n : t('pages.cart.items_total', 'Items total')}\n </span>\n <b id=\"sub-total\">{format(cart.sub_total)}</b>\n </div>\n\n {cart.options?.length > 0 && (\n <div className=\"flex justify-between text-sm mb-5\">\n <span className=\"text-gray-500\">\n {t('pages.cart.order_options_total', 'Options total')}\n </span>\n <b id=\"cart-options-total\">{format(cart.options_total ?? undefined)}</b>\n </div>\n )}\n\n {cart.has_shipping && (\n <div id=\"shipping-cost\" className=\"flex justify-between text-sm mb-5\">\n <span className=\"text-gray-500\">{t('pages.cart.shipping_cost', 'Shipping cost')}</span>\n <b>{format(cart.real_shipping_cost)}</b>\n </div>\n )}\n\n {applyCouponEnabled && <CouponInput initialCoupon={cart.coupon ?? undefined} />}\n\n {!!cart.total_discount && (\n <div id=\"total-discount\" className=\"flex justify-between text-sm\">\n <span className=\"text-gray-500 block h-10\">{t('pages.cart.discount', 'Discount')}</span>\n <b>- {format(cart.total_discount)}</b>\n </div>\n )}\n\n {!!taxAmount && (\n <div className=\"flex justify-between text-sm mb-5\">\n <span className=\"text-gray-500\">\n {t('pages.cart.VAT_tax_amount', 'VAT Tax Amount')}\n </span>\n <b id=\"tax-amount\">{format(taxAmount)}</b>\n </div>\n )}\n\n <div className=\"flex justify-between text-lg mb-5\">\n <span className=\"text-gray-500\">{t('pages.cart.final_total', 'Total')}</span>\n <b data-cart-total>{format(cart.total)}</b>\n </div>\n\n <div className=\"cart-submit-wrap\">\n <HookSlot name=\"cart:submit.start\" />\n <SallaButton\n id=\"cart-submit\"\n loaderPosition=\"center\"\n width=\"wide\"\n onClick={handleCartSubmit}\n >\n {t('pages.cart.complete_order', 'Complete Order')}\n </SallaButton>\n <HookSlot name=\"cart:submit.end\" />\n </div>\n\n <HookSlot name=\"cart:summary.end\" />\n </div>\n\n <SallaTieredOffer />\n </div>\n );\n}\n\nfunction FreeShippingBar({\n freeShippingBar,\n}: {\n freeShippingBar: NonNullable<Cart['free_shipping_bar']>;\n}) {\n const isFree = freeShippingBar.has_free_shipping;\n const { t } = useTranslation();\n\n return (\n <div className=\"shadow-default bg-white p-5 xs:p-7 rounded-md mb-5 relative\" id=\"free-shipping\">\n <div className=\"flex rtl:space-x-reverse space-x-3 items-center\">\n <i className=\"bg-primary text-white rounded-icon sicon-shipping-fast\"></i>\n <div className=\"flex-1\">\n <h4 className=\"shipping-item font-bold text-sm mb-1.5\">\n {t('pages.cart.free_shipping', 'Free Shipping')}\n </h4>\n <p className=\"shipping-item text-sm text-gray-500\">\n {isFree ? (\n <>\n <span\n id=\"free-shipping-msg\"\n dangerouslySetInnerHTML={{\n __html: stripUnsafeHtml(\n t('pages.cart.has_free_shipping', 'You have free shipping!')\n ),\n }}\n />\n <span className=\"emoji\" id=\"free-shipping-applied\">\n 🎉\n </span>\n </>\n ) : (\n <span\n id=\"free-shipping-msg\"\n dangerouslySetInnerHTML={{\n __html: stripUnsafeHtml(\n t(\n 'pages.cart.free_shipping_alert',\n 'Get free shipping when you add :amount more'\n ).replace(':amount', String(freeShippingBar.remaining))\n ),\n }}\n />\n )}\n </p>\n </div>\n </div>\n {!isFree && (\n <div className=\"mt-8 bg-border-color rounded-full\" id=\"free-shipping-bar\">\n <div\n className=\"progress-bg transition-all duration-500 h-2.5 bg-primary relative rounded-full flex justify-end\"\n style={{ width: `${freeShippingBar.percent}%` }}\n >\n <i className=\"inline-block sicon-shipping-fast absolute -top-5 rtl:left-0 ltr:right-0\"></i>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction CouponInput({ initialCoupon }: { initialCoupon?: string }) {\n const { t } = useTranslation();\n const { value, error, apply, remove } = useCoupon();\n\n // Use initial coupon from cart if available\n const appliedCoupon = value ?? initialCoupon;\n\n const handleApplyCoupon = useCallback(\n async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n const code = formData.get('coupon') as string;\n if (code?.trim()) {\n await apply(code.trim());\n }\n },\n [apply]\n );\n\n const handleRemoveCoupon = useCallback(async () => {\n await remove();\n }, [remove]);\n\n return (\n <form className=\"border-t border-gray-200 border-b py-5 mb-5\" onSubmit={handleApplyCoupon}>\n <label htmlFor=\"coupon-input\" className=\"block text-sm\">\n {t('pages.cart.have_coupon', 'Have a coupon?')}\n </label>\n <div className=\"mt-2.5 relative\">\n <input\n placeholder={t('pages.cart.coupon_placeholder', 'Enter coupon code')}\n disabled={!!appliedCoupon}\n className=\"rtl:pl-24 ltr:pr-24 form-input\"\n defaultValue={appliedCoupon}\n id=\"coupon-input\"\n name=\"coupon\"\n aria-label={t('pages.cart.apply_coupon', 'Apply coupon')}\n type=\"text\"\n />\n\n <SallaButton\n type=\"submit\"\n className={`btn--coupon ${appliedCoupon ? 'has-coupon btn--danger' : 'has-not-coupon btn--default'}`}\n loaderPosition=\"center\"\n onClick={appliedCoupon ? handleRemoveCoupon : undefined}\n >\n <span className=\"coupon-text\">\n {appliedCoupon ? '' : t('pages.cart.apply_coupon_btn', 'Apply')}\n </span>\n {appliedCoupon && <i className=\"sicon-cancel icon text-xl w-8\"></i>}\n </SallaButton>\n </div>\n {error && (\n <span className=\"text-xs text-red-700\" id=\"coupon-error\">\n {error}\n </span>\n )}\n </form>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/cart/CartSummary.tsx"],"names":[],"mappings":"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","file":"CartSummary-P6PEKCS7.js","sourcesContent":["import { useCallback } from 'react';\nimport { HookSlot } from '../../hooks/HookSlot';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useCoupon } from '../../hooks/useCoupon';\nimport { useMoney } from '../../hooks/useMoney';\nimport { stripUnsafeHtml } from '../../utils/sanitize';\nimport { SallaLoyalty } from '@salla.sa/twilight-components-react/loyalty';\nimport { SallaGifting } from '@salla.sa/twilight-components-react/gifting';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { SallaTieredOffer } from '@salla.sa/twilight-components-react/tiered-offer';\nimport type { Cart } from '../../types';\n\ninterface CartSummaryProps {\n cart: Cart;\n applyCouponEnabled?: boolean;\n taxAmount?: number;\n loyalty?: Cart['loyalty'];\n gift?: Cart['gift'];\n loyaltyPoints?: number;\n}\n\nexport function CartSummary({\n cart,\n applyCouponEnabled = true,\n taxAmount,\n loyalty,\n gift,\n loyaltyPoints,\n}: CartSummaryProps) {\n const { t } = useTranslation();\n const { format } = useMoney();\n\n const handleCartSubmit = useCallback(async () => {\n // Twig's cart.js: a submit with an empty required option fails and the SDK resets the cart.\n const forms = document.querySelectorAll<HTMLFormElement>('form[id^=\"item-\"]');\n if (![...forms].every((form) => form.reportValidity())) {\n window.salla?.notify.error(window.salla.lang.get('common.messages.required_fields'));\n return;\n }\n try {\n await window.salla?.cart.submit();\n } catch {\n // Error handling\n }\n }, []);\n\n return (\n <div className=\"sticky top-24 w-full lg:w-96 rtl:lg:mr-8 ltr:lg:ml-8\">\n <HookSlot name=\"cart:summary.start\" />\n {cart.free_shipping_bar && <FreeShippingBar freeShippingBar={cart.free_shipping_bar} />}\n\n {/* Twig: {% if loyalty and user.loyalty_points %} — top-level page vars rendered inside sidebar */}\n {loyalty && loyaltyPoints && (\n <div className=\"shadow-default mb-5 rounded-md p-3 xs:p-7 bg-white\">\n <SallaLoyalty\n customerPoints={loyaltyPoints}\n prizePoints={loyalty.prize.points}\n prizeTitle={loyalty.prize.title}\n />\n </div>\n )}\n\n {/* Twig: {{gift.enabled ? '' : 'hidden'}} — top-level page var rendered inside sidebar */}\n {gift?.enabled && (\n <div id=\"cart-gifting\" className=\"shadow-default bg-white xs:p-2 rounded-md mb-5 relative\">\n <SallaGifting\n id=\"salla-gifting\"\n className=\"mt-5\"\n widgetTitle={t('pages.cart.gift_widget_title', 'Send as a gift')}\n widgetSubtitle={gift.text}\n {...(gift.type ? { [gift.type + 'Products']: true } : {})}\n vertical\n />\n </div>\n )}\n\n <div className=\"shadow-default bg-white p-5 xs:p-7 rounded-md mb-5 relative transition-height duration-1000\">\n <h2 className=\"font-bold text-sm mb-5\">{t('pages.cart.summary', 'Order Summary')}</h2>\n\n <div className=\"flex justify-between text-sm mb-5\">\n <span className=\"text-gray-500\">\n {taxAmount\n ? t('pages.cart.items_total_without_tax', 'Items total (excl. tax)')\n : t('pages.cart.items_total', 'Items total')}\n </span>\n <b id=\"sub-total\">{format(cart.sub_total)}</b>\n </div>\n\n {cart.options?.length > 0 && (\n <div className=\"flex justify-between text-sm mb-5\">\n <span className=\"text-gray-500\">\n {t('pages.cart.order_options_total', 'Options total')}\n </span>\n <b id=\"cart-options-total\">{format(cart.options_total ?? undefined)}</b>\n </div>\n )}\n\n {cart.has_shipping && (\n <div id=\"shipping-cost\" className=\"flex justify-between text-sm mb-5\">\n <span className=\"text-gray-500\">{t('pages.cart.shipping_cost', 'Shipping cost')}</span>\n <b>{format(cart.real_shipping_cost)}</b>\n </div>\n )}\n\n {applyCouponEnabled && <CouponInput initialCoupon={cart.coupon ?? undefined} />}\n\n {!!cart.total_discount && (\n <div id=\"total-discount\" className=\"flex justify-between text-sm\">\n <span className=\"text-gray-500 block h-10\">{t('pages.cart.discount', 'Discount')}</span>\n <b>- {format(cart.total_discount)}</b>\n </div>\n )}\n\n {!!taxAmount && (\n <div className=\"flex justify-between text-sm mb-5\">\n <span className=\"text-gray-500\">\n {t('pages.cart.VAT_tax_amount', 'VAT Tax Amount')}\n </span>\n <b id=\"tax-amount\">{format(taxAmount)}</b>\n </div>\n )}\n\n <div className=\"flex justify-between text-lg mb-5\">\n <span className=\"text-gray-500\">{t('pages.cart.final_total', 'Total')}</span>\n <b data-cart-total>{format(cart.total)}</b>\n </div>\n\n <div className=\"cart-submit-wrap\">\n <HookSlot name=\"cart:submit.start\" />\n <SallaButton\n id=\"cart-submit\"\n loaderPosition=\"center\"\n width=\"wide\"\n onClick={handleCartSubmit}\n >\n {t('pages.cart.complete_order', 'Complete Order')}\n </SallaButton>\n <HookSlot name=\"cart:submit.end\" />\n </div>\n\n <HookSlot name=\"cart:summary.end\" />\n </div>\n\n <SallaTieredOffer />\n </div>\n );\n}\n\nfunction FreeShippingBar({\n freeShippingBar,\n}: {\n freeShippingBar: NonNullable<Cart['free_shipping_bar']>;\n}) {\n const isFree = freeShippingBar.has_free_shipping;\n const { t } = useTranslation();\n\n return (\n <div className=\"shadow-default bg-white p-5 xs:p-7 rounded-md mb-5 relative\" id=\"free-shipping\">\n <div className=\"flex rtl:space-x-reverse space-x-3 items-center\">\n <i className=\"bg-primary text-white rounded-icon sicon-shipping-fast\"></i>\n <div className=\"flex-1\">\n <h4 className=\"shipping-item font-bold text-sm mb-1.5\">\n {t('pages.cart.free_shipping', 'Free Shipping')}\n </h4>\n <p className=\"shipping-item text-sm text-gray-500\">\n {isFree ? (\n <>\n <span\n id=\"free-shipping-msg\"\n dangerouslySetInnerHTML={{\n __html: stripUnsafeHtml(\n t('pages.cart.has_free_shipping', 'You have free shipping!')\n ),\n }}\n />\n <span className=\"emoji\" id=\"free-shipping-applied\">\n 🎉\n </span>\n </>\n ) : (\n <span\n id=\"free-shipping-msg\"\n dangerouslySetInnerHTML={{\n __html: stripUnsafeHtml(\n t(\n 'pages.cart.free_shipping_alert',\n 'Get free shipping when you add :amount more'\n ).replace(':amount', String(freeShippingBar.remaining))\n ),\n }}\n />\n )}\n </p>\n </div>\n </div>\n {!isFree && (\n <div className=\"mt-8 bg-border-color rounded-full\" id=\"free-shipping-bar\">\n <div\n className=\"progress-bg transition-all duration-500 h-2.5 bg-primary relative rounded-full flex justify-end\"\n style={{ width: `${freeShippingBar.percent}%` }}\n >\n <i className=\"inline-block sicon-shipping-fast absolute -top-5 rtl:left-0 ltr:right-0\"></i>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction CouponInput({ initialCoupon }: { initialCoupon?: string }) {\n const { t } = useTranslation();\n const { value, error, apply, remove } = useCoupon();\n\n // Use initial coupon from cart if available\n const appliedCoupon = value ?? initialCoupon;\n\n const handleApplyCoupon = useCallback(\n async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n const code = formData.get('coupon') as string;\n if (code?.trim()) {\n await apply(code.trim());\n }\n },\n [apply]\n );\n\n const handleRemoveCoupon = useCallback(async () => {\n await remove();\n }, [remove]);\n\n return (\n <form className=\"border-t border-gray-200 border-b py-5 mb-5\" onSubmit={handleApplyCoupon}>\n <label htmlFor=\"coupon-input\" className=\"block text-sm\">\n {t('pages.cart.have_coupon', 'Have a coupon?')}\n </label>\n <div className=\"mt-2.5 relative\">\n <input\n placeholder={t('pages.cart.coupon_placeholder', 'Enter coupon code')}\n disabled={!!appliedCoupon}\n className=\"rtl:pl-24 ltr:pr-24 form-input\"\n defaultValue={appliedCoupon}\n id=\"coupon-input\"\n name=\"coupon\"\n aria-label={t('pages.cart.apply_coupon', 'Apply coupon')}\n type=\"text\"\n />\n\n <SallaButton\n type=\"submit\"\n className={`btn--coupon ${appliedCoupon ? 'has-coupon btn--danger' : 'has-not-coupon btn--default'}`}\n loaderPosition=\"center\"\n onClick={appliedCoupon ? handleRemoveCoupon : undefined}\n >\n <span className=\"coupon-text\">\n {appliedCoupon ? '' : t('pages.cart.apply_coupon_btn', 'Apply')}\n </span>\n {appliedCoupon && <i className=\"sicon-cancel icon text-xl w-8\"></i>}\n </SallaButton>\n </div>\n {error && (\n <span className=\"text-xs text-red-700\" id=\"coupon-error\">\n {error}\n </span>\n )}\n </form>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { useTranslation } from './chunk-TYNZ5B2B.js';
2
- import './chunk-BBMRL2QU.js';
2
+ import './chunk-CTPYM52J.js';
3
3
  import { Link } from './chunk-AXW67SY7.js';
4
4
  import './chunk-BYMOPN2S.js';
5
5
  import './chunk-SKLEJJ6M.js';
@@ -22,5 +22,5 @@ function Copyright({ storeName = "" }) {
22
22
  }
23
23
 
24
24
  export { Copyright };
25
- //# sourceMappingURL=Copyright-PVSTODJF.js.map
26
- //# sourceMappingURL=Copyright-PVSTODJF.js.map
25
+ //# sourceMappingURL=Copyright-EHQHBFRP.js.map
26
+ //# sourceMappingURL=Copyright-EHQHBFRP.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/layout/Copyright.tsx"],"names":[],"mappings":";;;;;;;;;;AAUO,SAAS,SAAA,CAAU,EAAE,SAAA,GAAY,EAAA,EAAG,EAAmB;AAC5D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,IAAA,GAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAEpC,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,CAAA,CAAE,2BAA2B,WAAW,CAAA;AAAA,IAAE,KAAA;AAAA,IAAI,IAAA;AAAA,IAAM,GAAA;AAAA,wBACpD,IAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,SAAA,EAAU,sBACpB,QAAA,EAAA,SAAA,EACH,CAAA;AAAA,IAAQ;AAAA,GAAA,EACV,CAAA;AAEJ","file":"Copyright-PVSTODJF.js","sourcesContent":["import { useTranslation } from '../../providers/I18nProvider';\nimport { Link } from '../common';\n\nexport interface CopyrightProps {\n storeName?: string;\n}\n\n/**\n * Simple copyright component - shows \"Copyright | Year StoreName | Powered by Salla\"\n */\nexport function Copyright({ storeName = '' }: CopyrightProps) {\n const { t } = useTranslation();\n const year = new Date().getFullYear();\n\n return (\n <>\n {t('blocks.footer.copyright', 'Copyright')} | {year}{' '}\n <Link to=\"/\" className=\"hover:text-primary\">\n {storeName}\n </Link>{' '}\n </>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/layout/Copyright.tsx"],"names":[],"mappings":";;;;;;;;;;AAUO,SAAS,SAAA,CAAU,EAAE,SAAA,GAAY,EAAA,EAAG,EAAmB;AAC5D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,IAAA,GAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAEpC,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,CAAA,CAAE,2BAA2B,WAAW,CAAA;AAAA,IAAE,KAAA;AAAA,IAAI,IAAA;AAAA,IAAM,GAAA;AAAA,wBACpD,IAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,SAAA,EAAU,sBACpB,QAAA,EAAA,SAAA,EACH,CAAA;AAAA,IAAQ;AAAA,GAAA,EACV,CAAA;AAEJ","file":"Copyright-EHQHBFRP.js","sourcesContent":["import { useTranslation } from '../../providers/I18nProvider';\nimport { Link } from '../common';\n\nexport interface CopyrightProps {\n storeName?: string;\n}\n\n/**\n * Simple copyright component - shows \"Copyright | Year StoreName | Powered by Salla\"\n */\nexport function Copyright({ storeName = '' }: CopyrightProps) {\n const { t } = useTranslation();\n const year = new Date().getFullYear();\n\n return (\n <>\n {t('blocks.footer.copyright', 'Copyright')} | {year}{' '}\n <Link to=\"/\" className=\"hover:text-primary\">\n {storeName}\n </Link>{' '}\n </>\n );\n}\n"]}
@@ -1,23 +1,23 @@
1
- import './chunk-P4UZRDTR.js';
2
- import './chunk-H2QBHOF2.js';
3
- import './chunk-ECFDJBTE.js';
4
- import './chunk-LQ2PXFR4.js';
1
+ import './chunk-ENQEMMQ5.js';
2
+ import './chunk-ONHJKZ6J.js';
3
+ import './chunk-QLY2NOJT.js';
5
4
  import './chunk-N6ZE6HUX.js';
6
5
  import './chunk-X55R4VVK.js';
7
- import './chunk-FG2B552D.js';
6
+ import './chunk-YL6X3ZMG.js';
7
+ import './chunk-JYGEHJU4.js';
8
8
  import './chunk-OXMUPNMH.js';
9
- import './chunk-J4GUGMPX.js';
9
+ import './chunk-HMMOUH2W.js';
10
10
  import './chunk-VVZNW5CB.js';
11
11
  import './chunk-WQPG22DY.js';
12
12
  import './chunk-GD26FI4J.js';
13
13
  import './chunk-Q7E4TNN7.js';
14
14
  import './chunk-RYGEIQWO.js';
15
- import { useLocation } from './chunk-PLPIAVLJ.js';
15
+ import { useLocation } from './chunk-7AWWYJXA.js';
16
16
  import { RouteId } from './chunk-OUW6WESU.js';
17
17
  import './chunk-HOJ5E2PG.js';
18
18
  import './chunk-HI5V5X3S.js';
19
- import { useUser } from './chunk-5J3HVOTR.js';
20
- import './chunk-Y6X3TVOI.js';
19
+ import { useUser } from './chunk-OZP22OV3.js';
20
+ import './chunk-DD622QIQ.js';
21
21
  import './chunk-MVT5AF2A.js';
22
22
  import './chunk-Z653O7MX.js';
23
23
  import './chunk-ZCH7W7DZ.js';
@@ -28,16 +28,16 @@ import './chunk-7V36I5GT.js';
28
28
  import './chunk-6WI7R2BD.js';
29
29
  import './chunk-LFHYQ6AN.js';
30
30
  import './chunk-OAMIDZKW.js';
31
- import './chunk-JI6ZNE7R.js';
31
+ import './chunk-OFDFDY2F.js';
32
32
  import './chunk-OQIIJRAS.js';
33
33
  import './chunk-V2ZDTY6H.js';
34
- import './chunk-ZU7TSTT7.js';
34
+ import './chunk-NTOWUMLA.js';
35
35
  import './chunk-5XDPAKF5.js';
36
36
  import './chunk-GCPEMNSU.js';
37
- import './chunk-J5OJ7JM2.js';
37
+ import './chunk-RORNWRSU.js';
38
38
  import './chunk-Z5M4YYWT.js';
39
39
  import { useTranslation } from './chunk-TYNZ5B2B.js';
40
- import { LazyBreadcrumb } from './chunk-BBMRL2QU.js';
40
+ import { LazyBreadcrumb } from './chunk-CTPYM52J.js';
41
41
  import './chunk-AXW67SY7.js';
42
42
  import './chunk-BYMOPN2S.js';
43
43
  import './chunk-SKLEJJ6M.js';
@@ -100,5 +100,5 @@ function CustomerLayout({ children, page }) {
100
100
  }
101
101
 
102
102
  export { CustomerLayout };
103
- //# sourceMappingURL=CustomerLayout-NOHKTFXG.js.map
104
- //# sourceMappingURL=CustomerLayout-NOHKTFXG.js.map
103
+ //# sourceMappingURL=CustomerLayout-QRBLOWA4.js.map
104
+ //# sourceMappingURL=CustomerLayout-QRBLOWA4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/layout/CustomerLayout.tsx"],"names":[],"mappings":"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","file":"CustomerLayout-NOHKTFXG.js","sourcesContent":["import { useMemo } from 'react';\nimport { useUser } from '../../hooks';\nimport { useDocumentClass } from '../../hooks/useDocumentClass';\nimport { SallaFileUpload } from '@salla.sa/twilight-components-react/file-upload';\nimport { SallaUserMenu } from '@salla.sa/twilight-components-react/user-menu';\nimport { Breadcrumb } from '../common';\nimport type { LayoutProps } from './types';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useLocation } from '../../providers/NavigationProvider';\nimport type { Page } from '../../types';\nimport { RouteId } from '../../router/route-ids';\n\ninterface CustomerLayoutProps extends LayoutProps {\n page?: Page;\n}\n\nexport function CustomerLayout({ children, page }: CustomerLayoutProps) {\n const { data: user } = useUser();\n const { t } = useTranslation();\n const { pathname } = useLocation();\n\n // Twig's salla-breadcrumb puts \"My account\" before every customer page but these two.\n const crumbPage = useMemo(() => {\n if (\n !page ||\n page.breadcrumbs?.length ||\n ([RouteId.CUSTOMER_PROFILE, RouteId.CUSTOMER_WISHLIST] as string[]).includes(page.slug)\n ) {\n return page;\n }\n return {\n ...page,\n breadcrumbs: [\n { name: t('common.titles.home'), url: '/' },\n { name: t('common.titles.profile'), url: '/account/profile' },\n { name: page.title, url: pathname },\n ],\n };\n }, [page, pathname, t]);\n\n // Marks every customer/account page so a theme can scope styles to them\n // (route classes vary per page; this one is shared).\n useDocumentClass({ body: { class: 'customer' } });\n\n return (\n <>\n <div className=\"profile-header gradient-bg\">\n <div className=\"container relative flex justify-between h-full items-center\">\n {crumbPage && (\n <Breadcrumb page={crumbPage} className=\"breadcrumbs w-full py-5 self-start\" />\n )}\n </div>\n </div>\n\n {/* Main content area */}\n <div className=\"container lg:mb-24\">\n <div className=\"flex items-start flex-col lg:flex-row justify-center\">\n <nav\n aria-label=\"Sidebar\"\n className=\"shrink-0 lg:sticky top-24 lg:-mt-28 lg:shadow-default rounded-md lg:bg-white w-full lg:w-72 rtl:lg:ml-8 ltr:lg:mr-8 lg:pt-8 lg:pb-11 sidebar space-y-px\"\n >\n {page?.slug === RouteId.CUSTOMER_PROFILE && (\n <div className=\"text-center md:mb-9\">\n <div className=\"h-20 w-20 m-auto avatar-wrap bg-gray-100 rounded-full overflow-hidden\">\n <SallaFileUpload profileImage value={user?.avatar}>\n <span className=\"avatar-placeholder flex justify-center items-center flex-col w-full h-full\">\n <span className=\"sicon-user text-2xl text-gray-400\"></span>\n </span>\n </SallaFileUpload>\n </div>\n </div>\n )}\n\n <div className=\"hidden lg:block\">\n <SallaUserMenu inline />\n </div>\n </nav>\n\n <div className=\"main-content w-full flex-1 lg:pt-10 max-w-3xl\">\n {page?.title && (\n <h1 className=\"font-bold text-lg text-center sm:rtl:text-right sm:ltr:text-left mb-2\">\n {page.title}\n </h1>\n )}\n {children}\n </div>\n </div>\n </div>\n </>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/layout/CustomerLayout.tsx"],"names":[],"mappings":"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","file":"CustomerLayout-QRBLOWA4.js","sourcesContent":["import { useMemo } from 'react';\nimport { useUser } from '../../hooks';\nimport { useDocumentClass } from '../../hooks/useDocumentClass';\nimport { SallaFileUpload } from '@salla.sa/twilight-components-react/file-upload';\nimport { SallaUserMenu } from '@salla.sa/twilight-components-react/user-menu';\nimport { Breadcrumb } from '../common';\nimport type { LayoutProps } from './types';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useLocation } from '../../providers/NavigationProvider';\nimport type { Page } from '../../types';\nimport { RouteId } from '../../router/route-ids';\n\ninterface CustomerLayoutProps extends LayoutProps {\n page?: Page;\n}\n\nexport function CustomerLayout({ children, page }: CustomerLayoutProps) {\n const { data: user } = useUser();\n const { t } = useTranslation();\n const { pathname } = useLocation();\n\n // Twig's salla-breadcrumb puts \"My account\" before every customer page but these two.\n const crumbPage = useMemo(() => {\n if (\n !page ||\n page.breadcrumbs?.length ||\n ([RouteId.CUSTOMER_PROFILE, RouteId.CUSTOMER_WISHLIST] as string[]).includes(page.slug)\n ) {\n return page;\n }\n return {\n ...page,\n breadcrumbs: [\n { name: t('common.titles.home'), url: '/' },\n { name: t('common.titles.profile'), url: '/account/profile' },\n { name: page.title, url: pathname },\n ],\n };\n }, [page, pathname, t]);\n\n // Marks every customer/account page so a theme can scope styles to them\n // (route classes vary per page; this one is shared).\n useDocumentClass({ body: { class: 'customer' } });\n\n return (\n <>\n <div className=\"profile-header gradient-bg\">\n <div className=\"container relative flex justify-between h-full items-center\">\n {crumbPage && (\n <Breadcrumb page={crumbPage} className=\"breadcrumbs w-full py-5 self-start\" />\n )}\n </div>\n </div>\n\n {/* Main content area */}\n <div className=\"container lg:mb-24\">\n <div className=\"flex items-start flex-col lg:flex-row justify-center\">\n <nav\n aria-label=\"Sidebar\"\n className=\"shrink-0 lg:sticky top-24 lg:-mt-28 lg:shadow-default rounded-md lg:bg-white w-full lg:w-72 rtl:lg:ml-8 ltr:lg:mr-8 lg:pt-8 lg:pb-11 sidebar space-y-px\"\n >\n {page?.slug === RouteId.CUSTOMER_PROFILE && (\n <div className=\"text-center md:mb-9\">\n <div className=\"h-20 w-20 m-auto avatar-wrap bg-gray-100 rounded-full overflow-hidden\">\n <SallaFileUpload profileImage value={user?.avatar}>\n <span className=\"avatar-placeholder flex justify-center items-center flex-col w-full h-full\">\n <span className=\"sicon-user text-2xl text-gray-400\"></span>\n </span>\n </SallaFileUpload>\n </div>\n </div>\n )}\n\n <div className=\"hidden lg:block\">\n <SallaUserMenu inline />\n </div>\n </nav>\n\n <div className=\"main-content w-full flex-1 lg:pt-10 max-w-3xl\">\n {page?.title && (\n <h1 className=\"font-bold text-lg text-center sm:rtl:text-right sm:ltr:text-left mb-2\">\n {page.title}\n </h1>\n )}\n {children}\n </div>\n </div>\n </div>\n </>\n );\n}\n"]}
@@ -1,9 +1,9 @@
1
- export { Footer } from './chunk-LQ2PXFR4.js';
1
+ export { Footer } from './chunk-QLY2NOJT.js';
2
2
  import './chunk-OQIIJRAS.js';
3
3
  import './chunk-5XDPAKF5.js';
4
4
  import './chunk-GCPEMNSU.js';
5
5
  import './chunk-TYNZ5B2B.js';
6
- import './chunk-BBMRL2QU.js';
6
+ import './chunk-CTPYM52J.js';
7
7
  import './chunk-AXW67SY7.js';
8
8
  import './chunk-BYMOPN2S.js';
9
9
  import './chunk-SKLEJJ6M.js';
@@ -13,5 +13,5 @@ import './chunk-T72DAX7R.js';
13
13
  import './chunk-DF6FBKDN.js';
14
14
  import './chunk-VYGA5AT5.js';
15
15
  import './chunk-DGUM43GV.js';
16
- //# sourceMappingURL=Footer-RDRSICZP.js.map
17
- //# sourceMappingURL=Footer-RDRSICZP.js.map
16
+ //# sourceMappingURL=Footer-GH6UEQR2.js.map
17
+ //# sourceMappingURL=Footer-GH6UEQR2.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"Footer-RDRSICZP.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"Footer-GH6UEQR2.js"}
@@ -1,14 +1,14 @@
1
- export { Header } from './chunk-ECFDJBTE.js';
2
- import './chunk-PLPIAVLJ.js';
1
+ export { Header } from './chunk-ONHJKZ6J.js';
2
+ import './chunk-7AWWYJXA.js';
3
3
  import './chunk-OUW6WESU.js';
4
- import './chunk-JI6ZNE7R.js';
5
- import './chunk-ZU7TSTT7.js';
4
+ import './chunk-OFDFDY2F.js';
5
+ import './chunk-NTOWUMLA.js';
6
6
  import './chunk-5XDPAKF5.js';
7
7
  import './chunk-GCPEMNSU.js';
8
- import './chunk-J5OJ7JM2.js';
8
+ import './chunk-RORNWRSU.js';
9
9
  import './chunk-Z5M4YYWT.js';
10
10
  import './chunk-TYNZ5B2B.js';
11
- import './chunk-BBMRL2QU.js';
11
+ import './chunk-CTPYM52J.js';
12
12
  import './chunk-AXW67SY7.js';
13
13
  import './chunk-BYMOPN2S.js';
14
14
  import './chunk-SKLEJJ6M.js';
@@ -20,5 +20,5 @@ import './chunk-T72DAX7R.js';
20
20
  import './chunk-DF6FBKDN.js';
21
21
  import './chunk-VYGA5AT5.js';
22
22
  import './chunk-DGUM43GV.js';
23
- //# sourceMappingURL=Header-YCS4HJCH.js.map
24
- //# sourceMappingURL=Header-YCS4HJCH.js.map
23
+ //# sourceMappingURL=Header-4KUXZJMA.js.map
24
+ //# sourceMappingURL=Header-4KUXZJMA.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"Header-YCS4HJCH.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"Header-4KUXZJMA.js"}
@@ -1,27 +1,27 @@
1
1
  import { NoContent } from './chunk-33FWLJXY.js';
2
- import { product, parseNextPageToken } from './chunk-ISDSQORB.js';
3
- import { ProductCard } from './chunk-NVPOH3CU.js';
2
+ import { product, parseNextPageToken } from './chunk-MFHGYANL.js';
3
+ import { ProductCard } from './chunk-45UU2OKF.js';
4
4
  import './chunk-Y32RHCOH.js';
5
- import './chunk-P4UZRDTR.js';
6
- import './chunk-H2QBHOF2.js';
7
- import './chunk-ECFDJBTE.js';
8
- import './chunk-LQ2PXFR4.js';
5
+ import './chunk-ENQEMMQ5.js';
6
+ import './chunk-ONHJKZ6J.js';
7
+ import './chunk-QLY2NOJT.js';
9
8
  import './chunk-N6ZE6HUX.js';
10
9
  import './chunk-X55R4VVK.js';
11
- import './chunk-FG2B552D.js';
10
+ import './chunk-YL6X3ZMG.js';
11
+ import './chunk-JYGEHJU4.js';
12
12
  import './chunk-OXMUPNMH.js';
13
- import './chunk-J4GUGMPX.js';
13
+ import './chunk-HMMOUH2W.js';
14
14
  import './chunk-VVZNW5CB.js';
15
15
  import './chunk-WQPG22DY.js';
16
16
  import './chunk-GD26FI4J.js';
17
17
  import './chunk-Q7E4TNN7.js';
18
18
  import './chunk-RYGEIQWO.js';
19
- import './chunk-PLPIAVLJ.js';
19
+ import './chunk-7AWWYJXA.js';
20
20
  import './chunk-OUW6WESU.js';
21
21
  import './chunk-HOJ5E2PG.js';
22
22
  import './chunk-HI5V5X3S.js';
23
- import './chunk-5J3HVOTR.js';
24
- import './chunk-Y6X3TVOI.js';
23
+ import './chunk-OZP22OV3.js';
24
+ import './chunk-DD622QIQ.js';
25
25
  import './chunk-MVT5AF2A.js';
26
26
  import './chunk-Z653O7MX.js';
27
27
  import './chunk-ZCH7W7DZ.js';
@@ -32,16 +32,16 @@ import './chunk-7V36I5GT.js';
32
32
  import './chunk-6WI7R2BD.js';
33
33
  import './chunk-LFHYQ6AN.js';
34
34
  import './chunk-OAMIDZKW.js';
35
- import './chunk-JI6ZNE7R.js';
35
+ import './chunk-OFDFDY2F.js';
36
36
  import './chunk-OQIIJRAS.js';
37
37
  import './chunk-V2ZDTY6H.js';
38
- import './chunk-ZU7TSTT7.js';
38
+ import './chunk-NTOWUMLA.js';
39
39
  import './chunk-5XDPAKF5.js';
40
40
  import './chunk-GCPEMNSU.js';
41
- import './chunk-J5OJ7JM2.js';
41
+ import './chunk-RORNWRSU.js';
42
42
  import './chunk-Z5M4YYWT.js';
43
43
  import { useTranslation } from './chunk-TYNZ5B2B.js';
44
- import './chunk-BBMRL2QU.js';
44
+ import './chunk-CTPYM52J.js';
45
45
  import './chunk-AXW67SY7.js';
46
46
  import './chunk-BYMOPN2S.js';
47
47
  import './chunk-SKLEJJ6M.js';
@@ -103,5 +103,5 @@ function LatestProducts({ data }) {
103
103
  }
104
104
 
105
105
  export { LatestProducts };
106
- //# sourceMappingURL=LatestProducts-JEOWAHON.js.map
107
- //# sourceMappingURL=LatestProducts-JEOWAHON.js.map
106
+ //# sourceMappingURL=LatestProducts-AKCLYRRU.js.map
107
+ //# sourceMappingURL=LatestProducts-AKCLYRRU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/home/LatestProducts.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBO,SAAS,cAAA,CAAe,EAAE,IAAA,EAAK,EAAwB;AAC5D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,OAAA,GAAU,OAAsB,IAAI,CAAA;AAE1C,EAAA,MAAM,MAAA,GAAS,YAAY,YAAY;AACrC,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,CAAK,EAAE,MAAA,EAAQ,QAAA,EAAU,GAAG,kBAAA,CAAmB,OAAA,CAAQ,OAAO,CAAA,EAAG,CAAA;AAC9F,IAAA,OAAA,CAAQ,UAAU,MAAA,CAAO,IAAA;AACzB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,IAAA,CAAK,KAAA,IAAS,CAAA,CAAE,6BAAA,EAA+B,iBAAiB,CAAA,EAAE,CAAA,EACzE,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,IAAA,EAAK,UAAA;AAAA,QACL,cAAA,EAAe,gCAAA;AAAA,QACf,QAAA,sBAAW,mBAAA,EAAA,EAAoB,CAAA;AAAA,QAC/B,YAAA,EAAa,MAAA;AAAA,QACb,aAAA,EAAe,CAAA;AAAA,QACf,KAAA,kBACE,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,oBAAA;AAAA,YACL,OAAA,EAAS,CAAA,CAAE,8BAAA,EAAgC,oCAAoC;AAAA;AAAA,SACjF;AAAA,QAEF,GAAG,CAAC,GAAA,EAAK,aAAa,CAAA,CAAE,GAAA,EAAK,YAAY,GAAG,CAAA;AAAA,QAE3C,WAAC,QAAA,KACA,QAAA,CAAS,GAAA,CAAI,CAAC,MAAM,KAAA,qBAClB,GAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YAEC,OAAA,EAAS,IAAA;AAAA,YACT,aAAA,EAAe,CAAC,CAAC,IAAA,CAAK,YAAY,KAAA,GAAQ;AAAA,WAAA;AAAA,UAFrC,IAAA,CAAK;AAAA,SAIb;AAAA;AAAA;AAEL,GAAA,EACF,CAAA;AAEJ","file":"LatestProducts-JEOWAHON.js","sourcesContent":["import { useCallback, useRef } from 'react';\nimport { ProductCardSkeleton, SallaProductsList } from '@salla.sa/twilight-components-react';\nimport { parseNextPageToken, product } from '../../api/product';\nimport { ProductCard } from '../product/ProductCard';\nimport { NoContent } from '../common/NoContent';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport type { Product } from '../../types';\n\nexport interface LatestProductsProps {\n data: {\n title?: string;\n priority?: boolean;\n [key: string]: unknown;\n };\n}\n\n/**\n * Twig's `latest-products` block (the Store app's LatestProductsWidget): the store's newest\n * products, loading more as the customer scrolls. A home page with no blocks shows it.\n */\nexport function LatestProducts({ data }: LatestProductsProps) {\n const { t } = useTranslation();\n const nextRef = useRef<string | null>(null);\n\n const loader = useCallback(async () => {\n const result = await product.list({ source: 'latest', ...parseNextPageToken(nextRef.current) });\n nextRef.current = result.next;\n return result;\n }, []);\n\n return (\n <>\n <div className=\"s-block__title\">\n <h2>{data.title || t('blocks.home.latest_products', 'Latest Products')}</h2>\n </div>\n <SallaProductsList<Product>\n loader={loader}\n mode=\"infinite\"\n itemsClassName=\"s-products-list-vertical-cards\"\n skeleton={<ProductCardSkeleton />}\n skeletonType=\"item\"\n skeletonCount={8}\n empty={\n <NoContent\n icon=\"sicon-shopping-bag\"\n message={t('pages.categories.no_products', 'No products found in this category')}\n />\n }\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(products) =>\n products.map((item, index) => (\n <ProductCard\n key={item.id}\n product={item}\n imagePriority={!!data.priority && index < 2}\n />\n ))\n }\n </SallaProductsList>\n </>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/home/LatestProducts.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBO,SAAS,cAAA,CAAe,EAAE,IAAA,EAAK,EAAwB;AAC5D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,OAAA,GAAU,OAAsB,IAAI,CAAA;AAE1C,EAAA,MAAM,MAAA,GAAS,YAAY,YAAY;AACrC,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,CAAK,EAAE,MAAA,EAAQ,QAAA,EAAU,GAAG,kBAAA,CAAmB,OAAA,CAAQ,OAAO,CAAA,EAAG,CAAA;AAC9F,IAAA,OAAA,CAAQ,UAAU,MAAA,CAAO,IAAA;AACzB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,IAAA,CAAK,KAAA,IAAS,CAAA,CAAE,6BAAA,EAA+B,iBAAiB,CAAA,EAAE,CAAA,EACzE,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,IAAA,EAAK,UAAA;AAAA,QACL,cAAA,EAAe,gCAAA;AAAA,QACf,QAAA,sBAAW,mBAAA,EAAA,EAAoB,CAAA;AAAA,QAC/B,YAAA,EAAa,MAAA;AAAA,QACb,aAAA,EAAe,CAAA;AAAA,QACf,KAAA,kBACE,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,oBAAA;AAAA,YACL,OAAA,EAAS,CAAA,CAAE,8BAAA,EAAgC,oCAAoC;AAAA;AAAA,SACjF;AAAA,QAEF,GAAG,CAAC,GAAA,EAAK,aAAa,CAAA,CAAE,GAAA,EAAK,YAAY,GAAG,CAAA;AAAA,QAE3C,WAAC,QAAA,KACA,QAAA,CAAS,GAAA,CAAI,CAAC,MAAM,KAAA,qBAClB,GAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YAEC,OAAA,EAAS,IAAA;AAAA,YACT,aAAA,EAAe,CAAC,CAAC,IAAA,CAAK,YAAY,KAAA,GAAQ;AAAA,WAAA;AAAA,UAFrC,IAAA,CAAK;AAAA,SAIb;AAAA;AAAA;AAEL,GAAA,EACF,CAAA;AAEJ","file":"LatestProducts-AKCLYRRU.js","sourcesContent":["import { useCallback, useRef } from 'react';\nimport { ProductCardSkeleton, SallaProductsList } from '@salla.sa/twilight-components-react';\nimport { parseNextPageToken, product } from '../../api/product';\nimport { ProductCard } from '../product/ProductCard';\nimport { NoContent } from '../common/NoContent';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport type { Product } from '../../types';\n\nexport interface LatestProductsProps {\n data: {\n title?: string;\n priority?: boolean;\n [key: string]: unknown;\n };\n}\n\n/**\n * Twig's `latest-products` block (the Store app's LatestProductsWidget): the store's newest\n * products, loading more as the customer scrolls. A home page with no blocks shows it.\n */\nexport function LatestProducts({ data }: LatestProductsProps) {\n const { t } = useTranslation();\n const nextRef = useRef<string | null>(null);\n\n const loader = useCallback(async () => {\n const result = await product.list({ source: 'latest', ...parseNextPageToken(nextRef.current) });\n nextRef.current = result.next;\n return result;\n }, []);\n\n return (\n <>\n <div className=\"s-block__title\">\n <h2>{data.title || t('blocks.home.latest_products', 'Latest Products')}</h2>\n </div>\n <SallaProductsList<Product>\n loader={loader}\n mode=\"infinite\"\n itemsClassName=\"s-products-list-vertical-cards\"\n skeleton={<ProductCardSkeleton />}\n skeletonType=\"item\"\n skeletonCount={8}\n empty={\n <NoContent\n icon=\"sicon-shopping-bag\"\n message={t('pages.categories.no_products', 'No products found in this category')}\n />\n }\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(products) =>\n products.map((item, index) => (\n <ProductCard\n key={item.id}\n product={item}\n imagePriority={!!data.priority && index < 2}\n />\n ))\n }\n </SallaProductsList>\n </>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { moveLiveBlock } from './chunk-IXHM24Z4.js';
2
- import { areaOf, postToEditor, BLOCK_ATTRIBUTE, targetOf } from './chunk-H2QBHOF2.js';
2
+ import { areaOf, postToEditor, BLOCK_ATTRIBUTE, targetOf } from './chunk-YL6X3ZMG.js';
3
3
  import './chunk-OXMUPNMH.js';
4
4
  import { useTranslation } from './chunk-TYNZ5B2B.js';
5
5
  import './chunk-T72DAX7R.js';
@@ -417,5 +417,5 @@ function LiveEditorBar({
417
417
  }
418
418
 
419
419
  export { LiveEditorBar };
420
- //# sourceMappingURL=LiveEditorBar-4AWOAJYX.js.map
421
- //# sourceMappingURL=LiveEditorBar-4AWOAJYX.js.map
420
+ //# sourceMappingURL=LiveEditorBar-3DUDCCSM.js.map
421
+ //# sourceMappingURL=LiveEditorBar-3DUDCCSM.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/live-editor/LiveEditorBar.tsx"],"names":["slides"],"mappings":"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","file":"LiveEditorBar-4AWOAJYX.js","sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport { createPortal, flushSync } from 'react-dom';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { BLOCK_ATTRIBUTE, areaOf, postToEditor, targetOf, type BlockAction } from './frame';\nimport { moveLiveBlock } from './moves';\n\nconst ACCENT = '#5dd5c4';\nconst LAYER = 2147483000;\n/** The editor reloads the preview after hide, duplicate and delete; stop waiting if it doesn't. */\nconst BUSY_TIMEOUT_MS = 10_000;\n/** How long a link's click waits for a second one, so a double-click edits instead of navigating. */\nconst DOUBLE_CLICK_MS = 300;\n/** How long a moved block, and the one it trades places with, slide to their new places. */\nconst MOVE_MS = 300;\n\n/** Defaults for the `blocks.live_editor.*` keys, in the store's language. */\nconst DEFAULT_LABELS = {\n ar: {\n edit: 'تعديل',\n hide: 'إخفاء',\n moveup: 'تحريك لأعلى',\n movedown: 'تحريك لأسفل',\n duplicate: 'تكرار',\n add: 'إضافة عنصر',\n delete: 'حذف',\n header: 'رأس الصفحة',\n footer: 'ذيل الصفحة',\n },\n en: {\n edit: 'Edit',\n hide: 'Hide',\n moveup: 'Move up',\n movedown: 'Move down',\n duplicate: 'Duplicate',\n add: 'Add element',\n delete: 'Delete',\n header: 'Header',\n footer: 'Footer',\n },\n} as const;\n\n/** Twig's order, read from the start of the line: edit first, delete last. */\nconst BLOCK_ACTIONS: BlockAction[] = [\n 'edit',\n 'hide',\n 'moveup',\n 'movedown',\n 'duplicate',\n 'add',\n 'delete',\n];\n\nconst DEV_ACTIONS = BLOCK_ACTIONS.filter((action) => action !== 'hide');\n\n/** Lucide-style 24px stroke icons. */\nconst ICONS: Record<BlockAction, ReactElement> = {\n edit: (\n <>\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\" />\n </>\n ),\n hide: (\n <>\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 10 8 10 8a13.16 13.16 0 0 1-1.67 2.68\" />\n <path d=\"M6.61 6.61A13.53 13.53 0 0 0 2 12s3 8 10 8a9.74 9.74 0 0 0 5.39-1.61\" />\n <path d=\"M9.88 9.88a3 3 0 1 0 4.24 4.24\" />\n <path d=\"m2 2 20 20\" />\n </>\n ),\n moveup: <path d=\"m18 15-6-6-6 6\" />,\n movedown: <path d=\"m6 9 6 6 6-6\" />,\n duplicate: (\n <>\n <rect x=\"8\" y=\"8\" width=\"14\" height=\"14\" rx=\"2\" />\n <path d=\"M4 16a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2\" />\n </>\n ),\n add: <path d=\"M12 5v14M5 12h14\" />,\n delete: (\n <>\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n </>\n ),\n};\n\nconst OUTLINE: CSSProperties = {\n position: 'fixed',\n zIndex: LAYER,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n border: `2px solid ${ACCENT}`,\n};\n\nconst CHIP: CSSProperties = {\n position: 'absolute',\n top: 0,\n insetInlineStart: 0,\n padding: '4px 12px',\n background: ACCENT,\n color: '#0f172a',\n font: '500 14px/1.4 system-ui, sans-serif',\n whiteSpace: 'nowrap',\n};\n\nconst BAR: CSSProperties = {\n position: 'fixed',\n zIndex: LAYER + 1,\n display: 'flex',\n gap: 4,\n padding: 6,\n background: '#fff',\n borderRadius: 8,\n boxShadow: '0 4px 16px rgba(15, 23, 42, 0.18)',\n transform: 'translateX(-50%)',\n};\n\nfunction buttonStyle(action: BlockAction | 'area', disabled: boolean): CSSProperties {\n return {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n minWidth: 36,\n height: 36,\n padding: '0 8px',\n border: 0,\n borderRadius: 6,\n background: 'transparent',\n color: action === 'delete' ? '#e11d48' : action === 'edit' ? '#0d9488' : '#475569',\n font: '500 14px/1 system-ui, sans-serif',\n cursor: disabled ? 'default' : 'pointer',\n opacity: disabled ? 0.35 : 1,\n };\n}\n\nfunction Icon({ children }: { children: ReactElement }) {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n );\n}\n\n/** The blocks `el` can trade places with: its siblings in the same list. */\nfunction blockSiblings(el: HTMLElement): HTMLElement[] {\n const parent = el.parentElement;\n if (!parent) return [el];\n return Array.from(parent.children).filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement && child.hasAttribute(BLOCK_ATTRIBUTE)\n );\n}\n\n/** Each block's slide while it runs, so a move made meanwhile starts from where the block is seen. */\nconst slides = new WeakMap<Element, Animation>();\n\n/**\n * Moves the block one place up or down on the page while the editor saves the\n * order, sliding the blocks that change places from where they are seen. The\n * slides it starts, or `null` when it can't move, and the editor shows the\n * saved order by reloading the page.\n */\nfunction moveInPlace(el: HTMLElement, action: 'moveup' | 'movedown'): Animation[] | null {\n const siblings = blockSiblings(el);\n const from = siblings.indexOf(el);\n const to = action === 'moveup' ? from - 1 : from + 1;\n if (from === -1 || to < 0 || to >= siblings.length) return null;\n\n // Where each block is seen, mid-slide included; its slide then gives way to the new one.\n const before = new Map(siblings.map((block) => [block, block.getBoundingClientRect().top]));\n for (const block of siblings) slides.get(block)?.cancel();\n let moved = false;\n // Committed before measuring again, so the blocks start their slide from where they were.\n flushSync(() => {\n moved = moveLiveBlock(from, to);\n });\n if (!moved) return null;\n if (window.matchMedia?.('(prefers-reduced-motion: reduce)').matches) return [];\n const started: Animation[] = [];\n for (const [block, top] of before) {\n const shift = top - block.getBoundingClientRect().top;\n if (!shift || typeof block.animate !== 'function') continue;\n const slide = block.animate([{ transform: `translateY(${shift}px)` }, { transform: 'none' }], {\n duration: MOVE_MS,\n easing: 'ease-in-out',\n });\n slides.set(block, slide);\n started.push(slide);\n }\n return started;\n}\n\nfunction connected(el: HTMLElement | null): HTMLElement | null {\n return el?.isConnected ? el : null;\n}\n\n/** Re-renders on scroll, resize and layout shifts, so the overlay follows what it outlines. */\ninterface Box {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/**\n * Where `el` is on screen. One with no box of its own (`display: contents`, as\n * Raed's header) measures 0×0 at the corner, so it's measured by its children.\n */\nfunction boxOf(el: Element): Box {\n const rect = el.getBoundingClientRect();\n if (rect.width || rect.height) return rect;\n const boxes = Array.from(el.children, boxOf).filter((box) => box.width || box.height);\n if (!boxes.length) return rect;\n const top = Math.min(...boxes.map((box) => box.top));\n const left = Math.min(...boxes.map((box) => box.left));\n const right = Math.max(...boxes.map((box) => box.left + box.width));\n const bottom = Math.max(...boxes.map((box) => box.top + box.height));\n return { top, left, width: right - left, height: bottom - top };\n}\n\n/**\n * Re-renders the bar when the page scrolls or resizes, so it stays on its\n * block. The returned `follow` re-renders it every frame until the given\n * slides end: a move changes the page without resizing it.\n */\nfunction useLayoutTick(active: boolean): (slides: readonly Animation[]) => void {\n const [, setTick] = useState(0);\n const following = useRef(0);\n useEffect(() => {\n if (!active) return;\n let frame = 0;\n const schedule = () => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => setTick((n) => n + 1));\n };\n window.addEventListener('scroll', schedule, { capture: true, passive: true });\n window.addEventListener('resize', schedule);\n const observer = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(schedule) : null;\n observer?.observe(document.body);\n return () => {\n cancelAnimationFrame(frame);\n window.removeEventListener('scroll', schedule, { capture: true });\n window.removeEventListener('resize', schedule);\n observer?.disconnect();\n };\n }, [active]);\n // Stop following when the bar goes away.\n useEffect(() => () => void (following.current += 1), []);\n\n return useCallback((slides: readonly Animation[]) => {\n const run = ++following.current;\n let ended = false;\n void Promise.allSettled(slides.map((slide) => slide.finished)).then(() => {\n ended = true;\n if (following.current === run) setTick((n) => n + 1);\n });\n const step = () => {\n if (following.current !== run) return;\n setTick((n) => n + 1);\n if (!ended) requestAnimationFrame(step);\n };\n step();\n }, []);\n}\n\ntype LabelKey = keyof typeof DEFAULT_LABELS.en;\ntype Labels = Record<LabelKey, string>;\n\nfunction useLabels(): Labels {\n const { t, i18n } = useTranslation();\n const defaults = i18n?.language?.startsWith('ar') ? DEFAULT_LABELS.ar : DEFAULT_LABELS.en;\n return Object.fromEntries(\n (Object.keys(defaults) as LabelKey[]).map((key) => [\n key,\n t(`blocks.live_editor.${key}`, { defaultValue: defaults[key] }),\n ])\n ) as Labels;\n}\n\n/**\n * Holds a link's click inside a block, the header or the footer for\n * {@link DOUBLE_CLICK_MS}: a second click on the same link makes it a\n * double-click, which edits the area, and the link never navigates; otherwise\n * the click is replayed. A click on another link drops the first one.\n */\nfunction useHeldLinkClicks(barRef: RefObject<HTMLDivElement | null>): void {\n useEffect(() => {\n let held: { link: HTMLAnchorElement; timer: number } | null = null;\n let replaying = false;\n\n const onClick = (event: MouseEvent) => {\n if (replaying || event.button !== 0) return;\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n if (barRef.current?.contains(event.target as Node)) return;\n const link = event.target instanceof Element ? event.target.closest('a[href]') : null;\n if (!(link instanceof HTMLAnchorElement) || !targetOf(link)) return;\n\n // Before the router's own handler, which sits below the document.\n event.preventDefault();\n event.stopPropagation();\n const previous = held;\n if (previous) {\n window.clearTimeout(previous.timer);\n held = null;\n if (previous.link === link) return;\n }\n const timer = window.setTimeout(() => {\n held = null;\n replaying = true;\n link.click();\n replaying = false;\n }, DOUBLE_CLICK_MS);\n held = { link, timer };\n };\n\n document.addEventListener('click', onClick, true);\n return () => {\n document.removeEventListener('click', onClick, true);\n if (held) window.clearTimeout(held.timer);\n };\n }, [barRef]);\n}\n\nfunction Outline({ el, label }: { el: HTMLElement; label?: string }) {\n const rect = boxOf(el);\n return (\n <div\n data-testid=\"live-editor-outline\"\n style={{ ...OUTLINE, top: rect.top, left: rect.left, width: rect.width, height: rect.height }}\n >\n {label && <span style={CHIP}>{label}</span>}\n </div>\n );\n}\n\ninterface ToolbarProps {\n target: HTMLElement;\n labels: Labels;\n busy: BlockAction | null;\n barRef: RefObject<HTMLDivElement | null>;\n actions: BlockAction[];\n onAct: (el: HTMLElement, action: BlockAction) => void;\n}\n\n/** One edit button for the header or footer; the full set for a block. */\nfunction Toolbar({ target, labels, busy, barRef, actions, onAct }: ToolbarProps) {\n const rect = boxOf(target);\n const style: CSSProperties = {\n ...BAR,\n top: Math.max(rect.top + 8, 8),\n left: rect.left + rect.width / 2,\n };\n\n if (areaOf(target)) {\n return (\n <div ref={barRef} data-testid=\"live-editor-bar\" style={style}>\n <button\n type=\"button\"\n data-testid=\"live-editor-edit\"\n style={buttonStyle('area', false)}\n onClick={() => onAct(target, 'edit')}\n >\n <Icon>{ICONS.edit}</Icon>\n {labels.edit}\n </button>\n </div>\n );\n }\n\n const siblings = blockSiblings(target);\n const index = siblings.indexOf(target);\n const isDisabled = (action: BlockAction) =>\n busy !== null ||\n (action === 'moveup' && index <= 0) ||\n (action === 'movedown' && index >= siblings.length - 1);\n\n return (\n <div\n ref={barRef}\n data-testid=\"live-editor-bar\"\n role=\"toolbar\"\n aria-label={labels.edit}\n style={style}\n >\n {actions.map((action) => (\n <button\n key={action}\n type=\"button\"\n data-testid={`live-editor-${action}`}\n title={labels[action]}\n aria-label={labels[action]}\n aria-busy={busy === action || undefined}\n disabled={isDisabled(action)}\n style={buttonStyle(action, isDisabled(action))}\n onClick={() => onAct(target, action)}\n >\n <Icon>{ICONS[action]}</Icon>\n </button>\n ))}\n </div>\n );\n}\n\n/**\n * The block an action names. A uuid is shared by every copy of one component,\n * so it comes with which copy, in page order; a row id is unique on its own.\n */\nfunction blockRefOf(el: HTMLElement, id: string): { id: string; copy?: number } {\n if (/^\\d+$/.test(id)) return { id };\n const copies = Array.from(document.querySelectorAll(`[${BLOCK_ATTRIBUTE}]`)).filter(\n (block) => block.getAttribute(BLOCK_ATTRIBUTE) === id\n );\n return { id, copy: copies.indexOf(el) };\n}\n\n/**\n * The live editor's action bar: hovering a home block outlines it and shows\n * edit, hide, move, duplicate, add and delete; hovering the header or footer\n * shows an edit button. Double-clicking either edits it. Each action is a\n * message to the editor, which saves the change and reloads the preview.\n *\n * In the engine's dev editor (`dev`) edits reach the page live, so nothing\n * waits for a reload, and there is no hide: its layout has no hidden blocks.\n */\nexport function LiveEditorBar({\n origin,\n dev = false,\n}: {\n origin: string;\n dev?: boolean;\n}): ReactElement | null {\n const [hovered, setHovered] = useState<HTMLElement | null>(null);\n const [editing, setEditing] = useState<HTMLElement | null>(null);\n const [busy, setBusy] = useState<BlockAction | null>(null);\n const barRef = useRef<HTMLDivElement>(null);\n // Taken after mount, so nothing reads the DOM while rendering.\n const [host, setHost] = useState<HTMLElement | null>(null);\n const labels = useLabels();\n useHeldLinkClicks(barRef);\n const target = connected(hovered);\n const selected = connected(editing);\n const follow = useLayoutTick(Boolean(target || selected));\n\n const act = useCallback(\n (el: HTMLElement, action: BlockAction) => {\n const area = areaOf(el);\n if (area) {\n postToEditor(origin, `preview::edit.${area}`, { id: `store-${area}` });\n setEditing(el);\n return;\n }\n const id = el.getAttribute(BLOCK_ATTRIBUTE);\n if (!id) return;\n // Which copy it is, from where it is before it moves.\n const ref = blockRefOf(el, id);\n // `moved`: the page shows the new order, so the editor saves it without a reload. The dev editor's layout moves it.\n const slid =\n !dev && (action === 'moveup' || action === 'movedown') ? moveInPlace(el, action) : null;\n const moved = slid !== null;\n postToEditor(origin, `preview::${action}.component`, moved ? { ...ref, moved } : ref);\n // The bar rides along with its block and knows its new place.\n if (slid) follow(slid);\n if (action === 'edit') setEditing(el);\n else if (!dev && (action === 'hide' || action === 'duplicate' || action === 'delete'))\n setBusy(action);\n },\n [origin, dev, follow]\n );\n\n useEffect(() => {\n const onOver = (event: MouseEvent) => {\n // The bar sits over the block it acts on: reaching it keeps that block.\n if (barRef.current?.contains(event.target as Node)) return;\n setHovered(targetOf(event.target));\n };\n const onOut = (event: MouseEvent) => {\n if (!event.relatedTarget) setHovered(null);\n };\n const onDoubleClick = (event: MouseEvent) => {\n if (barRef.current?.contains(event.target as Node)) return;\n const el = targetOf(event.target);\n if (el) act(el, 'edit');\n };\n document.addEventListener('mouseover', onOver);\n document.addEventListener('mouseout', onOut);\n document.addEventListener('dblclick', onDoubleClick);\n return () => {\n document.removeEventListener('mouseover', onOver);\n document.removeEventListener('mouseout', onOut);\n document.removeEventListener('dblclick', onDoubleClick);\n };\n }, [act]);\n\n useEffect(() => setHost(document.body), []);\n\n useEffect(() => {\n if (!busy) return;\n const timer = window.setTimeout(() => setBusy(null), BUSY_TIMEOUT_MS);\n return () => window.clearTimeout(timer);\n }, [busy]);\n\n if (!host || (!target && !selected)) return null;\n\n const targetArea = target ? areaOf(target) : null;\n\n return createPortal(\n <>\n {selected && selected !== target && <Outline el={selected} />}\n {target && <Outline el={target} label={targetArea ? labels[targetArea] : undefined} />}\n {target && (\n <Toolbar\n target={target}\n labels={labels}\n busy={busy}\n barRef={barRef}\n actions={dev ? DEV_ACTIONS : BLOCK_ACTIONS}\n onAct={act}\n />\n )}\n </>,\n host\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/live-editor/LiveEditorBar.tsx"],"names":["slides"],"mappings":"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","file":"LiveEditorBar-3DUDCCSM.js","sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport { createPortal, flushSync } from 'react-dom';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { BLOCK_ATTRIBUTE, areaOf, postToEditor, targetOf, type BlockAction } from './frame';\nimport { moveLiveBlock } from './moves';\n\nconst ACCENT = '#5dd5c4';\nconst LAYER = 2147483000;\n/** The editor reloads the preview after hide, duplicate and delete; stop waiting if it doesn't. */\nconst BUSY_TIMEOUT_MS = 10_000;\n/** How long a link's click waits for a second one, so a double-click edits instead of navigating. */\nconst DOUBLE_CLICK_MS = 300;\n/** How long a moved block, and the one it trades places with, slide to their new places. */\nconst MOVE_MS = 300;\n\n/** Defaults for the `blocks.live_editor.*` keys, in the store's language. */\nconst DEFAULT_LABELS = {\n ar: {\n edit: 'تعديل',\n hide: 'إخفاء',\n moveup: 'تحريك لأعلى',\n movedown: 'تحريك لأسفل',\n duplicate: 'تكرار',\n add: 'إضافة عنصر',\n delete: 'حذف',\n header: 'رأس الصفحة',\n footer: 'ذيل الصفحة',\n },\n en: {\n edit: 'Edit',\n hide: 'Hide',\n moveup: 'Move up',\n movedown: 'Move down',\n duplicate: 'Duplicate',\n add: 'Add element',\n delete: 'Delete',\n header: 'Header',\n footer: 'Footer',\n },\n} as const;\n\n/** Twig's order, read from the start of the line: edit first, delete last. */\nconst BLOCK_ACTIONS: BlockAction[] = [\n 'edit',\n 'hide',\n 'moveup',\n 'movedown',\n 'duplicate',\n 'add',\n 'delete',\n];\n\nconst DEV_ACTIONS = BLOCK_ACTIONS.filter((action) => action !== 'hide');\n\n/** Lucide-style 24px stroke icons. */\nconst ICONS: Record<BlockAction, ReactElement> = {\n edit: (\n <>\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\" />\n </>\n ),\n hide: (\n <>\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 10 8 10 8a13.16 13.16 0 0 1-1.67 2.68\" />\n <path d=\"M6.61 6.61A13.53 13.53 0 0 0 2 12s3 8 10 8a9.74 9.74 0 0 0 5.39-1.61\" />\n <path d=\"M9.88 9.88a3 3 0 1 0 4.24 4.24\" />\n <path d=\"m2 2 20 20\" />\n </>\n ),\n moveup: <path d=\"m18 15-6-6-6 6\" />,\n movedown: <path d=\"m6 9 6 6 6-6\" />,\n duplicate: (\n <>\n <rect x=\"8\" y=\"8\" width=\"14\" height=\"14\" rx=\"2\" />\n <path d=\"M4 16a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2\" />\n </>\n ),\n add: <path d=\"M12 5v14M5 12h14\" />,\n delete: (\n <>\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n </>\n ),\n};\n\nconst OUTLINE: CSSProperties = {\n position: 'fixed',\n zIndex: LAYER,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n border: `2px solid ${ACCENT}`,\n};\n\nconst CHIP: CSSProperties = {\n position: 'absolute',\n top: 0,\n insetInlineStart: 0,\n padding: '4px 12px',\n background: ACCENT,\n color: '#0f172a',\n font: '500 14px/1.4 system-ui, sans-serif',\n whiteSpace: 'nowrap',\n};\n\nconst BAR: CSSProperties = {\n position: 'fixed',\n zIndex: LAYER + 1,\n display: 'flex',\n gap: 4,\n padding: 6,\n background: '#fff',\n borderRadius: 8,\n boxShadow: '0 4px 16px rgba(15, 23, 42, 0.18)',\n transform: 'translateX(-50%)',\n};\n\nfunction buttonStyle(action: BlockAction | 'area', disabled: boolean): CSSProperties {\n return {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n minWidth: 36,\n height: 36,\n padding: '0 8px',\n border: 0,\n borderRadius: 6,\n background: 'transparent',\n color: action === 'delete' ? '#e11d48' : action === 'edit' ? '#0d9488' : '#475569',\n font: '500 14px/1 system-ui, sans-serif',\n cursor: disabled ? 'default' : 'pointer',\n opacity: disabled ? 0.35 : 1,\n };\n}\n\nfunction Icon({ children }: { children: ReactElement }) {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n );\n}\n\n/** The blocks `el` can trade places with: its siblings in the same list. */\nfunction blockSiblings(el: HTMLElement): HTMLElement[] {\n const parent = el.parentElement;\n if (!parent) return [el];\n return Array.from(parent.children).filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement && child.hasAttribute(BLOCK_ATTRIBUTE)\n );\n}\n\n/** Each block's slide while it runs, so a move made meanwhile starts from where the block is seen. */\nconst slides = new WeakMap<Element, Animation>();\n\n/**\n * Moves the block one place up or down on the page while the editor saves the\n * order, sliding the blocks that change places from where they are seen. The\n * slides it starts, or `null` when it can't move, and the editor shows the\n * saved order by reloading the page.\n */\nfunction moveInPlace(el: HTMLElement, action: 'moveup' | 'movedown'): Animation[] | null {\n const siblings = blockSiblings(el);\n const from = siblings.indexOf(el);\n const to = action === 'moveup' ? from - 1 : from + 1;\n if (from === -1 || to < 0 || to >= siblings.length) return null;\n\n // Where each block is seen, mid-slide included; its slide then gives way to the new one.\n const before = new Map(siblings.map((block) => [block, block.getBoundingClientRect().top]));\n for (const block of siblings) slides.get(block)?.cancel();\n let moved = false;\n // Committed before measuring again, so the blocks start their slide from where they were.\n flushSync(() => {\n moved = moveLiveBlock(from, to);\n });\n if (!moved) return null;\n if (window.matchMedia?.('(prefers-reduced-motion: reduce)').matches) return [];\n const started: Animation[] = [];\n for (const [block, top] of before) {\n const shift = top - block.getBoundingClientRect().top;\n if (!shift || typeof block.animate !== 'function') continue;\n const slide = block.animate([{ transform: `translateY(${shift}px)` }, { transform: 'none' }], {\n duration: MOVE_MS,\n easing: 'ease-in-out',\n });\n slides.set(block, slide);\n started.push(slide);\n }\n return started;\n}\n\nfunction connected(el: HTMLElement | null): HTMLElement | null {\n return el?.isConnected ? el : null;\n}\n\n/** Re-renders on scroll, resize and layout shifts, so the overlay follows what it outlines. */\ninterface Box {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/**\n * Where `el` is on screen. One with no box of its own (`display: contents`, as\n * Raed's header) measures 0×0 at the corner, so it's measured by its children.\n */\nfunction boxOf(el: Element): Box {\n const rect = el.getBoundingClientRect();\n if (rect.width || rect.height) return rect;\n const boxes = Array.from(el.children, boxOf).filter((box) => box.width || box.height);\n if (!boxes.length) return rect;\n const top = Math.min(...boxes.map((box) => box.top));\n const left = Math.min(...boxes.map((box) => box.left));\n const right = Math.max(...boxes.map((box) => box.left + box.width));\n const bottom = Math.max(...boxes.map((box) => box.top + box.height));\n return { top, left, width: right - left, height: bottom - top };\n}\n\n/**\n * Re-renders the bar when the page scrolls or resizes, so it stays on its\n * block. The returned `follow` re-renders it every frame until the given\n * slides end: a move changes the page without resizing it.\n */\nfunction useLayoutTick(active: boolean): (slides: readonly Animation[]) => void {\n const [, setTick] = useState(0);\n const following = useRef(0);\n useEffect(() => {\n if (!active) return;\n let frame = 0;\n const schedule = () => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => setTick((n) => n + 1));\n };\n window.addEventListener('scroll', schedule, { capture: true, passive: true });\n window.addEventListener('resize', schedule);\n const observer = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(schedule) : null;\n observer?.observe(document.body);\n return () => {\n cancelAnimationFrame(frame);\n window.removeEventListener('scroll', schedule, { capture: true });\n window.removeEventListener('resize', schedule);\n observer?.disconnect();\n };\n }, [active]);\n // Stop following when the bar goes away.\n useEffect(() => () => void (following.current += 1), []);\n\n return useCallback((slides: readonly Animation[]) => {\n const run = ++following.current;\n let ended = false;\n void Promise.allSettled(slides.map((slide) => slide.finished)).then(() => {\n ended = true;\n if (following.current === run) setTick((n) => n + 1);\n });\n const step = () => {\n if (following.current !== run) return;\n setTick((n) => n + 1);\n if (!ended) requestAnimationFrame(step);\n };\n step();\n }, []);\n}\n\ntype LabelKey = keyof typeof DEFAULT_LABELS.en;\ntype Labels = Record<LabelKey, string>;\n\nfunction useLabels(): Labels {\n const { t, i18n } = useTranslation();\n const defaults = i18n?.language?.startsWith('ar') ? DEFAULT_LABELS.ar : DEFAULT_LABELS.en;\n return Object.fromEntries(\n (Object.keys(defaults) as LabelKey[]).map((key) => [\n key,\n t(`blocks.live_editor.${key}`, { defaultValue: defaults[key] }),\n ])\n ) as Labels;\n}\n\n/**\n * Holds a link's click inside a block, the header or the footer for\n * {@link DOUBLE_CLICK_MS}: a second click on the same link makes it a\n * double-click, which edits the area, and the link never navigates; otherwise\n * the click is replayed. A click on another link drops the first one.\n */\nfunction useHeldLinkClicks(barRef: RefObject<HTMLDivElement | null>): void {\n useEffect(() => {\n let held: { link: HTMLAnchorElement; timer: number } | null = null;\n let replaying = false;\n\n const onClick = (event: MouseEvent) => {\n if (replaying || event.button !== 0) return;\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n if (barRef.current?.contains(event.target as Node)) return;\n const link = event.target instanceof Element ? event.target.closest('a[href]') : null;\n if (!(link instanceof HTMLAnchorElement) || !targetOf(link)) return;\n\n // Before the router's own handler, which sits below the document.\n event.preventDefault();\n event.stopPropagation();\n const previous = held;\n if (previous) {\n window.clearTimeout(previous.timer);\n held = null;\n if (previous.link === link) return;\n }\n const timer = window.setTimeout(() => {\n held = null;\n replaying = true;\n link.click();\n replaying = false;\n }, DOUBLE_CLICK_MS);\n held = { link, timer };\n };\n\n document.addEventListener('click', onClick, true);\n return () => {\n document.removeEventListener('click', onClick, true);\n if (held) window.clearTimeout(held.timer);\n };\n }, [barRef]);\n}\n\nfunction Outline({ el, label }: { el: HTMLElement; label?: string }) {\n const rect = boxOf(el);\n return (\n <div\n data-testid=\"live-editor-outline\"\n style={{ ...OUTLINE, top: rect.top, left: rect.left, width: rect.width, height: rect.height }}\n >\n {label && <span style={CHIP}>{label}</span>}\n </div>\n );\n}\n\ninterface ToolbarProps {\n target: HTMLElement;\n labels: Labels;\n busy: BlockAction | null;\n barRef: RefObject<HTMLDivElement | null>;\n actions: BlockAction[];\n onAct: (el: HTMLElement, action: BlockAction) => void;\n}\n\n/** One edit button for the header or footer; the full set for a block. */\nfunction Toolbar({ target, labels, busy, barRef, actions, onAct }: ToolbarProps) {\n const rect = boxOf(target);\n const style: CSSProperties = {\n ...BAR,\n top: Math.max(rect.top + 8, 8),\n left: rect.left + rect.width / 2,\n };\n\n if (areaOf(target)) {\n return (\n <div ref={barRef} data-testid=\"live-editor-bar\" style={style}>\n <button\n type=\"button\"\n data-testid=\"live-editor-edit\"\n style={buttonStyle('area', false)}\n onClick={() => onAct(target, 'edit')}\n >\n <Icon>{ICONS.edit}</Icon>\n {labels.edit}\n </button>\n </div>\n );\n }\n\n const siblings = blockSiblings(target);\n const index = siblings.indexOf(target);\n const isDisabled = (action: BlockAction) =>\n busy !== null ||\n (action === 'moveup' && index <= 0) ||\n (action === 'movedown' && index >= siblings.length - 1);\n\n return (\n <div\n ref={barRef}\n data-testid=\"live-editor-bar\"\n role=\"toolbar\"\n aria-label={labels.edit}\n style={style}\n >\n {actions.map((action) => (\n <button\n key={action}\n type=\"button\"\n data-testid={`live-editor-${action}`}\n title={labels[action]}\n aria-label={labels[action]}\n aria-busy={busy === action || undefined}\n disabled={isDisabled(action)}\n style={buttonStyle(action, isDisabled(action))}\n onClick={() => onAct(target, action)}\n >\n <Icon>{ICONS[action]}</Icon>\n </button>\n ))}\n </div>\n );\n}\n\n/**\n * The block an action names. A uuid is shared by every copy of one component,\n * so it comes with which copy, in page order; a row id is unique on its own.\n */\nfunction blockRefOf(el: HTMLElement, id: string): { id: string; copy?: number } {\n if (/^\\d+$/.test(id)) return { id };\n const copies = Array.from(document.querySelectorAll(`[${BLOCK_ATTRIBUTE}]`)).filter(\n (block) => block.getAttribute(BLOCK_ATTRIBUTE) === id\n );\n return { id, copy: copies.indexOf(el) };\n}\n\n/**\n * The live editor's action bar: hovering a home block outlines it and shows\n * edit, hide, move, duplicate, add and delete; hovering the header or footer\n * shows an edit button. Double-clicking either edits it. Each action is a\n * message to the editor, which saves the change and reloads the preview.\n *\n * In the engine's dev editor (`dev`) edits reach the page live, so nothing\n * waits for a reload, and there is no hide: its layout has no hidden blocks.\n */\nexport function LiveEditorBar({\n origin,\n dev = false,\n}: {\n origin: string;\n dev?: boolean;\n}): ReactElement | null {\n const [hovered, setHovered] = useState<HTMLElement | null>(null);\n const [editing, setEditing] = useState<HTMLElement | null>(null);\n const [busy, setBusy] = useState<BlockAction | null>(null);\n const barRef = useRef<HTMLDivElement>(null);\n // Taken after mount, so nothing reads the DOM while rendering.\n const [host, setHost] = useState<HTMLElement | null>(null);\n const labels = useLabels();\n useHeldLinkClicks(barRef);\n const target = connected(hovered);\n const selected = connected(editing);\n const follow = useLayoutTick(Boolean(target || selected));\n\n const act = useCallback(\n (el: HTMLElement, action: BlockAction) => {\n const area = areaOf(el);\n if (area) {\n postToEditor(origin, `preview::edit.${area}`, { id: `store-${area}` });\n setEditing(el);\n return;\n }\n const id = el.getAttribute(BLOCK_ATTRIBUTE);\n if (!id) return;\n // Which copy it is, from where it is before it moves.\n const ref = blockRefOf(el, id);\n // `moved`: the page shows the new order, so the editor saves it without a reload. The dev editor's layout moves it.\n const slid =\n !dev && (action === 'moveup' || action === 'movedown') ? moveInPlace(el, action) : null;\n const moved = slid !== null;\n postToEditor(origin, `preview::${action}.component`, moved ? { ...ref, moved } : ref);\n // The bar rides along with its block and knows its new place.\n if (slid) follow(slid);\n if (action === 'edit') setEditing(el);\n else if (!dev && (action === 'hide' || action === 'duplicate' || action === 'delete'))\n setBusy(action);\n },\n [origin, dev, follow]\n );\n\n useEffect(() => {\n const onOver = (event: MouseEvent) => {\n // The bar sits over the block it acts on: reaching it keeps that block.\n if (barRef.current?.contains(event.target as Node)) return;\n setHovered(targetOf(event.target));\n };\n const onOut = (event: MouseEvent) => {\n if (!event.relatedTarget) setHovered(null);\n };\n const onDoubleClick = (event: MouseEvent) => {\n if (barRef.current?.contains(event.target as Node)) return;\n const el = targetOf(event.target);\n if (el) act(el, 'edit');\n };\n document.addEventListener('mouseover', onOver);\n document.addEventListener('mouseout', onOut);\n document.addEventListener('dblclick', onDoubleClick);\n return () => {\n document.removeEventListener('mouseover', onOver);\n document.removeEventListener('mouseout', onOut);\n document.removeEventListener('dblclick', onDoubleClick);\n };\n }, [act]);\n\n useEffect(() => setHost(document.body), []);\n\n useEffect(() => {\n if (!busy) return;\n const timer = window.setTimeout(() => setBusy(null), BUSY_TIMEOUT_MS);\n return () => window.clearTimeout(timer);\n }, [busy]);\n\n if (!host || (!target && !selected)) return null;\n\n const targetArea = target ? areaOf(target) : null;\n\n return createPortal(\n <>\n {selected && selected !== target && <Outline el={selected} />}\n {target && <Outline el={target} label={targetArea ? labels[targetArea] : undefined} />}\n {target && (\n <Toolbar\n target={target}\n labels={labels}\n busy={busy}\n barRef={barRef}\n actions={dev ? DEV_ACTIONS : BLOCK_ACTIONS}\n onAct={act}\n />\n )}\n </>,\n host\n );\n}\n"]}
@@ -1,23 +1,23 @@
1
- import './chunk-P4UZRDTR.js';
2
- import './chunk-H2QBHOF2.js';
3
- import './chunk-ECFDJBTE.js';
4
- import './chunk-LQ2PXFR4.js';
1
+ import './chunk-ENQEMMQ5.js';
2
+ import './chunk-ONHJKZ6J.js';
3
+ import './chunk-QLY2NOJT.js';
5
4
  import './chunk-N6ZE6HUX.js';
6
5
  import './chunk-X55R4VVK.js';
7
- import './chunk-FG2B552D.js';
6
+ import './chunk-YL6X3ZMG.js';
7
+ import './chunk-JYGEHJU4.js';
8
8
  import './chunk-OXMUPNMH.js';
9
- import './chunk-J4GUGMPX.js';
9
+ import './chunk-HMMOUH2W.js';
10
10
  import './chunk-VVZNW5CB.js';
11
11
  import './chunk-WQPG22DY.js';
12
12
  import './chunk-GD26FI4J.js';
13
13
  import './chunk-Q7E4TNN7.js';
14
14
  import './chunk-RYGEIQWO.js';
15
- import './chunk-PLPIAVLJ.js';
15
+ import './chunk-7AWWYJXA.js';
16
16
  import './chunk-OUW6WESU.js';
17
17
  import './chunk-HOJ5E2PG.js';
18
18
  import './chunk-HI5V5X3S.js';
19
- import './chunk-5J3HVOTR.js';
20
- import './chunk-Y6X3TVOI.js';
19
+ import './chunk-OZP22OV3.js';
20
+ import './chunk-DD622QIQ.js';
21
21
  import './chunk-MVT5AF2A.js';
22
22
  import './chunk-Z653O7MX.js';
23
23
  import './chunk-ZCH7W7DZ.js';
@@ -28,16 +28,16 @@ import './chunk-7V36I5GT.js';
28
28
  import './chunk-6WI7R2BD.js';
29
29
  import './chunk-LFHYQ6AN.js';
30
30
  import './chunk-OAMIDZKW.js';
31
- import './chunk-JI6ZNE7R.js';
31
+ import './chunk-OFDFDY2F.js';
32
32
  import './chunk-OQIIJRAS.js';
33
33
  import './chunk-V2ZDTY6H.js';
34
- import './chunk-ZU7TSTT7.js';
34
+ import './chunk-NTOWUMLA.js';
35
35
  import { HookSlot } from './chunk-5XDPAKF5.js';
36
36
  import './chunk-GCPEMNSU.js';
37
- import './chunk-J5OJ7JM2.js';
37
+ import './chunk-RORNWRSU.js';
38
38
  import './chunk-Z5M4YYWT.js';
39
39
  import './chunk-TYNZ5B2B.js';
40
- import { LazyBreadcrumb } from './chunk-BBMRL2QU.js';
40
+ import { LazyBreadcrumb } from './chunk-CTPYM52J.js';
41
41
  import './chunk-AXW67SY7.js';
42
42
  import './chunk-BYMOPN2S.js';
43
43
  import './chunk-SKLEJJ6M.js';
@@ -69,5 +69,5 @@ function LoyaltyPage({ page }) {
69
69
  }
70
70
 
71
71
  export { LoyaltyPage };
72
- //# sourceMappingURL=LoyaltyPage-TE5E3OJC.js.map
73
- //# sourceMappingURL=LoyaltyPage-TE5E3OJC.js.map
72
+ //# sourceMappingURL=LoyaltyPage-MUMMZ37S.js.map
73
+ //# sourceMappingURL=LoyaltyPage-MUMMZ37S.js.map