@salla.sa/twilight-theme-engine 1.0.151 → 1.0.153

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 (233) hide show
  1. package/dist/{AddToCartForm-O6TPONV2.js → AddToCartForm-SOC5GBBM.js} +3 -3
  2. package/dist/{AddToCartForm-O6TPONV2.js.map → AddToCartForm-SOC5GBBM.js.map} +1 -1
  3. package/dist/{BlogAuthorPage-H6LRQ5YW.js → BlogAuthorPage-TTL4SIQA.js} +16 -16
  4. package/dist/{BlogAuthorPage-H6LRQ5YW.js.map → BlogAuthorPage-TTL4SIQA.js.map} +1 -1
  5. package/dist/{BlogCategoryPage-NORT43JE.js → BlogCategoryPage-RQ3VXFKP.js} +16 -16
  6. package/dist/{BlogCategoryPage-NORT43JE.js.map → BlogCategoryPage-RQ3VXFKP.js.map} +1 -1
  7. package/dist/{BlogPage-ZGTRTQT6.js → BlogPage-TAGSF4PK.js} +14 -14
  8. package/dist/{BlogPage-ZGTRTQT6.js.map → BlogPage-TAGSF4PK.js.map} +1 -1
  9. package/dist/{BlogSinglePage-G7TUMA4L.js → BlogSinglePage-WFECBPGR.js} +14 -14
  10. package/dist/{BlogSinglePage-G7TUMA4L.js.map → BlogSinglePage-WFECBPGR.js.map} +1 -1
  11. package/dist/{BlogTagPage-3LFUVXP3.js → BlogTagPage-LEUUDNOX.js} +16 -16
  12. package/dist/{BlogTagPage-3LFUVXP3.js.map → BlogTagPage-LEUUDNOX.js.map} +1 -1
  13. package/dist/{BrandsPage-NA5BVFVS.js → BrandsPage-3DKJL2UC.js} +15 -15
  14. package/dist/{BrandsPage-NA5BVFVS.js.map → BrandsPage-3DKJL2UC.js.map} +1 -1
  15. package/dist/{Breadcrumb-MNSFVYUT.js → Breadcrumb-CZUWG3RH.js} +14 -14
  16. package/dist/{Breadcrumb-MNSFVYUT.js.map → Breadcrumb-CZUWG3RH.js.map} +1 -1
  17. package/dist/{CartItem-N6OPII7B.js → CartItem-ZZZ34FK2.js} +14 -14
  18. package/dist/{CartItem-N6OPII7B.js.map → CartItem-ZZZ34FK2.js.map} +1 -1
  19. package/dist/{CartSummary-LGYAIG7C.js → CartSummary-YICFP2HG.js} +14 -14
  20. package/dist/{CartSummary-LGYAIG7C.js.map → CartSummary-YICFP2HG.js.map} +1 -1
  21. package/dist/{Copyright-YXWJNV5Q.js → Copyright-N7AWWM6R.js} +3 -3
  22. package/dist/{Copyright-YXWJNV5Q.js.map → Copyright-N7AWWM6R.js.map} +1 -1
  23. package/dist/{CustomerLayout-YU7TKV2Q.js → CustomerLayout-CDARXLTX.js} +14 -14
  24. package/dist/{CustomerLayout-YU7TKV2Q.js.map → CustomerLayout-CDARXLTX.js.map} +1 -1
  25. package/dist/{Footer-4QV4H67O.js → Footer-UAEQ5SBA.js} +4 -4
  26. package/dist/{Footer-4QV4H67O.js.map → Footer-UAEQ5SBA.js.map} +1 -1
  27. package/dist/{Header-DEUDDAWD.js → Header-TNV53WAC.js} +8 -8
  28. package/dist/{Header-DEUDDAWD.js.map → Header-TNV53WAC.js.map} +1 -1
  29. package/dist/{LatestProducts-KA54KWOQ.js → LatestProducts-CPULMFWH.js} +16 -16
  30. package/dist/{LatestProducts-KA54KWOQ.js.map → LatestProducts-CPULMFWH.js.map} +1 -1
  31. package/dist/{LoyaltyPage-7FJROQFU.js → LoyaltyPage-YYYXZOYO.js} +14 -14
  32. package/dist/{LoyaltyPage-7FJROQFU.js.map → LoyaltyPage-YYYXZOYO.js.map} +1 -1
  33. package/dist/{LoyaltyPointsPage-JXT65P5U.js → LoyaltyPointsPage-66N76CP7.js} +6 -6
  34. package/dist/{LoyaltyPointsPage-JXT65P5U.js.map → LoyaltyPointsPage-66N76CP7.js.map} +1 -1
  35. package/dist/{MainMenu-UOAPVNJH.js → MainMenu-7WKMQYJE.js} +5 -5
  36. package/dist/{MainMenu-UOAPVNJH.js.map → MainMenu-7WKMQYJE.js.map} +1 -1
  37. package/dist/{MasterLayout-Z45QJW3M.js → MasterLayout-NXS4567C.js} +14 -14
  38. package/dist/{MasterLayout-Z45QJW3M.js.map → MasterLayout-NXS4567C.js.map} +1 -1
  39. package/dist/{MobileMenu-A4QIBBYN.js → MobileMenu-2ISSFTOL.js} +15 -15
  40. package/dist/{MobileMenu-A4QIBBYN.js.map → MobileMenu-2ISSFTOL.js.map} +1 -1
  41. package/dist/{NotificationsPage-XU5IBNPR.js → NotificationsPage-GRLVJK4Q.js} +14 -14
  42. package/dist/{NotificationsPage-XU5IBNPR.js.map → NotificationsPage-GRLVJK4Q.js.map} +1 -1
  43. package/dist/{OrderSinglePage-5ANTMCBP.js → OrderSinglePage-XEX3ZDU4.js} +15 -15
  44. package/dist/{OrderSinglePage-5ANTMCBP.js.map → OrderSinglePage-XEX3ZDU4.js.map} +1 -1
  45. package/dist/{OrdersPage-LZLPSDZR.js → OrdersPage-7H5NZQYQ.js} +14 -14
  46. package/dist/{OrdersPage-LZLPSDZR.js.map → OrdersPage-7H5NZQYQ.js.map} +1 -1
  47. package/dist/{PageSingle-PMLCSRMC.js → PageSingle-Q6RGRZEC.js} +3 -3
  48. package/dist/{PageSingle-PMLCSRMC.js.map → PageSingle-Q6RGRZEC.js.map} +1 -1
  49. package/dist/{ProductDetails-ECPCGZLO.js → ProductDetails-6W6YIGUS.js} +4 -4
  50. package/dist/{ProductDetails-ECPCGZLO.js.map → ProductDetails-6W6YIGUS.js.map} +1 -1
  51. package/dist/{ProfilePage-XVWB4ZOO.js → ProfilePage-P5NHML4X.js} +14 -14
  52. package/dist/{ProfilePage-XVWB4ZOO.js.map → ProfilePage-P5NHML4X.js.map} +1 -1
  53. package/dist/{ReviewsPage-6EOSOIU4.js → ReviewsPage-D2EPXJJZ.js} +3 -3
  54. package/dist/{ReviewsPage-6EOSOIU4.js.map → ReviewsPage-D2EPXJJZ.js.map} +1 -1
  55. package/dist/{SeoCartWidget-TYNXS4UD.js → SeoCartWidget-VMNWM3FM.js} +14 -14
  56. package/dist/{SeoCartWidget-TYNXS4UD.js.map → SeoCartWidget-VMNWM3FM.js.map} +1 -1
  57. package/dist/{SettingsPage-BHW3CJC6.js → SettingsPage-JYEI7C4T.js} +14 -14
  58. package/dist/{SettingsPage-BHW3CJC6.js.map → SettingsPage-JYEI7C4T.js.map} +1 -1
  59. package/dist/{StoreClosedNotification-7YHL4XTT.js → StoreClosedNotification-U36UX33X.js} +15 -15
  60. package/dist/{StoreClosedNotification-7YHL4XTT.js.map → StoreClosedNotification-U36UX33X.js.map} +1 -1
  61. package/dist/{TestimonialsPage-ZY2U4QDN.js → TestimonialsPage-O2FN7CPT.js} +3 -3
  62. package/dist/{TestimonialsPage-ZY2U4QDN.js.map → TestimonialsPage-O2FN7CPT.js.map} +1 -1
  63. package/dist/{ThankYouPage-MINROTEH.js → ThankYouPage-UEHR5653.js} +14 -14
  64. package/dist/{ThankYouPage-MINROTEH.js.map → ThankYouPage-UEHR5653.js.map} +1 -1
  65. package/dist/{WalletPage-4VFAGWIE.js → WalletPage-5X37XHOU.js} +15 -15
  66. package/dist/{WalletPage-4VFAGWIE.js.map → WalletPage-5X37XHOU.js.map} +1 -1
  67. package/dist/{WebMcpTools-F42SFWVP.js → WebMcpTools-6ZN6KROP.js} +5 -5
  68. package/dist/{WebMcpTools-F42SFWVP.js.map → WebMcpTools-6ZN6KROP.js.map} +1 -1
  69. package/dist/{WishlistPage-VMM4YDMX.js → WishlistPage-2JCIUJEP.js} +16 -16
  70. package/dist/{WishlistPage-VMM4YDMX.js.map → WishlistPage-2JCIUJEP.js.map} +1 -1
  71. package/dist/api/advertisement.js +2 -2
  72. package/dist/api/apps.js +2 -2
  73. package/dist/api/blog.js +3 -3
  74. package/dist/api/brands.js +3 -3
  75. package/dist/api/cart.js +3 -3
  76. package/dist/api/category.js +3 -3
  77. package/dist/api/client.js +1 -1
  78. package/dist/api/home.js +2 -2
  79. package/dist/api/loyalty.js +3 -3
  80. package/dist/api/menu.js +2 -2
  81. package/dist/api/notification.js +2 -2
  82. package/dist/api/order.js +3 -3
  83. package/dist/api/page.js +3 -3
  84. package/dist/api/product.js +3 -3
  85. package/dist/api/profile.js +1 -1
  86. package/dist/api/store.js +2 -2
  87. package/dist/api/translations.js +2 -2
  88. package/dist/api/user.js +2 -2
  89. package/dist/api/wallet.js +2 -2
  90. package/dist/api/wishlist.js +4 -4
  91. package/dist/{chunk-LDXVGQA2.js → chunk-2BRLDR24.js} +3 -3
  92. package/dist/{chunk-LDXVGQA2.js.map → chunk-2BRLDR24.js.map} +1 -1
  93. package/dist/{chunk-CATEET2N.js → chunk-3YMCWKFT.js} +3 -3
  94. package/dist/{chunk-CATEET2N.js.map → chunk-3YMCWKFT.js.map} +1 -1
  95. package/dist/{chunk-CH6BNMS6.js → chunk-46CWPZSI.js} +3 -3
  96. package/dist/{chunk-CH6BNMS6.js.map → chunk-46CWPZSI.js.map} +1 -1
  97. package/dist/{chunk-DGPSZUI3.js → chunk-4FPHFWEU.js} +4 -4
  98. package/dist/{chunk-DGPSZUI3.js.map → chunk-4FPHFWEU.js.map} +1 -1
  99. package/dist/{chunk-DKIU6ZOP.js → chunk-4UPADKLB.js} +4 -4
  100. package/dist/{chunk-DKIU6ZOP.js.map → chunk-4UPADKLB.js.map} +1 -1
  101. package/dist/{chunk-OGEG4QHV.js → chunk-4XT63VFN.js} +3 -3
  102. package/dist/{chunk-OGEG4QHV.js.map → chunk-4XT63VFN.js.map} +1 -1
  103. package/dist/{chunk-77SZTUQE.js → chunk-53ULTYEF.js} +7 -7
  104. package/dist/{chunk-77SZTUQE.js.map → chunk-53ULTYEF.js.map} +1 -1
  105. package/dist/{chunk-RRDKYXHU.js → chunk-5WVJYMDS.js} +3 -3
  106. package/dist/{chunk-RRDKYXHU.js.map → chunk-5WVJYMDS.js.map} +1 -1
  107. package/dist/{chunk-A7E6XFZC.js → chunk-6REUUGFM.js} +15 -15
  108. package/dist/{chunk-A7E6XFZC.js.map → chunk-6REUUGFM.js.map} +1 -1
  109. package/dist/{chunk-GZUBV5S3.js → chunk-6VBQ6HJO.js} +3 -3
  110. package/dist/{chunk-GZUBV5S3.js.map → chunk-6VBQ6HJO.js.map} +1 -1
  111. package/dist/{chunk-DKPM4T4C.js → chunk-7RM7W4G7.js} +4 -4
  112. package/dist/{chunk-DKPM4T4C.js.map → chunk-7RM7W4G7.js.map} +1 -1
  113. package/dist/{chunk-LRQ75MWP.js → chunk-7TEJBYGD.js} +7 -7
  114. package/dist/{chunk-LRQ75MWP.js.map → chunk-7TEJBYGD.js.map} +1 -1
  115. package/dist/{chunk-K577255O.js → chunk-A5QIBUZ5.js} +7 -7
  116. package/dist/{chunk-K577255O.js.map → chunk-A5QIBUZ5.js.map} +1 -1
  117. package/dist/{chunk-T7H5KE5Y.js → chunk-AME4LBNH.js} +4 -4
  118. package/dist/{chunk-T7H5KE5Y.js.map → chunk-AME4LBNH.js.map} +1 -1
  119. package/dist/{chunk-OJ4PJK27.js → chunk-ASLHSLMC.js} +4 -4
  120. package/dist/{chunk-OJ4PJK27.js.map → chunk-ASLHSLMC.js.map} +1 -1
  121. package/dist/{chunk-F6MYOPZB.js → chunk-BBTYM4OY.js} +4 -4
  122. package/dist/{chunk-F6MYOPZB.js.map → chunk-BBTYM4OY.js.map} +1 -1
  123. package/dist/{chunk-H7A7LOQJ.js → chunk-DWWPRLD3.js} +3 -3
  124. package/dist/{chunk-H7A7LOQJ.js.map → chunk-DWWPRLD3.js.map} +1 -1
  125. package/dist/{chunk-YQ365K65.js → chunk-EMGVOEZZ.js} +3 -3
  126. package/dist/{chunk-YQ365K65.js.map → chunk-EMGVOEZZ.js.map} +1 -1
  127. package/dist/{chunk-GYJJX4EI.js → chunk-G4DDINNW.js} +4 -4
  128. package/dist/{chunk-GYJJX4EI.js.map → chunk-G4DDINNW.js.map} +1 -1
  129. package/dist/{chunk-5CXBBDJB.js → chunk-JIFM6LXR.js} +4 -4
  130. package/dist/{chunk-5CXBBDJB.js.map → chunk-JIFM6LXR.js.map} +1 -1
  131. package/dist/{chunk-KBWIXAHN.js → chunk-KAIASXU7.js} +6 -4
  132. package/dist/chunk-KAIASXU7.js.map +1 -0
  133. package/dist/{chunk-CEIXIUJ7.js → chunk-LDDZ7TUR.js} +4 -4
  134. package/dist/{chunk-CEIXIUJ7.js.map → chunk-LDDZ7TUR.js.map} +1 -1
  135. package/dist/{chunk-6R2AUQMP.js → chunk-LYKDZ74X.js} +3 -3
  136. package/dist/{chunk-6R2AUQMP.js.map → chunk-LYKDZ74X.js.map} +1 -1
  137. package/dist/{chunk-MVSOSNNB.js → chunk-MO2NP3WX.js} +5 -5
  138. package/dist/{chunk-MVSOSNNB.js.map → chunk-MO2NP3WX.js.map} +1 -1
  139. package/dist/{chunk-3JJQCRXD.js → chunk-O6O2PDH5.js} +4 -4
  140. package/dist/{chunk-3JJQCRXD.js.map → chunk-O6O2PDH5.js.map} +1 -1
  141. package/dist/{chunk-SF2POPJW.js → chunk-ONBDJMLJ.js} +3 -3
  142. package/dist/{chunk-SF2POPJW.js.map → chunk-ONBDJMLJ.js.map} +1 -1
  143. package/dist/{chunk-ULGRYCUV.js → chunk-P7RERWEY.js} +3 -3
  144. package/dist/{chunk-ULGRYCUV.js.map → chunk-P7RERWEY.js.map} +1 -1
  145. package/dist/{chunk-MQU6G2ZE.js → chunk-PBTIZ7UF.js} +4 -4
  146. package/dist/{chunk-MQU6G2ZE.js.map → chunk-PBTIZ7UF.js.map} +1 -1
  147. package/dist/{chunk-R6Z6JQIB.js → chunk-PSWUFTNS.js} +3 -3
  148. package/dist/{chunk-R6Z6JQIB.js.map → chunk-PSWUFTNS.js.map} +1 -1
  149. package/dist/{chunk-R4QBCQ4K.js → chunk-QEE2A7O2.js} +3 -3
  150. package/dist/{chunk-R4QBCQ4K.js.map → chunk-QEE2A7O2.js.map} +1 -1
  151. package/dist/{chunk-N2Y5VSHM.js → chunk-QJR5FRIA.js} +4 -4
  152. package/dist/{chunk-N2Y5VSHM.js.map → chunk-QJR5FRIA.js.map} +1 -1
  153. package/dist/chunk-T3GORIJL.js +69 -0
  154. package/dist/chunk-T3GORIJL.js.map +1 -0
  155. package/dist/{chunk-PHWFTUTE.js → chunk-T3UUH7YX.js} +5 -5
  156. package/dist/{chunk-PHWFTUTE.js.map → chunk-T3UUH7YX.js.map} +1 -1
  157. package/dist/{chunk-O7PJBTH3.js → chunk-TK2ZIYF6.js} +3 -3
  158. package/dist/{chunk-O7PJBTH3.js.map → chunk-TK2ZIYF6.js.map} +1 -1
  159. package/dist/{chunk-DXQUURZX.js → chunk-U7ZHPOGI.js} +7 -7
  160. package/dist/{chunk-DXQUURZX.js.map → chunk-U7ZHPOGI.js.map} +1 -1
  161. package/dist/{chunk-Z4BOATCC.js → chunk-WYMDZDEZ.js} +3 -3
  162. package/dist/{chunk-Z4BOATCC.js.map → chunk-WYMDZDEZ.js.map} +1 -1
  163. package/dist/{chunk-WZAJS44F.js → chunk-YBWXK2OT.js} +11 -11
  164. package/dist/{chunk-WZAJS44F.js.map → chunk-YBWXK2OT.js.map} +1 -1
  165. package/dist/{chunk-WJCDY35D.js → chunk-YY74QOIL.js} +5 -5
  166. package/dist/{chunk-WJCDY35D.js.map → chunk-YY74QOIL.js.map} +1 -1
  167. package/dist/{chunk-Q76O67KK.js → chunk-YZPHKPYI.js} +3 -3
  168. package/dist/{chunk-Q76O67KK.js.map → chunk-YZPHKPYI.js.map} +1 -1
  169. package/dist/{chunk-QNGA2NAC.js → chunk-ZHBZ6YMB.js} +4 -4
  170. package/dist/{chunk-QNGA2NAC.js.map → chunk-ZHBZ6YMB.js.map} +1 -1
  171. package/dist/{chunk-SBZWX6II.js → chunk-ZKTSLYTT.js} +3 -3
  172. package/dist/{chunk-SBZWX6II.js.map → chunk-ZKTSLYTT.js.map} +1 -1
  173. package/dist/components/cart/index.js +1 -1
  174. package/dist/components/common/index.js +1 -1
  175. package/dist/components/drawer/index.js +12 -12
  176. package/dist/components/home/index.js +17 -17
  177. package/dist/components/layout/index.js +4 -4
  178. package/dist/components/product/index.js +14 -14
  179. package/dist/components/store/index.js +13 -13
  180. package/dist/dev/editor/index.js +1 -1
  181. package/dist/dev/index.js +1 -1
  182. package/dist/{document-class-QZXX5ZEE.js → document-class-YJDZSSZA.js} +12 -12
  183. package/dist/{document-class-QZXX5ZEE.js.map → document-class-YJDZSSZA.js.map} +1 -1
  184. package/dist/hooks/index.js +12 -12
  185. package/dist/hooks/useGtm.js +12 -12
  186. package/dist/hooks/useMoney.js +12 -12
  187. package/dist/hooks/useStore.js +12 -12
  188. package/dist/hooks/useUser.js +3 -3
  189. package/dist/index.js +12 -12
  190. package/dist/{navigation-DF4JEVKE.js → navigation-W43IKI56.js} +5 -5
  191. package/dist/{navigation-DF4JEVKE.js.map → navigation-W43IKI56.js.map} +1 -1
  192. package/dist/{navigation-FKU75TCE.js → navigation-XQLKHMIZ.js} +4 -4
  193. package/dist/{navigation-FKU75TCE.js.map → navigation-XQLKHMIZ.js.map} +1 -1
  194. package/dist/{not-found-E72Z34CJ.js → not-found-LE7TH53E.js} +15 -15
  195. package/dist/{not-found-E72Z34CJ.js.map → not-found-LE7TH53E.js.map} +1 -1
  196. package/dist/providers/index.js +12 -12
  197. package/dist/routes/account/orders.js +4 -4
  198. package/dist/routes/account.js +13 -13
  199. package/dist/routes/blog.js +8 -8
  200. package/dist/routes/brands.js +4 -4
  201. package/dist/routes/cart.js +21 -21
  202. package/dist/routes/home.js +18 -18
  203. package/dist/routes/index.js +3 -3
  204. package/dist/routes/loyalty.js +5 -5
  205. package/dist/routes/page/loader.d.ts.map +1 -1
  206. package/dist/routes/page.js +5 -4
  207. package/dist/routes/page.js.map +1 -1
  208. package/dist/routes/product/loader.d.ts.map +1 -1
  209. package/dist/routes/product-listing.js +22 -22
  210. package/dist/routes/product.js +18 -17
  211. package/dist/routes/product.js.map +1 -1
  212. package/dist/routes/seo-redirects.d.ts +12 -0
  213. package/dist/routes/seo-redirects.d.ts.map +1 -1
  214. package/dist/routes/seo-redirects.js +3 -3
  215. package/dist/routes/testimonials.js +2 -2
  216. package/dist/routes/thank-you.js +4 -4
  217. package/dist/skeleton.js +18 -18
  218. package/dist/{store-lookup-LPXG5JSB.js → store-lookup-FL54XOJB.js} +8 -8
  219. package/dist/{store-lookup-LPXG5JSB.js.map → store-lookup-FL54XOJB.js.map} +1 -1
  220. package/dist/tanstack/link.d.ts.map +1 -1
  221. package/dist/tanstack/templates/locale-wrapper.d.ts +3 -1
  222. package/dist/tanstack/templates/locale-wrapper.d.ts.map +1 -1
  223. package/dist/tanstack.js +12 -12
  224. package/dist/utils/index.js +2 -2
  225. package/dist/vite/index.js +31 -11
  226. package/dist/vite/index.js.map +1 -1
  227. package/package.json +1 -1
  228. package/tailwind/routes/page/loader.ts.txt +4 -0
  229. package/tailwind/routes/product/loader.ts.txt +5 -0
  230. package/tailwind/routes/seo-redirects.ts.txt +52 -2
  231. package/dist/chunk-3ULBL56H.js +0 -41
  232. package/dist/chunk-3ULBL56H.js.map +0 -1
  233. package/dist/chunk-KBWIXAHN.js.map +0 -1
@@ -1,9 +1,9 @@
1
- export { OrderSingle, OrderSinglePage, Orders, OrdersPage, orderSingleLoader, ordersLoader } from '../../chunk-K577255O.js';
2
- import '../../chunk-3JJQCRXD.js';
1
+ export { OrderSingle, OrderSinglePage, Orders, OrdersPage, orderSingleLoader, ordersLoader } from '../../chunk-A5QIBUZ5.js';
2
+ import '../../chunk-O6O2PDH5.js';
3
3
  import '../../chunk-M2MJKUQF.js';
4
- import '../../chunk-H7A7LOQJ.js';
4
+ import '../../chunk-DWWPRLD3.js';
5
5
  import '../../chunk-OUW6WESU.js';
6
- import '../../chunk-YQ365K65.js';
6
+ import '../../chunk-EMGVOEZZ.js';
7
7
  import '../../chunk-Z5M4YYWT.js';
8
8
  import '../../chunk-IURXJAIK.js';
9
9
  import '../../chunk-7IVHY4OR.js';
@@ -1,13 +1,13 @@
1
- import { wallet } from '../chunk-O7PJBTH3.js';
2
- export { OrderSingle, OrderSinglePage, Orders, OrdersPage, orderSingleLoader, ordersLoader } from '../chunk-K577255O.js';
3
- import '../chunk-3JJQCRXD.js';
4
- import { notification } from '../chunk-OGEG4QHV.js';
5
- import { wishlist } from '../chunk-OJ4PJK27.js';
6
- import '../chunk-CEIXIUJ7.js';
1
+ import { wallet } from '../chunk-TK2ZIYF6.js';
2
+ export { OrderSingle, OrderSinglePage, Orders, OrdersPage, orderSingleLoader, ordersLoader } from '../chunk-A5QIBUZ5.js';
3
+ import '../chunk-O6O2PDH5.js';
4
+ import { notification } from '../chunk-4XT63VFN.js';
5
+ import { wishlist } from '../chunk-ASLHSLMC.js';
6
+ import '../chunk-LDDZ7TUR.js';
7
7
  import { buildHreflangAlternates } from '../chunk-M2MJKUQF.js';
8
- import { unauthorized, orUnauthorized } from '../chunk-H7A7LOQJ.js';
8
+ import { unauthorized, orUnauthorized } from '../chunk-DWWPRLD3.js';
9
9
  import { RouteId } from '../chunk-OUW6WESU.js';
10
- import { getAuthToken } from '../chunk-YQ365K65.js';
10
+ import { getAuthToken } from '../chunk-EMGVOEZZ.js';
11
11
  import '../chunk-Z5M4YYWT.js';
12
12
  import '../chunk-IURXJAIK.js';
13
13
  import '../chunk-7IVHY4OR.js';
@@ -32,7 +32,7 @@ async function profileLoader(_ctx) {
32
32
 
33
33
  // src/routes/account/profile/index.tsx
34
34
  var LazyProfilePage = lazyComponent(
35
- () => import('../ProfilePage-XVWB4ZOO.js').then((m) => ({ default: m.ProfilePage }))
35
+ () => import('../ProfilePage-P5NHML4X.js').then((m) => ({ default: m.ProfilePage }))
36
36
  );
37
37
  var ProfilePage = LazyProfilePage;
38
38
  var Profile = {
@@ -74,7 +74,7 @@ async function wishlistLoader(ctx) {
74
74
 
75
75
  // src/routes/account/wishlist/index.tsx
76
76
  var LazyWishlistPage = lazyComponent(
77
- () => import('../WishlistPage-VMM4YDMX.js').then((m) => ({ default: m.WishlistPage }))
77
+ () => import('../WishlistPage-2JCIUJEP.js').then((m) => ({ default: m.WishlistPage }))
78
78
  );
79
79
  var WishlistPage = LazyWishlistPage;
80
80
  var Wishlist = {
@@ -117,7 +117,7 @@ async function walletLoader(ctx) {
117
117
 
118
118
  // src/routes/account/wallet/index.tsx
119
119
  var LazyWalletPage = lazyComponent(
120
- () => import('../WalletPage-4VFAGWIE.js').then((m) => ({ default: m.WalletPage }))
120
+ () => import('../WalletPage-5X37XHOU.js').then((m) => ({ default: m.WalletPage }))
121
121
  );
122
122
  var WalletPage = LazyWalletPage;
123
123
  var Wallet = {
@@ -154,7 +154,7 @@ async function notificationsLoader(_ctx) {
154
154
 
155
155
  // src/routes/account/notifications/index.tsx
156
156
  var LazyNotificationsPage = lazyComponent(
157
- () => import('../NotificationsPage-XU5IBNPR.js').then((m) => ({ default: m.NotificationsPage }))
157
+ () => import('../NotificationsPage-GRLVJK4Q.js').then((m) => ({ default: m.NotificationsPage }))
158
158
  );
159
159
  var NotificationsPage = LazyNotificationsPage;
160
160
  var Notifications = {
@@ -187,7 +187,7 @@ async function settingsLoader(_ctx) {
187
187
 
188
188
  // src/routes/account/settings/index.tsx
189
189
  var LazySettingsPage = lazyComponent(
190
- () => import('../SettingsPage-BHW3CJC6.js').then((m) => ({ default: m.SettingsPage }))
190
+ () => import('../SettingsPage-JYEI7C4T.js').then((m) => ({ default: m.SettingsPage }))
191
191
  );
192
192
  var SettingsPage = LazySettingsPage;
193
193
  var Settings = {
@@ -1,8 +1,8 @@
1
- import { blog } from '../chunk-QNGA2NAC.js';
1
+ import { blog } from '../chunk-ZHBZ6YMB.js';
2
2
  import { buildHreflangAlternates } from '../chunk-M2MJKUQF.js';
3
- import { notFound, orThrow, responseStatusOf } from '../chunk-H7A7LOQJ.js';
3
+ import { notFound, orThrow, responseStatusOf } from '../chunk-DWWPRLD3.js';
4
4
  import { RouteId } from '../chunk-OUW6WESU.js';
5
- import '../chunk-YQ365K65.js';
5
+ import '../chunk-EMGVOEZZ.js';
6
6
  import '../chunk-Z5M4YYWT.js';
7
7
  import '../chunk-IURXJAIK.js';
8
8
  import '../chunk-7IVHY4OR.js';
@@ -155,19 +155,19 @@ async function blogTagLoader({
155
155
 
156
156
  // src/routes/blog/index.tsx
157
157
  var LazyBlogPage = lazyComponent(
158
- () => import('../BlogPage-ZGTRTQT6.js').then((m) => ({ default: m.BlogPage }))
158
+ () => import('../BlogPage-TAGSF4PK.js').then((m) => ({ default: m.BlogPage }))
159
159
  );
160
160
  var LazyBlogSinglePage = lazyComponent(
161
- () => import('../BlogSinglePage-G7TUMA4L.js').then((m) => ({ default: m.BlogSinglePage }))
161
+ () => import('../BlogSinglePage-WFECBPGR.js').then((m) => ({ default: m.BlogSinglePage }))
162
162
  );
163
163
  var LazyBlogAuthorPage = lazyComponent(
164
- () => import('../BlogAuthorPage-H6LRQ5YW.js').then((m) => ({ default: m.BlogAuthorPage }))
164
+ () => import('../BlogAuthorPage-TTL4SIQA.js').then((m) => ({ default: m.BlogAuthorPage }))
165
165
  );
166
166
  var LazyBlogCategoryPage = lazyComponent(
167
- () => import('../BlogCategoryPage-NORT43JE.js').then((m) => ({ default: m.BlogCategoryPage }))
167
+ () => import('../BlogCategoryPage-RQ3VXFKP.js').then((m) => ({ default: m.BlogCategoryPage }))
168
168
  );
169
169
  var LazyBlogTagPage = lazyComponent(
170
- () => import('../BlogTagPage-3LFUVXP3.js').then((m) => ({ default: m.BlogTagPage }))
170
+ () => import('../BlogTagPage-LEUUDNOX.js').then((m) => ({ default: m.BlogTagPage }))
171
171
  );
172
172
  var BlogPage = LazyBlogPage;
173
173
  var BlogSinglePage = LazyBlogSinglePage;
@@ -1,8 +1,8 @@
1
- import { brand } from '../chunk-N2Y5VSHM.js';
1
+ import { brand } from '../chunk-QJR5FRIA.js';
2
2
  import { buildHreflangAlternates } from '../chunk-M2MJKUQF.js';
3
- import '../chunk-H7A7LOQJ.js';
3
+ import '../chunk-DWWPRLD3.js';
4
4
  import { RouteId } from '../chunk-OUW6WESU.js';
5
- import '../chunk-YQ365K65.js';
5
+ import '../chunk-EMGVOEZZ.js';
6
6
  import '../chunk-Z5M4YYWT.js';
7
7
  import '../chunk-IURXJAIK.js';
8
8
  import '../chunk-7IVHY4OR.js';
@@ -26,7 +26,7 @@ async function brandsLoader() {
26
26
 
27
27
  // src/routes/brands/index.tsx
28
28
  var LazyBrandsPage = lazyComponent(
29
- () => import('../BrandsPage-NA5BVFVS.js').then((m) => ({ default: m.BrandsPage }))
29
+ () => import('../BrandsPage-3DKJL2UC.js').then((m) => ({ default: m.BrandsPage }))
30
30
  );
31
31
  var BrandsPage = LazyBrandsPage;
32
32
  async function brandsLoaderWithExtend(_ctx, extend) {
@@ -1,36 +1,36 @@
1
- import { cart } from '../chunk-GYJJX4EI.js';
2
- import { loyalty } from '../chunk-T7H5KE5Y.js';
1
+ import { cart } from '../chunk-G4DDINNW.js';
2
+ import { loyalty } from '../chunk-AME4LBNH.js';
3
3
  import { CartSkeleton } from '../chunk-N7CCSGZF.js';
4
- import '../chunk-PHWFTUTE.js';
4
+ import '../chunk-T3UUH7YX.js';
5
5
  import '../chunk-IXHM24Z4.js';
6
- import '../chunk-LRQ75MWP.js';
7
- import '../chunk-R4QBCQ4K.js';
8
- import '../chunk-CEIXIUJ7.js';
9
- import { LazySeoCartWidget, LazyCartItem, LazyCartSummary } from '../chunk-MVSOSNNB.js';
10
- import '../chunk-WJCDY35D.js';
11
- import '../chunk-DGPSZUI3.js';
6
+ import '../chunk-7TEJBYGD.js';
7
+ import '../chunk-QEE2A7O2.js';
8
+ import '../chunk-LDDZ7TUR.js';
9
+ import { LazySeoCartWidget, LazyCartItem, LazyCartSummary } from '../chunk-MO2NP3WX.js';
10
+ import '../chunk-YY74QOIL.js';
11
+ import '../chunk-4FPHFWEU.js';
12
12
  import '../chunk-Y32RHCOH.js';
13
- import '../chunk-A7E6XFZC.js';
13
+ import '../chunk-6REUUGFM.js';
14
14
  import '../chunk-Q77J3D2W.js';
15
- import '../chunk-DXQUURZX.js';
16
- import '../chunk-CH6BNMS6.js';
15
+ import '../chunk-U7ZHPOGI.js';
16
+ import '../chunk-46CWPZSI.js';
17
17
  import '../chunk-GMXNVBCD.js';
18
18
  import '../chunk-X55R4VVK.js';
19
19
  import '../chunk-YL6X3ZMG.js';
20
- import '../chunk-CATEET2N.js';
20
+ import '../chunk-3YMCWKFT.js';
21
21
  import '../chunk-OXMUPNMH.js';
22
- import '../chunk-6R2AUQMP.js';
22
+ import '../chunk-LYKDZ74X.js';
23
23
  import '../chunk-VVZNW5CB.js';
24
24
  import '../chunk-VDPMCOHX.js';
25
25
  import '../chunk-GD26FI4J.js';
26
26
  import '../chunk-BRIRWS2Q.js';
27
27
  import { buildHreflangAlternates } from '../chunk-M2MJKUQF.js';
28
- import '../chunk-H7A7LOQJ.js';
28
+ import '../chunk-DWWPRLD3.js';
29
29
  import { RouteId } from '../chunk-OUW6WESU.js';
30
30
  import '../chunk-PPUV27YN.js';
31
31
  import '../chunk-HI5V5X3S.js';
32
- import '../chunk-RRDKYXHU.js';
33
- import '../chunk-R6Z6JQIB.js';
32
+ import '../chunk-5WVJYMDS.js';
33
+ import '../chunk-PSWUFTNS.js';
34
34
  import '../chunk-6T55LXJL.js';
35
35
  import '../chunk-Z653O7MX.js';
36
36
  import '../chunk-ZCH7W7DZ.js';
@@ -41,16 +41,16 @@ import '../chunk-7V36I5GT.js';
41
41
  import '../chunk-6WI7R2BD.js';
42
42
  import '../chunk-LFMCUQQ3.js';
43
43
  import '../chunk-OAMIDZKW.js';
44
- import '../chunk-LDXVGQA2.js';
44
+ import '../chunk-2BRLDR24.js';
45
45
  import '../chunk-OQIIJRAS.js';
46
46
  import '../chunk-V2ZDTY6H.js';
47
- import '../chunk-Z4BOATCC.js';
47
+ import '../chunk-WYMDZDEZ.js';
48
48
  import { HookSlot } from '../chunk-5XDPAKF5.js';
49
49
  import '../chunk-GCPEMNSU.js';
50
- import '../chunk-YQ365K65.js';
50
+ import '../chunk-EMGVOEZZ.js';
51
51
  import '../chunk-Z5M4YYWT.js';
52
52
  import { useTranslation } from '../chunk-TYNZ5B2B.js';
53
- import { LazyBreadcrumb, LazyNoContent } from '../chunk-SF2POPJW.js';
53
+ import { LazyBreadcrumb, LazyNoContent } from '../chunk-ONBDJMLJ.js';
54
54
  import '../chunk-AXW67SY7.js';
55
55
  import '../chunk-BYMOPN2S.js';
56
56
  import '../chunk-SKLEJJ6M.js';
@@ -1,32 +1,32 @@
1
- export { Home, HomeSkeleton, homeLoader } from '../chunk-PHWFTUTE.js';
1
+ export { Home, HomeSkeleton, homeLoader } from '../chunk-T3UUH7YX.js';
2
2
  import '../chunk-IXHM24Z4.js';
3
- export { DefaultHomeComponents, registerHomeComponentConfig, registerHomeComponents } from '../chunk-LRQ75MWP.js';
4
- import '../chunk-R4QBCQ4K.js';
5
- import '../chunk-CEIXIUJ7.js';
6
- import '../chunk-WJCDY35D.js';
7
- import '../chunk-DGPSZUI3.js';
3
+ export { DefaultHomeComponents, registerHomeComponentConfig, registerHomeComponents } from '../chunk-7TEJBYGD.js';
4
+ import '../chunk-QEE2A7O2.js';
5
+ import '../chunk-LDDZ7TUR.js';
6
+ import '../chunk-YY74QOIL.js';
7
+ import '../chunk-4FPHFWEU.js';
8
8
  import '../chunk-Y32RHCOH.js';
9
- import '../chunk-A7E6XFZC.js';
9
+ import '../chunk-6REUUGFM.js';
10
10
  import '../chunk-Q77J3D2W.js';
11
- import '../chunk-DXQUURZX.js';
12
- import '../chunk-CH6BNMS6.js';
11
+ import '../chunk-U7ZHPOGI.js';
12
+ import '../chunk-46CWPZSI.js';
13
13
  import '../chunk-GMXNVBCD.js';
14
14
  import '../chunk-X55R4VVK.js';
15
15
  import '../chunk-YL6X3ZMG.js';
16
- import '../chunk-CATEET2N.js';
16
+ import '../chunk-3YMCWKFT.js';
17
17
  import '../chunk-OXMUPNMH.js';
18
- import '../chunk-6R2AUQMP.js';
18
+ import '../chunk-LYKDZ74X.js';
19
19
  import '../chunk-VVZNW5CB.js';
20
20
  import '../chunk-VDPMCOHX.js';
21
21
  import '../chunk-GD26FI4J.js';
22
22
  import '../chunk-BRIRWS2Q.js';
23
23
  import '../chunk-M2MJKUQF.js';
24
- import '../chunk-H7A7LOQJ.js';
24
+ import '../chunk-DWWPRLD3.js';
25
25
  import '../chunk-OUW6WESU.js';
26
26
  import '../chunk-PPUV27YN.js';
27
27
  import '../chunk-HI5V5X3S.js';
28
- import '../chunk-RRDKYXHU.js';
29
- import '../chunk-R6Z6JQIB.js';
28
+ import '../chunk-5WVJYMDS.js';
29
+ import '../chunk-PSWUFTNS.js';
30
30
  import '../chunk-6T55LXJL.js';
31
31
  import '../chunk-Z653O7MX.js';
32
32
  import '../chunk-ZCH7W7DZ.js';
@@ -37,16 +37,16 @@ import '../chunk-7V36I5GT.js';
37
37
  import '../chunk-6WI7R2BD.js';
38
38
  import '../chunk-LFMCUQQ3.js';
39
39
  import '../chunk-OAMIDZKW.js';
40
- import '../chunk-LDXVGQA2.js';
40
+ import '../chunk-2BRLDR24.js';
41
41
  import '../chunk-OQIIJRAS.js';
42
42
  import '../chunk-V2ZDTY6H.js';
43
- import '../chunk-Z4BOATCC.js';
43
+ import '../chunk-WYMDZDEZ.js';
44
44
  import '../chunk-5XDPAKF5.js';
45
45
  import '../chunk-GCPEMNSU.js';
46
- import '../chunk-YQ365K65.js';
46
+ import '../chunk-EMGVOEZZ.js';
47
47
  import '../chunk-Z5M4YYWT.js';
48
48
  import '../chunk-TYNZ5B2B.js';
49
- import '../chunk-SF2POPJW.js';
49
+ import '../chunk-ONBDJMLJ.js';
50
50
  import '../chunk-AXW67SY7.js';
51
51
  import '../chunk-BYMOPN2S.js';
52
52
  import '../chunk-SKLEJJ6M.js';
@@ -1,7 +1,7 @@
1
- export { slugBrandRedirectLoader } from '../chunk-3ULBL56H.js';
2
- import '../chunk-H7A7LOQJ.js';
1
+ export { slugBrandRedirectLoader } from '../chunk-T3GORIJL.js';
2
+ import '../chunk-DWWPRLD3.js';
3
3
  import '../chunk-OUW6WESU.js';
4
- import '../chunk-YQ365K65.js';
4
+ import '../chunk-EMGVOEZZ.js';
5
5
  import '../chunk-Z5M4YYWT.js';
6
6
  import '../chunk-TYNZ5B2B.js';
7
7
  import '../chunk-IURXJAIK.js';
@@ -1,8 +1,8 @@
1
- import { loyalty } from '../chunk-T7H5KE5Y.js';
1
+ import { loyalty } from '../chunk-AME4LBNH.js';
2
2
  import { buildHreflangAlternates } from '../chunk-M2MJKUQF.js';
3
- import { unauthorized, orUnauthorized, redirect } from '../chunk-H7A7LOQJ.js';
3
+ import { unauthorized, orUnauthorized, redirect } from '../chunk-DWWPRLD3.js';
4
4
  import { RouteId } from '../chunk-OUW6WESU.js';
5
- import { getAuthToken } from '../chunk-YQ365K65.js';
5
+ import { getAuthToken } from '../chunk-EMGVOEZZ.js';
6
6
  import '../chunk-Z5M4YYWT.js';
7
7
  import '../chunk-IURXJAIK.js';
8
8
  import '../chunk-7IVHY4OR.js';
@@ -59,10 +59,10 @@ async function loyaltyPointsLoader(locale) {
59
59
 
60
60
  // src/routes/loyalty/index.tsx
61
61
  var LazyLoyaltyPage = lazyComponent(
62
- () => import('../LoyaltyPage-7FJROQFU.js').then((m) => ({ default: m.LoyaltyPage }))
62
+ () => import('../LoyaltyPage-YYYXZOYO.js').then((m) => ({ default: m.LoyaltyPage }))
63
63
  );
64
64
  var LazyLoyaltyPointsPage = lazyComponent(
65
- () => import('../LoyaltyPointsPage-JXT65P5U.js').then((m) => ({ default: m.LoyaltyPointsPage }))
65
+ () => import('../LoyaltyPointsPage-66N76CP7.js').then((m) => ({ default: m.LoyaltyPointsPage }))
66
66
  );
67
67
  var LoyaltyPage = LazyLoyaltyPage;
68
68
  var LoyaltyPointsPage = LazyLoyaltyPointsPage;
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/routes/page/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAIzC,wBAAsB,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAajG"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/routes/page/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKzC,wBAAsB,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAgBjG"}
@@ -1,8 +1,8 @@
1
- import { page } from '../chunk-DKPM4T4C.js';
1
+ import { page } from '../chunk-7RM7W4G7.js';
2
2
  import { buildHreflangAlternates } from '../chunk-M2MJKUQF.js';
3
- import '../chunk-H7A7LOQJ.js';
3
+ import { notFound } from '../chunk-DWWPRLD3.js';
4
4
  import { RouteId } from '../chunk-OUW6WESU.js';
5
- import '../chunk-YQ365K65.js';
5
+ import '../chunk-EMGVOEZZ.js';
6
6
  import '../chunk-Z5M4YYWT.js';
7
7
  import '../chunk-IURXJAIK.js';
8
8
  import '../chunk-7IVHY4OR.js';
@@ -15,6 +15,7 @@ import '../chunk-DGUM43GV.js';
15
15
 
16
16
  // src/routes/page/loader.ts
17
17
  async function pageSingleLoader({ params }) {
18
+ if (!/^\d+$/.test(params.id)) throw notFound();
18
19
  const data = await page.findOrThrow(params.id);
19
20
  return {
20
21
  page: {
@@ -31,7 +32,7 @@ async function pageSingleLoader({ params }) {
31
32
 
32
33
  // src/routes/page/index.tsx
33
34
  var LazyPageSingle = lazyComponent(
34
- () => import('../PageSingle-PMLCSRMC.js').then((m) => ({ default: m.PageSingle }))
35
+ () => import('../PageSingle-Q6RGRZEC.js').then((m) => ({ default: m.PageSingle }))
35
36
  );
36
37
  var PageSingleLazy = LazyPageSingle;
37
38
  async function loader(ctx, extend) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/routes/page/loader.ts","../../src/routes/page/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAKA,eAAsB,gBAAA,CAAiB,EAAE,MAAA,EAAO,EAAmD;AACjG,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,WAAA,CAAY,OAAO,EAAE,CAAA;AAC7C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,MAAM,OAAA,CAAQ,WAAA;AAAA,MACd,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,OAAO,IAAA,CAAK,IAAA;AAAA,MACZ,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK;AAAA;AACnB,GACF;AACF;;;ACPA,IAAM,cAAA,GAAiB,aAAA;AAAA,EAAc,MACnC,OAAO,2BAAc,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,UAAA,EAAW,CAAE;AAChE,CAAA;AAEO,IAAM,cAAA,GAAiB;AAI9B,eAAe,MAAA,CACb,KACA,MAAA,EAI0B;AAC1B,EAAA,MAAM,OAAO,MAAM,gBAAA,CAAiB,EAAE,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA;AAE1D,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA;AACpC,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,GAAG,KAAA,EAAM;AAAA,EAC7B;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,IAAA,CAAK,KAAsB,IAAA,EAAuC;AACzE,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,CAAK,KAAA;AACxB,EAAA,MAAM,cAAc,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,OAAA,CAAQ,YAAY,EAAE,CAAA;AAE7D,EAAA,MAAM,IAAA,GAAuB;AAAA,IAC3B,KAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,EAAW,KAAK,IAAA,CAAK,GAAA;AAAA,IACrB,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,SAAA;AAAA,MACN,KAAA;AAAA,MACA,WAAA;AAAA,MACA,GAAA,EAAK,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,aAAA,EAAe,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,cAAA;AAAA,MACrC,YAAA,EAAc,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY;AAAA,KACtC;AAAA,IACA,oBAAoB,uBAAA,CAAwB,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,SAAS,QAAQ;AAAA,GACjF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,UAAA,GAAa;AAAA,EACxB,IAAI,OAAA,CAAQ,WAAA;AAAA,EACZ,MAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA,EAAW;AACb","file":"page.js","sourcesContent":["import type { PageSingleProps } from './types';\nimport type { IdParams } from '../types';\nimport { page } from '../../api/page';\nimport { RouteId } from '../../router/route-ids';\n\nexport async function pageSingleLoader({ params }: { params: IdParams }): Promise<PageSingleProps> {\n const data = await page.findOrThrow(params.id);\n return {\n page: {\n slug: RouteId.PAGE_SINGLE,\n id: data.id,\n title: data.name,\n url: data.url,\n content: data.content,\n metadata: data.metadata,\n created_at: data.created_at,\n },\n };\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\n\nimport { pageSingleLoader } from './loader';\nimport type { PageSingleProps } from './types';\nimport type { IdParams } from '../types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\nimport { lazyComponent } from '../../utils/lazy-component';\n\n// Lazy-load component for code-splitting\nconst LazyPageSingle = lazyComponent(() =>\n import('./PageSingle').then((m) => ({ default: m.PageSingle }))\n);\n\nexport const PageSingleLazy = LazyPageSingle;\nexport { pageSingleLoader } from './loader';\nexport type { PageSingleProps, StaticPage } from './types';\n\nasync function loader(\n ctx: { params: IdParams; locale?: string },\n extend?: (\n data: PageSingleProps,\n ctx: { params: IdParams }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<PageSingleProps> {\n const data = await pageSingleLoader({ params: ctx.params });\n\n if (extend) {\n const extra = await extend(data, ctx);\n return { ...data, ...extra } as PageSingleProps;\n }\n return data;\n}\n\nfunction head(ctx: TwilightContext, data: PageSingleProps): HeadDescriptor {\n const title = data.page.title;\n const description = data.page.content?.replace(/<[^>]+>/g, '');\n\n const base: HeadDescriptor = {\n title,\n description,\n canonical: data.page.url,\n openGraph: {\n type: 'article',\n title,\n description,\n url: data.page.url,\n publishedTime: data.page.created_at?.published_time,\n modifiedTime: data.page.created_at?.modified_time,\n },\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const PageSingle = {\n id: RouteId.PAGE_SINGLE,\n loader,\n head,\n Component: LazyPageSingle,\n} as const;\n"]}
1
+ {"version":3,"sources":["../../src/routes/page/loader.ts","../../src/routes/page/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAMA,eAAsB,gBAAA,CAAiB,EAAE,MAAA,EAAO,EAAmD;AAGjG,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,OAAO,EAAE,CAAA,QAAS,QAAA,EAAS;AAC7C,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,WAAA,CAAY,OAAO,EAAE,CAAA;AAC7C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,MAAM,OAAA,CAAQ,WAAA;AAAA,MACd,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,OAAO,IAAA,CAAK,IAAA;AAAA,MACZ,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK;AAAA;AACnB,GACF;AACF;;;ACXA,IAAM,cAAA,GAAiB,aAAA;AAAA,EAAc,MACnC,OAAO,2BAAc,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,UAAA,EAAW,CAAE;AAChE,CAAA;AAEO,IAAM,cAAA,GAAiB;AAI9B,eAAe,MAAA,CACb,KACA,MAAA,EAI0B;AAC1B,EAAA,MAAM,OAAO,MAAM,gBAAA,CAAiB,EAAE,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA;AAE1D,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA;AACpC,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,GAAG,KAAA,EAAM;AAAA,EAC7B;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,IAAA,CAAK,KAAsB,IAAA,EAAuC;AACzE,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,CAAK,KAAA;AACxB,EAAA,MAAM,cAAc,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,OAAA,CAAQ,YAAY,EAAE,CAAA;AAE7D,EAAA,MAAM,IAAA,GAAuB;AAAA,IAC3B,KAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,EAAW,KAAK,IAAA,CAAK,GAAA;AAAA,IACrB,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,SAAA;AAAA,MACN,KAAA;AAAA,MACA,WAAA;AAAA,MACA,GAAA,EAAK,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,aAAA,EAAe,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,cAAA;AAAA,MACrC,YAAA,EAAc,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY;AAAA,KACtC;AAAA,IACA,oBAAoB,uBAAA,CAAwB,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,SAAS,QAAQ;AAAA,GACjF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,UAAA,GAAa;AAAA,EACxB,IAAI,OAAA,CAAQ,WAAA;AAAA,EACZ,MAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA,EAAW;AACb","file":"page.js","sourcesContent":["import type { PageSingleProps } from './types';\nimport type { IdParams } from '../types';\nimport { page } from '../../api/page';\nimport { RouteId } from '../../router/route-ids';\nimport { notFound } from '../../providers/NavigationProvider';\n\nexport async function pageSingleLoader({ params }: { params: IdParams }): Promise<PageSingleProps> {\n // A page id is digits; anything else gets the API's 403 or Cloudflare's 400, not a 404, and\n // the error page went out as a 500, as for a product (`productLoader`).\n if (!/^\\d+$/.test(params.id)) throw notFound();\n const data = await page.findOrThrow(params.id);\n return {\n page: {\n slug: RouteId.PAGE_SINGLE,\n id: data.id,\n title: data.name,\n url: data.url,\n content: data.content,\n metadata: data.metadata,\n created_at: data.created_at,\n },\n };\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\n\nimport { pageSingleLoader } from './loader';\nimport type { PageSingleProps } from './types';\nimport type { IdParams } from '../types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\nimport { lazyComponent } from '../../utils/lazy-component';\n\n// Lazy-load component for code-splitting\nconst LazyPageSingle = lazyComponent(() =>\n import('./PageSingle').then((m) => ({ default: m.PageSingle }))\n);\n\nexport const PageSingleLazy = LazyPageSingle;\nexport { pageSingleLoader } from './loader';\nexport type { PageSingleProps, StaticPage } from './types';\n\nasync function loader(\n ctx: { params: IdParams; locale?: string },\n extend?: (\n data: PageSingleProps,\n ctx: { params: IdParams }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<PageSingleProps> {\n const data = await pageSingleLoader({ params: ctx.params });\n\n if (extend) {\n const extra = await extend(data, ctx);\n return { ...data, ...extra } as PageSingleProps;\n }\n return data;\n}\n\nfunction head(ctx: TwilightContext, data: PageSingleProps): HeadDescriptor {\n const title = data.page.title;\n const description = data.page.content?.replace(/<[^>]+>/g, '');\n\n const base: HeadDescriptor = {\n title,\n description,\n canonical: data.page.url,\n openGraph: {\n type: 'article',\n title,\n description,\n url: data.page.url,\n publishedTime: data.page.created_at?.published_time,\n modifiedTime: data.page.created_at?.modified_time,\n },\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const PageSingle = {\n id: RouteId.PAGE_SINGLE,\n loader,\n head,\n Component: LazyPageSingle,\n} as const;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/routes/product/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAMzC,wBAAsB,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2B/F"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/routes/product/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAOzC,wBAAsB,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+B/F"}
@@ -1,37 +1,37 @@
1
- import { useAppliedFilters } from '../chunk-DKIU6ZOP.js';
2
- export { parseFiltersFromSearch, useAppliedFilters } from '../chunk-DKIU6ZOP.js';
3
- import { dispatchProductsFetched } from '../chunk-ULGRYCUV.js';
1
+ import { useAppliedFilters } from '../chunk-4UPADKLB.js';
2
+ export { parseFiltersFromSearch, useAppliedFilters } from '../chunk-4UPADKLB.js';
3
+ import { dispatchProductsFetched } from '../chunk-P7RERWEY.js';
4
4
  import { SORT_IDS, availableSortIds, sortOptions } from '../chunk-3LZJXKVO.js';
5
- import { category } from '../chunk-F6MYOPZB.js';
6
- import { brand } from '../chunk-N2Y5VSHM.js';
7
- import { useReorderButtons, LazyTestimonials } from '../chunk-LRQ75MWP.js';
8
- import '../chunk-R4QBCQ4K.js';
9
- import { product, parseNextPageToken } from '../chunk-CEIXIUJ7.js';
5
+ import { category } from '../chunk-BBTYM4OY.js';
6
+ import { brand } from '../chunk-QJR5FRIA.js';
7
+ import { useReorderButtons, LazyTestimonials } from '../chunk-7TEJBYGD.js';
8
+ import '../chunk-QEE2A7O2.js';
9
+ import { product, parseNextPageToken } from '../chunk-LDDZ7TUR.js';
10
10
  import { Drawer } from '../chunk-6TKIUG5C.js';
11
- import '../chunk-WJCDY35D.js';
12
- import { ProductCard } from '../chunk-DGPSZUI3.js';
11
+ import '../chunk-YY74QOIL.js';
12
+ import { ProductCard } from '../chunk-4FPHFWEU.js';
13
13
  import { registry, COMPONENT_KEYS } from '../chunk-Y32RHCOH.js';
14
- import { useStore } from '../chunk-A7E6XFZC.js';
14
+ import { useStore } from '../chunk-6REUUGFM.js';
15
15
  import '../chunk-Q77J3D2W.js';
16
- import '../chunk-DXQUURZX.js';
17
- import '../chunk-CH6BNMS6.js';
16
+ import '../chunk-U7ZHPOGI.js';
17
+ import '../chunk-46CWPZSI.js';
18
18
  import '../chunk-GMXNVBCD.js';
19
19
  import '../chunk-X55R4VVK.js';
20
20
  import '../chunk-YL6X3ZMG.js';
21
- import '../chunk-CATEET2N.js';
21
+ import '../chunk-3YMCWKFT.js';
22
22
  import '../chunk-OXMUPNMH.js';
23
- import '../chunk-6R2AUQMP.js';
23
+ import '../chunk-LYKDZ74X.js';
24
24
  import '../chunk-VVZNW5CB.js';
25
25
  import '../chunk-VDPMCOHX.js';
26
26
  import '../chunk-GD26FI4J.js';
27
27
  import '../chunk-BRIRWS2Q.js';
28
28
  import { buildHreflangAlternates, storePageUrl } from '../chunk-M2MJKUQF.js';
29
- import { unauthorized, notFound, orThrow, useNavigate, useLocation } from '../chunk-H7A7LOQJ.js';
29
+ import { unauthorized, notFound, orThrow, useNavigate, useLocation } from '../chunk-DWWPRLD3.js';
30
30
  import { RouteId } from '../chunk-OUW6WESU.js';
31
31
  import '../chunk-PPUV27YN.js';
32
32
  import '../chunk-HI5V5X3S.js';
33
- import '../chunk-RRDKYXHU.js';
34
- import '../chunk-R6Z6JQIB.js';
33
+ import '../chunk-5WVJYMDS.js';
34
+ import '../chunk-PSWUFTNS.js';
35
35
  import '../chunk-6T55LXJL.js';
36
36
  import '../chunk-Z653O7MX.js';
37
37
  import '../chunk-ZCH7W7DZ.js';
@@ -42,16 +42,16 @@ import '../chunk-7V36I5GT.js';
42
42
  import '../chunk-6WI7R2BD.js';
43
43
  import '../chunk-LFMCUQQ3.js';
44
44
  import '../chunk-OAMIDZKW.js';
45
- import '../chunk-LDXVGQA2.js';
45
+ import '../chunk-2BRLDR24.js';
46
46
  import '../chunk-OQIIJRAS.js';
47
47
  import '../chunk-V2ZDTY6H.js';
48
- import '../chunk-Z4BOATCC.js';
48
+ import '../chunk-WYMDZDEZ.js';
49
49
  import { HookSlot } from '../chunk-5XDPAKF5.js';
50
50
  import '../chunk-GCPEMNSU.js';
51
- import { getAuthToken } from '../chunk-YQ365K65.js';
51
+ import { getAuthToken } from '../chunk-EMGVOEZZ.js';
52
52
  import '../chunk-Z5M4YYWT.js';
53
53
  import { useTranslation } from '../chunk-TYNZ5B2B.js';
54
- import { LazyBreadcrumb, Image, LazyNoContent, ProductCardSkeleton, LazyRenderWhenVisible } from '../chunk-SF2POPJW.js';
54
+ import { LazyBreadcrumb, Image, LazyNoContent, ProductCardSkeleton, LazyRenderWhenVisible } from '../chunk-ONBDJMLJ.js';
55
55
  import '../chunk-AXW67SY7.js';
56
56
  import '../chunk-BYMOPN2S.js';
57
57
  import '../chunk-SKLEJJ6M.js';
@@ -1,30 +1,30 @@
1
- import { ProductsSlider, LazyTestimonials } from '../chunk-LRQ75MWP.js';
2
- import '../chunk-R4QBCQ4K.js';
3
- import { product } from '../chunk-CEIXIUJ7.js';
4
- import { ProductGallery, LazyProductDetails, LazyAddToCartForm } from '../chunk-WJCDY35D.js';
5
- import '../chunk-DGPSZUI3.js';
1
+ import { ProductsSlider, LazyTestimonials } from '../chunk-7TEJBYGD.js';
2
+ import '../chunk-QEE2A7O2.js';
3
+ import { product } from '../chunk-LDDZ7TUR.js';
4
+ import { ProductGallery, LazyProductDetails, LazyAddToCartForm } from '../chunk-YY74QOIL.js';
5
+ import '../chunk-4FPHFWEU.js';
6
6
  import '../chunk-Y32RHCOH.js';
7
- import { fastCheckoutScript } from '../chunk-A7E6XFZC.js';
7
+ import { fastCheckoutScript } from '../chunk-6REUUGFM.js';
8
8
  import '../chunk-Q77J3D2W.js';
9
- import '../chunk-DXQUURZX.js';
10
- import '../chunk-CH6BNMS6.js';
9
+ import '../chunk-U7ZHPOGI.js';
10
+ import '../chunk-46CWPZSI.js';
11
11
  import '../chunk-GMXNVBCD.js';
12
12
  import '../chunk-X55R4VVK.js';
13
13
  import '../chunk-YL6X3ZMG.js';
14
- import '../chunk-CATEET2N.js';
14
+ import '../chunk-3YMCWKFT.js';
15
15
  import '../chunk-OXMUPNMH.js';
16
- import '../chunk-6R2AUQMP.js';
16
+ import '../chunk-LYKDZ74X.js';
17
17
  import '../chunk-VVZNW5CB.js';
18
18
  import '../chunk-VDPMCOHX.js';
19
19
  import '../chunk-GD26FI4J.js';
20
20
  import '../chunk-BRIRWS2Q.js';
21
21
  import { buildHreflangAlternates } from '../chunk-M2MJKUQF.js';
22
- import '../chunk-H7A7LOQJ.js';
22
+ import { notFound } from '../chunk-DWWPRLD3.js';
23
23
  import { RouteId } from '../chunk-OUW6WESU.js';
24
24
  import { useComments } from '../chunk-PPUV27YN.js';
25
25
  import '../chunk-HI5V5X3S.js';
26
- import '../chunk-RRDKYXHU.js';
27
- import '../chunk-R6Z6JQIB.js';
26
+ import '../chunk-5WVJYMDS.js';
27
+ import '../chunk-PSWUFTNS.js';
28
28
  import '../chunk-6T55LXJL.js';
29
29
  import '../chunk-Z653O7MX.js';
30
30
  import '../chunk-ZCH7W7DZ.js';
@@ -35,16 +35,16 @@ import '../chunk-7V36I5GT.js';
35
35
  import '../chunk-6WI7R2BD.js';
36
36
  import '../chunk-LFMCUQQ3.js';
37
37
  import '../chunk-OAMIDZKW.js';
38
- import '../chunk-LDXVGQA2.js';
38
+ import '../chunk-2BRLDR24.js';
39
39
  import '../chunk-OQIIJRAS.js';
40
40
  import '../chunk-V2ZDTY6H.js';
41
- import '../chunk-Z4BOATCC.js';
41
+ import '../chunk-WYMDZDEZ.js';
42
42
  import { HookSlot } from '../chunk-5XDPAKF5.js';
43
43
  import '../chunk-GCPEMNSU.js';
44
- import { getActiveCurrency } from '../chunk-YQ365K65.js';
44
+ import { getActiveCurrency } from '../chunk-EMGVOEZZ.js';
45
45
  import '../chunk-Z5M4YYWT.js';
46
46
  import { useTranslation } from '../chunk-TYNZ5B2B.js';
47
- import { LazyBreadcrumb, LazyRenderWhenVisible } from '../chunk-SF2POPJW.js';
47
+ import { LazyBreadcrumb, LazyRenderWhenVisible } from '../chunk-ONBDJMLJ.js';
48
48
  import '../chunk-AXW67SY7.js';
49
49
  import '../chunk-BYMOPN2S.js';
50
50
  import '../chunk-SKLEJJ6M.js';
@@ -68,6 +68,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
68
68
 
69
69
  // src/routes/product/loader.ts
70
70
  async function productLoader({ params }) {
71
+ if (!/^\d+$/.test(params.id)) throw notFound();
71
72
  const data = await product.findOrThrow(params.id);
72
73
  const i18n = getTwilightContext().i18n;
73
74
  const home = { name: i18n.t("common.titles.home"), url: "/" };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/routes/product/loader.ts","../../src/routes/product/ProductPage.tsx","../../src/routes/product/index.tsx"],"names":["product"],"mappings":"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","file":"product.js","sourcesContent":["import type { ProductPageProps } from './types';\nimport type { IdParams } from '../types';\nimport { product } from '../../api/product';\nimport { getTwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\nimport type { Breadcrumb } from '../../types';\n\nexport async function productLoader({ params }: { params: IdParams }): Promise<ProductPageProps> {\n const data = await product.findOrThrow(params.id);\n const i18n = getTwilightContext().i18n;\n const home: Breadcrumb = { name: i18n.t('common.titles.home'), url: '/' };\n\n const breadcrumbs: Breadcrumb[] = [home];\n if (data.category) {\n breadcrumbs.push({ name: data.category.name, url: data.category.url });\n }\n breadcrumbs.push({ name: data.name, url: data.url });\n\n const page = {\n slug: RouteId.PRODUCT_SINGLE,\n id: data.id,\n title: data.name,\n url: data.url,\n parent:\n data.category && data.category.id\n ? { id: data.category.id, name: data.category.name, url: data.category.url }\n : null,\n breadcrumbs,\n };\n\n return {\n page,\n product: data,\n };\n}\n","import { SallaQuickOrder } from '@salla.sa/twilight-components-react/quick-order';\nimport { SallaOffer } from '@salla.sa/twilight-components-react/offer';\nimport { SallaComments } from '@salla.sa/twilight-components-react/comments';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useProduct } from '../../hooks/useProduct';\nimport { useComments } from '../../hooks/useComments';\nimport type { ProductPageProps } from './types';\nimport { Breadcrumb, RenderWhenVisible } from '../../components/common';\nimport { ProductDetails, AddToCartForm, ProductGallery } from '../../components/product';\nimport { ProductsSlider, Testimonials } from '../../components/home';\nimport { useTwilight } from '../../providers/twilight-context';\n\nexport function ProductPage({ product: initialProduct, page }: ProductPageProps) {\n const { theme, store } = useTwilight();\n const { t } = useTranslation();\n const { product } = useProduct(initialProduct);\n const { commentsKey } = useComments();\n\n return (\n <div key={product.id}>\n <div className=\"container\">\n {theme?.settings?.product_show_breadcrumbs !== false && <Breadcrumb page={page} />}\n\n <HookSlot name=\"product:start\" />\n\n <div className=\"flex flex-col items-start md:flex-row\" id={`product-${product.id}`}>\n <ProductGallery product={product} />\n\n <div className=\"main-content md:sticky md:overflow-hidden top-24 w-full md:w-2/4 md:pb-16\">\n <HookSlot name=\"product:details.start\" />\n <ProductDetails product={product} showTags={theme.settings.show_tags} />\n <HookSlot name=\"product:details.end\" />\n\n <HookSlot name=\"product:single.form.start\" />\n <AddToCartForm product={product} stickyAddToCart={theme.settings.sticky_add_to_cart} />\n <HookSlot name=\"product:single.form.end\" />\n {/* After the form, as in Twig; `.start` and `description` are in ProductDetails */}\n <HookSlot name=\"product:single.description.end\" context={{ product }} />\n\n <SallaQuickOrder className=\"mt-5 md:-mb-2 block\" />\n </div>\n </div>\n\n <SallaOffer />\n </div>\n\n {store.settings?.rating?.show_on_product && (\n <RenderWhenVisible>\n <SallaComments key={commentsKey} itemId={Number(product.id)} type={'product' as any} />\n </RenderWhenVisible>\n )}\n\n <HookSlot name=\"product:related.start\" />\n <RenderWhenVisible>\n <div className=\"container\">\n <ProductsSlider\n data={{\n products: { source: 'related', source_value: Number(product.id) },\n title: t('pages.products.similar_products'),\n display_all_url: '',\n }}\n />\n </div>\n </RenderWhenVisible>\n <HookSlot name=\"product:related.end\" />\n\n <RenderWhenVisible>\n <div className=\"container\">\n <Testimonials data={{}} />\n </div>\n </RenderWhenVisible>\n\n <HookSlot name=\"product:end\" />\n </div>\n );\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport type { ProductPageProps } from './types';\nimport type { IdParams } from '../types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { productLoader } from './loader';\nimport { RouteId } from '../../router/route-ids';\nimport { ProductPage } from './ProductPage';\nimport { fastCheckoutScript } from '../../utils/fast-checkout';\nimport { getActiveCurrency } from '../../api/client';\nexport { productLoader } from './loader';\nexport type { ProductPageProps } from './types';\n\nasync function loader(\n ctx: { params: IdParams; locale?: string },\n extend?: (\n data: ProductPageProps,\n ctx: { params: IdParams }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<ProductPageProps> {\n const data = await productLoader({ params: ctx.params });\n\n if (extend) {\n const extra = await extend(data, ctx);\n return { ...data, ...extra } as ProductPageProps;\n }\n return data;\n}\n\nfunction head(ctx: TwilightContext, data: ProductPageProps): HeadDescriptor {\n if (!data?.product) {\n return {\n title: 'Products',\n description: 'Browse our products',\n };\n }\n const product = data.product;\n const storeName = ctx.settings?.store?.name ?? '';\n\n // Strip HTML and limit description to 160 chars\n const description = product.description?.replace(/<[^>]*>/g, '').slice(0, 160) ?? '';\n\n // Price valid until: 1 month from now\n const priceValidUntil = new Date();\n priceValidUntil.setMonth(priceValidUntil.getMonth() + 1);\n\n // Collect all product images\n const images = product.images?.map((img) => img.url).filter(Boolean) ?? [];\n if (product.image?.url && !images.includes(product.image.url)) {\n images.unshift(product.image.url);\n }\n\n // Build JSON-LD schema matching SchemaProductWidget.php\n const jsonLd: Record<string, unknown> = {\n '@context': 'https://schema.org',\n '@type': 'Product',\n name: product.name,\n description,\n sku: product.sku,\n image: images.length > 0 ? images : undefined,\n offers: {\n '@type': 'Offer',\n url: product.url,\n availability: product.is_available\n ? 'https://schema.org/InStock'\n : 'https://schema.org/OutOfStock',\n price: product.sale_price,\n priceCurrency: getActiveCurrency(product.currency),\n priceValidUntil: priceValidUntil.toISOString().split('T')[0],\n seller: storeName\n ? {\n '@type': 'Organization',\n name: storeName,\n }\n : undefined,\n },\n };\n\n // Add brand if exists\n if (product.brand) {\n jsonLd.brand = {\n '@type': 'Brand',\n name: product.brand.name,\n description: product.brand.description,\n logo: product.brand.logo,\n };\n }\n\n // Add aggregateRating and review if rating exists\n if (product.rating && product.rating.count > 0) {\n const ratingValue = product.rating.stars;\n jsonLd.aggregateRating = {\n '@type': 'AggregateRating',\n ratingCount: product.rating.count,\n ratingValue,\n };\n jsonLd.review = {\n '@type': 'Review',\n author: storeName\n ? {\n '@type': 'Organization',\n name: storeName,\n }\n : undefined,\n reviewRating: {\n '@type': 'Rating',\n bestRating: 5,\n ratingValue,\n },\n };\n }\n\n if (product.gtin && product.gtin.length === 8) {\n jsonLd.gtin8 = product.gtin;\n }\n\n if (product.mpn) {\n jsonLd.mpn = product.mpn;\n }\n\n // Twig: \"<product> | <store name>\", without the store meta title.\n const title = storeName ? `${product.name} | ${storeName}` : product.name;\n const base: HeadDescriptor = {\n title,\n appendStoreTitle: false,\n description,\n canonical: product.url,\n openGraph: {\n type: 'product',\n title,\n description,\n images: product.image?.url,\n url: product.url,\n },\n twitter: {\n card: 'summary_large_image',\n title,\n description,\n images: product.image?.url,\n },\n jsonLd,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n // Quick-buy widget code, eager only here: the Buy Now button is above the fold on this page.\n // Other routes load it on idle from the body:end default hook, which also owns the\n // `#fast-checkout-js` marker `salla-add-product-button` checks for.\n scripts: ctx.settings?.store?.settings?.buy_now ? [fastCheckoutScript()] : [],\n };\n\n return base;\n}\n\nexport const Product = {\n id: RouteId.PRODUCT_SINGLE,\n loader,\n head,\n Component: ProductPage,\n} as const;\n"]}
1
+ {"version":3,"sources":["../../src/routes/product/loader.ts","../../src/routes/product/ProductPage.tsx","../../src/routes/product/index.tsx"],"names":["product"],"mappings":"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","file":"product.js","sourcesContent":["import type { ProductPageProps } from './types';\nimport type { IdParams } from '../types';\nimport { product } from '../../api/product';\nimport { getTwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\nimport type { Breadcrumb } from '../../types';\nimport { notFound } from '../../providers/NavigationProvider';\n\nexport async function productLoader({ params }: { params: IdParams }): Promise<ProductPageProps> {\n // A product id is digits. Anything else is put in the API path as it is, and the API answers\n // neither 404 nor 410 for it: `hello.html` is a 403 and `oc%u0022xx` Cloudflare's 400, so the\n // error page went out as a 500 (`/php_info.html` matches `p{$id}`, and scanners ask for it).\n if (!/^\\d+$/.test(params.id)) throw notFound();\n const data = await product.findOrThrow(params.id);\n const i18n = getTwilightContext().i18n;\n const home: Breadcrumb = { name: i18n.t('common.titles.home'), url: '/' };\n\n const breadcrumbs: Breadcrumb[] = [home];\n if (data.category) {\n breadcrumbs.push({ name: data.category.name, url: data.category.url });\n }\n breadcrumbs.push({ name: data.name, url: data.url });\n\n const page = {\n slug: RouteId.PRODUCT_SINGLE,\n id: data.id,\n title: data.name,\n url: data.url,\n parent:\n data.category && data.category.id\n ? { id: data.category.id, name: data.category.name, url: data.category.url }\n : null,\n breadcrumbs,\n };\n\n return {\n page,\n product: data,\n };\n}\n","import { SallaQuickOrder } from '@salla.sa/twilight-components-react/quick-order';\nimport { SallaOffer } from '@salla.sa/twilight-components-react/offer';\nimport { SallaComments } from '@salla.sa/twilight-components-react/comments';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useProduct } from '../../hooks/useProduct';\nimport { useComments } from '../../hooks/useComments';\nimport type { ProductPageProps } from './types';\nimport { Breadcrumb, RenderWhenVisible } from '../../components/common';\nimport { ProductDetails, AddToCartForm, ProductGallery } from '../../components/product';\nimport { ProductsSlider, Testimonials } from '../../components/home';\nimport { useTwilight } from '../../providers/twilight-context';\n\nexport function ProductPage({ product: initialProduct, page }: ProductPageProps) {\n const { theme, store } = useTwilight();\n const { t } = useTranslation();\n const { product } = useProduct(initialProduct);\n const { commentsKey } = useComments();\n\n return (\n <div key={product.id}>\n <div className=\"container\">\n {theme?.settings?.product_show_breadcrumbs !== false && <Breadcrumb page={page} />}\n\n <HookSlot name=\"product:start\" />\n\n <div className=\"flex flex-col items-start md:flex-row\" id={`product-${product.id}`}>\n <ProductGallery product={product} />\n\n <div className=\"main-content md:sticky md:overflow-hidden top-24 w-full md:w-2/4 md:pb-16\">\n <HookSlot name=\"product:details.start\" />\n <ProductDetails product={product} showTags={theme.settings.show_tags} />\n <HookSlot name=\"product:details.end\" />\n\n <HookSlot name=\"product:single.form.start\" />\n <AddToCartForm product={product} stickyAddToCart={theme.settings.sticky_add_to_cart} />\n <HookSlot name=\"product:single.form.end\" />\n {/* After the form, as in Twig; `.start` and `description` are in ProductDetails */}\n <HookSlot name=\"product:single.description.end\" context={{ product }} />\n\n <SallaQuickOrder className=\"mt-5 md:-mb-2 block\" />\n </div>\n </div>\n\n <SallaOffer />\n </div>\n\n {store.settings?.rating?.show_on_product && (\n <RenderWhenVisible>\n <SallaComments key={commentsKey} itemId={Number(product.id)} type={'product' as any} />\n </RenderWhenVisible>\n )}\n\n <HookSlot name=\"product:related.start\" />\n <RenderWhenVisible>\n <div className=\"container\">\n <ProductsSlider\n data={{\n products: { source: 'related', source_value: Number(product.id) },\n title: t('pages.products.similar_products'),\n display_all_url: '',\n }}\n />\n </div>\n </RenderWhenVisible>\n <HookSlot name=\"product:related.end\" />\n\n <RenderWhenVisible>\n <div className=\"container\">\n <Testimonials data={{}} />\n </div>\n </RenderWhenVisible>\n\n <HookSlot name=\"product:end\" />\n </div>\n );\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport type { ProductPageProps } from './types';\nimport type { IdParams } from '../types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { productLoader } from './loader';\nimport { RouteId } from '../../router/route-ids';\nimport { ProductPage } from './ProductPage';\nimport { fastCheckoutScript } from '../../utils/fast-checkout';\nimport { getActiveCurrency } from '../../api/client';\nexport { productLoader } from './loader';\nexport type { ProductPageProps } from './types';\n\nasync function loader(\n ctx: { params: IdParams; locale?: string },\n extend?: (\n data: ProductPageProps,\n ctx: { params: IdParams }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<ProductPageProps> {\n const data = await productLoader({ params: ctx.params });\n\n if (extend) {\n const extra = await extend(data, ctx);\n return { ...data, ...extra } as ProductPageProps;\n }\n return data;\n}\n\nfunction head(ctx: TwilightContext, data: ProductPageProps): HeadDescriptor {\n if (!data?.product) {\n return {\n title: 'Products',\n description: 'Browse our products',\n };\n }\n const product = data.product;\n const storeName = ctx.settings?.store?.name ?? '';\n\n // Strip HTML and limit description to 160 chars\n const description = product.description?.replace(/<[^>]*>/g, '').slice(0, 160) ?? '';\n\n // Price valid until: 1 month from now\n const priceValidUntil = new Date();\n priceValidUntil.setMonth(priceValidUntil.getMonth() + 1);\n\n // Collect all product images\n const images = product.images?.map((img) => img.url).filter(Boolean) ?? [];\n if (product.image?.url && !images.includes(product.image.url)) {\n images.unshift(product.image.url);\n }\n\n // Build JSON-LD schema matching SchemaProductWidget.php\n const jsonLd: Record<string, unknown> = {\n '@context': 'https://schema.org',\n '@type': 'Product',\n name: product.name,\n description,\n sku: product.sku,\n image: images.length > 0 ? images : undefined,\n offers: {\n '@type': 'Offer',\n url: product.url,\n availability: product.is_available\n ? 'https://schema.org/InStock'\n : 'https://schema.org/OutOfStock',\n price: product.sale_price,\n priceCurrency: getActiveCurrency(product.currency),\n priceValidUntil: priceValidUntil.toISOString().split('T')[0],\n seller: storeName\n ? {\n '@type': 'Organization',\n name: storeName,\n }\n : undefined,\n },\n };\n\n // Add brand if exists\n if (product.brand) {\n jsonLd.brand = {\n '@type': 'Brand',\n name: product.brand.name,\n description: product.brand.description,\n logo: product.brand.logo,\n };\n }\n\n // Add aggregateRating and review if rating exists\n if (product.rating && product.rating.count > 0) {\n const ratingValue = product.rating.stars;\n jsonLd.aggregateRating = {\n '@type': 'AggregateRating',\n ratingCount: product.rating.count,\n ratingValue,\n };\n jsonLd.review = {\n '@type': 'Review',\n author: storeName\n ? {\n '@type': 'Organization',\n name: storeName,\n }\n : undefined,\n reviewRating: {\n '@type': 'Rating',\n bestRating: 5,\n ratingValue,\n },\n };\n }\n\n if (product.gtin && product.gtin.length === 8) {\n jsonLd.gtin8 = product.gtin;\n }\n\n if (product.mpn) {\n jsonLd.mpn = product.mpn;\n }\n\n // Twig: \"<product> | <store name>\", without the store meta title.\n const title = storeName ? `${product.name} | ${storeName}` : product.name;\n const base: HeadDescriptor = {\n title,\n appendStoreTitle: false,\n description,\n canonical: product.url,\n openGraph: {\n type: 'product',\n title,\n description,\n images: product.image?.url,\n url: product.url,\n },\n twitter: {\n card: 'summary_large_image',\n title,\n description,\n images: product.image?.url,\n },\n jsonLd,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n // Quick-buy widget code, eager only here: the Buy Now button is above the fold on this page.\n // Other routes load it on idle from the body:end default hook, which also owns the\n // `#fast-checkout-js` marker `salla-add-product-button` checks for.\n scripts: ctx.settings?.store?.settings?.buy_now ? [fastCheckoutScript()] : [],\n };\n\n return base;\n}\n\nexport const Product = {\n id: RouteId.PRODUCT_SINGLE,\n loader,\n head,\n Component: ProductPage,\n} as const;\n"]}