@salla.sa/twilight-theme-engine 1.0.108 → 1.0.110

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 (324) hide show
  1. package/dist/{AddToCartForm-CF4H32X7.js → AddToCartForm-JKGAATX3.js} +3 -3
  2. package/dist/{AddToCartForm-CF4H32X7.js.map → AddToCartForm-JKGAATX3.js.map} +1 -1
  3. package/dist/{BlogAuthorPage-LHYDUFDA.js → BlogAuthorPage-GM2T2QPS.js} +29 -28
  4. package/dist/BlogAuthorPage-GM2T2QPS.js.map +1 -0
  5. package/dist/{BlogCategoryPage-6BORI4YG.js → BlogCategoryPage-KSC5UCJY.js} +29 -28
  6. package/dist/BlogCategoryPage-KSC5UCJY.js.map +1 -0
  7. package/dist/{BlogPage-TSRWNX6M.js → BlogPage-5QTDYSZR.js} +27 -26
  8. package/dist/BlogPage-5QTDYSZR.js.map +1 -0
  9. package/dist/{BlogSinglePage-TLTW67S7.js → BlogSinglePage-JKRNJ3P7.js} +27 -26
  10. package/dist/BlogSinglePage-JKRNJ3P7.js.map +1 -0
  11. package/dist/{BlogTagPage-RAMP5XNR.js → BlogTagPage-JTOBAXV2.js} +29 -28
  12. package/dist/BlogTagPage-JTOBAXV2.js.map +1 -0
  13. package/dist/{BrandsPage-KUFEUFVZ.js → BrandsPage-6IEMAQ3V.js} +28 -27
  14. package/dist/BrandsPage-6IEMAQ3V.js.map +1 -0
  15. package/dist/{Breadcrumb-ZS3ZMMTM.js → Breadcrumb-267KWOPY.js} +27 -26
  16. package/dist/Breadcrumb-267KWOPY.js.map +1 -0
  17. package/dist/{CartItem-7QCAQ3QQ.js → CartItem-BUP3WUZC.js} +27 -26
  18. package/dist/CartItem-BUP3WUZC.js.map +1 -0
  19. package/dist/{CartSummary-ZPG7IAXE.js → CartSummary-U3MOISSP.js} +27 -26
  20. package/dist/CartSummary-U3MOISSP.js.map +1 -0
  21. package/dist/{Copyright-VPJMIQSO.js → Copyright-FSNCI3EE.js} +3 -3
  22. package/dist/{Copyright-VPJMIQSO.js.map → Copyright-FSNCI3EE.js.map} +1 -1
  23. package/dist/{CustomerLayout-E5FYPKT4.js → CustomerLayout-JCOMMGZ7.js} +27 -26
  24. package/dist/CustomerLayout-JCOMMGZ7.js.map +1 -0
  25. package/dist/{Footer-GIPFBQEY.js → Footer-VP3IBUMQ.js} +5 -4
  26. package/dist/{Footer-GIPFBQEY.js.map → Footer-VP3IBUMQ.js.map} +1 -1
  27. package/dist/Header-3YOZ7XLJ.js +22 -0
  28. package/dist/{Header-HYTNO4IR.js.map → Header-3YOZ7XLJ.js.map} +1 -1
  29. package/dist/{LoyaltyPage-YMK7SISF.js → LoyaltyPage-5X42RIJQ.js} +27 -26
  30. package/dist/LoyaltyPage-5X42RIJQ.js.map +1 -0
  31. package/dist/{LoyaltyPointsPage-V2463UQ6.js → LoyaltyPointsPage-67KYJN2Z.js} +10 -9
  32. package/dist/LoyaltyPointsPage-67KYJN2Z.js.map +1 -0
  33. package/dist/{MainMenu-IP6AVEIF.js → MainMenu-FYIK55JU.js} +8 -8
  34. package/dist/{MainMenu-IP6AVEIF.js.map → MainMenu-FYIK55JU.js.map} +1 -1
  35. package/dist/MaintenancePage-UBJ5Q3L5.js +7 -0
  36. package/dist/{MaintenancePage-Z34IQCUV.js.map → MaintenancePage-UBJ5Q3L5.js.map} +1 -1
  37. package/dist/MasterLayout-UMZHQTU2.js +54 -0
  38. package/dist/{MasterLayout-3YSR4VFQ.js.map → MasterLayout-UMZHQTU2.js.map} +1 -1
  39. package/dist/{MobileMenu-ZJLXCG4P.js → MobileMenu-FFPJYJ7F.js} +28 -27
  40. package/dist/MobileMenu-FFPJYJ7F.js.map +1 -0
  41. package/dist/{NotificationsPage-XKSW3DFD.js → NotificationsPage-HKJN6ME2.js} +27 -26
  42. package/dist/NotificationsPage-HKJN6ME2.js.map +1 -0
  43. package/dist/{OrderSinglePage-WSUNHCY6.js → OrderSinglePage-ASYL4SMQ.js} +28 -27
  44. package/dist/OrderSinglePage-ASYL4SMQ.js.map +1 -0
  45. package/dist/{OrdersPage-TAME5ACG.js → OrdersPage-IQXHFGLQ.js} +27 -26
  46. package/dist/OrdersPage-IQXHFGLQ.js.map +1 -0
  47. package/dist/{PageSingle-MYDLIP55.js → PageSingle-B4WQVQVQ.js} +7 -7
  48. package/dist/{PageSingle-MYDLIP55.js.map → PageSingle-B4WQVQVQ.js.map} +1 -1
  49. package/dist/{ProductDetails-MFAKRQ72.js → ProductDetails-WSEGLJSW.js} +8 -8
  50. package/dist/{ProductDetails-MFAKRQ72.js.map → ProductDetails-WSEGLJSW.js.map} +1 -1
  51. package/dist/{ProfilePage-4W7DBXLW.js → ProfilePage-6GNEI6OV.js} +27 -26
  52. package/dist/ProfilePage-6GNEI6OV.js.map +1 -0
  53. package/dist/{ReviewsPage-G3IEPOOO.js → ReviewsPage-JP4LZI4A.js} +3 -3
  54. package/dist/{ReviewsPage-G3IEPOOO.js.map → ReviewsPage-JP4LZI4A.js.map} +1 -1
  55. package/dist/{SeoCartWidget-7UDOVSWP.js → SeoCartWidget-KCB4E65P.js} +27 -26
  56. package/dist/SeoCartWidget-KCB4E65P.js.map +1 -0
  57. package/dist/{SettingsPage-TEMXC3OF.js → SettingsPage-UFGVJOI2.js} +27 -26
  58. package/dist/SettingsPage-UFGVJOI2.js.map +1 -0
  59. package/dist/StoreClosedNotification-Q4QPPYEH.js +55 -0
  60. package/dist/{StoreClosedNotification-YMPBP56U.js.map → StoreClosedNotification-Q4QPPYEH.js.map} +1 -1
  61. package/dist/{TestimonialsPage-G2S3JQNT.js → TestimonialsPage-K5PHW7WD.js} +7 -7
  62. package/dist/{TestimonialsPage-G2S3JQNT.js.map → TestimonialsPage-K5PHW7WD.js.map} +1 -1
  63. package/dist/{ThankYouPage-HPF3PIAT.js → ThankYouPage-DSDAYYJN.js} +27 -26
  64. package/dist/ThankYouPage-DSDAYYJN.js.map +1 -0
  65. package/dist/{WalletPage-G7FOMHFX.js → WalletPage-3LWCFG25.js} +28 -27
  66. package/dist/WalletPage-3LWCFG25.js.map +1 -0
  67. package/dist/{WishlistPage-VULTU6K2.js → WishlistPage-LF4A2H3I.js} +29 -28
  68. package/dist/WishlistPage-LF4A2H3I.js.map +1 -0
  69. package/dist/api/advertisement.js +5 -5
  70. package/dist/api/apps.js +5 -5
  71. package/dist/api/blog.js +7 -7
  72. package/dist/api/brands.js +7 -7
  73. package/dist/api/cart.js +7 -7
  74. package/dist/api/category.js +7 -7
  75. package/dist/api/client.js +4 -4
  76. package/dist/api/home.js +5 -5
  77. package/dist/api/loyalty.js +7 -7
  78. package/dist/api/menu.js +5 -5
  79. package/dist/api/notification.js +5 -5
  80. package/dist/api/order.js +7 -7
  81. package/dist/api/page.js +7 -7
  82. package/dist/api/product.js +7 -7
  83. package/dist/api/profile.js +4 -4
  84. package/dist/api/store.d.ts.map +1 -1
  85. package/dist/api/store.js +5 -5
  86. package/dist/api/translations.js +5 -5
  87. package/dist/api/user.js +5 -5
  88. package/dist/api/wallet.js +5 -5
  89. package/dist/api/wishlist.js +8 -8
  90. package/dist/{chunk-XL42DUCQ.js → chunk-2MHMQOMJ.js} +3 -3
  91. package/dist/{chunk-XL42DUCQ.js.map → chunk-2MHMQOMJ.js.map} +1 -1
  92. package/dist/{chunk-KSS7OA3Q.js → chunk-3DNVQVNY.js} +3 -3
  93. package/dist/{chunk-KSS7OA3Q.js.map → chunk-3DNVQVNY.js.map} +1 -1
  94. package/dist/{chunk-2IW3JRWL.js → chunk-4INSECDW.js} +5 -5
  95. package/dist/{chunk-2IW3JRWL.js.map → chunk-4INSECDW.js.map} +1 -1
  96. package/dist/{chunk-VUWBGAET.js → chunk-56OZRZIZ.js} +4 -4
  97. package/dist/{chunk-VUWBGAET.js.map → chunk-56OZRZIZ.js.map} +1 -1
  98. package/dist/{chunk-D7XWUD6T.js → chunk-6NV6T24C.js} +4 -4
  99. package/dist/{chunk-D7XWUD6T.js.map → chunk-6NV6T24C.js.map} +1 -1
  100. package/dist/{chunk-SQXUWX4B.js → chunk-6T7FUHJY.js} +5 -5
  101. package/dist/{chunk-SQXUWX4B.js.map → chunk-6T7FUHJY.js.map} +1 -1
  102. package/dist/{chunk-UZGP2KFA.js → chunk-6Z6BGS7P.js} +3 -3
  103. package/dist/{chunk-UZGP2KFA.js.map → chunk-6Z6BGS7P.js.map} +1 -1
  104. package/dist/{chunk-6UG4IVUF.js → chunk-72DGJN4Q.js} +23 -23
  105. package/dist/{chunk-6UG4IVUF.js.map → chunk-72DGJN4Q.js.map} +1 -1
  106. package/dist/{chunk-FQLF555I.js → chunk-7T5UR3XD.js} +4 -4
  107. package/dist/{chunk-FQLF555I.js.map → chunk-7T5UR3XD.js.map} +1 -1
  108. package/dist/{chunk-T4BRWJSI.js → chunk-7ZBSIOVM.js} +7 -7
  109. package/dist/{chunk-T4BRWJSI.js.map → chunk-7ZBSIOVM.js.map} +1 -1
  110. package/dist/{chunk-3DVAXIY3.js → chunk-ALAHGZPN.js} +4 -4
  111. package/dist/{chunk-3DVAXIY3.js.map → chunk-ALAHGZPN.js.map} +1 -1
  112. package/dist/{chunk-YDSWLCOY.js → chunk-BFA2U7P3.js} +5 -5
  113. package/dist/{chunk-YDSWLCOY.js.map → chunk-BFA2U7P3.js.map} +1 -1
  114. package/dist/{chunk-F6XPGONG.js → chunk-CA3QVM6Y.js} +5 -5
  115. package/dist/{chunk-F6XPGONG.js.map → chunk-CA3QVM6Y.js.map} +1 -1
  116. package/dist/{chunk-24UCMWQB.js → chunk-CFARTPUQ.js} +3 -3
  117. package/dist/{chunk-24UCMWQB.js.map → chunk-CFARTPUQ.js.map} +1 -1
  118. package/dist/chunk-D6XIFBYA.js +14 -0
  119. package/dist/{chunk-47C3MTZI.js.map → chunk-D6XIFBYA.js.map} +1 -1
  120. package/dist/{chunk-UWDUMPL7.js → chunk-E5PEYI5I.js} +6 -6
  121. package/dist/{chunk-UWDUMPL7.js.map → chunk-E5PEYI5I.js.map} +1 -1
  122. package/dist/{chunk-TWUOIBO7.js → chunk-E7AO2Q32.js} +3 -3
  123. package/dist/{chunk-TWUOIBO7.js.map → chunk-E7AO2Q32.js.map} +1 -1
  124. package/dist/{chunk-Y464WYUT.js → chunk-EJLVOWXU.js} +5 -5
  125. package/dist/{chunk-Y464WYUT.js.map → chunk-EJLVOWXU.js.map} +1 -1
  126. package/dist/{chunk-T5VU67NQ.js → chunk-FJQD3LTR.js} +4 -4
  127. package/dist/{chunk-T5VU67NQ.js.map → chunk-FJQD3LTR.js.map} +1 -1
  128. package/dist/{chunk-BR56OEPZ.js → chunk-FMSRB2TT.js} +4 -4
  129. package/dist/{chunk-BR56OEPZ.js.map → chunk-FMSRB2TT.js.map} +1 -1
  130. package/dist/chunk-FNM2OUPD.js +182 -0
  131. package/dist/chunk-FNM2OUPD.js.map +1 -0
  132. package/dist/{chunk-ZLLHL3NI.js → chunk-G3VAJVY5.js} +7 -7
  133. package/dist/{chunk-ZLLHL3NI.js.map → chunk-G3VAJVY5.js.map} +1 -1
  134. package/dist/{chunk-ZVYJK6XQ.js → chunk-GAGTCI3J.js} +5 -5
  135. package/dist/{chunk-ZVYJK6XQ.js.map → chunk-GAGTCI3J.js.map} +1 -1
  136. package/dist/{chunk-U6KJ7XBO.js → chunk-I7WSIN27.js} +3 -3
  137. package/dist/{chunk-U6KJ7XBO.js.map → chunk-I7WSIN27.js.map} +1 -1
  138. package/dist/{chunk-2CL6AEO4.js → chunk-IAHWLUFK.js} +3 -3
  139. package/dist/{chunk-2CL6AEO4.js.map → chunk-IAHWLUFK.js.map} +1 -1
  140. package/dist/{chunk-QA4FBMFJ.js → chunk-K7U46BT2.js} +4 -4
  141. package/dist/{chunk-QA4FBMFJ.js.map → chunk-K7U46BT2.js.map} +1 -1
  142. package/dist/{chunk-4PT5MXGR.js → chunk-LU5DRXS5.js} +4 -4
  143. package/dist/{chunk-4PT5MXGR.js.map → chunk-LU5DRXS5.js.map} +1 -1
  144. package/dist/{chunk-EHX45KZG.js → chunk-LZZ6EESI.js} +3 -3
  145. package/dist/{chunk-EHX45KZG.js.map → chunk-LZZ6EESI.js.map} +1 -1
  146. package/dist/{chunk-HNSR4KLL.js → chunk-MEMJOJO4.js} +3 -3
  147. package/dist/{chunk-HNSR4KLL.js.map → chunk-MEMJOJO4.js.map} +1 -1
  148. package/dist/{chunk-RBFLDI2Z.js → chunk-MJ7TL42D.js} +4 -4
  149. package/dist/{chunk-RBFLDI2Z.js.map → chunk-MJ7TL42D.js.map} +1 -1
  150. package/dist/{chunk-W354TTIE.js → chunk-MVBMVM22.js} +7 -7
  151. package/dist/{chunk-W354TTIE.js.map → chunk-MVBMVM22.js.map} +1 -1
  152. package/dist/{chunk-ENC6POPF.js → chunk-OMY65JIW.js} +4 -4
  153. package/dist/{chunk-ENC6POPF.js.map → chunk-OMY65JIW.js.map} +1 -1
  154. package/dist/chunk-OQIIJRAS.js +30 -0
  155. package/dist/chunk-OQIIJRAS.js.map +1 -0
  156. package/dist/{chunk-GFUXGVER.js → chunk-OSAFBMRT.js} +3 -3
  157. package/dist/{chunk-GFUXGVER.js.map → chunk-OSAFBMRT.js.map} +1 -1
  158. package/dist/{chunk-OHUTM224.js → chunk-PF2WSBJ7.js} +4 -4
  159. package/dist/{chunk-OHUTM224.js.map → chunk-PF2WSBJ7.js.map} +1 -1
  160. package/dist/{chunk-L4JI2AAL.js → chunk-PKJJ6Z7A.js} +4 -4
  161. package/dist/{chunk-L4JI2AAL.js.map → chunk-PKJJ6Z7A.js.map} +1 -1
  162. package/dist/{chunk-GXZW6BJY.js → chunk-POI4G5EA.js} +113 -8
  163. package/dist/chunk-POI4G5EA.js.map +1 -0
  164. package/dist/{chunk-JNAJTCJD.js → chunk-QRHXAKJ3.js} +5 -3
  165. package/dist/chunk-QRHXAKJ3.js.map +1 -0
  166. package/dist/{chunk-5L37UNQQ.js → chunk-S67SB2O2.js} +7 -7
  167. package/dist/{chunk-5L37UNQQ.js.map → chunk-S67SB2O2.js.map} +1 -1
  168. package/dist/{chunk-B2OJZKU4.js → chunk-SCSJROJX.js} +8 -8
  169. package/dist/{chunk-B2OJZKU4.js.map → chunk-SCSJROJX.js.map} +1 -1
  170. package/dist/{chunk-SCRNQWZT.js → chunk-TL256OK3.js} +4 -4
  171. package/dist/{chunk-SCRNQWZT.js.map → chunk-TL256OK3.js.map} +1 -1
  172. package/dist/{chunk-4SZZPXM2.js → chunk-TMMK2VYE.js} +50 -17
  173. package/dist/chunk-TMMK2VYE.js.map +1 -0
  174. package/dist/{chunk-LUFLN7WL.js → chunk-VFXAHTB3.js} +7 -7
  175. package/dist/{chunk-LUFLN7WL.js.map → chunk-VFXAHTB3.js.map} +1 -1
  176. package/dist/{chunk-PTQVBPPN.js → chunk-VIR6L7KJ.js} +6 -4
  177. package/dist/chunk-VIR6L7KJ.js.map +1 -0
  178. package/dist/{chunk-OSSOU36J.js → chunk-WD576F4S.js} +3 -3
  179. package/dist/{chunk-OSSOU36J.js.map → chunk-WD576F4S.js.map} +1 -1
  180. package/dist/{chunk-BQ2MNEN7.js → chunk-WN35SBLD.js} +3 -3
  181. package/dist/{chunk-BQ2MNEN7.js.map → chunk-WN35SBLD.js.map} +1 -1
  182. package/dist/{chunk-GKKHNGLI.js → chunk-WRYCOIYC.js} +9 -9
  183. package/dist/{chunk-GKKHNGLI.js.map → chunk-WRYCOIYC.js.map} +1 -1
  184. package/dist/{chunk-3NFVZJNI.js → chunk-X2JCU7GY.js} +3 -3
  185. package/dist/{chunk-3NFVZJNI.js.map → chunk-X2JCU7GY.js.map} +1 -1
  186. package/dist/{chunk-S5EVFWAL.js → chunk-XU33IHQA.js} +8 -8
  187. package/dist/{chunk-S5EVFWAL.js.map → chunk-XU33IHQA.js.map} +1 -1
  188. package/dist/{chunk-5N74JJ2Z.js → chunk-YSYA64WS.js} +103 -21
  189. package/dist/chunk-YSYA64WS.js.map +1 -0
  190. package/dist/{chunk-A4NN6C5B.js → chunk-YYMKDBZV.js} +3 -3
  191. package/dist/{chunk-A4NN6C5B.js.map → chunk-YYMKDBZV.js.map} +1 -1
  192. package/dist/{chunk-RA6ZTHN6.js → chunk-Z4UTYKKV.js} +4 -4
  193. package/dist/{chunk-RA6ZTHN6.js.map → chunk-Z4UTYKKV.js.map} +1 -1
  194. package/dist/{chunk-UKLYL5LM.js → chunk-ZDKQL2E4.js} +4 -4
  195. package/dist/{chunk-UKLYL5LM.js.map → chunk-ZDKQL2E4.js.map} +1 -1
  196. package/dist/{chunk-BEMWHR4T.js → chunk-ZRT6L6TC.js} +3 -3
  197. package/dist/{chunk-BEMWHR4T.js.map → chunk-ZRT6L6TC.js.map} +1 -1
  198. package/dist/components/cart/index.js +1 -1
  199. package/dist/components/common/index.js +1 -1
  200. package/dist/components/drawer/index.js +25 -24
  201. package/dist/components/home/index.js +29 -28
  202. package/dist/components/layout/Footer.d.ts.map +1 -1
  203. package/dist/components/layout/MadeWithSalla.d.ts +9 -0
  204. package/dist/components/layout/MadeWithSalla.d.ts.map +1 -0
  205. package/dist/components/layout/index.d.ts +2 -0
  206. package/dist/components/layout/index.d.ts.map +1 -1
  207. package/dist/components/layout/index.js +8 -7
  208. package/dist/components/product/index.js +26 -25
  209. package/dist/components/store/index.js +27 -26
  210. package/dist/components/toast/index.js +5 -5
  211. package/dist/dev/editor/index.js +3 -3
  212. package/dist/dev/index.js +3 -3
  213. package/dist/document-class-5BRFPS6J.js +29 -0
  214. package/dist/{document-class-B2MXKYAQ.js.map → document-class-5BRFPS6J.js.map} +1 -1
  215. package/dist/hooks/index.js +25 -24
  216. package/dist/hooks/useComments.js +4 -4
  217. package/dist/hooks/useGtm.js +25 -24
  218. package/dist/hooks/useMoney.js +25 -24
  219. package/dist/hooks/useProduct.js +4 -4
  220. package/dist/hooks/useStore.js +25 -24
  221. package/dist/hooks/useUser.js +6 -6
  222. package/dist/hooks/useWishlist.js +4 -4
  223. package/dist/index.d.ts +1 -0
  224. package/dist/index.d.ts.map +1 -1
  225. package/dist/index.js +25 -24
  226. package/dist/index.js.map +1 -1
  227. package/dist/native-app/index.js +4 -4
  228. package/dist/{navigation-LSRNHKGJ.js → navigation-NM4AO2OX.js} +8 -8
  229. package/dist/{navigation-LSRNHKGJ.js.map → navigation-NM4AO2OX.js.map} +1 -1
  230. package/dist/navigation-S5EUYOVI.js +14 -0
  231. package/dist/{navigation-WASYQTFC.js.map → navigation-S5EUYOVI.js.map} +1 -1
  232. package/dist/{not-found-M3ZPUVVC.js → not-found-NO54GPIK.js} +28 -27
  233. package/dist/not-found-NO54GPIK.js.map +1 -0
  234. package/dist/providers/index.js +25 -24
  235. package/dist/routes/account/orders.js +9 -9
  236. package/dist/routes/account.js +18 -18
  237. package/dist/routes/blog.js +13 -13
  238. package/dist/routes/brands.js +9 -9
  239. package/dist/routes/cart.js +33 -32
  240. package/dist/routes/cart.js.map +1 -1
  241. package/dist/routes/home.js +30 -29
  242. package/dist/routes/index.js +7 -7
  243. package/dist/routes/loyalty.js +10 -10
  244. package/dist/routes/page.js +9 -9
  245. package/dist/routes/product-listing.js +31 -30
  246. package/dist/routes/product-listing.js.map +1 -1
  247. package/dist/routes/product.js +29 -28
  248. package/dist/routes/product.js.map +1 -1
  249. package/dist/routes/root/beforeLoad.d.ts +6 -0
  250. package/dist/routes/root/beforeLoad.d.ts.map +1 -1
  251. package/dist/routes/seo-redirects.js +7 -7
  252. package/dist/routes/testimonials.js +5 -4
  253. package/dist/routes/testimonials.js.map +1 -1
  254. package/dist/routes/thank-you.js +9 -9
  255. package/dist/skeleton.js +30 -29
  256. package/dist/{store-lookup-EW6ALPQF.js → store-lookup-LVKWUL6Z.js} +12 -12
  257. package/dist/{store-lookup-EW6ALPQF.js.map → store-lookup-LVKWUL6Z.js.map} +1 -1
  258. package/dist/tanstack/middleware/twilight.d.ts.map +1 -1
  259. package/dist/tanstack/store-base.d.ts +10 -2
  260. package/dist/tanstack/store-base.d.ts.map +1 -1
  261. package/dist/tanstack/templates/locale-wrapper.d.ts +2 -1
  262. package/dist/tanstack/templates/locale-wrapper.d.ts.map +1 -1
  263. package/dist/tanstack.js +45 -23
  264. package/dist/tanstack.js.map +1 -1
  265. package/dist/types/index.d.ts +8 -0
  266. package/dist/types/index.d.ts.map +1 -1
  267. package/dist/utils/baseHead.d.ts +6 -1
  268. package/dist/utils/baseHead.d.ts.map +1 -1
  269. package/dist/utils/baseHead.js +3 -1
  270. package/dist/utils/cookies.d.ts +6 -0
  271. package/dist/utils/cookies.d.ts.map +1 -1
  272. package/dist/utils/errors.d.ts +18 -1
  273. package/dist/utils/errors.d.ts.map +1 -1
  274. package/dist/utils/index.js +7 -7
  275. package/dist/utils/language-cookie.d.ts +10 -0
  276. package/dist/utils/language-cookie.d.ts.map +1 -0
  277. package/dist/utils/shared-host-language.d.ts +72 -0
  278. package/dist/utils/shared-host-language.d.ts.map +1 -0
  279. package/dist/utils/store-base.d.ts +28 -6
  280. package/dist/utils/store-base.d.ts.map +1 -1
  281. package/dist/vite/index.js +43 -7
  282. package/dist/vite/index.js.map +1 -1
  283. package/package.json +1 -1
  284. package/tailwind/components/layout/Footer.tsx.txt +2 -0
  285. package/tailwind/components/layout/MadeWithSalla.tsx.txt +34 -0
  286. package/tailwind/components/layout/index.ts.txt +3 -0
  287. package/tailwind/routes/root/beforeLoad.ts.txt +61 -3
  288. package/dist/BlogAuthorPage-LHYDUFDA.js.map +0 -1
  289. package/dist/BlogCategoryPage-6BORI4YG.js.map +0 -1
  290. package/dist/BlogPage-TSRWNX6M.js.map +0 -1
  291. package/dist/BlogSinglePage-TLTW67S7.js.map +0 -1
  292. package/dist/BlogTagPage-RAMP5XNR.js.map +0 -1
  293. package/dist/BrandsPage-KUFEUFVZ.js.map +0 -1
  294. package/dist/Breadcrumb-ZS3ZMMTM.js.map +0 -1
  295. package/dist/CartItem-7QCAQ3QQ.js.map +0 -1
  296. package/dist/CartSummary-ZPG7IAXE.js.map +0 -1
  297. package/dist/CustomerLayout-E5FYPKT4.js.map +0 -1
  298. package/dist/Header-HYTNO4IR.js +0 -22
  299. package/dist/LoyaltyPage-YMK7SISF.js.map +0 -1
  300. package/dist/LoyaltyPointsPage-V2463UQ6.js.map +0 -1
  301. package/dist/MaintenancePage-Z34IQCUV.js +0 -7
  302. package/dist/MasterLayout-3YSR4VFQ.js +0 -53
  303. package/dist/MobileMenu-ZJLXCG4P.js.map +0 -1
  304. package/dist/NotificationsPage-XKSW3DFD.js.map +0 -1
  305. package/dist/OrderSinglePage-WSUNHCY6.js.map +0 -1
  306. package/dist/OrdersPage-TAME5ACG.js.map +0 -1
  307. package/dist/ProfilePage-4W7DBXLW.js.map +0 -1
  308. package/dist/SeoCartWidget-7UDOVSWP.js.map +0 -1
  309. package/dist/SettingsPage-TEMXC3OF.js.map +0 -1
  310. package/dist/StoreClosedNotification-YMPBP56U.js +0 -54
  311. package/dist/ThankYouPage-HPF3PIAT.js.map +0 -1
  312. package/dist/WalletPage-G7FOMHFX.js.map +0 -1
  313. package/dist/WishlistPage-VULTU6K2.js.map +0 -1
  314. package/dist/chunk-47C3MTZI.js +0 -14
  315. package/dist/chunk-4SZZPXM2.js.map +0 -1
  316. package/dist/chunk-5N74JJ2Z.js.map +0 -1
  317. package/dist/chunk-D42M66E4.js +0 -127
  318. package/dist/chunk-D42M66E4.js.map +0 -1
  319. package/dist/chunk-GXZW6BJY.js.map +0 -1
  320. package/dist/chunk-JNAJTCJD.js.map +0 -1
  321. package/dist/chunk-PTQVBPPN.js.map +0 -1
  322. package/dist/document-class-B2MXKYAQ.js +0 -29
  323. package/dist/navigation-WASYQTFC.js +0 -14
  324. package/dist/not-found-M3ZPUVVC.js.map +0 -1
@@ -1,6 +1,7 @@
1
- import { buildHreflangAlternates } from '../chunk-4SZZPXM2.js';
1
+ import { buildHreflangAlternates } from '../chunk-TMMK2VYE.js';
2
2
  import { RouteId } from '../chunk-OUW6WESU.js';
3
- import { getTwilightContext } from '../chunk-JNAJTCJD.js';
3
+ import '../chunk-POI4G5EA.js';
4
+ import { getTwilightContext } from '../chunk-QRHXAKJ3.js';
4
5
  import '../chunk-T72DAX7R.js';
5
6
  import '../chunk-DGUM43GV.js';
6
7
  import { lazy } from 'react';
@@ -32,10 +33,10 @@ async function reviewsLoader() {
32
33
 
33
34
  // src/routes/testimonials/index.tsx
34
35
  var LazyTestimonialsPage = lazy(
35
- () => import('../TestimonialsPage-G2S3JQNT.js').then((m) => ({ default: m.TestimonialsPage }))
36
+ () => import('../TestimonialsPage-K5PHW7WD.js').then((m) => ({ default: m.TestimonialsPage }))
36
37
  );
37
38
  var LazyReviewsPage = lazy(
38
- () => import('../ReviewsPage-G3IEPOOO.js').then((m) => ({ default: m.ReviewsPage }))
39
+ () => import('../ReviewsPage-JP4LZI4A.js').then((m) => ({ default: m.ReviewsPage }))
39
40
  );
40
41
  var TestimonialsPage = LazyTestimonialsPage;
41
42
  var ReviewsPage = LazyReviewsPage;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/routes/testimonials/loader.ts","../../src/routes/testimonials/index.tsx"],"names":[],"mappings":"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","file":"testimonials.js","sourcesContent":["import type { ReviewsPageProps, TestimonialsPageProps } from './types';\nimport { getTwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\nexport async function testimonialsLoader(_ctx: { locale: string }): Promise<TestimonialsPageProps> {\n const i18n = getTwilightContext().i18n;\n return {\n page: {\n slug: RouteId.TESTIMONIALS,\n title: i18n.t('blocks.home.testimonials') || 'Customer Reviews',\n },\n };\n}\n\n/** The product reviews page, Twig's `pages/reviews`: `<salla-reviews-page>` loads the reviews itself. */\nexport async function reviewsLoader(): Promise<ReviewsPageProps> {\n const { i18n } = getTwilightContext();\n const title = i18n.t('common.titles.reviews');\n return {\n page: {\n slug: RouteId.REVIEWS,\n title,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: title, url: '/reviews' },\n ],\n },\n };\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport { lazy } from 'react';\nimport { reviewsLoader, testimonialsLoader } from './loader';\nimport type { ReviewsPageProps, TestimonialsPageProps } from './types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\n// Lazy-load component for code-splitting\nconst LazyTestimonialsPage = lazy(() =>\n import('./TestimonialsPage').then((m) => ({ default: m.TestimonialsPage }))\n);\n\nconst LazyReviewsPage = lazy(() =>\n import('./ReviewsPage').then((m) => ({ default: m.ReviewsPage }))\n);\n\nexport const TestimonialsPage = LazyTestimonialsPage;\nexport const ReviewsPage = LazyReviewsPage;\nexport { reviewsLoader, testimonialsLoader } from './loader';\nexport type { ReviewsPageProps, TestimonialsPageProps } from './types';\n\nasync function loader(\n ctx: { locale?: string },\n extend?: (\n data: TestimonialsPageProps,\n ctx: { params: Record<string, never> }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<TestimonialsPageProps> {\n const data = await testimonialsLoader({ locale: ctx.locale ?? 'ar' });\n\n if (extend) {\n const extra = await extend(data, { params: {} });\n return { ...data, ...extra } as TestimonialsPageProps;\n }\n return data;\n}\n\nfunction head(ctx: TwilightContext, data: TestimonialsPageProps): HeadDescriptor {\n const base: HeadDescriptor = {\n title: data.page.title,\n description: data.page.description,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const Testimonials = {\n id: RouteId.TESTIMONIALS,\n loader,\n head,\n Component: LazyTestimonialsPage,\n} as const;\n\nasync function loadReviews(\n _ctx?: { locale?: string },\n extend?: (\n data: ReviewsPageProps,\n ctx: { params: Record<string, never> }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<ReviewsPageProps> {\n const data = await reviewsLoader();\n\n if (extend) {\n const extra = await extend(data, { params: {} });\n return { ...data, ...extra } as ReviewsPageProps;\n }\n return data;\n}\n\nexport const Reviews = {\n id: RouteId.REVIEWS,\n loader: loadReviews,\n head: (ctx: TwilightContext, data: ReviewsPageProps): HeadDescriptor => ({\n title: data.page.title,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n }),\n Component: LazyReviewsPage,\n} as const;\n"]}
1
+ {"version":3,"sources":["../../src/routes/testimonials/loader.ts","../../src/routes/testimonials/index.tsx"],"names":[],"mappings":"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","file":"testimonials.js","sourcesContent":["import type { ReviewsPageProps, TestimonialsPageProps } from './types';\nimport { getTwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\nexport async function testimonialsLoader(_ctx: { locale: string }): Promise<TestimonialsPageProps> {\n const i18n = getTwilightContext().i18n;\n return {\n page: {\n slug: RouteId.TESTIMONIALS,\n title: i18n.t('blocks.home.testimonials') || 'Customer Reviews',\n },\n };\n}\n\n/** The product reviews page, Twig's `pages/reviews`: `<salla-reviews-page>` loads the reviews itself. */\nexport async function reviewsLoader(): Promise<ReviewsPageProps> {\n const { i18n } = getTwilightContext();\n const title = i18n.t('common.titles.reviews');\n return {\n page: {\n slug: RouteId.REVIEWS,\n title,\n breadcrumbs: [\n { name: i18n.t('common.titles.home'), url: '/' },\n { name: title, url: '/reviews' },\n ],\n },\n };\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport { lazy } from 'react';\nimport { reviewsLoader, testimonialsLoader } from './loader';\nimport type { ReviewsPageProps, TestimonialsPageProps } from './types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\n// Lazy-load component for code-splitting\nconst LazyTestimonialsPage = lazy(() =>\n import('./TestimonialsPage').then((m) => ({ default: m.TestimonialsPage }))\n);\n\nconst LazyReviewsPage = lazy(() =>\n import('./ReviewsPage').then((m) => ({ default: m.ReviewsPage }))\n);\n\nexport const TestimonialsPage = LazyTestimonialsPage;\nexport const ReviewsPage = LazyReviewsPage;\nexport { reviewsLoader, testimonialsLoader } from './loader';\nexport type { ReviewsPageProps, TestimonialsPageProps } from './types';\n\nasync function loader(\n ctx: { locale?: string },\n extend?: (\n data: TestimonialsPageProps,\n ctx: { params: Record<string, never> }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<TestimonialsPageProps> {\n const data = await testimonialsLoader({ locale: ctx.locale ?? 'ar' });\n\n if (extend) {\n const extra = await extend(data, { params: {} });\n return { ...data, ...extra } as TestimonialsPageProps;\n }\n return data;\n}\n\nfunction head(ctx: TwilightContext, data: TestimonialsPageProps): HeadDescriptor {\n const base: HeadDescriptor = {\n title: data.page.title,\n description: data.page.description,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const Testimonials = {\n id: RouteId.TESTIMONIALS,\n loader,\n head,\n Component: LazyTestimonialsPage,\n} as const;\n\nasync function loadReviews(\n _ctx?: { locale?: string },\n extend?: (\n data: ReviewsPageProps,\n ctx: { params: Record<string, never> }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<ReviewsPageProps> {\n const data = await reviewsLoader();\n\n if (extend) {\n const extra = await extend(data, { params: {} });\n return { ...data, ...extra } as ReviewsPageProps;\n }\n return data;\n}\n\nexport const Reviews = {\n id: RouteId.REVIEWS,\n loader: loadReviews,\n head: (ctx: TwilightContext, data: ReviewsPageProps): HeadDescriptor => ({\n title: data.page.title,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n }),\n Component: LazyReviewsPage,\n} as const;\n"]}
@@ -1,12 +1,12 @@
1
- import { order } from '../chunk-UKLYL5LM.js';
2
- import { buildHreflangAlternates } from '../chunk-4SZZPXM2.js';
3
- import '../chunk-UWDUMPL7.js';
1
+ import { order } from '../chunk-ZDKQL2E4.js';
2
+ import { buildHreflangAlternates } from '../chunk-TMMK2VYE.js';
3
+ import '../chunk-E5PEYI5I.js';
4
4
  import { RouteId } from '../chunk-OUW6WESU.js';
5
- import '../chunk-YDSWLCOY.js';
6
- import '../chunk-A4NN6C5B.js';
7
- import '../chunk-3NFVZJNI.js';
8
- import '../chunk-GXZW6BJY.js';
9
- import { getTwilightContext } from '../chunk-JNAJTCJD.js';
5
+ import '../chunk-BFA2U7P3.js';
6
+ import '../chunk-YYMKDBZV.js';
7
+ import '../chunk-X2JCU7GY.js';
8
+ import '../chunk-POI4G5EA.js';
9
+ import { getTwilightContext } from '../chunk-QRHXAKJ3.js';
10
10
  import '../chunk-T72DAX7R.js';
11
11
  import '../chunk-DF6FBKDN.js';
12
12
  import '../chunk-DGUM43GV.js';
@@ -40,7 +40,7 @@ async function thankYouLoader({
40
40
 
41
41
  // src/routes/thank-you/index.tsx
42
42
  var LazyThankYouPage = lazy(
43
- () => import('../ThankYouPage-HPF3PIAT.js').then((m) => ({ default: m.ThankYouPage }))
43
+ () => import('../ThankYouPage-DSDAYYJN.js').then((m) => ({ default: m.ThankYouPage }))
44
44
  );
45
45
  var ThankYouPage = LazyThankYouPage;
46
46
  async function loader(ctx, extend) {
package/dist/skeleton.js CHANGED
@@ -1,46 +1,47 @@
1
1
  export { BlogSkeleton, BreadcrumbSkeleton, CartSkeleton, CustomerLayoutSkeleton, CustomerPageSkeleton, PageSkeleton, ProductCardSkeleton, ProductDetailSkeleton, ProductGridSkeleton, SkeletonPulse } from './chunk-N7CCSGZF.js';
2
- export { HomeSkeleton } from './chunk-5L37UNQQ.js';
3
- import './chunk-S5EVFWAL.js';
4
- import './chunk-TWUOIBO7.js';
5
- import './chunk-SQXUWX4B.js';
6
- import './chunk-B2OJZKU4.js';
2
+ export { HomeSkeleton } from './chunk-S67SB2O2.js';
3
+ import './chunk-XU33IHQA.js';
4
+ import './chunk-E7AO2Q32.js';
5
+ import './chunk-6T7FUHJY.js';
6
+ import './chunk-SCSJROJX.js';
7
7
  import './chunk-Y32RHCOH.js';
8
- import './chunk-6UG4IVUF.js';
9
- import './chunk-ZLLHL3NI.js';
10
- import './chunk-PTQVBPPN.js';
11
- import './chunk-W354TTIE.js';
12
- import './chunk-EHX45KZG.js';
13
- import './chunk-BR56OEPZ.js';
8
+ import './chunk-72DGJN4Q.js';
9
+ import './chunk-G3VAJVY5.js';
10
+ import './chunk-VIR6L7KJ.js';
11
+ import './chunk-MVBMVM22.js';
12
+ import './chunk-LZZ6EESI.js';
13
+ import './chunk-FMSRB2TT.js';
14
14
  import './chunk-OXMUPNMH.js';
15
- import './chunk-UZGP2KFA.js';
15
+ import './chunk-6Z6BGS7P.js';
16
16
  import './chunk-VVZNW5CB.js';
17
- import './chunk-U6KJ7XBO.js';
17
+ import './chunk-I7WSIN27.js';
18
18
  import './chunk-GD26FI4J.js';
19
- import './chunk-4SZZPXM2.js';
20
- import './chunk-UWDUMPL7.js';
19
+ import './chunk-TMMK2VYE.js';
20
+ import './chunk-E5PEYI5I.js';
21
21
  import './chunk-OUW6WESU.js';
22
- import './chunk-KSS7OA3Q.js';
22
+ import './chunk-3DNVQVNY.js';
23
23
  import './chunk-HI5V5X3S.js';
24
- import './chunk-RBFLDI2Z.js';
25
- import './chunk-24UCMWQB.js';
24
+ import './chunk-MJ7TL42D.js';
25
+ import './chunk-CFARTPUQ.js';
26
26
  import './chunk-MVT5AF2A.js';
27
27
  import './chunk-Z653O7MX.js';
28
28
  import './chunk-ZCH7W7DZ.js';
29
- import './chunk-BEMWHR4T.js';
29
+ import './chunk-ZRT6L6TC.js';
30
30
  import './chunk-JWXJPJBO.js';
31
31
  import './chunk-CW625T2E.js';
32
32
  import './chunk-7V36I5GT.js';
33
33
  import './chunk-6WI7R2BD.js';
34
- import './chunk-HNSR4KLL.js';
34
+ import './chunk-MEMJOJO4.js';
35
35
  import './chunk-OAMIDZKW.js';
36
- import './chunk-ZVYJK6XQ.js';
36
+ import './chunk-GAGTCI3J.js';
37
+ import './chunk-OQIIJRAS.js';
37
38
  import './chunk-V2ZDTY6H.js';
38
- import './chunk-4PT5MXGR.js';
39
+ import './chunk-LU5DRXS5.js';
39
40
  import './chunk-5XDPAKF5.js';
40
41
  import './chunk-GCPEMNSU.js';
41
- import './chunk-YDSWLCOY.js';
42
+ import './chunk-BFA2U7P3.js';
42
43
  import './chunk-TYNZ5B2B.js';
43
- import './chunk-GFUXGVER.js';
44
+ import './chunk-OSAFBMRT.js';
44
45
  import './chunk-AXW67SY7.js';
45
46
  import './chunk-BYMOPN2S.js';
46
47
  import './chunk-SKLEJJ6M.js';
@@ -48,11 +49,11 @@ import './chunk-6BZ5TKEV.js';
48
49
  import './chunk-FZKRSGLP.js';
49
50
  import './chunk-7V5HOZW4.js';
50
51
  import './chunk-YA6ABQB7.js';
51
- import './chunk-OSSOU36J.js';
52
- import './chunk-A4NN6C5B.js';
53
- import './chunk-3NFVZJNI.js';
54
- import './chunk-GXZW6BJY.js';
55
- import './chunk-JNAJTCJD.js';
52
+ import './chunk-WD576F4S.js';
53
+ import './chunk-YYMKDBZV.js';
54
+ import './chunk-X2JCU7GY.js';
55
+ import './chunk-POI4G5EA.js';
56
+ import './chunk-QRHXAKJ3.js';
56
57
  import './chunk-T72DAX7R.js';
57
58
  import './chunk-DF6FBKDN.js';
58
59
  import './chunk-DGUM43GV.js';
@@ -1,15 +1,15 @@
1
- import { category } from './chunk-VUWBGAET.js';
2
- import { blog } from './chunk-T5VU67NQ.js';
3
- import { brand } from './chunk-ENC6POPF.js';
4
- import { product } from './chunk-SQXUWX4B.js';
1
+ import { category } from './chunk-56OZRZIZ.js';
2
+ import { blog } from './chunk-FJQD3LTR.js';
3
+ import { brand } from './chunk-OMY65JIW.js';
4
+ import { product } from './chunk-6T7FUHJY.js';
5
5
  import { DEV_LOOKUP_BUDGET_MS } from './chunk-OXMUPNMH.js';
6
- import './chunk-UWDUMPL7.js';
6
+ import './chunk-E5PEYI5I.js';
7
7
  import './chunk-OUW6WESU.js';
8
- import './chunk-YDSWLCOY.js';
9
- import './chunk-A4NN6C5B.js';
10
- import './chunk-3NFVZJNI.js';
11
- import './chunk-GXZW6BJY.js';
12
- import './chunk-JNAJTCJD.js';
8
+ import './chunk-BFA2U7P3.js';
9
+ import './chunk-YYMKDBZV.js';
10
+ import './chunk-X2JCU7GY.js';
11
+ import './chunk-POI4G5EA.js';
12
+ import './chunk-QRHXAKJ3.js';
13
13
  import './chunk-T72DAX7R.js';
14
14
  import './chunk-DF6FBKDN.js';
15
15
  import './chunk-DGUM43GV.js';
@@ -110,5 +110,5 @@ function lookupInStore(source, query) {
110
110
  }
111
111
 
112
112
  export { lookupInStore };
113
- //# sourceMappingURL=store-lookup-EW6ALPQF.js.map
114
- //# sourceMappingURL=store-lookup-EW6ALPQF.js.map
113
+ //# sourceMappingURL=store-lookup-LVKWUL6Z.js.map
114
+ //# sourceMappingURL=store-lookup-LVKWUL6Z.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dev/store-lookup.ts"],"names":["categories"],"mappings":";;;;;;;;;;;;;;;;;AAmBA,IAAM,QAAA,GAAW,EAAA;AAEjB,IAAM,SAAA,GAAY,EAAA;AAalB,eAAe,OAAA,CACb,WACA,IAAA,EACc;AACd,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAC9B,EAAA,MAAM,QAAa,EAAC;AACpB,EAAA,IAAI,MAAA,GAAwB,IAAA;AAC5B,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,IAAQ,SAAA,EAAW,QAAQ,CAAA,EAAG;AAC/C,IAAA,MAAM,EAAE,KAAA,EAAO,IAAA,KAAS,MAAM,SAAA,CAAU,MAAM,MAAM,CAAA;AACpD,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,KAAA,CAAM,MAAA,CAAO,IAAI,CAAC,CAAA;AAChC,IAAA,IAAI,KAAA,CAAM,UAAU,QAAA,IAAY,CAAC,QAAQ,IAAA,CAAK,GAAA,MAAS,QAAA,EAAU;AACjE,IAAA,MAAA,GAAS,IAAA;AAAA,EACX;AACA,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAChC;AAEA,SAAS,OAAA,CAAQ,MAAc,KAAA,EAAwB;AACrD,EAAA,OAAO,CAAC,SAAS,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,KAAA,CAAM,aAAa,CAAA;AAClE;AAGA,SAAS,QAAQA,WAAAA,EAAoC;AACnD,EAAA,OAAOA,WAAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAA,EAAG,GAAG,OAAA,CAAQ,CAAA,CAAE,cAAA,IAAkB,EAAE,CAAC,CAAC,CAAA;AAC1E;AAEA,eAAe,SAAS,KAAA,EAAyC;AAC/D,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,QAAQ,IAAA,CAAK;AAAA,IACnC,MAAA,EAAQ,QAAQ,QAAA,GAAW,QAAA;AAAA,IAC3B,GAAI,KAAA,GAAQ,EAAE,OAAA,EAAS,KAAA,KAAU,EAAC;AAAA,IAClC,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,EAAA,EAAI,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,IACf,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,KAAA,EAAO,EAAE,KAAA,EAAO,GAAA;AAAA,IAChB,KAAK,CAAA,CAAE,GAAA;AAAA,IACP,MAAM,EAAE,EAAA,EAAI,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,KAAK,CAAA,CAAE,GAAA,EAAK,OAAO,CAAA,CAAE,KAAA,EAAO,OAAO,IAAA;AAAK,GAClF,CAAE,CAAA;AACJ;AAEA,eAAe,WAAW,KAAA,EAAyC;AACjE,EAAA,OAAO,OAAA,CAAQ,MAAM,QAAA,CAAS,IAAA,EAAM,CAAA,CACjC,MAAA,CAAO,CAAC,CAAA,KAAM,OAAA,CAAQ,EAAE,IAAA,EAAM,KAAK,CAAC,CAAA,CACpC,KAAA,CAAM,GAAG,QAAQ,CAAA,CACjB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACX,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,KAAA,EAAO,EAAE,KAAA,IAAS,MAAA;AAAA,IAClB,KAAK,CAAA,CAAE,GAAA;AAAA,IACP,MAAM,EAAE,EAAA,EAAI,EAAE,EAAA,EAAI,IAAA,EAAM,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,OAAO,CAAA,CAAE,KAAA,IAAS,MAAM,IAAA,EAAM,CAAA,CAAE,QAAQ,IAAA;AAAK,GAC3F,CAAE,CAAA;AACN;AAEA,eAAe,OAAO,KAAA,EAAyC;AAC7D,EAAA,MAAM,QAAQ,MAAM,OAAA;AAAA,IAClB,CAAC,IAAA,KAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IACzB,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,KAAK;AAAA,GAC9B;AACA,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,OAAO,CAAA,CAAE,IAAA;AAAA,IACT,KAAK,CAAA,CAAE,GAAA;AAAA,IACP,MAAM,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,MAAM,CAAA,CAAE,IAAA,EAAM,GAAA,EAAK,CAAA,CAAE,KAAK,IAAA,EAAM,CAAA,CAAE,MAAM,MAAA,EAAQ,CAAA,CAAE,UAAU,IAAA;AAAK,GACrF,CAAE,CAAA;AACJ;AAEA,eAAe,aAAa,KAAA,EAAyC;AACnE,EAAA,MAAM,QAAQ,MAAM,OAAA;AAAA,IAClB,OAAO,OAAO,MAAA,KAAW;AACvB,MAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM,GAAI,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,GAAS,EAAE,MAAA,KAAW,MAAS,CAAA;AACxF,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,QAAQ,IAAA,EAAK;AAAA,IAClD,CAAA;AAAA,IACA,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,KAAK;AAAA,GAC9B;AACA,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,KAAK,CAAA,CAAE,GAAA;AAAA,IACP,IAAA,EAAM,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,MAAM,CAAA,CAAE,IAAA,EAAM,GAAA,EAAK,CAAA,CAAE,GAAA;AAAI,GAC7C,CAAE,CAAA;AACJ;AAEA,eAAe,eAAe,KAAA,EAAyC;AACrE,EAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAK,GAAI,MAAM,KAAK,GAAA,EAAI;AAC5C,EAAA,OAAO,KACJ,MAAA,CAAO,CAAC,CAAA,KAAM,OAAA,CAAQ,EAAE,IAAA,EAAM,KAAK,CAAC,CAAA,CACpC,MAAM,CAAA,EAAG,QAAQ,CAAA,CACjB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACX,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,KAAK,CAAA,CAAE,GAAA;AAAA,IACP,IAAA,EAAM,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,MAAM,CAAA,CAAE,IAAA,EAAM,GAAA,EAAK,CAAA,CAAE,GAAA;AAAI,GAC7C,CAAE,CAAA;AACN;AAEA,IAAM,OAAA,GAAgF;AAAA,EACpF,QAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA,EAAe,YAAA;AAAA,EACf,eAAA,EAAiB;AACnB,CAAA;AAEO,SAAS,aAAA,CAAc,QAAyB,KAAA,EAAyC;AAC9F,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAM,CAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,MAAM,CAAA,CAAE,CAAC,CAAA;AACvE,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,CAAA;AAC5B","file":"store-lookup-EW6ALPQF.js","sourcesContent":["/**\n * Runs in the editor's frame (the storefront), which has the engine's API\n * client set up for the dev store: answers the editor's pickers with the real\n * store's products, categories, brands and blog. Loaded with `import()` on the\n * first lookup, so a storefront never carries it.\n *\n * Each item's `data` is what a block receives for it, in the API's shape: a\n * product block reads only the ids and fetches the rest, while categories and\n * brands are drawn from what is saved.\n */\n\nimport { product } from '../api/product';\nimport { category } from '../api/category';\nimport { brand } from '../api/brands';\nimport { blog } from '../api/blog';\nimport type { Category } from '../types';\nimport { DEV_LOOKUP_BUDGET_MS, type DevLookupItem, type DevLookupSource } from './schema-types';\n\n/** Enough to choose from; a search narrows it further. */\nconst PER_PAGE = 20;\n/** How far a paged list is searched before giving up, so a big store can't stall the picker. */\nconst MAX_PAGES = 10;\n\ninterface Page<T> {\n items: T[];\n next: string | null;\n}\n\n/**\n * The matching items of a paged list, read page after page until there are\n * enough, the pages run out, or the time budget is spent: a brand or article on\n * page three is still found, and what was found so far always reaches the\n * editor before it stops waiting (`DEV_LOOKUP_BUDGET_MS` < its timeout).\n */\nasync function collect<T>(\n fetchPage: (page: number, cursor: string | null) => Promise<Page<T>>,\n keep: (item: T) => boolean\n): Promise<T[]> {\n const deadline = Date.now() + DEV_LOOKUP_BUDGET_MS;\n const found: T[] = [];\n let cursor: string | null = null;\n for (let page = 1; page <= MAX_PAGES; page += 1) {\n const { items, next } = await fetchPage(page, cursor);\n found.push(...items.filter(keep));\n if (found.length >= PER_PAGE || !next || Date.now() >= deadline) break;\n cursor = next;\n }\n return found.slice(0, PER_PAGE);\n}\n\nfunction matches(name: string, query: string): boolean {\n return !query || name.toLowerCase().includes(query.toLowerCase());\n}\n\n/** Categories with their subcategories, flattened, parents first. */\nfunction flatten(categories: Category[]): Category[] {\n return categories.flatMap((c) => [c, ...flatten(c.sub_categories ?? [])]);\n}\n\nasync function products(query: string): Promise<DevLookupItem[]> {\n const { items } = await product.list({\n source: query ? 'search' : 'latest',\n ...(query ? { keyword: query } : {}),\n perPage: PER_PAGE,\n });\n // List responses send the id as a numeric string; the block reads a number. Use it for both.\n return items.map((p) => ({\n id: Number(p.id),\n name: p.name,\n image: p.image?.url,\n url: p.url,\n data: { id: Number(p.id), name: p.name, url: p.url, image: p.image?.url ?? null },\n }));\n}\n\nasync function categories(query: string): Promise<DevLookupItem[]> {\n return flatten(await category.list())\n .filter((c) => matches(c.name, query))\n .slice(0, PER_PAGE)\n .map((c) => ({\n id: c.id,\n name: c.name,\n image: c.image ?? undefined,\n url: c.url,\n data: { id: c.id, name: c.name, url: c.url, image: c.image ?? null, icon: c.icon ?? null },\n }));\n}\n\nasync function brands(query: string): Promise<DevLookupItem[]> {\n const found = await collect(\n (page) => brand.list(page),\n (b) => matches(b.name, query)\n );\n return found.map((b) => ({\n id: b.id,\n name: b.name,\n image: b.logo,\n url: b.url,\n data: { id: b.id, name: b.name, url: b.url, logo: b.logo, banner: b.banner ?? null },\n }));\n}\n\nasync function blogArticles(query: string): Promise<DevLookupItem[]> {\n const found = await collect(\n async (_page, cursor) => {\n const { data, cursor: pages } = await blog.articles.list(cursor ? { cursor } : undefined);\n return { items: data, next: pages?.next ?? null };\n },\n (a) => matches(a.name, query)\n );\n return found.map((a) => ({\n id: a.id,\n name: a.name,\n image: a.image,\n url: a.url,\n data: { id: a.id, name: a.name, url: a.url },\n }));\n}\n\nasync function blogCategories(query: string): Promise<DevLookupItem[]> {\n const { categories: list } = await blog.get();\n return list\n .filter((c) => matches(c.name, query))\n .slice(0, PER_PAGE)\n .map((c) => ({\n id: c.id,\n name: c.name,\n url: c.url,\n data: { id: c.id, name: c.name, url: c.url },\n }));\n}\n\nconst LOOKUPS: Record<DevLookupSource, (query: string) => Promise<DevLookupItem[]>> = {\n products,\n categories,\n brands,\n blog_articles: blogArticles,\n blog_categories: blogCategories,\n};\n\nexport function lookupInStore(source: DevLookupSource, query: string): Promise<DevLookupItem[]> {\n const lookup = LOOKUPS[source];\n if (!lookup) return Promise.reject(new Error(`no lookup for ${source}`));\n return lookup(query.trim());\n}\n"]}
1
+ {"version":3,"sources":["../src/dev/store-lookup.ts"],"names":["categories"],"mappings":"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","file":"store-lookup-LVKWUL6Z.js","sourcesContent":["/**\n * Runs in the editor's frame (the storefront), which has the engine's API\n * client set up for the dev store: answers the editor's pickers with the real\n * store's products, categories, brands and blog. Loaded with `import()` on the\n * first lookup, so a storefront never carries it.\n *\n * Each item's `data` is what a block receives for it, in the API's shape: a\n * product block reads only the ids and fetches the rest, while categories and\n * brands are drawn from what is saved.\n */\n\nimport { product } from '../api/product';\nimport { category } from '../api/category';\nimport { brand } from '../api/brands';\nimport { blog } from '../api/blog';\nimport type { Category } from '../types';\nimport { DEV_LOOKUP_BUDGET_MS, type DevLookupItem, type DevLookupSource } from './schema-types';\n\n/** Enough to choose from; a search narrows it further. */\nconst PER_PAGE = 20;\n/** How far a paged list is searched before giving up, so a big store can't stall the picker. */\nconst MAX_PAGES = 10;\n\ninterface Page<T> {\n items: T[];\n next: string | null;\n}\n\n/**\n * The matching items of a paged list, read page after page until there are\n * enough, the pages run out, or the time budget is spent: a brand or article on\n * page three is still found, and what was found so far always reaches the\n * editor before it stops waiting (`DEV_LOOKUP_BUDGET_MS` < its timeout).\n */\nasync function collect<T>(\n fetchPage: (page: number, cursor: string | null) => Promise<Page<T>>,\n keep: (item: T) => boolean\n): Promise<T[]> {\n const deadline = Date.now() + DEV_LOOKUP_BUDGET_MS;\n const found: T[] = [];\n let cursor: string | null = null;\n for (let page = 1; page <= MAX_PAGES; page += 1) {\n const { items, next } = await fetchPage(page, cursor);\n found.push(...items.filter(keep));\n if (found.length >= PER_PAGE || !next || Date.now() >= deadline) break;\n cursor = next;\n }\n return found.slice(0, PER_PAGE);\n}\n\nfunction matches(name: string, query: string): boolean {\n return !query || name.toLowerCase().includes(query.toLowerCase());\n}\n\n/** Categories with their subcategories, flattened, parents first. */\nfunction flatten(categories: Category[]): Category[] {\n return categories.flatMap((c) => [c, ...flatten(c.sub_categories ?? [])]);\n}\n\nasync function products(query: string): Promise<DevLookupItem[]> {\n const { items } = await product.list({\n source: query ? 'search' : 'latest',\n ...(query ? { keyword: query } : {}),\n perPage: PER_PAGE,\n });\n // List responses send the id as a numeric string; the block reads a number. Use it for both.\n return items.map((p) => ({\n id: Number(p.id),\n name: p.name,\n image: p.image?.url,\n url: p.url,\n data: { id: Number(p.id), name: p.name, url: p.url, image: p.image?.url ?? null },\n }));\n}\n\nasync function categories(query: string): Promise<DevLookupItem[]> {\n return flatten(await category.list())\n .filter((c) => matches(c.name, query))\n .slice(0, PER_PAGE)\n .map((c) => ({\n id: c.id,\n name: c.name,\n image: c.image ?? undefined,\n url: c.url,\n data: { id: c.id, name: c.name, url: c.url, image: c.image ?? null, icon: c.icon ?? null },\n }));\n}\n\nasync function brands(query: string): Promise<DevLookupItem[]> {\n const found = await collect(\n (page) => brand.list(page),\n (b) => matches(b.name, query)\n );\n return found.map((b) => ({\n id: b.id,\n name: b.name,\n image: b.logo,\n url: b.url,\n data: { id: b.id, name: b.name, url: b.url, logo: b.logo, banner: b.banner ?? null },\n }));\n}\n\nasync function blogArticles(query: string): Promise<DevLookupItem[]> {\n const found = await collect(\n async (_page, cursor) => {\n const { data, cursor: pages } = await blog.articles.list(cursor ? { cursor } : undefined);\n return { items: data, next: pages?.next ?? null };\n },\n (a) => matches(a.name, query)\n );\n return found.map((a) => ({\n id: a.id,\n name: a.name,\n image: a.image,\n url: a.url,\n data: { id: a.id, name: a.name, url: a.url },\n }));\n}\n\nasync function blogCategories(query: string): Promise<DevLookupItem[]> {\n const { categories: list } = await blog.get();\n return list\n .filter((c) => matches(c.name, query))\n .slice(0, PER_PAGE)\n .map((c) => ({\n id: c.id,\n name: c.name,\n url: c.url,\n data: { id: c.id, name: c.name, url: c.url },\n }));\n}\n\nconst LOOKUPS: Record<DevLookupSource, (query: string) => Promise<DevLookupItem[]>> = {\n products,\n categories,\n brands,\n blog_articles: blogArticles,\n blog_categories: blogCategories,\n};\n\nexport function lookupInStore(source: DevLookupSource, query: string): Promise<DevLookupItem[]> {\n const lookup = LOOKUPS[source];\n if (!lookup) return Promise.reject(new Error(`no lookup for ${source}`));\n return lookup(query.trim());\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"twilight.d.ts","sourceRoot":"","sources":["../../../src/tanstack/middleware/twilight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAclE;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,QAAQ,CAchE;AAED,UAAU,yBAAyB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,kBAAkB,GAAI,UAAU,yBAAyB,KAAG,oBA0DxE,CAAC"}
1
+ {"version":3,"file":"twilight.d.ts","sourceRoot":"","sources":["../../../src/tanstack/middleware/twilight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAelE;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,QAAQ,CAchE;AAED,UAAU,yBAAyB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,kBAAkB,GAAI,UAAU,yBAAyB,KAAG,oBAyExE,CAAC"}
@@ -16,8 +16,16 @@
16
16
  */
17
17
  import type { LocationRewrite } from '@tanstack/react-router';
18
18
  /**
19
- * A rewrite that serves the application from `/<base>`, or from `/<locale>/<base>`
20
- * when `followsLocale` (a Salla shared host, `/ar/dev-x/cart`).
19
+ * A rewrite that serves the application from `/<base>`.
20
+ *
21
+ * With `followsLocale` (a Salla shared host) the address carries no language, but the
22
+ * route tree still has its `/{-$locale}` segment, so the language is a *virtual* one:
23
+ * `input` puts it in front of the path (`/dev-x/cart` → `/ar/cart`, from `?lang=`, then
24
+ * the `s-lang` cookie, then the fallback) and `output` takes it off again. The old
25
+ * address, `/ar/dev-x/cart`, is still understood and keeps its own language.
26
+ *
27
+ * A link keeps `?lang=` for as long as the page it is on carries one (see `output`), so a
28
+ * visitor whose browser blocks the cookie does not lose the language on the next page.
21
29
  */
22
30
  export declare function storeBaseRewrite(base: string, followsLocale?: boolean): LocationRewrite;
23
31
  //# sourceMappingURL=store-base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store-base.d.ts","sourceRoot":"","sources":["../../src/tanstack/store-base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,UAAQ,GAAG,eAAe,CAWrF"}
1
+ {"version":3,"file":"store-base.d.ts","sourceRoot":"","sources":["../../src/tanstack/store-base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAM9D;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,UAAQ,GAAG,eAAe,CA6CrF"}
@@ -6,7 +6,8 @@
6
6
  * - /{-$locale}/cart matches both /cart and /ar/cart
7
7
  *
8
8
  * beforeLoad: validates the locale format when present.
9
- * loader: checks store.settings.is_multilingual and redirects accordingly.
9
+ * loader: checks store.settings.is_multilingual (and the number of languages) and redirects
10
+ * accordingly. On a Salla shared host the address has no locale, so it redirects nothing.
10
11
  *
11
12
  * Note: loader and head are in __root.tsx for better SSR support.
12
13
  * Note: RouteDocumentSync is now in TwilightProvider for automatic route class syncing.
@@ -1 +1 @@
1
- {"version":3,"file":"locale-wrapper.d.ts","sourceRoot":"","sources":["../../../src/tanstack/templates/locale-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAyDzE"}
1
+ {"version":3,"file":"locale-wrapper.d.ts","sourceRoot":"","sources":["../../../src/tanstack/templates/locale-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CA4FzE"}
package/dist/tanstack.js CHANGED
@@ -1,32 +1,32 @@
1
- export { tanstackDocumentAdapter as attrs, createRouter, createTwilightRootRoute, useTanstackDocumentAttrs as useAttrs } from './chunk-5N74JJ2Z.js';
2
- import { requestHostOf } from './chunk-LUFLN7WL.js';
3
- export { TanStackLinkAdapter, TanStackNavigationProvider, createTanStackLinkAdapter } from './chunk-LUFLN7WL.js';
1
+ export { tanstackDocumentAdapter as attrs, createRouter, createTwilightRootRoute, useTanstackDocumentAttrs as useAttrs } from './chunk-YSYA64WS.js';
2
+ import { requestHostOf } from './chunk-VFXAHTB3.js';
3
+ export { TanStackLinkAdapter, TanStackNavigationProvider, createTanStackLinkAdapter } from './chunk-VFXAHTB3.js';
4
4
  import './chunk-Z4Y55HWX.js';
5
- export { tanstackHeadAdapter as head, withHead } from './chunk-2IW3JRWL.js';
5
+ export { tanstackHeadAdapter as head, withHead } from './chunk-4INSECDW.js';
6
6
  import { CRITICAL_STYLE_HREF } from './chunk-4FJGZQD3.js';
7
- import './chunk-Y464WYUT.js';
8
- import { readNativeAppHeaders } from './chunk-D42M66E4.js';
9
- import './chunk-D7XWUD6T.js';
10
- import './chunk-SQXUWX4B.js';
11
- import { rootHead } from './chunk-W354TTIE.js';
12
- import './chunk-EHX45KZG.js';
13
- import './chunk-UZGP2KFA.js';
14
- import './chunk-U6KJ7XBO.js';
7
+ import './chunk-EJLVOWXU.js';
8
+ import { readNativeAppHeaders } from './chunk-FNM2OUPD.js';
9
+ import './chunk-6NV6T24C.js';
10
+ import './chunk-6T7FUHJY.js';
11
+ import { rootHead } from './chunk-MVBMVM22.js';
12
+ import './chunk-LZZ6EESI.js';
13
+ import './chunk-6Z6BGS7P.js';
14
+ import './chunk-I7WSIN27.js';
15
15
  import './chunk-GD26FI4J.js';
16
- import './chunk-4SZZPXM2.js';
17
- import './chunk-UWDUMPL7.js';
16
+ import './chunk-TMMK2VYE.js';
17
+ import './chunk-E5PEYI5I.js';
18
18
  import './chunk-OUW6WESU.js';
19
19
  import './chunk-JWXJPJBO.js';
20
20
  export { mergeDocumentDescriptors as mergeAttrs } from './chunk-CW625T2E.js';
21
- import './chunk-4PT5MXGR.js';
22
- import './chunk-YDSWLCOY.js';
21
+ import './chunk-LU5DRXS5.js';
22
+ import './chunk-BFA2U7P3.js';
23
23
  import './chunk-TYNZ5B2B.js';
24
24
  import './chunk-BYMOPN2S.js';
25
- import './chunk-A4NN6C5B.js';
26
- import './chunk-3NFVZJNI.js';
27
- import { AUTH_TOKEN_COOKIE_NAME, extractTokenFromCookies, resolveRequestScope, resolveAddressedStore, STORE_BASE_HEADER, resolveRequestVersionId } from './chunk-GXZW6BJY.js';
28
- import { runWithTwilightContext, getTwilightContext } from './chunk-JNAJTCJD.js';
29
- export { getTwilightContext, runWithTwilightContext, updateTwilightContext } from './chunk-JNAJTCJD.js';
25
+ import './chunk-YYMKDBZV.js';
26
+ import './chunk-X2JCU7GY.js';
27
+ import { AUTH_TOKEN_COOKIE_NAME, extractTokenFromCookies, resolveRequestScope, resolveAddressedStore, STORE_BASE_HEADER, resolveRequestVersionId, legacyLocaleRedirectHref } from './chunk-POI4G5EA.js';
28
+ import { runWithTwilightContext, getTwilightContext } from './chunk-QRHXAKJ3.js';
29
+ export { getTwilightContext, runWithTwilightContext, updateTwilightContext } from './chunk-QRHXAKJ3.js';
30
30
  import './chunk-T72DAX7R.js';
31
31
  import './chunk-DF6FBKDN.js';
32
32
  import './chunk-DGUM43GV.js';
@@ -72,7 +72,7 @@ function withMaintenanceStatus(result) {
72
72
  }
73
73
  var twilightMiddleware = (options) => {
74
74
  const cookieName = options?.cookieName ?? AUTH_TOKEN_COOKIE_NAME;
75
- return createMiddleware().server(({ request, next }) => {
75
+ return createMiddleware().server(async ({ request, next }) => {
76
76
  const cookieHeader = request.headers.get("Cookie");
77
77
  const authToken = extractTokenFromCookies(cookieHeader, cookieName);
78
78
  const scope = resolveRequestScope(request.url, cookieHeader);
@@ -85,7 +85,11 @@ var twilightMiddleware = (options) => {
85
85
  );
86
86
  const versionId = resolveRequestVersionId(request.url, cookieHeader, requestHost);
87
87
  const nativeAppHeaders = readNativeAppHeaders(request.headers);
88
- return runWithTwilightContext(
88
+ if (storeBase && storeBaseFollowsLocale && (request.method === "GET" || request.method === "HEAD")) {
89
+ const location = legacyLocaleRedirectHref(request.url, storeBase);
90
+ if (location) return new Response(null, { status: 302, headers: { Location: location } });
91
+ }
92
+ const response = await runWithTwilightContext(
89
93
  {
90
94
  authToken,
91
95
  scope,
@@ -101,8 +105,26 @@ var twilightMiddleware = (options) => {
101
105
  return result instanceof Promise ? result.then(withMaintenanceStatus) : withMaintenanceStatus(result);
102
106
  }
103
107
  );
108
+ return storeBaseFollowsLocale ? varyOnCookie(response) : response;
104
109
  });
105
110
  };
111
+ function withVaryCookie(response) {
112
+ const headers = new Headers(response.headers);
113
+ headers.append("Vary", "Cookie");
114
+ return new Response(response.body, {
115
+ status: response.status,
116
+ statusText: response.statusText,
117
+ headers
118
+ });
119
+ }
120
+ function varyOnCookie(result) {
121
+ if (result instanceof Response) return withVaryCookie(result);
122
+ const carried = result?.response;
123
+ if (carried instanceof Response) {
124
+ result.response = withVaryCookie(carried);
125
+ }
126
+ return result;
127
+ }
106
128
  var CRITICAL_ASSETS = [
107
129
  { rel: "preconnect", href: "https://api.salla.dev" },
108
130
  { rel: "preconnect", href: "https://cdn.salla.sa" },
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tanstack/stylesheet.tsx","../src/tanstack/middleware/twilight.ts","../src/tanstack/middleware/earlyHints.ts"],"names":["createMiddleware"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,IAAM,gBAAA,GAAmB,MAAM,MAAM;AAAC,CAAA;AAG/B,SAAS,gBAAgB,EAAE,IAAA,EAAM,QAAA,GAAW,IAAG,EAAyB;AAC7E,EAAA,MAAM,UAAU,cAAA,CAAe;AAAA,IAC7B,MAAA,EAAQ,CAAC,KAAA,KACP,KAAA,CAAM,QAAQ,IAAA,CAAK,CAAC,KAAA,KAAU,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,KAAA,CAAM,OAAO,CAAC,CAAA,EAAG;AAAA,GAC1E,CAAA;AAED,EAAA,MAAM,CAAC,aAAa,CAAA,GAAI,QAAA,CAAS,OAAO,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,oBAAA;AAAA,IACf,gBAAA;AAAA,IACA,MAAM,IAAA;AAAA,IACN,MAAM;AAAA,GACR;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,aAAA;AAAA,oBAEC,GAAA,CAAC,WAAM,IAAA,EAAM,mBAAA,EAAqB,YAAW,UAAA,EAC1C,QAAA,EAAA,QAAA,CAAS,aAAa,CAAA,EACzB,CAAA;AAAA,IAAA,CAEA,CAAC,aAAA,IAAiB,QAAA,qBAClB,GAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,iBAAA,EAAkB,GAAA,EAAI,YAAA,EAAa,IAAA,EAAY,UAAA,EAAW,SAAA,EAAU,CAAA;AAAA,IAE9E,aAAA,wBACE,UAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,UAAK,GAAA,EAAI,YAAA,EAAa,MAAY,CAAA,EACrC;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAGO,SAAS,gBAAA,GAAmB;AACjC,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,KAAA,GAAQ,SAAA,EAAU,CAAE,OAAA,CAAQ,GAAA,EAAK,KAAA;AACvC,EAAA,OAAO,IAAA,CACJ,MAAA,CAAO,CAAC,GAAA,KAAQ,EAAE,GAAA,CAAI,GAAA,KAAQ,MAAA,IAAU,GAAA,CAAI,KAAA,EAAO,GAAA,KAAQ,eAAA,CAAgB,CAAA,CAC3E,GAAA,CAAI,CAAC,GAAA,qBAAQ,aAAA,CAAC,KAAA,EAAA,EAAO,GAAG,GAAA,EAAK,GAAA,EAAK,CAAA,SAAA,EAAY,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,CAAA,EAAI,KAAA,EAAc,CAAE,CAAA;AAC1F;ACjCO,SAAS,sBAAyB,MAAA,EAAyB;AAChE,EAAA,MAAM,QAAA,GACJ,kBAAkB,QAAA,GACd,MAAA,GACC,QAA0C,QAAA,YAAoB,QAAA,GAC3D,OAAkC,QAAA,GACpC,IAAA;AACR,EAAA,IAAI,CAAC,YAAY,QAAA,CAAS,MAAA,KAAW,OAAO,CAAC,kBAAA,EAAmB,CAAE,WAAA,EAAa,OAAO,MAAA;AACtF,EAAA,MAAM,WAAA,GAAc,IAAI,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM;AAAA,IAC9C,MAAA,EAAQ,GAAA;AAAA,IACR,UAAA,EAAY,qBAAA;AAAA,IACZ,SAAS,QAAA,CAAS;AAAA,GACnB,CAAA;AACD,EAAA,OAAO,kBAAkB,QAAA,GAAW,WAAA,GAAc,EAAE,GAAG,MAAA,EAAQ,UAAU,WAAA,EAAY;AACvF;AAMO,IAAM,kBAAA,GAAqB,CAAC,OAAA,KAA8D;AAC/F,EAAA,MAAM,UAAA,GAAa,SAAS,UAAA,IAAc,sBAAA;AAE1C,EAAA,OAAO,kBAAiB,CAAE,MAAA,CAAO,CAAC,EAAE,OAAA,EAAS,MAAK,KAAM;AACtD,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACjD,IAAA,MAAM,SAAA,GAAY,uBAAA,CAAwB,YAAA,EAAc,UAAU,CAAA;AAElE,IAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAA,CAAQ,GAAA,EAAK,YAAY,CAAA;AAC3D,IAAA,MAAM,WAAA,GAAc,cAAc,OAAO,CAAA;AAiBzC,IAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,sBAAA,EAAuB,GAAI,qBAAA;AAAA,MACrD,OAAA,CAAQ,GAAA;AAAA,MACR,YAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,iBAAiB;AAAA,KACvC;AAKA,IAAA,MAAM,SAAA,GAAY,uBAAA,CAAwB,OAAA,CAAQ,GAAA,EAAK,cAAc,WAAW,CAAA;AAChF,IAAA,MAAM,gBAAA,GAAmB,oBAAA,CAAqB,OAAA,CAAQ,OAAO,CAAA;AAE7D,IAAA,OAAO,sBAAA;AAAA,MACL;AAAA,QACE,SAAA;AAAA,QACA,KAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA;AAAA,QACA,sBAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,MAAM;AACJ,QAAA,MAAM,SAAS,IAAA,CAAK,EAAE,SAAS,EAAE,SAAA,IAAa,CAAA;AAE9C,QAAA,OAAO,kBAAkB,OAAA,GACrB,MAAA,CAAO,KAAK,qBAAqB,CAAA,GACjC,sBAAsB,MAAM,CAAA;AAAA,MAClC;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;ACjGA,IAAM,eAAA,GAAkB;AAAA,EACtB,EAAE,GAAA,EAAK,YAAA,EAAc,IAAA,EAAM,uBAAA,EAAwB;AAAA,EACnD,EAAE,GAAA,EAAK,YAAA,EAAc,IAAA,EAAM,sBAAA,EAAuB;AAAA,EAClD,EAAE,GAAA,EAAK,YAAA,EAAc,IAAA,EAAM,kCAAA,EAAoC,aAAa,WAAA,EAAY;AAAA,EACxF,EAAE,GAAA,EAAK,YAAA,EAAc,IAAA,EAAM,2BAAA,EAA6B,aAAa,WAAA;AACvE,CAAA;AAGA,SAAS,cAAc,GAAA,EAAiC;AACtD,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,qBAAqB,CAAA;AAC7C,EAAA,OAAO,QAAQ,CAAC,CAAA;AAClB;AAGA,SAAS,gBAAgB,IAAA,EAA8C;AACrE,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,GAAA,EAAK,OAAO,IAAA;AAG1B,EAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,KAAA,KAAU,SAAS,OAAO,IAAA;AAC9B,IAAA,OAAO,IAAI,IAAI,CAAA,wBAAA,CAAA;AAAA,EACjB;AAEA,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,MAAM,SAAS,IAAA,CAAK,EAAA;AACpB,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,IAAI,KAAK,aAAA,EAAe,CAAA,GAAA,EAAM,MAAM,CAAA,CAAE,CAAA;AACzD,IAAA,IAAI,MAAA,KAAW,MAAA,IAAU,IAAA,CAAK,WAAA,EAAa;AACzC,MAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AAAA,IAC1B;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,IAAA,OAAO,IAAI,IAAI,CAAA,oBAAA,CAAA;AAAA,EACjB;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,uBAAuB,MAA4B;AAC9D,EAAA,IAAI,mBAAA,GAAuC,IAAA;AAE3C,EAAA,OAAOA,kBAAiB,CAAE,MAAA,CAAO,OAAO,EAAE,OAAA,EAAS,MAAK,KAAM;AAC5D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,EAAK;AAE5B,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,IAAK,EAAA;AAChD,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA,IAAK,MAAA,KAAW,OAAO,OAAO,QAAA;AAC9D,IAAA,IAAI,EAAE,QAAA,YAAoB,QAAA,CAAA,EAAW,OAAO,QAAA;AAE5C,IAAA,MAAM,cAAwB,EAAC;AAG/B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AACzC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,aAAa,QAAA,CAAS,EAAE,QAAQ,EAAE,MAAA,IAAU,CAAA;AAClD,QAAA,MAAM,KAAA,GAAS,UAAA,CAAW,KAAA,IAAuC,EAAC;AAClE,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,MAAA,GAAS,gBAAgB,IAAI,CAAA;AACnC,UAAA,IAAI,MAAA,EAAQ,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,IACF,SAAS,CAAA,EAAG;AAEV,MAAA,OAAA,CAAQ,KAAK,+BAAA,EAAiC,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,UAAU,CAAC,CAAA;AAChF,MAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,QAAA,MAAM,EAAA,GAAK,aAAA,IAAiB,KAAA,GAAQ,KAAA,CAAM,WAAA,GAAc,MAAA;AACxD,QAAA,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,OAAA,EAAU,KAAA,CAAM,GAAG,CAAA,EAAG,EAAA,GAAK,eAAA,GAAkB,EAAE,CAAA,CAAE,CAAA;AAAA,MAClF;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,gBAAA,EAAiB;AAClC,QAAA,MAAM,aAAa,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA,EAAG,UAAU,EAAC;AAC3D,QAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,QAAA,mBAAA,GAAsB,EAAC;AACvB,QAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,UAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,IAAU,KAAA,CAAM,OAAO,IAAA,EAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AAC/D,YAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,EAAG;AAC/B,cAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AACzB,cAAA,mBAAA,CAAoB,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAAA,YAC3C;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,CAAA,EAAG;AAEV,QAAA,OAAA,CAAQ,KAAK,uCAAA,EAAyC,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,MAC1F;AAAA,IACF;AAEA,IAAA,IAAI,mBAAA,EAAqB;AACvB,MAAA,KAAA,MAAW,QAAQ,mBAAA,EAAqB;AACtC,QAAA,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,EAAI,IAAI,CAAA,wBAAA,CAA0B,CAAA;AAAA,MACrD;AAAA,IACF;AAGA,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,OAAA,CAAQ,KAAK,oEAA+D,CAAA;AAC5E,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA;AAC5C,IAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,MAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,UAAU,CAAA;AAAA,IACnC;AAEA,IAAA,OAAO,IAAI,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM;AAAA,MACjC,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB;AAAA,KACD,CAAA;AAAA,EACH,CAAC,CAAA;AACH","file":"tanstack.js","sourcesContent":["import { useState, useSyncExternalStore } from 'react';\nimport { Asset, useRouter, useRouterState, useTags } from '@tanstack/react-router';\nimport { CRITICAL_STYLE_HREF } from '../boot/critical-style';\n\nexport interface ThemeStylesheetProps {\n /** The full stylesheet's URL (`app.css?url`). */\n href: string;\n /**\n * Inline critical CSS by route id. A page server-rendered as one of these routes paints from it,\n * and `bootClient` adds `href` once its first screen has painted. Pass the same route ids on the\n * client with empty strings, so hydration renders the same tags without shipping the CSS twice.\n */\n critical?: Readonly<Record<string, string>>;\n}\n\nconst subscribeNothing = () => () => {};\n\n/** The theme's stylesheet: inline critical CSS for the routes that have it, the full sheet otherwise. */\nexport function ThemeStylesheet({ href, critical = {} }: ThemeStylesheetProps) {\n const routeId = useRouterState({\n select: (state): string | undefined =>\n state.matches.find((match) => Object.hasOwn(critical, match.routeId))?.routeId,\n });\n // The route the page was server-rendered as: never added or removed on client-side navigations.\n const [criticalRoute] = useState(routeId);\n const hydrated = useSyncExternalStore(\n subscribeNothing,\n () => true,\n () => false\n );\n\n return (\n <>\n {criticalRoute && (\n // Its own precedence, so it lands before the full sheet; React renders the CSS verbatim.\n <style href={CRITICAL_STYLE_HREF} precedence=\"critical\">\n {critical[criticalRoute]}\n </style>\n )}\n {(!criticalRoute || hydrated) && (\n <link id=\"salla-theme-css\" rel=\"stylesheet\" href={href} precedence=\"default\" />\n )}\n {criticalRoute && (\n <noscript>\n <link rel=\"stylesheet\" href={href} />\n </noscript>\n )}\n </>\n );\n}\n\n/** The route's head tags without module preloads: they raced the LCP image, and the entry loads every chunk anyway. */\nexport function ThemeHeadContent() {\n const tags = useTags();\n const nonce = useRouter().options.ssr?.nonce;\n return tags\n .filter((tag) => !(tag.tag === 'link' && tag.attrs?.rel === 'modulepreload'))\n .map((tag) => <Asset {...tag} key={`tsr-meta-${JSON.stringify(tag)}`} nonce={nonce} />);\n}\n","import type { AnyRequestMiddleware } from '@tanstack/react-start';\nimport { createMiddleware } from '@tanstack/react-start';\nimport {\n extractTokenFromCookies,\n resolveAddressedStore,\n resolveRequestScope,\n resolveRequestVersionId,\n AUTH_TOKEN_COOKIE_NAME,\n STORE_BASE_HEADER,\n} from '../../utils/cookies';\nimport { getTwilightContext, runWithTwilightContext } from '../../twilight/context';\nimport { requestHostOf } from '../../utils/request-host';\nimport { readNativeAppHeaders } from '../../utils/native-app-headers';\n\n/**\n * A 503 for the maintenance page, so search engines read it as temporary and keep\n * the store indexed. TanStack sets the SSR status from the router alone (200, 404,\n * 500) and ignores `setResponseStatus`, so the status is applied here, on the\n * response the render produced, from the decision `rootBeforeLoad` left in the\n * request context. Only a 200 is rewritten: a redirect or an error keeps its own.\n *\n * `next()` resolves to the middleware context, whose `response` is the render; a\n * bare `Response` is accepted too. The rewrite keeps the body stream, so TanStack\n * treats it as the same response rather than a replacement to cancel.\n */\nexport function withMaintenanceStatus<T>(result: T): T | Response {\n const response =\n result instanceof Response\n ? result\n : (result as { response?: unknown } | null)?.response instanceof Response\n ? ((result as { response: Response }).response as Response)\n : null;\n if (!response || response.status !== 200 || !getTwilightContext().maintenance) return result;\n const unavailable = new Response(response.body, {\n status: 503,\n statusText: 'Service Unavailable',\n headers: response.headers,\n });\n return result instanceof Response ? unavailable : { ...result, response: unavailable };\n}\n\ninterface TwilightMiddlewareOptions {\n cookieName?: string;\n}\n\nexport const twilightMiddleware = (options?: TwilightMiddlewareOptions): AnyRequestMiddleware => {\n const cookieName = options?.cookieName ?? AUTH_TOKEN_COOKIE_NAME;\n\n return createMiddleware().server(({ request, next }) => {\n const cookieHeader = request.headers.get('Cookie');\n const authToken = extractTokenFromCookies(cookieHeader, cookieName);\n // `?scope=` before the cookie: it is how a market is switched (see resolveRequestScope).\n const scope = resolveRequestScope(request.url, cookieHeader);\n const requestHost = requestHostOf(request);\n // Read here and nowhere else: a deployed theme worker has no vars and no\n // bindings, so the request is the only thing that knows which store it is\n // serving. Everything downstream reads it off the context rather than\n // reaching for a build-time constant that is not there in production.\n //\n // The host goes in because it decides whether the request is allowed to name\n // a store at all. On a merchant's own domain it is not: the hostname is the\n // store, and `?storeId=` there would serve a stranger's shop from a domain\n // its owner controls.\n //\n // On those same hosts the store is also the first segment of the path, the\n // root of every URL there, and a store named that way takes the cookie's\n // place: the path is the address the visitor can see.\n //\n // On a Salla shared host the dispatcher names the store instead, from the\n // segment after the locale, and that is where it stays in every URL.\n const { storeId, storeBase, storeBaseFollowsLocale } = resolveAddressedStore(\n request.url,\n cookieHeader,\n requestHost,\n request.headers.get(STORE_BASE_HEADER)\n );\n // The version is read here for the same reason and behind the same gate. A\n // theme editor previews a draft version of a merchant's settings before it is\n // published, and a partner running the theme locally renders against one —\n // both open the storefront in an iframe and say which version in the URL.\n const versionId = resolveRequestVersionId(request.url, cookieHeader, requestHost);\n const nativeAppHeaders = readNativeAppHeaders(request.headers);\n\n return runWithTwilightContext(\n {\n authToken,\n scope,\n storeId,\n storeBase,\n storeBaseFollowsLocale,\n versionId,\n requestHost,\n nativeAppHeaders,\n },\n () => {\n const result = next({ context: { authToken } });\n // The continuation stays in this request's scope: it was registered inside `run`.\n return result instanceof Promise\n ? result.then(withMaintenanceStatus)\n : withMaintenanceStatus(result);\n }\n );\n });\n};\n","import type { AnyRequestMiddleware } from '@tanstack/react-start';\nimport { createMiddleware } from '@tanstack/react-start';\nimport { tsrStartManifest } from 'tanstack-start-manifest:v';\nimport { rootHead } from '../../routes/root/head';\n\n/** Known critical assets that should always be preloaded */\nconst CRITICAL_ASSETS = [\n { rel: 'preconnect', href: 'https://api.salla.dev' },\n { rel: 'preconnect', href: 'https://cdn.salla.sa' },\n { rel: 'preconnect', href: 'https://cdn.assets.salla.network', crossOrigin: 'anonymous' },\n { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossOrigin: 'anonymous' },\n] as const;\n\n/** Extract locale from URL path (e.g., /ar/products → 'ar') */\nfunction extractLocale(url: string): string | undefined {\n const match = url.match(/^\\/([a-z]{2})(\\/|$)/);\n return match?.[1];\n}\n\n/** Build Link header value from a link descriptor */\nfunction buildLinkHeader(link: Record<string, unknown>): string | null {\n const href = link.href as string | undefined;\n const rel = link.rel as string | undefined;\n if (!href || !rel) return null;\n\n // Skip print-media stylesheets (already non-blocking)\n if (rel === 'stylesheet') {\n const media = link.media as string | undefined;\n if (media === 'print') return null;\n return `<${href}>; rel=preload; as=style`;\n }\n\n if (rel === 'preload') {\n const asType = link.as as string | undefined;\n if (!asType) return null;\n const parts = [`<${href}>`, 'rel=preload', `as=${asType}`];\n if (asType === 'font' || link.crossOrigin) {\n parts.push('crossorigin');\n }\n return parts.join('; ');\n }\n\n if (rel === 'modulepreload') {\n return `<${href}>; rel=modulepreload`;\n }\n\n return null;\n}\n\nexport const earlyHintsMiddleware = (): AnyRequestMiddleware => {\n let cachedManifestPaths: string[] | null = null;\n\n return createMiddleware().server(async ({ request, next }) => {\n const response = await next();\n\n const accept = request.headers.get('Accept') ?? '';\n if (!accept.includes('text/html') && accept !== '*/*') return response;\n if (!(response instanceof Response)) return response;\n\n const linkHeaders: string[] = [];\n\n // 1. Add critical assets from rootHead (fonts, icons, SDK, etc.)\n try {\n const url = new URL(request.url);\n const locale = extractLocale(url.pathname);\n if (locale) {\n const headResult = rootHead({ params: { locale } });\n const links = (headResult.links as Record<string, unknown>[]) ?? [];\n for (const link of links) {\n const header = buildLinkHeader(link);\n if (header) linkHeaders.push(header);\n }\n }\n } catch (e) {\n // rootHead failed — log why, then fall back to known critical assets\n console.warn('[earlyHints] rootHead failed:', e instanceof Error ? e.message : e);\n for (const asset of CRITICAL_ASSETS) {\n const co = 'crossOrigin' in asset ? asset.crossOrigin : undefined;\n linkHeaders.push(`<${asset.href}>; rel=${asset.rel}${co ? '; crossorigin' : ''}`);\n }\n }\n\n // 2. Add CSS from TanStack Start manifest (bundled theme CSS)\n if (!cachedManifestPaths) {\n try {\n const manifest = tsrStartManifest();\n const rootAssets = manifest.routes['__root__']?.assets ?? [];\n const seen = new Set<string>();\n cachedManifestPaths = [];\n for (const asset of rootAssets) {\n if (asset.tag === 'link' && asset.attrs?.href?.endsWith('.css')) {\n if (!seen.has(asset.attrs.href)) {\n seen.add(asset.attrs.href);\n cachedManifestPaths.push(asset.attrs.href);\n }\n }\n }\n } catch (e) {\n // manifest not available — skip\n console.warn('[earlyHints] tsrStartManifest failed:', e instanceof Error ? e.message : e);\n }\n }\n\n if (cachedManifestPaths) {\n for (const href of cachedManifestPaths) {\n linkHeaders.push(`<${href}>; rel=preload; as=style`);\n }\n }\n\n // Apply Link headers if we have any\n if (linkHeaders.length === 0) {\n console.warn('[earlyHints] no critical assets found — no Link headers added');\n return response;\n }\n\n const headers = new Headers(response.headers);\n for (const linkHeader of linkHeaders) {\n headers.append('Link', linkHeader);\n }\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n });\n};\n"]}
1
+ {"version":3,"sources":["../src/tanstack/stylesheet.tsx","../src/tanstack/middleware/twilight.ts","../src/tanstack/middleware/earlyHints.ts"],"names":["createMiddleware"],"mappings":"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","file":"tanstack.js","sourcesContent":["import { useState, useSyncExternalStore } from 'react';\nimport { Asset, useRouter, useRouterState, useTags } from '@tanstack/react-router';\nimport { CRITICAL_STYLE_HREF } from '../boot/critical-style';\n\nexport interface ThemeStylesheetProps {\n /** The full stylesheet's URL (`app.css?url`). */\n href: string;\n /**\n * Inline critical CSS by route id. A page server-rendered as one of these routes paints from it,\n * and `bootClient` adds `href` once its first screen has painted. Pass the same route ids on the\n * client with empty strings, so hydration renders the same tags without shipping the CSS twice.\n */\n critical?: Readonly<Record<string, string>>;\n}\n\nconst subscribeNothing = () => () => {};\n\n/** The theme's stylesheet: inline critical CSS for the routes that have it, the full sheet otherwise. */\nexport function ThemeStylesheet({ href, critical = {} }: ThemeStylesheetProps) {\n const routeId = useRouterState({\n select: (state): string | undefined =>\n state.matches.find((match) => Object.hasOwn(critical, match.routeId))?.routeId,\n });\n // The route the page was server-rendered as: never added or removed on client-side navigations.\n const [criticalRoute] = useState(routeId);\n const hydrated = useSyncExternalStore(\n subscribeNothing,\n () => true,\n () => false\n );\n\n return (\n <>\n {criticalRoute && (\n // Its own precedence, so it lands before the full sheet; React renders the CSS verbatim.\n <style href={CRITICAL_STYLE_HREF} precedence=\"critical\">\n {critical[criticalRoute]}\n </style>\n )}\n {(!criticalRoute || hydrated) && (\n <link id=\"salla-theme-css\" rel=\"stylesheet\" href={href} precedence=\"default\" />\n )}\n {criticalRoute && (\n <noscript>\n <link rel=\"stylesheet\" href={href} />\n </noscript>\n )}\n </>\n );\n}\n\n/** The route's head tags without module preloads: they raced the LCP image, and the entry loads every chunk anyway. */\nexport function ThemeHeadContent() {\n const tags = useTags();\n const nonce = useRouter().options.ssr?.nonce;\n return tags\n .filter((tag) => !(tag.tag === 'link' && tag.attrs?.rel === 'modulepreload'))\n .map((tag) => <Asset {...tag} key={`tsr-meta-${JSON.stringify(tag)}`} nonce={nonce} />);\n}\n","import type { AnyRequestMiddleware } from '@tanstack/react-start';\nimport { createMiddleware } from '@tanstack/react-start';\nimport {\n extractTokenFromCookies,\n resolveAddressedStore,\n resolveRequestScope,\n resolveRequestVersionId,\n AUTH_TOKEN_COOKIE_NAME,\n STORE_BASE_HEADER,\n} from '../../utils/cookies';\nimport { getTwilightContext, runWithTwilightContext } from '../../twilight/context';\nimport { requestHostOf } from '../../utils/request-host';\nimport { legacyLocaleRedirectHref } from '../../utils/store-base';\nimport { readNativeAppHeaders } from '../../utils/native-app-headers';\n\n/**\n * A 503 for the maintenance page, so search engines read it as temporary and keep\n * the store indexed. TanStack sets the SSR status from the router alone (200, 404,\n * 500) and ignores `setResponseStatus`, so the status is applied here, on the\n * response the render produced, from the decision `rootBeforeLoad` left in the\n * request context. Only a 200 is rewritten: a redirect or an error keeps its own.\n *\n * `next()` resolves to the middleware context, whose `response` is the render; a\n * bare `Response` is accepted too. The rewrite keeps the body stream, so TanStack\n * treats it as the same response rather than a replacement to cancel.\n */\nexport function withMaintenanceStatus<T>(result: T): T | Response {\n const response =\n result instanceof Response\n ? result\n : (result as { response?: unknown } | null)?.response instanceof Response\n ? ((result as { response: Response }).response as Response)\n : null;\n if (!response || response.status !== 200 || !getTwilightContext().maintenance) return result;\n const unavailable = new Response(response.body, {\n status: 503,\n statusText: 'Service Unavailable',\n headers: response.headers,\n });\n return result instanceof Response ? unavailable : { ...result, response: unavailable };\n}\n\ninterface TwilightMiddlewareOptions {\n cookieName?: string;\n}\n\nexport const twilightMiddleware = (options?: TwilightMiddlewareOptions): AnyRequestMiddleware => {\n const cookieName = options?.cookieName ?? AUTH_TOKEN_COOKIE_NAME;\n\n return createMiddleware().server(async ({ request, next }) => {\n const cookieHeader = request.headers.get('Cookie');\n const authToken = extractTokenFromCookies(cookieHeader, cookieName);\n // `?scope=` before the cookie: it is how a market is switched (see resolveRequestScope).\n const scope = resolveRequestScope(request.url, cookieHeader);\n const requestHost = requestHostOf(request);\n // Read here and nowhere else: a deployed theme worker has no vars and no\n // bindings, so the request is the only thing that knows which store it is\n // serving. Everything downstream reads it off the context rather than\n // reaching for a build-time constant that is not there in production.\n //\n // The host goes in because it decides whether the request is allowed to name\n // a store at all. On a merchant's own domain it is not: the hostname is the\n // store, and `?storeId=` there would serve a stranger's shop from a domain\n // its owner controls.\n //\n // On those same hosts the store is also the first segment of the path, the\n // root of every URL there, and a store named that way takes the cookie's\n // place: the path is the address the visitor can see.\n //\n // On a Salla shared host the dispatcher names the store instead, from the\n // segment after the locale, and that is where it stays in every URL.\n const { storeId, storeBase, storeBaseFollowsLocale } = resolveAddressedStore(\n request.url,\n cookieHeader,\n requestHost,\n request.headers.get(STORE_BASE_HEADER)\n );\n // The version is read here for the same reason and behind the same gate. A\n // theme editor previews a draft version of a merchant's settings before it is\n // published, and a partner running the theme locally renders against one —\n // both open the storefront in an iframe and say which version in the URL.\n const versionId = resolveRequestVersionId(request.url, cookieHeader, requestHost);\n const nativeAppHeaders = readNativeAppHeaders(request.headers);\n\n // A shared host's address has no language in it any more: `/dev-x/cart`, not\n // `/ar/dev-x/cart`. An old link is sent to the new one once, keeping its language as\n // `?lang=`. Only a page load is redirected; anything else is answered as asked.\n if (\n storeBase &&\n storeBaseFollowsLocale &&\n (request.method === 'GET' || request.method === 'HEAD')\n ) {\n const location = legacyLocaleRedirectHref(request.url, storeBase);\n if (location) return new Response(null, { status: 302, headers: { Location: location } });\n }\n\n const response = await runWithTwilightContext(\n {\n authToken,\n scope,\n storeId,\n storeBase,\n storeBaseFollowsLocale,\n versionId,\n requestHost,\n nativeAppHeaders,\n },\n () => {\n const result = next({ context: { authToken } });\n // The continuation stays in this request's scope: it was registered inside `run`.\n return result instanceof Promise\n ? result.then(withMaintenanceStatus)\n : withMaintenanceStatus(result);\n }\n );\n // On a shared host the same URL is answered in the language the `s-lang` cookie names, so\n // a cache in front of the worker must not serve one visitor's page to another.\n return storeBaseFollowsLocale ? varyOnCookie(response) : response;\n });\n};\n\n/** A copy of `response` with `Vary: Cookie` added (the original's headers may be immutable). */\nfunction withVaryCookie(response: Response): Response {\n const headers = new Headers(response.headers);\n headers.append('Vary', 'Cookie');\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\n/**\n * Adds `Vary: Cookie` to what `next()` produced: its result carries the page's `response`,\n * and a middleware may also pass a bare `Response` through. Anything else is left as it is.\n */\nfunction varyOnCookie<T>(result: T): T {\n if (result instanceof Response) return withVaryCookie(result) as T;\n const carried = (result as { response?: unknown } | null)?.response;\n if (carried instanceof Response) {\n (result as { response: Response }).response = withVaryCookie(carried);\n }\n return result;\n}\n","import type { AnyRequestMiddleware } from '@tanstack/react-start';\nimport { createMiddleware } from '@tanstack/react-start';\nimport { tsrStartManifest } from 'tanstack-start-manifest:v';\nimport { rootHead } from '../../routes/root/head';\n\n/** Known critical assets that should always be preloaded */\nconst CRITICAL_ASSETS = [\n { rel: 'preconnect', href: 'https://api.salla.dev' },\n { rel: 'preconnect', href: 'https://cdn.salla.sa' },\n { rel: 'preconnect', href: 'https://cdn.assets.salla.network', crossOrigin: 'anonymous' },\n { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossOrigin: 'anonymous' },\n] as const;\n\n/** Extract locale from URL path (e.g., /ar/products → 'ar') */\nfunction extractLocale(url: string): string | undefined {\n const match = url.match(/^\\/([a-z]{2})(\\/|$)/);\n return match?.[1];\n}\n\n/** Build Link header value from a link descriptor */\nfunction buildLinkHeader(link: Record<string, unknown>): string | null {\n const href = link.href as string | undefined;\n const rel = link.rel as string | undefined;\n if (!href || !rel) return null;\n\n // Skip print-media stylesheets (already non-blocking)\n if (rel === 'stylesheet') {\n const media = link.media as string | undefined;\n if (media === 'print') return null;\n return `<${href}>; rel=preload; as=style`;\n }\n\n if (rel === 'preload') {\n const asType = link.as as string | undefined;\n if (!asType) return null;\n const parts = [`<${href}>`, 'rel=preload', `as=${asType}`];\n if (asType === 'font' || link.crossOrigin) {\n parts.push('crossorigin');\n }\n return parts.join('; ');\n }\n\n if (rel === 'modulepreload') {\n return `<${href}>; rel=modulepreload`;\n }\n\n return null;\n}\n\nexport const earlyHintsMiddleware = (): AnyRequestMiddleware => {\n let cachedManifestPaths: string[] | null = null;\n\n return createMiddleware().server(async ({ request, next }) => {\n const response = await next();\n\n const accept = request.headers.get('Accept') ?? '';\n if (!accept.includes('text/html') && accept !== '*/*') return response;\n if (!(response instanceof Response)) return response;\n\n const linkHeaders: string[] = [];\n\n // 1. Add critical assets from rootHead (fonts, icons, SDK, etc.)\n try {\n const url = new URL(request.url);\n const locale = extractLocale(url.pathname);\n if (locale) {\n const headResult = rootHead({ params: { locale } });\n const links = (headResult.links as Record<string, unknown>[]) ?? [];\n for (const link of links) {\n const header = buildLinkHeader(link);\n if (header) linkHeaders.push(header);\n }\n }\n } catch (e) {\n // rootHead failed — log why, then fall back to known critical assets\n console.warn('[earlyHints] rootHead failed:', e instanceof Error ? e.message : e);\n for (const asset of CRITICAL_ASSETS) {\n const co = 'crossOrigin' in asset ? asset.crossOrigin : undefined;\n linkHeaders.push(`<${asset.href}>; rel=${asset.rel}${co ? '; crossorigin' : ''}`);\n }\n }\n\n // 2. Add CSS from TanStack Start manifest (bundled theme CSS)\n if (!cachedManifestPaths) {\n try {\n const manifest = tsrStartManifest();\n const rootAssets = manifest.routes['__root__']?.assets ?? [];\n const seen = new Set<string>();\n cachedManifestPaths = [];\n for (const asset of rootAssets) {\n if (asset.tag === 'link' && asset.attrs?.href?.endsWith('.css')) {\n if (!seen.has(asset.attrs.href)) {\n seen.add(asset.attrs.href);\n cachedManifestPaths.push(asset.attrs.href);\n }\n }\n }\n } catch (e) {\n // manifest not available — skip\n console.warn('[earlyHints] tsrStartManifest failed:', e instanceof Error ? e.message : e);\n }\n }\n\n if (cachedManifestPaths) {\n for (const href of cachedManifestPaths) {\n linkHeaders.push(`<${href}>; rel=preload; as=style`);\n }\n }\n\n // Apply Link headers if we have any\n if (linkHeaders.length === 0) {\n console.warn('[earlyHints] no critical assets found — no Link headers added');\n return response;\n }\n\n const headers = new Headers(response.headers);\n for (const linkHeader of linkHeaders) {\n headers.append('Link', linkHeader);\n }\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n });\n};\n"]}
@@ -32,6 +32,12 @@ export interface Language {
32
32
  * as "ask anyway".
33
33
  */
34
34
  has_custom_translations?: boolean;
35
+ /**
36
+ * Whether this is the store's default language. Read on a shared host to pick the
37
+ * language a visitor lands on when the one they asked for is not offered. Optional:
38
+ * absent reads as "not marked".
39
+ */
40
+ is_default?: number | boolean;
35
41
  }
36
42
  /**
37
43
  * The maintenance notice the platform sends while the store is closed.
@@ -276,6 +282,8 @@ export interface StoreSettings {
276
282
  arabic_numbers_enabled: boolean;
277
283
  /** Content copy protection is on. */
278
284
  content_copyright?: boolean;
285
+ /** Show the 'Made with Salla' badge in the footer. */
286
+ display_copyright?: boolean;
279
287
  /** Show the Saudi riyal symbol instead of the currency code. */
280
288
  use_sar_symbol?: boolean;
281
289
  /** The store offers more than one language. */