@salla.sa/twilight-theme-engine 1.0.121 → 1.0.123

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 (270) hide show
  1. package/dist/{AddToCartForm-IBFOXI5E.js → AddToCartForm-VFCTMUDL.js} +3 -3
  2. package/dist/{AddToCartForm-IBFOXI5E.js.map → AddToCartForm-VFCTMUDL.js.map} +1 -1
  3. package/dist/{BlogAuthorPage-J546AKLR.js → BlogAuthorPage-QVHRFMBQ.js} +18 -17
  4. package/dist/BlogAuthorPage-QVHRFMBQ.js.map +1 -0
  5. package/dist/{BlogCategoryPage-OSPLRNKU.js → BlogCategoryPage-BP5WIW7X.js} +18 -17
  6. package/dist/BlogCategoryPage-BP5WIW7X.js.map +1 -0
  7. package/dist/{BlogPage-WGJWGZG3.js → BlogPage-YUZCR2YV.js} +16 -15
  8. package/dist/BlogPage-YUZCR2YV.js.map +1 -0
  9. package/dist/{BlogSinglePage-W2F7VH5G.js → BlogSinglePage-BJHC7DVC.js} +16 -15
  10. package/dist/BlogSinglePage-BJHC7DVC.js.map +1 -0
  11. package/dist/{BlogTagPage-RRVZ7ZG7.js → BlogTagPage-ND5KMCZZ.js} +18 -17
  12. package/dist/BlogTagPage-ND5KMCZZ.js.map +1 -0
  13. package/dist/{BrandsPage-VVU7NIGH.js → BrandsPage-FGJBQBFL.js} +17 -16
  14. package/dist/BrandsPage-FGJBQBFL.js.map +1 -0
  15. package/dist/{Breadcrumb-SQOQLAWK.js → Breadcrumb-2LPY6KHS.js} +16 -15
  16. package/dist/Breadcrumb-2LPY6KHS.js.map +1 -0
  17. package/dist/{CartItem-JFT72XAH.js → CartItem-UQF332H4.js} +16 -15
  18. package/dist/CartItem-UQF332H4.js.map +1 -0
  19. package/dist/{CartSummary-V72EGJAH.js → CartSummary-FV3I7CJV.js} +16 -15
  20. package/dist/CartSummary-FV3I7CJV.js.map +1 -0
  21. package/dist/{Copyright-4LUGL7KS.js → Copyright-AZHDEIJX.js} +3 -3
  22. package/dist/{Copyright-4LUGL7KS.js.map → Copyright-AZHDEIJX.js.map} +1 -1
  23. package/dist/{CustomerLayout-BLQZM3GR.js → CustomerLayout-DYA77OLE.js} +16 -15
  24. package/dist/CustomerLayout-DYA77OLE.js.map +1 -0
  25. package/dist/{Footer-KBU7XIM5.js → Footer-BCFWCWWI.js} +4 -4
  26. package/dist/{Footer-KBU7XIM5.js.map → Footer-BCFWCWWI.js.map} +1 -1
  27. package/dist/{Header-I6N5ULUM.js → Header-HALNPMED.js} +8 -8
  28. package/dist/{Header-I6N5ULUM.js.map → Header-HALNPMED.js.map} +1 -1
  29. package/dist/LiveEditorBar-6SKEWJOX.js +338 -0
  30. package/dist/LiveEditorBar-6SKEWJOX.js.map +1 -0
  31. package/dist/{LoyaltyPage-CTKA57XO.js → LoyaltyPage-LUQLKTDF.js} +16 -15
  32. package/dist/LoyaltyPage-LUQLKTDF.js.map +1 -0
  33. package/dist/{LoyaltyPointsPage-7LHAL3KB.js → LoyaltyPointsPage-LJLCJBLR.js} +6 -6
  34. package/dist/{LoyaltyPointsPage-7LHAL3KB.js.map → LoyaltyPointsPage-LJLCJBLR.js.map} +1 -1
  35. package/dist/{MainMenu-46I757B7.js → MainMenu-WPVP2XF6.js} +5 -5
  36. package/dist/{MainMenu-46I757B7.js.map → MainMenu-WPVP2XF6.js.map} +1 -1
  37. package/dist/{MasterLayout-UJCD626U.js → MasterLayout-UPFHTRV6.js} +16 -15
  38. package/dist/{MasterLayout-UJCD626U.js.map → MasterLayout-UPFHTRV6.js.map} +1 -1
  39. package/dist/{MobileMenu-E6KNAN6W.js → MobileMenu-KMTRWYHV.js} +17 -16
  40. package/dist/MobileMenu-KMTRWYHV.js.map +1 -0
  41. package/dist/{NotificationsPage-E7JWYOHQ.js → NotificationsPage-5GDS22E6.js} +16 -15
  42. package/dist/NotificationsPage-5GDS22E6.js.map +1 -0
  43. package/dist/{OrderSinglePage-E5CXFWHO.js → OrderSinglePage-EXVTMRJI.js} +17 -16
  44. package/dist/OrderSinglePage-EXVTMRJI.js.map +1 -0
  45. package/dist/{OrdersPage-IRLHRXRF.js → OrdersPage-JNIDVHV3.js} +16 -15
  46. package/dist/OrdersPage-JNIDVHV3.js.map +1 -0
  47. package/dist/{PageSingle-TJIE3K3X.js → PageSingle-KX5XSBWJ.js} +3 -3
  48. package/dist/{PageSingle-TJIE3K3X.js.map → PageSingle-KX5XSBWJ.js.map} +1 -1
  49. package/dist/{ProductDetails-DIAKASL7.js → ProductDetails-7EI5PTFY.js} +4 -4
  50. package/dist/{ProductDetails-DIAKASL7.js.map → ProductDetails-7EI5PTFY.js.map} +1 -1
  51. package/dist/{ProfilePage-A4DPAJJE.js → ProfilePage-6FSWT3RC.js} +16 -15
  52. package/dist/ProfilePage-6FSWT3RC.js.map +1 -0
  53. package/dist/{RenderWhenVisible-KWAXEJOJ.js → RenderWhenVisible-BQ7KVPHK.js} +5 -3
  54. package/dist/RenderWhenVisible-BQ7KVPHK.js.map +1 -0
  55. package/dist/{ReviewsPage-NMQGT3HF.js → ReviewsPage-2JSZHLPR.js} +3 -3
  56. package/dist/{ReviewsPage-NMQGT3HF.js.map → ReviewsPage-2JSZHLPR.js.map} +1 -1
  57. package/dist/{SeoCartWidget-LMXOG3M3.js → SeoCartWidget-2MI5P2RT.js} +16 -15
  58. package/dist/SeoCartWidget-2MI5P2RT.js.map +1 -0
  59. package/dist/{SettingsPage-7CZVRNC5.js → SettingsPage-BX3SZNO5.js} +16 -15
  60. package/dist/SettingsPage-BX3SZNO5.js.map +1 -0
  61. package/dist/{StoreClosedNotification-2IJACZGK.js → StoreClosedNotification-E7WEFZGO.js} +17 -16
  62. package/dist/{StoreClosedNotification-2IJACZGK.js.map → StoreClosedNotification-E7WEFZGO.js.map} +1 -1
  63. package/dist/{TestimonialsPage-5ZIV46PJ.js → TestimonialsPage-5OEZMBRF.js} +3 -3
  64. package/dist/{TestimonialsPage-5ZIV46PJ.js.map → TestimonialsPage-5OEZMBRF.js.map} +1 -1
  65. package/dist/{ThankYouPage-KBQ7YTUJ.js → ThankYouPage-3XJUFGSE.js} +16 -15
  66. package/dist/ThankYouPage-3XJUFGSE.js.map +1 -0
  67. package/dist/{WalletPage-LZXWUBMX.js → WalletPage-LUSSC5TL.js} +17 -16
  68. package/dist/WalletPage-LUSSC5TL.js.map +1 -0
  69. package/dist/{WishlistPage-O7AMVN6T.js → WishlistPage-JK2JLLMR.js} +18 -17
  70. package/dist/WishlistPage-JK2JLLMR.js.map +1 -0
  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-QQKVRJVR.js → chunk-2CORNDFS.js} +3 -3
  92. package/dist/{chunk-QQKVRJVR.js.map → chunk-2CORNDFS.js.map} +1 -1
  93. package/dist/{chunk-OGPRFIYJ.js → chunk-2Q6M3CE5.js} +3 -3
  94. package/dist/{chunk-OGPRFIYJ.js.map → chunk-2Q6M3CE5.js.map} +1 -1
  95. package/dist/{chunk-QGXFNKVO.js → chunk-36FXIFZ6.js} +4 -4
  96. package/dist/{chunk-QGXFNKVO.js.map → chunk-36FXIFZ6.js.map} +1 -1
  97. package/dist/{chunk-RE7D6VLE.js → chunk-3BCIBYJC.js} +3 -3
  98. package/dist/{chunk-RE7D6VLE.js.map → chunk-3BCIBYJC.js.map} +1 -1
  99. package/dist/{chunk-2FN3V65B.js → chunk-3BIT754E.js} +4 -4
  100. package/dist/{chunk-2FN3V65B.js.map → chunk-3BIT754E.js.map} +1 -1
  101. package/dist/{chunk-S67SWBZK.js → chunk-3L4TXBS7.js} +3 -3
  102. package/dist/{chunk-S67SWBZK.js.map → chunk-3L4TXBS7.js.map} +1 -1
  103. package/dist/{chunk-DYRZ7JXQ.js → chunk-4JNLIYCE.js} +3 -3
  104. package/dist/{chunk-DYRZ7JXQ.js.map → chunk-4JNLIYCE.js.map} +1 -1
  105. package/dist/{chunk-T2UNJOAM.js → chunk-4KRALUHW.js} +3 -3
  106. package/dist/{chunk-T2UNJOAM.js.map → chunk-4KRALUHW.js.map} +1 -1
  107. package/dist/{chunk-7OHV6ZVA.js → chunk-4X4FBQMO.js} +3 -3
  108. package/dist/{chunk-7OHV6ZVA.js.map → chunk-4X4FBQMO.js.map} +1 -1
  109. package/dist/{chunk-PM5W3ZXP.js → chunk-74PTCV46.js} +39 -16
  110. package/dist/chunk-74PTCV46.js.map +1 -0
  111. package/dist/{chunk-W6JJZYUY.js → chunk-AFERG34I.js} +7 -7
  112. package/dist/{chunk-W6JJZYUY.js.map → chunk-AFERG34I.js.map} +1 -1
  113. package/dist/{chunk-YB6M74XT.js → chunk-C4GXSAYT.js} +4 -4
  114. package/dist/{chunk-YB6M74XT.js.map → chunk-C4GXSAYT.js.map} +1 -1
  115. package/dist/chunk-DEY7MDGF.js +14 -0
  116. package/dist/{chunk-CPVIIWML.js.map → chunk-DEY7MDGF.js.map} +1 -1
  117. package/dist/{chunk-EBISPK5W.js → chunk-DPLMZQ2Q.js} +3 -3
  118. package/dist/{chunk-EBISPK5W.js.map → chunk-DPLMZQ2Q.js.map} +1 -1
  119. package/dist/{chunk-ASXBALNQ.js → chunk-EEZNB6HS.js} +4 -4
  120. package/dist/{chunk-ASXBALNQ.js.map → chunk-EEZNB6HS.js.map} +1 -1
  121. package/dist/{chunk-E6HKDJQU.js → chunk-EPPCSJGJ.js} +3 -3
  122. package/dist/{chunk-E6HKDJQU.js.map → chunk-EPPCSJGJ.js.map} +1 -1
  123. package/dist/{chunk-RL7CGNSG.js → chunk-ESZBWB7X.js} +3 -3
  124. package/dist/{chunk-RL7CGNSG.js.map → chunk-ESZBWB7X.js.map} +1 -1
  125. package/dist/{chunk-AFZY6VS5.js → chunk-FLTPDDL3.js} +7 -7
  126. package/dist/{chunk-AFZY6VS5.js.map → chunk-FLTPDDL3.js.map} +1 -1
  127. package/dist/{chunk-AKLPLYOV.js → chunk-FXYR563Z.js} +3 -3
  128. package/dist/{chunk-AKLPLYOV.js.map → chunk-FXYR563Z.js.map} +1 -1
  129. package/dist/{chunk-I4JJJWQH.js → chunk-G2BBB5AI.js} +3 -3
  130. package/dist/{chunk-I4JJJWQH.js.map → chunk-G2BBB5AI.js.map} +1 -1
  131. package/dist/{chunk-NJQPMELJ.js → chunk-HGEKTJVV.js} +4 -4
  132. package/dist/{chunk-NJQPMELJ.js.map → chunk-HGEKTJVV.js.map} +1 -1
  133. package/dist/{chunk-GMQK6UHZ.js → chunk-IMCS5L4A.js} +3 -3
  134. package/dist/{chunk-GMQK6UHZ.js.map → chunk-IMCS5L4A.js.map} +1 -1
  135. package/dist/{chunk-3Q2SY5EH.js → chunk-ISTESEV6.js} +7 -7
  136. package/dist/{chunk-3Q2SY5EH.js.map → chunk-ISTESEV6.js.map} +1 -1
  137. package/dist/{chunk-CZJAAIJB.js → chunk-ITXVKNO7.js} +4 -4
  138. package/dist/{chunk-CZJAAIJB.js.map → chunk-ITXVKNO7.js.map} +1 -1
  139. package/dist/{chunk-V3WF5VX4.js → chunk-IXZPQR4M.js} +5 -5
  140. package/dist/{chunk-V3WF5VX4.js.map → chunk-IXZPQR4M.js.map} +1 -1
  141. package/dist/{chunk-D6XHL6VQ.js → chunk-KQEBYXYB.js} +121 -3
  142. package/dist/chunk-KQEBYXYB.js.map +1 -0
  143. package/dist/{chunk-DOWFJOQD.js → chunk-MDJK7WHN.js} +4 -4
  144. package/dist/{chunk-DOWFJOQD.js.map → chunk-MDJK7WHN.js.map} +1 -1
  145. package/dist/{chunk-ZDHYST5S.js → chunk-MQLMYMEQ.js} +3 -3
  146. package/dist/{chunk-ZDHYST5S.js.map → chunk-MQLMYMEQ.js.map} +1 -1
  147. package/dist/{chunk-NSTH6ZQQ.js → chunk-N67C5QRH.js} +4 -4
  148. package/dist/{chunk-NSTH6ZQQ.js.map → chunk-N67C5QRH.js.map} +1 -1
  149. package/dist/chunk-PDIFXQDX.js +63 -0
  150. package/dist/chunk-PDIFXQDX.js.map +1 -0
  151. package/dist/{chunk-GMR6IV4N.js → chunk-PGXS2QT5.js} +3 -3
  152. package/dist/{chunk-GMR6IV4N.js.map → chunk-PGXS2QT5.js.map} +1 -1
  153. package/dist/{chunk-VAOQ3WQ3.js → chunk-S5FRM4TG.js} +6 -6
  154. package/dist/{chunk-VAOQ3WQ3.js.map → chunk-S5FRM4TG.js.map} +1 -1
  155. package/dist/{chunk-2VLLOUXA.js → chunk-SLXTJLF2.js} +4 -4
  156. package/dist/{chunk-2VLLOUXA.js.map → chunk-SLXTJLF2.js.map} +1 -1
  157. package/dist/{chunk-H52RC2CC.js → chunk-UBNOFV7C.js} +3 -3
  158. package/dist/{chunk-H52RC2CC.js.map → chunk-UBNOFV7C.js.map} +1 -1
  159. package/dist/{chunk-ONYYMIHL.js → chunk-WAZYTMTB.js} +3 -3
  160. package/dist/{chunk-ONYYMIHL.js.map → chunk-WAZYTMTB.js.map} +1 -1
  161. package/dist/{chunk-65HHD72A.js → chunk-XJJMGLHB.js} +9 -6
  162. package/dist/chunk-XJJMGLHB.js.map +1 -0
  163. package/dist/{chunk-K35YWUL5.js → chunk-XK5CEGKA.js} +4 -4
  164. package/dist/{chunk-K35YWUL5.js.map → chunk-XK5CEGKA.js.map} +1 -1
  165. package/dist/{chunk-XNEH22HY.js → chunk-Y2OC2467.js} +44 -11
  166. package/dist/chunk-Y2OC2467.js.map +1 -0
  167. package/dist/{chunk-I4DX2ETY.js → chunk-YPEWTS4L.js} +4 -4
  168. package/dist/{chunk-I4DX2ETY.js.map → chunk-YPEWTS4L.js.map} +1 -1
  169. package/dist/{chunk-F4KI6OHA.js → chunk-Z43BQ7ZH.js} +4 -4
  170. package/dist/{chunk-F4KI6OHA.js.map → chunk-Z43BQ7ZH.js.map} +1 -1
  171. package/dist/{chunk-YOOCN2ZQ.js → chunk-ZTY326ZR.js} +3 -3
  172. package/dist/{chunk-YOOCN2ZQ.js.map → chunk-ZTY326ZR.js.map} +1 -1
  173. package/dist/components/cart/index.js +1 -1
  174. package/dist/components/common/RenderWhenVisible.d.ts +3 -1
  175. package/dist/components/common/RenderWhenVisible.d.ts.map +1 -1
  176. package/dist/components/common/index.js +1 -1
  177. package/dist/components/common/lazy.d.ts +1 -1
  178. package/dist/components/common/lazy.d.ts.map +1 -1
  179. package/dist/components/drawer/index.js +14 -13
  180. package/dist/components/home/HomePageRenderer.d.ts.map +1 -1
  181. package/dist/components/home/index.js +18 -17
  182. package/dist/components/layout/index.js +4 -4
  183. package/dist/components/live-editor/LiveEditorBar.d.ts +11 -0
  184. package/dist/components/live-editor/LiveEditorBar.d.ts.map +1 -0
  185. package/dist/components/live-editor/frame.d.ts +34 -0
  186. package/dist/components/live-editor/frame.d.ts.map +1 -0
  187. package/dist/components/live-editor/index.d.ts +9 -0
  188. package/dist/components/live-editor/index.d.ts.map +1 -0
  189. package/dist/components/product/index.js +15 -14
  190. package/dist/components/snippets/AppsSnippets.d.ts.map +1 -1
  191. package/dist/components/store/index.js +15 -14
  192. package/dist/dev/editor/index.js +1 -1
  193. package/dist/dev/index.js +1 -1
  194. package/dist/{document-class-5D33WMFO.js → document-class-LQ6CAJYV.js} +12 -12
  195. package/dist/{document-class-5D33WMFO.js.map → document-class-LQ6CAJYV.js.map} +1 -1
  196. package/dist/hooks/index.js +14 -13
  197. package/dist/hooks/useGtm.js +14 -13
  198. package/dist/hooks/useMoney.js +14 -13
  199. package/dist/hooks/useStore.js +14 -13
  200. package/dist/hooks/useUser.js +3 -3
  201. package/dist/index.js +14 -13
  202. package/dist/index.js.map +1 -1
  203. package/dist/{navigation-N2LSXPNF.js → navigation-MEQGPFG2.js} +4 -4
  204. package/dist/{navigation-N2LSXPNF.js.map → navigation-MEQGPFG2.js.map} +1 -1
  205. package/dist/{navigation-VLZWFWOE.js → navigation-YFRK3OW2.js} +5 -5
  206. package/dist/{navigation-VLZWFWOE.js.map → navigation-YFRK3OW2.js.map} +1 -1
  207. package/dist/{not-found-AEXB5SXN.js → not-found-62H3K6KC.js} +17 -16
  208. package/dist/not-found-62H3K6KC.js.map +1 -0
  209. package/dist/providers/TwilightProvider.d.ts.map +1 -1
  210. package/dist/providers/index.js +14 -13
  211. package/dist/routes/account/orders.js +4 -4
  212. package/dist/routes/account.js +13 -13
  213. package/dist/routes/blog.js +8 -8
  214. package/dist/routes/brands.js +4 -4
  215. package/dist/routes/cart.js +22 -21
  216. package/dist/routes/cart.js.map +1 -1
  217. package/dist/routes/home.js +19 -18
  218. package/dist/routes/index.js +3 -3
  219. package/dist/routes/loyalty.js +5 -5
  220. package/dist/routes/page.js +4 -4
  221. package/dist/routes/product-listing.js +20 -19
  222. package/dist/routes/product-listing.js.map +1 -1
  223. package/dist/routes/product.js +18 -17
  224. package/dist/routes/product.js.map +1 -1
  225. package/dist/routes/seo-redirects.js +3 -3
  226. package/dist/routes/testimonials.js +2 -2
  227. package/dist/routes/thank-you.js +4 -4
  228. package/dist/skeleton.js +19 -18
  229. package/dist/{store-lookup-NKWMTTIE.js → store-lookup-HQYYF3ZS.js} +8 -8
  230. package/dist/{store-lookup-NKWMTTIE.js.map → store-lookup-HQYYF3ZS.js.map} +1 -1
  231. package/dist/tanstack/router.d.ts.map +1 -1
  232. package/dist/tanstack.js +12 -12
  233. package/dist/utils/index.js +2 -2
  234. package/dist/utils/snippet-page-compat.d.ts +43 -0
  235. package/dist/utils/snippet-page-compat.d.ts.map +1 -0
  236. package/package.json +1 -1
  237. package/tailwind/components/common/RenderWhenVisible.tsx.txt +4 -0
  238. package/tailwind/components/home/HomePageRenderer.tsx.txt +7 -0
  239. package/tailwind/components/live-editor/LiveEditorBar.tsx.txt +417 -0
  240. package/tailwind/components/live-editor/frame.ts.txt +97 -0
  241. package/tailwind/components/live-editor/index.tsx.txt +37 -0
  242. package/tailwind/components/snippets/AppsSnippets.tsx.txt +4 -0
  243. package/dist/BlogAuthorPage-J546AKLR.js.map +0 -1
  244. package/dist/BlogCategoryPage-OSPLRNKU.js.map +0 -1
  245. package/dist/BlogPage-WGJWGZG3.js.map +0 -1
  246. package/dist/BlogSinglePage-W2F7VH5G.js.map +0 -1
  247. package/dist/BlogTagPage-RRVZ7ZG7.js.map +0 -1
  248. package/dist/BrandsPage-VVU7NIGH.js.map +0 -1
  249. package/dist/Breadcrumb-SQOQLAWK.js.map +0 -1
  250. package/dist/CartItem-JFT72XAH.js.map +0 -1
  251. package/dist/CartSummary-V72EGJAH.js.map +0 -1
  252. package/dist/CustomerLayout-BLQZM3GR.js.map +0 -1
  253. package/dist/LoyaltyPage-CTKA57XO.js.map +0 -1
  254. package/dist/MobileMenu-E6KNAN6W.js.map +0 -1
  255. package/dist/NotificationsPage-E7JWYOHQ.js.map +0 -1
  256. package/dist/OrderSinglePage-E5CXFWHO.js.map +0 -1
  257. package/dist/OrdersPage-IRLHRXRF.js.map +0 -1
  258. package/dist/ProfilePage-A4DPAJJE.js.map +0 -1
  259. package/dist/RenderWhenVisible-KWAXEJOJ.js.map +0 -1
  260. package/dist/SeoCartWidget-LMXOG3M3.js.map +0 -1
  261. package/dist/SettingsPage-7CZVRNC5.js.map +0 -1
  262. package/dist/ThankYouPage-KBQ7YTUJ.js.map +0 -1
  263. package/dist/WalletPage-LZXWUBMX.js.map +0 -1
  264. package/dist/WishlistPage-O7AMVN6T.js.map +0 -1
  265. package/dist/chunk-65HHD72A.js.map +0 -1
  266. package/dist/chunk-CPVIIWML.js +0 -14
  267. package/dist/chunk-D6XHL6VQ.js.map +0 -1
  268. package/dist/chunk-PM5W3ZXP.js.map +0 -1
  269. package/dist/chunk-XNEH22HY.js.map +0 -1
  270. package/dist/not-found-AEXB5SXN.js.map +0 -1
@@ -0,0 +1,338 @@
1
+ import { areaOf, postToEditor, BLOCK_ATTRIBUTE, targetOf } from './chunk-PDIFXQDX.js';
2
+ import { useTranslation } from './chunk-TYNZ5B2B.js';
3
+ import './chunk-T72DAX7R.js';
4
+ import './chunk-DGUM43GV.js';
5
+ import { useState, useRef, useCallback, useEffect } from 'react';
6
+ import { createPortal } from 'react-dom';
7
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
8
+
9
+ var ACCENT = "#5dd5c4";
10
+ var LAYER = 2147483e3;
11
+ var BUSY_TIMEOUT_MS = 1e4;
12
+ var DOUBLE_CLICK_MS = 300;
13
+ var DEFAULT_LABELS = {
14
+ ar: {
15
+ edit: "\u062A\u0639\u062F\u064A\u0644",
16
+ hide: "\u0625\u062E\u0641\u0627\u0621",
17
+ moveup: "\u062A\u062D\u0631\u064A\u0643 \u0644\u0623\u0639\u0644\u0649",
18
+ movedown: "\u062A\u062D\u0631\u064A\u0643 \u0644\u0623\u0633\u0641\u0644",
19
+ duplicate: "\u062A\u0643\u0631\u0627\u0631",
20
+ add: "\u0625\u0636\u0627\u0641\u0629 \u0639\u0646\u0635\u0631",
21
+ delete: "\u062D\u0630\u0641",
22
+ header: "\u0631\u0623\u0633 \u0627\u0644\u0635\u0641\u062D\u0629",
23
+ footer: "\u0630\u064A\u0644 \u0627\u0644\u0635\u0641\u062D\u0629"
24
+ },
25
+ en: {
26
+ edit: "Edit",
27
+ hide: "Hide",
28
+ moveup: "Move up",
29
+ movedown: "Move down",
30
+ duplicate: "Duplicate",
31
+ add: "Add element",
32
+ delete: "Delete",
33
+ header: "Header",
34
+ footer: "Footer"
35
+ }
36
+ };
37
+ var BLOCK_ACTIONS = [
38
+ "edit",
39
+ "hide",
40
+ "moveup",
41
+ "movedown",
42
+ "duplicate",
43
+ "add",
44
+ "delete"
45
+ ];
46
+ var ICONS = {
47
+ edit: /* @__PURE__ */ jsxs(Fragment, { children: [
48
+ /* @__PURE__ */ jsx("path", { d: "M12 20h9" }),
49
+ /* @__PURE__ */ jsx("path", { d: "M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z" })
50
+ ] }),
51
+ hide: /* @__PURE__ */ jsxs(Fragment, { children: [
52
+ /* @__PURE__ */ jsx("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" }),
53
+ /* @__PURE__ */ jsx("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" }),
54
+ /* @__PURE__ */ jsx("path", { d: "M9.88 9.88a3 3 0 1 0 4.24 4.24" }),
55
+ /* @__PURE__ */ jsx("path", { d: "m2 2 20 20" })
56
+ ] }),
57
+ moveup: /* @__PURE__ */ jsx("path", { d: "m18 15-6-6-6 6" }),
58
+ movedown: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" }),
59
+ duplicate: /* @__PURE__ */ jsxs(Fragment, { children: [
60
+ /* @__PURE__ */ jsx("rect", { x: "8", y: "8", width: "14", height: "14", rx: "2" }),
61
+ /* @__PURE__ */ jsx("path", { d: "M4 16a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2" })
62
+ ] }),
63
+ add: /* @__PURE__ */ jsx("path", { d: "M12 5v14M5 12h14" }),
64
+ delete: /* @__PURE__ */ jsxs(Fragment, { children: [
65
+ /* @__PURE__ */ jsx("path", { d: "M3 6h18" }),
66
+ /* @__PURE__ */ jsx("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6" }),
67
+ /* @__PURE__ */ jsx("path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" })
68
+ ] })
69
+ };
70
+ var OUTLINE = {
71
+ position: "fixed",
72
+ zIndex: LAYER,
73
+ pointerEvents: "none",
74
+ boxSizing: "border-box",
75
+ border: `2px solid ${ACCENT}`
76
+ };
77
+ var CHIP = {
78
+ position: "absolute",
79
+ top: 0,
80
+ insetInlineStart: 0,
81
+ padding: "4px 12px",
82
+ background: ACCENT,
83
+ color: "#0f172a",
84
+ font: "500 14px/1.4 system-ui, sans-serif",
85
+ whiteSpace: "nowrap"
86
+ };
87
+ var BAR = {
88
+ position: "fixed",
89
+ zIndex: LAYER + 1,
90
+ display: "flex",
91
+ gap: 4,
92
+ padding: 6,
93
+ background: "#fff",
94
+ borderRadius: 8,
95
+ boxShadow: "0 4px 16px rgba(15, 23, 42, 0.18)",
96
+ transform: "translateX(-50%)"
97
+ };
98
+ function buttonStyle(action, disabled) {
99
+ return {
100
+ display: "flex",
101
+ alignItems: "center",
102
+ justifyContent: "center",
103
+ gap: 6,
104
+ minWidth: 36,
105
+ height: 36,
106
+ padding: "0 8px",
107
+ border: 0,
108
+ borderRadius: 6,
109
+ background: "transparent",
110
+ color: action === "delete" ? "#e11d48" : action === "edit" ? "#0d9488" : "#475569",
111
+ font: "500 14px/1 system-ui, sans-serif",
112
+ cursor: disabled ? "default" : "pointer",
113
+ opacity: disabled ? 0.35 : 1
114
+ };
115
+ }
116
+ function Icon({ children }) {
117
+ return /* @__PURE__ */ jsx(
118
+ "svg",
119
+ {
120
+ width: "18",
121
+ height: "18",
122
+ viewBox: "0 0 24 24",
123
+ fill: "none",
124
+ stroke: "currentColor",
125
+ strokeWidth: "2",
126
+ strokeLinecap: "round",
127
+ strokeLinejoin: "round",
128
+ "aria-hidden": "true",
129
+ children
130
+ }
131
+ );
132
+ }
133
+ function blockSiblings(el) {
134
+ const parent = el.parentElement;
135
+ if (!parent) return [el];
136
+ return Array.from(parent.children).filter(
137
+ (child) => child instanceof HTMLElement && child.hasAttribute(BLOCK_ATTRIBUTE)
138
+ );
139
+ }
140
+ function connected(el) {
141
+ return el?.isConnected ? el : null;
142
+ }
143
+ function useLayoutTick(active) {
144
+ const [, setTick] = useState(0);
145
+ useEffect(() => {
146
+ if (!active) return;
147
+ let frame = 0;
148
+ const schedule = () => {
149
+ cancelAnimationFrame(frame);
150
+ frame = requestAnimationFrame(() => setTick((n) => n + 1));
151
+ };
152
+ window.addEventListener("scroll", schedule, { capture: true, passive: true });
153
+ window.addEventListener("resize", schedule);
154
+ const observer = typeof ResizeObserver !== "undefined" ? new ResizeObserver(schedule) : null;
155
+ observer?.observe(document.body);
156
+ return () => {
157
+ cancelAnimationFrame(frame);
158
+ window.removeEventListener("scroll", schedule, { capture: true });
159
+ window.removeEventListener("resize", schedule);
160
+ observer?.disconnect();
161
+ };
162
+ }, [active]);
163
+ }
164
+ function useLabels() {
165
+ const { t, i18n } = useTranslation();
166
+ const defaults = i18n?.language?.startsWith("ar") ? DEFAULT_LABELS.ar : DEFAULT_LABELS.en;
167
+ return Object.fromEntries(
168
+ Object.keys(defaults).map((key) => [
169
+ key,
170
+ t(`blocks.live_editor.${key}`, { defaultValue: defaults[key] })
171
+ ])
172
+ );
173
+ }
174
+ function useHeldLinkClicks(barRef) {
175
+ useEffect(() => {
176
+ let held = null;
177
+ let replaying = false;
178
+ const onClick = (event) => {
179
+ if (replaying || event.button !== 0) return;
180
+ if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
181
+ if (barRef.current?.contains(event.target)) return;
182
+ const link = event.target instanceof Element ? event.target.closest("a[href]") : null;
183
+ if (!(link instanceof HTMLAnchorElement) || !targetOf(link)) return;
184
+ event.preventDefault();
185
+ event.stopPropagation();
186
+ const previous = held;
187
+ if (previous) {
188
+ window.clearTimeout(previous.timer);
189
+ held = null;
190
+ if (previous.link === link) return;
191
+ }
192
+ const timer = window.setTimeout(() => {
193
+ held = null;
194
+ replaying = true;
195
+ link.click();
196
+ replaying = false;
197
+ }, DOUBLE_CLICK_MS);
198
+ held = { link, timer };
199
+ };
200
+ document.addEventListener("click", onClick, true);
201
+ return () => {
202
+ document.removeEventListener("click", onClick, true);
203
+ if (held) window.clearTimeout(held.timer);
204
+ };
205
+ }, [barRef]);
206
+ }
207
+ function Outline({ el, label }) {
208
+ const rect = el.getBoundingClientRect();
209
+ return /* @__PURE__ */ jsx(
210
+ "div",
211
+ {
212
+ "data-testid": "live-editor-outline",
213
+ style: { ...OUTLINE, top: rect.top, left: rect.left, width: rect.width, height: rect.height },
214
+ children: label && /* @__PURE__ */ jsx("span", { style: CHIP, children: label })
215
+ }
216
+ );
217
+ }
218
+ function Toolbar({ target, labels, busy, barRef, onAct }) {
219
+ const rect = target.getBoundingClientRect();
220
+ const style = {
221
+ ...BAR,
222
+ top: Math.max(rect.top + 8, 8),
223
+ left: rect.left + rect.width / 2
224
+ };
225
+ if (areaOf(target)) {
226
+ return /* @__PURE__ */ jsx("div", { ref: barRef, "data-testid": "live-editor-bar", style, children: /* @__PURE__ */ jsxs(
227
+ "button",
228
+ {
229
+ type: "button",
230
+ "data-testid": "live-editor-edit",
231
+ style: buttonStyle("area", false),
232
+ onClick: () => onAct(target, "edit"),
233
+ children: [
234
+ /* @__PURE__ */ jsx(Icon, { children: ICONS.edit }),
235
+ labels.edit
236
+ ]
237
+ }
238
+ ) });
239
+ }
240
+ const siblings = blockSiblings(target);
241
+ const index = siblings.indexOf(target);
242
+ const isDisabled = (action) => busy !== null || action === "moveup" && index <= 0 || action === "movedown" && index >= siblings.length - 1;
243
+ return /* @__PURE__ */ jsx(
244
+ "div",
245
+ {
246
+ ref: barRef,
247
+ "data-testid": "live-editor-bar",
248
+ role: "toolbar",
249
+ "aria-label": labels.edit,
250
+ style,
251
+ children: BLOCK_ACTIONS.map((action) => /* @__PURE__ */ jsx(
252
+ "button",
253
+ {
254
+ type: "button",
255
+ "data-testid": `live-editor-${action}`,
256
+ title: labels[action],
257
+ "aria-label": labels[action],
258
+ "aria-busy": busy === action || void 0,
259
+ disabled: isDisabled(action),
260
+ style: buttonStyle(action, isDisabled(action)),
261
+ onClick: () => onAct(target, action),
262
+ children: /* @__PURE__ */ jsx(Icon, { children: ICONS[action] })
263
+ },
264
+ action
265
+ ))
266
+ }
267
+ );
268
+ }
269
+ function LiveEditorBar({ origin }) {
270
+ const [hovered, setHovered] = useState(null);
271
+ const [editing, setEditing] = useState(null);
272
+ const [busy, setBusy] = useState(null);
273
+ const barRef = useRef(null);
274
+ const [host, setHost] = useState(null);
275
+ const labels = useLabels();
276
+ useHeldLinkClicks(barRef);
277
+ const act = useCallback(
278
+ (el, action) => {
279
+ const area = areaOf(el);
280
+ if (area) {
281
+ postToEditor(origin, `preview::edit.${area}`, { id: `store-${area}` });
282
+ setEditing(el);
283
+ return;
284
+ }
285
+ const id = el.getAttribute(BLOCK_ATTRIBUTE);
286
+ if (!id) return;
287
+ postToEditor(origin, `preview::${action}.component`, { id });
288
+ if (action === "edit") setEditing(el);
289
+ else if (action === "hide" || action === "duplicate" || action === "delete") setBusy(action);
290
+ },
291
+ [origin]
292
+ );
293
+ useEffect(() => {
294
+ const onOver = (event) => {
295
+ if (barRef.current?.contains(event.target)) return;
296
+ setHovered(targetOf(event.target));
297
+ };
298
+ const onOut = (event) => {
299
+ if (!event.relatedTarget) setHovered(null);
300
+ };
301
+ const onDoubleClick = (event) => {
302
+ if (barRef.current?.contains(event.target)) return;
303
+ const el = targetOf(event.target);
304
+ if (el) act(el, "edit");
305
+ };
306
+ document.addEventListener("mouseover", onOver);
307
+ document.addEventListener("mouseout", onOut);
308
+ document.addEventListener("dblclick", onDoubleClick);
309
+ return () => {
310
+ document.removeEventListener("mouseover", onOver);
311
+ document.removeEventListener("mouseout", onOut);
312
+ document.removeEventListener("dblclick", onDoubleClick);
313
+ };
314
+ }, [act]);
315
+ useEffect(() => setHost(document.body), []);
316
+ useEffect(() => {
317
+ if (!busy) return;
318
+ const timer = window.setTimeout(() => setBusy(null), BUSY_TIMEOUT_MS);
319
+ return () => window.clearTimeout(timer);
320
+ }, [busy]);
321
+ const target = connected(hovered);
322
+ const selected = connected(editing);
323
+ useLayoutTick(Boolean(target || selected));
324
+ if (!host || !target && !selected) return null;
325
+ const targetArea = target ? areaOf(target) : null;
326
+ return createPortal(
327
+ /* @__PURE__ */ jsxs(Fragment, { children: [
328
+ selected && selected !== target && /* @__PURE__ */ jsx(Outline, { el: selected }),
329
+ target && /* @__PURE__ */ jsx(Outline, { el: target, label: targetArea ? labels[targetArea] : void 0 }),
330
+ target && /* @__PURE__ */ jsx(Toolbar, { target, labels, busy, barRef, onAct: act })
331
+ ] }),
332
+ host
333
+ );
334
+ }
335
+
336
+ export { LiveEditorBar };
337
+ //# sourceMappingURL=LiveEditorBar-6SKEWJOX.js.map
338
+ //# sourceMappingURL=LiveEditorBar-6SKEWJOX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/live-editor/LiveEditorBar.tsx"],"names":[],"mappings":"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","file":"LiveEditorBar-6SKEWJOX.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 } from 'react-dom';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { BLOCK_ATTRIBUTE, areaOf, postToEditor, targetOf, type BlockAction } from './frame';\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\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\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\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. */\nfunction useLayoutTick(active: boolean): void {\n const [, setTick] = useState(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}\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 = el.getBoundingClientRect();\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 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, onAct }: ToolbarProps) {\n const rect = target.getBoundingClientRect();\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 {BLOCK_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 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 */\nexport function LiveEditorBar({ origin }: { origin: string }): 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\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 postToEditor(origin, `preview::${action}.component`, { id });\n if (action === 'edit') setEditing(el);\n else if (action === 'hide' || action === 'duplicate' || action === 'delete') setBusy(action);\n },\n [origin]\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 const target = connected(hovered);\n const selected = connected(editing);\n useLayoutTick(Boolean(target || selected));\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 target={target} labels={labels} busy={busy} barRef={barRef} onAct={act} />\n )}\n </>,\n host\n );\n}\n"]}
@@ -1,21 +1,22 @@
1
- import './chunk-PM5W3ZXP.js';
2
- import './chunk-3Q2SY5EH.js';
3
- import './chunk-I4JJJWQH.js';
4
- import './chunk-D6XHL6VQ.js';
1
+ import './chunk-74PTCV46.js';
2
+ import './chunk-PDIFXQDX.js';
3
+ import './chunk-ISTESEV6.js';
4
+ import './chunk-G2BBB5AI.js';
5
+ import './chunk-KQEBYXYB.js';
5
6
  import './chunk-JYV25VNZ.js';
6
- import './chunk-E6HKDJQU.js';
7
+ import './chunk-EPPCSJGJ.js';
7
8
  import './chunk-OXMUPNMH.js';
8
- import './chunk-GMR6IV4N.js';
9
+ import './chunk-PGXS2QT5.js';
9
10
  import './chunk-VVZNW5CB.js';
10
11
  import './chunk-5FJFN3IW.js';
11
12
  import './chunk-GD26FI4J.js';
12
13
  import './chunk-OM2GRPDH.js';
13
- import './chunk-H52RC2CC.js';
14
+ import './chunk-UBNOFV7C.js';
14
15
  import './chunk-OUW6WESU.js';
15
16
  import './chunk-BK5TBUGG.js';
16
17
  import './chunk-HI5V5X3S.js';
17
- import './chunk-ONYYMIHL.js';
18
- import './chunk-OGPRFIYJ.js';
18
+ import './chunk-WAZYTMTB.js';
19
+ import './chunk-2Q6M3CE5.js';
19
20
  import './chunk-MVT5AF2A.js';
20
21
  import './chunk-Z653O7MX.js';
21
22
  import './chunk-ZCH7W7DZ.js';
@@ -26,15 +27,15 @@ import './chunk-7V36I5GT.js';
26
27
  import './chunk-6WI7R2BD.js';
27
28
  import './chunk-JGVEGQHJ.js';
28
29
  import './chunk-OAMIDZKW.js';
29
- import './chunk-EBISPK5W.js';
30
+ import './chunk-DPLMZQ2Q.js';
30
31
  import './chunk-OQIIJRAS.js';
31
32
  import './chunk-V2ZDTY6H.js';
32
- import './chunk-DYRZ7JXQ.js';
33
+ import './chunk-4JNLIYCE.js';
33
34
  import { HookSlot } from './chunk-5XDPAKF5.js';
34
35
  import './chunk-GCPEMNSU.js';
35
- import './chunk-GMQK6UHZ.js';
36
+ import './chunk-IMCS5L4A.js';
36
37
  import './chunk-TYNZ5B2B.js';
37
- import { LazyBreadcrumb } from './chunk-NSTH6ZQQ.js';
38
+ import { LazyBreadcrumb } from './chunk-N67C5QRH.js';
38
39
  import './chunk-AXW67SY7.js';
39
40
  import './chunk-BYMOPN2S.js';
40
41
  import './chunk-SKLEJJ6M.js';
@@ -65,5 +66,5 @@ function LoyaltyPage({ page }) {
65
66
  }
66
67
 
67
68
  export { LoyaltyPage };
68
- //# sourceMappingURL=LoyaltyPage-CTKA57XO.js.map
69
- //# sourceMappingURL=LoyaltyPage-CTKA57XO.js.map
69
+ //# sourceMappingURL=LoyaltyPage-LUQLKTDF.js.map
70
+ //# sourceMappingURL=LoyaltyPage-LUQLKTDF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/routes/loyalty/LoyaltyPage.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKO,SAAS,WAAA,CAAY,EAAE,IAAA,EAAK,EAAqB;AACtD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,MAAK,eAAA,EAAgB,CAAA;AAAA,oBAC/B,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,kBAAW,IAAA,EAAY,CAAA;AAAA,0BACvB,mBAAA,EAAA,EAAoB;AAAA,KAAA,EACvB,CAAA;AAAA,oBACA,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,aAAA,EAAc;AAAA,GAAA,EAC/B,CAAA;AAEJ","file":"LoyaltyPage-LUQLKTDF.js","sourcesContent":["import { SallaLoyaltyProgram } from '@salla.sa/twilight-components-react/loyalty-program';\nimport type { LoyaltyPageProps } from './types';\nimport { Breadcrumb } from '../../components/common';\nimport { HookSlot } from '../../hooks';\n\nexport function LoyaltyPage({ page }: LoyaltyPageProps) {\n return (\n <>\n <HookSlot name=\"loyalty:start\" />\n <div className=\"container mb-20\">\n <Breadcrumb page={page} />\n <SallaLoyaltyProgram />\n </div>\n <HookSlot name=\"loyalty:end\" />\n </>\n );\n}\n"]}
@@ -1,11 +1,11 @@
1
- import { LazyCustomerLayout } from './chunk-W6JJZYUY.js';
2
- import './chunk-EBISPK5W.js';
1
+ import { LazyCustomerLayout } from './chunk-AFERG34I.js';
2
+ import './chunk-DPLMZQ2Q.js';
3
3
  import './chunk-OQIIJRAS.js';
4
4
  import './chunk-V2ZDTY6H.js';
5
- import './chunk-DYRZ7JXQ.js';
5
+ import './chunk-4JNLIYCE.js';
6
6
  import './chunk-5XDPAKF5.js';
7
7
  import './chunk-GCPEMNSU.js';
8
- import './chunk-GMQK6UHZ.js';
8
+ import './chunk-IMCS5L4A.js';
9
9
  import './chunk-TYNZ5B2B.js';
10
10
  import './chunk-GYXUYHKO.js';
11
11
  import './chunk-FHU2MXZA.js';
@@ -21,5 +21,5 @@ function LoyaltyPointsPage({ page }) {
21
21
  }
22
22
 
23
23
  export { LoyaltyPointsPage };
24
- //# sourceMappingURL=LoyaltyPointsPage-7LHAL3KB.js.map
25
- //# sourceMappingURL=LoyaltyPointsPage-7LHAL3KB.js.map
24
+ //# sourceMappingURL=LoyaltyPointsPage-LJLCJBLR.js.map
25
+ //# sourceMappingURL=LoyaltyPointsPage-LJLCJBLR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/routes/loyalty/LoyaltyPointsPage.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAIO,SAAS,iBAAA,CAAkB,EAAE,IAAA,EAAK,EAA2B;AAClE,EAAA,uBACE,GAAA,CAAC,kBAAA,EAAA,EAAe,IAAA,EACd,QAAA,kBAAA,GAAA,CAAC,6BAA0B,CAAA,EAC7B,CAAA;AAEJ","file":"LoyaltyPointsPage-7LHAL3KB.js","sourcesContent":["import { SallaLoyaltyPointsHistory } from '@salla.sa/twilight-components-react/loyalty-points-history';\nimport type { LoyaltyPointsPageProps } from './types';\nimport { CustomerLayout } from '../../components/layout';\n\nexport function LoyaltyPointsPage({ page }: LoyaltyPointsPageProps) {\n return (\n <CustomerLayout page={page}>\n <SallaLoyaltyPointsHistory />\n </CustomerLayout>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/routes/loyalty/LoyaltyPointsPage.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAIO,SAAS,iBAAA,CAAkB,EAAE,IAAA,EAAK,EAA2B;AAClE,EAAA,uBACE,GAAA,CAAC,kBAAA,EAAA,EAAe,IAAA,EACd,QAAA,kBAAA,GAAA,CAAC,6BAA0B,CAAA,EAC7B,CAAA;AAEJ","file":"LoyaltyPointsPage-LJLCJBLR.js","sourcesContent":["import { SallaLoyaltyPointsHistory } from '@salla.sa/twilight-components-react/loyalty-points-history';\nimport type { LoyaltyPointsPageProps } from './types';\nimport { CustomerLayout } from '../../components/layout';\n\nexport function LoyaltyPointsPage({ page }: LoyaltyPointsPageProps) {\n return (\n <CustomerLayout page={page}>\n <SallaLoyaltyPointsHistory />\n </CustomerLayout>\n );\n}\n"]}
@@ -1,7 +1,7 @@
1
- import { menu } from './chunk-YOOCN2ZQ.js';
2
- import './chunk-GMQK6UHZ.js';
1
+ import { menu } from './chunk-ZTY326ZR.js';
2
+ import './chunk-IMCS5L4A.js';
3
3
  import { useTranslation } from './chunk-TYNZ5B2B.js';
4
- import './chunk-NSTH6ZQQ.js';
4
+ import './chunk-N67C5QRH.js';
5
5
  import { Link } from './chunk-AXW67SY7.js';
6
6
  import './chunk-BYMOPN2S.js';
7
7
  import './chunk-SKLEJJ6M.js';
@@ -68,5 +68,5 @@ function MainMenu() {
68
68
  }
69
69
 
70
70
  export { MainMenu };
71
- //# sourceMappingURL=MainMenu-46I757B7.js.map
72
- //# sourceMappingURL=MainMenu-46I757B7.js.map
71
+ //# sourceMappingURL=MainMenu-WPVP2XF6.js.map
72
+ //# sourceMappingURL=MainMenu-WPVP2XF6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/navigation/MainMenu.tsx"],"names":["MainMenuSkeleton"],"mappings":"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","file":"MainMenu-46I757B7.js","sourcesContent":["import { useMemo, memo } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useTwilight } from '../../providers/twilight-context';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { Link } from '../common';\nimport { menu } from '../../api/menu';\nimport type { MenuItem } from '../../types';\n\nconst SKELETON_ITEMS = [\n { id: 'first', width: 'w-16' },\n { id: 'second', width: 'w-20' },\n { id: 'third', width: 'w-24' },\n { id: 'fourth', width: 'w-16' },\n { id: 'fifth', width: 'w-20' },\n];\n\nconst MainMenuSkeleton = memo(function MainMenuSkeleton() {\n return (\n <nav>\n <ul className=\"main-menu\">\n {SKELETON_ITEMS.map(({ id, width }) => (\n <li key={id} className=\"!hidden lg:!block root-level\">\n <Link to=\"#\">\n <span className={`inline-block animate-pulse rounded bg-gray-200 h-4 ${width}`} />\n </Link>\n </li>\n ))}\n </ul>\n </nav>\n );\n});\n\nexport function MainMenu() {\n const { theme } = useTwilight();\n const { data: menus = [], isLoading } = useQuery(menu.queries.header());\n const { t } = useTranslation();\n\n const { visibleMenus, hiddenMenus } = useMemo(() => {\n const enableMore = theme?.settings?.is_more_button_enabled;\n const visibleCount = 7;\n\n if (enableMore && menus.length > visibleCount) {\n return {\n visibleMenus: menus.slice(0, visibleCount),\n hiddenMenus: menus.slice(visibleCount),\n };\n }\n\n return { visibleMenus: menus, hiddenMenus: [] };\n }, [menus, theme?.settings?.enable_more_menu, theme?.settings?.is_more_button_enabled]);\n\n if (isLoading) {\n return <MainMenuSkeleton />;\n }\n\n const renderItem = (item: MenuItem, isChild = false, inMoreMenu = false) => {\n const hasChildren = item.has_children && item.children && item.children.length > 0;\n const showDropdown = hasChildren && !inMoreMenu;\n\n return (\n <li\n key={item.id}\n className={`${isChild ? 'relative' : '!hidden lg:!block root-level'} ${hasChildren ? 'has-children' : ''}`}\n >\n <Link to={item.url}>\n <span>{item.title}</span>\n </Link>\n {showDropdown && (\n <div className=\"sub-menu w-56\">\n <ul>{item?.children?.map((child: MenuItem) => renderItem(child, true))}</ul>\n </div>\n )}\n </li>\n );\n };\n\n return (\n <nav>\n <ul className=\"main-menu\">\n {visibleMenus.map((item) => renderItem(item))}\n {hiddenMenus.length > 0 && (\n <li id=\"more-menu-dropdown\" className=\"!hidden lg:!block root-level has-children\">\n <Link to=\"#\">\n <span>{t('common.titles.more', 'More')}</span>\n </Link>\n <div className=\"sub-menu w-56\">\n <ul>{hiddenMenus.map((item) => renderItem(item, true, true))}</ul>\n </div>\n </li>\n )}\n </ul>\n </nav>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/navigation/MainMenu.tsx"],"names":["MainMenuSkeleton"],"mappings":"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","file":"MainMenu-WPVP2XF6.js","sourcesContent":["import { useMemo, memo } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useTwilight } from '../../providers/twilight-context';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { Link } from '../common';\nimport { menu } from '../../api/menu';\nimport type { MenuItem } from '../../types';\n\nconst SKELETON_ITEMS = [\n { id: 'first', width: 'w-16' },\n { id: 'second', width: 'w-20' },\n { id: 'third', width: 'w-24' },\n { id: 'fourth', width: 'w-16' },\n { id: 'fifth', width: 'w-20' },\n];\n\nconst MainMenuSkeleton = memo(function MainMenuSkeleton() {\n return (\n <nav>\n <ul className=\"main-menu\">\n {SKELETON_ITEMS.map(({ id, width }) => (\n <li key={id} className=\"!hidden lg:!block root-level\">\n <Link to=\"#\">\n <span className={`inline-block animate-pulse rounded bg-gray-200 h-4 ${width}`} />\n </Link>\n </li>\n ))}\n </ul>\n </nav>\n );\n});\n\nexport function MainMenu() {\n const { theme } = useTwilight();\n const { data: menus = [], isLoading } = useQuery(menu.queries.header());\n const { t } = useTranslation();\n\n const { visibleMenus, hiddenMenus } = useMemo(() => {\n const enableMore = theme?.settings?.is_more_button_enabled;\n const visibleCount = 7;\n\n if (enableMore && menus.length > visibleCount) {\n return {\n visibleMenus: menus.slice(0, visibleCount),\n hiddenMenus: menus.slice(visibleCount),\n };\n }\n\n return { visibleMenus: menus, hiddenMenus: [] };\n }, [menus, theme?.settings?.enable_more_menu, theme?.settings?.is_more_button_enabled]);\n\n if (isLoading) {\n return <MainMenuSkeleton />;\n }\n\n const renderItem = (item: MenuItem, isChild = false, inMoreMenu = false) => {\n const hasChildren = item.has_children && item.children && item.children.length > 0;\n const showDropdown = hasChildren && !inMoreMenu;\n\n return (\n <li\n key={item.id}\n className={`${isChild ? 'relative' : '!hidden lg:!block root-level'} ${hasChildren ? 'has-children' : ''}`}\n >\n <Link to={item.url}>\n <span>{item.title}</span>\n </Link>\n {showDropdown && (\n <div className=\"sub-menu w-56\">\n <ul>{item?.children?.map((child: MenuItem) => renderItem(child, true))}</ul>\n </div>\n )}\n </li>\n );\n };\n\n return (\n <nav>\n <ul className=\"main-menu\">\n {visibleMenus.map((item) => renderItem(item))}\n {hiddenMenus.length > 0 && (\n <li id=\"more-menu-dropdown\" className=\"!hidden lg:!block root-level has-children\">\n <Link to=\"#\">\n <span>{t('common.titles.more', 'More')}</span>\n </Link>\n <div className=\"sub-menu w-56\">\n <ul>{hiddenMenus.map((item) => renderItem(item, true, true))}</ul>\n </div>\n </li>\n )}\n </ul>\n </nav>\n );\n}\n"]}
@@ -1,21 +1,22 @@
1
- export { MasterLayout } from './chunk-PM5W3ZXP.js';
2
- import './chunk-3Q2SY5EH.js';
3
- import './chunk-I4JJJWQH.js';
4
- import './chunk-D6XHL6VQ.js';
1
+ export { MasterLayout } from './chunk-74PTCV46.js';
2
+ import './chunk-PDIFXQDX.js';
3
+ import './chunk-ISTESEV6.js';
4
+ import './chunk-G2BBB5AI.js';
5
+ import './chunk-KQEBYXYB.js';
5
6
  import './chunk-JYV25VNZ.js';
6
- import './chunk-E6HKDJQU.js';
7
+ import './chunk-EPPCSJGJ.js';
7
8
  import './chunk-OXMUPNMH.js';
8
- import './chunk-GMR6IV4N.js';
9
+ import './chunk-PGXS2QT5.js';
9
10
  import './chunk-VVZNW5CB.js';
10
11
  import './chunk-5FJFN3IW.js';
11
12
  import './chunk-GD26FI4J.js';
12
13
  import './chunk-OM2GRPDH.js';
13
- import './chunk-H52RC2CC.js';
14
+ import './chunk-UBNOFV7C.js';
14
15
  import './chunk-OUW6WESU.js';
15
16
  import './chunk-BK5TBUGG.js';
16
17
  import './chunk-HI5V5X3S.js';
17
- import './chunk-ONYYMIHL.js';
18
- import './chunk-OGPRFIYJ.js';
18
+ import './chunk-WAZYTMTB.js';
19
+ import './chunk-2Q6M3CE5.js';
19
20
  import './chunk-MVT5AF2A.js';
20
21
  import './chunk-Z653O7MX.js';
21
22
  import './chunk-ZCH7W7DZ.js';
@@ -26,15 +27,15 @@ import './chunk-7V36I5GT.js';
26
27
  import './chunk-6WI7R2BD.js';
27
28
  import './chunk-JGVEGQHJ.js';
28
29
  import './chunk-OAMIDZKW.js';
29
- import './chunk-EBISPK5W.js';
30
+ import './chunk-DPLMZQ2Q.js';
30
31
  import './chunk-OQIIJRAS.js';
31
32
  import './chunk-V2ZDTY6H.js';
32
- import './chunk-DYRZ7JXQ.js';
33
+ import './chunk-4JNLIYCE.js';
33
34
  import './chunk-5XDPAKF5.js';
34
35
  import './chunk-GCPEMNSU.js';
35
- import './chunk-GMQK6UHZ.js';
36
+ import './chunk-IMCS5L4A.js';
36
37
  import './chunk-TYNZ5B2B.js';
37
- import './chunk-NSTH6ZQQ.js';
38
+ import './chunk-N67C5QRH.js';
38
39
  import './chunk-AXW67SY7.js';
39
40
  import './chunk-BYMOPN2S.js';
40
41
  import './chunk-SKLEJJ6M.js';
@@ -50,5 +51,5 @@ import './chunk-7VNVCHID.js';
50
51
  import './chunk-T72DAX7R.js';
51
52
  import './chunk-DF6FBKDN.js';
52
53
  import './chunk-DGUM43GV.js';
53
- //# sourceMappingURL=MasterLayout-UJCD626U.js.map
54
- //# sourceMappingURL=MasterLayout-UJCD626U.js.map
54
+ //# sourceMappingURL=MasterLayout-UPFHTRV6.js.map
55
+ //# sourceMappingURL=MasterLayout-UPFHTRV6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"MasterLayout-UJCD626U.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"MasterLayout-UPFHTRV6.js"}