@salla.sa/twilight-theme-engine 1.0.71 → 1.0.73

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 (258) hide show
  1. package/dist/{AddToCartForm-XA5X2C5K.js → AddToCartForm-G2HK5QB3.js} +5 -5
  2. package/dist/AddToCartForm-G2HK5QB3.js.map +1 -0
  3. package/dist/{BlogAuthorPage-YWR52G5S.js → BlogAuthorPage-BU2LVISS.js} +22 -22
  4. package/dist/BlogAuthorPage-BU2LVISS.js.map +1 -0
  5. package/dist/{BlogCategoryPage-N644DZTN.js → BlogCategoryPage-UR4MPDLE.js} +20 -20
  6. package/dist/{BlogCategoryPage-N644DZTN.js.map → BlogCategoryPage-UR4MPDLE.js.map} +1 -1
  7. package/dist/{BlogPage-5Z4X3Y2H.js → BlogPage-E2XZGFOP.js} +18 -18
  8. package/dist/{BlogPage-5Z4X3Y2H.js.map → BlogPage-E2XZGFOP.js.map} +1 -1
  9. package/dist/{BlogSinglePage-NSNVBBUS.js → BlogSinglePage-ZK2K6WEU.js} +18 -18
  10. package/dist/{BlogSinglePage-NSNVBBUS.js.map → BlogSinglePage-ZK2K6WEU.js.map} +1 -1
  11. package/dist/{BlogTagPage-GRYZRHDL.js → BlogTagPage-5N4VTPDN.js} +20 -20
  12. package/dist/{BlogTagPage-GRYZRHDL.js.map → BlogTagPage-5N4VTPDN.js.map} +1 -1
  13. package/dist/{BrandsPage-3Q4ZYOT7.js → BrandsPage-XE7RYGXA.js} +19 -19
  14. package/dist/{BrandsPage-3Q4ZYOT7.js.map → BrandsPage-XE7RYGXA.js.map} +1 -1
  15. package/dist/{Breadcrumb-WNSVFI75.js → Breadcrumb-NX6BUSOA.js} +18 -18
  16. package/dist/{Breadcrumb-WNSVFI75.js.map → Breadcrumb-NX6BUSOA.js.map} +1 -1
  17. package/dist/{CartItem-A66ZG64I.js → CartItem-SO34G6GZ.js} +18 -18
  18. package/dist/{CartItem-A66ZG64I.js.map → CartItem-SO34G6GZ.js.map} +1 -1
  19. package/dist/{CartSummary-BQC2IGQD.js → CartSummary-SDTY2CR2.js} +18 -18
  20. package/dist/{CartSummary-BQC2IGQD.js.map → CartSummary-SDTY2CR2.js.map} +1 -1
  21. package/dist/{Copyright-UNROFFOC.js → Copyright-C426OB5D.js} +4 -4
  22. package/dist/{Copyright-UNROFFOC.js.map → Copyright-C426OB5D.js.map} +1 -1
  23. package/dist/{CustomerLayout-TKS5QZMJ.js → CustomerLayout-UXX5KJWR.js} +18 -18
  24. package/dist/{CustomerLayout-TKS5QZMJ.js.map → CustomerLayout-UXX5KJWR.js.map} +1 -1
  25. package/dist/{Footer-2WD77PFB.js → Footer-M5QEXJ4Z.js} +18 -18
  26. package/dist/{Footer-2WD77PFB.js.map → Footer-M5QEXJ4Z.js.map} +1 -1
  27. package/dist/{Header-3BANLNYK.js → Header-CUJ4SYDF.js} +7 -7
  28. package/dist/{Header-3BANLNYK.js.map → Header-CUJ4SYDF.js.map} +1 -1
  29. package/dist/{ImageModal-LHFSYPSU.js → ImageModal-4FNL5UC5.js} +3 -3
  30. package/dist/{ImageModal-LHFSYPSU.js.map → ImageModal-4FNL5UC5.js.map} +1 -1
  31. package/dist/{LoyaltyPage-OAGJLFD2.js → LoyaltyPage-UMQ2ZWA6.js} +18 -18
  32. package/dist/{LoyaltyPage-OAGJLFD2.js.map → LoyaltyPage-UMQ2ZWA6.js.map} +1 -1
  33. package/dist/{LoyaltyPointsPage-G5FB2QTQ.js → LoyaltyPointsPage-5YHEQSLT.js} +6 -6
  34. package/dist/{LoyaltyPointsPage-G5FB2QTQ.js.map → LoyaltyPointsPage-5YHEQSLT.js.map} +1 -1
  35. package/dist/{MainMenu-FFLJR2EK.js → MainMenu-OFQDXUGW.js} +6 -6
  36. package/dist/{MainMenu-FFLJR2EK.js.map → MainMenu-OFQDXUGW.js.map} +1 -1
  37. package/dist/{MasterLayout-H54QAUUY.js → MasterLayout-TSHKSJ7U.js} +18 -18
  38. package/dist/{MasterLayout-H54QAUUY.js.map → MasterLayout-TSHKSJ7U.js.map} +1 -1
  39. package/dist/{MobileMenu-OVAY7EFJ.js → MobileMenu-7EKUQ4MU.js} +19 -19
  40. package/dist/{MobileMenu-OVAY7EFJ.js.map → MobileMenu-7EKUQ4MU.js.map} +1 -1
  41. package/dist/{NotificationsPage-SEAEJEE7.js → NotificationsPage-TBDOI7YB.js} +18 -18
  42. package/dist/{NotificationsPage-SEAEJEE7.js.map → NotificationsPage-TBDOI7YB.js.map} +1 -1
  43. package/dist/{OrderSinglePage-L7OCFF7N.js → OrderSinglePage-7A37FKJE.js} +19 -19
  44. package/dist/{OrderSinglePage-L7OCFF7N.js.map → OrderSinglePage-7A37FKJE.js.map} +1 -1
  45. package/dist/{OrdersPage-IOEC2JR2.js → OrdersPage-NJ3JH6SG.js} +18 -18
  46. package/dist/{OrdersPage-IOEC2JR2.js.map → OrdersPage-NJ3JH6SG.js.map} +1 -1
  47. package/dist/{PageSingle-YYUIJVFP.js → PageSingle-UKA2U3E5.js} +4 -4
  48. package/dist/{PageSingle-YYUIJVFP.js.map → PageSingle-UKA2U3E5.js.map} +1 -1
  49. package/dist/{ProductDetails-KSB3OC25.js → ProductDetails-XDNE62ZZ.js} +8 -9
  50. package/dist/ProductDetails-XDNE62ZZ.js.map +1 -0
  51. package/dist/{ProfilePage-SVQRTF55.js → ProfilePage-WPJYGKYR.js} +18 -18
  52. package/dist/{ProfilePage-SVQRTF55.js.map → ProfilePage-WPJYGKYR.js.map} +1 -1
  53. package/dist/{SeoCartWidget-G4Y4NRMH.js → SeoCartWidget-G7NAANUN.js} +18 -18
  54. package/dist/{SeoCartWidget-G4Y4NRMH.js.map → SeoCartWidget-G7NAANUN.js.map} +1 -1
  55. package/dist/{SettingsPage-ZVBMBGZL.js → SettingsPage-X7GPCBJL.js} +18 -18
  56. package/dist/{SettingsPage-ZVBMBGZL.js.map → SettingsPage-X7GPCBJL.js.map} +1 -1
  57. package/dist/{StoreClosedNotification-PRXVWUV7.js → StoreClosedNotification-NKRYCLKX.js} +19 -19
  58. package/dist/{StoreClosedNotification-PRXVWUV7.js.map → StoreClosedNotification-NKRYCLKX.js.map} +1 -1
  59. package/dist/{TestimonialsPage-QENPQ2JK.js → TestimonialsPage-JTUWHKPU.js} +4 -4
  60. package/dist/{TestimonialsPage-QENPQ2JK.js.map → TestimonialsPage-JTUWHKPU.js.map} +1 -1
  61. package/dist/{ThankYouPage-GB6M5I4Z.js → ThankYouPage-MCMBGHO2.js} +18 -18
  62. package/dist/{ThankYouPage-GB6M5I4Z.js.map → ThankYouPage-MCMBGHO2.js.map} +1 -1
  63. package/dist/{WalletPage-IG5B33XQ.js → WalletPage-JJI6WPNT.js} +19 -19
  64. package/dist/{WalletPage-IG5B33XQ.js.map → WalletPage-JJI6WPNT.js.map} +1 -1
  65. package/dist/WidgetHead-BCRIXIJQ.js +7 -0
  66. package/dist/{WidgetHead-RWL7D3CT.js.map → WidgetHead-BCRIXIJQ.js.map} +1 -1
  67. package/dist/{WishlistPage-SYNLUIGO.js → WishlistPage-HAOYS7NV.js} +20 -20
  68. package/dist/{WishlistPage-SYNLUIGO.js.map → WishlistPage-HAOYS7NV.js.map} +1 -1
  69. package/dist/api/apps.js +2 -2
  70. package/dist/api/blog.js +12 -0
  71. package/dist/api/blog.js.map +1 -0
  72. package/dist/api/brands.js +2 -2
  73. package/dist/api/cart.js +2 -2
  74. package/dist/api/category.js +2 -2
  75. package/dist/api/client.d.ts +0 -6
  76. package/dist/api/client.d.ts.map +1 -1
  77. package/dist/api/client.js +1 -1
  78. package/dist/api/home.js +2 -2
  79. package/dist/api/loyalty.js +2 -2
  80. package/dist/api/menu.js +2 -2
  81. package/dist/api/notification.js +2 -2
  82. package/dist/api/order.js +2 -2
  83. package/dist/api/page.js +2 -2
  84. package/dist/api/product.js +2 -2
  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/types.d.ts +5 -0
  89. package/dist/api/types.d.ts.map +1 -1
  90. package/dist/api/user.js +2 -2
  91. package/dist/api/wallet.js +9 -0
  92. package/dist/api/wallet.js.map +1 -0
  93. package/dist/api/wishlist.js +3 -3
  94. package/dist/{chunk-7PYHB3PP.js → chunk-25FWAL3O.js} +3 -3
  95. package/dist/{chunk-7PYHB3PP.js.map → chunk-25FWAL3O.js.map} +1 -1
  96. package/dist/{chunk-USN5NHJ5.js → chunk-2ALN2BPM.js} +3 -3
  97. package/dist/{chunk-USN5NHJ5.js.map → chunk-2ALN2BPM.js.map} +1 -1
  98. package/dist/{chunk-5HOD4BKK.js → chunk-3CYIB6BL.js} +3 -3
  99. package/dist/{chunk-5HOD4BKK.js.map → chunk-3CYIB6BL.js.map} +1 -1
  100. package/dist/{chunk-VYJDRAWX.js → chunk-3EE62REP.js} +3 -3
  101. package/dist/{chunk-VYJDRAWX.js.map → chunk-3EE62REP.js.map} +1 -1
  102. package/dist/{chunk-IXG6BF2M.js → chunk-3YAR2SXQ.js} +7 -7
  103. package/dist/{chunk-IXG6BF2M.js.map → chunk-3YAR2SXQ.js.map} +1 -1
  104. package/dist/chunk-4LVBS3VI.js +14 -0
  105. package/dist/{chunk-IHZVVSPW.js.map → chunk-4LVBS3VI.js.map} +1 -1
  106. package/dist/{chunk-P6EOXGUE.js → chunk-52ETYODY.js} +4 -4
  107. package/dist/{chunk-P6EOXGUE.js.map → chunk-52ETYODY.js.map} +1 -1
  108. package/dist/{chunk-GVJHDJW7.js → chunk-54XX3YPP.js} +10 -10
  109. package/dist/chunk-54XX3YPP.js.map +1 -0
  110. package/dist/{chunk-N3BSUMD7.js → chunk-5AFTFN72.js} +3 -3
  111. package/dist/{chunk-N3BSUMD7.js.map → chunk-5AFTFN72.js.map} +1 -1
  112. package/dist/{chunk-GTG22RZG.js → chunk-5DPR7GWH.js} +3 -3
  113. package/dist/{chunk-GTG22RZG.js.map → chunk-5DPR7GWH.js.map} +1 -1
  114. package/dist/{chunk-Q7VWURUR.js → chunk-5XDPAKF5.js} +3 -3
  115. package/dist/{chunk-Q7VWURUR.js.map → chunk-5XDPAKF5.js.map} +1 -1
  116. package/dist/chunk-7V5HOZW4.js +10 -0
  117. package/dist/{chunk-CUG6VOLM.js.map → chunk-7V5HOZW4.js.map} +1 -1
  118. package/dist/{chunk-7W7SLN5M.js → chunk-B5FDWE4U.js} +3 -3
  119. package/dist/{chunk-7W7SLN5M.js.map → chunk-B5FDWE4U.js.map} +1 -1
  120. package/dist/{chunk-BQURS54V.js → chunk-CMD3ARR2.js} +13 -13
  121. package/dist/{chunk-BQURS54V.js.map → chunk-CMD3ARR2.js.map} +1 -1
  122. package/dist/{chunk-VX2T7JCB.js → chunk-EXBH6RGD.js} +5 -5
  123. package/dist/chunk-EXBH6RGD.js.map +1 -0
  124. package/dist/{chunk-GU2KUQVD.js → chunk-GCPEMNSU.js} +14 -3
  125. package/dist/chunk-GCPEMNSU.js.map +1 -0
  126. package/dist/{chunk-6F5QZKIY.js → chunk-HFISEQPK.js} +8 -13
  127. package/dist/chunk-HFISEQPK.js.map +1 -0
  128. package/dist/{chunk-C5X6CVXC.js → chunk-HI5V5X3S.js} +4 -7
  129. package/dist/chunk-HI5V5X3S.js.map +1 -0
  130. package/dist/{chunk-5O6PTKI5.js → chunk-IXUY5RMV.js} +6 -4
  131. package/dist/chunk-IXUY5RMV.js.map +1 -0
  132. package/dist/{chunk-DY5WGKDX.js → chunk-JZ7BOB4G.js} +3 -3
  133. package/dist/{chunk-DY5WGKDX.js.map → chunk-JZ7BOB4G.js.map} +1 -1
  134. package/dist/{chunk-R2BAI6QI.js → chunk-KOMV5SEF.js} +5 -5
  135. package/dist/{chunk-R2BAI6QI.js.map → chunk-KOMV5SEF.js.map} +1 -1
  136. package/dist/{chunk-ILMX45PO.js → chunk-L2QUP6J3.js} +6 -6
  137. package/dist/{chunk-ILMX45PO.js.map → chunk-L2QUP6J3.js.map} +1 -1
  138. package/dist/chunk-L3X2H2RP.js +21 -0
  139. package/dist/{chunk-DZDSTTHW.js.map → chunk-L3X2H2RP.js.map} +1 -1
  140. package/dist/{chunk-FGROIU3Y.js → chunk-L5K7VBOH.js} +3 -3
  141. package/dist/{chunk-FGROIU3Y.js.map → chunk-L5K7VBOH.js.map} +1 -1
  142. package/dist/chunk-MVT5AF2A.js +94 -0
  143. package/dist/chunk-MVT5AF2A.js.map +1 -0
  144. package/dist/{chunk-A32NANNC.js → chunk-OYP5CGHU.js} +3 -3
  145. package/dist/{chunk-A32NANNC.js.map → chunk-OYP5CGHU.js.map} +1 -1
  146. package/dist/{chunk-NFE2H5JE.js → chunk-RO6KBURF.js} +3 -3
  147. package/dist/{chunk-NFE2H5JE.js.map → chunk-RO6KBURF.js.map} +1 -1
  148. package/dist/{chunk-GBWCXUPD.js → chunk-RSVAPXXI.js} +39 -16
  149. package/dist/chunk-RSVAPXXI.js.map +1 -0
  150. package/dist/{chunk-2JL4S2LE.js → chunk-U53LIN2F.js} +6 -6
  151. package/dist/{chunk-2JL4S2LE.js.map → chunk-U53LIN2F.js.map} +1 -1
  152. package/dist/{chunk-MSUGP566.js → chunk-UAY6LTWB.js} +3 -3
  153. package/dist/{chunk-MSUGP566.js.map → chunk-UAY6LTWB.js.map} +1 -1
  154. package/dist/{chunk-RJPPO3ET.js → chunk-V2ZDTY6H.js} +3 -3
  155. package/dist/{chunk-RJPPO3ET.js.map → chunk-V2ZDTY6H.js.map} +1 -1
  156. package/dist/{chunk-H2DXJCJP.js → chunk-VFYT2VWC.js} +3 -3
  157. package/dist/{chunk-H2DXJCJP.js.map → chunk-VFYT2VWC.js.map} +1 -1
  158. package/dist/{chunk-LDMLFJGQ.js → chunk-WLDDKFSZ.js} +4 -4
  159. package/dist/{chunk-LDMLFJGQ.js.map → chunk-WLDDKFSZ.js.map} +1 -1
  160. package/dist/{chunk-5H4NIOTY.js → chunk-WSXRUOI2.js} +3 -3
  161. package/dist/{chunk-5H4NIOTY.js.map → chunk-WSXRUOI2.js.map} +1 -1
  162. package/dist/{chunk-LGT3T7VF.js → chunk-WYW7USLQ.js} +3 -3
  163. package/dist/{chunk-LGT3T7VF.js.map → chunk-WYW7USLQ.js.map} +1 -1
  164. package/dist/{chunk-7BGEGHAI.js → chunk-XVNXXF67.js} +3 -3
  165. package/dist/{chunk-7BGEGHAI.js.map → chunk-XVNXXF67.js.map} +1 -1
  166. package/dist/{chunk-HX3YKS5W.js → chunk-YA6ABQB7.js} +16 -10
  167. package/dist/chunk-YA6ABQB7.js.map +1 -0
  168. package/dist/{chunk-4YHSQSM6.js → chunk-YKFGUVF7.js} +3 -3
  169. package/dist/{chunk-4YHSQSM6.js.map → chunk-YKFGUVF7.js.map} +1 -1
  170. package/dist/{chunk-E7PYHBCX.js → chunk-YLSG4MEK.js} +3 -3
  171. package/dist/{chunk-E7PYHBCX.js.map → chunk-YLSG4MEK.js.map} +1 -1
  172. package/dist/components/cart/index.js +1 -1
  173. package/dist/components/common/Image.d.ts.map +1 -1
  174. package/dist/components/common/index.js +2 -2
  175. package/dist/components/drawer/index.js +16 -16
  176. package/dist/components/home/index.js +20 -20
  177. package/dist/components/layout/index.js +4 -4
  178. package/dist/components/modal/Modal.d.ts.map +1 -1
  179. package/dist/components/modal/index.js +2 -2
  180. package/dist/components/product/ProductDetails.d.ts.map +1 -1
  181. package/dist/components/product/index.js +17 -17
  182. package/dist/components/store/index.js +18 -18
  183. package/dist/components/toast/index.js +8 -6
  184. package/dist/components/toast/index.js.map +1 -1
  185. package/dist/components/toast/useToast.d.ts.map +1 -1
  186. package/dist/components/tracking/index.js +1 -1
  187. package/dist/contexts/CartContext.d.ts +14 -6
  188. package/dist/contexts/CartContext.d.ts.map +1 -1
  189. package/dist/contexts/index.js.map +1 -1
  190. package/dist/{document-class-7U45CO5V.js → document-class-DOQDO2DN.js} +8 -8
  191. package/dist/{document-class-7U45CO5V.js.map → document-class-DOQDO2DN.js.map} +1 -1
  192. package/dist/hooks/HookRegistry.d.ts +3 -1
  193. package/dist/hooks/HookRegistry.d.ts.map +1 -1
  194. package/dist/hooks/HookRegistry.js +1 -1
  195. package/dist/hooks/HookSlot.js +2 -2
  196. package/dist/hooks/index.js +16 -16
  197. package/dist/hooks/useGtm.js +16 -16
  198. package/dist/hooks/useHook.d.ts.map +1 -1
  199. package/dist/hooks/useHook.js +2 -2
  200. package/dist/hooks/useMoney.js +16 -16
  201. package/dist/hooks/useStore.js +16 -16
  202. package/dist/hooks/useUser.js +3 -3
  203. package/dist/hooks/useWishlist.d.ts.map +1 -1
  204. package/dist/hooks/useWishlist.js +3 -1
  205. package/dist/index.js +16 -16
  206. package/dist/{not-found-W7RACNK7.js → not-found-6B6QSJYA.js} +19 -19
  207. package/dist/{not-found-W7RACNK7.js.map → not-found-6B6QSJYA.js.map} +1 -1
  208. package/dist/providers/index.js +16 -16
  209. package/dist/routes/account/orders/index.d.ts.map +1 -1
  210. package/dist/routes/account/orders.js +3 -3
  211. package/dist/routes/account.js +12 -12
  212. package/dist/routes/blog/loader.d.ts.map +1 -1
  213. package/dist/routes/blog.js +23 -13
  214. package/dist/routes/blog.js.map +1 -1
  215. package/dist/routes/brands/types.d.ts +16 -2
  216. package/dist/routes/brands/types.d.ts.map +1 -1
  217. package/dist/routes/brands.js +3 -3
  218. package/dist/routes/cart.js +24 -24
  219. package/dist/routes/home.js +21 -21
  220. package/dist/routes/loyalty.js +4 -4
  221. package/dist/routes/page.js +3 -3
  222. package/dist/routes/product/ProductPage.d.ts.map +1 -1
  223. package/dist/routes/product-listing/loader.d.ts.map +1 -1
  224. package/dist/routes/product-listing.js +24 -23
  225. package/dist/routes/product-listing.js.map +1 -1
  226. package/dist/routes/product.js +23 -25
  227. package/dist/routes/product.js.map +1 -1
  228. package/dist/routes/testimonials.js +1 -1
  229. package/dist/routes/thank-you.js +3 -3
  230. package/dist/skeleton.js +21 -21
  231. package/dist/tanstack.js +7 -7
  232. package/dist/types/hooks.d.ts +61 -1
  233. package/dist/types/hooks.d.ts.map +1 -1
  234. package/dist/types/hooks.js +1 -1
  235. package/dist/types/index.d.ts +626 -53
  236. package/dist/types/index.d.ts.map +1 -1
  237. package/dist/types/index.js +1 -1
  238. package/dist/vite/adapters/tanstack.adapter.d.ts.map +1 -1
  239. package/dist/vite/index.js +34 -10
  240. package/dist/vite/index.js.map +1 -1
  241. package/package.json +9 -1
  242. package/dist/AddToCartForm-XA5X2C5K.js.map +0 -1
  243. package/dist/BlogAuthorPage-YWR52G5S.js.map +0 -1
  244. package/dist/ProductDetails-KSB3OC25.js.map +0 -1
  245. package/dist/WidgetHead-RWL7D3CT.js +0 -7
  246. package/dist/chunk-5O6PTKI5.js.map +0 -1
  247. package/dist/chunk-6F5QZKIY.js.map +0 -1
  248. package/dist/chunk-C5X6CVXC.js.map +0 -1
  249. package/dist/chunk-CUG6VOLM.js +0 -10
  250. package/dist/chunk-DZDSTTHW.js +0 -21
  251. package/dist/chunk-GBWCXUPD.js.map +0 -1
  252. package/dist/chunk-GU2KUQVD.js.map +0 -1
  253. package/dist/chunk-GVJHDJW7.js.map +0 -1
  254. package/dist/chunk-HX3YKS5W.js.map +0 -1
  255. package/dist/chunk-IHZVVSPW.js +0 -14
  256. package/dist/chunk-TP3LCGE7.js +0 -34
  257. package/dist/chunk-TP3LCGE7.js.map +0 -1
  258. package/dist/chunk-VX2T7JCB.js.map +0 -1
@@ -0,0 +1,94 @@
1
+ // src/types/hooks.ts
2
+ var HookName = /* @__PURE__ */ ((HookName2) => {
3
+ HookName2["BODY_START"] = "body:start";
4
+ HookName2["BODY_END"] = "body:end";
5
+ HookName2["BODY_INNER"] = "body:inner";
6
+ HookName2["HEAD_START"] = "head:start";
7
+ HookName2["HEAD_END"] = "head:end";
8
+ HookName2["HEAD_INNER"] = "head:inner";
9
+ HookName2["HEADER_START"] = "header:start";
10
+ HookName2["HEADER_END"] = "header:end";
11
+ HookName2["FOOTER_START"] = "footer:start";
12
+ HookName2["FOOTER_END"] = "footer:end";
13
+ HookName2["PRODUCT_DESCRIPTION_START"] = "product:single.description.start";
14
+ HookName2["PRODUCT_DESCRIPTION"] = "product:single.description";
15
+ HookName2["PRODUCT_DESCRIPTION_END"] = "product:single.description.end";
16
+ HookName2["PRODUCT_FORM_START"] = "product:single.form.start";
17
+ HookName2["PRODUCT_FORM_END"] = "product:single.form.end";
18
+ HookName2["CART_ITEMS_START"] = "cart:items.start";
19
+ HookName2["CART_ITEMS_END"] = "cart:items.end";
20
+ HookName2["CART_SUMMARY_START"] = "cart:summary.start";
21
+ HookName2["CART_SUMMARY_END"] = "cart:summary.end";
22
+ HookName2["SEARCH_START"] = "search:start";
23
+ HookName2["SEARCH_ITEMS_START"] = "search:items.start";
24
+ HookName2["SEARCH_ITEMS_END"] = "search:items.end";
25
+ HookName2["SEARCH_END"] = "search:end";
26
+ HookName2["HOMEPAGE_SLIDER"] = "homepage:slider";
27
+ HookName2["HOMEPAGE_BANNERS"] = "homepage:banners";
28
+ HookName2["HOMEPAGE_FEATURED"] = "homepage:featured";
29
+ HookName2["HEAD"] = "head";
30
+ HookName2["COPYRIGHT"] = "copyright";
31
+ HookName2["HOME_START"] = "home:start";
32
+ HookName2["HOME_CONTENT"] = "home:content";
33
+ HookName2["HOME_END"] = "home:end";
34
+ HookName2["NOTFOUND_START"] = "notfound:start";
35
+ HookName2["NOTFOUND_CONTENT"] = "notfound:content";
36
+ HookName2["NOTFOUND_END"] = "notfound:end";
37
+ HookName2["PRODUCT_START"] = "product:start";
38
+ HookName2["PRODUCT_DETAILS_START"] = "product:details.start";
39
+ HookName2["PRODUCT_DETAILS_END"] = "product:details.end";
40
+ HookName2["PRODUCT_RELATED_START"] = "product:related.start";
41
+ HookName2["PRODUCT_RELATED_END"] = "product:related.end";
42
+ HookName2["PRODUCT_END"] = "product:end";
43
+ HookName2["PRODUCT_LIST_START"] = "product:list.start";
44
+ HookName2["PRODUCT_LIST_ITEMS_START"] = "product:list.items.start";
45
+ HookName2["PRODUCT_LIST_ITEMS_END"] = "product:list.items.end";
46
+ HookName2["PRODUCT_LIST_END"] = "product:list.end";
47
+ HookName2["CART_START"] = "cart:start";
48
+ HookName2["CART_END"] = "cart:end";
49
+ HookName2["CART_SUBMIT_START"] = "cart:submit.start";
50
+ HookName2["CART_SUBMIT_END"] = "cart:submit.end";
51
+ HookName2["THANK_YOU_START"] = "thank-you:start";
52
+ HookName2["THANK_YOU_ITEMS_START"] = "thank-you:items.start";
53
+ HookName2["THANK_YOU_ITEMS_END"] = "thank-you:items.end";
54
+ HookName2["THANK_YOU_END"] = "thank-you:end";
55
+ HookName2["BRANDS_INDEX_ITEMS_START"] = "brands:index.items.start";
56
+ HookName2["BRANDS_INDEX_ITEMS_END"] = "brands:index.items.end";
57
+ HookName2["BLOG_START"] = "blog:start";
58
+ HookName2["BLOG_ITEMS_START"] = "blog:items.start";
59
+ HookName2["BLOG_ITEMS_END"] = "blog:items.end";
60
+ HookName2["BLOG_END"] = "blog:end";
61
+ HookName2["BLOG_SINGLE_START"] = "blog:single.start";
62
+ HookName2["BLOG_SINGLE_END"] = "blog:single.end";
63
+ HookName2["BLOG_SINGLE_RELATED_START"] = "blog:single.related.start";
64
+ HookName2["BLOG_SINGLE_RELATED_END"] = "blog:single.related.end";
65
+ HookName2["BLOG_CATEGORY_START"] = "blog:category.start";
66
+ HookName2["BLOG_CATEGORY_END"] = "blog:category.end";
67
+ HookName2["BLOG_TAG_START"] = "blog:tag.start";
68
+ HookName2["BLOG_TAG_END"] = "blog:tag.end";
69
+ HookName2["BLOG_AUTHOR_START"] = "blog:author.start";
70
+ HookName2["BLOG_AUTHOR_END"] = "blog:author.end";
71
+ HookName2["CUSTOMER_PROFILE_START"] = "customer:profile.start";
72
+ HookName2["CUSTOMER_PROFILE_FORM_START"] = "customer:profile.form.start";
73
+ HookName2["CUSTOMER_PROFILE_FORM_END"] = "customer:profile.form.end";
74
+ HookName2["CUSTOMER_PROFILE_END"] = "customer:profile.end";
75
+ HookName2["CUSTOMER_SETTINGS_START"] = "customer:settings.start";
76
+ HookName2["CUSTOMER_SETTINGS_END"] = "customer:settings.end";
77
+ HookName2["CUSTOMER_ORDERS_ITEMS_START"] = "customer:orders.index.items.start";
78
+ HookName2["CUSTOMER_ORDERS_ITEMS_END"] = "customer:orders.index.items.end";
79
+ HookName2["CUSTOMER_ORDER_DETAILS_START"] = "customer:orders.single.details.start";
80
+ HookName2["CUSTOMER_ORDER_DETAILS_END"] = "customer:orders.single.details.end";
81
+ HookName2["CUSTOMER_WALLET_TRANSACTIONS_START"] = "customer:wallet.transactions.start";
82
+ HookName2["CUSTOMER_WALLET_TRANSACTIONS_END"] = "customer:wallet.transactions.end";
83
+ HookName2["CUSTOMER_WISHLIST_ITEMS_START"] = "customer:wishlist.items.start";
84
+ HookName2["CUSTOMER_WISHLIST_ITEMS_END"] = "customer:wishlist.items.end";
85
+ HookName2["CUSTOMER_NOTIFICATIONS_ITEMS_START"] = "customer:notifications.items.start";
86
+ HookName2["CUSTOMER_NOTIFICATIONS_ITEMS_END"] = "customer:notifications.items.end";
87
+ HookName2["LOYALTY_START"] = "loyalty:start";
88
+ HookName2["LOYALTY_END"] = "loyalty:end";
89
+ return HookName2;
90
+ })(HookName || {});
91
+
92
+ export { HookName };
93
+ //# sourceMappingURL=chunk-MVT5AF2A.js.map
94
+ //# sourceMappingURL=chunk-MVT5AF2A.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/hooks.ts"],"names":["HookName"],"mappings":"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","file":"chunk-MVT5AF2A.js","sourcesContent":["import type { ReactNode } from 'react';\n\n/**\n * Predefined hook names for type-safe hook registration.\n *\n * @example\n * ```tsx\n * import { HookName, hookRegistry } from '@salla.sa/twilight-theme-engine';\n *\n * hookRegistry.register(HookName.BODY_END, () => <MyComponent />);\n * ```\n */\nexport enum HookName {\n // Global - Body\n BODY_START = 'body:start',\n BODY_END = 'body:end',\n BODY_INNER = 'body:inner',\n // Global - Head\n HEAD_START = 'head:start',\n HEAD_END = 'head:end',\n HEAD_INNER = 'head:inner',\n // Header\n HEADER_START = 'header:start',\n HEADER_END = 'header:end',\n // Footer\n FOOTER_START = 'footer:start',\n FOOTER_END = 'footer:end',\n // Product\n PRODUCT_DESCRIPTION_START = 'product:single.description.start',\n PRODUCT_DESCRIPTION = 'product:single.description',\n PRODUCT_DESCRIPTION_END = 'product:single.description.end',\n PRODUCT_FORM_START = 'product:single.form.start',\n PRODUCT_FORM_END = 'product:single.form.end',\n // Cart\n CART_ITEMS_START = 'cart:items.start',\n CART_ITEMS_END = 'cart:items.end',\n CART_SUMMARY_START = 'cart:summary.start',\n CART_SUMMARY_END = 'cart:summary.end',\n // Search\n SEARCH_START = 'search:start',\n SEARCH_ITEMS_START = 'search:items.start',\n SEARCH_ITEMS_END = 'search:items.end',\n SEARCH_END = 'search:end',\n // Homepage\n HOMEPAGE_SLIDER = 'homepage:slider',\n HOMEPAGE_BANNERS = 'homepage:banners',\n HOMEPAGE_FEATURED = 'homepage:featured',\n // Global - Head (bare slot rendered by WidgetHead between head:start and head:end)\n HEAD = 'head',\n // Footer\n COPYRIGHT = 'copyright',\n // Home page\n HOME_START = 'home:start',\n HOME_CONTENT = 'home:content',\n HOME_END = 'home:end',\n // Not found page\n NOTFOUND_START = 'notfound:start',\n NOTFOUND_CONTENT = 'notfound:content',\n NOTFOUND_END = 'notfound:end',\n // Product page\n PRODUCT_START = 'product:start',\n PRODUCT_DETAILS_START = 'product:details.start',\n PRODUCT_DETAILS_END = 'product:details.end',\n PRODUCT_RELATED_START = 'product:related.start',\n PRODUCT_RELATED_END = 'product:related.end',\n PRODUCT_END = 'product:end',\n // Product listing page\n PRODUCT_LIST_START = 'product:list.start',\n PRODUCT_LIST_ITEMS_START = 'product:list.items.start',\n PRODUCT_LIST_ITEMS_END = 'product:list.items.end',\n PRODUCT_LIST_END = 'product:list.end',\n // Cart page\n CART_START = 'cart:start',\n CART_END = 'cart:end',\n CART_SUBMIT_START = 'cart:submit.start',\n CART_SUBMIT_END = 'cart:submit.end',\n // Thank-you page\n THANK_YOU_START = 'thank-you:start',\n THANK_YOU_ITEMS_START = 'thank-you:items.start',\n THANK_YOU_ITEMS_END = 'thank-you:items.end',\n THANK_YOU_END = 'thank-you:end',\n // Brands page\n BRANDS_INDEX_ITEMS_START = 'brands:index.items.start',\n BRANDS_INDEX_ITEMS_END = 'brands:index.items.end',\n // Blog\n BLOG_START = 'blog:start',\n BLOG_ITEMS_START = 'blog:items.start',\n BLOG_ITEMS_END = 'blog:items.end',\n BLOG_END = 'blog:end',\n BLOG_SINGLE_START = 'blog:single.start',\n BLOG_SINGLE_END = 'blog:single.end',\n BLOG_SINGLE_RELATED_START = 'blog:single.related.start',\n BLOG_SINGLE_RELATED_END = 'blog:single.related.end',\n BLOG_CATEGORY_START = 'blog:category.start',\n BLOG_CATEGORY_END = 'blog:category.end',\n BLOG_TAG_START = 'blog:tag.start',\n BLOG_TAG_END = 'blog:tag.end',\n BLOG_AUTHOR_START = 'blog:author.start',\n BLOG_AUTHOR_END = 'blog:author.end',\n // Customer account\n CUSTOMER_PROFILE_START = 'customer:profile.start',\n CUSTOMER_PROFILE_FORM_START = 'customer:profile.form.start',\n CUSTOMER_PROFILE_FORM_END = 'customer:profile.form.end',\n CUSTOMER_PROFILE_END = 'customer:profile.end',\n CUSTOMER_SETTINGS_START = 'customer:settings.start',\n CUSTOMER_SETTINGS_END = 'customer:settings.end',\n CUSTOMER_ORDERS_ITEMS_START = 'customer:orders.index.items.start',\n CUSTOMER_ORDERS_ITEMS_END = 'customer:orders.index.items.end',\n CUSTOMER_ORDER_DETAILS_START = 'customer:orders.single.details.start',\n CUSTOMER_ORDER_DETAILS_END = 'customer:orders.single.details.end',\n CUSTOMER_WALLET_TRANSACTIONS_START = 'customer:wallet.transactions.start',\n CUSTOMER_WALLET_TRANSACTIONS_END = 'customer:wallet.transactions.end',\n CUSTOMER_WISHLIST_ITEMS_START = 'customer:wishlist.items.start',\n CUSTOMER_WISHLIST_ITEMS_END = 'customer:wishlist.items.end',\n CUSTOMER_NOTIFICATIONS_ITEMS_START = 'customer:notifications.items.start',\n CUSTOMER_NOTIFICATIONS_ITEMS_END = 'customer:notifications.items.end',\n LOYALTY_START = 'loyalty:start',\n LOYALTY_END = 'loyalty:end',\n}\n\n/**\n * Hook handler function type.\n */\nexport type HookHandler<T = Record<string, unknown>> = (context: T) => ReactNode;\n\n/**\n * Hook definition with handler and priority.\n */\nexport interface HookDefinition {\n id: number;\n handler: HookHandler;\n priority: number;\n}\n\n/**\n * Hook handlers map for bulk registration.\n */\nexport type HookHandlers = Record<\n string,\n | HookHandler\n | Array<{\n priority?: number;\n handler: HookHandler;\n }>\n>;\n"]}
@@ -1,4 +1,4 @@
1
- import { api } from './chunk-VX2T7JCB.js';
1
+ import { api } from './chunk-EXBH6RGD.js';
2
2
  import { queryOptions } from '@tanstack/react-query';
3
3
 
4
4
  var apps = {
@@ -40,5 +40,5 @@ var apps = {
40
40
  };
41
41
 
42
42
  export { apps };
43
- //# sourceMappingURL=chunk-A32NANNC.js.map
44
- //# sourceMappingURL=chunk-A32NANNC.js.map
43
+ //# sourceMappingURL=chunk-OYP5CGHU.js.map
44
+ //# sourceMappingURL=chunk-OYP5CGHU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/apps.ts"],"names":[],"mappings":";;;AAmCO,IAAM,IAAA,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlB,UAAU,YAAmC;AAC3C,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CACpB,GAAA,CAAI,eAAA,EAAiB,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA,CACtC,IAAA,EAA8B;AACjC,IAAA,OAAO,QAAQ,EAAC;AAAA,EAClB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,YAAkC;AAC1C,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CACpB,GAAA,CAAI,wBAAA,EAA0B,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA,CAC/C,IAAA,EAAsC;AACzC,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,IAAQ,EAAC,EAAE;AAAA,EAClC,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,QAAA,EAAU,MACR,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,MAAA,EAAQ,UAAU,CAAA;AAAA,MAC7B,OAAA,EAAS,MAAM,IAAA,CAAK,QAAA,EAAS;AAAA;AAAA,MAE7B,SAAA,EAAW,QAAA;AAAA;AAAA;AAAA;AAAA,MAIX,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,IAEH,QAAA,EAAU,MACR,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,MAAA,EAAQ,UAAU,CAAA;AAAA,MAC7B,OAAA,EAAS,MAAM,IAAA,CAAK,QAAA,EAAS;AAAA;AAAA,MAE7B,SAAA,EAAW,QAAA;AAAA,MACX,KAAA,EAAO;AAAA,KACR;AAAA;AAEP","file":"chunk-A32NANNC.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\n\nexport interface AppSnippetRow {\n place: string;\n content: string;\n url?: string | null;\n /**\n * Raw snippet id, emitted as `data-snippet-id`. Present only on CDN rows — the\n * inline branch of the backend's snippet parser omits the key entirely.\n */\n id?: number;\n /** `{{customer.x}}` placeholders in `content` to substitute from SDK config `user.*` keys. */\n customer_parameters?: string[];\n}\n\nexport interface AppSnippet {\n service: string;\n app_id: string;\n /** Encoded app id (`getRouteKey()`): the scope id its snippets bind to via `data-scope-id`,\n * and its settings-bucket key. Absent on payloads predating the settings API. */\n id?: string;\n app_slug: string;\n status: string;\n snippets: AppSnippetRow[];\n}\n\n/**\n * Per-app public `app.*` buckets for CDN snippets, keyed by encoded app id (== `AppSnippet.id`,\n * the `Salla.appScope` scope id). One isolated bucket per app; reads within a scope are bare `app.*`.\n */\nexport interface AppSettings {\n apps: Record<string, Record<string, unknown>>;\n}\n\nexport const apps = {\n /**\n * Installed apps' snippets (scripts/HTML to inject). Timeout-bounded because it's awaited in\n * rootBeforeLoad (SSR/TTFB): a slow response degrades to no CDN tags, never stalls the page.\n */\n snippets: async (): Promise<AppSnippet[]> => {\n const { data } = await api\n .get('apps/snippets', { timeout: 2500 })\n .json<{ data?: AppSnippet[] }>();\n return data ?? [];\n },\n\n /**\n * Per-app public `app.*` buckets, keyed by encoded app id. Timeout-bounded (SSR-awaited):\n * a slow response degrades to empty buckets (fail-open), never strands injection.\n */\n settings: async (): Promise<AppSettings> => {\n const { data } = await api\n .get('apps/snippets/settings', { timeout: 2500 })\n .json<{ data?: Partial<AppSettings> }>();\n return { apps: data?.apps ?? {} };\n },\n\n queries: {\n snippets: () =>\n queryOptions({\n queryKey: ['apps', 'snippets'],\n queryFn: () => apps.snippets(),\n // Snippets are static per session; one fetch per page load is enough.\n staleTime: Infinity,\n // No retry: this is awaited in rootBeforeLoad, so the router's default `retry: 1` would\n // make the SSR wait 2 x the 2500ms timeout (plus backoff) before failing open. The\n // 2500ms timeout must be the whole budget; the client fallback query does the retrying.\n retry: 0,\n }),\n\n settings: () =>\n queryOptions({\n queryKey: ['apps', 'settings'],\n queryFn: () => apps.settings(),\n // Encoded app ids and their buckets are stable per page; one fetch is enough.\n staleTime: Infinity,\n retry: 0,\n }),\n },\n};\n"]}
1
+ {"version":3,"sources":["../src/api/apps.ts"],"names":[],"mappings":";;;AAmCO,IAAM,IAAA,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlB,UAAU,YAAmC;AAC3C,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CACpB,GAAA,CAAI,eAAA,EAAiB,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA,CACtC,IAAA,EAA8B;AACjC,IAAA,OAAO,QAAQ,EAAC;AAAA,EAClB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,YAAkC;AAC1C,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CACpB,GAAA,CAAI,wBAAA,EAA0B,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA,CAC/C,IAAA,EAAsC;AACzC,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,IAAQ,EAAC,EAAE;AAAA,EAClC,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,QAAA,EAAU,MACR,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,MAAA,EAAQ,UAAU,CAAA;AAAA,MAC7B,OAAA,EAAS,MAAM,IAAA,CAAK,QAAA,EAAS;AAAA;AAAA,MAE7B,SAAA,EAAW,QAAA;AAAA;AAAA;AAAA;AAAA,MAIX,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,IAEH,QAAA,EAAU,MACR,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,MAAA,EAAQ,UAAU,CAAA;AAAA,MAC7B,OAAA,EAAS,MAAM,IAAA,CAAK,QAAA,EAAS;AAAA;AAAA,MAE7B,SAAA,EAAW,QAAA;AAAA,MACX,KAAA,EAAO;AAAA,KACR;AAAA;AAEP","file":"chunk-OYP5CGHU.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\n\nexport interface AppSnippetRow {\n place: string;\n content: string;\n url?: string | null;\n /**\n * Raw snippet id, emitted as `data-snippet-id`. Present only on CDN rows — the\n * inline branch of the backend's snippet parser omits the key entirely.\n */\n id?: number;\n /** `{{customer.x}}` placeholders in `content` to substitute from SDK config `user.*` keys. */\n customer_parameters?: string[];\n}\n\nexport interface AppSnippet {\n service: string;\n app_id: string;\n /** Encoded app id (`getRouteKey()`): the scope id its snippets bind to via `data-scope-id`,\n * and its settings-bucket key. Absent on payloads predating the settings API. */\n id?: string;\n app_slug: string;\n status: string;\n snippets: AppSnippetRow[];\n}\n\n/**\n * Per-app public `app.*` buckets for CDN snippets, keyed by encoded app id (== `AppSnippet.id`,\n * the `Salla.appScope` scope id). One isolated bucket per app; reads within a scope are bare `app.*`.\n */\nexport interface AppSettings {\n apps: Record<string, Record<string, unknown>>;\n}\n\nexport const apps = {\n /**\n * Installed apps' snippets (scripts/HTML to inject). Timeout-bounded because it's awaited in\n * rootBeforeLoad (SSR/TTFB): a slow response degrades to no CDN tags, never stalls the page.\n */\n snippets: async (): Promise<AppSnippet[]> => {\n const { data } = await api\n .get('apps/snippets', { timeout: 2500 })\n .json<{ data?: AppSnippet[] }>();\n return data ?? [];\n },\n\n /**\n * Per-app public `app.*` buckets, keyed by encoded app id. Timeout-bounded (SSR-awaited):\n * a slow response degrades to empty buckets (fail-open), never strands injection.\n */\n settings: async (): Promise<AppSettings> => {\n const { data } = await api\n .get('apps/snippets/settings', { timeout: 2500 })\n .json<{ data?: Partial<AppSettings> }>();\n return { apps: data?.apps ?? {} };\n },\n\n queries: {\n snippets: () =>\n queryOptions({\n queryKey: ['apps', 'snippets'],\n queryFn: () => apps.snippets(),\n // Snippets are static per session; one fetch per page load is enough.\n staleTime: Infinity,\n // No retry: this is awaited in rootBeforeLoad, so the router's default `retry: 1` would\n // make the SSR wait 2 x the 2500ms timeout (plus backoff) before failing open. The\n // 2500ms timeout must be the whole budget; the client fallback query does the retrying.\n retry: 0,\n }),\n\n settings: () =>\n queryOptions({\n queryKey: ['apps', 'settings'],\n queryFn: () => apps.settings(),\n // Encoded app ids and their buckets are stable per page; one fetch is enough.\n staleTime: Infinity,\n retry: 0,\n }),\n },\n};\n"]}
@@ -1,5 +1,5 @@
1
1
  import { orThrow } from './chunk-SDIQHTDG.js';
2
- import { api } from './chunk-VX2T7JCB.js';
2
+ import { api } from './chunk-EXBH6RGD.js';
3
3
  import { getSallaSDK } from './chunk-QVJDYSCT.js';
4
4
  import { queryOptions } from '@tanstack/react-query';
5
5
 
@@ -43,5 +43,5 @@ var cart = {
43
43
  };
44
44
 
45
45
  export { cart };
46
- //# sourceMappingURL=chunk-NFE2H5JE.js.map
47
- //# sourceMappingURL=chunk-NFE2H5JE.js.map
46
+ //# sourceMappingURL=chunk-RO6KBURF.js.map
47
+ //# sourceMappingURL=chunk-RO6KBURF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/cart.ts"],"names":[],"mappings":";;;;;AAaA,SAAS,sBAAsB,IAAA,EAAoC;AACjE,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAM,OAAO,IAAA;AACvB,EAAA,OAAO;AAAA,IACL,GAAG,IAAA,CAAK,IAAA;AAAA,IACR,OAAA,EAAS,KAAK,OAAA,IAAW,IAAA;AAAA,IACzB,IAAA,EAAM,KAAK,IAAA,IAAQ;AAAA,GACrB;AACF;AAEO,IAAM,IAAA,GAAO;AAAA,EAClB,GAAA,EAAK,OAAO,MAAA,KAAyC;AACnD,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAE,CAAA,CAAE,IAAA,EAAgC;AACjF,IAAA,OAAO,sBAAsB,IAAI,CAAA;AAAA,EACnC,CAAA;AAAA,EAEA,YAAY,CAAC,MAAA,KAAyC,QAAQ,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA;AAAA,EAG9E,cAAc,YAAoC;AAChD,IAAA,MAAM,QAAQ,WAAA,EAAY;AAC1B,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,IAAA,MAAM,KAAA,CAAM,OAAA,EAAQ,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAC3C,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAiB;AAAA,EACzC,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,KACP,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAM,CAAA;AAAA,MACzB,OAAA,EAAS,MAAM,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAAA;AAAA,MAE9B,SAAA,EAAW,CAAA;AAAA,MACX,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,IACH,SAAA,EAAW,MACT,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,MAAA,EAAQ,YAAY,CAAA;AAAA,MAC/B,OAAA,EAAS,MAAM,IAAA,CAAK,YAAA,EAAa;AAAA;AAAA,MAEjC,SAAA,EAAW,CAAA;AAAA,MACX,MAAA,EAAQ;AAAA,KACT;AAAA;AAEP","file":"chunk-NFE2H5JE.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport type { Cart } from '../types';\nimport { orThrow } from '../providers/NavigationProvider';\nimport { getSallaSDK } from '../utils/sdk-helpers';\n\nexport interface CartApiResponse {\n /** Absent once the cart was turned into an order (the body then carries a top-level `redirect`). */\n cart?: Omit<Cart, 'loyalty' | 'gift'>;\n loyalty?: Cart['loyalty'];\n gift?: Cart['gift'];\n}\n\nfunction normalizeCartResponse(data: CartApiResponse): Cart | null {\n if (!data.cart) return null;\n return {\n ...data.cart,\n loyalty: data.loyalty ?? null,\n gift: data.gift ?? null,\n } as Cart;\n}\n\nexport const cart = {\n get: async (cartId: number): Promise<Cart | null> => {\n const { data } = await api.get(`cart/${cartId}`).json<{ data: CartApiResponse }>();\n return normalizeCartResponse(data);\n },\n\n getOrThrow: (cartId: number): Promise<Cart | null> => orThrow(cart.get(cartId)),\n\n /** The visitor's cart id, which only the Salla SDK knows; `null` outside the browser. */\n getCurrentId: async (): Promise<number | null> => {\n const salla = getSallaSDK();\n if (!salla) return null;\n // The app bundle can run before the SDK module, when `salla` is still the head stub.\n await salla.onReady().catch(() => undefined);\n return salla.cart.api.getCurrentCartId();\n },\n\n queries: {\n detail: (cartId: number) =>\n queryOptions({\n queryKey: ['cart', cartId],\n queryFn: () => cart.get(cartId),\n // The SDK changes the cart from any page, so a cached copy is never safe to show.\n staleTime: 0,\n gcTime: 0,\n }),\n currentId: () =>\n queryOptions({\n queryKey: ['cart', 'current-id'],\n queryFn: () => cart.getCurrentId(),\n // Completing an order starts a new cart, so an earlier id is never reused.\n staleTime: 0,\n gcTime: 0,\n }),\n },\n};\n"]}
1
+ {"version":3,"sources":["../src/api/cart.ts"],"names":[],"mappings":";;;;;AAaA,SAAS,sBAAsB,IAAA,EAAoC;AACjE,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAM,OAAO,IAAA;AACvB,EAAA,OAAO;AAAA,IACL,GAAG,IAAA,CAAK,IAAA;AAAA,IACR,OAAA,EAAS,KAAK,OAAA,IAAW,IAAA;AAAA,IACzB,IAAA,EAAM,KAAK,IAAA,IAAQ;AAAA,GACrB;AACF;AAEO,IAAM,IAAA,GAAO;AAAA,EAClB,GAAA,EAAK,OAAO,MAAA,KAAyC;AACnD,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAE,CAAA,CAAE,IAAA,EAAgC;AACjF,IAAA,OAAO,sBAAsB,IAAI,CAAA;AAAA,EACnC,CAAA;AAAA,EAEA,YAAY,CAAC,MAAA,KAAyC,QAAQ,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA;AAAA,EAG9E,cAAc,YAAoC;AAChD,IAAA,MAAM,QAAQ,WAAA,EAAY;AAC1B,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,IAAA,MAAM,KAAA,CAAM,OAAA,EAAQ,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAC3C,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAiB;AAAA,EACzC,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,KACP,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAM,CAAA;AAAA,MACzB,OAAA,EAAS,MAAM,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAAA;AAAA,MAE9B,SAAA,EAAW,CAAA;AAAA,MACX,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,IACH,SAAA,EAAW,MACT,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,MAAA,EAAQ,YAAY,CAAA;AAAA,MAC/B,OAAA,EAAS,MAAM,IAAA,CAAK,YAAA,EAAa;AAAA;AAAA,MAEjC,SAAA,EAAW,CAAA;AAAA,MACX,MAAA,EAAQ;AAAA,KACT;AAAA;AAEP","file":"chunk-RO6KBURF.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport type { Cart } from '../types';\nimport { orThrow } from '../providers/NavigationProvider';\nimport { getSallaSDK } from '../utils/sdk-helpers';\n\nexport interface CartApiResponse {\n /** Absent once the cart was turned into an order (the body then carries a top-level `redirect`). */\n cart?: Omit<Cart, 'loyalty' | 'gift'>;\n loyalty?: Cart['loyalty'];\n gift?: Cart['gift'];\n}\n\nfunction normalizeCartResponse(data: CartApiResponse): Cart | null {\n if (!data.cart) return null;\n return {\n ...data.cart,\n loyalty: data.loyalty ?? null,\n gift: data.gift ?? null,\n } as Cart;\n}\n\nexport const cart = {\n get: async (cartId: number): Promise<Cart | null> => {\n const { data } = await api.get(`cart/${cartId}`).json<{ data: CartApiResponse }>();\n return normalizeCartResponse(data);\n },\n\n getOrThrow: (cartId: number): Promise<Cart | null> => orThrow(cart.get(cartId)),\n\n /** The visitor's cart id, which only the Salla SDK knows; `null` outside the browser. */\n getCurrentId: async (): Promise<number | null> => {\n const salla = getSallaSDK();\n if (!salla) return null;\n // The app bundle can run before the SDK module, when `salla` is still the head stub.\n await salla.onReady().catch(() => undefined);\n return salla.cart.api.getCurrentCartId();\n },\n\n queries: {\n detail: (cartId: number) =>\n queryOptions({\n queryKey: ['cart', cartId],\n queryFn: () => cart.get(cartId),\n // The SDK changes the cart from any page, so a cached copy is never safe to show.\n staleTime: 0,\n gcTime: 0,\n }),\n currentId: () =>\n queryOptions({\n queryKey: ['cart', 'current-id'],\n queryFn: () => cart.getCurrentId(),\n // Completing an order starts a new cart, so an earlier id is never reused.\n staleTime: 0,\n gcTime: 0,\n }),\n },\n};\n"]}
@@ -1,3 +1,4 @@
1
+ import { useTranslation } from './chunk-TYNZ5B2B.js';
1
2
  import { useAsyncFn } from './chunk-6BZ5TKEV.js';
2
3
  import { useSyncExternalStore, useCallback } from 'react';
3
4
 
@@ -51,25 +52,47 @@ function ensureSubscribed() {
51
52
  emitChange();
52
53
  });
53
54
  }
55
+ function toError(reason, fallback) {
56
+ if (reason instanceof Error) return reason;
57
+ if (typeof reason === "string") return new Error(reason);
58
+ const message = reason?.message;
59
+ return new Error(typeof message === "string" ? message : fallback);
60
+ }
54
61
  function useWishlist() {
55
62
  ensureSubscribed();
56
63
  const storedIds = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
57
- const [addState, addFn] = useAsyncFn(async (productId) => {
58
- const salla = window.salla;
59
- await salla?.wishlist.add(productId);
60
- if (!ids.includes(productId)) {
61
- ids = [...ids, productId];
64
+ const { t } = useTranslation();
65
+ const failed = t("common.errors.error_occurred", "Something went wrong");
66
+ const [addState, addFn] = useAsyncFn(
67
+ async (productId) => {
68
+ const salla = window.salla;
69
+ try {
70
+ await salla?.wishlist.add(productId);
71
+ } catch (reason) {
72
+ throw toError(reason, failed);
73
+ }
74
+ if (!ids.includes(productId)) {
75
+ ids = [...ids, productId];
76
+ persistIds();
77
+ emitChange();
78
+ }
79
+ },
80
+ [failed]
81
+ );
82
+ const [removeState, removeFn] = useAsyncFn(
83
+ async (productId) => {
84
+ const salla = window.salla;
85
+ try {
86
+ await salla?.wishlist.remove(productId);
87
+ } catch (reason) {
88
+ throw toError(reason, failed);
89
+ }
90
+ ids = ids.filter((id) => id !== productId);
62
91
  persistIds();
63
92
  emitChange();
64
- }
65
- }, []);
66
- const [removeState, removeFn] = useAsyncFn(async (productId) => {
67
- const salla = window.salla;
68
- await salla?.wishlist.remove(productId);
69
- ids = ids.filter((id) => id !== productId);
70
- persistIds();
71
- emitChange();
72
- }, []);
93
+ },
94
+ [failed]
95
+ );
73
96
  const has = useCallback((productId) => storedIds.includes(productId), [storedIds]);
74
97
  const add = async (productId) => !(await addFn(productId) instanceof Error);
75
98
  const remove = async (productId) => !(await removeFn(productId) instanceof Error);
@@ -95,5 +118,5 @@ function resetWishlistStore() {
95
118
  }
96
119
 
97
120
  export { resetWishlistStore, useWishlist };
98
- //# sourceMappingURL=chunk-GBWCXUPD.js.map
99
- //# sourceMappingURL=chunk-GBWCXUPD.js.map
121
+ //# sourceMappingURL=chunk-RSVAPXXI.js.map
122
+ //# sourceMappingURL=chunk-RSVAPXXI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useWishlist.ts"],"names":[],"mappings":"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","file":"chunk-RSVAPXXI.js","sourcesContent":["import { useCallback, useSyncExternalStore } from 'react';\nimport { useAsyncFn } from './useAsyncFn';\nimport { useTranslation } from '../providers/I18nProvider';\nimport type { UseToggleWithItems } from './types';\n\nexport type UseWishlistResult = UseToggleWithItems<number>;\n\n/**\n * useWishlist - Hook for managing wishlist functionality\n *\n * Provides wishlist product management with local storage persistence\n * and Salla SDK integration. Syncs with the SDK's wishlist state and\n * listens for events to maintain real-time consistency.\n *\n * Uses a module-level singleton store so SDK event listeners are\n * registered ONCE globally — not per-component. All hook instances\n * share the same state via `useSyncExternalStore`.\n *\n * @returns Wishlist state and management functions\n *\n * @example\n * ```tsx\n * function WishlistButton({ productId }) {\n * const { has, toggle, loading } = useWishlist();\n *\n * return (\n * <button\n * onClick={() => toggle(productId)}\n * disabled={loading}\n * className={has(productId) ? 'liked' : ''}\n * >\n * ❤️\n * </button>\n * );\n * }\n * ```\n */\n\nconst WISHLIST_STORAGE_KEY = 'salla::wishlist';\n\nlet ids: number[] = [];\nconst listeners = new Set<() => void>();\nlet subscribed = false;\n\nfunction emitChange() {\n for (const listener of listeners) listener();\n}\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\nfunction getSnapshot(): number[] {\n return ids;\n}\n\nconst getServerSnapshot = (): number[] => [];\n\nfunction persistIds() {\n try {\n localStorage.setItem(WISHLIST_STORAGE_KEY, JSON.stringify(ids));\n } catch {\n /* ignore storage errors */\n }\n}\n\nfunction initFromStorage() {\n try {\n const sdkWishlist = window.salla?.storage.get(WISHLIST_STORAGE_KEY, []);\n const stored = localStorage.getItem(WISHLIST_STORAGE_KEY);\n const parsed = stored ? JSON.parse(stored) : [];\n ids = Array.isArray(sdkWishlist) && sdkWishlist.length > 0 ? sdkWishlist : parsed;\n } catch {\n /* ignore storage errors */\n }\n}\n\nfunction ensureSubscribed() {\n if (subscribed || typeof window === 'undefined') return;\n subscribed = true;\n initFromStorage();\n\n const salla = window.salla;\n if (!salla?.wishlist?.event) return;\n\n salla.wishlist.event.onAdded((_event: unknown, id: number) => {\n if (ids.includes(id)) return;\n ids = [...ids, id];\n persistIds();\n emitChange();\n });\n\n salla.wishlist.event.onRemoved((_response: unknown, id: number) => {\n ids = ids.filter((itemId) => itemId !== id);\n persistIds();\n emitChange();\n });\n}\n\n/**\n * useAsyncFn resolves with whatever the SDK rejected with, and callers detect\n * failure via `instanceof Error`. Normalize non-Error rejections so they are\n * never mistaken for success.\n */\nfunction toError(reason: unknown, fallback: string): Error {\n if (reason instanceof Error) return reason;\n if (typeof reason === 'string') return new Error(reason);\n const message = (reason as { message?: unknown } | null)?.message;\n return new Error(typeof message === 'string' ? message : fallback);\n}\n\nexport function useWishlist(): UseWishlistResult {\n ensureSubscribed();\n const storedIds = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n const { t } = useTranslation();\n const failed = t('common.errors.error_occurred', 'Something went wrong');\n\n const [addState, addFn] = useAsyncFn(\n async (productId: number) => {\n const salla = window.salla;\n try {\n await salla?.wishlist.add(productId);\n } catch (reason) {\n throw toError(reason, failed);\n }\n if (!ids.includes(productId)) {\n ids = [...ids, productId];\n persistIds();\n emitChange();\n }\n },\n [failed]\n );\n\n const [removeState, removeFn] = useAsyncFn(\n async (productId: number) => {\n const salla = window.salla;\n try {\n await salla?.wishlist.remove(productId);\n } catch (reason) {\n throw toError(reason, failed);\n }\n ids = ids.filter((id) => id !== productId);\n persistIds();\n emitChange();\n },\n [failed]\n );\n\n const has = useCallback((productId: number) => storedIds.includes(productId), [storedIds]);\n\n const add = async (productId: number): Promise<boolean> =>\n !(((await addFn(productId)) as unknown) instanceof Error);\n\n const remove = async (productId: number): Promise<boolean> =>\n !(((await removeFn(productId)) as unknown) instanceof Error);\n\n const toggle = useCallback(\n (productId: number) => (has(productId) ? remove(productId) : add(productId)),\n [has, addFn, removeFn]\n );\n\n return {\n ids: storedIds,\n count: storedIds.length,\n has,\n add,\n remove,\n toggle,\n loading: addState.loading || removeState.loading,\n error: (addState.error ?? removeState.error)?.message ?? null,\n };\n}\n\nexport function resetWishlistStore() {\n ids = [];\n listeners.clear();\n subscribed = false;\n}\n"]}
@@ -1,9 +1,9 @@
1
- import { home } from './chunk-5HOD4BKK.js';
2
- import { product } from './chunk-H2DXJCJP.js';
3
- import { ProductCard } from './chunk-GVJHDJW7.js';
1
+ import { home } from './chunk-3CYIB6BL.js';
2
+ import { product } from './chunk-VFYT2VWC.js';
3
+ import { ProductCard } from './chunk-54XX3YPP.js';
4
4
  import { registry } from './chunk-342EPVXN.js';
5
5
  import { useTranslation } from './chunk-TYNZ5B2B.js';
6
- import { Image, LazyRenderWhenVisible } from './chunk-5O6PTKI5.js';
6
+ import { Image, LazyRenderWhenVisible } from './chunk-IXUY5RMV.js';
7
7
  import { Link } from './chunk-AXW67SY7.js';
8
8
  import { TwilightContext } from './chunk-DF6FBKDN.js';
9
9
  import { memo, useState, useCallback, createElement, useEffect, lazy, Component, useRef, useMemo, Suspense } from 'react';
@@ -707,5 +707,5 @@ var PageBlocks = memo(function PageBlocks2({ hook, scope }) {
707
707
  });
708
708
 
709
709
  export { BundleComponent, ComponentErrorBoundary, DefaultHomeComponents, FeaturedProductsStyle1, FeaturedProductsStyle2, FeaturedProductsStyle3, FixedBanner, FixedProducts, HomeComponentRenderer, LazyTestimonials, PageBlocks, ParallaxBackground, PhotosSlider, ProductsSlider, SquarePhotos, StoreFeatures, Youtube, registerHomeComponentConfig, registerHomeComponents };
710
- //# sourceMappingURL=chunk-2JL4S2LE.js.map
711
- //# sourceMappingURL=chunk-2JL4S2LE.js.map
710
+ //# sourceMappingURL=chunk-U53LIN2F.js.map
711
+ //# sourceMappingURL=chunk-U53LIN2F.js.map