@salla.sa/twilight-theme-engine 1.0.85 → 1.0.87

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 (390) hide show
  1. package/README.md +4 -3
  2. package/bin/twilight-check-manifest.mjs +16 -0
  3. package/dist/{AddToCartForm-B5C2M4OZ.js → AddToCartForm-P644O2QL.js} +4 -4
  4. package/dist/{AddToCartForm-B5C2M4OZ.js.map → AddToCartForm-P644O2QL.js.map} +1 -1
  5. package/dist/{BlogAuthorPage-GTF4UGSS.js → BlogAuthorPage-VWSO6MPY.js} +13 -11
  6. package/dist/BlogAuthorPage-VWSO6MPY.js.map +1 -0
  7. package/dist/{BlogCategoryPage-TN7Y4NBP.js → BlogCategoryPage-K2KSQ6T6.js} +13 -11
  8. package/dist/BlogCategoryPage-K2KSQ6T6.js.map +1 -0
  9. package/dist/{BlogPage-TDB3M3PI.js → BlogPage-XRM7VWOZ.js} +12 -10
  10. package/dist/BlogPage-XRM7VWOZ.js.map +1 -0
  11. package/dist/{BlogSinglePage-4A52Q5QW.js → BlogSinglePage-XIAXT54H.js} +12 -10
  12. package/dist/BlogSinglePage-XIAXT54H.js.map +1 -0
  13. package/dist/{BlogTagPage-TOVPBETA.js → BlogTagPage-IHOA267V.js} +13 -11
  14. package/dist/BlogTagPage-IHOA267V.js.map +1 -0
  15. package/dist/{BrandsPage-VUDGYSQI.js → BrandsPage-ZFEILRT3.js} +12 -10
  16. package/dist/BrandsPage-ZFEILRT3.js.map +1 -0
  17. package/dist/{Breadcrumb-CI3SN5YR.js → Breadcrumb-CVSISL2K.js} +12 -10
  18. package/dist/Breadcrumb-CVSISL2K.js.map +1 -0
  19. package/dist/{CartItem-BHLEURAB.js → CartItem-EOI7P3JA.js} +12 -10
  20. package/dist/CartItem-EOI7P3JA.js.map +1 -0
  21. package/dist/{CartSummary-QERVESYN.js → CartSummary-RZGUBDKJ.js} +12 -10
  22. package/dist/CartSummary-RZGUBDKJ.js.map +1 -0
  23. package/dist/{Copyright-RL6ALKRC.js → Copyright-5BLYSP24.js} +4 -4
  24. package/dist/{Copyright-RL6ALKRC.js.map → Copyright-5BLYSP24.js.map} +1 -1
  25. package/dist/{CustomerLayout-VRZUWGQK.js → CustomerLayout-6F4BJAMU.js} +12 -10
  26. package/dist/CustomerLayout-6F4BJAMU.js.map +1 -0
  27. package/dist/{Footer-ZWBZCMDL.js → Footer-NF2NLDLR.js} +6 -6
  28. package/dist/{Footer-ZWBZCMDL.js.map → Footer-NF2NLDLR.js.map} +1 -1
  29. package/dist/{Header-WNK4O66B.js → Header-6DQJ5X7J.js} +9 -7
  30. package/dist/{Header-WNK4O66B.js.map → Header-6DQJ5X7J.js.map} +1 -1
  31. package/dist/{LoyaltyPage-CGTHWJ76.js → LoyaltyPage-YHWHIWCS.js} +12 -10
  32. package/dist/LoyaltyPage-YHWHIWCS.js.map +1 -0
  33. package/dist/{LoyaltyPointsPage-QSU6K3PW.js → LoyaltyPointsPage-T6K3H5A5.js} +10 -3
  34. package/dist/LoyaltyPointsPage-T6K3H5A5.js.map +1 -0
  35. package/dist/{MainMenu-V3T7F32R.js → MainMenu-Y2TAM7DK.js} +4 -4
  36. package/dist/{MainMenu-V3T7F32R.js.map → MainMenu-Y2TAM7DK.js.map} +1 -1
  37. package/dist/{MasterLayout-XQF644LD.js → MasterLayout-GBEEFFPG.js} +12 -10
  38. package/dist/{MasterLayout-XQF644LD.js.map → MasterLayout-GBEEFFPG.js.map} +1 -1
  39. package/dist/{MobileMenu-U4BVQYKH.js → MobileMenu-RE5XVGZL.js} +12 -10
  40. package/dist/MobileMenu-RE5XVGZL.js.map +1 -0
  41. package/dist/{NotificationsPage-ZRRQY7TF.js → NotificationsPage-QAFWZAS3.js} +12 -10
  42. package/dist/NotificationsPage-QAFWZAS3.js.map +1 -0
  43. package/dist/{OrderSinglePage-O3XYVMG5.js → OrderSinglePage-T4PRXTKG.js} +12 -10
  44. package/dist/OrderSinglePage-T4PRXTKG.js.map +1 -0
  45. package/dist/{OrdersPage-CMXZF5MI.js → OrdersPage-3S6ZS56E.js} +12 -10
  46. package/dist/OrdersPage-3S6ZS56E.js.map +1 -0
  47. package/dist/{PageSingle-IIG2US43.js → PageSingle-W3UTXDOW.js} +4 -4
  48. package/dist/{PageSingle-IIG2US43.js.map → PageSingle-W3UTXDOW.js.map} +1 -1
  49. package/dist/{ProductDetails-65GDABI7.js → ProductDetails-X5A7TG3F.js} +14 -7
  50. package/dist/ProductDetails-X5A7TG3F.js.map +1 -0
  51. package/dist/{ProfilePage-SNJ4WXU4.js → ProfilePage-DUH3AILJ.js} +12 -10
  52. package/dist/ProfilePage-DUH3AILJ.js.map +1 -0
  53. package/dist/{ReviewsPage-UT7UT55J.js → ReviewsPage-2C2P7VS3.js} +4 -4
  54. package/dist/{ReviewsPage-UT7UT55J.js.map → ReviewsPage-2C2P7VS3.js.map} +1 -1
  55. package/dist/{SeoCartWidget-DBJAXJKT.js → SeoCartWidget-VYLGEW2I.js} +12 -10
  56. package/dist/SeoCartWidget-VYLGEW2I.js.map +1 -0
  57. package/dist/{SettingsPage-FLTIOPU5.js → SettingsPage-OZJEW6CW.js} +12 -10
  58. package/dist/SettingsPage-OZJEW6CW.js.map +1 -0
  59. package/dist/{StoreClosedNotification-ZT3QKDKS.js → StoreClosedNotification-QHIZBNXO.js} +13 -11
  60. package/dist/{StoreClosedNotification-ZT3QKDKS.js.map → StoreClosedNotification-QHIZBNXO.js.map} +1 -1
  61. package/dist/{TestimonialsPage-CU7HKU4O.js → TestimonialsPage-K6WJKKME.js} +4 -4
  62. package/dist/{TestimonialsPage-CU7HKU4O.js.map → TestimonialsPage-K6WJKKME.js.map} +1 -1
  63. package/dist/{ThankYouPage-5X6B4X3T.js → ThankYouPage-H6QQEI5R.js} +12 -10
  64. package/dist/ThankYouPage-H6QQEI5R.js.map +1 -0
  65. package/dist/{WalletPage-H2BKIDPA.js → WalletPage-G5IBGN6B.js} +12 -10
  66. package/dist/WalletPage-G5IBGN6B.js.map +1 -0
  67. package/dist/{WishlistPage-RS5UCIQ3.js → WishlistPage-AIOTAB6L.js} +12 -10
  68. package/dist/WishlistPage-AIOTAB6L.js.map +1 -0
  69. package/dist/api/advertisement.d.ts +33 -0
  70. package/dist/api/advertisement.d.ts.map +1 -0
  71. package/dist/api/advertisement.js +8 -0
  72. package/dist/api/advertisement.js.map +1 -0
  73. package/dist/boot/critical-style.d.ts +3 -0
  74. package/dist/boot/critical-style.d.ts.map +1 -0
  75. package/dist/boot/index.d.ts +15 -0
  76. package/dist/boot/index.d.ts.map +1 -0
  77. package/dist/boot.d.ts +1 -0
  78. package/dist/boot.js +69 -0
  79. package/dist/boot.js.map +1 -0
  80. package/dist/chunk-4FJGZQD3.js +6 -0
  81. package/dist/chunk-4FJGZQD3.js.map +1 -0
  82. package/dist/{chunk-SDFDS4Q3.js → chunk-BCJTF3V7.js} +20 -4
  83. package/dist/chunk-BCJTF3V7.js.map +1 -0
  84. package/dist/chunk-DBW7XXNE.js +103 -0
  85. package/dist/chunk-DBW7XXNE.js.map +1 -0
  86. package/dist/{chunk-22SH7OVF.js → chunk-E7WWO3V3.js} +3 -3
  87. package/dist/{chunk-22SH7OVF.js.map → chunk-E7WWO3V3.js.map} +1 -1
  88. package/dist/{chunk-SE5JYWOK.js → chunk-EZHXVHXY.js} +4 -4
  89. package/dist/{chunk-SE5JYWOK.js.map → chunk-EZHXVHXY.js.map} +1 -1
  90. package/dist/{chunk-JO7JWV34.js → chunk-FWYKOQV5.js} +5 -5
  91. package/dist/chunk-FWYKOQV5.js.map +1 -0
  92. package/dist/{chunk-JRNH3FUF.js → chunk-FYHF62KI.js} +4 -4
  93. package/dist/{chunk-JRNH3FUF.js.map → chunk-FYHF62KI.js.map} +1 -1
  94. package/dist/{chunk-UJKFBZFJ.js → chunk-GJ5IMPNY.js} +7 -7
  95. package/dist/{chunk-UJKFBZFJ.js.map → chunk-GJ5IMPNY.js.map} +1 -1
  96. package/dist/chunk-IVBOLREE.js +29 -0
  97. package/dist/chunk-IVBOLREE.js.map +1 -0
  98. package/dist/chunk-LWPKBVIE.js +14 -0
  99. package/dist/{chunk-7WAXN2PP.js.map → chunk-LWPKBVIE.js.map} +1 -1
  100. package/dist/{chunk-SX5MF2YA.js → chunk-N3BCZIGS.js} +4 -4
  101. package/dist/{chunk-SX5MF2YA.js.map → chunk-N3BCZIGS.js.map} +1 -1
  102. package/dist/{chunk-NZVR4OF7.js → chunk-NXQZ4RLM.js} +8 -8
  103. package/dist/chunk-NXQZ4RLM.js.map +1 -0
  104. package/dist/{chunk-NXQJA7D3.js → chunk-PCURRKIH.js} +3 -3
  105. package/dist/{chunk-NXQJA7D3.js.map → chunk-PCURRKIH.js.map} +1 -1
  106. package/dist/{chunk-4CZRUAZB.js → chunk-PU2LHFDQ.js} +10 -11
  107. package/dist/chunk-PU2LHFDQ.js.map +1 -0
  108. package/dist/{chunk-OWX2CPNQ.js → chunk-UQIVX4YA.js} +3 -3
  109. package/dist/{chunk-OWX2CPNQ.js.map → chunk-UQIVX4YA.js.map} +1 -1
  110. package/dist/chunk-X5NK4TZH.js +228 -0
  111. package/dist/chunk-X5NK4TZH.js.map +1 -0
  112. package/dist/{chunk-6SWDSRIL.js → chunk-XKNXYQ2K.js} +6 -6
  113. package/dist/{chunk-6SWDSRIL.js.map → chunk-XKNXYQ2K.js.map} +1 -1
  114. package/dist/{chunk-KHBSGD2D.js → chunk-XO7B3VWS.js} +3 -3
  115. package/dist/{chunk-KHBSGD2D.js.map → chunk-XO7B3VWS.js.map} +1 -1
  116. package/dist/cli/check-manifest.d.ts +10 -0
  117. package/dist/cli/check-manifest.d.ts.map +1 -0
  118. package/dist/cli/check-manifest.js +44 -0
  119. package/dist/cli/check-manifest.js.map +1 -0
  120. package/dist/components/cart/index.js +1 -1
  121. package/dist/components/common/index.js +2 -2
  122. package/dist/components/drawer/index.js +10 -8
  123. package/dist/components/home/index.js +12 -10
  124. package/dist/components/layout/Footer.d.ts.map +1 -1
  125. package/dist/components/layout/MasterLayout.d.ts.map +1 -1
  126. package/dist/components/layout/PageAdvertisements.d.ts +7 -0
  127. package/dist/components/layout/PageAdvertisements.d.ts.map +1 -0
  128. package/dist/components/layout/index.d.ts +1 -0
  129. package/dist/components/layout/index.d.ts.map +1 -1
  130. package/dist/components/layout/index.js +8 -1
  131. package/dist/components/product/index.js +11 -9
  132. package/dist/components/store/index.js +12 -10
  133. package/dist/components/store/index.js.map +1 -1
  134. package/dist/{document-class-67HTP45G.js → document-class-FRL7JHWD.js} +6 -5
  135. package/dist/{document-class-67HTP45G.js.map → document-class-FRL7JHWD.js.map} +1 -1
  136. package/dist/hooks/index.js +10 -8
  137. package/dist/hooks/useGtm.js +10 -8
  138. package/dist/hooks/useMoney.js +10 -8
  139. package/dist/hooks/useStore.js +10 -8
  140. package/dist/index.js +10 -8
  141. package/dist/index.js.map +1 -1
  142. package/dist/{not-found-QTHBFPNT.js → not-found-E6AR4CZ4.js} +12 -10
  143. package/dist/not-found-E6AR4CZ4.js.map +1 -0
  144. package/dist/providers/index.js +10 -8
  145. package/dist/routes/account/orders.js +1 -1
  146. package/dist/routes/account.js +6 -6
  147. package/dist/routes/blog.js +5 -5
  148. package/dist/routes/brands.js +1 -1
  149. package/dist/routes/cart.js +14 -12
  150. package/dist/routes/cart.js.map +1 -1
  151. package/dist/routes/home.js +13 -11
  152. package/dist/routes/loyalty.js +2 -2
  153. package/dist/routes/page.js +1 -1
  154. package/dist/routes/product-listing.js +12 -10
  155. package/dist/routes/product-listing.js.map +1 -1
  156. package/dist/routes/product.js +12 -10
  157. package/dist/routes/product.js.map +1 -1
  158. package/dist/routes/root/beforeLoad.d.ts +2 -2
  159. package/dist/routes/root/beforeLoad.d.ts.map +1 -1
  160. package/dist/routes/root/head.d.ts.map +1 -1
  161. package/dist/routes/testimonials.js +2 -2
  162. package/dist/routes/thank-you.js +1 -1
  163. package/dist/skeleton.js +13 -11
  164. package/dist/tanstack/document-class.d.ts.map +1 -1
  165. package/dist/tanstack/index.d.ts +1 -0
  166. package/dist/tanstack/index.d.ts.map +1 -1
  167. package/dist/tanstack/stylesheet.d.ts +15 -0
  168. package/dist/tanstack/stylesheet.d.ts.map +1 -0
  169. package/dist/tanstack.js +33 -4
  170. package/dist/tanstack.js.map +1 -1
  171. package/dist/utils/index.js +2 -2
  172. package/dist/vite/index.d.ts +1 -1
  173. package/dist/vite/index.d.ts.map +1 -1
  174. package/dist/vite/index.js +14 -25
  175. package/dist/vite/index.js.map +1 -1
  176. package/dist/vite/plugins/twilight-manifest.d.ts +23 -0
  177. package/dist/vite/plugins/twilight-manifest.d.ts.map +1 -1
  178. package/dist/vite/plugins/twilight-schema.plugin.d.ts.map +1 -1
  179. package/package.json +16 -3
  180. package/tailwind/components/Component.tsx.txt +21 -0
  181. package/tailwind/components/ComponentRegistry.ts.txt +66 -0
  182. package/tailwind/components/cart/CartItem.tsx.txt +211 -0
  183. package/tailwind/components/cart/CartSummary.tsx.txt +269 -0
  184. package/tailwind/components/cart/PreOrderNotification.tsx.txt +16 -0
  185. package/tailwind/components/cart/PriceQuoteButton.tsx.txt +21 -0
  186. package/tailwind/components/cart/SeoCartWidget.tsx.txt +99 -0
  187. package/tailwind/components/cart/index.ts.txt +11 -0
  188. package/tailwind/components/cart/lazy.ts.txt +15 -0
  189. package/tailwind/components/collapse/Collapse.tsx.txt +95 -0
  190. package/tailwind/components/collapse/index.ts.txt +41 -0
  191. package/tailwind/components/common/Breadcrumb.tsx.txt +27 -0
  192. package/tailwind/components/common/BreadcrumbJsonLd.tsx.txt +40 -0
  193. package/tailwind/components/common/BreadcrumbTrail.tsx.txt +97 -0
  194. package/tailwind/components/common/CurrencySymbol.tsx.txt +8 -0
  195. package/tailwind/components/common/DeferredData.tsx.txt +122 -0
  196. package/tailwind/components/common/ErrorPage.tsx.txt +69 -0
  197. package/tailwind/components/common/Image.tsx.txt +119 -0
  198. package/tailwind/components/common/Link.tsx.txt +36 -0
  199. package/tailwind/components/common/Link.types.ts.txt +85 -0
  200. package/tailwind/components/common/NoContent.tsx.txt +27 -0
  201. package/tailwind/components/common/RenderWhenVisible.tsx.txt +92 -0
  202. package/tailwind/components/common/index.ts.txt +42 -0
  203. package/tailwind/components/common/lazy.ts.txt +28 -0
  204. package/tailwind/components/defineComponent.ts.txt +32 -0
  205. package/tailwind/components/drawer/Drawer.tsx.txt +219 -0
  206. package/tailwind/components/drawer/index.ts.txt +38 -0
  207. package/tailwind/components/dropdown/Dropdown.tsx.txt +166 -0
  208. package/tailwind/components/dropdown/index.ts.txt +40 -0
  209. package/tailwind/components/home/BundleComponent.tsx.txt +35 -0
  210. package/tailwind/components/home/ComponentErrorBoundary.tsx.txt +98 -0
  211. package/tailwind/components/home/FeaturedProductsStyle1.tsx.txt +125 -0
  212. package/tailwind/components/home/FeaturedProductsStyle2.tsx.txt +127 -0
  213. package/tailwind/components/home/FeaturedProductsStyle3.tsx.txt +71 -0
  214. package/tailwind/components/home/FixedBanner.tsx.txt +68 -0
  215. package/tailwind/components/home/FixedProducts.tsx.txt +72 -0
  216. package/tailwind/components/home/HomePageRenderer.tsx.txt +284 -0
  217. package/tailwind/components/home/PageBlocks.tsx.txt +24 -0
  218. package/tailwind/components/home/ParallaxBackground.tsx.txt +50 -0
  219. package/tailwind/components/home/PhotosSlider.tsx.txt +61 -0
  220. package/tailwind/components/home/ProductsSlider.tsx.txt +87 -0
  221. package/tailwind/components/home/ReorderProducts.tsx.txt +38 -0
  222. package/tailwind/components/home/SquarePhotos.tsx.txt +68 -0
  223. package/tailwind/components/home/StoreFeatures.tsx.txt +34 -0
  224. package/tailwind/components/home/Testimonials.tsx.txt +36 -0
  225. package/tailwind/components/home/Youtube.tsx.txt +48 -0
  226. package/tailwind/components/home/index.ts.txt +50 -0
  227. package/tailwind/components/home/lazy.ts.txt +17 -0
  228. package/tailwind/components/home/register.ts.txt +44 -0
  229. package/tailwind/components/home/reorder-hooks.ts.txt +52 -0
  230. package/tailwind/components/home/types.ts.txt +4 -0
  231. package/tailwind/components/layout/Copyright.tsx.txt +23 -0
  232. package/tailwind/components/layout/CustomerLayout.tsx.txt +91 -0
  233. package/tailwind/components/layout/Footer.tsx.txt +341 -0
  234. package/tailwind/components/layout/Header.tsx.txt +154 -0
  235. package/tailwind/components/layout/MasterLayout.tsx.txt +62 -0
  236. package/tailwind/components/layout/PageAdvertisements.tsx.txt +131 -0
  237. package/tailwind/components/layout/WidgetHead.tsx.txt +53 -0
  238. package/tailwind/components/layout/index.ts.txt +27 -0
  239. package/tailwind/components/layout/lazy.ts.txt +25 -0
  240. package/tailwind/components/layout/types.ts.txt +11 -0
  241. package/tailwind/components/modal/ImageModal.tsx.txt +70 -0
  242. package/tailwind/components/modal/Modal.tsx.txt +245 -0
  243. package/tailwind/components/modal/index.ts.txt +39 -0
  244. package/tailwind/components/modal/lazy.ts.txt +10 -0
  245. package/tailwind/components/navigation/MainMenu.tsx.txt +94 -0
  246. package/tailwind/components/navigation/MobileMenu.tsx.txt +160 -0
  247. package/tailwind/components/navigation/index.ts.txt +4 -0
  248. package/tailwind/components/navigation/lazy.ts.txt +11 -0
  249. package/tailwind/components/product/AddToCartForm.tsx.txt +365 -0
  250. package/tailwind/components/product/ProductCard.tsx.txt +305 -0
  251. package/tailwind/components/product/ProductDetails.tsx.txt +267 -0
  252. package/tailwind/components/product/ProductGallery.tsx.txt +234 -0
  253. package/tailwind/components/product/index.ts.txt +15 -0
  254. package/tailwind/components/product/lazy.ts.txt +9 -0
  255. package/tailwind/components/snippets/AppsSnippets.tsx.txt +225 -0
  256. package/tailwind/components/snippets/SallaSdkScripts.tsx.txt +14 -0
  257. package/tailwind/components/snippets/index.ts.txt +4 -0
  258. package/tailwind/components/store/StoreClosedNotification.tsx.txt +73 -0
  259. package/tailwind/components/store/index.ts.txt +8 -0
  260. package/tailwind/components/store/lazy.ts.txt +8 -0
  261. package/tailwind/components/toast/Toaster.tsx.txt +177 -0
  262. package/tailwind/components/toast/index.ts.txt +10 -0
  263. package/tailwind/components/toast/types.ts.txt +38 -0
  264. package/tailwind/components/toast/useToast.ts.txt +61 -0
  265. package/tailwind/components/tracking/GoogleTag.tsx.txt +77 -0
  266. package/tailwind/components/tracking/SiftSnippet.tsx.txt +49 -0
  267. package/tailwind/components/tracking/TwilightBundles.tsx.txt +67 -0
  268. package/tailwind/components/tracking/index.ts.txt +11 -0
  269. package/tailwind/components/tracking/lazy.ts.txt +11 -0
  270. package/tailwind/components/useComponent.ts.txt +12 -0
  271. package/tailwind/routes/account/index.tsx.txt +16 -0
  272. package/tailwind/routes/account/notifications/NotificationsPage.tsx.txt +54 -0
  273. package/tailwind/routes/account/notifications/index.tsx.txt +39 -0
  274. package/tailwind/routes/account/notifications/loader.ts.txt +22 -0
  275. package/tailwind/routes/account/notifications/types.ts.txt +18 -0
  276. package/tailwind/routes/account/orders/OrderSinglePage.tsx.txt +181 -0
  277. package/tailwind/routes/account/orders/OrdersPage.tsx.txt +28 -0
  278. package/tailwind/routes/account/orders/index.tsx.txt +86 -0
  279. package/tailwind/routes/account/orders/loader.ts.txt +66 -0
  280. package/tailwind/routes/account/orders/single/OrderActions.tsx.txt +197 -0
  281. package/tailwind/routes/account/orders/single/OrderHeader.tsx.txt +143 -0
  282. package/tailwind/routes/account/orders/single/OrderItemRow.tsx.txt +209 -0
  283. package/tailwind/routes/account/orders/single/OrderSections.tsx.txt +215 -0
  284. package/tailwind/routes/account/orders/single/types.ts.txt +38 -0
  285. package/tailwind/routes/account/orders/types.ts.txt +29 -0
  286. package/tailwind/routes/account/profile/ProfilePage.tsx.txt +30 -0
  287. package/tailwind/routes/account/profile/index.tsx.txt +39 -0
  288. package/tailwind/routes/account/profile/loader.ts.txt +16 -0
  289. package/tailwind/routes/account/profile/types.ts.txt +5 -0
  290. package/tailwind/routes/account/settings/SettingsPage.tsx.txt +13 -0
  291. package/tailwind/routes/account/settings/index.tsx.txt +39 -0
  292. package/tailwind/routes/account/settings/loader.ts.txt +13 -0
  293. package/tailwind/routes/account/settings/types.ts.txt +5 -0
  294. package/tailwind/routes/account/types.ts.txt +320 -0
  295. package/tailwind/routes/account/wallet/WalletPage.tsx.txt +195 -0
  296. package/tailwind/routes/account/wallet/index.tsx.txt +38 -0
  297. package/tailwind/routes/account/wallet/loader.ts.txt +27 -0
  298. package/tailwind/routes/account/wallet/types.ts.txt +11 -0
  299. package/tailwind/routes/account/wishlist/WishlistPage.tsx.txt +314 -0
  300. package/tailwind/routes/account/wishlist/WishlistShare.tsx.txt +248 -0
  301. package/tailwind/routes/account/wishlist/index.tsx.txt +40 -0
  302. package/tailwind/routes/account/wishlist/loader.ts.txt +26 -0
  303. package/tailwind/routes/account/wishlist/types.ts.txt +9 -0
  304. package/tailwind/routes/blog/BlogAuthorPage.tsx.txt +82 -0
  305. package/tailwind/routes/blog/BlogCategoryPage.tsx.txt +84 -0
  306. package/tailwind/routes/blog/BlogPage.tsx.txt +191 -0
  307. package/tailwind/routes/blog/BlogSinglePage.tsx.txt +168 -0
  308. package/tailwind/routes/blog/BlogTagPage.tsx.txt +84 -0
  309. package/tailwind/routes/blog/BlogTags.tsx.txt +54 -0
  310. package/tailwind/routes/blog/components.tsx.txt +87 -0
  311. package/tailwind/routes/blog/index.tsx.txt +238 -0
  312. package/tailwind/routes/blog/loader.ts.txt +173 -0
  313. package/tailwind/routes/blog/types.ts.txt +106 -0
  314. package/tailwind/routes/brands/BrandsPage.tsx.txt +179 -0
  315. package/tailwind/routes/brands/index.tsx.txt +47 -0
  316. package/tailwind/routes/brands/loader.ts.txt +14 -0
  317. package/tailwind/routes/brands/types.ts.txt +53 -0
  318. package/tailwind/routes/cart/CartPage.tsx.txt +112 -0
  319. package/tailwind/routes/cart/index.tsx.txt +39 -0
  320. package/tailwind/routes/cart/loader.ts.txt +15 -0
  321. package/tailwind/routes/cart/types.ts.txt +6 -0
  322. package/tailwind/routes/home/HomePage.tsx.txt +53 -0
  323. package/tailwind/routes/home/index.tsx.txt +56 -0
  324. package/tailwind/routes/home/loader.ts.txt +24 -0
  325. package/tailwind/routes/home/types.ts.txt +11 -0
  326. package/tailwind/routes/index.ts.txt +94 -0
  327. package/tailwind/routes/lazy.ts.txt +105 -0
  328. package/tailwind/routes/loyalty/LoyaltyPage.tsx.txt +17 -0
  329. package/tailwind/routes/loyalty/LoyaltyPointsPage.tsx.txt +11 -0
  330. package/tailwind/routes/loyalty/index.tsx.txt +81 -0
  331. package/tailwind/routes/loyalty/loader.ts.txt +53 -0
  332. package/tailwind/routes/loyalty/types.ts.txt +109 -0
  333. package/tailwind/routes/not-found.tsx.txt +50 -0
  334. package/tailwind/routes/page/PageSingle.tsx.txt +34 -0
  335. package/tailwind/routes/page/index.tsx.txt +60 -0
  336. package/tailwind/routes/page/loader.ts.txt +19 -0
  337. package/tailwind/routes/page/types.ts.txt +34 -0
  338. package/tailwind/routes/product/ProductPage.tsx.txt +77 -0
  339. package/tailwind/routes/product/index.tsx.txt +157 -0
  340. package/tailwind/routes/product/loader.ts.txt +35 -0
  341. package/tailwind/routes/product/types.ts.txt +6 -0
  342. package/tailwind/routes/product-listing/ProductListPage.tsx.txt +321 -0
  343. package/tailwind/routes/product-listing/index.tsx.txt +95 -0
  344. package/tailwind/routes/product-listing/loader.ts.txt +323 -0
  345. package/tailwind/routes/product-listing/types.ts.txt +96 -0
  346. package/tailwind/routes/product-listing/useAppliedFilters.ts.txt +130 -0
  347. package/tailwind/routes/product-short-link.ts.txt +104 -0
  348. package/tailwind/routes/root/beforeLoad.ts.txt +354 -0
  349. package/tailwind/routes/root/head.ts.txt +424 -0
  350. package/tailwind/routes/root/index.ts.txt +2 -0
  351. package/tailwind/routes/seo-redirects.ts.txt +82 -0
  352. package/tailwind/routes/testimonials/ReviewsPage.tsx.txt +12 -0
  353. package/tailwind/routes/testimonials/TestimonialsPage.tsx.txt +80 -0
  354. package/tailwind/routes/testimonials/index.tsx.txt +80 -0
  355. package/tailwind/routes/testimonials/loader.ts.txt +29 -0
  356. package/tailwind/routes/testimonials/types.ts.txt +9 -0
  357. package/tailwind/routes/thank-you/ThankYouPage.tsx.txt +241 -0
  358. package/tailwind/routes/thank-you/index.tsx.txt +49 -0
  359. package/tailwind/routes/thank-you/loader.ts.txt +40 -0
  360. package/tailwind/routes/thank-you/types.ts.txt +16 -0
  361. package/tailwind/routes/types.ts.txt +41 -0
  362. package/dist/BlogAuthorPage-GTF4UGSS.js.map +0 -1
  363. package/dist/BlogCategoryPage-TN7Y4NBP.js.map +0 -1
  364. package/dist/BlogPage-TDB3M3PI.js.map +0 -1
  365. package/dist/BlogSinglePage-4A52Q5QW.js.map +0 -1
  366. package/dist/BlogTagPage-TOVPBETA.js.map +0 -1
  367. package/dist/BrandsPage-VUDGYSQI.js.map +0 -1
  368. package/dist/Breadcrumb-CI3SN5YR.js.map +0 -1
  369. package/dist/CartItem-BHLEURAB.js.map +0 -1
  370. package/dist/CartSummary-QERVESYN.js.map +0 -1
  371. package/dist/CustomerLayout-VRZUWGQK.js.map +0 -1
  372. package/dist/LoyaltyPage-CGTHWJ76.js.map +0 -1
  373. package/dist/LoyaltyPointsPage-QSU6K3PW.js.map +0 -1
  374. package/dist/MobileMenu-U4BVQYKH.js.map +0 -1
  375. package/dist/NotificationsPage-ZRRQY7TF.js.map +0 -1
  376. package/dist/OrderSinglePage-O3XYVMG5.js.map +0 -1
  377. package/dist/OrdersPage-CMXZF5MI.js.map +0 -1
  378. package/dist/ProductDetails-65GDABI7.js.map +0 -1
  379. package/dist/ProfilePage-SNJ4WXU4.js.map +0 -1
  380. package/dist/SeoCartWidget-DBJAXJKT.js.map +0 -1
  381. package/dist/SettingsPage-FLTIOPU5.js.map +0 -1
  382. package/dist/ThankYouPage-5X6B4X3T.js.map +0 -1
  383. package/dist/WalletPage-H2BKIDPA.js.map +0 -1
  384. package/dist/WishlistPage-RS5UCIQ3.js.map +0 -1
  385. package/dist/chunk-4CZRUAZB.js.map +0 -1
  386. package/dist/chunk-7WAXN2PP.js +0 -14
  387. package/dist/chunk-JO7JWV34.js.map +0 -1
  388. package/dist/chunk-NZVR4OF7.js.map +0 -1
  389. package/dist/chunk-SDFDS4Q3.js.map +0 -1
  390. package/dist/not-found-QTHBFPNT.js.map +0 -1
@@ -0,0 +1,354 @@
1
+ import type { QueryClient } from '@tanstack/react-query';
2
+ import { redirect } from '@tanstack/react-router';
3
+ import { createIsomorphicFn } from '@tanstack/react-start';
4
+ import {
5
+ getCookie,
6
+ getRequestHeader,
7
+ getRequestUrl,
8
+ setCookie,
9
+ } from '@tanstack/react-start/server';
10
+ import type { StoreContext } from '../../api/store';
11
+ import { store as storeApi } from '../../api/store';
12
+ import { apps, type AppSnippet, type AppSettings } from '../../api/apps';
13
+ import { translations } from '../../api/translations';
14
+ import { advertisement } from '../../api/advertisement';
15
+ import { FALLBACK_LOCALE, getLanguageInfo } from '../../providers/locale-constants';
16
+ import { createI18nInstance } from '../../providers/i18n-factory';
17
+ import type { TwilightLocation } from '../../twilight/context';
18
+ import { getTwilightContext, updateTwilightContext } from '../../twilight/context';
19
+ import {
20
+ AUTH_TOKEN_COOKIE_NAME,
21
+ extractScopeFromCookies,
22
+ extractScopeFromUrl,
23
+ extractTokenFromCookies,
24
+ resolveRequestScope,
25
+ sameScope,
26
+ SCOPE_COOKIE_MAX_AGE,
27
+ SCOPE_COOKIE_NAME,
28
+ syncScopeCookie,
29
+ type ActiveScope,
30
+ } from '../../utils/cookies';
31
+ import { syncSdkLocale, syncSdkThemeVersion } from '../../utils/sdk-helpers';
32
+ import { SettingsError } from '../../utils/errors';
33
+ import { resolveStoreBaseRedirect } from '../../utils/store-identity';
34
+
35
+ // Reads the `token` cookie from the incoming request on the SERVER. twilightMiddleware
36
+ // extracts the same cookie into a custom ALS, but that ALS does NOT propagate to the
37
+ // route's beforeLoad / React SSR render (they run in a different async scope), so the
38
+ // token must be read again here from the framework's own request context. On the client
39
+ // this is a no-op (the cookie is read from document.cookie below instead). The server
40
+ // import is stripped from the client bundle by createIsomorphicFn.
41
+ const readServerCookieToken = createIsomorphicFn()
42
+ .server((): string | null => {
43
+ try {
44
+ return getCookie(AUTH_TOKEN_COOKIE_NAME) ?? null;
45
+ } catch {
46
+ return null;
47
+ }
48
+ })
49
+ .client((): string | null => null);
50
+
51
+ /**
52
+ * The scope to write to the `scope` cookie for this request, or null to leave the cookie
53
+ * as it is.
54
+ *
55
+ * Only for a market a `?scope=` URL switched to, and only when the settings were answered
56
+ * for it: the API falls back to another market when it does not accept the requested one,
57
+ * and Twig keeps the previous choice then too, rather than recording one the page is not
58
+ * showing. Its type is the one the settings answered with: a URL names only the id, and
59
+ * the store-wide type is assumed until the answer says otherwise (a store browsing by
60
+ * branch or city), so later requests send the type the API matches against.
61
+ */
62
+ export function scopeCookieUpdate(
63
+ url: string,
64
+ cookieHeader: string | null,
65
+ settings: StoreContext
66
+ ): ActiveScope | null {
67
+ if (!extractScopeFromUrl(url)) return null;
68
+ const scope = resolveRequestScope(url, cookieHeader);
69
+ const answered = settings.store?.scope;
70
+ if (!scope || answered?.id == null || String(answered.id) !== scope.id) return null;
71
+ const typed = answered.type ? { ...scope, type: answered.type } : scope;
72
+ return sameScope(extractScopeFromCookies(cookieHeader), typed) ? null : typed;
73
+ }
74
+
75
+ /**
76
+ * Gives the request's scope the type its settings answered with, for the rest of this
77
+ * render, and files the settings and ads under the key the corrected scope makes, so the browser
78
+ * — which reads the corrected scope from the cookie (see {@link scopeCookieUpdate}) — finds
79
+ * them dehydrated instead of fetching them again. The entry under the assumed type's key
80
+ * is removed, so the page carries them once. Server-only; a no-op when the type
81
+ * already matches or the settings answered another scope.
82
+ */
83
+ export function alignRequestScopeType(queryClient: QueryClient, settings: StoreContext): void {
84
+ let scope: ActiveScope | null;
85
+ try {
86
+ scope = getTwilightContext().scope;
87
+ } catch {
88
+ return;
89
+ }
90
+ const answered = settings.store?.scope;
91
+ if (!scope || !answered?.type || String(answered.id) !== scope.id) return;
92
+ if (answered.type === scope.type) return;
93
+ const assumedKey = storeApi.queries.settings().queryKey;
94
+ const assumedAdsKey = advertisement.queries.list().queryKey;
95
+ updateTwilightContext({ scope: { ...scope, type: answered.type } });
96
+ queryClient.setQueryData(storeApi.queries.settings().queryKey, settings);
97
+ // Moved, not copied: both would be dehydrated, sending the settings twice.
98
+ queryClient.removeQueries({ queryKey: assumedKey, exact: true });
99
+ const ads = queryClient.getQueryData(assumedAdsKey);
100
+ if (ads) queryClient.setQueryData(advertisement.queries.list().queryKey, ads);
101
+ queryClient.removeQueries({ queryKey: assumedAdsKey, exact: true });
102
+ }
103
+
104
+ /**
105
+ * Writes {@link scopeCookieUpdate} to the response. Read from the request itself rather
106
+ * than the middleware's context, for the same reason as {@link readServerCookieToken}.
107
+ * Server-only.
108
+ */
109
+ export const persistRequestScope = createIsomorphicFn()
110
+ .server((settings: StoreContext): void => {
111
+ let scope: ActiveScope | null;
112
+ try {
113
+ scope = scopeCookieUpdate(
114
+ String(getRequestUrl()),
115
+ getRequestHeader('cookie') ?? null,
116
+ settings
117
+ );
118
+ } catch {
119
+ // Outside a request (prerender): there is no response to write to.
120
+ return;
121
+ }
122
+ if (!scope) return;
123
+ setCookie(SCOPE_COOKIE_NAME, JSON.stringify(scope), {
124
+ path: '/',
125
+ maxAge: SCOPE_COOKIE_MAX_AGE,
126
+ sameSite: 'lax',
127
+ });
128
+ })
129
+ .client((): void => {});
130
+
131
+ /** On the server, once the settings are in: {@link alignRequestScopeType}, then {@link persistRequestScope}. */
132
+ function settleRequestScope(queryClient: QueryClient, settings: StoreContext): void {
133
+ if (typeof window !== 'undefined') return;
134
+ alignRequestScopeType(queryClient, settings);
135
+ persistRequestScope(settings);
136
+ }
137
+
138
+ export interface BeforeLoadResult {
139
+ settings: StoreContext;
140
+ locale: string;
141
+ dir: 'ltr' | 'rtl';
142
+ authToken: string | null;
143
+ /** Installed apps' snippets, threaded through the beforeLoad context (and recovered on the
144
+ * client via ensureTwilightContextFromMatches) so AppsSnippets can render CDN tags in SSR. */
145
+ appsSnippets?: AppSnippet[];
146
+ /** Per-app public `app.*` buckets, threaded the same way so rootHead can install the
147
+ * `Salla.appScope` factory inline in the SSR head. */
148
+ appsSettings?: AppSettings;
149
+ }
150
+
151
+ /**
152
+ * The platform's copy for `locale`, with this merchant's own wording over it.
153
+ *
154
+ * Returns the platform's copy untouched — and makes no request — unless the
155
+ * settings say this language has overrides. That gate is the whole reason this
156
+ * is affordable: the object 404s for most stores, uncached, on the critical
157
+ * path of an SSR render.
158
+ *
159
+ * The entry is found by ISO code rather than by index or key. The API sends
160
+ * `languages` as an object keyed by **upper-case** ISO, and `storeApi` converts
161
+ * it to an array on the way through (`languagesToArray`), so neither the
162
+ * upper-case key nor a position is available here — and matching case-sensitively
163
+ * on `code` would be a lookup that misses silently, leaving the flag absent and
164
+ * the feature simply never running.
165
+ *
166
+ * Nothing about this is fatal. A failed override read leaves the platform's
167
+ * copy in place, which is a storefront in the words Salla ships rather than a
168
+ * storefront that did not render.
169
+ */
170
+ async function withMerchantTranslations(
171
+ queryClient: QueryClient,
172
+ settings: StoreContext,
173
+ locale: string,
174
+ common: Awaited<ReturnType<typeof translations.get>>
175
+ ): Promise<Awaited<ReturnType<typeof translations.get>>> {
176
+ const wanted = locale.toLowerCase();
177
+ const language = settings.languages?.find(
178
+ (entry) => (entry.iso_code ?? entry.code)?.toLowerCase() === wanted
179
+ );
180
+ const storeId = settings.store?.id;
181
+
182
+ if (!language?.has_custom_translations || !storeId) return common;
183
+
184
+ try {
185
+ const overrides = await queryClient.ensureQueryData(
186
+ translations.queries.byStore(storeId, locale)
187
+ );
188
+
189
+ return translations.merge(common, overrides, locale);
190
+ } catch (error) {
191
+ console.warn('[salla] merchant translations could not be read; using the platform copy', error);
192
+ return common;
193
+ }
194
+ }
195
+
196
+ export async function rootBeforeLoad(ctx: {
197
+ params: Record<string, string>;
198
+ location: TwilightLocation;
199
+ context: {
200
+ queryClient: QueryClient;
201
+ setLocation?: (location: Partial<TwilightLocation>) => void;
202
+ };
203
+ serverContext?: {
204
+ authToken?: string | null;
205
+ };
206
+ }): Promise<BeforeLoadResult> {
207
+ const locale = ctx.params.locale || FALLBACK_LOCALE;
208
+ const { dir } = getLanguageInfo(locale);
209
+
210
+ if (ctx.context.setLocation) {
211
+ ctx.context.setLocation(ctx.location);
212
+ }
213
+
214
+ // Set locale in context before any API calls so interceptor uses correct locale
215
+ updateTwilightContext({ locale });
216
+
217
+ // Re-assert the locale on the Salla SDK on every navigation. The SDK's axios
218
+ // accept-language header drifts off the route locale (navigator.language default,
219
+ // account-language override on profile fetch — see syncSdkLocale), which makes
220
+ // SDK API calls (e.g. the cart's salla.api.cart.details) return wrong-locale data.
221
+ syncSdkLocale(locale);
222
+
223
+ // Mirror the SDK's selected branch into the `scope` cookie. The SDK persists the
224
+ // selection in localStorage ONLY, so the server — which can only see cookies —
225
+ // would otherwise compute scope=null for every visitor who picked a branch, and
226
+ // the dehydrated settings query (keyed on the scope) would never match on the
227
+ // client. No-op on the server and while the SDK storage API is still hydrating.
228
+ syncScopeCookie();
229
+
230
+ const [settingsResult, translationsResult, snippetsResult, appSettingsResult] = await Promise.all(
231
+ [
232
+ ctx.context.queryClient.ensureQueryData(storeApi.queries.settings()),
233
+ ctx.context.queryClient.ensureQueryData(translations.queries.byLocale(locale)),
234
+ // Snippets → SSR CDN <script> tags (AppsSnippets.ssrCdnScripts). Non-fatal + logged:
235
+ // on failure AppsSnippets falls back to its own client-side query for the same data,
236
+ // so the tags render a paint later instead of being lost for the page load.
237
+ ctx.context.queryClient.ensureQueryData(apps.queries.snippets()).catch((error): undefined => {
238
+ console.warn('[salla] apps/snippets prefetch failed; rendering no CDN snippet tags', error);
239
+ return undefined;
240
+ }),
241
+ // Buckets → rootHead installs `Salla.appScope` inline in the SSR head (before any snippet
242
+ // onReady runs). Non-fatal + logged: the head installs the factory either way, and the
243
+ // client query seeds the buckets into that install once it resolves.
244
+ ctx.context.queryClient.ensureQueryData(apps.queries.settings()).catch((error): undefined => {
245
+ console.warn(
246
+ '[salla] apps/snippets/settings prefetch failed; appScope buckets unseeded',
247
+ error
248
+ );
249
+ return undefined;
250
+ }),
251
+ // Ads → the header's announcement bar renders on the server, so it no longer pushes the
252
+ // page down when it arrives. Non-fatal: the bar then loads on the client, as before.
253
+ ctx.context.queryClient
254
+ .ensureQueryData(advertisement.queries.list())
255
+ .catch((error): undefined => {
256
+ console.warn('[salla] advertisements prefetch failed; the ad bar loads late', error);
257
+ return undefined;
258
+ }),
259
+ ]
260
+ );
261
+
262
+ if (!settingsResult) {
263
+ throw new SettingsError('Failed to load store settings. Make sure VITE_STORE_DOMAIN is set.');
264
+ }
265
+
266
+ // Settings answered for another market name another theme version; the SDK only
267
+ // read its `s-version-id` at init — see syncSdkThemeVersion.
268
+ syncSdkThemeVersion(settingsResult.headers);
269
+
270
+ settleRequestScope(ctx.context.queryClient, settingsResult);
271
+
272
+ // On a host where the store is the root of every URL, a page has one address:
273
+ // `/<username>/…`. A request that found its store some other way (`?storeId=`,
274
+ // the preview cookie, `VITE_STORE_DOMAIN`) is sent there now that the settings
275
+ // say what the username is. A full load rather than a client navigation, because
276
+ // the router handling this request was built without that root.
277
+ const storeBaseHref = resolveStoreBaseRedirect(settingsResult.store?.username, ctx.location.href);
278
+ if (storeBaseHref) {
279
+ throw redirect({ href: storeBaseHref, reloadDocument: true, replace: true });
280
+ }
281
+
282
+ // The merchant's own wording, laid over the platform's — but only when the
283
+ // settings say this language has any.
284
+ //
285
+ // Sequenced after the `Promise.all` on purpose: the object is keyed by
286
+ // `settings.store.id`, which the settings query is what produces, so this
287
+ // cannot join the batch above. The cost of a second round trip is why it is
288
+ // gated rather than always fetched — see `api/translations.ts` for the two
289
+ // corrections that shape led to.
290
+ const messages = await withMerchantTranslations(
291
+ ctx.context.queryClient,
292
+ settingsResult,
293
+ locale,
294
+ translationsResult
295
+ );
296
+
297
+ // Create i18n instance with loaded translations
298
+ const i18n = createI18nInstance(locale, messages ?? undefined);
299
+
300
+ // Resolve authToken with fallback chain:
301
+ // 1. SSR context (from middleware extracting cookies on server)
302
+ // 2. The twilight context token. On the SERVER this is the token twilightMiddleware
303
+ // extracted from the `token` cookie into the request ALS — reading it here is
304
+ // essential, otherwise this loader's updateTwilightContext() below would
305
+ // overwrite the middleware's token with null and every SSR render (e.g. the
306
+ // account hub) would be unauthenticated. On the CLIENT it's the clientStore
307
+ // token from hydration or a previous navigation.
308
+ // 3. The `token` cookie read directly — client fallback when clientStore is empty
309
+ // and salla.storage hasn't hydrated yet.
310
+ // 4. Salla SDK storage (salla.storage.get('token'))
311
+ let existingToken: string | null = null;
312
+ try {
313
+ existingToken = getTwilightContext().authToken;
314
+ } catch {
315
+ // No request context (e.g. server call outside the middleware ALS) — fall through.
316
+ existingToken = null;
317
+ }
318
+ const cookieToken =
319
+ typeof document !== 'undefined'
320
+ ? extractTokenFromCookies(document.cookie, AUTH_TOKEN_COOKIE_NAME)
321
+ : null;
322
+ const sallaToken =
323
+ typeof window !== 'undefined' && typeof window.salla?.storage?.get === 'function'
324
+ ? (window.salla.storage.get(AUTH_TOKEN_COOKIE_NAME) as string | null)
325
+ : null;
326
+ const serverCookieToken = readServerCookieToken();
327
+ const authToken =
328
+ ctx.serverContext?.authToken ??
329
+ serverCookieToken ??
330
+ existingToken ??
331
+ cookieToken ??
332
+ sallaToken ??
333
+ null;
334
+
335
+ updateTwilightContext({
336
+ queryClient: ctx.context.queryClient,
337
+ settings: settingsResult,
338
+ locale,
339
+ location: ctx.location,
340
+ i18n,
341
+ authToken,
342
+ appsSnippets: snippetsResult,
343
+ appsSettings: appSettingsResult,
344
+ });
345
+
346
+ return {
347
+ settings: settingsResult,
348
+ locale,
349
+ dir,
350
+ authToken,
351
+ appsSnippets: snippetsResult,
352
+ appsSettings: appSettingsResult,
353
+ };
354
+ }